package org.ebayopensource.turmeric.tools.codegen.proto; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.ebayopensource.turmeric.tools.codegen.CodeGenContext; import org.ebayopensource.turmeric.tools.codegen.ServiceGenerator; import org.ebayopensource.turmeric.tools.codegen.builders.BaseCodeGenerator; import org.ebayopensource.turmeric.tools.codegen.exception.CodeGenFailedException; import org.ebayopensource.turmeric.tools.codegen.util.CodeGenUtil; public class BaseEprotoGeneratorTest { protected void compileGeneratedEProtos(CodeGenContext context, String eprotoName) throws Exception{ BaseCodeGenerator.compileJavaFile(CodeGenUtil.toJavaSrcFilePath( context.getJavaSrcDestLocation(), eprotoName), context.getBinLocation()); } protected void compileMultipleGeneratedEProtos(CodeGenContext context) throws Exception{ List<String> files = new ArrayList<String>(); CodeGenUtil.addAllFiles(new File(context.getJavaSrcDestLocation()), files); for (String fileName : files) { BaseCodeGenerator.compileJavaFile(fileName, context.getBinLocation()); } } protected CodeGenContext getCodeGenContext(String[] args) throws Exception{ getToolsJar(this.getClass().getClassLoader()); return ProtobufSchemaMapperTestUtils.getCodeGenContext(args); } /** * Returns a class loader that can load classes from JDK tools.jar. * * @param parentClassLoader */ protected static void getToolsJar(ClassLoader parentClassLoader) throws CodeGenFailedException { try { Class.forName("com.sun.tools.javac.Main", false, parentClassLoader); Class.forName("com.sun.tools.apt.Main", false, parentClassLoader); return; } catch (ClassNotFoundException e) { } File toolsJar = null; boolean toolsJarFound = false; String jdkHome = null; if (!CodeGenUtil.isEmptyString(ServiceGenerator.s_JdkHome)) { jdkHome = ServiceGenerator.s_JdkHome; } else jdkHome = System.getenv("JDK_HOME"); if (jdkHome != null) { toolsJar = new File(jdkHome, "lib/tools.jar"); if (toolsJar.exists()) toolsJarFound = true; } if (toolsJarFound == false) { String javaHomeStr = System.getProperty("java.home"); File jreHome = new File(javaHomeStr); toolsJar = new File(jreHome.getParent(), "lib/tools.jar"); if (!toolsJar.exists()) { if (javaHomeStr.indexOf("jre") > 0 || javaHomeStr.indexOf("JRE") > 0) { if (javaHomeStr.endsWith("/")) { javaHomeStr = javaHomeStr + "../"; } else { javaHomeStr = javaHomeStr + "/../"; } jreHome = new File(javaHomeStr); toolsJar = new File(jreHome.getParent(), "lib/tools.jar"); } if (!toolsJar.exists()) { String exceptionMsg = "JdkHome used for loading tools.jar is:"+ jdkHome + " \n JavaHome used is : "+ javaHomeStr; throw new CodeGenFailedException(exceptionMsg + " Failed to load tools.jar with these values."); } } } try { addURL(toolsJar.toURL()); } catch (Exception e) {} } protected static void addURL(URL u) throws IOException { final Logger logger = Logger.getLogger(""); Class[] parameters = new Class[]{URL.class}; URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class sysclass = URLClassLoader.class; try { Method method = sysclass.getDeclaredMethod("addURL", parameters); method.setAccessible(true); method.invoke(sysloader, new Object[]{u}); } catch (Throwable t) { throw new IOException("Error, could not add URL to system classloader", t); } } }