Fix issue with multiple types within a list causing class cast exceptions.
Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/2e37c211 Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/2e37c211 Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/2e37c211 Branch: refs/heads/USERGRID-1047 Commit: 2e37c21106613dc9b3244f41ace1ef09c41714ec Parents: 46fb926 Author: Michael Russo <michaelaru...@gmail.com> Authored: Fri Jan 22 17:28:27 2016 -0800 Committer: Michael Russo <michaelaru...@gmail.com> Committed: Fri Jan 22 17:28:27 2016 -0800 ---------------------------------------------------------------------- .../model/entity/MapToEntityConverter.java | 235 +++++++++++-------- .../persistence/model/field/ArrayField.java | 4 +- .../persistence/model/field/BooleanField.java | 4 +- .../persistence/model/field/ByteArrayField.java | 8 +- .../persistence/model/field/DoubleField.java | 4 +- .../persistence/model/field/FloatField.java | 4 +- .../persistence/model/field/IntegerField.java | 4 +- .../persistence/model/field/ListField.java | 4 +- .../persistence/model/field/LocationField.java | 4 +- .../persistence/model/field/LongField.java | 4 +- .../persistence/model/field/NullField.java | 4 +- .../model/field/SerializedObjectField.java | 8 +- .../persistence/model/field/SetField.java | 6 +- .../persistence/model/field/StringField.java | 6 +- .../persistence/model/field/UUIDField.java | 4 +- .../model/entity/MapToEntityConverterTest.java | 40 +++- 16 files changed, 211 insertions(+), 132 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/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 38d6631..7610489 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 @@ -41,12 +41,14 @@ public class MapToEntityConverter{ static final String lat = "latitude"; static final String lon = "longitude"; + public Entity fromMap( Map<String, Object> map, boolean topLevel ) { Entity entity = new Entity(); return fromMap( entity, map, null, null, topLevel ); } + public Entity fromMap(final Entity entity,final Map<String, Object> map,final SchemaManager schemaManager, final String entityType, boolean topLevel) { @@ -54,151 +56,118 @@ public class MapToEntityConverter{ Object value = map.get( fieldName ); boolean unique = schemaManager == null ? topLevel : topLevel && schemaManager.isPropertyUnique(entityType, fieldName); - //cannot store fields that aren't locations + entity.setField( processField( fieldName, value, unique)); - if ( value instanceof String ) { - String stringValue =(String)value; - entity.setField(new StringField(fieldName, stringValue, unique)); + } - } else if ( value instanceof Boolean ) { - entity.setField( new BooleanField( fieldName, (Boolean)value, unique )); - } else if ( value instanceof Integer ) { - entity.setField( new IntegerField( fieldName, (Integer)value, unique )); + return entity; + } - } else if ( value instanceof Double ) { - entity.setField( new DoubleField( fieldName, (Double)value, unique )); - } else if ( value instanceof Float ) { - entity.setField( new FloatField( fieldName, (Float)value, unique )); + private ListField processListValue(String fieldName, List list ) { - } else if ( value instanceof Long ) { + if (list.isEmpty()) { + return new ArrayField( fieldName ); + } - entity.setField( new LongField( fieldName, (Long)value, unique )); + final List<Object> returnList = new ArrayList<>(); - } else if ( value instanceof List) { - Field field = listToListField( fieldName, (List)value ); - if(field == null){ - entity.setField( new NullField( fieldName, unique)); - }else{ - entity.setField( listToListField( fieldName, (List)value )); - } + list.forEach( sample -> { + + if ( sample instanceof Map ) { + + returnList.add( fromMap( (Map<String, Object>) sample, false ) ); - } else if ( value instanceof UUID) { - entity.setField( new UUIDField( fieldName, (UUID)value, unique )); + } else if ( sample instanceof List ) { - } else if ( value instanceof Map ) { - processMapValue( value, fieldName, entity); + returnList.add( processListForListField( fieldName, (List) sample ) ); - } else if ( value instanceof Enum ) { - entity.setField( new StringField( fieldName, value.toString(), unique )); + } else if ( sample != null ) { - } else if ( value == null ){ - entity.setField( new NullField( fieldName, unique )); + returnList.add( sample ); } 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() ); - entity.setField( bf ); + returnList.add( new NullField(fieldName) ); + } - } - return entity; + }); + + + return new ArrayField<>( fieldName, returnList); + } - private ListField listToListField( String fieldName, List list ) { - if (list.isEmpty()) { - return new ArrayField( fieldName ); + private List processListForListField(String fieldName, List list ) { + if ( list.isEmpty() ) { + return list; } - Object sample = list.get(0); + List<Object> newList = new ArrayList<>(); - if ( sample instanceof Map ) { - return new ArrayField( fieldName, processListForField( list )); + list.forEach( sample -> { - } else if ( sample instanceof List ) { - return new ArrayField<List>( fieldName, processListForField( list )); + if ( sample instanceof Map ) { - } else if ( sample instanceof String ) { - return new ArrayField<String>( fieldName, (List<String>)list ); + newList.add( processMapValue( sample, fieldName) ); - } else if ( sample instanceof Boolean ) { - return new ArrayField<Boolean>( fieldName, (List<Boolean>)list ); + } else if ( sample instanceof List ) { - } else if ( sample instanceof Integer ) { - return new ArrayField<Integer>( fieldName, (List<Integer>)list ); + for (Object o : list) { - } else if ( sample instanceof Double ) { - return new ArrayField<Double>( fieldName, (List<Double>)list ); + newList.add(o); - } else if ( sample instanceof Long ) { - return new ArrayField<Long>( fieldName, (List<Long>)list ); +// if (o instanceof List) { +// newList.add( processField( fieldName, (List) o, false)); +// } else { +// newList.add(o); +// } - } else if ( sample == null ) { - return new ArrayField<Object>( fieldName, (List<Object>)list ); + } - } else{ - throw new RuntimeException("Unknown type " + sample.getClass().getName()); - } - } - private List processListForField( List list ) { - if ( list.isEmpty() ) { - return list; - } - Object sample = list.get(0); + } else { - if ( sample instanceof Map ) { - List<Entity> newList = new ArrayList<Entity>(); - for ( Map<String, Object> map : (List<Map<String, Object>>)list ) { - newList.add( fromMap( map, false ) ); + newList.add( sample ); } - return newList; - - } else if ( sample instanceof List ) { - List<Object> newList = new ArrayList<Object>(); - for (Object o : list) { - if (o instanceof List) { - newList.add(processListForField((List) o)); - } else { - newList.add(o); - } - } - return newList; - } else { - return list; - } + + }); + + return newList; + + } - private void processMapValue( Object value, String fieldName, Entity entity) { + private Field processMapValue( Object value, String fieldName) { - // is the map really a location element? + // check to see if the map is truly a location object if ("location" .equals(fieldName.toString().toLowerCase()) ) { - processLocationField((Map<String, Object>) value, fieldName, entity); + return processLocationField((Map<String, Object>) value, fieldName); } else { + + // not a location element, process it as map - entity.setField(new EntityObjectField(fieldName, - fromMap((Map<String, Object>) value, false))); // recursion + return processMapField( value, fieldName); } } + + private Field processMapField ( Object value, String fieldName) { + + 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 */ - private void processLocationField(Map<String, Object> value, String fieldName, Entity entity) { + private Field processLocationField(Map<String, Object> value, String fieldName) { // get the object to inspect Map<String, Object> origMap = value; Map<String, Object> m = new HashMap<String, Object>(); @@ -241,13 +210,85 @@ public class MapToEntityConverter{ + "latitude and longitude, or lat and lon"); } - entity.setField(new LocationField(fieldName, new Location(latVal, lonVal))); + return new LocationField(fieldName, new Location(latVal, lonVal)); } else { //can't process non enties logger.warn( "entity cannot process location values that don't have valid location{latitude,longitude} values, changing to generic object" ); - entity.setField(new EntityObjectField(fieldName,fromMap( value, false))); // recursion + return new EntityObjectField(fieldName,fromMap( value, false)); // recursion } } + + + + private Field processField(final String fieldName, final Object value, final boolean unique) { + + Field processedField; + + if ( value instanceof String ) { + + String stringValue =(String)value; + processedField = new StringField(fieldName, stringValue, unique); + + } else if ( value instanceof Boolean ) { + + processedField = new BooleanField( fieldName, (Boolean)value, unique ); + + } else if ( value instanceof Integer ) { + + processedField = new IntegerField( fieldName, (Integer)value, unique ); + + } else if ( value instanceof Double ) { + + processedField = new DoubleField( fieldName, (Double)value, unique ); + + } else if ( value instanceof Float ) { + + processedField = new FloatField( fieldName, (Float)value, unique ); + + } else if ( value instanceof Long ) { + + processedField = new LongField( fieldName, (Long)value, unique ); + + } else if ( value instanceof List) { + + processedField = processListValue( fieldName, (List)value ); + + } else if ( value instanceof UUID) { + + processedField = new UUIDField( fieldName, (UUID)value, unique ); + + } else if ( value instanceof Map ) { + + processedField = processMapValue( value, fieldName); + + } else if ( value instanceof Enum ) { + + processedField = new StringField( fieldName, value.toString(), unique ); + + } else if ( value == null ){ + + 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; + } + + + return processedField; + + } + + } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ArrayField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ArrayField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ArrayField.java index 0e7bc4a..be1d923 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ArrayField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ArrayField.java @@ -23,7 +23,7 @@ import java.util.List; /** * A marker to signal array handling. Just delegates to list field for easier handling internally */ -public class ArrayField<T> extends ListField<T> { +public final class ArrayField<T> extends ListField<T> { /** * Contructor that intializes with an empty set for adding to later @@ -43,7 +43,7 @@ public class ArrayField<T> extends ListField<T> { /** * Add the value to the list */ - public void add( T listItem ) { + public final void add( T listItem ) { value.add( listItem ); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/BooleanField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/BooleanField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/BooleanField.java index 7965855..2916096 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/BooleanField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/BooleanField.java @@ -20,7 +20,7 @@ package org.apache.usergrid.persistence.model.field; /** * @author: tnine */ -public class BooleanField extends AbstractField<Boolean> { +public final class BooleanField extends AbstractField<Boolean> { public BooleanField( String name, Boolean value ) { super( name, value ); @@ -35,7 +35,7 @@ public class BooleanField extends AbstractField<Boolean> { @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.BOOLEAN; } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ByteArrayField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ByteArrayField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ByteArrayField.java index 2e116d7..58defed 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ByteArrayField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ByteArrayField.java @@ -22,7 +22,7 @@ package org.apache.usergrid.persistence.model.field; /** * A field for storing and array of bytes. */ -public class ByteArrayField extends AbstractField<byte[]> { +public final class ByteArrayField extends AbstractField<byte[]> { Class classinfo; @@ -36,17 +36,17 @@ public class ByteArrayField extends AbstractField<byte[]> { } @Override - public byte[] getValue() { + public final byte[] getValue() { return value; } - public Class getClassinfo() { + public final Class getClassinfo() { return classinfo; } @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.BYTE_ARRAY; } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/DoubleField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/DoubleField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/DoubleField.java index ccbc3e2..3b2c413 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/DoubleField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/DoubleField.java @@ -20,7 +20,7 @@ package org.apache.usergrid.persistence.model.field; /** * @author: tnine */ -public class DoubleField extends AbstractField<Double> { +public final class DoubleField extends AbstractField<Double> { public DoubleField(String name, Double value) { super(name, value); @@ -35,7 +35,7 @@ public class DoubleField extends AbstractField<Double> { @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.DOUBLE; } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/FloatField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/FloatField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/FloatField.java index 28c6f36..8c288f3 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/FloatField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/FloatField.java @@ -20,7 +20,7 @@ package org.apache.usergrid.persistence.model.field; /** * Represents Float. */ -public class FloatField extends AbstractField<Float> { +public final class FloatField extends AbstractField<Float> { public FloatField(String name, Float value) { super(name, value); @@ -35,7 +35,7 @@ public class FloatField extends AbstractField<Float> { @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.FLOAT; } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/IntegerField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/IntegerField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/IntegerField.java index 3eb0330..b03ecf8 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/IntegerField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/IntegerField.java @@ -20,7 +20,7 @@ package org.apache.usergrid.persistence.model.field; /** * @author: tnine */ -public class IntegerField extends AbstractField<Integer> { +public final class IntegerField extends AbstractField<Integer> { public IntegerField(String name, Integer value) { super(name, value); @@ -35,7 +35,7 @@ public class IntegerField extends AbstractField<Integer> { @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.INTEGER; } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ListField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ListField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ListField.java index 5ec4237..d063b02 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ListField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/ListField.java @@ -51,12 +51,12 @@ public class ListField<T> extends AbstractField<List<T>> { @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.LIST; } - public int size(){ + public final int size(){ return this.value.size(); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/LocationField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/LocationField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/LocationField.java index 4605e1b..244110a 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/LocationField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/LocationField.java @@ -23,7 +23,7 @@ import org.apache.usergrid.persistence.model.field.value.Location; /** * Basic field for storing location data */ -public class LocationField extends AbstractField<Location> { +public final class LocationField extends AbstractField<Location> { /** * Create a location field with the given point @@ -43,7 +43,7 @@ public class LocationField extends AbstractField<Location> { @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.LOCATION; } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/LongField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/LongField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/LongField.java index d4b6297..f36c046 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/LongField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/LongField.java @@ -22,7 +22,7 @@ package org.apache.usergrid.persistence.model.field; * @author: tnine * */ -public class LongField extends AbstractField<Long> { +public final class LongField extends AbstractField<Long> { public LongField(String name, Long value) { super(name, value); @@ -37,7 +37,7 @@ public class LongField extends AbstractField<Long> { @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.LONG; } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/NullField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/NullField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/NullField.java index 6362bcb..94fca87 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/NullField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/NullField.java @@ -21,7 +21,7 @@ package org.apache.usergrid.persistence.model.field; /** * Created by russo on 1/14/16. */ -public class NullField extends AbstractField<Object>{ +public final class NullField extends AbstractField<Object>{ public NullField(String name) { @@ -37,7 +37,7 @@ public class NullField extends AbstractField<Object>{ @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.NULL; } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/SerializedObjectField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/SerializedObjectField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/SerializedObjectField.java index 5b16f89..3cc6d09 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/SerializedObjectField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/SerializedObjectField.java @@ -22,7 +22,7 @@ package org.apache.usergrid.persistence.model.field; /** * Classy class class. */ -public class SerializedObjectField extends AbstractField<String> { +public final class SerializedObjectField extends AbstractField<String> { Class classinfo; public SerializedObjectField(String name, String value, Class classinfo) { @@ -35,17 +35,17 @@ public class SerializedObjectField extends AbstractField<String> { } @Override - public String getValue() { + public final String getValue() { return value; } - public Class getClassinfo() { + public final Class getClassinfo() { return classinfo; } @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.SERIALIZED_OBJECT; } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/SetField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/SetField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/SetField.java index 47a9c7c..8662c8d 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/SetField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/SetField.java @@ -24,7 +24,7 @@ import java.util.Set; /** * An object field that represents a set of objects */ -public class SetField<T> extends AbstractField<Set<T>> { +public final class SetField<T> extends AbstractField<Set<T>> { /** * Constructor that initializes with an empty set for adding to later @@ -44,13 +44,13 @@ public class SetField<T> extends AbstractField<Set<T>> { /** * Add an entry to the set */ - public void addEntry( T setItem ) { + public final void addEntry( T setItem ) { value.add( setItem ); } @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.SET; } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/StringField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/StringField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/StringField.java index 48ff193..2b8124a 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/StringField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/StringField.java @@ -20,7 +20,7 @@ package org.apache.usergrid.persistence.model.field; /** * A String field */ -public class StringField extends AbstractField<String> { +public final class StringField extends AbstractField<String> { public static final int MAX_LENGTH = 500; @@ -39,13 +39,13 @@ public class StringField extends AbstractField<String> { @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.STRING; } @Override - public void validate() { + public final void validate() { //not unique, don't care if(!unique){ return; http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/UUIDField.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/UUIDField.java b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/UUIDField.java index 4c67447..43f59ce 100644 --- a/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/UUIDField.java +++ b/stack/corepersistence/model/src/main/java/org/apache/usergrid/persistence/model/field/UUIDField.java @@ -22,7 +22,7 @@ import java.util.UUID; /** * A String field */ -public class UUIDField extends AbstractField<UUID> { +public final class UUIDField extends AbstractField<UUID> { public UUIDField(String name, UUID value) { super(name, value); @@ -37,7 +37,7 @@ public class UUIDField extends AbstractField<UUID> { @Override - public FieldTypeName getTypeName() { + public final FieldTypeName getTypeName() { return FieldTypeName.UUID; } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/2e37c211/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 03dfa11..acc8cfd 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 @@ -22,13 +22,16 @@ package org.apache.usergrid.persistence.model.entity; +import org.apache.usergrid.persistence.model.field.Field; import org.apache.usergrid.persistence.model.field.FieldTypeName; +import org.apache.usergrid.persistence.model.field.value.EntityObject; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -136,7 +139,42 @@ public class MapToEntityConverterTest { List arrayReturned = (List) entity.getField("arrayNullValues").getValue(); - assertTrue( arrayReturned.get(0) == null); + Field convertedMapValue = (Field) arrayReturned.get(0); + + assertTrue( convertedMapValue.getTypeName() == FieldTypeName.NULL); + } + + @Test + public void testMultipleValueTypesWithinList() { + + // build top-level map + final Map<String,Object> data = new HashMap<>(1); + + final List<Object> arrayDifferentValueTypes = new ArrayList<>(2); + + final Map<String, String> mapValue = new HashMap<>(1); + mapValue.put("mapkey", "mapvalue"); + + arrayDifferentValueTypes.add(mapValue); + arrayDifferentValueTypes.add("stringvalue"); + + // add the nested list to the map + data.put("arrayDifferentValueTypes", arrayDifferentValueTypes); + + // convert the map to an entity + MapToEntityConverter converter = new MapToEntityConverter(); + Entity entity = converter.fromMap(data, true); + + // make sure the nested array got converted into a ListField + assertTrue(entity.getField("arrayDifferentValueTypes").getTypeName() == FieldTypeName.LIST); + + + List arrayReturned = (List) entity.getField("arrayDifferentValueTypes").getValue(); + + EntityObject convertedMapValue = (EntityObject) arrayReturned.get(0); + assertEquals( convertedMapValue.getField("mapkey").getValue(), mapValue.get("mapkey")); + assertEquals( arrayReturned.get(1), arrayDifferentValueTypes.get(1)); + } }