use of org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass in project legend-engine by finos.
the class ExecutionNodeJavaPlatformHelper method getClassToExecute.
public static Class<?> getClassToExecute(ExecutionNode node, String _class, ExecutionState executionState, MutableList<CommonProfile> pm) {
if (executionState.isJavaCompilationForbidden()) {
try {
return Thread.currentThread().getContextClassLoader().loadClass(_class);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
JavaPlatformImplementation j = (JavaPlatformImplementation) node.implementation;
List<JavaClass> javaClasses = FastList.newList();
if (j.code != null) {
JavaClass executeClass = JavaHelper.newJavaClass(JavaHelper.getExecutionClassFullName(j));
executeClass.source = j.code;
javaClasses.add(executeClass);
}
javaClasses.addAll(getLocalImplementationSupportClasses(node));
if (javaClasses.isEmpty()) {
ClassLoader classLoader = executionState.hasJavaCompiler() ? executionState.getJavaCompiler().getClassLoader() : Thread.currentThread().getContextClassLoader();
try {
return classLoader.loadClass(_class);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
try {
// TODO Confirm we can delete this
MutableMap<String, String> compiledClassesWithByteCode = getCompiledClasses(node);
List<StringJavaSource> classesToCompile = javaClasses.stream().filter(c -> !compiledClassesWithByteCode.containsKey(JavaHelper.getJavaClassFullName(c))).map(JavaHelper::buildStringJavaSource).collect(Collectors.toList());
EngineJavaCompiler compiler = new EngineJavaCompiler(executionState.getJavaCompiler());
long start = System.currentTimeMillis();
try {
if (!compiledClassesWithByteCode.isEmpty()) {
compiler.load(compiledClassesWithByteCode);
}
if (!classesToCompile.isEmpty()) {
LOGGER.info(new LogInfo(pm, LoggingEventType.JAVA_COMPILATION_START, "Node: " + node.getClass().getName()).toString());
compiler.compile(classesToCompile);
LOGGER.info(new LogInfo(pm, LoggingEventType.JAVA_COMPILATION_STOP, (double) System.currentTimeMillis() - start).toString());
}
} catch (Exception jce) {
LOGGER.info(new LogInfo(pm, LoggingEventType.JAVA_COMPILATION_ERROR, new ErrorResult(1, jce).getMessage()).toString());
throw jce;
}
return compiler.getClassLoader().loadClass(_class);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
use of org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass in project legend-engine by finos.
the class JavaHelper method compilePlanFast.
private static EngineJavaCompiler compilePlanFast(SingleExecutionPlan singleExecutionPlan) throws JavaCompileException, IOException, CompileException {
Map<JavaPlatformImplementation, List<JavaClass>> javaClassesMap = Maps.mutable.empty();
if (singleExecutionPlan.globalImplementationSupport != null) {
JavaPlatformImplementation platformImplementation = (JavaPlatformImplementation) singleExecutionPlan.globalImplementationSupport;
List<JavaClass> globalImplementationSupportClasses = collectJavaClasses(platformImplementation);
if (!globalImplementationSupportClasses.isEmpty()) {
javaClassesMap.put(platformImplementation, globalImplementationSupportClasses);
}
}
collectJavaClasses(singleExecutionPlan.rootExecutionNode, javaClassesMap);
if (javaClassesMap.isEmpty()) {
return null;
}
EngineJavaCompiler javaCompiler = createNewJavaCompiler();
Map<JavaClass, JavaPlatformImplementation> reverseClassMap = Maps.mutable.empty();
List<JavaClass> executeClasses = new ArrayList<>();
List<JavaClass> nonExecuteClasses = new ArrayList<>();
javaClassesMap.forEach((jimpl, jclasses) -> jclasses.forEach(jclass -> {
reverseClassMap.put(jclass, jimpl);
(javaClassHasFullName(jclass, jimpl.executionClassFullName) ? executeClasses : nonExecuteClasses).add(jclass);
}));
Map<String, JavaClass> classMap = nonExecuteClasses.stream().collect(Collectors.toMap(JavaHelper::getJavaClassFullName, x -> x, (x, y) -> {
throw new RuntimeException("Conflicting classes compilation in fast mode not supported!");
}));
Map<String, String> classToBytecodeMap = compileJavaClasses(nonExecuteClasses, javaCompiler);
classToBytecodeMap.forEach((name, bytecode) -> {
JavaClass _class = classMap.get(name);
if (_class == null) {
// Handling Inner Classes only
int firstDollar = name.indexOf('$');
if (firstDollar == -1) {
throw new RuntimeException("Non Inner classes are not supported yet!");
}
JavaClass topClass = classMap.get(name.substring(0, firstDollar));
JavaPlatformImplementation impl = reverseClassMap.get(topClass);
_class = createGeneratedJavaClass(name);
if (impl.classes == null) {
impl.classes = FastList.newListWith(_class);
} else {
impl.classes.add(_class);
}
}
_class.byteCode = bytecode;
});
ClassLoader globalClassLoader = javaCompiler.getClassLoader();
for (JavaClass executeClass : executeClasses) {
if (executeClass.byteCode == null) {
Map<String, byte[]> classes = SingleFileCompiler.compileFile(buildStringJavaSource(executeClass), globalClassLoader);
executeClass.byteCode = Base64.getEncoder().encodeToString(classes.get(getJavaClassFullName(executeClass)));
}
}
return javaCompiler;
}
use of org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass in project legend-engine by finos.
the class JavaHelper method compileImplementation.
private static void compileImplementation(JavaPlatformImplementation javaPlatformImplementation, EngineJavaCompiler javaCompiler) throws JavaCompileException {
List<JavaClass> allJavaClasses = collectJavaClasses(javaPlatformImplementation);
if (!allJavaClasses.isEmpty()) {
Map<String, String> classToBytecodeMap = compileJavaClasses(allJavaClasses, javaCompiler);
Map<String, JavaClass> classMap = allJavaClasses.stream().collect(Collectors.toMap(JavaHelper::getJavaClassFullName, x -> x));
classToBytecodeMap.forEach((name, bytecode) -> {
JavaClass _class = classMap.get(name);
if (_class == null) {
_class = createGeneratedJavaClass(name);
if (javaPlatformImplementation.classes == null) {
javaPlatformImplementation.classes = FastList.newListWith(_class);
} else {
javaPlatformImplementation.classes.add(_class);
}
}
_class.byteCode = bytecode;
});
}
}
use of org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass in project legend-engine by finos.
the class JavaHelper method newJavaClass.
public static JavaClass newJavaClass(String fullName) {
int lastDot = fullName.lastIndexOf('.');
JavaClass javaClass = new JavaClass();
javaClass._package = (lastDot == -1) ? "" : fullName.substring(0, lastDot);
javaClass.name = fullName.substring(lastDot + 1);
return javaClass;
}
use of org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass in project legend-engine by finos.
the class JavaHelper method createGeneratedJavaClass.
private static JavaClass createGeneratedJavaClass(String name) {
JavaClass _class = newJavaClass(name);
_class.source = "<<GENERATED>>";
return _class;
}
Aggregations