package com.orientechnologies.orient.object.enhancement; import com.orientechnologies.orient.object.db.OObjectDatabaseTx; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import javax.persistence.*; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.testng.AssertJUnit.assertTrue; import static org.testng.AssertJUnit.fail; /** * @author JN <a href="mailto:jn@brain-activit.com">Julian Neuhaus</a> * @author Nathan Brown (anecdotesoftware--at--gmail.com) * @since 18.08.2014 */ public class OObjectProxyMethodHandlerTest { private OObjectDatabaseTx databaseTx; private Map<String, Object> fieldsAndThereDefaultValue; @BeforeClass protected void setUp() throws Exception { databaseTx = new OObjectDatabaseTx("memory:OObjectEnumLazyListTest"); databaseTx.create(); databaseTx.getEntityManager().registerEntityClass(EntityWithDifferentFieldTypes.class); databaseTx.getEntityManager().registerEntityClass(EmbeddedType1.class); databaseTx.getEntityManager().registerEntityClass(EmbeddedType2.class); databaseTx.getEntityManager().registerEntityClass(EntityWithEmbeddedFields.class); fieldsAndThereDefaultValue = new HashMap<String, Object>(); fieldsAndThereDefaultValue.put("byteField", Byte.valueOf("0")); fieldsAndThereDefaultValue.put("shortField", Short.valueOf("0")); fieldsAndThereDefaultValue.put("intField", 0); fieldsAndThereDefaultValue.put("longField", 0L); fieldsAndThereDefaultValue.put("floatField", 0.0f); fieldsAndThereDefaultValue.put("doubleField", 0.0d); fieldsAndThereDefaultValue.put("stringField", null); fieldsAndThereDefaultValue.put("booleanField", false); fieldsAndThereDefaultValue.put("objectField", null); } @AfterClass protected void tearDown() { databaseTx.drop(); } @Test public void reloadTestForMapsInTarget() { EntityWithDifferentFieldTypes targetObject = this.databaseTx.newInstance(EntityWithDifferentFieldTypes.class); EntityWithDifferentFieldTypes childObject = this.databaseTx.newInstance(EntityWithDifferentFieldTypes.class); Map<String, String> map = new HashMap<String, String>(); map.put("key", "value"); targetObject.setStringStringMap(map); Map<String, String> map2 = new HashMap<String, String>(); map2.put("key", "value"); Map<String, String> map3 = childObject.getStringStringMap(); map2.put("key", "value"); targetObject.getListOfEntityWithDifferentFieldTypes().add(childObject); targetObject = this.databaseTx.save(targetObject); for (String key : targetObject.getStringStringMap().keySet()) { assertTrue(key.equals("key")); } targetObject.getStringStringMap().put("key2", "value2"); childObject.getStringStringMap().put("key3", "value3"); targetObject = this.databaseTx.save(targetObject); // targetObject = this.databaseTx.load(targetObject); targetObject.getStringStringMap().get("key"); targetObject.getStringStringMap2().get("key2"); targetObject.getStringStringMap2().put("key3", "value3"); } @Test public void reloadTestForListsInTarget() { EntityWithDifferentFieldTypes targetObject = new EntityWithDifferentFieldTypes(); List<EntityWithDifferentFieldTypes> entitieList = new ArrayList<EntityWithDifferentFieldTypes>(); EntityWithDifferentFieldTypes listObject1 = new EntityWithDifferentFieldTypes(); EntityWithDifferentFieldTypes listObject2 = new EntityWithDifferentFieldTypes(); listObject1.setBooleanField(true); listObject1.setByteField(Byte.MIN_VALUE); listObject1.setDoubleField(1.1); listObject1.setFloatField(1f); listObject1.setIntField(13); listObject1.setLongField(10); listObject1.setShortField(Short.MIN_VALUE); listObject1.setStringField("TEST2"); listObject2.setBooleanField(true); listObject2.setByteField(Byte.MIN_VALUE); listObject2.setDoubleField(1.1); listObject2.setFloatField(1f); listObject2.setIntField(13); listObject2.setLongField(10); listObject2.setShortField(Short.MIN_VALUE); listObject2.setStringField("TEST2"); entitieList.add(listObject1); entitieList.add(listObject2); targetObject.setListOfEntityWithDifferentFieldTypes(entitieList); targetObject = this.databaseTx.save(targetObject); for (EntityWithDifferentFieldTypes entity : targetObject.getListOfEntityWithDifferentFieldTypes()) { assertTrue(entity.isBooleanField() == true); assertTrue(entity.getByteField() == Byte.MIN_VALUE); assertTrue(entity.getDoubleField() == 1.1); assertTrue(entity.getFloatField() == 1f); assertTrue(entity.getIntField() == 13); assertTrue(entity.getLongField() == 10); assertTrue(entity.getObjectField() == null); assertTrue(entity.getShortField() == Short.MIN_VALUE); assertTrue("TEST2".equals(entity.getStringField())); entity.setBooleanField(false); entity.setByteField(Byte.MAX_VALUE); entity.setDoubleField(3.1); entity.setFloatField(2f); entity.setIntField(15); entity.setLongField(11); entity.setShortField(Short.MAX_VALUE); entity.setStringField("TEST3"); entity.setObjectField(new EntityWithDifferentFieldTypes()); } for (EntityWithDifferentFieldTypes entity : targetObject.getListOfEntityWithDifferentFieldTypes()) { this.databaseTx.reload(entity); assertTrue(entity.isBooleanField() == true); assertTrue(entity.getByteField() == Byte.MIN_VALUE); assertTrue(entity.getDoubleField() == 1.1); assertTrue(entity.getFloatField() == 1f); assertTrue(entity.getIntField() == 13); assertTrue(entity.getLongField() == 10); assertTrue(entity.getObjectField() == null); assertTrue(entity.getShortField() == Short.MIN_VALUE); assertTrue("TEST2".equals(entity.getStringField())); } } @Test public void getDefaultValueForFieldTest() { OObjectProxyMethodHandler handler = new OObjectProxyMethodHandler(null); Method m = null; try { m = handler.getClass().getDeclaredMethod("getDefaultValueForField", Field.class); m.setAccessible(true); } catch (Exception e) { e.printStackTrace(); fail("Unexpected exception"); } assertTrue(m != null); EntityWithDifferentFieldTypes testEntity = new EntityWithDifferentFieldTypes(); for (String fieldName : fieldsAndThereDefaultValue.keySet()) { Field field = null; try { field = testEntity.getClass().getDeclaredField(fieldName); field.setAccessible(true); } catch (Exception e) { e.printStackTrace(); fail("Unexpected exception"); } assertTrue(field != null); try { Object defaultValue = m.invoke(handler, field); Object expectedValue = fieldsAndThereDefaultValue.get(fieldName); if (expectedValue == null) assertTrue(defaultValue == null); else assertTrue(expectedValue.equals(defaultValue)); } catch (Exception e) { e.printStackTrace(); fail("Unexpected exception"); } } } public class EntityWithDifferentFieldTypes { private byte byteField; private short shortField; private int intField; private long longField; private float floatField; private double doubleField; private String stringField; private boolean booleanField; private EntityWithDifferentFieldTypes objectField; private Map<String, String> stringStringMap = new HashMap<String, String>(); private Map<String, String> stringStringMap2 = new HashMap<String, String>(); @OneToMany(cascade = CascadeType.ALL) private List<EntityWithDifferentFieldTypes> listOfEntityWithDifferentFieldTypes; public EntityWithDifferentFieldTypes() { super(); this.listOfEntityWithDifferentFieldTypes = new ArrayList<EntityWithDifferentFieldTypes>(); } public byte getByteField() { return byteField; } public void setByteField(byte byteField) { this.byteField = byteField; } public short getShortField() { return shortField; } public void setShortField(short shortField) { this.shortField = shortField; } public int getIntField() { return intField; } public void setIntField(int intField) { this.intField = intField; } public long getLongField() { return longField; } public void setLongField(long longField) { this.longField = longField; } public float getFloatField() { return floatField; } public void setFloatField(float floatField) { this.floatField = floatField; } public double getDoubleField() { return doubleField; } public void setDoubleField(double doubleField) { this.doubleField = doubleField; } public String getStringField() { return stringField; } public void setStringField(String stringField) { this.stringField = stringField; } public boolean isBooleanField() { return booleanField; } public void setBooleanField(boolean booleanField) { this.booleanField = booleanField; } public EntityWithDifferentFieldTypes getObjectField() { return objectField; } public void setObjectField(EntityWithDifferentFieldTypes objectField) { this.objectField = objectField; } public List<EntityWithDifferentFieldTypes> getListOfEntityWithDifferentFieldTypes() { return listOfEntityWithDifferentFieldTypes; } public void setListOfEntityWithDifferentFieldTypes(List<EntityWithDifferentFieldTypes> listOfEntityWithDifferentFieldTypes) { this.listOfEntityWithDifferentFieldTypes = listOfEntityWithDifferentFieldTypes; } public Map<String, String> getStringStringMap() { return stringStringMap; } public void setStringStringMap(Map<String, String> stringStringMap) { this.stringStringMap = stringStringMap; } public Map<String, String> getStringStringMap2() { return stringStringMap2; } public void setStringStringMap2(Map<String, String> stringStringMap2) { this.stringStringMap2 = stringStringMap2; } } @Test public void testEntityWithEmbeddedFieldDetachingAllWithoutError() throws Exception { EntityWithEmbeddedFields entity = new EntityWithEmbeddedFields(); entity.setEmbeddedType1(new EmbeddedType1()); entity.setEmbeddedType2(new EmbeddedType2()); EntityWithEmbeddedFields saved = databaseTx.save(entity); databaseTx.detachAll(saved, true); } public static class EmbeddedType1 { } public static class EmbeddedType2 { } public static class EntityWithEmbeddedFields { @Embedded private EmbeddedType1 _embeddedType1; @Embedded private EmbeddedType2 _embeddedType2; public EntityWithEmbeddedFields() { } public EmbeddedType1 getEmbeddedType1() { return _embeddedType1; } public void setEmbeddedType1( EmbeddedType1 embeddedType1) { _embeddedType1 = embeddedType1; } public EmbeddedType2 getEmbeddedType2() { return _embeddedType2; } public void setEmbeddedType2( EmbeddedType2 embeddedType2) { _embeddedType2 = embeddedType2; } } }