You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ti...@apache.org on 2019/02/20 15:01:45 UTC

svn commit: r1853965 - in /felix/trunk/converter/converter/src: main/java/org/osgi/util/converter/ConvertingImpl.java test/java/org/osgi/util/converter/ConverterTest.java

Author: timothyjward
Date: Wed Feb 20 15:01:45 2019
New Revision: 1853965

URL: http://svn.apache.org/viewvc?rev=1853965&view=rev
Log:
FELIX-6065 Support the use of wildcard types in conversions

Modified:
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
    felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java?rev=1853965&r1=1853964&r2=1853965&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java Wed Feb 20 15:01:45 2019
@@ -28,6 +28,7 @@ import java.lang.reflect.ParameterizedTy
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -133,6 +134,20 @@ class ConvertingImpl extends AbstractSpe
 	@SuppressWarnings("unchecked")
 	@Override
 	public Object to(Type type) {
+		// Wildcard types are strange - we immediately resolve them to something
+		// that we can actually use.
+		if (type instanceof WildcardType) {
+			WildcardType wt = (WildcardType) type;
+			Type[] lowerBounds = wt.getLowerBounds();
+			if(lowerBounds.length != 0) {
+				// This is a ? super X generic, why on earth would you do this?
+				throw new ConversionException("The authors of this implementation have no idea what to do with the type variable " + 
+				wt.getTypeName() + ". The use of <? super ...> is highly ambiguous for the converter");
+			} else {
+				type = wt.getUpperBounds()[0];
+			}
+		}
+		
 		Class< ? > cls = null;
 		if (type instanceof Class) {
 			cls = (Class< ? >) type;

Modified: felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java?rev=1853965&r1=1853964&r2=1853965&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java (original)
+++ felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java Wed Feb 20 15:01:45 2019
@@ -682,6 +682,27 @@ public class ConverterTest {
     	assertEquals("myValue", m.get("myProp"));
     }
 
+    @Test
+    public void testDTO2Map5() {
+    	MyDTO3 dto = new MyDTO3();
+    	dto.charSet = new HashSet<>(Arrays.asList('f', 'o', 'o'));
+    	
+    	@SuppressWarnings("rawtypes")
+    	Map m = converter.convert(dto).to(new TypeReference<Map<String, ?>>() {});
+    	assertEquals(1, m.size());
+    	assertEquals(dto.charSet, m.get("charSet"));
+
+    	m = converter.convert(dto).to(new TypeReference<Map<String, ? extends List<String>>>() {});
+    	assertEquals(1, m.size());
+    	
+    	List<String> list = new ArrayList<>();
+    	for (Character character : dto.charSet) {
+			list.add(String.valueOf(character));
+		}
+    	
+    	assertEquals(list, m.get("charSet"));
+    }
+
     @Test @SuppressWarnings({ "rawtypes", "unchecked" })
     public void testDTOFieldShadowing() {
         MySubDTO dto = new MySubDTO();