Author: dleangen
Date: Tue Sep  5 05:24:51 2017
New Revision: 1807313

URL: http://svn.apache.org/viewvc?rev=1807313&view=rev
Log:
[Serializer] Added methods to Writer for ordering array values.

Modified:
    
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/WriterFactory.java
    
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DebugJsonWriter.java
    
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java
    
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java
    
felix/trunk/converter/serializer/src/test/java/org/apache/felix/serializer/impl/json/JsonBackingObjectSerializationTest.java

Modified: 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/WriterFactory.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/WriterFactory.java?rev=1807313&r1=1807312&r2=1807313&view=diff
==============================================================================
--- 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/WriterFactory.java
 (original)
+++ 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/WriterFactory.java
 Tue Sep  5 05:24:51 2017
@@ -15,6 +15,7 @@
  */
 package org.apache.felix.serializer;
 
+import java.util.Comparator;
 import java.util.List;
 
 import org.osgi.annotation.versioning.ProviderType;
@@ -52,14 +53,42 @@ public interface WriterFactory {
      * specified. This can be useful, for example, for debugging or when
      * the data otherwise needs to be human consumable.
      * 
-     * Note that only the target type is specified, so the rule will be 
visited 
-     * for every conversion to the target type.
+     * This rule only affects map-type objects located at the given path.
      *
      * @param path the path where the key is located in the object graph.
-     * @param func The desired key order.
+     * @param keyOrder A list with the desired key order.
      * @return This factory object to allow further invocations on it.
      */
-    WriterFactory orderBy(String path, List<String> keyOrder);
+    WriterFactory orderMap(String path, List<String> keyOrder);
+
+    /**
+     * Register an ordering rule for this writer.
+     * 
+     * An ordering rule causes the written json to be output in the order
+     * specified. This can be useful, for example, for debugging or when
+     * the data otherwise needs to be human consumable.
+     * 
+     * This rule only affects array-type objects located at the given path.
+     *
+     * @param path the path where the key is located in the object graph.
+     * @return This factory object to allow further invocations on it.
+     */
+    WriterFactory orderArray(String path);
+
+    /**
+     * Register an ordering rule for this writer.
+     * 
+     * An ordering rule causes the written json to be output in the order
+     * specified. This can be useful, for example, for debugging or when
+     * the data otherwise needs to be human consumable.
+     * 
+     * This rule only affects array-type objects located at the given path.
+     *
+     * @param path the path where the key is located in the object graph.
+     * @param comparator A comparator that will be used to sort the items in 
the array.
+     * @return This factory object to allow further invocations on it.
+     */
+    WriterFactory orderArray(String path, Comparator<?> comparator);
 
     /**
      * A convenience means of obtaining a JsonWriterFactory without having to

Modified: 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DebugJsonWriter.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DebugJsonWriter.java?rev=1807313&r1=1807312&r2=1807313&view=diff
==============================================================================
--- 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DebugJsonWriter.java
 (original)
+++ 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/DebugJsonWriter.java
 Tue Sep  5 05:24:51 2017
@@ -20,6 +20,7 @@ import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,13 +35,15 @@ import org.osgi.util.converter.Converter
 public class DebugJsonWriter implements Writer {
 
     private Converter converter;
-    private final Map<String, List<String>> orderingRules;
+    private final Map<String, List<String>> mapOrderingRules;
+    private final Map<String, Comparator<?>> arrayOrderingRules;
     private final boolean ignoreNull = false;
     private final int indentation = 2;
 
-    public DebugJsonWriter(Converter c, Map<String,List<String>> rules) {
+    public DebugJsonWriter(Converter c, Map<String,List<String>> mapRules, 
Map<String, Comparator<?>> arrayRules) {
         converter = c;
-        orderingRules = rules;
+        mapOrderingRules = mapRules;
+        arrayOrderingRules = arrayRules;
     }
 
     @Override
@@ -76,8 +79,8 @@ public class DebugJsonWriter implements
 
     @SuppressWarnings( { "unchecked", "rawtypes" } )
     private Map orderMap(Map unordered, String path) {
-        Map ordered = (orderingRules.containsKey(path)) ? new 
LinkedHashMap<>() : new TreeMap<>();
-        List<String> keys = (orderingRules.containsKey(path)) ? 
orderingRules.get(path) : new ArrayList<>(unordered.keySet());
+        Map ordered = (mapOrderingRules.containsKey(path)) ? new 
LinkedHashMap<>() : new TreeMap<>();
+        List<String> keys = (mapOrderingRules.containsKey(path)) ? 
mapOrderingRules.get(path) : new ArrayList<>(unordered.keySet());
         for (String key : keys) {
             String itemPath = (path.endsWith("/")) ? path + key : path + "/" + 
key;
             Object value = unordered.get(key);
@@ -104,7 +107,14 @@ public class DebugJsonWriter implements
                 ordered.add(obj);
         }
 
-        try{Collections.sort(ordered);}catch (Exception e){}
+        if (arrayOrderingRules.containsKey(path)) {
+            Comparator c = arrayOrderingRules.get(path);
+            if (c == null)
+                Collections.sort(ordered);
+            else
+                Collections.sort(ordered,c);
+        }
+
         return ordered;
     }
 
@@ -142,7 +152,6 @@ public class DebugJsonWriter implements
     @SuppressWarnings({ "rawtypes", "unchecked" })
     private String encodeMap(Map m, String path, int level) {
         level++;
-//        Map orderedMap = (orderingRules.isEmpty()) ? new TreeMap<>(m) : m;
         StringBuilder sb = new StringBuilder("{\n");
         for (Entry entry : (Set<Entry>) m.entrySet()) {
             if (entry.getKey() == null || entry.getValue() == null)

Modified: 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java?rev=1807313&r1=1807312&r2=1807313&view=diff
==============================================================================
--- 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java
 (original)
+++ 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/json/JsonWriterFactory.java
 Tue Sep  5 05:24:51 2017
@@ -16,6 +16,7 @@
  */
 package org.apache.felix.serializer.impl.json;
 
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -25,11 +26,24 @@ import org.apache.felix.serializer.Write
 import org.osgi.util.converter.Converter;
 
 public class JsonWriterFactory implements WriterFactory, 
WriterFactory.JsonWriterFactory {
-    private final Map<String, List<String>> orderingRules = new HashMap<>();
+    private final Map<String, List<String>> mapOrderingRules = new HashMap<>();
+    private final Map<String, Comparator<?>> arrayOrderingRules = new 
HashMap<>();
 
     @Override
-    public JsonWriterFactory orderBy(String path, List<String> keyOrder) {
-        orderingRules.put(path, keyOrder);
+    public JsonWriterFactory orderMap(String path, List<String> keyOrder) {
+        mapOrderingRules.put(path, keyOrder);
+        return this;
+    }
+
+    @Override
+    public WriterFactory orderArray(String path) {
+        arrayOrderingRules.put(path, null);
+        return this;
+    }
+
+    @Override
+    public WriterFactory orderArray(String path, Comparator<?> comparator) {
+        arrayOrderingRules.put(path, comparator);
         return this;
     }
 
@@ -40,6 +54,6 @@ public class JsonWriterFactory implement
 
     @Override
     public Writer newDebugWriter(Converter c) {
-        return new DebugJsonWriter(c, orderingRules);
+        return new DebugJsonWriter(c, mapOrderingRules, arrayOrderingRules);
     }
 }

Modified: 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java?rev=1807313&r1=1807312&r2=1807313&view=diff
==============================================================================
--- 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java
 (original)
+++ 
felix/trunk/converter/serializer/src/main/java/org/apache/felix/serializer/impl/yaml/YamlWriterFactory.java
 Tue Sep  5 05:24:51 2017
@@ -16,6 +16,7 @@
  */
 package org.apache.felix.serializer.impl.yaml;
 
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -28,11 +29,21 @@ public class YamlWriterFactory implement
     private final Map<String, List<String>> orderingRules = new HashMap<>();
 
     @Override
-    public YamlWriterFactory orderBy(String path, List<String> keyOrder) {
+    public YamlWriterFactory orderMap(String path, List<String> keyOrder) {
         orderingRules.put(path,keyOrder);
         return this;
     }
 
+    @Override
+    public WriterFactory orderArray(String path) {
+        return this;
+    }
+
+    @Override
+    public WriterFactory orderArray(String path, Comparator<?> comparator) {
+        return this;
+    }
+
     @Override
     public Writer newDefaultWriter(Converter c) {
         return new DefaultYamlWriter(c);

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=1807313&r1=1807312&r2=1807313&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
 Tue Sep  5 05:24:51 2017
@@ -77,12 +77,13 @@ public class JsonBackingObjectSerializat
 
     @Test
     public void testOrderedSerialization() {
-        final JsonWriterFactory factory = new JsonWriterFactory();
-        factory.orderBy("/", Arrays.asList("b", "a", "o", "l2", "l1"));
-        factory.orderBy("/l2", Arrays.asList("b", "a"));
         final String actual = new JsonSerializerImpl()
                 .serialize(MyDTOishObject.factory("A", "B"))
-                
.writeWith(factory.newDebugWriter(Converters.standardConverter()))
+                .writeWith(new JsonWriterFactory()
+                        .orderMap("/", Arrays.asList("b", "a", "o", "l2", 
"l1"))
+                        .orderMap("/l2", Arrays.asList("b", "a"))
+                        .orderArray("/l1")
+                        .newDebugWriter(Converters.standardConverter()))
                 .toString();
 
         assertEquals(ORDERED, actual);
@@ -152,10 +153,10 @@ public class JsonBackingObjectSerializat
             "  \"a\":\"A\",\n" +
             "  \"b\":\"B\",\n" +
             "  \"l1\":[\n" +
-            "    \"four\",\n" +
             "    \"one\",\n" +
+            "    \"two\",\n" +
             "    \"three\",\n" +
-            "    \"two\"\n" +
+            "    \"four\"\n" +
             "  ],\n" +
             "  \"l2\":[\n" +
             "    {\n" +


Reply via email to