You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by da...@apache.org on 2017/11/17 01:51:43 UTC

svn commit: r1815541 - in /felix/trunk/converter/converter/src/main/java/org/osgi/util/converter: ConvertingImpl.java DynamicMapLikeFacade.java MapDelegate.java

Author: davidb
Date: Fri Nov 17 01:51:43 2017
New Revision: 1815541

URL: http://svn.apache.org/viewvc?rev=1815541&view=rev
Log:
Converter fixes to get the OSGi CT to pass

Modified:
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/DynamicMapLikeFacade.java
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/MapDelegate.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=1815541&r1=1815540&r2=1815541&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 Fri Nov 17 01:51:43 2017
@@ -90,11 +90,11 @@ class ConvertingImpl extends AbstractSpe
         NO_MAP_VIEW_TYPES = types2;
     }
 
-    volatile InternalConverter converter;
+    volatile InternalConverter  converter;
     private volatile Object object;
-    volatile Class<?> sourceClass;
+    private volatile Class< ? > sourceClass;
     private volatile Class<?> targetClass;
-    volatile Type[] typeArguments;
+    private volatile Type[]     typeArguments;
 
     ConvertingImpl(InternalConverter c, Object obj) {
         converter = c;
@@ -405,16 +405,18 @@ class ConvertingImpl extends AbstractSpe
         } else if (Dictionary.class.isAssignableFrom(sourceClass)) {
             return MapDelegate.forDictionary((Dictionary) object, this);
         } else if (DTOUtil.isDTOType(sourceClass) || sourceAsDTO) {
-            return MapDelegate.forDTO(object, this);
+            return MapDelegate.forDTO(object, sourceClass, this);
         } else if (sourceAsJavaBean) {
-            return MapDelegate.forBean(object, this);
+            return MapDelegate.forBean(object, sourceClass, this);
         } else if (hasGetProperties(sourceClass)) {
             return null; // Handled in convertToMap()
         }
 
         // Assume it's an interface
-        if (object.getClass().getInterfaces().length > 0) {
-            return MapDelegate.forInterface(object, this);
+        Set<Class< ? >> interfaces = getInterfaces(sourceClass);
+        if (interfaces.size() > 0) {
+            return MapDelegate.forInterface(object,
+                    interfaces.iterator().next(), this);
         }
         return null;
     }
@@ -453,7 +455,8 @@ class ConvertingImpl extends AbstractSpe
                 return null;
             }
 
-            @Override
+                    @SuppressWarnings("synthetic-access")
+                    @Override
             public Type[] getActualTypeArguments() {
                 return typeArguments;
             }
@@ -483,7 +486,14 @@ class ConvertingImpl extends AbstractSpe
 
     @SuppressWarnings("rawtypes")
     private Object createInterface(Class<?> sourceCls, final Class<?> targetCls) {
-        final Map m = mapView(object, sourceCls, converter);
+        InternalConverting ic = converter.convert(object);
+        ic.sourceAs(sourceAsClass);
+        if (sourceAsDTO)
+            ic.sourceAsDTO();
+        if (sourceAsJavaBean)
+            ic.sourceAsBean();
+        final Map m = ic.to(Map.class);
+
         return Proxy.newProxyInstance(targetCls.getClassLoader(), new Class[] {targetCls},
             new InvocationHandler() {
                     @SuppressWarnings("boxing")
@@ -530,12 +540,15 @@ class ConvertingImpl extends AbstractSpe
                             val = method.getDefaultValue();
                         }
 
-                        if (val == null && args != null && args.length == 1) {
-                            val = args[0];
+                        if (val == null) {
+                            if (args != null && args.length == 1) {
+                                    val = args[0];
+                                } else {
+                                    throw new ConversionException(
+                                            "No value for property: "
+                                                    + propName);
+                                }
                         }
-
-                        if (val == null)
-                            throw new ConversionException("No value for property: " + propName);
                     }
 
                     return converter.convert(val).to(targetType);
@@ -711,9 +724,11 @@ class ConvertingImpl extends AbstractSpe
     }
 
     @SuppressWarnings("rawtypes")
-    private static Map createMapFromInterface(Object obj) {
+    private static Map createMapFromInterface(Object obj,
+            Class< ? > srcCls) {
         Map result = new HashMap();
-        for (Class i : obj.getClass().getInterfaces()) {
+
+        for (Class i : getInterfaces(srcCls)) {
             for (Method md : i.getMethods()) {
                 handleInterfaceMethod(obj, i, md, new HashSet<String>(), result);
             }
@@ -769,6 +784,23 @@ class ConvertingImpl extends AbstractSpe
         return null;
     }
 
+    // Returns an ordered set
+    private static Set<Class< ? >> getInterfaces(Class< ? > cls) {
+        if (cls == null)
+            return Collections.emptySet();
+
+        Set<Class< ? >> classes = new LinkedHashSet<>();
+        if (cls.isInterface()) {
+            classes.add(cls);
+        } else {
+            classes.addAll(Arrays.asList(cls.getInterfaces()));
+        }
+
+        classes.addAll(getInterfaces(cls.getSuperclass()));
+
+        return classes;
+    }
+
     @SuppressWarnings({ "rawtypes", "unchecked" })
     private void handleDTOField(Object obj, Field field, Set<String> handledFields, Map result,
             InternalConverter ic) {
@@ -843,7 +875,7 @@ class ConvertingImpl extends AbstractSpe
         } else if (typeProhibitedFromMapView(sourceCls))
             throw new ConversionException("No map view for " + obj);
 
-        return createMapFromInterface(obj);
+        return createMapFromInterface(obj, sourceClass);
     }
 
     private boolean hasGetProperties(Class<?> cls) {

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/DynamicMapLikeFacade.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/DynamicMapLikeFacade.java?rev=1815541&r1=1815540&r2=1815541&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/DynamicMapLikeFacade.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/DynamicMapLikeFacade.java Fri Nov 17 01:51:43 2017
@@ -29,6 +29,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+/**
+ * @author $Id: ebf418b754027f4d4a245dfd223ebced321e884a $
+ */
 abstract class DynamicMapLikeFacade<K, V> implements Map<K, V> {
     protected final ConvertingImpl convertingImpl;
 
@@ -137,10 +140,13 @@ abstract class DynamicMapLikeFacade<K, V
 class DynamicBeanFacade extends DynamicMapLikeFacade<String,Object> {
     private Map <String, Method> keys = null;
     private final Object backingObject;
+	private final Class< ? >	beanClass;
 
-    DynamicBeanFacade(Object backingObject, ConvertingImpl convertingImpl) {
+	DynamicBeanFacade(Object backingObject, Class< ? > beanClass,
+			ConvertingImpl convertingImpl) {
         super(convertingImpl);
         this.backingObject = backingObject;
+		this.beanClass = beanClass;
     }
 
     @Override
@@ -160,7 +166,7 @@ class DynamicBeanFacade extends DynamicM
 
     private Map<String, Method> getKeys() {
         if (keys == null)
-            keys = Util.getBeanKeys(convertingImpl.sourceClass);
+			keys = Util.getBeanKeys(beanClass);
 
         return keys;
     }
@@ -208,10 +214,13 @@ class DynamicMapFacade<K,V> extends Dyna
 class DynamicDTOFacade extends DynamicMapLikeFacade<String, Object> {
     private Map <String, Field> keys = null;
     private final Object backingObject;
+	private final Class< ? >	dtoClass;
 
-    DynamicDTOFacade(Object backingObject, ConvertingImpl converting) {
+	DynamicDTOFacade(Object backingObject, Class< ? > dtoClass,
+			ConvertingImpl converting) {
         super(converting);
         this.backingObject = backingObject;
+		this.dtoClass = dtoClass;
     }
 
     @Override
@@ -234,7 +243,7 @@ class DynamicDTOFacade extends DynamicMa
 
     private Map<String, Field> getKeys() {
         if (keys == null)
-            keys = Util.getDTOKeys(convertingImpl.sourceClass);
+			keys = Util.getDTOKeys(dtoClass);
 
         return keys;
     }
@@ -243,15 +252,20 @@ class DynamicDTOFacade extends DynamicMa
 class DynamicInterfaceFacade extends DynamicMapLikeFacade<String, Object> {
     private Map <String, Set<Method>> keys = null;
     private final Object backingObject;
+	private final Class< ? >		theInterface;
 
-    DynamicInterfaceFacade(Object backingObject, ConvertingImpl convertingImpl) {
+	DynamicInterfaceFacade(Object backingObject, Class< ? > intf,
+			ConvertingImpl convertingImpl) {
         super(convertingImpl);
         this.backingObject = backingObject;
+		this.theInterface = intf;
     }
 
     @Override
     public Object get(Object key) {
         Set<Method> set = getKeys().get(key);
+		if (set == null)
+			return null;
         for (Iterator<Method> iterator = set.iterator();iterator.hasNext();) {
             Method m = iterator.next();
             if (m.getParameterTypes().length > 0)
@@ -274,7 +288,7 @@ class DynamicInterfaceFacade extends Dyn
 
     private Map<String, Set<Method>> getKeys() {
         if (keys == null)
-            keys = Util.getInterfaceKeys(convertingImpl.sourceClass, backingObject);
+			keys = Util.getInterfaceKeys(theInterface, backingObject);
 
         return keys;
     }

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/MapDelegate.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/MapDelegate.java?rev=1815541&r1=1815540&r2=1815541&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/MapDelegate.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/MapDelegate.java Fri Nov 17 01:51:43 2017
@@ -26,7 +26,7 @@ import java.util.Map;
 import java.util.Set;
 
 /**
- * @author $Id: 12cb021a8b0bff80df438cdb40cefaa04be26437 $
+ * @author $Id: 0e4f8c8087d4556f2f4ab68f7c293ca5330b56bc $
  */
 class MapDelegate<K, V> implements Map<K, V> {
     private final ConvertingImpl convertingImpl;
@@ -37,8 +37,10 @@ class MapDelegate<K, V> implements Map<K
         delegate = del;
     }
 
-    static MapDelegate<String, Object> forBean(Object b, ConvertingImpl converting) {
-        return new MapDelegate<>(converting, new DynamicBeanFacade(b, converting));
+    static MapDelegate<String,Object> forBean(Object b, Class< ? > beanClass,
+            ConvertingImpl converting) {
+        return new MapDelegate<>(converting,
+                new DynamicBeanFacade(b, beanClass, converting));
     }
 
     static <K, V> Map<K, V> forMap(Map<K, V> m, ConvertingImpl converting) {
@@ -49,12 +51,16 @@ class MapDelegate<K, V> implements Map<K
         return new MapDelegate<>(converting, new DynamicDictionaryFacade<>(d, converting));
     }
 
-    static MapDelegate<String, Object> forDTO(Object obj, ConvertingImpl converting) {
-        return new MapDelegate<>(converting, new DynamicDTOFacade(obj, converting));
+    static MapDelegate<String,Object> forDTO(Object obj, Class< ? > dtoClass,
+            ConvertingImpl converting) {
+        return new MapDelegate<>(converting,
+                new DynamicDTOFacade(obj, dtoClass, converting));
     }
 
-    static MapDelegate<String, Object> forInterface(Object obj, ConvertingImpl converting) {
-        return new MapDelegate<>(converting, new DynamicInterfaceFacade(obj, converting));
+    static MapDelegate<String,Object> forInterface(Object obj, Class< ? > intf,
+            ConvertingImpl converting) {
+        return new MapDelegate<>(converting,
+                new DynamicInterfaceFacade(obj, intf, converting));
     }
 
     @Override