package com.arondor.common.reflection.parser.java; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.junit.Assert; import org.junit.Test; import com.arondor.common.management.mbean.annotation.Description; import com.arondor.common.management.mbean.annotation.Mandatory; import com.arondor.common.reflection.api.parser.AccessibleClassParser; import com.arondor.common.reflection.model.java.AccessibleClass; import com.arondor.common.reflection.model.java.AccessibleField; import com.arondor.common.reflection.model.java.AccessibleMethod; public class TestJavaAccessibleClassParser { private static final Logger log = Logger.getLogger(TestJavaAccessibleClassParser.class); public static class SimpleClass { @Description("Dummy map") private Map<String, Long> map; public void setMap(Map<String, Long> map) { this.map = map; } public Map<String, Long> getMap() { return map; } public void myLittleMethod(String truff) { } } @Test public void testSimpleClass() { AccessibleClassParser parser = new JavaAccessibleClassParser(); AccessibleClass clazz = parser.parseAccessibleClass(SimpleClass.class); assertNotNull(clazz); assertFalse(clazz.isAbstract()); String className = clazz.getName(); assertEquals(SimpleClass.class.getName(), className); assertTrue("This inner class shall contain '$'", className.contains("$")); log.info("Class : " + clazz.getClassBaseName()); for (String fieldName : clazz.getAccessibleFields().keySet()) { AccessibleField field = clazz.getAccessibleFields().get(fieldName); log.info("* Field : " + fieldName + ", class=" + field.getClassName()); } assertEquals(1, clazz.getAccessibleFields().size()); AccessibleField field = clazz.getAccessibleFields().get("map"); assertNotNull(field); assertEquals("map", field.getName()); assertEquals("java.util.Map", field.getClassName()); assertEquals(2, field.getGenericParameterClassList().size()); assertEquals("java.lang.String", field.getGenericParameterClassList().get(0)); assertEquals("java.lang.Long", field.getGenericParameterClassList().get(1)); assertEquals("Dummy map", field.getDescription()); assertNotNull(clazz.getAccessibleMethods()); for (AccessibleMethod mth : clazz.getAccessibleMethods()) { log.info("Method : " + mth.getName()); } assertEquals(1, clazz.getAccessibleMethods().size()); assertEquals("myLittleMethod", clazz.getAccessibleMethods().get(0).getName()); } public static class ClassWithIncompatibleGetterAndSetter { private int field; public int getField() { return field; } public void setField(String value) { this.field = Integer.parseInt(value); } } @Test public void testClassWithIncompatibleGetterAndSetter() { AccessibleClassParser parser = new JavaAccessibleClassParser(); AccessibleClass clazz = parser.parseAccessibleClass(ClassWithIncompatibleGetterAndSetter.class); assertNotNull(clazz); log.info("Class : " + clazz.getClassBaseName()); assertEquals(1, clazz.getAccessibleFields().size()); AccessibleField field = clazz.getAccessibleFields().get("field"); assertNotNull(field); assertEquals(String.class.getName(), field.getClassName()); } public static class ClassWithStringList { private List<String> stringList; public List<String> getStringList() { return stringList; } public void setStringList(List<String> stringList) { this.stringList = stringList; } } @Test public void testClassWithStringList() { AccessibleClassParser parser = new JavaAccessibleClassParser(); AccessibleClass clazz = parser.parseAccessibleClass(ClassWithStringList.class); assertNotNull(clazz); log.info("Class : " + clazz.getClassBaseName()); assertEquals(1, clazz.getAccessibleFields().size()); AccessibleField field = clazz.getAccessibleFields().get("stringList"); assertNotNull(field); assertEquals(List.class.getName(), field.getClassName()); assertNotNull(field.getGenericParameterClassList()); assertEquals(1, field.getGenericParameterClassList().size()); assertEquals(String.class.getName(), field.getGenericParameterClassList().get(0)); } public static class ClassWithMapWithGenerics { public static class EmbeddedClass { } private Map<String, EmbeddedClass> myMap; public Map<String, EmbeddedClass> getMyMap() { return myMap; } public void setMyMap(Map<String, EmbeddedClass> myMap) { this.myMap = myMap; } } @Test public void testClassWithMapWithGenerics() { AccessibleClassParser parser = new JavaAccessibleClassParser(); AccessibleClass clazz = parser.parseAccessibleClass(ClassWithMapWithGenerics.class); assertNotNull(clazz); log.info("Class : " + clazz.getClassBaseName()); assertEquals(1, clazz.getAccessibleFields().size()); AccessibleField field = clazz.getAccessibleFields().get("myMap"); assertNotNull(field); assertEquals(Map.class.getName(), field.getClassName()); assertNotNull(field.getGenericParameterClassList()); assertEquals(2, field.getGenericParameterClassList().size()); assertEquals(String.class.getName(), field.getGenericParameterClassList().get(0)); assertEquals(ClassWithMapWithGenerics.EmbeddedClass.class.getName(), field.getGenericParameterClassList() .get(1)); } public static class ClassWhichIsParent { private String parentField; public String getParentField() { return parentField; } public void setParentField(String parentField) { this.parentField = parentField; } } public static class ClassWhichIsChild extends ClassWhichIsParent { private String childField; public String getChildField() { return childField; } public void setChildField(String childField) { this.childField = childField; } } @Test public void testFieldScope_Parent() { AccessibleClassParser parser = new JavaAccessibleClassParser(); AccessibleClass clazz = parser.parseAccessibleClass(ClassWhichIsParent.class); assertEquals(1, clazz.getAccessibleFields().size()); AccessibleField parentField = clazz.getAccessibleFields().get("parentField"); assertEquals(ClassWhichIsParent.class.getName(), parentField.getDeclaredInClass()); } @Test public void testFieldScope_Child() { AccessibleClassParser parser = new JavaAccessibleClassParser(); AccessibleClass clazz = parser.parseAccessibleClass(ClassWhichIsChild.class); assertEquals(2, clazz.getAccessibleFields().size()); AccessibleField parentField = clazz.getAccessibleFields().get("parentField"); assertEquals(ClassWhichIsParent.class.getName(), parentField.getDeclaredInClass()); AccessibleField childField = clazz.getAccessibleFields().get("childField"); assertEquals(ClassWhichIsChild.class.getName(), childField.getDeclaredInClass()); } public static abstract class AbstractClass { } @Test public void testAbstractClass() { AccessibleClassParser parser = new JavaAccessibleClassParser(); AccessibleClass clazz = parser.parseAccessibleClass(AbstractClass.class); assertTrue(clazz.isAbstract()); } public enum TestEnum { VALUE1("value1"), VALUE2("value2"); private String value; TestEnum(String value) { this.value = value; } String getValue() { return value; } } public static class ClassWithMandatoryField { @Mandatory private int myMandatoryField = 23; private int myNonMandatoryField; public TestEnum myEnumField; private String myDefaultValueString = "TestReflection"; private String myValueString; public ClassWithMandatoryField() { } public int getMyMandatoryField() { return myMandatoryField; } public void setMyMandatoryField(int myMandatoryField) { this.myMandatoryField = myMandatoryField; } public int getMyNonMandatoryField() { return myNonMandatoryField; } public void setMyNonMandatoryField(int myNonMandatoryField) { this.myNonMandatoryField = myNonMandatoryField; } public String getMyDefaultValueString() { return myDefaultValueString; } public void setMyDefaultValueString(String myDefaultValueString) { this.myDefaultValueString = myDefaultValueString; } public String getMyValueString() { return myValueString; } public void setMyValueString(String myValueString) { this.myValueString = myValueString; } public TestEnum getMyEnumField() { return myEnumField; } public void setMyEnumField(TestEnum myEnumField) { this.myEnumField = myEnumField; } } @Test public void testClassWithMandatoryField() { AccessibleClassParser parser = new JavaAccessibleClassParser(); AccessibleClass clazz = parser.parseAccessibleClass(ClassWithMandatoryField.class); AccessibleField mandatoryField = clazz.getAccessibleFields().get("myMandatoryField"); assertNotNull(mandatoryField); assertTrue(mandatoryField.isMandatory()); AccessibleField nonMandatoryField = clazz.getAccessibleFields().get("myNonMandatoryField"); assertNotNull(nonMandatoryField); assertFalse(nonMandatoryField.isMandatory()); } @Test public void testClassWithFieldDefaultValue() { JavaAccessibleClassParser parser = new JavaAccessibleClassParser(); parser.setTryInstantiateClassForDefaultValue(true); AccessibleClass clazz = parser.parseAccessibleClass(ClassWithMandatoryField.class); AccessibleField mandatoryField = clazz.getAccessibleFields().get("myMandatoryField"); assertNotNull(mandatoryField); assertEquals("23", mandatoryField.getDefaultValue()); AccessibleField nonMandatoryField = clazz.getAccessibleFields().get("myNonMandatoryField"); assertNotNull(nonMandatoryField); assertEquals("0", nonMandatoryField.getDefaultValue()); AccessibleField defaultStringField = clazz.getAccessibleFields().get("myDefaultValueString"); assertNotNull(defaultStringField); assertEquals("TestReflection", defaultStringField.getDefaultValue()); AccessibleField stringField = clazz.getAccessibleFields().get("myValueString"); assertNotNull(stringField); assertEquals(null, stringField.getDefaultValue()); } @Test public void testGetEnumList() throws ClassNotFoundException, NoSuchFieldException, SecurityException { JavaAccessibleClassParser parser = new JavaAccessibleClassParser(); AccessibleClass clazz = parser.parseAccessibleClass(ClassWithMandatoryField.class); AccessibleField myEnumField = clazz.getAccessibleFields().get("myEnumField"); assertNotNull(myEnumField); List<String> values = clazz.getAccessibleEnums().get(myEnumField.getClassName()); Assert.assertEquals(2, values.size()); Assert.assertTrue(values.contains(TestEnum.VALUE1.name())); Assert.assertTrue(values.contains("VALUE1")); Assert.assertTrue(values.contains(TestEnum.VALUE2.name())); Assert.assertTrue(values.contains("VALUE2")); } }