Skip to content

Commit 2c1610e

Browse files
author
Mark
committed
added serializer support for enclosing types
1 parent ee60f2f commit 2c1610e

File tree

3 files changed

+44
-5
lines changed

3 files changed

+44
-5
lines changed

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
v4.1.6 (2017-01-18)
2+
---------------------------
3+
* added serializer support for enclosing types
4+
15
v4.1.5 (2017-01-12)
26
---------------------------
37
* fixed VPack String serialization (UTF-8 encoding)

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,20 @@ public <T> Builder registerSerializer(final Class<T> clazz, final VPackSerialize
175175
return this;
176176
}
177177

178+
/**
179+
* Register a special serializer for a member class which can only be identified by its enclosing class.
180+
*
181+
* @param clazz
182+
* type of the enclosing class
183+
* @param serializer
184+
* serializer to register
185+
* @return builder
186+
*/
187+
public <T> Builder registerEnclosingSerializer(final Class<T> clazz, final VPackSerializer<T> serializer) {
188+
vpackBuilder.registerEnclosingSerializer(clazz, serializer);
189+
return this;
190+
}
191+
178192
public <T> Builder registerDeserializer(final Class<T> clazz, final VPackDeserializer<T> deserializer) {
179193
vpackBuilder.registerDeserializer(clazz, deserializer);
180194
return this;
@@ -503,4 +517,5 @@ public LogLevelEntity getLogLevel() throws ArangoDBException {
503517
public LogLevelEntity setLogLevel(final LogLevelEntity entity) throws ArangoDBException {
504518
return executor.execute(setLogLevelRequest(entity), LogLevelEntity.class);
505519
}
520+
506521
}

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

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public class VPack {
6161
private static final String ATTR_VALUE = "value";
6262

6363
private final Map<Type, VPackSerializer<?>> serializers;
64+
private final Map<Type, VPackSerializer<?>> enclosingSerializers;
6465
private final Map<Type, VPackDeserializer<?>> deserializers;
6566
private final Map<String, Map<Type, VPackDeserializer<?>>> deserializersByName;
6667
private final Map<Type, VPackInstanceCreator<?>> instanceCreators;
@@ -74,6 +75,7 @@ public class VPack {
7475

7576
public static class Builder {
7677
private final Map<Type, VPackSerializer<?>> serializers;
78+
private final Map<Type, VPackSerializer<?>> enclosingSerializers;
7779
private final Map<Type, VPackDeserializer<?>> deserializers;
7880
private final Map<String, Map<Type, VPackDeserializer<?>>> deserializersByName;
7981
private final Map<Type, VPackInstanceCreator<?>> instanceCreators;
@@ -86,6 +88,7 @@ public static class Builder {
8688
public Builder() {
8789
super();
8890
serializers = new HashMap<Type, VPackSerializer<?>>();
91+
enclosingSerializers = new HashMap<Type, VPackSerializer<?>>();
8992
deserializers = new HashMap<Type, VPackDeserializer<?>>();
9093
deserializersByName = new HashMap<String, Map<Type, VPackDeserializer<?>>>();
9194
instanceCreators = new HashMap<Type, VPackInstanceCreator<?>>();
@@ -171,6 +174,11 @@ public <T> VPack.Builder registerSerializer(final Type type, final VPackSerializ
171174
return this;
172175
}
173176

177+
public <T> VPack.Builder registerEnclosingSerializer(final Type type, final VPackSerializer<T> serializer) {
178+
enclosingSerializers.put(type, serializer);
179+
return this;
180+
}
181+
174182
public <T> VPack.Builder registerDeserializer(final Type type, final VPackDeserializer<T> deserializer) {
175183
deserializers.put(type, deserializer);
176184
return this;
@@ -229,20 +237,23 @@ public <A extends Annotation> VPack.Builder annotationFieldNaming(
229237
}
230238

231239
public VPack build() {
232-
return new VPack(serializers, deserializers, instanceCreators, builderOptions, serializeNullValues,
233-
fieldNamingStrategy, deserializersByName, annotationFieldFilter, annotationFieldNaming);
240+
return new VPack(serializers, enclosingSerializers, deserializers, instanceCreators, builderOptions,
241+
serializeNullValues, fieldNamingStrategy, deserializersByName, annotationFieldFilter,
242+
annotationFieldNaming);
234243
}
235244

236245
}
237246

238-
private VPack(final Map<Type, VPackSerializer<?>> serializers, final Map<Type, VPackDeserializer<?>> deserializers,
247+
private VPack(final Map<Type, VPackSerializer<?>> serializers,
248+
final Map<Type, VPackSerializer<?>> enclosingSerializers, final Map<Type, VPackDeserializer<?>> deserializers,
239249
final Map<Type, VPackInstanceCreator<?>> instanceCreators, final BuilderOptions builderOptions,
240250
final boolean serializeNullValues, final VPackFieldNamingStrategy fieldNamingStrategy,
241251
final Map<String, Map<Type, VPackDeserializer<?>>> deserializersByName,
242252
final Map<Class<? extends Annotation>, VPackAnnotationFieldFilter<? extends Annotation>> annotationFieldFilter,
243253
final Map<Class<? extends Annotation>, VPackAnnotationFieldNaming<? extends Annotation>> annotationFieldNaming) {
244254
super();
245255
this.serializers = serializers;
256+
this.enclosingSerializers = enclosingSerializers;
246257
this.deserializers = deserializers;
247258
this.instanceCreators = instanceCreators;
248259
this.builderOptions = builderOptions;
@@ -521,7 +532,7 @@ private void serializeObject(
521532
final Map<String, Object> additionalFields)
522533
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, VPackException {
523534

524-
final VPackSerializer<?> serializer = serializers.get(entity.getClass());
535+
final VPackSerializer<?> serializer = getSerializer(entity.getClass());
525536
if (serializer != null) {
526537
((VPackSerializer<Object>) serializer).serialize(builder, name, entity, serializationContext);
527538
} else {
@@ -583,7 +594,7 @@ private void addValue(
583594
builder.add(name, ValueType.NULL);
584595
}
585596
} else {
586-
final VPackSerializer<?> serializer = serializers.get(type);
597+
final VPackSerializer<?> serializer = getSerializer(type);
587598
if (serializer != null) {
588599
((VPackSerializer<Object>) serializer).serialize(builder, name, value, serializationContext);
589600
} else if (type instanceof ParameterizedType) {
@@ -691,4 +702,13 @@ private VPackKeyMapAdapter<Object> getKeyMapAdapter(final Type type) {
691702
return (VPackKeyMapAdapter<Object>) adapter;
692703
}
693704

705+
private VPackSerializer<?> getSerializer(final Type type) {
706+
VPackSerializer<?> serializer = serializers.get(type);
707+
if (serializer == null) {
708+
if (type instanceof Class && ((Class<?>) type).isMemberClass()) {
709+
serializer = enclosingSerializers.get(((Class<?>) type).getEnclosingClass());
710+
}
711+
}
712+
return serializer;
713+
}
694714
}

0 commit comments

Comments
 (0)