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/09/05 05:24:52 UTC
svn commit: r1807313 - in /felix/trunk/converter/serializer/src:
main/java/org/apache/felix/serializer/
main/java/org/apache/felix/serializer/impl/json/
main/java/org/apache/felix/serializer/impl/yaml/
test/java/org/apache/felix/serializer/impl/json/
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" +