package com.arondor.common.reflection.reflect.instantiator;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import javax.management.ReflectionException;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import com.arondor.common.reflection.api.instantiator.InstantiationContext;
import com.arondor.common.reflection.api.instantiator.ReflectionInstantiator;
import com.arondor.common.reflection.bean.config.ObjectConfigurationFactoryBean;
import com.arondor.common.reflection.model.config.ElementConfiguration;
import com.arondor.common.reflection.model.config.ListConfiguration;
import com.arondor.common.reflection.model.config.MapConfiguration;
import com.arondor.common.reflection.model.config.ObjectConfiguration;
import com.arondor.common.reflection.model.config.ObjectConfigurationFactory;
import com.arondor.common.reflection.model.config.ObjectConfigurationMap;
import com.arondor.common.reflection.model.config.PrimitiveConfiguration;
import com.arondor.common.reflection.model.config.ReferenceConfiguration;
import com.arondor.common.reflection.reflect.testclasses.TestClassA;
import com.arondor.common.reflection.reflect.testclasses.TestClassB;
import com.arondor.common.reflection.reflect.testclasses.TestClassC;
import com.arondor.common.reflection.reflect.testclasses.TestClassC.EnumValue;
import com.arondor.common.reflection.reflect.testclasses.TestClassD;
import com.arondor.common.reflection.reflect.testclasses.TestClassE;
public class TestReflectionInstantiatorReflect
{
private final static Logger LOG = Logger.getLogger(TestReflectionInstantiatorReflect.class);
private InstantiationContext instantationContext;
private ReflectionInstantiator reflectionInstantiator;
private ObjectConfigurationFactory objectConfigurationFactory = new ObjectConfigurationFactoryBean();
@Before
public void initialize() throws FileNotFoundException, ClassNotFoundException, NoSuchMethodException,
SecurityException, InstantiationException, IllegalAccessException
{
ReflectionInstantiator reflectionInstantiator = new ReflectionInstantiatorReflect();
this.reflectionInstantiator = reflectionInstantiator;
this.instantationContext = this.reflectionInstantiator.createDefaultInstantiationContext();
// this.parser = new JavaAccessibleClassParser();
}
@Test
public void testInstantiateClassA() throws ReflectionException
{
ObjectConfiguration configuration = objectConfigurationFactory.createObjectConfiguration();
configuration.setClassName(TestClassA.class.getName());
configuration.setFields(new HashMap<String, ElementConfiguration>());
ElementConfiguration fieldConf1 = objectConfigurationFactory
.createPrimitiveConfiguration("Value for property1");
configuration.getFields().put("property1", fieldConf1);
ElementConfiguration fieldConf2 = objectConfigurationFactory.createPrimitiveConfiguration("82377");
configuration.getFields().put("property2", fieldConf2);
Object objectA = reflectionInstantiator.instanciateObject(configuration, Object.class, instantationContext);
assertNotNull(objectA);
assertEquals(TestClassA.class, objectA.getClass());
assertTrue(objectA instanceof TestClassA);
TestClassA classA = (TestClassA) objectA;
assertEquals("Value for property1", classA.getProperty1());
assertEquals(82377, classA.getProperty2());
}
@Test
public void testInstantiateClassAWithConstructor() throws ReflectionException
{
ObjectConfiguration configuration = objectConfigurationFactory.createObjectConfiguration();
configuration.setClassName(TestClassA.class.getName());
configuration.setConstructorArguments(new ArrayList<ElementConfiguration>());
ElementConfiguration fieldConf1 = objectConfigurationFactory
.createPrimitiveConfiguration("Value for property1");
configuration.getConstructorArguments().add(fieldConf1);
ElementConfiguration fieldConf2 = objectConfigurationFactory.createPrimitiveConfiguration("82377");
configuration.getConstructorArguments().add(fieldConf2);
Object objectA = reflectionInstantiator.instanciateObject(configuration, Object.class, instantationContext);
assertEquals(TestClassA.class, objectA.getClass());
assertTrue(objectA instanceof TestClassA);
TestClassA classA = (TestClassA) objectA;
assertEquals("Value for property1", classA.getProperty1());
assertEquals(82377, classA.getProperty2());
}
@Test
public void testClassbBNestedClassA() throws ReflectionException
{
ObjectConfiguration configurationA = objectConfigurationFactory.createObjectConfiguration();
configurationA.setClassName(TestClassA.class.getName());
configurationA.setFields(new HashMap<String, ElementConfiguration>());
ElementConfiguration fieldConf1 = objectConfigurationFactory
.createPrimitiveConfiguration("Value for property1 : B");
configurationA.getFields().put("property1", fieldConf1);
ElementConfiguration fieldConf2 = objectConfigurationFactory.createPrimitiveConfiguration("82378");
configurationA.getFields().put("property2", fieldConf2);
ObjectConfiguration configurationB = objectConfigurationFactory.createObjectConfiguration();
configurationB.setClassName(TestClassB.class.getName());
configurationB.setFields(new HashMap<String, ElementConfiguration>());
configurationB.getFields().put("nestedClassA", configurationA);
Object objectB = reflectionInstantiator.instanciateObject(configurationB, Object.class, instantationContext);
assertNotNull(objectB);
assertTrue(objectB instanceof TestClassB);
TestClassB classB = (TestClassB) objectB;
assertNotNull(classB.getNestedClassA());
TestClassA classA = classB.getNestedClassA();
assertEquals("Value for property1 : B", classA.getProperty1());
assertEquals(82378, classA.getProperty2());
}
@Test
public void testClassC_WithEnum() throws ReflectionException
{
ObjectConfiguration configurationC = objectConfigurationFactory.createObjectConfiguration();
configurationC.setClassName(TestClassC.class.getName());
configurationC.setFields(new HashMap<String, ElementConfiguration>());
ObjectConfiguration confEnum = objectConfigurationFactory.createObjectConfiguration();
confEnum.setClassName(EnumValue.class.getName());
confEnum.setConstructorArguments(new ArrayList<ElementConfiguration>());
ElementConfiguration fieldConfEnumValue = objectConfigurationFactory.createPrimitiveConfiguration("BLUE");
confEnum.getConstructorArguments().add(fieldConfEnumValue);
configurationC.getFields().put("enumValue", confEnum);
Object objectC = reflectionInstantiator.instanciateObject(configurationC, Object.class, instantationContext);
assertNotNull(objectC);
assertTrue(objectC instanceof TestClassC);
TestClassC classC = (TestClassC) objectC;
assertEquals(TestClassC.EnumValue.BLUE, classC.getEnumValue());
}
@Test
public void testClassC_ConstructorWithEnum() throws ReflectionException
{
ObjectConfiguration configurationC = objectConfigurationFactory.createObjectConfiguration();
configurationC.setClassName(TestClassC.class.getName());
configurationC.setFields(new HashMap<String, ElementConfiguration>());
configurationC.setConstructorArguments(new ArrayList<ElementConfiguration>());
ObjectConfiguration confEnum = objectConfigurationFactory.createObjectConfiguration();
confEnum.setClassName(EnumValue.class.getName());
confEnum.setConstructorArguments(new ArrayList<ElementConfiguration>());
ElementConfiguration fieldConfEnumValue = objectConfigurationFactory.createPrimitiveConfiguration("BLUE");
confEnum.getConstructorArguments().add(fieldConfEnumValue);
configurationC.getConstructorArguments().add(confEnum);
Object objectC = reflectionInstantiator.instanciateObject(configurationC, Object.class, instantationContext);
assertNotNull(objectC);
assertTrue(objectC instanceof TestClassC);
TestClassC classC = (TestClassC) objectC;
assertEquals(TestClassC.EnumValue.BLUE, classC.getEnumValue());
}
@Test
public void testClassD_List()
{
ObjectConfiguration configurationD = objectConfigurationFactory.createObjectConfiguration();
configurationD.setClassName(TestClassD.class.getName());
configurationD.setFields(new HashMap<String, ElementConfiguration>());
ListConfiguration fieldConfList = objectConfigurationFactory.createListConfiguration();
fieldConfList.setListConfiguration(new ArrayList<ElementConfiguration>());
configurationD.getFields().put("listClassA", fieldConfList);
for (int i = 0; i < 10; i++)
{
ObjectConfiguration configurationA = objectConfigurationFactory.createObjectConfiguration();
configurationA.setClassName(TestClassA.class.getName());
configurationA.setFields(new HashMap<String, ElementConfiguration>());
ElementConfiguration fieldConf2 = objectConfigurationFactory.createPrimitiveConfiguration(Integer
.toString(10000 + i));
configurationA.getFields().put("property2", fieldConf2);
fieldConfList.getListConfiguration().add(configurationA);
}
Object objectD = reflectionInstantiator.instanciateObject(configurationD, Object.class, instantationContext);
assertNotNull(objectD);
assertTrue(objectD instanceof TestClassD);
TestClassD classD = (TestClassD) objectD;
assertNotNull(classD.getListClassA());
assertEquals(10, classD.getListClassA().size());
for (int idx = 0; idx < classD.getListClassA().size(); idx++)
{
assertEquals(10000 + idx, classD.getListClassA().get(idx).getProperty2());
}
}
@Test
public void testClassA_NonSingleton()
{
ObjectConfiguration configuration = objectConfigurationFactory.createObjectConfiguration();
configuration.setSingleton(false);
configuration.setClassName(TestClassA.class.getName());
configuration.setFields(new HashMap<String, ElementConfiguration>());
PrimitiveConfiguration fieldConf1 = objectConfigurationFactory
.createPrimitiveConfiguration("Value for property1");
configuration.getFields().put("property1", fieldConf1);
ElementConfiguration fieldConf2 = objectConfigurationFactory.createPrimitiveConfiguration("82377");
configuration.getFields().put("property2", fieldConf2);
ObjectConfigurationMap configurationMap = objectConfigurationFactory.createObjectConfigurationMap();
String objectName = "myClassA";
configurationMap.put(objectName, configuration);
instantationContext.setSharedObjectConfigurations(configurationMap);
assertNull("Object shall not exist !", instantationContext.getSharedObject(objectName));
Object objectA = reflectionInstantiator.instanciateObject(objectName, Object.class, instantationContext);
assertNotNull("Object shall not be null !", objectA);
Object objectA2 = reflectionInstantiator.instanciateObject(objectName, Object.class, instantationContext);
assertNotSame(objectA, objectA2);
}
@Test
public void testClassA_Singleton()
{
ObjectConfiguration configuration = objectConfigurationFactory.createObjectConfiguration();
configuration.setSingleton(true);
configuration.setClassName(TestClassA.class.getName());
configuration.setFields(new HashMap<String, ElementConfiguration>());
ElementConfiguration fieldConf1 = objectConfigurationFactory
.createPrimitiveConfiguration("Value for property1");
configuration.getFields().put("property1", fieldConf1);
ElementConfiguration fieldConf2 = objectConfigurationFactory.createPrimitiveConfiguration("82377");
configuration.getFields().put("property2", fieldConf2);
ObjectConfigurationMap configurationMap = objectConfigurationFactory.createObjectConfigurationMap();
String objectName = "myClassA";
configurationMap.put(objectName, configuration);
instantationContext.setSharedObjectConfigurations(configurationMap);
assertNull("Object shall not exist !", instantationContext.getSharedObject(objectName));
Object objectA = reflectionInstantiator.instanciateObject(objectName, Object.class, instantationContext);
assertNotNull("Object shall not be null !", objectA);
Object objectA2 = reflectionInstantiator.instanciateObject(objectName, Object.class, instantationContext);
assertEquals(objectA, objectA2);
/**
* Now check that we are really dealing with the same objects
*/
TestClassA tca = (TestClassA) objectA;
TestClassA tca2 = (TestClassA) objectA2;
tca.setProperty2(99976);
assertEquals(tca.getProperty2(), tca2.getProperty2());
}
@Test
public void testClassB_Reference_To_ClassA()
{
ObjectConfiguration configurationA = objectConfigurationFactory.createObjectConfiguration();
configurationA.setSingleton(true);
configurationA.setClassName(TestClassA.class.getName());
configurationA.setFields(new HashMap<String, ElementConfiguration>());
ElementConfiguration fieldConf1 = objectConfigurationFactory
.createPrimitiveConfiguration("Referenced value from TestClassA");
configurationA.getFields().put("property1", fieldConf1);
ElementConfiguration fieldConf2 = objectConfigurationFactory.createPrimitiveConfiguration("777802");
configurationA.getFields().put("property2", fieldConf2);
ObjectConfigurationMap configurationMap = objectConfigurationFactory.createObjectConfigurationMap();
String objectName = "myClassA";
configurationMap.put(objectName, configurationA);
instantationContext.addSharedObjectConfigurations(configurationMap);
ObjectConfiguration configurationB = objectConfigurationFactory.createObjectConfiguration();
configurationB.setClassName(TestClassB.class.getName());
configurationB.setFields(new HashMap<String, ElementConfiguration>());
ReferenceConfiguration referenceClassA = objectConfigurationFactory.createReferenceConfiguration();
referenceClassA.setReferenceName(objectName);
configurationB.getFields().put("nestedClassA", referenceClassA);
Object objectB = reflectionInstantiator.instanciateObject(configurationB, Object.class, instantationContext);
assertNotNull(objectB);
assertTrue(objectB instanceof TestClassB);
TestClassB classB = (TestClassB) objectB;
assertNotNull(classB.getNestedClassA());
TestClassA classA = classB.getNestedClassA();
assertEquals("Referenced value from TestClassA", classA.getProperty1());
assertEquals(777802, classA.getProperty2());
}
@Test
public void instantiateMap()
{
MapConfiguration mapConfiguration = objectConfigurationFactory.createMapConfiguration();
mapConfiguration.setMapConfiguration(new HashMap<ElementConfiguration, ElementConfiguration>());
mapConfiguration.getMapConfiguration().put(objectConfigurationFactory.createPrimitiveConfiguration("key1"),
objectConfigurationFactory.createPrimitiveConfiguration("value1"));
mapConfiguration.getMapConfiguration().put(objectConfigurationFactory.createPrimitiveConfiguration("key2"),
objectConfigurationFactory.createPrimitiveConfiguration("value2"));
ObjectConfiguration configurationE = objectConfigurationFactory.createObjectConfiguration();
configurationE.setClassName(TestClassE.class.getName());
configurationE.setFields(new HashMap<String, ElementConfiguration>());
configurationE.getFields().put("mapOfStrings", mapConfiguration);
TestClassE objectE = reflectionInstantiator.instanciateObject(configurationE, TestClassE.class,
instantationContext);
assertNotNull(objectE);
assertNotNull(objectE.getMapOfStrings());
assertEquals(2, objectE.getMapOfStrings().size());
assertEquals("value1", objectE.getMapOfStrings().get("key1"));
assertEquals("value2", objectE.getMapOfStrings().get("key2"));
}
}