Fix issue with null values nested in an entity list field being represented as a top-level entity NullField instead of a null value.
Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/595955df Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/595955df Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/595955df Branch: refs/heads/USERGRID-1047 Commit: 595955dff9ee4a706de9d97b86c5f0636fe24b43 Parents: 2e37c21 Author: Michael Russo <michaelaru...@gmail.com> Authored: Sat Jan 23 17:34:54 2016 -0800 Committer: Michael Russo <michaelaru...@gmail.com> Committed: Sat Jan 23 17:34:54 2016 -0800 ---------------------------------------------------------------------- .../corepersistence/CpEntityMapUtilsTest.java | 28 +++++++++++++- .../model/entity/MapToEntityConverter.java | 39 +++++++++----------- .../model/entity/MapToEntityConverterTest.java | 4 +- 3 files changed, 44 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/usergrid/blob/595955df/stack/core/src/test/java/org/apache/usergrid/corepersistence/CpEntityMapUtilsTest.java ---------------------------------------------------------------------- diff --git a/stack/core/src/test/java/org/apache/usergrid/corepersistence/CpEntityMapUtilsTest.java b/stack/core/src/test/java/org/apache/usergrid/corepersistence/CpEntityMapUtilsTest.java index b53f7ae..a636821 100644 --- a/stack/core/src/test/java/org/apache/usergrid/corepersistence/CpEntityMapUtilsTest.java +++ b/stack/core/src/test/java/org/apache/usergrid/corepersistence/CpEntityMapUtilsTest.java @@ -21,7 +21,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -import junit.framework.Assert; import org.apache.usergrid.corepersistence.util.CpEntityMapUtils; import org.apache.usergrid.persistence.model.entity.Entity; import org.apache.usergrid.persistence.model.entity.SimpleId; @@ -38,7 +37,6 @@ import java.io.IOException; import java.util.*; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -245,4 +243,30 @@ public class CpEntityMapUtilsTest { assertEquals("fred", entityObject.getField("name").getValue()); } + @Test + public void testNullSerialization() throws IOException { + + Map<String, Object> properties = new HashMap<>(); + + List<Object> array = new ArrayList<>(); + array.add(null); + array.add("test"); + + properties.put("array", array); + + org.apache.usergrid.persistence.model.entity.Entity entity = + new org.apache.usergrid.persistence.model.entity.Entity( + new SimpleId( "user" ) ); + entity = CpEntityMapUtils.fromMap( entity, properties, null, true ); + + assertTrue( entity.getField("array") instanceof ListField ); + assertTrue( entity.getField("array").getValue() instanceof List ); + List arrayReturned = (List) entity.getField("array").getValue(); + + assertEquals( null, arrayReturned.get(0) ); + assertEquals( "test", arrayReturned.get(1) ); + + + } + } http://git-wip-us.apache.org/repos/asf/usergrid/blob/595955df/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/entity/MapToEntityConverter.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/entity/MapToEntityConverter.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/entity/MapToEntityConverter.java index 7610489..fb19963 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/entity/MapToEntityConverter.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/entity/MapToEntityConverter.java @@ -32,6 +32,7 @@ import java.nio.ByteBuffer; import java.util.*; public class MapToEntityConverter{ + public static final Logger logger = LoggerFactory.getLogger(MapToEntityConverter.class); private final JsonFactory jsonFactory = new JsonFactory(); @@ -60,7 +61,6 @@ public class MapToEntityConverter{ } - return entity; } @@ -84,17 +84,12 @@ public class MapToEntityConverter{ returnList.add( processListForListField( fieldName, (List) sample ) ); - } else if ( sample != null ) { - - returnList.add( sample ); - } else { - returnList.add( new NullField(fieldName) ); + returnList.add( sample ); } - }); @@ -123,38 +118,32 @@ public class MapToEntityConverter{ newList.add(o); -// if (o instanceof List) { -// newList.add( processField( fieldName, (List) o, false)); -// } else { -// newList.add(o); -// } - } } else { newList.add( sample ); - } + } }); return newList; - } private Field processMapValue( Object value, String fieldName) { // check to see if the map is truly a location object - if ("location" .equals(fieldName.toString().toLowerCase()) ) { + if ( locationKey.equalsIgnoreCase(fieldName) ) { + return processLocationField((Map<String, Object>) value, fieldName); - } else { + } else { - // not a location element, process it as map - return processMapField( value, fieldName); + // not a location element, process it as a normal map + return processMapField( value, fieldName); } } @@ -164,6 +153,7 @@ public class MapToEntityConverter{ return new EntityObjectField( fieldName, fromMap( (Map<String, Object>)value, false)); } + /** * for location we need to parse two formats potentially and convert to a typed field */ @@ -269,22 +259,27 @@ public class MapToEntityConverter{ } else if ( value == null ){ + // not supported from outside API yet, but let's keep it in serialization it's a handled in this logic processedField = new NullField( fieldName, unique ); } else { + byte[] valueSerialized; try { + valueSerialized = objectMapper.writeValueAsBytes( value ); + } catch ( JsonProcessingException e ) { + throw new RuntimeException( "Can't serialize object ",e ); + } ByteBuffer byteBuffer = ByteBuffer.wrap(valueSerialized); - ByteArrayField bf = new ByteArrayField( fieldName, byteBuffer.array(), value.getClass() ); - processedField = bf; - } + processedField = new ByteArrayField( fieldName, byteBuffer.array(), value.getClass() ); + } return processedField; http://git-wip-us.apache.org/repos/asf/usergrid/blob/595955df/stack/corepersistence/model/src/test/java/org/apache/usergrid/persistence/model/entity/MapToEntityConverterTest.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/test/java/org/apache/usergrid/persistence/model/entity/MapToEntityConverterTest.java b/stack/corepersistence/model/src/test/java/org/apache/usergrid/persistence/model/entity/MapToEntityConverterTest.java index acc8cfd..b06d8f6 100644 --- a/stack/corepersistence/model/src/test/java/org/apache/usergrid/persistence/model/entity/MapToEntityConverterTest.java +++ b/stack/corepersistence/model/src/test/java/org/apache/usergrid/persistence/model/entity/MapToEntityConverterTest.java @@ -139,9 +139,7 @@ public class MapToEntityConverterTest { List arrayReturned = (List) entity.getField("arrayNullValues").getValue(); - Field convertedMapValue = (Field) arrayReturned.get(0); - - assertTrue( convertedMapValue.getTypeName() == FieldTypeName.NULL); + assertTrue( arrayReturned.get(0) == null); } @Test