You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by gn...@apache.org on 2018/01/30 22:05:35 UTC

svn commit: r1822707 - in /aries/trunk/blueprint: blueprint-core/src/main/java/org/apache/aries/blueprint/container/ blueprint-core/src/main/java/org/apache/aries/blueprint/di/ blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ blueprint...

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&lt;org.apache.aries.blueprint.pojos.PojoA,org.apache.aries.blueprint.pojos.PojoB&gt;">
+        <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&lt;org.apache.aries.blueprint.pojos.PojoA,org.apache.aries.blueprint.pojos.PojoB&gt;">
+            <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&lt;org.apache.aries.blueprint.pojos.PojoA&gt;">
+        <ext:argument type="java.lang.Class&lt;org.apache.aries.blueprint.pojos.PojoA&gt;">
             <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&lt;org.apache.aries.blueprint.pojos.PojoA,org.apache.aries.blueprint.pojos.PojoB&gt;">
+        </ext:argument>
+        <ext:argument type="org.osgi.util.tracker.ServiceTrackerCustomizer&lt;org.apache.aries.blueprint.pojos.PojoA,org.apache.aries.blueprint.pojos.PojoB&gt;">
             <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[" +