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