Author: gnodet Date: Tue Jan 30 22:05:35 2018 New Revision: 1822707 URL: http://svn.apache.org/viewvc?rev=1822707&view=rev Log: [ARIES-1607] Add a flag to enable raw conversion when using generics
Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/AbstractRecipe.java aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/WiringTest.java aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/container/BeanRecipeTest.java aries/trunk/blueprint/blueprint-core/src/test/resources/test-generics-mix.xml aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/ExtendedBeanMetadata.java aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/mutable/MutableBeanMetadata.java aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/reflect/BeanMetadataImpl.java Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java?rev=1822707&r1=1822706&r2=1822707&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java (original) +++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java Tue Jan 30 22:05:35 2018 @@ -18,10 +18,7 @@ */ package org.apache.aries.blueprint.container; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Type; +import java.lang.reflect.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -38,6 +35,7 @@ import org.apache.aries.blueprint.BeanPr import org.apache.aries.blueprint.ComponentDefinitionRegistry; import org.apache.aries.blueprint.Interceptor; import org.apache.aries.blueprint.di.AbstractRecipe; +import org.apache.aries.blueprint.di.ExecutionContext; import org.apache.aries.blueprint.di.Recipe; import org.apache.aries.blueprint.proxy.CollaboratorFactory; import org.apache.aries.blueprint.proxy.ProxyUtils; @@ -135,14 +133,16 @@ public class BeanRecipe extends Abstract private List<String> argTypes; private boolean reorderArguments; private final boolean allowsFieldInjection; + private final boolean allowsRawConversion; private BeanMetadata interceptorLookupKey; - public BeanRecipe(String name, ExtendedBlueprintContainer blueprintContainer, Object type, boolean allowsFieldInjection) { + public BeanRecipe(String name, ExtendedBlueprintContainer blueprintContainer, Object type, boolean allowsFieldInjection, boolean allowsRawConversion) { super(name); this.blueprintContainer = blueprintContainer; this.type = type; this.allowsFieldInjection = allowsFieldInjection; + this.allowsRawConversion = allowsRawConversion; } public Object getProperty(String name) { @@ -419,9 +419,32 @@ public class BeanRecipe extends Abstract return map; } + protected Object convert(Object obj, Type from, Type to) throws Exception { + if (allowsRawConversion + && (from instanceof ParameterizedType || to instanceof ParameterizedType) + && GenericType.getConcreteClass(from) == GenericType.getConcreteClass(to)) { + boolean assignable = true; + if (from instanceof ParameterizedType) { + for (Type t : ((ParameterizedType) from).getActualTypeArguments()) { + assignable &= t == Object.class; + } + } + if (to instanceof ParameterizedType) { + for (Type t : ((ParameterizedType) to).getActualTypeArguments()) { + assignable &= t == Object.class; + } + } + if (assignable) { + return obj instanceof UnwrapperedBeanHolder + ? ((UnwrapperedBeanHolder) obj).unwrapperedBean : obj; + } + } + return convert(obj, to); + } + private class TIConverter implements TypeInference.Converter { public TypeInference.TypedObject convert(TypeInference.TypedObject from, Type to) throws Exception { - Object arg = BeanRecipe.this.convert(from.getValue(), new GenericType(to)); + Object arg = BeanRecipe.this.convert(from.getValue(), from.getType(), to); return new TypeInference.TypedObject(to, arg); } } Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java?rev=1822707&r1=1822706&r2=1822707&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java (original) +++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java Tue Jan 30 22:05:35 2018 @@ -30,7 +30,6 @@ import org.apache.aries.blueprint.Compon import org.apache.aries.blueprint.ExtendedBeanMetadata; import org.apache.aries.blueprint.ExtendedReferenceMetadata; import org.apache.aries.blueprint.ExtendedServiceReferenceMetadata; -import org.apache.aries.blueprint.services.ExtendedBlueprintContainer; import org.apache.aries.blueprint.utils.ServiceListener; import org.apache.aries.blueprint.PassThroughMetadata; import org.apache.aries.blueprint.di.ArrayRecipe; @@ -47,7 +46,6 @@ import org.apache.aries.blueprint.ext.Co import org.apache.aries.blueprint.ext.DependentComponentFactoryMetadata; import org.apache.aries.blueprint.mutable.MutableMapMetadata; import org.apache.aries.blueprint.reflect.MetadataUtil; -import org.osgi.service.blueprint.container.ComponentDefinitionException; import org.osgi.service.blueprint.reflect.BeanArgument; import org.osgi.service.blueprint.reflect.BeanMetadata; import org.osgi.service.blueprint.reflect.BeanProperty; @@ -231,20 +229,28 @@ public class RecipeBuilder { } return beanMetadata.getClassName(); } - + private boolean allowsFieldInjection(BeanMetadata beanMetadata) { if (beanMetadata instanceof ExtendedBeanMetadata) { return ((ExtendedBeanMetadata) beanMetadata).getFieldInjection(); } return false; } - + + private boolean allowsRawConversion(BeanMetadata beanMetadata) { + if (beanMetadata instanceof ExtendedBeanMetadata) { + return ((ExtendedBeanMetadata) beanMetadata).getRawConversion(); + } + return false; + } + private BeanRecipe createBeanRecipe(BeanMetadata beanMetadata) { BeanRecipe recipe = new BeanRecipe( getName(beanMetadata.getId()), blueprintContainer, getBeanClass(beanMetadata), - allowsFieldInjection(beanMetadata)); + allowsFieldInjection(beanMetadata), + allowsRawConversion(beanMetadata)); // Create refs for explicit dependencies recipe.setExplicitDependencies(getDependencies(beanMetadata)); recipe.setPrototype(MetadataUtil.isPrototypeScope(beanMetadata) || MetadataUtil.isCustomScope(beanMetadata)); @@ -282,7 +288,7 @@ public class RecipeBuilder { } private Recipe createRecipe(RegistrationListener listener) { - BeanRecipe recipe = new BeanRecipe(getName(null), blueprintContainer, ServiceListener.class, false); + BeanRecipe recipe = new BeanRecipe(getName(null), blueprintContainer, ServiceListener.class, false, false); recipe.setProperty("listener", getValue(listener.getListenerComponent(), null)); if (listener.getRegistrationMethod() != null) { recipe.setProperty("registerMethod", listener.getRegistrationMethod()); @@ -295,7 +301,7 @@ public class RecipeBuilder { } private Recipe createRecipe(ReferenceListener listener) { - BeanRecipe recipe = new BeanRecipe(getName(null), blueprintContainer, AbstractServiceReferenceRecipe.Listener.class, false); + BeanRecipe recipe = new BeanRecipe(getName(null), blueprintContainer, AbstractServiceReferenceRecipe.Listener.class, false, false); recipe.setProperty("listener", getValue(listener.getListenerComponent(), null)); recipe.setProperty("metadata", listener); recipe.setProperty("blueprintContainer", blueprintContainer); Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/AbstractRecipe.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/AbstractRecipe.java?rev=1822707&r1=1822706&r2=1822707&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/AbstractRecipe.java (original) +++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/AbstractRecipe.java Tue Jan 30 22:05:35 2018 @@ -17,6 +17,7 @@ */ package org.apache.aries.blueprint.di; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Collections; import java.util.List; @@ -27,6 +28,7 @@ import java.util.concurrent.FutureTask; import org.apache.aries.blueprint.container.GenericType; import org.osgi.service.blueprint.container.ComponentDefinitionException; +import org.osgi.service.blueprint.container.Converter; import org.osgi.service.blueprint.container.ReifiedType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -141,8 +143,7 @@ public abstract class AbstractRecipe imp } protected Object convert(Object obj, Type type) throws Exception { - return ExecutionContext.Holder.getContext().convert(obj, - new GenericType(type)); + return ExecutionContext.Holder.getContext().convert(obj, new GenericType(type)); } protected Class loadClass(String className) { Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java?rev=1822707&r1=1822706&r2=1822707&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java (original) +++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java Tue Jan 30 22:05:35 2018 @@ -21,6 +21,7 @@ package org.apache.aries.blueprint.ext.i import java.net.URL; import java.util.*; +import org.apache.aries.blueprint.ExtendedBeanMetadata; import org.apache.aries.blueprint.ExtendedReferenceListMetadata; import org.apache.aries.blueprint.ExtendedReferenceMetadata; import org.apache.aries.blueprint.ParserContext; @@ -38,17 +39,7 @@ import org.apache.aries.blueprint.mutabl import org.apache.aries.blueprint.mutable.MutableValueMetadata; import org.osgi.framework.BundleContext; import org.osgi.service.blueprint.container.ComponentDefinitionException; -import org.osgi.service.blueprint.reflect.BeanMetadata; -import org.osgi.service.blueprint.reflect.BeanProperty; -import org.osgi.service.blueprint.reflect.CollectionMetadata; -import org.osgi.service.blueprint.reflect.ComponentMetadata; -import org.osgi.service.blueprint.reflect.IdRefMetadata; -import org.osgi.service.blueprint.reflect.Metadata; -import org.osgi.service.blueprint.reflect.RefMetadata; -import org.osgi.service.blueprint.reflect.ReferenceListMetadata; -import org.osgi.service.blueprint.reflect.ReferenceMetadata; -import org.osgi.service.blueprint.reflect.ServiceReferenceMetadata; -import org.osgi.service.blueprint.reflect.ValueMetadata; +import org.osgi.service.blueprint.reflect.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Attr; @@ -113,6 +104,7 @@ public class ExtNamespaceHandler impleme public static final String BEAN = "bean"; public static final String REFERENCE = "reference"; + public static final String ARGUMENT = "argument"; public static final String DAMPING_ATTRIBUTE = "damping"; @@ -124,6 +116,8 @@ public class ExtNamespaceHandler impleme public static final String LIFECYCLE_DYNAMIC = "dynamic"; public static final String LIFECYCLE_STATIC = "static"; + public static final String RAW_CONVERSION_ATTRIBUTE = "raw-conversion"; + private static final Set<String> EXT_URIS = Collections.unmodifiableSet(new LinkedHashSet<String>(Arrays.asList( BLUEPRINT_EXT_NAMESPACE_V1_0, BLUEPRINT_EXT_NAMESPACE_V1_1, @@ -199,6 +193,10 @@ public class ExtNamespaceHandler impleme return decorateDamping(node, component, context); } else if (node instanceof Attr && nodeNameEquals(node, LIFECYCLE_ATTRIBUTE)) { return decorateLifecycle(node, component, context); + } else if (node instanceof Attr && nodeNameEquals(node, RAW_CONVERSION_ATTRIBUTE)) { + return decorateRawConversion(node, component, context); + } else if (node instanceof Element && nodeNameEquals(node, ARGUMENT)) { + return parseBeanArgument(context, (Element) node); } else { throw new ComponentDefinitionException("Unsupported node: " + node.getNodeName()); } @@ -353,6 +351,44 @@ public class ExtNamespaceHandler impleme return component; } + private ComponentMetadata decorateRawConversion(Node node, ComponentMetadata component, ParserContext context) { + if (!(component instanceof BeanMetadata)) { + throw new ComponentDefinitionException("Attribute " + node.getNodeName() + " can only be used on a <bean> element"); + } + + if (!(component instanceof MutableBeanMetadata)) { + throw new ComponentDefinitionException("Expected an instanceof MutableBeanMetadata"); + } + + String value = ((Attr) node).getValue(); + ((MutableBeanMetadata) component).setRawConversion("true".equals(value) || "1".equals(value)); + return component; + } + + private ComponentMetadata parseBeanArgument(ParserContext context, Element element) { + MutableBeanMetadata mbm = (MutableBeanMetadata) context.getEnclosingComponent(); + BeanArgument arg = context.parseElement(BeanArgument.class, mbm, element); + int index = 0; + for (Node node = element.getPreviousSibling(); node != null; node = node.getPreviousSibling()) { + if (nodeNameEquals(node, ARGUMENT)) { + index++; + } + } + List<BeanArgument> args = new ArrayList<BeanArgument>(mbm.getArguments()); + if (index == args.size()) { + mbm.addArgument(arg); + } else { + for (BeanArgument ba : args) { + mbm.removeArgument(ba); + } + args.add(index, arg); + for (BeanArgument ba : args) { + mbm.addArgument(ba); + } + } + return mbm; + } + private Metadata parsePropertyPlaceholder(ParserContext context, Element element) { MutableBeanMetadata metadata = context.createMetadata(MutableBeanMetadata.class); metadata.setProcessor(true); Modified: aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/WiringTest.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/WiringTest.java?rev=1822707&r1=1822706&r2=1822707&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/WiringTest.java (original) +++ aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/WiringTest.java Tue Jan 30 22:05:35 2018 @@ -462,7 +462,13 @@ public class WiringTest extends Abstract assertEquals("stringToo", ((Primavera) obj).prop); } - public void testMixedGenericsTyped() throws Exception { + public void testMixedGenericsTracker() throws Exception { + ComponentDefinitionRegistryImpl registry = parse("/test-generics-mix.xml"); + Repository repository = new TestBlueprintContainer(registry).getRepository(); + repository.create("tracker"); + } + + public void testMixedGenericsTypedTracker() throws Exception { ComponentDefinitionRegistryImpl registry = parse("/test-generics-mix.xml"); Repository repository = new TestBlueprintContainer(registry).getRepository(); try { @@ -473,13 +479,13 @@ public class WiringTest extends Abstract } } - public void testMixedGenericsTypedGeneric() throws Exception { + public void testMixedGenericsTypedTrackerRaw() throws Exception { ComponentDefinitionRegistryImpl registry = parse("/test-generics-mix.xml"); Repository repository = new TestBlueprintContainer(registry).getRepository(); - repository.create("typedGenericTracker"); + repository.create("typedTrackerRaw"); } - public void testMixedGenericsTypedClass() throws Exception { + public void testMixedGenericsTypedClassTracker() throws Exception { ComponentDefinitionRegistryImpl registry = parse("/test-generics-mix.xml"); Repository repository = new TestBlueprintContainer(registry).getRepository(); try { @@ -490,6 +496,18 @@ public class WiringTest extends Abstract } } + public void testMixedGenericsTypedClassTrackerRaw() throws Exception { + ComponentDefinitionRegistryImpl registry = parse("/test-generics-mix.xml"); + Repository repository = new TestBlueprintContainer(registry).getRepository(); + repository.create("typedClassTrackerRaw"); + } + + public void testMixedGenericsTypedGeneric() throws Exception { + ComponentDefinitionRegistryImpl registry = parse("/test-generics-mix.xml"); + Repository repository = new TestBlueprintContainer(registry).getRepository(); + repository.create("typedGenericTracker"); + } + public void testMixedGenericsTypedGenericClass() throws Exception { ComponentDefinitionRegistryImpl registry = parse("/test-generics-mix.xml"); Repository repository = new TestBlueprintContainer(registry).getRepository(); Modified: aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/container/BeanRecipeTest.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/container/BeanRecipeTest.java?rev=1822707&r1=1822706&r2=1822707&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/container/BeanRecipeTest.java (original) +++ aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/container/BeanRecipeTest.java Tue Jan 30 22:05:35 2018 @@ -132,7 +132,7 @@ public class BeanRecipeTest { @Test public void parameterWithGenerics() throws Exception { BlueprintContainerImpl container = new BlueprintContainerImpl(null, null, null, null, null, null, null, null, null, null); - BeanRecipe recipe = new BeanRecipe("example", container, ExampleService.class, false); + BeanRecipe recipe = new BeanRecipe("example", container, ExampleService.class, false, false); recipe.setArguments(Arrays.<Object>asList(new ExampleImpl())); recipe.setArgTypes(Arrays.<String>asList((String) null)); ExecutionContext.Holder.setContext(new BlueprintRepository(container)); @@ -142,7 +142,7 @@ public class BeanRecipeTest { @Test public void parameterWithComplexGenerics1() throws Exception { BlueprintContainerImpl container = new BlueprintContainerImpl(null, null, null, null, null, null, null, null, null, null); - BeanRecipe recipe = new BeanRecipe("example", container, MyService.class, false); + BeanRecipe recipe = new BeanRecipe("example", container, MyService.class, false, false); recipe.setArguments(Arrays.<Object>asList(new MyClass())); recipe.setArgTypes(Arrays.<String>asList((String) null)); ExecutionContext.Holder.setContext(new BlueprintRepository(container)); @@ -152,7 +152,7 @@ public class BeanRecipeTest { @Test public void parameterWithComplexGenerics2() throws Exception { BlueprintContainerImpl container = new BlueprintContainerImpl(null, null, null, null, null, null, null, null, null, null); - BeanRecipe recipe = new BeanRecipe("example", container, MyService.class, false); + BeanRecipe recipe = new BeanRecipe("example", container, MyService.class, false, false); recipe.setArguments(Arrays.<Object>asList(new MyClass3())); recipe.setArgTypes(Arrays.<String>asList((String) null)); ExecutionContext.Holder.setContext(new BlueprintRepository(container)); @@ -227,25 +227,25 @@ public class BeanRecipeTest { @Test public void protectedClassAccess() throws Exception { BlueprintContainerImpl container = new BlueprintContainerImpl(null, null, null, null, null, null, null, null, null, null); - BeanRecipe recipe = new BeanRecipe("a", container, null, false); + BeanRecipe recipe = new BeanRecipe("a", container, null, false, false); recipe.setFactoryComponent(new PassThroughRecipe("factory", new Factory().create())); recipe.setFactoryMethod("getA"); ExecutionContext.Holder.setContext(new BlueprintRepository(container)); assertNotNull(recipe.create()); - recipe = new BeanRecipe("b", container, null, false); + recipe = new BeanRecipe("b", container, null, false, false); recipe.setFactoryComponent(new PassThroughRecipe("factory", new Factory().create())); recipe.setFactoryMethod("getB"); ExecutionContext.Holder.setContext(new BlueprintRepository(container)); assertNotNull(recipe.create()); - recipe = new BeanRecipe("c", container, null, false); + recipe = new BeanRecipe("c", container, null, false, false); recipe.setFactoryComponent(new PassThroughRecipe("factory", new Factory().create())); recipe.setFactoryMethod("getC"); ExecutionContext.Holder.setContext(new BlueprintRepository(container)); assertNotNull(recipe.create()); - recipe = new BeanRecipe("d", container, null, false); + recipe = new BeanRecipe("d", container, null, false, false); recipe.setFactoryComponent(new PassThroughRecipe("factory", new Factory().create())); recipe.setFactoryMethod("getD"); ExecutionContext.Holder.setContext(new BlueprintRepository(container)); @@ -256,28 +256,28 @@ public class BeanRecipeTest { // ok } - recipe = new BeanRecipe("a", container, null, false); + recipe = new BeanRecipe("a", container, null, false, false); recipe.setFactoryComponent(new PassThroughRecipe("factory", new Factory())); recipe.setFactoryMethod("create"); recipe.setProperty("a", "a"); ExecutionContext.Holder.setContext(new BlueprintRepository(container)); assertNotNull(recipe.create()); - recipe = new BeanRecipe("b", container, null, false); + recipe = new BeanRecipe("b", container, null, false, false); recipe.setFactoryComponent(new PassThroughRecipe("factory", new Factory())); recipe.setFactoryMethod("create"); recipe.setProperty("b", "b"); ExecutionContext.Holder.setContext(new BlueprintRepository(container)); assertNotNull(recipe.create()); - recipe = new BeanRecipe("c", container, null, false); + recipe = new BeanRecipe("c", container, null, false, false); recipe.setFactoryComponent(new PassThroughRecipe("factory", new Factory())); recipe.setFactoryMethod("create"); recipe.setProperty("c", "c"); ExecutionContext.Holder.setContext(new BlueprintRepository(container)); assertNotNull(recipe.create()); - recipe = new BeanRecipe("d", container, null, false); + recipe = new BeanRecipe("d", container, null, false, false); recipe.setFactoryComponent(new PassThroughRecipe("factory", new Factory())); recipe.setFactoryMethod("create"); recipe.setProperty("d", "d"); @@ -289,7 +289,7 @@ public class BeanRecipeTest { // ok } - recipe = new BeanRecipe("a", container, null, false); + recipe = new BeanRecipe("a", container, null, false, false); recipe.setFactoryComponent(new PassThroughRecipe("factory", new Factory())); recipe.setFactoryMethod("create"); recipe.setInitMethod("init"); Modified: aries/trunk/blueprint/blueprint-core/src/test/resources/test-generics-mix.xml URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/test/resources/test-generics-mix.xml?rev=1822707&r1=1822706&r2=1822707&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-core/src/test/resources/test-generics-mix.xml (original) +++ aries/trunk/blueprint/blueprint-core/src/test/resources/test-generics-mix.xml Tue Jan 30 22:05:35 2018 @@ -16,6 +16,7 @@ limitations under the License. --> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" + xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.6.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-availability="mandatory" > @@ -36,21 +37,41 @@ </argument> </bean> - <bean id="typedGenericTracker" class="org.osgi.util.tracker.ServiceTracker"> + <bean id="typedTrackerRaw" class="org.osgi.util.tracker.ServiceTracker" ext:raw-conversion="true"> <argument type="org.osgi.framework.BundleContext" ref="blueprintBundleContext" /> <argument type="java.lang.String" value="org.apache.aries.blueprint.pojos.PojoA" /> - <argument type="org.osgi.util.tracker.ServiceTrackerCustomizer<org.apache.aries.blueprint.pojos.PojoA,org.apache.aries.blueprint.pojos.PojoB>"> + <argument type="org.osgi.util.tracker.ServiceTrackerCustomizer"> <bean class="org.apache.aries.blueprint.pojos.DummyServiceTrackerCustomizer" /> </argument> </bean> + <bean id="typedGenericTracker" class="org.osgi.util.tracker.ServiceTracker"> + <argument type="org.osgi.framework.BundleContext" ref="blueprintBundleContext" /> + <argument type="java.lang.String" value="org.apache.aries.blueprint.pojos.PojoA" /> + <ext:argument type="org.osgi.util.tracker.ServiceTrackerCustomizer<org.apache.aries.blueprint.pojos.PojoA,org.apache.aries.blueprint.pojos.PojoB>"> + <bean class="org.apache.aries.blueprint.pojos.DummyServiceTrackerCustomizer" /> + </ext:argument> + </bean> + <bean id="typedClassTracker" class="org.osgi.util.tracker.ServiceTracker"> <argument type="org.osgi.framework.BundleContext" ref="blueprintBundleContext" /> - <argument type="java.lang.Class"> + <ext:argument type="java.lang.Class"> <bean class="java.lang.Class" factory-method="forName"> <argument value="org.apache.aries.blueprint.pojos.PojoA" /> </bean> + </ext:argument> + <argument type="org.osgi.util.tracker.ServiceTrackerCustomizer"> + <bean class="org.apache.aries.blueprint.pojos.DummyServiceTrackerCustomizer" /> </argument> + </bean> + + <bean id="typedClassTrackerRaw" class="org.osgi.util.tracker.ServiceTracker" ext:raw-conversion="true"> + <argument type="org.osgi.framework.BundleContext" ref="blueprintBundleContext" /> + <ext:argument type="java.lang.Class"> + <bean class="java.lang.Class" factory-method="forName"> + <argument value="org.apache.aries.blueprint.pojos.PojoA" /> + </bean> + </ext:argument> <argument type="org.osgi.util.tracker.ServiceTrackerCustomizer"> <bean class="org.apache.aries.blueprint.pojos.DummyServiceTrackerCustomizer" /> </argument> @@ -58,14 +79,14 @@ <bean id="typedClassGenericTracker" class="org.osgi.util.tracker.ServiceTracker"> <argument type="org.osgi.framework.BundleContext" ref="blueprintBundleContext" /> - <argument type="java.lang.Class<org.apache.aries.blueprint.pojos.PojoA>"> + <ext:argument type="java.lang.Class<org.apache.aries.blueprint.pojos.PojoA>"> <bean class="java.lang.Class" factory-method="forName"> <argument value="org.apache.aries.blueprint.pojos.PojoA" /> </bean> - </argument> - <argument type="org.osgi.util.tracker.ServiceTrackerCustomizer<org.apache.aries.blueprint.pojos.PojoA,org.apache.aries.blueprint.pojos.PojoB>"> + </ext:argument> + <ext:argument type="org.osgi.util.tracker.ServiceTrackerCustomizer<org.apache.aries.blueprint.pojos.PojoA,org.apache.aries.blueprint.pojos.PojoB>"> <bean class="org.apache.aries.blueprint.pojos.DummyServiceTrackerCustomizer" /> - </argument> + </ext:argument> </bean> </blueprint> Modified: aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/ExtendedBeanMetadata.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/ExtendedBeanMetadata.java?rev=1822707&r1=1822706&r2=1822707&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/ExtendedBeanMetadata.java (original) +++ aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/ExtendedBeanMetadata.java Tue Jan 30 22:05:35 2018 @@ -47,4 +47,10 @@ public interface ExtendedBeanMetadata ex * @return Whether field injection is allowed */ boolean getFieldInjection(); + + /** + * Whether arguments / properties conversion is strict or lenient. + * @return The type of conversion. + */ + boolean getRawConversion(); } Modified: aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/mutable/MutableBeanMetadata.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/mutable/MutableBeanMetadata.java?rev=1822707&r1=1822706&r2=1822707&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/mutable/MutableBeanMetadata.java (original) +++ aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/mutable/MutableBeanMetadata.java Tue Jan 30 22:05:35 2018 @@ -61,4 +61,6 @@ public interface MutableBeanMetadata ext void setFieldInjection(boolean allowFieldInjection); + void setRawConversion(boolean rawConversion); + } Modified: aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/reflect/BeanMetadataImpl.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/reflect/BeanMetadataImpl.java?rev=1822707&r1=1822706&r2=1822707&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/reflect/BeanMetadataImpl.java (original) +++ aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/reflect/BeanMetadataImpl.java Tue Jan 30 22:05:35 2018 @@ -51,6 +51,7 @@ public class BeanMetadataImpl extends Co private Class runtimeClass; private boolean processor; private boolean fieldInjection; + private boolean rawConversion; public BeanMetadataImpl() { this.fieldInjection = false; @@ -75,8 +76,10 @@ public class BeanMetadataImpl extends Co if (source instanceof ExtendedBeanMetadata) { this.runtimeClass = ((ExtendedBeanMetadata) source).getRuntimeClass(); this.fieldInjection = ((ExtendedBeanMetadata) source).getFieldInjection(); + this.rawConversion = ((ExtendedBeanMetadata) source).getRawConversion(); } else { this.fieldInjection = false; + this.rawConversion = false; } } @@ -214,6 +217,14 @@ public class BeanMetadataImpl extends Co this.fieldInjection = fieldInjection; } + public boolean getRawConversion() { + return rawConversion; + } + + public void setRawConversion(boolean rawConversion) { + this.rawConversion = rawConversion; + } + @Override public String toString() { return "BeanMetadata[" +