All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
io.baltoro.ep.EPCompiler Maven / Gradle / Ivy
package io.baltoro.ep;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
final class EPCompiler
{
private javax.tools.JavaCompiler tool;
private StandardJavaFileManager stdManager;
public EPCompiler()
{
tool = ToolProvider.getSystemJavaCompiler();
if (tool == null)
{
throw new RuntimeException("Could not get Java compiler. Please, ensure that JDK is used instead of JRE.");
}
stdManager = tool.getStandardFileManager(null, null, null);
}
/**
* Compile a single static method.
*/
/*
public Class compileStaticMethod(final String methodName, final String className, final String source)
throws ClassNotFoundException
{
final Map classBytes = compile(className + ".java", source);
final EPClassLoader classLoader = new EPClassLoader(classBytes);
final Class clazz = classLoader.loadClass(className);
return clazz;
final Method[] methods = clazz.getDeclaredMethods();
for (final Method method : methods)
{
if (method.getName().equals(methodName))
{
if (!method.isAccessible())
method.setAccessible(true);
return method;
}
}
throw new NoSuchMethodError(methodName);
}
*/
public Class> compileClass(String packageName, String className, final String source)
throws ClassNotFoundException
{
final Map classBytes = compile(className + ".java", source);
byte[] bytes = classBytes.get(packageName+"."+className);
for(String key:classBytes.keySet())
{
System.err.println("key ===> "+key+", "+className);
}
System.out.println(bytes.length);
//final EPClassLoader classLoader = new EPClassLoader(classBytes);
final BytesClassLoader classLoader = new BytesClassLoader();
Class> clazz = classLoader.loadThisClass(packageName+"."+className,bytes);
//Class> clazz = Class.forName("io.baltoro.ep.TestEndpointCall1Impl");
//Class> clazz = classLoader.loadClass(packageName+"."+className);
System.out.println("class -- "+clazz);
//clazz = Class.forName(packageName+"."+className);
//this.getClass().getClassLoader().
return clazz;
}
private Map compile(String fileName, String source)
{
return compile(fileName, source, new PrintWriter(System.err), null, null);
}
/**
* compile given String source and return bytecodes as a Map.
*
* @param fileName
* source fileName to be used for error messages etc.
* @param source
* Java source as String
* @param err
* error writer where diagnostic messages are written
* @param sourcePath
* location of additional .java source files
* @param classPath
* location of additional .class files
*/
private Map compile(String fileName, String source, Writer err, String sourcePath, String classPath)
{
// to collect errors, warnings etc.
//DiagnosticCollector diagnostics = new DiagnosticCollector();
// create a new memory JavaFileManager
EPFileManager fileManager = new EPFileManager(stdManager);
// prepare the compilation unit
List compUnits = new ArrayList(1);
compUnits.add(EPFileManager.makeStringSource(fileName, source));
return compile(compUnits, fileManager, err, sourcePath, classPath);
}
private Map compile(final List compUnits, final EPFileManager fileManager,
Writer err, String sourcePath, String classPath)
{
// to collect errors, warnings etc.
DiagnosticCollector diagnostics = new DiagnosticCollector();
// javac options
List options = new ArrayList();
options.add("-Xlint:all");
// options.add("-g:none");
options.add("-deprecation");
if (sourcePath != null)
{
options.add("-sourcepath");
options.add(sourcePath);
}
if (classPath != null)
{
options.add("-classpath");
options.add(classPath);
}
// create a compilation task
javax.tools.JavaCompiler.CompilationTask task = tool.getTask(err, fileManager, diagnostics, options, null,
compUnits);
if (task.call() == false)
{
PrintWriter perr = new PrintWriter(err);
for (Diagnostic extends JavaFileObject> diagnostic : diagnostics.getDiagnostics())
{
perr.println(diagnostic);
}
perr.flush();
return null;
}
Map classBytes = fileManager.getClassBytes();
try
{
fileManager.close();
} catch (IOException exp)
{
}
return classBytes;
}
}