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 2016/09/06 04:30:44 UTC

svn commit: r1759361 - in /felix/trunk/converter/converter/src: main/java/org/apache/felix/converter/impl/AdapterImpl.java main/java/org/osgi/service/converter/Adapter.java test/java/org/apache/felix/converter/impl/AdapterTest.java

Author: davidb
Date: Tue Sep  6 04:30:44 2016
New Revision: 1759361

URL: http://svn.apache.org/viewvc?rev=1759361&view=rev
Log:
Felix Converter Service - fix NPE and add additional test

Modified:
    felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/AdapterImpl.java
    felix/trunk/converter/converter/src/main/java/org/osgi/service/converter/Adapter.java
    felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/AdapterTest.java

Modified: felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/AdapterImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/AdapterImpl.java?rev=1759361&r1=1759360&r2=1759361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/AdapterImpl.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/AdapterImpl.java Tue Sep  6 04:30:44 2016
@@ -65,8 +65,11 @@ public class AdapterImpl implements Adap
         if (fromCls.equals(toCls))
             throw new IllegalArgumentException();
 
-        classRules.put(new TypePair(fromCls, toCls), (ConvertFunction<Object, Object>) toFun);
-        classRules.put(new TypePair(toCls, fromCls), (ConvertFunction<Object, Object>) fromFun);
+        if (toFun != null)
+            classRules.put(new TypePair(fromCls, toCls), (ConvertFunction<Object, Object>) toFun);
+
+        if (fromFun != null)
+            classRules.put(new TypePair(toCls, fromCls), (ConvertFunction<Object, Object>) fromFun);
         return this;
     }
 

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/service/converter/Adapter.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/service/converter/Adapter.java?rev=1759361&r1=1759360&r2=1759361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/service/converter/Adapter.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/service/converter/Adapter.java Tue Sep  6 04:30:44 2016
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2016). All Rights Reserved.
+     * Copyright (c) OSGi Alliance (2016). All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.

Modified: felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/AdapterTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/AdapterTest.java?rev=1759361&r1=1759360&r2=1759361&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/AdapterTest.java (original)
+++ felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/AdapterTest.java Tue Sep  6 04:30:44 2016
@@ -67,6 +67,41 @@ public class AdapterTest {
                 ca.convert("A,B").to(String[].class));
     }
 
+    static String convertToString(char[] a) {
+        StringBuilder sb = new StringBuilder();
+        for (char c : a) {
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+
+    @Test
+    public void testSecondLevelAdapter() {
+        Adapter ca = converter.getAdapter();
+
+        ca.rule(char[].class, String.class, AdapterTest::convertToString, null);
+        ca.rule(new Rule<String, Number>(String.class, Number.class, new ConvertFunction<String, Number>() {
+            @Override
+            public Number convert(String obj, Type targetType) throws Exception {
+                if (Integer.class.equals(targetType))
+                    return Integer.valueOf(-1);
+                else if (Long.class.equals(targetType))
+                    return Long.valueOf(-1);
+                return null;
+            }
+        }));
+
+        assertEquals("hi", ca.convert(new char[] {'h', 'i'}).to(String.class));
+        assertEquals(Integer.valueOf(-1), ca.convert("Hello").to(Integer.class));
+        assertEquals(Long.valueOf(-1), ca.convert("Hello").to(Long.class));
+
+        Adapter ca2 = ca.getAdapter();
+        // Shadow the Integer variant but keep Long going to the Number variant.
+        ca2.rule(String.class, Integer.class, v -> v.length(), null);
+        assertEquals(5, ca2.convert("Hello").to(Integer.class));
+        assertEquals(Long.valueOf(-1), ca2.convert("Hello").to(Long.class));
+    }
+
     @Test @SuppressWarnings("rawtypes")
     public void testWildcardAdapter() {
         ConvertFunction<List, Object> foo = new ConvertFunction<List, Object>() {