package com.arondor.common.reflection.noreflect.instantiator; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.junit.Before; import com.arondor.common.reflection.model.java.AccessibleClass; import com.arondor.common.reflection.noreflect.generator.NoReflectRegistrarGenerator; import com.arondor.common.reflection.noreflect.model.AsyncPackages; import com.arondor.common.reflection.noreflect.model.ReflectionInstantiatorCatalog; import com.arondor.common.reflection.noreflect.model.ReflectionInstantiatorRegistrar; 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.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; import com.arondor.common.reflection.parser.java.JavaAccessibleClassParser; public class TestNoReflectRegistrarGenerator extends TestNoReflectSharedTests { private final static Logger LOG = Logger.getLogger(TestNoReflectRegistrarGenerator.class); private void doGenerate() throws FileNotFoundException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException { parser = new JavaAccessibleClassParser(); List<AccessibleClass> classes = new ArrayList<AccessibleClass>(); classes.add(parser.parseAccessibleClass(TestClassA.class)); classes.add(parser.parseAccessibleClass(TestClassB.class)); classes.add(parser.parseAccessibleClass(TestClassC.class)); classes.add(parser.parseAccessibleClass(TestClassC.EnumValue.class)); classes.add(parser.parseAccessibleClass(TestClassD.class)); classes.add(parser.parseAccessibleClass(TestClassE.class)); classes.add(parser.parseAccessibleClass(TestParentClass.class)); classes.add(parser.parseAccessibleClass(TestChildClass.class)); classes.add(parser.parseAccessibleClass(TestGrandChildClass.class)); classes.add(parser.parseAccessibleClass(TestAbstractParent.class)); classes.add(parser.parseAccessibleClass(TestChildWithAbstractParent.class)); classes.add(parser.parseAccessibleClass(TestNestedClass.class)); classes.add(parser.parseAccessibleClass(TestNestedClass.EmbeddedClass.class)); AsyncPackages asyncPackages = new AsyncPackages(); NoReflectRegistrarGenerator gen = new NoReflectRegistrarGenerator(); gen.setAccessibleClassParser(parser); String packageName = "testing_"; String className = "AutoGen" + (int) (Math.random() * 10000); gen.setPackageName(packageName); gen.setClassName(className); // String path = "src/test/java/testing/" + .java"; new File("target/" + packageName).mkdir(); String path = "target/" + packageName + "/" + className + ".java"; String completeClassName = packageName + "." + className; OutputStream os = new FileOutputStream(path); PrintStream out = new PrintStream(os); gen.generate(out, classes, asyncPackages); out.close(); Class<?> clazz = runtimeCompileAndLoadClass(path, completeClassName); ReflectionInstantiatorRegistrar registrar = (ReflectionInstantiatorRegistrar) clazz.newInstance(); ReflectionInstantiatorCatalog catalog = new SimpleReflectionInstantiatorCatalog(); registrar.register(catalog); ReflectionInstantiatorNoReflect noReflect = new ReflectionInstantiatorNoReflect(); noReflect.setReflectionInstantiatorCatalog(catalog); this.reflectionInstantiator = noReflect; this.instantationContext = noReflect.createDefaultInstantiationContext(); } private Class<?> runtimeCompileAndLoadClass(String path, String completeClassName) throws ClassNotFoundException { @SuppressWarnings("restriction") javax.tools.JavaCompiler javaCompiler = javax.tools.ToolProvider.getSystemJavaCompiler(); @SuppressWarnings("restriction") int result = javaCompiler.run(null, null, null, "-Xlint:unchecked", "-d", "target/classes/", path); LOG.info("Compile result : " + result); @SuppressWarnings("restriction") ClassLoader classLoader = javax.tools.ToolProvider.getSystemToolClassLoader(); Class<?> clazz = classLoader.loadClass(completeClassName); LOG.info("Loaded class : " + clazz.getName()); return clazz; } @Before public void initialize() throws FileNotFoundException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException { doGenerate(); } }