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 2012/07/25 10:26:33 UTC

svn commit: r1365486 - in /aries/trunk/blueprint/blueprint-core/src: main/java/org/apache/aries/blueprint/container/AggregateConverter.java test/java/org/apache/aries/blueprint/container/AggregateConverterTest.java

Author: gnodet
Date: Wed Jul 25 08:26:33 2012
New Revision: 1365486

URL: http://svn.apache.org/viewvc?rev=1365486&view=rev
Log:
[ARIES-834] Unable to convert simple class to a generic type even if the simple class implements directly the generic type with the required arguments

Modified:
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/AggregateConverter.java
    aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/container/AggregateConverterTest.java

Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/AggregateConverter.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/AggregateConverter.java?rev=1365486&r1=1365485&r2=1365486&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/AggregateConverter.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/AggregateConverter.java Wed Jul 25 08:26:33 2012
@@ -21,35 +21,35 @@ import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Hashtable;
-import java.util.Dictionary;
-import java.util.Enumeration;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.regex.Pattern;
-import java.math.BigInteger;
-import java.math.BigDecimal;
 
-import org.apache.aries.blueprint.services.ExtendedBlueprintContainer;
 import org.apache.aries.blueprint.container.BeanRecipe.UnwrapperedBeanHolder;
 import org.apache.aries.blueprint.di.CollectionRecipe;
 import org.apache.aries.blueprint.di.MapRecipe;
+import org.apache.aries.blueprint.services.ExtendedBlueprintContainer;
 import org.apache.aries.blueprint.utils.ReflectionUtils;
+import org.osgi.service.blueprint.container.Converter;
+import org.osgi.service.blueprint.container.ReifiedType;
 
 import static org.apache.aries.blueprint.utils.ReflectionUtils.getRealCause;
-import org.osgi.service.blueprint.container.ReifiedType;
-import org.osgi.service.blueprint.container.Converter;
 
 /**
  * Implementation of the Converter.
@@ -424,9 +424,30 @@ public class AggregateConverter implemen
     }
 
     public static boolean isAssignable(Object source, ReifiedType target) {
-        return source == null
-                || (target.size() == 0
-                    && unwrap(target.getRawClass()).isAssignableFrom(unwrap(source.getClass())));
+        if (source == null) {
+            return true;
+        }
+        if (target.size() == 0) {
+            return unwrap(target.getRawClass()).isAssignableFrom(unwrap(source.getClass()));
+        } else {
+            return isTypeAssignable(new GenericType(source.getClass()), target);
+        }
+    }
+
+    public static boolean isTypeAssignable(ReifiedType from, ReifiedType to) {
+        if (from.equals(to)) {
+            return true;
+        }
+        Type t = from.getRawClass().getGenericSuperclass();
+        if (t != null && isTypeAssignable(new GenericType(t), to)) {
+            return true;
+        }
+        for (Type ti : from.getRawClass().getGenericInterfaces()) {
+            if (ti != null && isTypeAssignable(new GenericType(ti), to)) {
+                return true;
+            }
+        }
+        return false;
     }
 
     private static Class unwrap(Class c) {

Modified: aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/container/AggregateConverterTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/container/AggregateConverterTest.java?rev=1365486&r1=1365485&r2=1365486&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/container/AggregateConverterTest.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/container/AggregateConverterTest.java Wed Jul 25 08:26:33 2012
@@ -22,7 +22,9 @@ import java.io.ByteArrayOutputStream;
 import java.math.BigInteger;
 import java.net.URI;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Properties;
@@ -188,6 +190,40 @@ public class AggregateConverterTest exte
         result = s.convert(new Object(), NullMarker.class);
         assertNull(result);
     }
+
+    public void testGenericAssignable() throws Exception {
+        AggregateConverter s = new AggregateConverter(new TestBlueprintContainer(null));
+
+        assertNotNull(s.convert(new RegionIterable(), new GenericType(Iterable.class, new GenericType(Region.class))));
+
+        try {
+            s.convert(new ArrayList<Region>(), new GenericType(Iterable.class, new GenericType(Region.class)));
+            fail("Conversion should have thrown an exception");
+        } catch (Exception e) {
+            // Ignore
+        }
+
+    }
+
+    public void testGenericCollection() throws Exception {
+        AggregateConverter s = new AggregateConverter(new TestBlueprintContainer(null));
+
+        try {
+            s.convert(new ArrayList(), new GenericType(Iterable.class, new GenericType(Region.class)));
+            fail("Conversion should have thrown an exception");
+        } catch (Exception e) {
+            // Ignore
+        }
+
+        try {
+            s.convert(Arrays.asList(0l), new GenericType(Iterable.class, new GenericType(Region.class)));
+            fail("Conversion should have thrown an exception");
+        } catch (Exception e) {
+            // Ignore
+        }
+
+        assertNotNull(s.convert(Arrays.asList(new EuRegion() {}), new GenericType(List.class, new GenericType(Region.class))));
+    }
     
     private interface Region {} 
     
@@ -233,4 +269,10 @@ public class AggregateConverterTest exte
         }
     }
 
+    private static class RegionIterable implements Iterable<Region> {
+        public Iterator<Region> iterator() {
+            return null;
+        }
+    }
+
 }