You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by dl...@apache.org on 2017/08/25 11:22:38 UTC

svn commit: r1806157 - in /felix/trunk/converter: persister/src/main/java/org/apache/felix/persister/impl/ schematizer/src/test/java/org/apache/felix/serializer/impl/json/ serializer/src/main/java/org/apache/felix/serializer/impl/ serializer/src/main/j...

Author: dleangen
Date: Fri Aug 25 11:22:37 2017
New Revision: 1806157

URL: http://svn.apache.org/viewvc?rev=1806157&view=rev
Log:
[FELIX-5412] Pretty format not implemented in JSON serializer

Added:
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DebugJsonWriter.java
      - copied, changed from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultJsonParser.java
      - copied, changed from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultParser.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultJsonWriter.java
      - copied, changed from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializingImpl.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java   (contents, props changed)
      - copied, changed from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultParser.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultYamlParser.java
      - copied, changed from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultParser.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultYamlWriter.java
      - copied, changed from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java   (contents, props changed)
      - copied, changed from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultParser.java
    felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Writer.java   (with props)
    felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/WriterFactory.java   (with props)
Removed:
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultParser.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultParser.java
Modified:
    felix/trunk/converter/persister/src/main/java/org/apache/felix/persister/impl/StandardPersister.java
    felix/trunk/converter/schematizer/src/test/java/org/apache/felix/serializer/impl/json/JsonDeserializationTest.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/Activator.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonDeserializingImpl.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializerImpl.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializingImpl.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlDeserializingImpl.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializerImpl.java
    felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java
    felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Deserializing.java
    felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Serializer.java
    felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Serializing.java
    felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonBackingObjectSerializationTest.java
    felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonParserTest.java
    felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonSerializerTest.java
    felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/yaml/YamlSerializerTest.java

Modified: felix/trunk/converter/persister/src/main/java/org/apache/felix/persister/impl/StandardPersister.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/persister/src/main/java/org/apache/felix/persister/impl/StandardPersister.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/persister/src/main/java/org/apache/felix/persister/impl/StandardPersister.java (original)
+++ felix/trunk/converter/persister/src/main/java/org/apache/felix/persister/impl/StandardPersister.java Fri Aug 25 11:22:37 2017
@@ -40,7 +40,7 @@ public class StandardPersister<D> implem
     @Override
     public void serialize(OutputStream out, D entity) {
         try {
-            serializer.serialize(entity).with(getConverter()).to( out );
+            serializer.serialize(entity).convertWith(getConverter()).to( out );
         } catch ( IOException e ) {
             // TODO: Handle this
             e.printStackTrace();
@@ -51,7 +51,7 @@ public class StandardPersister<D> implem
     public D deserialize(InputStream in) {
       return (D)serializer
               .deserialize(dataType)
-              .with(getConverter())
+              .convertWith(getConverter())
               .from(in);
     }
 

Modified: felix/trunk/converter/schematizer/src/test/java/org/apache/felix/serializer/impl/json/JsonDeserializationTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/schematizer/src/test/java/org/apache/felix/serializer/impl/json/JsonDeserializationTest.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/schematizer/src/test/java/org/apache/felix/serializer/impl/json/JsonDeserializationTest.java (original)
+++ felix/trunk/converter/schematizer/src/test/java/org/apache/felix/serializer/impl/json/JsonDeserializationTest.java Fri Aug 25 11:22:37 2017
@@ -55,10 +55,10 @@ public class JsonDeserializationTest {
         Converter c = new SchematizerImpl()
                 .schematize("MyDTO", new TypeReference<MyDTO>(){})
                 .converterFor("MyDTO");
-        String serialized = new JsonSerializerImpl().serialize(dto).with(c).toString();
+        String serialized = new JsonSerializerImpl().serialize(dto).convertWith(c).toString();
         MyDTO result = new JsonSerializerImpl()
                 .deserialize(MyDTO.class)
-                .with(c)
+                .convertWith(c)
                 .from(serialized);
 
         assertEquals(dto.ping, result.ping);
@@ -88,7 +88,7 @@ public class JsonDeserializationTest {
                 .converterFor("MyDTO");
         MyDTO2<MyEmbeddedDTO2<String>> result = new JsonSerializerImpl()
                 .deserialize(new TypeReference<MyDTO2<MyEmbeddedDTO2<String>>>(){})
-                .with(c)
+                .convertWith(c)
                 .from(serialized);
 
         assertEquals(dto.ping, result.ping);

Modified: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/Activator.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/Activator.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/Activator.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/Activator.java Fri Aug 25 11:22:37 2017
@@ -20,10 +20,13 @@ import java.util.Dictionary;
 import java.util.Hashtable;
 
 import org.apache.felix.serializer.impl.json.JsonSerializerImpl;
+import org.apache.felix.serializer.impl.json.JsonWriterFactory;
 import org.apache.felix.serializer.impl.yaml.YamlSerializerImpl;
+import org.apache.felix.serializer.impl.yaml.YamlWriterFactory;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.serializer.Serializer;
+import org.osgi.service.serializer.WriterFactory;
 
 public class Activator implements BundleActivator {
     @Override
@@ -32,13 +35,27 @@ public class Activator implements Bundle
         jsonProps.put("mimetype", new String[] {
                 "application/json", "application/x-javascript", "text/javascript",
                 "text/x-javascript", "text/x-json" });
-        context.registerService(Serializer.class, new JsonSerializerImpl(), jsonProps);
+        context.registerService(
+                new String[]{Serializer.class.getName(), Serializer.JsonSerializer.class.getName()}, 
+                new JsonSerializerImpl(), 
+                jsonProps);
+        context.registerService(
+                new String[]{WriterFactory.class.getName(), WriterFactory.JsonWriterFactory.class.getName()}, 
+                new JsonWriterFactory(), 
+                jsonProps);
 
         Dictionary<String, Object> yamlProps = new Hashtable<>();
         yamlProps.put("mimetype", new String[] {
                 "text/yaml", "text/x-yaml", "application/yaml",
                 "application/x-yaml" });
-        context.registerService(Serializer.class, new YamlSerializerImpl(), yamlProps);
+        context.registerService(
+                new String[]{Serializer.class.getName(), Serializer.YamlSerializer.class.getName()}, 
+                new YamlSerializerImpl(), 
+                yamlProps);
+        context.registerService(
+                new String[]{WriterFactory.class.getName(), WriterFactory.YamlWriterFactory.class.getName()}, 
+                new YamlWriterFactory(), 
+                yamlProps);
     }
 
     @Override

Copied: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DebugJsonWriter.java (from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java)
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DebugJsonWriter.java?p2=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DebugJsonWriter.java&p1=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java&r1=1806124&r2=1806157&rev=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DebugJsonWriter.java Fri Aug 25 11:22:37 2017
@@ -14,89 +14,59 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.serializer.impl.yaml;
+package org.apache.felix.serializer.impl.json;
 
-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;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
+import java.util.TreeMap;
+import java.util.Map.Entry;
 
-import org.apache.felix.serializer.impl.AbstractSpecifying;
-import org.osgi.service.serializer.Serializing;
-import org.osgi.util.converter.ConversionException;
+import org.osgi.dto.DTO;
+import org.osgi.service.serializer.Writer;
 import org.osgi.util.converter.Converter;
 
-public class YamlSerializingImpl extends AbstractSpecifying<Serializing> implements Serializing {
-    private volatile Converter converter;
-    private final Map<String, Object> configuration;
-    private final Object object;
+public class DebugJsonWriter implements Writer {
+
+    private final Converter converter;
+    private final boolean ignoreNull = false;
     private final int indentation = 2;
 
-    public YamlSerializingImpl(Converter c, Map<String, Object> cfg, Object obj) {
+    public DebugJsonWriter(Converter c) {
         converter = c;
-        configuration = cfg;
-        object = obj;
-    }
-
-    @Override
-    public Appendable to(Appendable out) {
-        try {
-            out.append(encode(object));
-            return out;
-        } catch (IOException e) {
-            throw new ConversionException("Problem converting to YAML", e);
-        }
-    }
-
-
-   @Override
-    public void to(OutputStream os) throws IOException {
-       to(os, StandardCharsets.UTF_8);
-    }
-
-    @Override
-    public void to(OutputStream os, Charset charset) {
-        try {
-            os.write(encode(object).getBytes(charset));
-        } catch (IOException e) {
-            throw new ConversionException("Problem converting to YAML", e);
-        }
     }
 
     @Override
-    public String toString() {
-        return encode(object);
-    }
-
-    private String encode(Object obj) {
+    public String write(Object obj) {
         return encode(obj, 0).trim();
     }
 
     @SuppressWarnings("rawtypes")
     private String encode(Object obj, int level) {
-        if (obj == null)
-            return "";
+        if (obj == null) {
+            return ignoreNull ? "" : "null";
+        }
 
-        if (obj instanceof Map) {
+        if (obj instanceof String) {
+            return "\"" + (String)obj + "\"";
+        } else if (obj instanceof Map) {
             return encodeMap((Map) obj, level);
         } else if (obj instanceof Collection) {
             return encodeCollection((Collection) obj, level);
+        } else if (obj instanceof DTO) {
+            return encodeMap(converter.convert(obj).sourceAsDTO().to(Map.class), level);
         } else if (obj.getClass().isArray()) {
             return encodeCollection(asCollection(obj), level);
-        } else if (obj instanceof Number)  {
+        } else if (obj instanceof Number) {
             return obj.toString();
         } else if (obj instanceof Boolean) {
             return obj.toString();
         }
 
-        return "'" + converter.convert(obj).to(String.class) + "'";
+        return "\"" + converter.convert(obj).to(String.class) + "\"";
     }
 
     private Collection<?> asCollection(Object arr) {
@@ -110,26 +80,47 @@ public class YamlSerializingImpl extends
     }
 
     private String encodeCollection(Collection<?> collection, int level) {
-        StringBuilder sb = new StringBuilder();
+        level++;
+        StringBuilder sb = new StringBuilder("[\n");
+
+        boolean first = true;
         for (Object o : collection) {
-            sb.append("\n");
-            sb.append(getIdentPrefix(level));
-            sb.append("- ");
-            sb.append(encode(o, level + 1));
+            if (first)
+                first = false;
+            else
+                sb.append(",\n");
+
+            sb.append( getIdentPrefix(level));
+            sb.append(encode(o, level));
         }
+
+        sb.append("\n");
+        sb.append( getIdentPrefix(--level));
+        sb.append("]");
         return sb.toString();
     }
 
     @SuppressWarnings({ "rawtypes", "unchecked" })
     private String encodeMap(Map m, int level) {
-        StringBuilder sb = new StringBuilder();
-        for (Entry entry : (Set<Entry>) m.entrySet()) {
-            sb.append("\n");
+        level++;
+        Map orderedMap = new TreeMap<>(m);
+        StringBuilder sb = new StringBuilder("{\n");
+        for (Entry entry : (Set<Entry>) orderedMap.entrySet()) {
+            if (entry.getKey() == null || entry.getValue() == null)
+                if (ignoreNull)
+                    continue;
+
+            if (sb.length() > 2)
+                sb.append(",\n");
             sb.append(getIdentPrefix(level));
+            sb.append('"');
             sb.append(entry.getKey().toString());
-            sb.append(": ");
-            sb.append(encode(entry.getValue(), level + 1));
+            sb.append("\":");
+            sb.append(encode(entry.getValue(), level));
         }
+        sb.append("\n");
+        sb.append(getIdentPrefix(--level));
+        sb.append("}");
 
         return sb.toString();
     }
@@ -141,20 +132,4 @@ public class YamlSerializingImpl extends
             sb.append(' ');
         return sb.toString();
     }
-
-    @Override
-    public Serializing pretty() {
-        return this;
-    }
-
-    @Override
-    public Serializing ignoreNull() {
-        return this;
-    }
-
-    @Override
-    public Serializing with(Converter c) {
-        converter = c;
-        return this;
-    }
 }

Copied: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultJsonParser.java (from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultParser.java)
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultJsonParser.java?p2=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultJsonParser.java&p1=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultParser.java&r1=1806124&r2=1806157&rev=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultParser.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultJsonParser.java Fri Aug 25 11:22:37 2017
@@ -24,7 +24,7 @@ import java.util.Map;
 import org.apache.felix.utils.json.JSONParser;
 import org.osgi.service.serializer.Parser;
 
-public class DefaultParser implements Parser {
+public class DefaultJsonParser implements Parser {
 
     @Override
     public Map<String, Object> parse(InputStream in)

Copied: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultJsonWriter.java (from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializingImpl.java)
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultJsonWriter.java?p2=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultJsonWriter.java&p1=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializingImpl.java&r1=1806124&r2=1806157&rev=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializingImpl.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultJsonWriter.java Fri Aug 25 11:22:37 2017
@@ -16,64 +16,30 @@
  */
 package org.apache.felix.serializer.impl.json;
 
-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;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
+import java.util.Map.Entry;
 
-import org.apache.felix.serializer.impl.AbstractSpecifying;
 import org.osgi.dto.DTO;
-import org.osgi.service.serializer.Serializing;
-import org.osgi.util.converter.ConversionException;
+import org.osgi.service.serializer.Writer;
 import org.osgi.util.converter.Converter;
 
-public class JsonSerializingImpl extends AbstractSpecifying<Serializing> implements Serializing {
-    private volatile Converter converter;
-    private final Map<String, Object> configuration;
-    private final Object object;
-    private final boolean ignoreNull;
-
-    JsonSerializingImpl(Converter c, Map<String, Object> cfg, Object obj) {
-        converter = c;
-        configuration = cfg;
-        ignoreNull = Boolean.TRUE.equals(Boolean.parseBoolean((String) configuration.get("ignoreNull")));
-        object = obj;
-    }
-
-    @Override
-    public Appendable to(Appendable out) {
-        try {
-            out.append(encode(object));
-            return out;
-        } catch (IOException e) {
-            throw new ConversionException("Problem converting to JSON", e);
-        }
-    }
+public class DefaultJsonWriter implements Writer {
 
-    @Override
-    public void to(OutputStream os, Charset charset) {
-        try {
-            os.write(encode(object).getBytes(charset));
-        } catch (IOException e) {
-            throw new ConversionException("Problem converting to JSON", e);
-        }
-    }
+    private final Converter converter;
+    private final boolean ignoreNull = false;
 
-    @Override
-    public void to(OutputStream out) throws IOException {
-        to(out, StandardCharsets.UTF_8);
+    public DefaultJsonWriter(Converter c) {
+        converter = c;
     }
 
     @Override
-    public String toString() {
-        return encode(object);
+    public String write(Object obj) {
+        return encode(obj);
     }
 
     @SuppressWarnings("rawtypes")
@@ -93,7 +59,7 @@ public class JsonSerializingImpl extends
             return encodeMap((Map) obj);
         } else if (obj instanceof Collection) {
             return encodeCollection((Collection) obj);
-        } else if (sourceAsDTO || obj instanceof DTO) { // TODO: Use isDTOTYPE() or instanceOf??
+        } else if (obj instanceof DTO) {
             return encodeMap(converter.convert(obj).sourceAsDTO().to(Map.class));
         } else if (obj.getClass().isArray()) {
             return encodeCollection(asCollection(obj));
@@ -152,20 +118,4 @@ public class JsonSerializingImpl extends
 
         return sb.toString();
     }
-
-    @Override
-    public Serializing ignoreNull() {
-        return this;
-    }
-
-    @Override
-    public Serializing pretty() {
-        return this;
-    }
-
-    @Override
-    public Serializing with(Converter c) {
-        converter = c;
-        return this;
-    }
 }

Modified: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonDeserializingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonDeserializingImpl.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonDeserializingImpl.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonDeserializingImpl.java Fri Aug 25 11:22:37 2017
@@ -77,13 +77,13 @@ public class JsonDeserializingImpl<T> im
     }
 
     @Override
-    public Deserializing<T> with(Converter c) {
+    public Deserializing<T> convertWith(Converter c) {
         converter = c;
         return this;
     }
 
     @Override
-    public Deserializing<T> with(Parser p) {
+    public Deserializing<T> parseWith(Parser p) {
         parser = p;
         return this;
     }

Modified: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializerImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializerImpl.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializerImpl.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializerImpl.java Fri Aug 25 11:22:37 2017
@@ -16,28 +16,21 @@
  */
 package org.apache.felix.serializer.impl.json;
 
-import java.io.IOException;
-import java.io.OutputStream;
 import java.lang.reflect.Type;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.felix.serializer.impl.AbstractSpecifying;
 import org.osgi.service.serializer.Deserializing;
 import org.osgi.service.serializer.Parser;
 import org.osgi.service.serializer.Serializer;
 import org.osgi.service.serializer.Serializing;
+import org.osgi.service.serializer.Writer;
 import org.osgi.util.converter.Converter;
 import org.osgi.util.converter.Converters;
 import org.osgi.util.converter.TypeReference;
 
 public class JsonSerializerImpl implements Serializer {
-    private final Map<String, Object> configuration = new ConcurrentHashMap<>();
-    private final ThreadLocal<Boolean> threadLocal = new ThreadLocal<>();
     private final Converter converter = Converters.standardConverter();
-    private final Parser parser = new DefaultParser();
+    private final Parser parser = new DefaultJsonParser();
+    private final Writer writer = new DefaultJsonWriter(converter);
 
     @Override
     public <T> Deserializing<T> deserialize(Class<T> cls) {
@@ -46,79 +39,7 @@ public class JsonSerializerImpl implemen
 
     @Override
     public Serializing serialize(Object obj) {
-        Serializing encoding = new JsonSerializingImpl(converter, configuration, obj);
-
-        if (pretty()) {
-            Boolean top = threadLocal.get();
-            if (top == null) {
-                threadLocal.set(Boolean.TRUE);
-
-                // TODO implement this properly, the following it just a dev temp thing
-                encoding = new EncodingWrapper("{}{}{}{}{}", encoding, "{}{}{}{}{}");
-            }
-        }
-        return encoding;
-    }
-
-    private boolean pretty() {
-        return Boolean.TRUE.equals(Boolean.parseBoolean((String) configuration.get("pretty")));
-    }
-
-    private class EncodingWrapper extends AbstractSpecifying<Serializing> implements Serializing {
-        private final Serializing delegate;
-        private String prefix;
-        private String postfix;
-
-        EncodingWrapper(String pre, Serializing encoding, String post) {
-            prefix = pre;
-            delegate = encoding;
-            postfix = post;
-        }
-
-        @Override
-        public void to(OutputStream os) {
-            try {
-                os.write(toString().getBytes(StandardCharsets.UTF_8));
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        @Override
-        public String toString() {
-            try {
-                return prefix + delegate.toString() + postfix;
-            } finally {
-                threadLocal.set(null);
-            }
-        }
-
-        @Override
-        public Serializing ignoreNull() {
-            return this;
-        }
-
-        @Override
-        public Serializing pretty() {
-            return this;
-        }
-
-        @Override
-        public void to(OutputStream out, Charset charset) {
-            // TODO Auto-generated method stub
-        }
-
-        @Override
-        public Appendable to(Appendable out) {
-            // TODO Auto-generated method stub
-            return null;
-        }
-
-        @Override
-        public Serializing with(Converter converter) {
-            delegate.with(converter);
-            return this;
-        }
+        return new JsonSerializingImpl(converter, writer, obj);
     }
 
     @Override

Modified: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializingImpl.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializingImpl.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonSerializingImpl.java Fri Aug 25 11:22:37 2017
@@ -18,39 +18,31 @@ package org.apache.felix.serializer.impl
 
 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;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
 
 import org.apache.felix.serializer.impl.AbstractSpecifying;
-import org.osgi.dto.DTO;
 import org.osgi.service.serializer.Serializing;
+import org.osgi.service.serializer.Writer;
 import org.osgi.util.converter.ConversionException;
 import org.osgi.util.converter.Converter;
 
 public class JsonSerializingImpl extends AbstractSpecifying<Serializing> implements Serializing {
     private volatile Converter converter;
-    private final Map<String, Object> configuration;
+    private volatile boolean useCustomWriter;
+    private volatile Writer writer;
     private final Object object;
-    private final boolean ignoreNull;
 
-    JsonSerializingImpl(Converter c, Map<String, Object> cfg, Object obj) {
+    JsonSerializingImpl(Converter c, Writer w, Object obj) {
         converter = c;
-        configuration = cfg;
-        ignoreNull = Boolean.TRUE.equals(Boolean.parseBoolean((String) configuration.get("ignoreNull")));
+        writer = w;
         object = obj;
     }
 
     @Override
     public Appendable to(Appendable out) {
         try {
-            out.append(encode(object));
+            out.append(writer.write(object));
             return out;
         } catch (IOException e) {
             throw new ConversionException("Problem converting to JSON", e);
@@ -60,7 +52,7 @@ public class JsonSerializingImpl extends
     @Override
     public void to(OutputStream os, Charset charset) {
         try {
-            os.write(encode(object).getBytes(charset));
+            os.write(writer.write(object).getBytes(charset));
         } catch (IOException e) {
             throw new ConversionException("Problem converting to JSON", e);
         }
@@ -73,99 +65,20 @@ public class JsonSerializingImpl extends
 
     @Override
     public String toString() {
-        return encode(object);
-    }
-
-    @SuppressWarnings("rawtypes")
-    private String encode(Object obj) {
-        if (obj == null) {
-            return ignoreNull ? "" : "null";
-        }
-
-        if (obj instanceof String) {
-            // Optimization for when the value is already a String
-            // David B.: is this ok? Or does the Converter do something else
-            //           other than just returning a String??
-            //           I noticed that a lot of calculations were going on, just
-            //           to return a String anyway.
-            return "\"" + (String)obj + "\"";
-        } else if (obj instanceof Map) {
-            return encodeMap((Map) obj);
-        } else if (obj instanceof Collection) {
-            return encodeCollection((Collection) obj);
-        } else if (sourceAsDTO || obj instanceof DTO) { // TODO: Use isDTOTYPE() or instanceOf??
-            return encodeMap(converter.convert(obj).sourceAsDTO().to(Map.class));
-        } else if (obj.getClass().isArray()) {
-            return encodeCollection(asCollection(obj));
-        } else if (obj instanceof Number) {
-            return obj.toString();
-        } else if (obj instanceof Boolean) {
-            return obj.toString();
-        }
-
-        return "\"" + converter.convert(obj).to(String.class) + "\"";
-    }
-
-    private Collection<?> asCollection(Object arr) {
-        // Arrays.asList() doesn't work for primitive arrays
-        int len = Array.getLength(arr);
-        List<Object> l = new ArrayList<>(len);
-        for (int i=0; i<len; i++) {
-            l.add(Array.get(arr, i));
-        }
-        return l;
-    }
-
-    private String encodeCollection(Collection<?> collection) {
-        StringBuilder sb = new StringBuilder("[");
-
-        boolean first = true;
-        for (Object o : collection) {
-            if (first)
-                first = false;
-            else
-                sb.append(',');
-
-            sb.append(encode(o));
-        }
-
-        sb.append("]");
-        return sb.toString();
-    }
-
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    private String encodeMap(Map m) {
-        StringBuilder sb = new StringBuilder("{");
-        for (Entry entry : (Set<Entry>) m.entrySet()) {
-            if (entry.getKey() == null || entry.getValue() == null)
-                if (ignoreNull)
-                    continue;
-
-            if (sb.length() > 1)
-                sb.append(',');
-            sb.append('"');
-            sb.append(entry.getKey().toString());
-            sb.append("\":");
-            sb.append(encode(entry.getValue()));
-        }
-        sb.append("}");
-
-        return sb.toString();
+        return writer.write(object);
     }
 
     @Override
-    public Serializing ignoreNull() {
-        return this;
-    }
-
-    @Override
-    public Serializing pretty() {
+    public Serializing convertWith(Converter c) {
+        converter = c;
+        if (!useCustomWriter)
+            writer = new DefaultJsonWriter(converter);
         return this;
     }
 
     @Override
-    public Serializing with(Converter c) {
-        converter = c;
+    public Serializing writeWith(Writer w) {
+        writer = w;
         return this;
     }
 }

Copied: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java (from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultParser.java)
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java?p2=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java&p1=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultParser.java&r1=1806124&r2=1806157&rev=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DefaultParser.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java Fri Aug 25 11:22:37 2017
@@ -16,32 +16,19 @@
  */
 package org.apache.felix.serializer.impl.json;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
+import org.osgi.service.serializer.Writer;
+import org.osgi.service.serializer.WriterFactory;
+import org.osgi.util.converter.Converter;
 
-import org.apache.felix.utils.json.JSONParser;
-import org.osgi.service.serializer.Parser;
-
-public class DefaultParser implements Parser {
+public class JsonWriterFactory implements WriterFactory {
 
     @Override
-    public Map<String, Object> parse(InputStream in)
-    {
-        try {
-            JSONParser parser = new JSONParser(in);
-            return parser.getParsed();
-        } catch (IOException e) {
-            Map<String, Object> report = new HashMap<>();
-            report.put("error", e.getMessage());
-            return report;
-        }
+    public Writer newDefaultWriter(Converter c) {
+        return new DefaultJsonWriter(c);
     }
 
     @Override
-    public Map<String, Object> parse(CharSequence in) {
-        JSONParser parser = new JSONParser(in);
-        return parser.getParsed();
+    public Writer newDebugWriter(Converter c) {
+        return new DebugJsonWriter(c);
     }
 }

Propchange: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultYamlParser.java (from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultParser.java)
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultYamlParser.java?p2=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultYamlParser.java&p1=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultParser.java&r1=1806124&r2=1806157&rev=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultParser.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultYamlParser.java Fri Aug 25 11:22:37 2017
@@ -23,7 +23,7 @@ import java.util.Map;
 import org.osgi.service.serializer.Parser;
 import org.yaml.snakeyaml.Yaml;
 
-public class DefaultParser implements Parser {
+public class DefaultYamlParser implements Parser {
 
     @Override
     public Map<String, Object> parse(InputStream in)

Copied: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultYamlWriter.java (from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java)
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultYamlWriter.java?p2=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultYamlWriter.java&p1=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java&r1=1806124&r2=1806157&rev=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultYamlWriter.java Fri Aug 25 11:22:37 2017
@@ -16,66 +16,28 @@
  */
 package org.apache.felix.serializer.impl.yaml;
 
-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;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
+import java.util.Map.Entry;
 
-import org.apache.felix.serializer.impl.AbstractSpecifying;
-import org.osgi.service.serializer.Serializing;
-import org.osgi.util.converter.ConversionException;
+import org.osgi.service.serializer.Writer;
 import org.osgi.util.converter.Converter;
 
-public class YamlSerializingImpl extends AbstractSpecifying<Serializing> implements Serializing {
-    private volatile Converter converter;
-    private final Map<String, Object> configuration;
-    private final Object object;
+public class DefaultYamlWriter implements Writer {
+
+    private final Converter converter;
     private final int indentation = 2;
 
-    public YamlSerializingImpl(Converter c, Map<String, Object> cfg, Object obj) {
+    public DefaultYamlWriter(Converter c) {
         converter = c;
-        configuration = cfg;
-        object = obj;
-    }
-
-    @Override
-    public Appendable to(Appendable out) {
-        try {
-            out.append(encode(object));
-            return out;
-        } catch (IOException e) {
-            throw new ConversionException("Problem converting to YAML", e);
-        }
-    }
-
-
-   @Override
-    public void to(OutputStream os) throws IOException {
-       to(os, StandardCharsets.UTF_8);
-    }
-
-    @Override
-    public void to(OutputStream os, Charset charset) {
-        try {
-            os.write(encode(object).getBytes(charset));
-        } catch (IOException e) {
-            throw new ConversionException("Problem converting to YAML", e);
-        }
     }
 
     @Override
-    public String toString() {
-        return encode(object);
-    }
-
-    private String encode(Object obj) {
+    public String write(Object obj) {
         return encode(obj, 0).trim();
     }
 
@@ -141,20 +103,4 @@ public class YamlSerializingImpl extends
             sb.append(' ');
         return sb.toString();
     }
-
-    @Override
-    public Serializing pretty() {
-        return this;
-    }
-
-    @Override
-    public Serializing ignoreNull() {
-        return this;
-    }
-
-    @Override
-    public Serializing with(Converter c) {
-        converter = c;
-        return this;
-    }
 }

Modified: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlDeserializingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlDeserializingImpl.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlDeserializingImpl.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlDeserializingImpl.java Fri Aug 25 11:22:37 2017
@@ -77,13 +77,13 @@ public class YamlDeserializingImpl<T> im
     }
 
     @Override
-    public Deserializing<T> with(Converter c) {
+    public Deserializing<T> convertWith(Converter c) {
         converter = c;
         return this;
     }
 
     @Override
-    public Deserializing<T> with(Parser p) {
+    public Deserializing<T> parseWith(Parser p) {
         parser = p;
         return this;
     }

Modified: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializerImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializerImpl.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializerImpl.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializerImpl.java Fri Aug 25 11:22:37 2017
@@ -17,21 +17,20 @@
 package org.apache.felix.serializer.impl.yaml;
 
 import java.lang.reflect.Type;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.osgi.service.serializer.Deserializing;
 import org.osgi.service.serializer.Parser;
 import org.osgi.service.serializer.Serializer;
 import org.osgi.service.serializer.Serializing;
+import org.osgi.service.serializer.Writer;
 import org.osgi.util.converter.Converter;
 import org.osgi.util.converter.Converters;
 import org.osgi.util.converter.TypeReference;
 
 public class YamlSerializerImpl implements Serializer {
-    private final Map<String, Object> configuration = new ConcurrentHashMap<>();
     private final Converter converter = Converters.standardConverter();
-    private final Parser parser = new DefaultParser();
+    private final Parser parser = new DefaultYamlParser();
+    private final Writer writer = new DefaultYamlWriter(converter);
 
     @Override
     public <T> Deserializing<T> deserialize(Class<T> cls) {
@@ -50,6 +49,6 @@ public class YamlSerializerImpl implemen
 
     @Override
     public Serializing serialize(Object obj) {
-        return new YamlSerializingImpl(converter, configuration, obj);
+        return new YamlSerializingImpl(converter, writer, obj);
     }
 }

Modified: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlSerializingImpl.java Fri Aug 25 11:22:37 2017
@@ -18,37 +18,31 @@ package org.apache.felix.serializer.impl
 
 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;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
 
 import org.apache.felix.serializer.impl.AbstractSpecifying;
 import org.osgi.service.serializer.Serializing;
+import org.osgi.service.serializer.Writer;
 import org.osgi.util.converter.ConversionException;
 import org.osgi.util.converter.Converter;
 
 public class YamlSerializingImpl extends AbstractSpecifying<Serializing> implements Serializing {
     private volatile Converter converter;
-    private final Map<String, Object> configuration;
+    private volatile boolean useCustomWriter;
+    private volatile Writer writer;
     private final Object object;
-    private final int indentation = 2;
 
-    public YamlSerializingImpl(Converter c, Map<String, Object> cfg, Object obj) {
+    public YamlSerializingImpl(Converter c, Writer w, Object obj) {
         converter = c;
-        configuration = cfg;
+        writer = w;
         object = obj;
     }
 
     @Override
     public Appendable to(Appendable out) {
         try {
-            out.append(encode(object));
+            out.append(writer.write(object));
             return out;
         } catch (IOException e) {
             throw new ConversionException("Problem converting to YAML", e);
@@ -64,7 +58,7 @@ public class YamlSerializingImpl extends
     @Override
     public void to(OutputStream os, Charset charset) {
         try {
-            os.write(encode(object).getBytes(charset));
+            os.write(writer.write(object).getBytes(charset));
         } catch (IOException e) {
             throw new ConversionException("Problem converting to YAML", e);
         }
@@ -72,89 +66,21 @@ public class YamlSerializingImpl extends
 
     @Override
     public String toString() {
-        return encode(object);
-    }
-
-    private String encode(Object obj) {
-        return encode(obj, 0).trim();
-    }
-
-    @SuppressWarnings("rawtypes")
-    private String encode(Object obj, int level) {
-        if (obj == null)
-            return "";
-
-        if (obj instanceof Map) {
-            return encodeMap((Map) obj, level);
-        } else if (obj instanceof Collection) {
-            return encodeCollection((Collection) obj, level);
-        } else if (obj.getClass().isArray()) {
-            return encodeCollection(asCollection(obj), level);
-        } else if (obj instanceof Number)  {
-            return obj.toString();
-        } else if (obj instanceof Boolean) {
-            return obj.toString();
-        }
-
-        return "'" + converter.convert(obj).to(String.class) + "'";
-    }
-
-    private Collection<?> asCollection(Object arr) {
-        // Arrays.asList() doesn't work for primitive arrays
-        int len = Array.getLength(arr);
-        List<Object> l = new ArrayList<>(len);
-        for (int i=0; i<len; i++) {
-            l.add(Array.get(arr, i));
-        }
-        return l;
-    }
-
-    private String encodeCollection(Collection<?> collection, int level) {
-        StringBuilder sb = new StringBuilder();
-        for (Object o : collection) {
-            sb.append("\n");
-            sb.append(getIdentPrefix(level));
-            sb.append("- ");
-            sb.append(encode(o, level + 1));
-        }
-        return sb.toString();
-    }
-
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    private String encodeMap(Map m, int level) {
-        StringBuilder sb = new StringBuilder();
-        for (Entry entry : (Set<Entry>) m.entrySet()) {
-            sb.append("\n");
-            sb.append(getIdentPrefix(level));
-            sb.append(entry.getKey().toString());
-            sb.append(": ");
-            sb.append(encode(entry.getValue(), level + 1));
-        }
-
-        return sb.toString();
-    }
-
-    private String getIdentPrefix(int level) {
-        int numSpaces = indentation * level;
-        StringBuilder sb = new StringBuilder(numSpaces);
-        for (int i=0; i < numSpaces; i++)
-            sb.append(' ');
-        return sb.toString();
+        return writer.write(object);
     }
 
     @Override
-    public Serializing pretty() {
-        return this;
-    }
-
-    @Override
-    public Serializing ignoreNull() {
+    public Serializing convertWith(Converter c) {
+        converter = c;
+        if (!useCustomWriter)
+            writer = new DefaultYamlWriter(converter);
         return this;
     }
 
     @Override
-    public Serializing with(Converter c) {
-        converter = c;
+    public Serializing writeWith(Writer w) {
+        writer = w;
+        useCustomWriter = true;
         return this;
     }
 }

Copied: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java (from r1806124, felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultParser.java)
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java?p2=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java&p1=felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultParser.java&r1=1806124&r2=1806157&rev=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/DefaultParser.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java Fri Aug 25 11:22:37 2017
@@ -16,35 +16,19 @@
  */
 package org.apache.felix.serializer.impl.yaml;
 
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
+import org.osgi.service.serializer.Writer;
+import org.osgi.service.serializer.WriterFactory;
+import org.osgi.util.converter.Converter;
 
-import org.osgi.service.serializer.Parser;
-import org.yaml.snakeyaml.Yaml;
-
-public class DefaultParser implements Parser {
+public class YamlWriterFactory implements WriterFactory {
 
     @Override
-    public Map<String, Object> parse(InputStream in)
-    {
-        Yaml yaml = new Yaml();
-        return toMap(yaml.load(in));
+    public Writer newDefaultWriter(Converter c) {
+        return new DefaultYamlWriter(c);
     }
 
     @Override
-    public Map<String, Object> parse(CharSequence in) {
-        Yaml yaml = new Yaml();
-        return toMap(yaml.load(in.toString()));
-    }
-
-    @SuppressWarnings( { "unchecked", "rawtypes" } )
-    private Map<String, Object> toMap(Object obj) {
-        if (obj instanceof Map)
-            return (Map)obj;
-
-        Map<String, Object> map = new HashMap<>();
-        map.put("parsed", obj);
-        return map;
+    public Writer newDebugWriter(Converter c) {
+        return new DefaultYamlWriter(c);
     }
 }

Propchange: felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Deserializing.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Deserializing.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Deserializing.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Deserializing.java Fri Aug 25 11:22:37 2017
@@ -71,14 +71,14 @@ public interface Deserializing<T> {
 	 * @param converter The converter to use.
 	 * @return This Deserializing object to allow further invocations on it.
 	 */
-	Deserializing<T> with(Converter converter);
+	Deserializing<T> convertWith(Converter converter);
 
     /**
      * Specify the parser to be used, if an alternative to the default internal
      * parser is required.
      * 
      * @param parser the parser to use.
-     * @return This Serializing object to allow further invocations on it.
+     * @return This Deserializing object to allow further invocations on it.
      */
-	Deserializing<T> with(Parser parser);
+	Deserializing<T> parseWith(Parser parser);
 }

Modified: felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Serializer.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Serializer.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Serializer.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Serializer.java Fri Aug 25 11:22:37 2017
@@ -69,4 +69,16 @@ public interface Serializer {
 	 *         operation.
 	 */
 	Serializing serialize(Object obj);
+
+    /**
+     * A convenience means of obtaining a JsonSerializer without having to
+     * configure service settings.
+     */
+    static interface JsonSerializer extends Serializer {}
+
+    /**
+     * A convenience means of obtaining a YamlWriterFactory without having to
+     * configure service settings.
+     */
+    static interface YamlSerializer extends Serializer {}
 }

Modified: felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Serializing.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Serializing.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Serializing.java (original)
+++ felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Serializing.java Fri Aug 25 11:22:37 2017
@@ -32,24 +32,6 @@ import org.osgi.util.converter.Specifyin
 @ProviderType
 public interface Serializing extends Specifying<Serializing> {
 	/**
-	 * Specify that keys with a {@code null} value must not appear in the
-	 * result. If not specified {@code null} values will be included in the
-	 * result.
-	 *
-	 * @return This Serializing object to allow further invocations on it.
-	 */
-	Serializing ignoreNull();
-
-	/**
-	 * Specify that the encoded output should be formatted to look 'pretty',
-	 * which may make it easier for humans to read. If not specified, the
-	 * encoded output should be formatted to be compact, so save space.
-	 *
-	 * @return This Serializing object to allow further invocations on it.
-	 */
-	Serializing pretty();
-
-	/**
 	 * Use an output stream as the target of the encoding operation. UTF-8 will
 	 * be used if applicable, the character set may not apply to binary
 	 * encodings.
@@ -93,5 +75,15 @@ public interface Serializing extends Spe
 	 * @param converter The converter to use.
 	 * @return This Serializing object to allow further invocations on it.
 	 */
-	Serializing with(Converter converter);
+	Serializing convertWith(Converter converter);
+
+    /**
+     * Specify the writer to be used, if an alternative to the default internal
+     * writer is required. A selection of Writers are available via the WriterFactory,
+     * or a completely different Writer can be provided directly.
+     * 
+     * @param parser the writer to use.
+     * @return This Serializing object to allow further invocations on it.
+     */
+    Serializing writeWith(Writer writer);
 }

Added: felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Writer.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Writer.java?rev=1806157&view=auto
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Writer.java (added)
+++ felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Writer.java Fri Aug 25 11:22:37 2017
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.osgi.service.serializer;
+
+/**
+ * Common interface for a writer, which can be provided by the client.
+ */
+public interface Writer {
+    String write(Object obj);
+}

Propchange: felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/Writer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/WriterFactory.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/WriterFactory.java?rev=1806157&view=auto
==============================================================================
--- felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/WriterFactory.java (added)
+++ felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/WriterFactory.java Fri Aug 25 11:22:37 2017
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) OSGi Alliance (2017). 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.osgi.service.serializer;
+
+import org.osgi.annotation.versioning.ProviderType;
+import org.osgi.util.converter.Converter;
+
+/**
+ * A factory to create a writer with the desired behaviour.
+ *
+ * @author $Id:$
+ */
+@ProviderType
+public interface WriterFactory {
+
+    /**
+     * A default Writer, but which will use a custom Converter.
+     *  
+     * @param c the custom Converter that will be used by the Writer
+     * @return a default Writer, but one which will use a custom Converter
+     */
+    Writer newDefaultWriter(Converter c);
+
+    /**
+     * A writer that is useful for debugging. This write outputs "pretty"
+     * format.
+     *
+     * @param c the custom Converter that will be used by the Writer
+     * @return A new writer useful for debugging
+     */
+    Writer newDebugWriter(Converter c);
+
+    /**
+     * A convenience means of obtaining a JsonWriterFactory without having to
+     * configure service settings.
+     */
+    static interface JsonWriterFactory extends WriterFactory {}
+
+    /**
+     * A convenience means of obtaining a YamlWriterFactory without having to
+     * configure service settings.
+     */
+    static interface YamlWriterFactory extends WriterFactory {}
+}

Propchange: felix/trunk/converter/serializer/src/main/java/org/osgi/service/serializer/WriterFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonBackingObjectSerializationTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonBackingObjectSerializationTest.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonBackingObjectSerializationTest.java (original)
+++ felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonBackingObjectSerializationTest.java Fri Aug 25 11:22:37 2017
@@ -17,10 +17,14 @@
 package org.apache.felix.serializer.impl.json;
 
 import java.lang.reflect.Type;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.junit.Test;
 import org.osgi.dto.DTO;
+import org.osgi.util.converter.Converter;
 import org.osgi.util.converter.ConverterFunction;
 import org.osgi.util.converter.Converters;
 import org.osgi.util.converter.TargetRule;
@@ -38,62 +42,55 @@ public class JsonBackingObjectSerializat
                 .sourceAsDTO()
                 .to(Map.class);
 
-        final String expected = 
-                "{\"a\":\"A\","
-                        + "\"o\":{\"a\":\"AA\",\"b\":\"BB\"},"
-                        + "\"b\":\"B\"}";
-
-        final String actual = new JsonSerializerImpl().serialize(m).toString();
+        final String actual = new JsonSerializerImpl()
+                .serialize(m)
+                .writeWith(new JsonWriterFactory().newDebugWriter(Converters.standardConverter()))
+                .toString();
 
-        // TODO: Cannot predict order of elements for equals comparison//
-//        assertEquals(expected, actual);
+        assertEquals(EXPECTED, actual);
     }
 
     @Test
     public void testComplexMapSerializationWithoutUsingPreConversion() {
-        final String expected = 
-                "{\"a\":\"A\","
-                + "\"o\":{\"a\":\"AA\",\"b\":\"BB\"},"
-                + "\"b\":\"B\"}";
-
+        final JsonWriterFactory factory = new JsonWriterFactory();
         final String actual = new JsonSerializerImpl()
-                .serialize(MyDTOishObject.factory( "A", "B" ))
-                .sourceAsDTO()
+                .serialize(MyDTOishObject.factory("A", "B"))
+                .writeWith(factory.newDebugWriter(Converters.standardConverter()))
                 .toString();
 
-        // TODO: Cannot predict order of elements for equals comparison//
-//        assertEquals(expected, actual);
+        assertEquals(EXPECTED, actual);
     }
 
     @Test
     public void testComplexMapSerializationUsingRule() {
-        final String expected = 
-                "{\"o\":{\"a\":\"AA\",\"b\":\"BB\"},"
-                        + "\"a\":\"A\","
-                        + "\"b\":\"B\"}";
-
+        final Converter converter = Converters.newConverterBuilder().rule(new MapTargetRule()).build();
+        final JsonWriterFactory factory = new JsonWriterFactory();
         final String actual = new JsonSerializerImpl()
-                .serialize(MyDTOishObject.factory( "A", "B" ))
-                .with(Converters.newConverterBuilder().rule(new MapTargetRule()).build())
+                .serialize(MyDTOishObject.factory("A", "B"))
+                .convertWith(converter)
+                .writeWith(factory.newDebugWriter(converter))
                 .toString();
 
-        // Cannot get result to behave predictably... Order is random.
-//        assertEquals(expected.length(), actual.length());
+        assertEquals(EXPECTED, actual);
     }
 
     public static class MyDTOishObject extends DTO {
         public String a;
         public String b;
         public OtherObject o;
+        public List<String> l1;
+        public List<OtherObject> l2;
 
         public MyDTOishObject( String a, String b ) {
             this.a = a;
             this.b = b;
-            o = OtherObject.factory( a + a, b + b );
+            o = OtherObject.factory(a + a, b + b);
+            l1 = Stream.of("one", "two", "three", "four").collect(Collectors.toList());
+            l2 = Stream.of(OtherObject.factory(a, b), OtherObject.factory(a + a, b + b)).collect(Collectors.toList());
         }
 
         public static MyDTOishObject factory( String a, String b ) {
-            return new MyDTOishObject( a, b );
+            return new MyDTOishObject(a, b);
         }
     }
 
@@ -101,13 +98,13 @@ public class JsonBackingObjectSerializat
         public String a;
         public String b;
 
-        public OtherObject( String a, String b ) {
+        public OtherObject(String a, String b) {
             this.a = a;
             this.b = b;
         }
 
-        public static OtherObject factory( String a, String b ) {
-            return new OtherObject( a, b );
+        public static OtherObject factory(String a, String b) {
+            return new OtherObject(a, b);
         }
     }
 
@@ -135,4 +132,30 @@ public class JsonBackingObjectSerializat
                     .to(targetType);
         }
     }    
+
+    private static final String EXPECTED =
+            "{\n" +
+            "  \"a\":\"A\",\n" +
+            "  \"b\":\"B\",\n" +
+            "  \"l1\":[\n" +
+            "    \"one\",\n" +
+            "    \"two\",\n" +
+            "    \"three\",\n" +
+            "    \"four\"\n" +
+            "  ],\n" +
+            "  \"l2\":[\n" +
+            "    {\n" +
+            "      \"a\":\"A\",\n" +
+            "      \"b\":\"B\"\n" +
+            "    },\n" +
+            "    {\n" +
+            "      \"a\":\"AA\",\n" +
+            "      \"b\":\"BB\"\n" +
+            "    }\n" +
+            "  ],\n" +
+            "  \"o\":{\n" +
+            "    \"a\":\"AA\",\n" +
+            "    \"b\":\"BB\"\n" +
+            "  }\n" +
+            "}";
 }

Modified: felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonParserTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonParserTest.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonParserTest.java (original)
+++ felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonParserTest.java Fri Aug 25 11:22:37 2017
@@ -34,7 +34,7 @@ public class JsonParserTest {
 
     @Before
     public void setup() {
-        parser = new DefaultParser();        
+        parser = new DefaultJsonParser();        
     }
 
     @Test

Modified: felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonSerializerTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonSerializerTest.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonSerializerTest.java (original)
+++ felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonSerializerTest.java Fri Aug 25 11:22:37 2017
@@ -88,7 +88,7 @@ public class JsonSerializerTest {
                 rule(new TypeRule<String, Foo>(String.class, Foo.class, v -> Foo.fsFun(v))).build();
 
         JsonSerializerImpl jsonCodec = new JsonSerializerImpl();
-        String json = jsonCodec.serialize(m).with(ca).toString();
+        String json = jsonCodec.serialize(m).convertWith(ca).toString();
 
         JSONObject jo = new JSONObject(json);
         assertEquals(1, jo.length());
@@ -97,7 +97,7 @@ public class JsonSerializerTest {
 
         // And convert back
         Map<String,Map<String,Foo>> m2 = jsonCodec.deserialize(new TypeReference<Map<String,Map<String,Foo>>>(){}).
-                with(ca).from(json);
+                convertWith(ca).from(json);
         assertEquals(m, m2);
     }
 

Modified: felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/yaml/YamlSerializerTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/yaml/YamlSerializerTest.java?rev=1806157&r1=1806156&r2=1806157&view=diff
==============================================================================
--- felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/yaml/YamlSerializerTest.java (original)
+++ felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/yaml/YamlSerializerTest.java Fri Aug 25 11:22:37 2017
@@ -83,14 +83,14 @@ public class YamlSerializerTest {
                 rule(new TypeRule<String, Foo>(String.class, Foo.class, v -> Foo.fsFun(v))).build();
 
         YamlSerializerImpl yamlCodec = new YamlSerializerImpl();
-        String yaml = yamlCodec.serialize(m).with(ca).toString();
+        String yaml = yamlCodec.serialize(m).convertWith(ca).toString();
 
         assertEquals("submap: \n" +
                 "  f: '<fofofo>'", yaml);
 
         // And convert back
         Map<String,Map<String,Foo>> m2 = yamlCodec.deserialize(new TypeReference<Map<String,Map<String,Foo>>>(){}).
-                with(ca).from(yaml);
+                convertWith(ca).from(yaml);
         assertEquals(m, m2);
     }