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));
+
     }
 
 }

Reply via email to