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<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[" +