package com.arondor.common.reflection.noreflect.instantiator;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import com.arondor.common.reflection.noreflect.model.FieldSetter;
import com.arondor.common.reflection.noreflect.model.ObjectConstructor;
import com.arondor.common.reflection.noreflect.model.ReflectionInstantiatorCatalog;
import com.arondor.common.reflection.noreflect.runtime.SimpleReflectionInstantiatorCatalog;
import com.arondor.common.reflection.noreflect.testclasses.TestAbstractParent;
import com.arondor.common.reflection.noreflect.testclasses.TestChildClass;
import com.arondor.common.reflection.noreflect.testclasses.TestChildWithAbstractParent;
import com.arondor.common.reflection.noreflect.testclasses.TestClassA;
import com.arondor.common.reflection.noreflect.testclasses.TestClassB;
import com.arondor.common.reflection.noreflect.testclasses.TestClassC;
import com.arondor.common.reflection.noreflect.testclasses.TestClassC.EnumValue;
import com.arondor.common.reflection.noreflect.testclasses.TestClassD;
import com.arondor.common.reflection.noreflect.testclasses.TestClassE;
import com.arondor.common.reflection.noreflect.testclasses.TestGrandChildClass;
import com.arondor.common.reflection.noreflect.testclasses.TestNestedClass;
import com.arondor.common.reflection.noreflect.testclasses.TestParentClass;
public class TestReflectionInstantiatorNoReflect extends TestNoReflectSharedTests
{
@Before
public void setup() throws InstantiationException, IllegalAccessException, NoSuchMethodException,
SecurityException, IllegalArgumentException, InvocationTargetException
{
ReflectionInstantiatorCatalog catalog = new SimpleReflectionInstantiatorCatalog();
catalog.registerObjectConstructor(TestClassA.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
if (arguments.isEmpty())
{
return new com.arondor.common.reflection.noreflect.testclasses.TestClassA();
}
else if (arguments.size() == 1)
{
return new com.arondor.common.reflection.noreflect.testclasses.TestClassA((String) arguments.get(0));
}
else if (arguments.size() == 2)
{
return new com.arondor.common.reflection.noreflect.testclasses.TestClassA(
(String) arguments.get(0), Long.parseLong((String) arguments.get(1)));
}
throw new IllegalArgumentException("Count ?" + arguments.size());
}
});
catalog.registerFieldSetter(TestClassA.class.getName(), "property1", new FieldSetter()
{
@Override
public void set(Object object, Object value)
{
((TestClassA) object).setProperty1((String) value);
}
});
catalog.registerFieldSetter(TestClassA.class.getName(), "property2", new FieldSetter()
{
@Override
public void set(Object object, Object value)
{
((TestClassA) object).setProperty2(Long.parseLong((String) value));
}
});
catalog.registerObjectConstructor(TestClassB.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
return new com.arondor.common.reflection.noreflect.testclasses.TestClassB();
}
});
catalog.registerFieldSetter(TestClassB.class.getName(), "nestedClassA", new FieldSetter()
{
@Override
public void set(Object object, Object value)
{
((TestClassB) object).setNestedClassA((TestClassA) value);
}
});
catalog.registerObjectConstructor(TestClassC.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
if (arguments.isEmpty())
{
return new TestClassC();
}
else if (arguments.size() == 1)
{
return new TestClassC((EnumValue) arguments.get(0));
}
throw new IllegalArgumentException("Count ?" + arguments.size());
}
});
catalog.registerFieldSetter(TestClassC.class.getName(), "enumValue", new FieldSetter()
{
@Override
public void set(Object object, Object value)
{
((TestClassC) object).setEnumValue((EnumValue) value);
}
});
catalog.registerObjectConstructor(EnumValue.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
if (arguments.size() != 1)
{
throw new IllegalArgumentException("Count ?" + arguments.size());
}
return EnumValue.valueOf((String) arguments.get(0));
}
});
catalog.registerObjectConstructor(TestClassD.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
return new TestClassD();
}
});
catalog.registerFieldSetter(TestClassD.class.getName(), "listClassA", new FieldSetter()
{
@Override
@SuppressWarnings("unchecked")
public void set(Object object, Object value)
{
((TestClassD) object).setListClassA((List<TestClassA>) value);
}
});
catalog.registerObjectConstructor(TestClassE.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
return new TestClassE();
}
});
catalog.registerFieldSetter(TestClassE.class.getName(), "mapClassA", new FieldSetter()
{
@Override
@SuppressWarnings("unchecked")
public void set(Object object, Object value)
{
((TestClassE) object).setMapClassA((Map<String, TestClassA>) value);
}
});
catalog.registerObjectConstructor(TestChildClass.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
return new TestChildClass();
}
});
catalog.registerFieldSetter(TestParentClass.class.getName(), "parentField", new FieldSetter()
{
@Override
public void set(Object object, Object value)
{
((TestParentClass) object).setParentField((String) value);
}
});
catalog.registerFieldSetter(TestChildClass.class.getName(), "childField", new FieldSetter()
{
@Override
public void set(Object object, Object value)
{
((TestChildClass) object).setChildField((String) value);
}
});
String childClassInheritance[] = { TestParentClass.class.getName() };
catalog.registerObjectInheritance(TestChildClass.class.getName(), childClassInheritance);
String grandChildClassInheritance[] = { TestChildClass.class.getName() };
catalog.registerObjectInheritance(TestGrandChildClass.class.getName(), grandChildClassInheritance);
catalog.registerObjectConstructor(TestGrandChildClass.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
return new TestGrandChildClass();
}
});
catalog.registerFieldSetter(TestAbstractParent.class.getName(), "abstractField", new FieldSetter()
{
@Override
public void set(Object object, Object value)
{
((TestAbstractParent) object).setAbstractField((String) value);
}
});
catalog.registerObjectConstructor(TestChildWithAbstractParent.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
return new TestChildWithAbstractParent();
}
});
String childAbstractInheritance[] = { TestAbstractParent.class.getName() };
catalog.registerObjectInheritance(TestChildWithAbstractParent.class.getName(), childAbstractInheritance);
catalog.registerObjectConstructor(TestNestedClass.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
return new TestNestedClass();
}
});
catalog.registerObjectConstructor(TestNestedClass.EmbeddedClass.class.getName(), new ObjectConstructor()
{
@Override
public Object create(List<Object> arguments)
{
return new TestNestedClass.EmbeddedClass();
}
});
catalog.registerFieldSetter(TestNestedClass.class.getName(), "embeddedClass", new FieldSetter()
{
@Override
public void set(Object object, Object value)
{
((TestNestedClass) object).setEmbeddedClass((TestNestedClass.EmbeddedClass) value);
}
});
catalog.registerFieldSetter(TestNestedClass.EmbeddedClass.class.getName(), "fieldInEmbedded", new FieldSetter()
{
@Override
public void set(Object object, Object value)
{
((TestNestedClass.EmbeddedClass) object).setFieldInEmbedded((String) value);
}
});
ReflectionInstantiatorNoReflect reflectionInstantiator = new ReflectionInstantiatorNoReflect();
reflectionInstantiator.setReflectionInstantiatorCatalog(catalog);
this.reflectionInstantiator = reflectionInstantiator;
this.instantationContext = reflectionInstantiator.createDefaultInstantiationContext();
}
}