Skip to content

Commit 1a02e08

Browse files
author
Mark
committed
added VPackJsonSerializer for VPackParser
1 parent 03105bf commit 1a02e08

File tree

3 files changed

+59
-6
lines changed

3 files changed

+59
-6
lines changed

src/main/java/com/arangodb/ArangoDB.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,14 @@ public <T> Builder registerJsonSerializer(final Class<T> clazz, final VPackJsonS
200200
return this;
201201
}
202202

203+
public <T> Builder registerJsonSerializer(
204+
final String attribute,
205+
final Class<T> clazz,
206+
final VPackJsonSerializer<T> serializer) {
207+
vpackParser.registerSerializer(attribute, clazz, serializer);
208+
return this;
209+
}
210+
203211
public ArangoDB build() {
204212
return new ArangoDB(
205213
new CommunicationSync.Builder().host(host).port(port).timeout(timeout).user(user).password(password)

src/main/java/com/arangodb/velocypack/VPackParser.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@ public class VPackParser {
5454
private final Map<ValueType, VPackJsonDeserializer> deserializers;
5555
private final Map<String, Map<ValueType, VPackJsonDeserializer>> deserializersByName;
5656
private final Map<Class<?>, VPackJsonSerializer<?>> serializers;
57+
private final Map<String, Map<Class<?>, VPackJsonSerializer<?>>> serializersByName;
5758

5859
public VPackParser() {
5960
super();
6061
deserializers = new HashMap<ValueType, VPackJsonDeserializer>();
6162
deserializersByName = new HashMap<String, Map<ValueType, VPackJsonDeserializer>>();
6263
serializers = new HashMap<Class<?>, VPackJsonSerializer<?>>();
64+
serializersByName = new HashMap<String, Map<Class<?>, VPackJsonSerializer<?>>>();
6365
}
6466

6567
public String toJson(final VPackSlice vpack) throws VPackException {
@@ -102,11 +104,36 @@ private VPackJsonDeserializer getDeserializer(final String attribute, final Valu
102104
return deserializer;
103105
}
104106

105-
public VPackParser registerSerializer(final Class<?> type, final VPackJsonSerializer<?> serializer) {
107+
public <T> VPackParser registerSerializer(
108+
final String attribute,
109+
final Class<T> type,
110+
final VPackJsonSerializer<T> serializer) {
111+
Map<Class<?>, VPackJsonSerializer<?>> byName = serializersByName.get(attribute);
112+
if (byName == null) {
113+
byName = new HashMap<Class<?>, VPackJsonSerializer<?>>();
114+
serializersByName.put(attribute, byName);
115+
}
116+
byName.put(type, serializer);
117+
return this;
118+
}
119+
120+
public <T> VPackParser registerSerializer(final Class<T> type, final VPackJsonSerializer<T> serializer) {
106121
serializers.put(type, serializer);
107122
return this;
108123
}
109124

125+
private VPackJsonSerializer<?> getSerializer(final String attribute, final Class<?> type) {
126+
VPackJsonSerializer<?> serializer = null;
127+
final Map<Class<?>, VPackJsonSerializer<?>> byName = serializersByName.get(attribute);
128+
if (byName != null) {
129+
serializer = byName.get(type);
130+
}
131+
if (serializer == null) {
132+
serializer = serializers.get(type);
133+
}
134+
return serializer;
135+
}
136+
110137
private void parse(
111138
final VPackSlice parent,
112139
final String attribute,
@@ -187,7 +214,7 @@ public VPackSlice fromJson(final String json) throws VPackException {
187214
public VPackSlice fromJson(final String json, final boolean includeNullValues) throws VPackException {
188215
final VPackBuilder builder = new VPackBuilder();
189216
final JSONParser parser = new JSONParser();
190-
final ContentHandler contentHandler = new VPackContentHandler(builder, includeNullValues, serializers);
217+
final ContentHandler contentHandler = new VPackContentHandler(builder, includeNullValues, this);
191218
try {
192219
parser.parse(json, contentHandler);
193220
} catch (final ParseException e) {
@@ -201,14 +228,14 @@ private static class VPackContentHandler implements ContentHandler {
201228
private final VPackBuilder builder;
202229
private String attribute;
203230
private final boolean includeNullValues;
204-
private final Map<Class<?>, VPackJsonSerializer<?>> serializers;
231+
private final VPackParser parser;
205232

206233
public VPackContentHandler(final VPackBuilder builder, final boolean includeNullValues,
207-
final Map<Class<?>, VPackJsonSerializer<?>> serializers) {
234+
final VPackParser parser) {
208235
this.builder = builder;
209236
this.includeNullValues = includeNullValues;
237+
this.parser = parser;
210238
attribute = null;
211-
this.serializers = serializers;
212239
}
213240

214241
private void add(final ValueType value) throws ParseException {
@@ -315,7 +342,7 @@ public boolean primitive(final Object value) throws ParseException, IOException
315342
add(ValueType.NULL);
316343
}
317344
} else {
318-
final VPackJsonSerializer<?> serializer = serializers.get(value.getClass());
345+
final VPackJsonSerializer<?> serializer = parser.getSerializer(attribute, value.getClass());
319346
if (serializer != null) {
320347
try {
321348
((VPackJsonSerializer<Object>) serializer).serialize(builder, attribute, value);

src/test/java/com/arangodb/velocypack/VPackParserTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,24 @@ public void serialize(final VPackBuilder builder, final String attribute, final
461461
assertThat(vpack.get("a").getAsString(), is("a1"));
462462
}
463463

464+
@Test
465+
public void customSerializerByName() {
466+
final String json = "{\"a\":\"a\",\"b\":\"b\"}";
467+
final VPackSlice vpack = new VPackParser()
468+
.registerSerializer("a", String.class, new VPackJsonSerializer<String>() {
469+
@Override
470+
public void serialize(final VPackBuilder builder, final String attribute, final String value)
471+
throws VPackException {
472+
builder.add(attribute, value + "1");
473+
}
474+
}).fromJson(json);
475+
assertThat(vpack.isObject(), is(true));
476+
assertThat(vpack.get("a").isString(), is(true));
477+
assertThat(vpack.get("a").getAsString(), is("a1"));
478+
assertThat(vpack.get("b").isString(), is(true));
479+
assertThat(vpack.get("b").getAsString(), is("b"));
480+
}
481+
464482
@Test
465483
public void dateToJson() {
466484
final VPackSlice vpack = new VPackBuilder().add(new Date(1478766992059L)).slice();

0 commit comments

Comments
 (0)