Skip to content

Commit 03105bf

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

File tree

5 files changed

+85
-10
lines changed

5 files changed

+85
-10
lines changed

ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ v4.1.2 (2016-11-xx)
33
* fixed GraphEntity for ArangoDatabase.getGraphs() (field name is null)
44
* added VelocyPack UTC_DATE parsing to Json String (ISO 8601)
55
* added configuration methods for VPackParser in ArangoDB.Builder
6+
* added VPackJsonSerializer for VPackParser
67

78
v4.1.1 (2016-11-09)
89
---------------------------

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.arangodb.velocypack.VPackDeserializer;
5050
import com.arangodb.velocypack.VPackInstanceCreator;
5151
import com.arangodb.velocypack.VPackJsonDeserializer;
52+
import com.arangodb.velocypack.VPackJsonSerializer;
5253
import com.arangodb.velocypack.VPackParser;
5354
import com.arangodb.velocypack.VPackSerializer;
5455
import com.arangodb.velocypack.ValueType;
@@ -194,6 +195,11 @@ public Builder registerJsonDeserializer(
194195
return this;
195196
}
196197

198+
public <T> Builder registerJsonSerializer(final Class<T> clazz, final VPackJsonSerializer<T> serializer) {
199+
vpackParser.registerSerializer(clazz, serializer);
200+
return this;
201+
}
202+
197203
public ArangoDB build() {
198204
return new ArangoDB(
199205
new CommunicationSync.Builder().host(host).port(port).timeout(timeout).user(user).password(password)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* DISCLAIMER
3+
*
4+
* Copyright 2016 ArangoDB GmbH, Cologne, Germany
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*
18+
* Copyright holder is ArangoDB GmbH, Cologne, Germany
19+
*/
20+
21+
package com.arangodb.velocypack;
22+
23+
import com.arangodb.velocypack.exception.VPackException;
24+
25+
/**
26+
* @author Mark - mark at arangodb.com
27+
*
28+
*/
29+
public interface VPackJsonSerializer<T> {
30+
31+
void serialize(VPackBuilder builder, String attribute, T value) throws VPackException;
32+
33+
}

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

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,13 @@ public class VPackParser {
5353
private static final String NON_REPRESENTABLE_TYPE = "(non-representable type)";
5454
private final Map<ValueType, VPackJsonDeserializer> deserializers;
5555
private final Map<String, Map<ValueType, VPackJsonDeserializer>> deserializersByName;
56+
private final Map<Class<?>, VPackJsonSerializer<?>> serializers;
5657

5758
public VPackParser() {
5859
super();
5960
deserializers = new HashMap<ValueType, VPackJsonDeserializer>();
6061
deserializersByName = new HashMap<String, Map<ValueType, VPackJsonDeserializer>>();
62+
serializers = new HashMap<Class<?>, VPackJsonSerializer<?>>();
6163
}
6264

6365
public String toJson(final VPackSlice vpack) throws VPackException {
@@ -100,6 +102,11 @@ private VPackJsonDeserializer getDeserializer(final String attribute, final Valu
100102
return deserializer;
101103
}
102104

105+
public VPackParser registerSerializer(final Class<?> type, final VPackJsonSerializer<?> serializer) {
106+
serializers.put(type, serializer);
107+
return this;
108+
}
109+
103110
private void parse(
104111
final VPackSlice parent,
105112
final String attribute,
@@ -180,7 +187,7 @@ public VPackSlice fromJson(final String json) throws VPackException {
180187
public VPackSlice fromJson(final String json, final boolean includeNullValues) throws VPackException {
181188
final VPackBuilder builder = new VPackBuilder();
182189
final JSONParser parser = new JSONParser();
183-
final ContentHandler contentHandler = new VPackContentHandler(builder, includeNullValues);
190+
final ContentHandler contentHandler = new VPackContentHandler(builder, includeNullValues, serializers);
184191
try {
185192
parser.parse(json, contentHandler);
186193
} catch (final ParseException e) {
@@ -194,11 +201,14 @@ private static class VPackContentHandler implements ContentHandler {
194201
private final VPackBuilder builder;
195202
private String attribute;
196203
private final boolean includeNullValues;
204+
private final Map<Class<?>, VPackJsonSerializer<?>> serializers;
197205

198-
public VPackContentHandler(final VPackBuilder builder, final boolean includeNullValues) {
206+
public VPackContentHandler(final VPackBuilder builder, final boolean includeNullValues,
207+
final Map<Class<?>, VPackJsonSerializer<?>> serializers) {
199208
this.builder = builder;
200209
this.includeNullValues = includeNullValues;
201210
attribute = null;
211+
this.serializers = serializers;
202212
}
203213

204214
private void add(final ValueType value) throws ParseException {
@@ -297,20 +307,31 @@ public boolean endArray() throws ParseException, IOException {
297307
return true;
298308
}
299309

310+
@SuppressWarnings("unchecked")
300311
@Override
301312
public boolean primitive(final Object value) throws ParseException, IOException {
302313
if (value == null) {
303314
if (includeNullValues) {
304315
add(ValueType.NULL);
305316
}
306-
} else if (String.class.isAssignableFrom(value.getClass())) {
307-
add(String.class.cast(value));
308-
} else if (Boolean.class.isAssignableFrom(value.getClass())) {
309-
add(Boolean.class.cast(value));
310-
} else if (Double.class.isAssignableFrom(value.getClass())) {
311-
add(Double.class.cast(value));
312-
} else if (Number.class.isAssignableFrom(value.getClass())) {
313-
add(Long.class.cast(value));
317+
} else {
318+
final VPackJsonSerializer<?> serializer = serializers.get(value.getClass());
319+
if (serializer != null) {
320+
try {
321+
((VPackJsonSerializer<Object>) serializer).serialize(builder, attribute, value);
322+
attribute = null;
323+
} catch (final VPackBuilderException e) {
324+
throw new ParseException(ParseException.ERROR_UNEXPECTED_EXCEPTION);
325+
}
326+
} else if (String.class.isAssignableFrom(value.getClass())) {
327+
add(String.class.cast(value));
328+
} else if (Boolean.class.isAssignableFrom(value.getClass())) {
329+
add(Boolean.class.cast(value));
330+
} else if (Double.class.isAssignableFrom(value.getClass())) {
331+
add(Double.class.cast(value));
332+
} else if (Number.class.isAssignableFrom(value.getClass())) {
333+
add(Long.class.cast(value));
334+
}
314335
}
315336
return true;
316337
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,20 @@ public void deserialize(
447447
assertThat(json, is("{\"a\":\"a1\",\"b\":\"b\"}"));
448448
}
449449

450+
@Test
451+
public void customSerializer() throws VPackException {
452+
final VPackSlice vpack = new VPackParser().registerSerializer(String.class, new VPackJsonSerializer<String>() {
453+
@Override
454+
public void serialize(final VPackBuilder builder, final String attribute, final String value)
455+
throws VPackException {
456+
builder.add(attribute, value + "1");
457+
}
458+
}).fromJson("{\"a\":\"a\"}");
459+
assertThat(vpack.isObject(), is(true));
460+
assertThat(vpack.get("a").isString(), is(true));
461+
assertThat(vpack.get("a").getAsString(), is("a1"));
462+
}
463+
450464
@Test
451465
public void dateToJson() {
452466
final VPackSlice vpack = new VPackBuilder().add(new Date(1478766992059L)).slice();

0 commit comments

Comments
 (0)