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;
+        }
+    }
+
 }


Reply via email to