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/07/11 12:49:27 UTC

svn commit: r1801611 - in /felix/trunk/converter/converter/src: main/java/org/apache/felix/converter/impl/ConverterImpl.java test/java/org/apache/felix/converter/impl/ConverterTest.java

Author: davidb
Date: Tue Jul 11 12:49:27 2017
New Revision: 1801611

URL: http://svn.apache.org/viewvc?rev=1801611&view=rev
Log:
Felix converter - support special conversions between character arrays and Strings.

Modified:
    felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConverterImpl.java
    felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java

Modified: felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConverterImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConverterImpl.java?rev=1801611&r1=1801610&r2=1801611&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConverterImpl.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConverterImpl.java Tue Jul 11 12:49:27 2017
@@ -25,12 +25,15 @@ import java.time.OffsetTime;
 import java.time.ZonedDateTime;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 import java.util.UUID;
 import java.util.regex.Pattern;
 
 import org.osgi.util.converter.ConverterBuilder;
+import org.osgi.util.converter.Converters;
 import org.osgi.util.converter.Functioning;
 import org.osgi.util.converter.Rule;
+import org.osgi.util.converter.TypeReference;
 
 public class ConverterImpl implements InternalConverter {
     @Override
@@ -72,6 +75,47 @@ public class ConverterImpl implements In
         cb.rule(new Rule<String, Pattern>(Pattern::compile) {});
         cb.rule(new Rule<String, UUID>(UUID::fromString) {});
         cb.rule(new Rule<String, ZonedDateTime>(ZonedDateTime::parse) {});
+
+        // Special conversions between character arrays / list and String
+        cb.rule(new Rule<char[], String>(ConverterImpl::charArrayToString) {});
+        cb.rule(new Rule<Character[], String>(ConverterImpl::characterArrayToString) {});
+//        cb.rule(new Rule<List<Character>, String>(ConverterImpl::characterListToString) {});
+        cb.rule(new Rule<String, char[]>(ConverterImpl::stringToCharArray) {});
+        cb.rule(new Rule<String, Character[]>(ConverterImpl::stringToCharacterArray) {});
+//        cb.rule(new Rule<String, List<Character>>(ConverterImpl::stringToCharacterList) {});
+    }
+
+    private static String charArrayToString(char[] ca) {
+        StringBuilder sb = new StringBuilder(ca.length);
+        for (char c : ca) {
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+
+    private static String characterArrayToString(Character[] ca) {
+        return charArrayToString(Converters.standardConverter().convert(ca).to(char[].class));
+    }
+
+    private static String characterListToString(List<Character> cl) {
+        return charArrayToString(Converters.standardConverter().convert(cl).to(char[].class));
+    }
+
+    private static char[] stringToCharArray(String s) {
+        char[] ca = new char[s.length()];
+
+        for (int i=0; i<s.length(); i++) {
+            ca[i] = s.charAt(i);
+        }
+        return ca;
+    }
+
+    private static Character[] stringToCharacterArray(String s) {
+        return Converters.standardConverter().convert(stringToCharArray(s)).to(Character[].class);
+    }
+
+    private static List<Character> stringToCharacterList(String s) {
+        return Converters.standardConverter().convert(stringToCharArray(s)).to(new TypeReference<List<Character>>() {});
     }
 
     private Class<?> loadClassUnchecked(String className) {

Modified: felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java?rev=1801611&r1=1801610&r2=1801611&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java (original)
+++ felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java Tue Jul 11 12:49:27 2017
@@ -139,6 +139,23 @@ public class ConverterTest {
         assertEquals(Double.valueOf("12.3"), converter.convert("12.3").to(Double.class));
     }
 
+    @Test
+    public void testCharAggregateToString() {
+        char[] ca = new char[] {'h', 'e', 'l', 'l', 'o'};
+        assertEquals("hello", converter.convert(ca).to(String.class));
+
+        Character[] ca2 = converter.convert(ca).to(Character[].class);
+        assertEquals("hello", converter.convert(ca2).to(String.class));
+
+//        List<Character> cl = converter.convert(ca).to(new TypeReference<List<Character>>() {});
+//        assertEquals("hello", converter.convert(cl).to(String.class));
+
+        // And back
+        assertArrayEquals(ca, converter.convert("hello").to(char[].class));
+        assertArrayEquals(ca2, converter.convert("hello").to(Character[].class));
+//        assertEquals(cl, converter.convert("hello").to(new TypeReference<List<Character>>() {}));
+    }
+
     enum TestEnum { FOO, BAR, BLAH, FALSE, X};
     enum TestEnum2 { BLAH };
     @Test