From 744a79429ee3b62069ce1f6e021e81772b87fb63 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Thu, 6 Aug 2020 18:02:04 +0300 Subject: [PATCH] #199 DefaultArangoConverter - handle nulls when writing Maps, Arrays and Collections --- .../core/convert/DefaultArangoConverter.java | 17 ++++-- .../core/mapping/GeneralMappingTest.java | 54 +++++++++++++++++++ 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/arangodb/springframework/core/convert/DefaultArangoConverter.java b/src/main/java/com/arangodb/springframework/core/convert/DefaultArangoConverter.java index db50b5326..0c83c5b4d 100644 --- a/src/main/java/com/arangodb/springframework/core/convert/DefaultArangoConverter.java +++ b/src/main/java/com/arangodb/springframework/core/convert/DefaultArangoConverter.java @@ -691,7 +691,10 @@ private void writeMap( final Object key = entry.getKey(); final Object value = entry.getValue(); - writeInternal(convertId(key), value, sink, getNonNullMapValueType(definedType)); + String convertedKey = convertId(key); + if (value != null) { + writeInternal(convertedKey, value, sink, getNonNullMapValueType(definedType)); + } } sink.close(); @@ -706,7 +709,11 @@ private void writeCollection( sink.add(attribute, ValueType.ARRAY); for (final Object entry : asCollection(source)) { - writeInternal(null, entry, sink, getNonNullComponentType(definedType)); + if (entry == null) { + writeSimple(null, null, sink); + } else { + writeInternal(null, entry, sink, getNonNullComponentType(definedType)); + } } sink.close(); @@ -726,7 +733,11 @@ private void writeArray( sink.add(attribute, ValueType.ARRAY); for (int i = 0; i < Array.getLength(source); ++i) { final Object element = Array.get(source, i); - writeInternal(null, element, sink, getNonNullComponentType(definedType)); + if (element == null) { + writeSimple(null, null, sink); + } else { + writeInternal(null, element, sink, getNonNullComponentType(definedType)); + } } sink.close(); } diff --git a/src/test/java/com/arangodb/springframework/core/mapping/GeneralMappingTest.java b/src/test/java/com/arangodb/springframework/core/mapping/GeneralMappingTest.java index 0db7977ed..259fb81f0 100644 --- a/src/test/java/com/arangodb/springframework/core/mapping/GeneralMappingTest.java +++ b/src/test/java/com/arangodb/springframework/core/mapping/GeneralMappingTest.java @@ -49,6 +49,7 @@ import java.util.*; import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; /** @@ -589,4 +590,57 @@ public void readMapInMap() { assertThat(find.isPresent(), is(true)); assertThat(find.get().value, is(map)); } + + @Test + public void readMapInMapWithNull() { + final MapInMapTestEntity entity = new MapInMapTestEntity(); + final Map map = new HashMap<>(); + Map nested = new HashMap<>(); + nested.put("key1", "test"); + nested.put("key2", null); + map.put("nested", nested); + entity.value = map; + template.insert(entity); + final Optional find = template.find(entity.id, MapInMapTestEntity.class); + assertThat(find.isPresent(), is(true)); + Map nestedResult = (Map) find.get().value.get("nested"); + assertThat(nestedResult.size(), is(1)); + assertThat(nestedResult.get("key1"), is("test")); + } + + @Test + public void readMapInMapWithArray() { + final MapInMapTestEntity entity = new MapInMapTestEntity(); + final Map map = new HashMap<>(); + Map nested = new HashMap<>(); + String[] nestedArray = {"test", null}; + nested.put("key1", nestedArray); + map.put("nested", nested); + entity.value = map; + template.insert(entity); + final Optional find = template.find(entity.id, MapInMapTestEntity.class); + assertThat(find.isPresent(), is(true)); + Map nestedResult = (Map) find.get().value.get("nested"); + assertThat(nestedResult.size(), is(1)); + assertThat(((List) nestedResult.get("key1")).size(), is(2)); + assertEquals(Arrays.asList(nestedArray), nestedResult.get("key1")); + } + + @Test + public void readMapInMapWithCollection() { + final MapInMapTestEntity entity = new MapInMapTestEntity(); + final Map map = new HashMap<>(); + Map nested = new HashMap<>(); + Collection nestedCollection = Arrays.asList("test", null); + nested.put("key1", nestedCollection); + map.put("nested", nested); + entity.value = map; + template.insert(entity); + final Optional find = template.find(entity.id, MapInMapTestEntity.class); + assertThat(find.isPresent(), is(true)); + Map nestedResult = (Map) find.get().value.get("nested"); + assertThat(nestedResult.size(), is(1)); + assertThat(((List) nestedResult.get("key1")).size(), is(2)); + assertEquals(nestedCollection, nestedResult.get("key1")); + } }