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/12/07 11:56:02 UTC

svn commit: r1817361 - in /felix/trunk/converter/converter/src: main/java/org/osgi/util/converter/ test/java/org/osgi/util/converter/

Author: davidb
Date: Thu Dec  7 11:56:02 2017
New Revision: 1817361

URL: http://svn.apache.org/viewvc?rev=1817361&view=rev
Log:
[converter] update to the latest OSGi API.

The API was changed to replace the copy() modifier with the view() modifier, which in effect is the opposite of copy. The default behaviour is now copying.

Modified:
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/AbstractSpecifying.java
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConverterImpl.java
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/CustomConverterImpl.java
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/FunctioningImpl.java
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Specifying.java
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Util.java
    felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterBuilderTest.java
    felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterCollectionsTest.java
    felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterMapTest.java
    felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java
    felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/UtilTest.java

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/AbstractSpecifying.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/AbstractSpecifying.java?rev=1817361&r1=1817360&r2=1817361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/AbstractSpecifying.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/AbstractSpecifying.java Thu Dec  7 11:56:02 2017
@@ -23,7 +23,7 @@ abstract class AbstractSpecifying<T exte
 		implements Specifying<T> {
 	protected volatile Object		defaultValue;
 	protected volatile boolean		hasDefault			= false;
-	protected volatile boolean		forceCopy			= false;
+	protected volatile boolean		liveView			= false;
 	protected volatile boolean		keysIgnoreCase		= false;
 	protected volatile Class< ? >	sourceAsClass;
 	protected volatile boolean		sourceAsDTO			= false;
@@ -38,12 +38,6 @@ abstract class AbstractSpecifying<T exte
 	}
 
 	@Override
-	public T copy() {
-		forceCopy = true;
-		return castThis();
-	}
-
-	@Override
 	public T defaultValue(Object defVal) {
 		defaultValue = defVal;
 		hasDefault = true;
@@ -100,4 +94,9 @@ abstract class AbstractSpecifying<T exte
 		return castThis();
 	}
 
+	@Override
+	public T view() {
+		liveView = true;
+		return castThis();
+	}
 }

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConverterImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConverterImpl.java?rev=1817361&r1=1817360&r2=1817361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConverterImpl.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConverterImpl.java Thu Dec  7 11:56:02 2017
@@ -35,7 +35,7 @@ import org.osgi.util.function.Function;
  * later) types to also work under Java 7.
  */
 class ConverterImpl implements InternalConverter {
-	private static final SimpleDateFormat ISO8601_DATE_FORMAT = new SimpleDateFormat(
+	static final SimpleDateFormat ISO8601_DATE_FORMAT = new SimpleDateFormat(
 			"yyyy-MM-dd'T'HH:mm:ssXXX");
 	static {
 		ISO8601_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));

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=1817361&r1=1817360&r2=1817361&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 Thu Dec  7 11:56:02 2017
@@ -22,6 +22,7 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
@@ -55,7 +56,7 @@ import java.util.concurrent.ConcurrentNa
 import java.util.concurrent.ConcurrentSkipListMap;
 
 /**
- * @author $Id: 9fcd9a61a6412c8af9ef8526e3d4d71ba0dd5435 $
+ * @author $Id: e9cdafec6d5f56c5e5a6bfa5bf013d0e9518b292 $
  */
 class ConvertingImpl extends AbstractSpecifying<Converting>
 		implements Converting, InternalConverting {
@@ -278,7 +279,7 @@ class ConvertingImpl extends AbstractSpe
 	}
 
 	private Collection< ? > convertToCollectionDelegate() {
-		if (forceCopy)
+		if (!liveView)
 			return null;
 
 		if (List.class.equals(targetClass)
@@ -352,12 +353,13 @@ class ConvertingImpl extends AbstractSpe
 
 			T dto = (T) targetClass.newInstance();
 
+			List<String> names = getNames(targetAsClass);
 			for (Map.Entry entry : (Set<Map.Entry>) m.entrySet()) {
 				Object key = entry.getKey();
 				if (key == null)
 					continue;
 
-				String fieldName = Util.mangleName(prefix, key.toString());
+				String fieldName = Util.mangleName(prefix, key.toString(), names);
 				if (fieldName == null)
 					continue;
 
@@ -409,6 +411,23 @@ class ConvertingImpl extends AbstractSpe
 		}
 	}
 
+	private List<String> getNames(Class< ? > cls) {
+		List<String> names = new ArrayList<>();
+		for (Field field : cls.getDeclaredFields()) {
+			int modifiers = field.getModifiers();
+			if (Modifier.isStatic(modifiers))
+				continue;
+			if (!Modifier.isPublic(modifiers))
+				continue;
+
+			String name = field.getName();
+			if (!names.contains(name))
+				names.add(name);
+
+		}
+		return names;
+	}
+
 	@SuppressWarnings({
 			"rawtypes", "unchecked"
 	})
@@ -524,7 +543,7 @@ class ConvertingImpl extends AbstractSpe
 					"Cannot convert " + object + " to " + targetAsClass);
 		}
 
-		if (Map.class.equals(targetClass) && !forceCopy) {
+		if (Map.class.equals(targetClass) && liveView) {
 			Map res = convertToMapDelegate();
 			if (res != null)
 				return res;
@@ -602,7 +621,7 @@ class ConvertingImpl extends AbstractSpe
 	private Object convertToInterface(Class< ? > sourceCls,
 			final Class< ? > targetCls) {
 		InternalConverting ic = converter.convert(object);
-		ic.sourceAs(sourceAsClass);
+		ic.sourceAs(sourceAsClass).view();
 		if (sourceAsDTO)
 			ic.sourceAsDTO();
 		if (sourceAsJavaBean)

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/CustomConverterImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/CustomConverterImpl.java?rev=1817361&r1=1817360&r2=1817361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/CustomConverterImpl.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/CustomConverterImpl.java Thu Dec  7 11:56:02 2017
@@ -71,8 +71,8 @@ class CustomConverterImpl implements Int
 		}
 
 		@Override
-		public Converting copy() {
-			del.copy();
+		public Converting view() {
+			del.view();
 			return this;
 		}
 

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/FunctioningImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/FunctioningImpl.java?rev=1817361&r1=1817360&r2=1817361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/FunctioningImpl.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/FunctioningImpl.java Thu Dec  7 11:56:02 2017
@@ -56,8 +56,8 @@ class FunctioningImpl extends AbstractSp
 	InternalConverting applyModifiers(InternalConverting ic) {
 		if (hasDefault)
 			ic.defaultValue(defaultValue);
-		if (forceCopy)
-			ic.copy();
+		if (liveView)
+			ic.view();
 		if (keysIgnoreCase)
 			ic.keysIgnoreCase();
 		if (sourceAsClass != null)

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Specifying.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Specifying.java?rev=1817361&r1=1817360&r2=1817361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Specifying.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Specifying.java Thu Dec  7 11:56:02 2017
@@ -21,23 +21,13 @@ import org.osgi.annotation.versioning.Pr
  * This is the base interface for the {@link Converting} and {@link Functioning}
  * interfaces and defines the common modifiers that can be applied to these.
  *
+ * @param <T> Either {@link Converting} or {@link Specifying}.
  * @author $Id: 044fea824d1b280a2d267c1221781f3037e7dcd2 $
  * @NotThreadSafe
  */
 @ProviderType
 public interface Specifying<T extends Specifying<T>> {
 	/**
-	 * Always return a fully populated copy of the object, however if the object
-	 * is an immutable built-in scalar such as String or Long, then a copy is
-	 * not needed. By default a wrapped object is returned by the converter if
-	 * possible.
-	 *
-	 * @return The current {@code Converting} object so that additional calls
-	 *         can be chained.
-	 */
-	T copy();
-
-	/**
 	 * The default value to use when the object cannot be converted or in case
 	 * of conversion from a {@code null} value.
 	 *
@@ -107,10 +97,25 @@ public interface Specifying<T extends Sp
 
 	/**
 	 * Treat the target object as a DTO even if it has methods or is otherwise
-	 * not recognized as a DTO.
+	 * not recognised as a DTO.
 	 *
 	 * @return The current {@code Converting} object so that additional calls
 	 *         can be chained.
 	 */
 	T targetAsDTO();
+
+	/**
+	 * Return a live view over the backing object that reflects any changes to
+	 * the original object. This is only possible with conversions to
+	 * {@link java.util.Map}, {@link java.util.Collection},
+	 * {@link java.util.List} and {@link java.util.Set}. The live view object
+	 * will cease to be live as soon as modifications are made to it. Note that
+	 * conversions to an interface or annotation will always produce a live view
+	 * that cannot be modified. This modifier has no effect with conversions to
+	 * other types.
+	 *
+	 * @return The current {@code Converting} object so that additional calls
+	 *         can be chained.
+	 */
+	T view();
 }

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Util.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Util.java?rev=1817361&r1=1817360&r2=1817361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Util.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Util.java Thu Dec  7 11:56:02 2017
@@ -29,12 +29,13 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
 /**
- * @author $Id: 0041a24520bed83da7965519d58274f5bc0e9570 $
+ * @author $Id: 2189d1a98d7949a40331f809dfd73064bf8afdc7 $
  */
 class Util {
 	private static final Map<Class< ? >,Class< ? >> boxedClasses;
@@ -222,7 +223,9 @@ class Util {
 			Object res = md.invoke(obj);
 			if (res instanceof Class)
 				return (Class< ? >) res;
-		} catch (Exception e) {}
+		} catch (Exception e) {
+			// Ignore exception
+		}
 		return null;
 	}
 
@@ -270,7 +273,9 @@ class Util {
 				Object cls = md.invoke(object);
 				if (cls instanceof Class && ((Class< ? >) cls).isAnnotation())
 					return null;
-			} catch (Exception e) {}
+			} catch (Exception e) {
+				// Ignore exception
+			}
 		}
 
 		if (md.getDeclaringClass().getSimpleName().startsWith("$Proxy")) {
@@ -329,27 +334,33 @@ class Util {
 		return "";
 	}
 
-	static String mangleName(String prefix, String key) {
+	static String mangleName(String prefix, String key, List<String> names) {
 		if (!key.startsWith(prefix))
 			return null;
 
 		key = key.substring(prefix.length());
 
+		// Do a reverse search because some characters get removed as part of
+		// the mangling
+		for (String name : names) {
+			if (key.equals(unMangleName(name)))
+				return name;
+		}
+
+		// Fallback if not found in the list - TODO maybe this can be removed.
 		String res = key.replace("_", "__");
 		res = res.replace("$", "$$");
 		res = res.replace("-", "$_$");
 		res = res.replaceAll("[.]([._])", "_\\$$1");
 		res = res.replace('.', '_');
-		// TODO handle Java keywords
 		return res;
 	}
 
 	static String unMangleName(String prefix, String key) {
-		// TODO handle Java keywords
-		return prefix + mangleMethodName(key);
+		return prefix + unMangleName(key);
 	}
 
-	static String mangleMethodName(String id) {
+	static String unMangleName(String id) {
 		char[] array = id.toCharArray();
 		int out = 0;
 

Modified: felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterBuilderTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterBuilderTest.java?rev=1817361&r1=1817360&r2=1817361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterBuilderTest.java (original)
+++ felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterBuilderTest.java Thu Dec  7 11:56:02 2017
@@ -30,6 +30,7 @@ import java.util.stream.Stream;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.osgi.util.function.Function;
 
@@ -96,6 +97,21 @@ public class ConverterBuilderTest {
         assertEquals(Long.valueOf(-1), ca2.convert("Hello").to(Long.class));
     }
 
+    @Test @Ignore
+    public void testConvertToBaseArray() {
+        // TODO
+    }
+
+    @Test @Ignore
+    public void testThrowExceptionInCustomConverter() {
+        // TODO
+    }
+
+    @Test @Ignore
+    public void testMixedListToNumberCase() {
+        // TODO
+    }
+
     @Test
     public void testCannotHandleSpecific() {
         Converter ca = converter.newConverterBuilder().rule(

Modified: felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterCollectionsTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterCollectionsTest.java?rev=1817361&r1=1817360&r2=1817361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterCollectionsTest.java (original)
+++ felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterCollectionsTest.java Thu Dec  7 11:56:02 2017
@@ -37,7 +37,7 @@ public class ConverterCollectionsTest {
     public void testLiveBackingList() {
         List<Integer> l = Arrays.asList(9, 8, 7);
         Converter converter = Converters.standardConverter();
-        List<Short> sl = converter.convert(l)
+        List<Short> sl = converter.convert(l).view()
                 .to(new TypeReference<List<Short>>() {});
 
         assertEquals(Short.valueOf((short) 9), sl.get(0));
@@ -51,9 +51,9 @@ public class ConverterCollectionsTest {
         assertEquals(Short.valueOf((short) 7), sl.get(2));
         assertEquals(3, sl.size());
 
-        List<Short> sl2 = converter.convert(l)
+        List<Short> sl2 = converter.convert(l).view()
                 .to(new TypeReference<List<Short>>() {});
-        List<Short> sl3 = converter.convert(l)
+        List<Short> sl3 = converter.convert(l).view()
                 .to(new TypeReference<List<Short>>() {});
         sl3.add(Short.valueOf((short) 6));
 
@@ -70,7 +70,7 @@ public class ConverterCollectionsTest {
                 9l, 8l
         };
 
-        List<Integer> l = Converters.standardConverter().convert(a).to(
+        List<Integer> l = Converters.standardConverter().convert(a).view().to(
                 new TypeReference<List<Integer>>() {});
         a[0] = 7l;
         l.addAll(Arrays.asList(7, 6));
@@ -84,7 +84,7 @@ public class ConverterCollectionsTest {
                 9l, 8l
         };
 
-        List<Integer> l = Converters.standardConverter().convert(a).to(
+        List<Integer> l = Converters.standardConverter().convert(a).view().to(
                 new TypeReference<List<Integer>>() {});
         l.addAll(1, Arrays.asList(7, 6));
         a[0] = 1l;
@@ -97,7 +97,7 @@ public class ConverterCollectionsTest {
                 9l, 8l
         };
 
-        List<Integer> l = Converters.standardConverter().convert(a).to(
+        List<Integer> l = Converters.standardConverter().convert(a).view().to(
                 new TypeReference<List<Integer>>() {});
         l.removeAll(Collections.singleton(8));
         a[0] = 1l;
@@ -110,7 +110,7 @@ public class ConverterCollectionsTest {
                 9l, 8l
         };
 
-        List<Integer> l = Converters.standardConverter().convert(a).to(
+        List<Integer> l = Converters.standardConverter().convert(a).view().to(
                 new TypeReference<List<Integer>>() {});
         l.retainAll(Collections.singleton(8));
         a[1] = 1l;
@@ -123,7 +123,7 @@ public class ConverterCollectionsTest {
                 9l, 8l
         };
 
-        List<Integer> l = Converters.standardConverter().convert(a).to(
+        List<Integer> l = Converters.standardConverter().convert(a).view().to(
                 new TypeReference<List<Integer>>() {});
         l.clear();
         l.add(10);
@@ -137,7 +137,7 @@ public class ConverterCollectionsTest {
                 9l, 8l
         };
 
-        List<Integer> l = Converters.standardConverter().convert(a).to(
+        List<Integer> l = Converters.standardConverter().convert(a).view().to(
                 new TypeReference<List<Integer>>() {});
         l.add(10);
         a[0] = 1l;
@@ -150,7 +150,7 @@ public class ConverterCollectionsTest {
                 9l, 8l
         };
 
-        List<Integer> l = Converters.standardConverter().convert(a).to(
+        List<Integer> l = Converters.standardConverter().convert(a).view().to(
                 new TypeReference<List<Integer>>() {});
         l.add(0, 10);
         a[0] = 1l;
@@ -163,7 +163,7 @@ public class ConverterCollectionsTest {
                 9l, 8l
         };
 
-        List<Integer> l = Converters.standardConverter().convert(a).to(
+        List<Integer> l = Converters.standardConverter().convert(a).view().to(
                 new TypeReference<List<Integer>>() {});
         assertEquals(Integer.valueOf(8), l.remove(1));
         a[0] = 1l;
@@ -174,7 +174,7 @@ public class ConverterCollectionsTest {
     public void testLiveBackingCollection() {
         Set<String> s = new LinkedHashSet<>(Arrays.asList("yo", "yo", "ma"));
         Converter converter = Converters.standardConverter();
-        List<String> sl = converter.convert(s)
+        List<String> sl = converter.convert(s).view()
                 .to(new TypeReference<List<String>>() {});
 
         assertEquals("yo", sl.get(0));
@@ -205,7 +205,7 @@ public class ConverterCollectionsTest {
     @Test
     public void testLiveBackingEmptyCollection() {
         Set<Long> s = Collections.emptySet();
-        Collection< ? > l = Converters.standardConverter().convert(s).to(
+        Collection< ? > l = Converters.standardConverter().convert(s).view().to(
                 Collection.class);
         assertTrue(l.isEmpty());
         assertEquals(0, l.size());
@@ -219,7 +219,7 @@ public class ConverterCollectionsTest {
         };
 
         @SuppressWarnings("rawtypes")
-        List l = converter.convert(arr).to(List.class);
+        List l = converter.convert(arr).view().to(List.class);
         assertEquals(2, l.size());
         assertFalse(l.isEmpty());
         assertEquals(1, l.get(0));
@@ -241,7 +241,7 @@ public class ConverterCollectionsTest {
         Object[] oa = new Object[] {
                 "hi", null, 'x'
         };
-        List< ? > l = Converters.standardConverter().convert(oa).to(List.class);
+        List< ? > l = Converters.standardConverter().convert(oa).view().to(List.class);
         assertTrue(l.contains("hi"));
         assertTrue(l.contains(null));
         assertTrue(l.contains('x'));
@@ -268,7 +268,7 @@ public class ConverterCollectionsTest {
                 "yo", "ho", "yo", null, "yo"
         };
 
-        List<String> l = Converters.standardConverter().convert(sa).to(
+        List<String> l = Converters.standardConverter().convert(sa).view().to(
                 new TypeReference<List<String>>() {});
         Object[] oa1 = l.toArray();
         String[] sa1 = l.toArray(new String[] {});
@@ -303,7 +303,7 @@ public class ConverterCollectionsTest {
     @Test
     public void testLiveBackingArray0() {
         Converter converter = Converters.standardConverter();
-        List< ? > l = converter.convert(new double[] {}).to(List.class);
+        List< ? > l = converter.convert(new double[] {}).view().to(List.class);
         assertTrue(l.isEmpty());
         assertEquals(0, l.size());
     }
@@ -314,7 +314,7 @@ public class ConverterCollectionsTest {
         Integer[] arr = new Integer[] {1, 2};
 
         @SuppressWarnings("rawtypes")
-        List l = converter.convert(arr).to(List.class);
+        List l = converter.convert(arr).view().to(List.class);
         assertEquals(1, l.get(0));
         assertEquals(2, l.get(1));
 
@@ -329,7 +329,7 @@ public class ConverterCollectionsTest {
         Converter converter = Converters.standardConverter();
         Integer[] arr = new Integer[] {1, 2};
 
-        List<Long> l = converter.convert(arr).to(new TypeReference<List<Long>>() {});
+        List<Long> l = converter.convert(arr).view().to(new TypeReference<List<Long>>() {});
         assertTrue(l.contains(Long.valueOf(2)));
         assertTrue(
                 l.containsAll(Arrays.asList(Long.valueOf(2), Long.valueOf(1))));
@@ -359,7 +359,7 @@ public class ConverterCollectionsTest {
                 1, 2
         };
 
-        List<Long> l = converter.convert(arr)
+        List<Long> l = converter.convert(arr).view()
                 .to(new TypeReference<List<Long>>() {});
         assertTrue(l.remove(Long.valueOf(1)));
         arr[1] = Integer.valueOf(3);
@@ -372,7 +372,7 @@ public class ConverterCollectionsTest {
                 'a', 'b', 'c'
         };
 
-        Set<Character> s = Converters.standardConverter().convert(ca).to(
+        Set<Character> s = Converters.standardConverter().convert(ca).view().to(
                 new TypeReference<Set<Character>>() {});
         assertTrue(s.containsAll(Arrays.asList(Character.valueOf('a'),
                 Character.valueOf('b'), Character.valueOf('c'))));
@@ -387,7 +387,7 @@ public class ConverterCollectionsTest {
         List<Double> l = new ArrayList<>();
         l.add(3.1415);
 
-        Set<Float> s = Converters.standardConverter().convert(l).to(
+        Set<Float> s = Converters.standardConverter().convert(l).view().to(
                 new TypeReference<Set<Float>>() {});
         Float f1 = Float.valueOf(3.1415f);
         Float f2 = Float.valueOf(1.0f);
@@ -421,7 +421,7 @@ public class ConverterCollectionsTest {
         List<String> l = new ArrayList<>();
         l.addAll(Arrays.asList("hi", "there"));
 
-        Set<String> s = Converters.standardConverter().convert(l).to(
+        Set<String> s = Converters.standardConverter().convert(l).view().to(
                 new TypeReference<Set<String>>() {});
         l.set(0, "ho");
 
@@ -432,9 +432,9 @@ public class ConverterCollectionsTest {
         assertEquals(Arrays.asList("ho", "there", null, null),
                 Arrays.asList(sa2));
 
-        Set<String> s2 = Converters.standardConverter().convert(l).to(
+        Set<String> s2 = Converters.standardConverter().convert(l).view().to(
                 new TypeReference<Set<String>>() {});
-        Set<String> s3 = Converters.standardConverter().convert(l).to(
+        Set<String> s3 = Converters.standardConverter().convert(l).view().to(
                 new TypeReference<Set<String>>() {});
         s3.add("!!");
         assertEquals(s.hashCode(), s2.hashCode());
@@ -449,7 +449,7 @@ public class ConverterCollectionsTest {
         List<String> l = new ArrayList<>();
         l.addAll(Arrays.asList("hi", "there"));
 
-        Set<CharSequence> s = Converters.standardConverter().convert(l).to(
+        Set<CharSequence> s = Converters.standardConverter().convert(l).view().to(
                 new TypeReference<Set<CharSequence>>() {});
         assertTrue(s.containsAll(Arrays.asList("there", "hi")));
         s.clear();
@@ -463,7 +463,7 @@ public class ConverterCollectionsTest {
         List<String> l = new ArrayList<>();
         l.addAll(Arrays.asList("hi", "there"));
 
-        Set<CharSequence> s = Converters.standardConverter().convert(l).to(
+        Set<CharSequence> s = Converters.standardConverter().convert(l).view().to(
                 new TypeReference<Set<CharSequence>>() {});
         s.remove("yo");
         l.set(0, "xxx"); // Should not have an effect since 'remove' was called
@@ -478,7 +478,7 @@ public class ConverterCollectionsTest {
         List<String> l = new ArrayList<>();
         l.addAll(Arrays.asList("hi", "there"));
 
-        Set<CharSequence> s = Converters.standardConverter().convert(l).to(
+        Set<CharSequence> s = Converters.standardConverter().convert(l).view().to(
                 new TypeReference<Set<CharSequence>>() {});
         assertFalse(s.addAll(Collections.singleton("there")));
         assertTrue(s.addAll(Arrays.asList("there", "!!")));
@@ -491,7 +491,7 @@ public class ConverterCollectionsTest {
         List<String> l = new ArrayList<>();
         l.addAll(Arrays.asList("hi", "there"));
 
-        Set<CharSequence> s = Converters.standardConverter().convert(l).to(
+        Set<CharSequence> s = Converters.standardConverter().convert(l).view().to(
                 new TypeReference<Set<CharSequence>>() {});
         assertFalse(s.removeAll(Collections.singleton("yo")));
         l.remove("hi");
@@ -505,7 +505,7 @@ public class ConverterCollectionsTest {
         List<String> l = new ArrayList<>();
         l.addAll(Arrays.asList("hi", "there"));
 
-        Set<CharSequence> s = Converters.standardConverter().convert(l).to(
+        Set<CharSequence> s = Converters.standardConverter().convert(l).view().to(
                 new TypeReference<Set<CharSequence>>() {});
 
         assertTrue(s.retainAll(Arrays.asList("hi", "!!")));

Modified: felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterMapTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterMapTest.java?rev=1817361&r1=1817360&r2=1817361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterMapTest.java (original)
+++ felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterMapTest.java Thu Dec  7 11:56:02 2017
@@ -31,6 +31,7 @@ import java.util.Map;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import static org.junit.Assert.assertArrayEquals;
@@ -243,7 +244,7 @@ public class ConverterMapTest {
     @Test
     public void testAnnotationMethods() {
         TestAnnotation ta = converter.convert(new HashMap<>()).to(TestAnnotation.class);
-        Map<String, Object> m = converter.convert(ta).to(new TypeReference<Map<String, Object>>(){});
+        Map<String, Object> m = converter.convert(ta).view().to(new TypeReference<Map<String, Object>>(){});
         assertEquals(3, m.size());
         assertEquals("fooo!", m.get("foo"));
         assertEquals(42, m.get("bar"));
@@ -396,7 +397,7 @@ public class ConverterMapTest {
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    @Test
+    @Test @Ignore
     public void testAnnotationDefaultMaterializer() throws Exception {
         Map<String, Object> vals = new HashMap<>();
         vals.put("bar", 99L);
@@ -482,7 +483,7 @@ public class ConverterMapTest {
         Dictionary<String, Object> dict = new TestDictionary<>();
         dict.put("foo", "hello");
         @SuppressWarnings("rawtypes")
-        Map m = converter.convert(dict).copy().to(Map.class);
+        Map m = converter.convert(dict).to(Map.class);
         assertEquals("hello", m.get("foo"));
     }
 
@@ -528,12 +529,28 @@ public class ConverterMapTest {
         };
 
         @SuppressWarnings("rawtypes")
-        Map m = converter.convert(tiwgp).copy().to(Map.class);
+        Map m = converter.convert(tiwgp).to(Map.class);
         assertEquals(2, m.size());
         assertEquals("ha", m.get("hi"));
         assertEquals("ho", m.get("ho"));
     }
 
+    @Test
+    public void testMapWithKeywords() {
+        Map<String, Object> m = new HashMap<>();
+        m.put("new", "123");
+        m.put("continue", 987l);
+
+        MyDTOWithKeyWords dto = converter.convert(m).to(MyDTOWithKeyWords.class);
+        assertEquals(123l, dto.$new);
+        assertEquals("987", dto.$continue);
+
+        Map<String, Object> m2 = converter.convert(dto).to(new TypeReference<Map<String, Object>>() {});
+        assertEquals(2, m2.size());
+        assertEquals(123l, m2.get("new"));
+        assertEquals("987", m2.get("continue"));
+    }
+
     private <K,V> Map.Entry<K,V> getMapEntry(Map<K,V> map) {
         assertEquals("This method assumes a map of size 1", 1, map.size());
         return map.entrySet().iterator().next();
@@ -581,4 +598,9 @@ public class ConverterMapTest {
             value = v;
         }
     }
+
+    public static class MyDTOWithKeyWords {
+        public long $new;
+        public String $continue;
+    }
 }

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=1817361&r1=1817360&r2=1817361&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 Thu Dec  7 11:56:02 2017
@@ -850,7 +850,7 @@ public class ConverterTest {
         Collection<?> coll = converter.convert("test").to(Collection.class);
         assertEquals("test", coll.iterator().next());
 
-        List<?> list = converter.convert("test").copy().to(List.class);
+        List<?> list = converter.convert("test").to(List.class);
         assertEquals("test", list.iterator().next());
 
         Set<?> set = converter.convert("test").to(Set.class);
@@ -868,19 +868,19 @@ public class ConverterTest {
         Deque<?> dq = converter.convert("test").to(Deque.class);
         assertEquals("test", dq.iterator().next());
 
-        Map<?,?> m = converter.convert(Collections.singletonMap("x", "y")).copy().to(Map.class);
+        Map<?,?> m = converter.convert(Collections.singletonMap("x", "y")).to(Map.class);
         assertEquals("y", m.get("x"));
 
-        ConcurrentMap<?,?> cm = converter.convert(Collections.singletonMap("x", "y")).copy().to(ConcurrentMap.class);
+        ConcurrentMap<?,?> cm = converter.convert(Collections.singletonMap("x", "y")).to(ConcurrentMap.class);
         assertEquals("y", cm.get("x"));
 
-        ConcurrentNavigableMap<?,?> cnm = converter.convert(Collections.singletonMap("x", "y")).copy().to(ConcurrentNavigableMap.class);
+        ConcurrentNavigableMap<?,?> cnm = converter.convert(Collections.singletonMap("x", "y")).to(ConcurrentNavigableMap.class);
         assertEquals("y", cnm.get("x"));
 
-        NavigableMap<?,?> nm = converter.convert(Collections.singletonMap("x", "y")).copy().to(NavigableMap.class);
+        NavigableMap<?,?> nm = converter.convert(Collections.singletonMap("x", "y")).to(NavigableMap.class);
         assertEquals("y", nm.get("x"));
 
-        SortedMap<?,?> sm = converter.convert(Collections.singletonMap("x", "y")).copy().to(SortedMap.class);
+        SortedMap<?,?> sm = converter.convert(Collections.singletonMap("x", "y")).to(SortedMap.class);
         assertEquals("y", sm.get("x"));
     }
 
@@ -898,7 +898,7 @@ public class ConverterTest {
         };
 
         @SuppressWarnings("rawtypes")
-        Map m = converter.convert(intf).to(Map.class);
+        Map m = converter.convert(intf).view().to(Map.class);
         assertEquals(51, m.get("value"));
 
         val[0] = 52;
@@ -922,7 +922,7 @@ public class ConverterTest {
         myDTO.pong = 42L;
 
         @SuppressWarnings("rawtypes")
-        Map m = converter.convert(myDTO).to(Map.class);
+        Map m = converter.convert(myDTO).view().to(Map.class);
         assertEquals(42L, m.get("pong"));
 
         myDTO.ping = "Ping!";
@@ -942,7 +942,7 @@ public class ConverterTest {
     }
 
     @Test
-    public void testLiveMapFromDTO2() {
+    public void testMapFromDTO() {
         MyDTO9 dto = new MyDTO9();
         dto.key1 = "value1";
         dto.key2 = "value2";
@@ -963,7 +963,7 @@ public class ConverterTest {
         Hashtable<String, Object> d = new Hashtable<>();
         d.put("test", testURI);
 
-        Map<String, Object> m = converter.convert(d).to(new TypeReference<Map<String, Object>>(){});
+        Map<String, Object> m = converter.convert(d).view().to(new TypeReference<Map<String, Object>>(){});
         assertEquals(testURI, m.get("test"));
 
         URI testURI2 = new URI("http://bar");
@@ -979,7 +979,7 @@ public class ConverterTest {
         s.put("true", "123");
         s.put("false", "456");
 
-        Map<Boolean, Short> m = converter.convert(s).to(new TypeReference<Map<Boolean, Short>>(){});
+        Map<Boolean, Short> m = converter.convert(s).view().to(new TypeReference<Map<Boolean, Short>>(){});
         assertEquals(Short.valueOf("123"), m.get(Boolean.TRUE));
         assertEquals(Short.valueOf("456"), m.get(Boolean.FALSE));
 
@@ -995,7 +995,7 @@ public class ConverterTest {
         MyBean mb = new MyBean();
         mb.beanVal = "" + Long.MAX_VALUE;
 
-        Map<SomeEnum, Long> m = converter.convert(mb).sourceAsBean().to(new TypeReference<Map<SomeEnum, Long>>(){});
+        Map<SomeEnum, Long> m = converter.convert(mb).sourceAsBean().view().to(new TypeReference<Map<SomeEnum, Long>>(){});
         assertEquals(1, m.size());
         assertEquals(Long.valueOf(Long.MAX_VALUE), m.get(SomeEnum.VALUE));
 

Modified: felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/UtilTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/UtilTest.java?rev=1817361&r1=1817360&r2=1817361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/UtilTest.java (original)
+++ felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/UtilTest.java Thu Dec  7 11:56:02 2017
@@ -57,6 +57,6 @@ public class UtilTest {
     }
 
     private void assertMangle(String methodName, String key) {
-        assertEquals(Util.mangleMethodName(methodName), key);
+        assertEquals(Util.unMangleName(methodName), key);
     }
 }