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/07/05 14:24:45 UTC

svn commit: r1751487 - in /felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json: JsonCodecImpl.java JsonDecodingImpl.java JsonEncodingImpl.java JsonParser.java

Author: davidb
Date: Tue Jul  5 14:24:45 2016
New Revision: 1751487

URL: http://svn.apache.org/viewvc?rev=1751487&view=rev
Log:
Felix Converter Service - work on the JSON codec

Modified:
    felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonCodecImpl.java
    felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonDecodingImpl.java
    felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonEncodingImpl.java
    felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonParser.java

Modified: felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonCodecImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonCodecImpl.java?rev=1751487&r1=1751486&r2=1751487&view=diff
==============================================================================
--- felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonCodecImpl.java (original)
+++ felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonCodecImpl.java Tue Jul  5 14:24:45 2016
@@ -56,6 +56,7 @@ public class JsonCodecImpl implements Co
             if (top == null) {
                 threadLocal.set(Boolean.TRUE);
 
+                // TODO implement this properly
                 encoding = new EncodingWrapper("{}{}{}{}{}", encoding, "{}{}{}{}{}");
             }
         }

Modified: felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonDecodingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonDecodingImpl.java?rev=1751487&r1=1751486&r2=1751487&view=diff
==============================================================================
--- felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonDecodingImpl.java (original)
+++ felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonDecodingImpl.java Tue Jul  5 14:24:45 2016
@@ -16,11 +16,15 @@
  */
 package org.apache.felix.converter.impl.json;
 
+import java.io.IOException;
 import java.io.InputStream;
-import java.lang.reflect.Method;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
+import java.util.Scanner;
 
+import org.apache.felix.converter.impl.Util;
+import org.osgi.service.converter.ConversionException;
 import org.osgi.service.converter.Converter;
 import org.osgi.service.converter.Decoding;
 
@@ -34,47 +38,37 @@ public class JsonDecodingImpl<T> impleme
     }
 
     @Override
-    public T from(CharSequence in) {
-        if (Map.class.isAssignableFrom(clazz)) {
-            return createMapFromJSONString(in);
-        }
-        return deserializeSingleJSONValue(clazz, in);
-    }
-
     @SuppressWarnings("unchecked")
-    private T createMapFromJSONString(CharSequence in) {
-        JsonParser jp = new JsonParser((String) in);
-        return (T) jp.getParsed();
-    }
+    public T from(CharSequence in) {
+        JsonParser jp = new JsonParser(in);
+        Map<?,?> m = jp.getParsed();
+        if (Map.class.isAssignableFrom(clazz))
+            return (T) m;
 
-    @SuppressWarnings("unchecked")
-    private T deserializeSingleJSONValue(Class<T> cls, CharSequence cs) {
-        try {
-            Method m = cls.getDeclaredMethod("valueOf", String.class);
-            if (m != null) {
-                return (T) m.invoke(null, cs);
-            }
-        } catch (Exception e) {
-            return null;
-        }
-        return null;
+        return converter.convert(m).to(clazz);
     }
 
     @Override
     public T from(InputStream in) {
-        // TODO Auto-generated method stub
-        return null;
+        return from(in, StandardCharsets.UTF_8);
     }
 
     @Override
     public T from(InputStream in, Charset charset) {
-        // TODO Auto-generated method stub
-        return null;
+        try {
+            byte[] bytes = Util.readStream(in);
+            String s = new String(bytes, charset);
+            return from(s);
+        } catch (IOException e) {
+            throw new ConversionException("Error reading inputstream", e);
+        }
     }
 
     @Override
     public T from(Readable in) {
-        // TODO Auto-generated method stub
-        return null;
+        try (Scanner s = new Scanner(in)) {
+            s.useDelimiter("\\Z");
+            return from(s.next());
+        }
     }
 }

Modified: felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonEncodingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonEncodingImpl.java?rev=1751487&r1=1751486&r2=1751487&view=diff
==============================================================================
--- felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonEncodingImpl.java (original)
+++ felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonEncodingImpl.java Tue Jul  5 14:24:45 2016
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.reflect.Array;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -27,6 +28,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.osgi.service.converter.ConversionException;
 import org.osgi.service.converter.Converter;
 import org.osgi.service.converter.Encoding;
 
@@ -44,15 +46,31 @@ public class JsonEncodingImpl implements
     }
 
     @Override
+    public Appendable to(Appendable out) {
+        try {
+            out.append(encode(object));
+        } catch (IOException e) {
+            throw new ConversionException("Problem converting to JSON", e);
+        }
+
+        return out;
+    }
+
+    @Override
     public void to(OutputStream os, Charset charset) {
         try {
             os.write(encode(object).getBytes(charset));
         } catch (IOException e) {
-            throw new RuntimeException(e);
+            throw new ConversionException("Problem converting to JSON", e);
         }
     }
 
     @Override
+    public void to(OutputStream out) throws IOException {
+        to(out, StandardCharsets.UTF_8);
+    }
+
+    @Override
     public String toString() {
         return encode(object);
     }
@@ -137,15 +155,4 @@ public class JsonEncodingImpl implements
         return null;
     }
 
-    @Override
-    public Appendable to(Appendable out) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void to(OutputStream out) throws IOException {
-        // TODO Auto-generated method stub
-
-    }
 }

Modified: felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonParser.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonParser.java?rev=1751487&r1=1751486&r2=1751487&view=diff
==============================================================================
--- felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonParser.java (original)
+++ felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonParser.java Tue Jul  5 14:24:45 2016
@@ -73,9 +73,10 @@ public class JsonParser {
 
     private final Map<String, Object> parsed;
 
-    public JsonParser(String json) {
-        json = json.trim().replace('\n', ' ');
-        parsed = parseObject(json);
+    public JsonParser(CharSequence json) {
+        String str = json.toString();
+        str = str.trim().replace('\n', ' ');
+        parsed = parseObject(str);
     }
 
     public JsonParser(InputStream is) throws IOException {