/* * Copyright 2014 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.usergrid.corepersistence; 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 org.apache.usergrid.corepersistence.util.CpEntityMapUtils; import org.apache.usergrid.persistence.model.entity.Entity; import org.apache.usergrid.persistence.model.entity.SimpleId; import org.apache.usergrid.persistence.model.field.EntityObjectField; import org.apache.usergrid.persistence.model.field.ListField; import org.apache.usergrid.persistence.model.field.LocationField; import org.apache.usergrid.persistence.model.field.StringField; import org.apache.usergrid.persistence.model.field.value.EntityObject; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class CpEntityMapUtilsTest { private static final Logger log = LoggerFactory.getLogger( CpEntityMapUtilsTest.class ); @Test public void testToMap() { Map<String, Object> properties = new LinkedHashMap<String, Object>() {{ put( "username", "bart" ); put( "email", "bart@example.com" ); put( "block", new ArrayList<Object>() {{ add( new LinkedHashMap<String, Object>() {{ put("name", "fred"); }}); add( new LinkedHashMap<String, Object>() {{ put("name", "gertrude"); }}); add( new LinkedHashMap<String, Object>() {{ put("name", "mina"); }}); }}); put( "blockedBy", new ArrayList<Object>() {{ add( new LinkedHashMap<String, Object>() {{ put("name", "isabell"); }}); }}); put( "location", new LinkedHashMap<String, Object>() {{ put("latitude", 37.776753 ); put("longitude", -122.407846 ); }}); }}; Entity cpEntity = CpEntityMapUtils.fromMap( properties, "user", true ); assertUserWithBlocks( cpEntity ); } @Test public void testNestedArrayToMap() { /*** This tests example property input of { "nestedarray" : [ [ "fred" ] ] } ****/ Map<String, Object> properties = new LinkedHashMap<String, Object>() {{ put( "nestedarray", new ArrayList<ArrayList<String>>() {{ add(0, new ArrayList<String>() {{ add(0, "fred"); }}); }} ); put( "block", new ArrayList<Object>() {{ add( new LinkedHashMap<String, Object>() {{ put("name", "fred"); }}); add( new LinkedHashMap<String, Object>() {{ put("name", "gertrude"); }}); add( new LinkedHashMap<String, Object>() {{ put("name", "mina"); }}); }}); }}; Entity cpEntity = CpEntityMapUtils.fromMap( properties, "user", true ); assertUserWithBlocks(cpEntity); Map<String,Object> map = CpEntityMapUtils.toMap(cpEntity); cpEntity = CpEntityMapUtils.fromMap(map,"user", true); } @Test public void testLocation() { /*** This tests example property input of { "nestedarray" : [ [ "fred" ] ] } ****/ Map<String, Object> locMap = new HashMap<>(); locMap.put("latitude", 123.1); locMap.put("longitude", 123.1); Map<String, Object> properties = new LinkedHashMap<String, Object>(); properties.put("location", locMap); Entity cpEntity = CpEntityMapUtils.fromMap(properties, "loc", true); assertTrue(cpEntity.getFieldMap().get("location") instanceof LocationField); locMap = new HashMap<>(); locMap.put("latitude", 123.1); locMap.put("lgnosoos", 123.1); properties = new LinkedHashMap<String, Object>(); properties.put("location", locMap); cpEntity = CpEntityMapUtils.fromMap(properties, "loc", true); assertTrue(cpEntity.getFieldMap().get("location") instanceof EntityObjectField); properties = new LinkedHashMap<String, Object>(); properties.put("location", "denver"); cpEntity = CpEntityMapUtils.fromMap(properties, "loc", true); assertTrue(cpEntity.getFieldMap().get("location") instanceof StringField); } @Test public void testSerialization() throws JsonProcessingException, IOException { Map<String, Object> properties = new LinkedHashMap<String, Object>() {{ put( "username", "bart" ); put( "email", "bart@example.com" ); put( "block", new ArrayList<Object>() {{ add( new LinkedHashMap<String, Object>() {{ put("name", "fred"); }}); add( new LinkedHashMap<String, Object>() {{ put("name", "gertrude"); }}); add( new LinkedHashMap<String, Object>() {{ put("name", "mina"); }}); }}); put( "blockedBy", new ArrayList<Object>() {{ add( new LinkedHashMap<String, Object>() {{ put("name", "isabell"); }}); }}); put( "location", new LinkedHashMap<String, Object>() {{ put("latitude", 37.776753 ); put("longitude", -122.407846 ); }}); }}; 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 ); assertUserWithBlocks( entity ); ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); mapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT, "@class"); String entityString = mapper.writeValueAsString( entity ); //log.debug("Serialized to JSON: " + entityString ); TypeReference<Entity> tr = new TypeReference<Entity>() {}; entity = mapper.readValue( entityString, tr ); //log.debug("Round-tripped entity: " + CpEntityMapUtils.toMap(entity) ); assertUserWithBlocks( entity ); } @Test public void testNestedArraySerialization() throws JsonProcessingException, IOException { /*** This tests example property input of { "nestedarray" : [ [ "fred" ] ] } ****/ Map<String, Object> properties = new LinkedHashMap<String, Object>() {{ put( "nestedarray", new ArrayList<ArrayList<String>>() {{ add(0, new ArrayList<String>() {{ add(0, "fred"); }}); }} ); put( "block", new ArrayList<Object>() {{ add( new LinkedHashMap<String, Object>() {{ put("name", "fred"); }}); add( new LinkedHashMap<String, Object>() {{ put("name", "gertrude"); }}); add( new LinkedHashMap<String, Object>() {{ put("name", "mina"); }}); }}); }}; 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 ); assertUserWithBlocks( entity ); ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); mapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT, "@class"); String entityString = mapper.writeValueAsString( entity ); //log.debug("Serialized to JSON: " + entityString ); TypeReference<Entity> tr = new TypeReference<Entity>() {}; entity = mapper.readValue( entityString, tr ); //log.debug("Round-tripped entity: " + CpEntityMapUtils.toMap(entity) ); assertUserWithBlocks( entity ); } private void assertUserWithBlocks( org.apache.usergrid.persistence.model.entity.Entity e ) { assertTrue( e.getField("block") instanceof ListField ); assertTrue( e.getField("block").getValue() instanceof List ); List blockList = (List)e.getField("block").getValue(); EntityObject entityObject = (EntityObject)blockList.get(0); 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) ); } }