Skip to content

Commit 924a480

Browse files
author
Mark
committed
fixed serialization of additionalFields
1 parent db00752 commit 924a480

File tree

2 files changed

+61
-29
lines changed

2 files changed

+61
-29
lines changed

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

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -561,14 +561,15 @@ private void serializeFields(
561561
final Map<String, FieldInfo> fields = cache.getFields(entity.getClass());
562562
for (final FieldInfo fieldInfo : fields.values()) {
563563
if (fieldInfo.isSerialize()) {
564-
serializeField(entity, builder, fieldInfo, additionalFields);
564+
serializeField(entity, builder, fieldInfo, new HashMap<String, Object>());
565565
}
566566
}
567567
for (final Entry<String, Object> entry : additionalFields.entrySet()) {
568568
final String key = entry.getKey();
569569
if (!fields.containsKey(key)) {
570570
final Object value = entry.getValue();
571-
addValue(key, value != null ? value.getClass() : null, value, builder, null, additionalFields);
571+
addValue(key, value != null ? value.getClass() : null, value, builder, null,
572+
new HashMap<String, Object>());
572573
}
573574
}
574575
}
@@ -607,56 +608,49 @@ private void addValue(
607608
final ParameterizedType pType = ParameterizedType.class.cast(type);
608609
final Type rawType = pType.getRawType();
609610
if (Iterable.class.isAssignableFrom((Class<?>) rawType)) {
610-
serializeIterable(name, value, builder, additionalFields);
611+
serializeIterable(name, value, builder);
611612
} else if (Map.class.isAssignableFrom((Class<?>) rawType)) {
612613
serializeMap(name, value, builder, pType.getActualTypeArguments()[0], additionalFields);
613614
} else {
614615
serializeObject(name, value, builder, additionalFields);
615616
}
616617
} else if (Iterable.class.isAssignableFrom((Class<?>) type)) {
617-
serializeIterable(name, value, builder, additionalFields);
618+
serializeIterable(name, value, builder);
618619
} else if (Map.class.isAssignableFrom((Class<?>) type)) {
619620
serializeMap(name, value, builder, String.class, additionalFields);
620621
} else if (((Class) type).isArray()) {
621-
serializeArray(name, value, builder, additionalFields);
622+
serializeArray(name, value, builder);
622623
} else if (((Class) type).isEnum()) {
623624
builder.add(name, Enum.class.cast(value).name());
624625
} else if (((Class) type) != value.getClass()) {
625-
addValue(name, value.getClass(), value, builder, fieldInfo, additionalFields);
626+
addValue(name, value.getClass(), value, builder, fieldInfo, new HashMap<String, Object>());
626627
} else {
627628
serializeObject(name, value, builder, additionalFields);
628629
}
629630
}
630631
}
631632

632-
private void serializeArray(
633-
final String name,
634-
final Object value,
635-
final VPackBuilder builder,
636-
final Map<String, Object> additionalFields)
633+
private void serializeArray(final String name, final Object value, final VPackBuilder builder)
637634
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, VPackException {
638635
builder.add(name, ValueType.ARRAY);
639636
for (int i = 0; i < Array.getLength(value); i++) {
640637
final Object element = Array.get(value, i);
641638
if (element != null) {
642-
addValue(null, element.getClass(), element, builder, null, additionalFields);
639+
addValue(null, element.getClass(), element, builder, null, new HashMap<String, Object>());
643640
} else {
644641
builder.add(ValueType.NULL);
645642
}
646643
}
647644
builder.close();
648645
}
649646

650-
private void serializeIterable(
651-
final String name,
652-
final Object value,
653-
final VPackBuilder builder,
654-
final Map<String, Object> additionalFields)
647+
private void serializeIterable(final String name, final Object value, final VPackBuilder builder)
655648
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, VPackException {
656649
builder.add(name, ValueType.ARRAY);
657650
for (final Iterator iterator = Iterable.class.cast(value).iterator(); iterator.hasNext();) {
658651
final Object element = iterator.next();
659-
addValue(null, element != null ? element.getClass() : null, element, builder, null, additionalFields);
652+
addValue(null, element != null ? element.getClass() : null, element, builder, null,
653+
new HashMap<String, Object>());
660654
}
661655
builder.close();
662656
}
@@ -678,18 +672,28 @@ private void serializeMap(
678672
final Object entryValue = entry.getValue();
679673
addValue(keyMapAdapter.serialize(entry.getKey()),
680674
entryValue != null ? entryValue.getClass() : Object.class, entry.getValue(), builder, null,
681-
additionalFields);
675+
new HashMap<String, Object>());
682676
}
677+
for (final Entry<String, Object> entry : additionalFields.entrySet()) {
678+
final String key = entry.getKey();
679+
if (!map.containsKey(key)) {
680+
final Object additionalValue = entry.getValue();
681+
addValue(key, additionalValue != null ? additionalValue.getClass() : null, additionalValue,
682+
builder, null, new HashMap<String, Object>());
683+
}
684+
}
685+
additionalFields.clear();
683686
builder.close();
684687
} else {
685688
builder.add(name, ValueType.ARRAY);
686689
final Set<Entry<?, ?>> entrySet = map.entrySet();
687690
for (final Entry<?, ?> entry : entrySet) {
688691
final String s = null;
689692
builder.add(s, ValueType.OBJECT);
690-
addValue(ATTR_KEY, entry.getKey().getClass(), entry.getKey(), builder, null, additionalFields);
693+
addValue(ATTR_KEY, entry.getKey().getClass(), entry.getKey(), builder, null,
694+
new HashMap<String, Object>());
691695
addValue(ATTR_VALUE, entry.getValue().getClass(), entry.getValue(), builder, null,
692-
additionalFields);
696+
new HashMap<String, Object>());
693697
builder.close();
694698
}
695699
builder.close();

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

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020

2121
package com.arangodb.velocypack;
2222

23-
import static org.hamcrest.Matchers.is;
2423
import static org.hamcrest.Matchers.contains;
24+
import static org.hamcrest.Matchers.is;
2525
import static org.hamcrest.Matchers.notNullValue;
2626
import static org.hamcrest.Matchers.nullValue;
2727
import static org.junit.Assert.assertThat;
@@ -54,6 +54,7 @@
5454

5555
import org.junit.Test;
5656

57+
import com.arangodb.util.MapBuilder;
5758
import com.arangodb.velocypack.annotations.Expose;
5859
import com.arangodb.velocypack.annotations.SerializedName;
5960
import com.arangodb.velocypack.exception.VPackException;
@@ -438,7 +439,6 @@ public void toShort() throws VPackException {
438439
assertThat(entity.s2, is(new Short((short) 3)));
439440
}
440441

441-
442442
protected static class TestEntityByte {
443443
private byte b1 = 1; // short integer path
444444
private Byte b2 = 100; // integer path
@@ -1037,6 +1037,7 @@ public void toArrayInArray() throws VPackException {
10371037
}
10381038
}
10391039

1040+
@SuppressWarnings("serial")
10401041
protected static class TestCollection extends LinkedList<String> {
10411042

10421043
}
@@ -1066,10 +1067,7 @@ public void fromCollectionExtendedWithNulls() throws Exception {
10661067
final TestEntityCollectionExtendedWithNulls entity = new TestEntityCollectionExtendedWithNulls();
10671068
entity.setA1(collection);
10681069

1069-
final VPackSlice vpack = new VPack.Builder()
1070-
.serializeNullValues(true)
1071-
.build()
1072-
.serialize(entity);
1070+
final VPackSlice vpack = new VPack.Builder().serializeNullValues(true).build().serialize(entity);
10731071
assertThat(vpack, is(notNullValue()));
10741072
assertThat(vpack.isObject(), is(true));
10751073
{
@@ -1104,8 +1102,8 @@ public void toCollectionExtendedWithNulls() throws Exception {
11041102
}
11051103

11061104
final VPackSlice vpack = builder.slice();
1107-
final TestEntityCollectionExtendedWithNulls entity = new VPack.Builder()
1108-
.build().deserialize(vpack, TestEntityCollectionExtendedWithNulls.class);
1105+
final TestEntityCollectionExtendedWithNulls entity = new VPack.Builder().build().deserialize(vpack,
1106+
TestEntityCollectionExtendedWithNulls.class);
11091107
assertThat(entity, is(notNullValue()));
11101108
assertThat(entity.getA1(), is(notNullValue()));
11111109
assertThat(entity.getA1().size(), is(3));
@@ -3314,6 +3312,36 @@ public void additionalFields() throws VPackException {
33143312
assertThat(a.getAsString(), is("test"));
33153313
}
33163314

3315+
@Test
3316+
public void additionalFieldsNestedPojo() {
3317+
final VPackSlice vpack = new VPack.Builder().build().serialize(new TestEntityObject(),
3318+
new MapBuilder().put("foo", "bar").get());
3319+
assertThat(vpack, is(notNullValue()));
3320+
assertThat(vpack.isObject(), is(true));
3321+
assertThat(vpack.size(), is(3));
3322+
assertThat(vpack.get("foo").isString(), is(true));
3323+
assertThat(vpack.get("foo").getAsString(), is("bar"));
3324+
3325+
assertThat(vpack.get("o1").isObject(), is(true));
3326+
assertThat(vpack.get("o1").get("foo").isNone(), is(true));
3327+
assertThat(vpack.get("o2").isObject(), is(true));
3328+
assertThat(vpack.get("o2").get("foo").isNone(), is(true));
3329+
}
3330+
3331+
@Test
3332+
public void additionalFieldsNestedMap() {
3333+
final VPackSlice vpack = new VPack.Builder().build().serialize(
3334+
new MapBuilder().put("n", new MapBuilder().get()).get(), new MapBuilder().put("foo", "bar").get());
3335+
assertThat(vpack, is(notNullValue()));
3336+
assertThat(vpack.isObject(), is(true));
3337+
assertThat(vpack.size(), is(2));
3338+
assertThat(vpack.get("foo").isString(), is(true));
3339+
assertThat(vpack.get("foo").getAsString(), is("bar"));
3340+
3341+
assertThat(vpack.get("n").isObject(), is(true));
3342+
assertThat(vpack.get("n").size(), is(0));
3343+
}
3344+
33173345
@Test
33183346
public void additionalDuplicatedFields() throws VPackException {
33193347
final TestEntityString entity = new TestEntityString();

0 commit comments

Comments
 (0)