Search in sources :

Example 1 with JavaClass

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);
    }
}
Also used : LogInfo(org.finos.legend.engine.shared.core.operational.logs.LogInfo) EngineJavaCompiler(org.finos.legend.engine.shared.javaCompiler.EngineJavaCompiler) ErrorResult(org.finos.legend.engine.plan.execution.result.ErrorResult) InvocationTargetException(java.lang.reflect.InvocationTargetException) JavaClass(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass) JavaPlatformImplementation(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaPlatformImplementation) StringJavaSource(org.finos.legend.engine.shared.javaCompiler.StringJavaSource)

Example 2 with JavaClass

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;
}
Also used : JavaClass(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass) LoggingEventType(org.finos.legend.engine.shared.core.operational.logs.LoggingEventType) SingleFileCompiler(org.finos.legend.engine.shared.javaCompiler.SingleFileCompiler) CommonProfile(org.pac4j.core.profile.CommonProfile) ExecutionPlanDependenciesFilter(org.finos.legend.engine.plan.compilation.ExecutionPlanDependenciesFilter) ClassPathFilter(org.finos.legend.engine.shared.javaCompiler.ClassPathFilter) CompositeClassPathFilter(org.finos.legend.engine.shared.javaCompiler.CompositeClassPathFilter) MutableList(org.eclipse.collections.api.list.MutableList) FastList(org.eclipse.collections.impl.list.mutable.FastList) ArrayList(java.util.ArrayList) Maps(org.eclipse.collections.api.factory.Maps) CompileException(org.codehaus.commons.compiler.CompileException) Map(java.util.Map) ExecutionNode(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.ExecutionNode) JavaPlatformImplementation(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaPlatformImplementation) ErrorResult(org.finos.legend.engine.plan.execution.result.ErrorResult) UnifiedMap(org.eclipse.collections.impl.map.mutable.UnifiedMap) Logger(org.slf4j.Logger) EngineJavaCompiler(org.finos.legend.engine.shared.javaCompiler.EngineJavaCompiler) SingleExecutionPlan(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.SingleExecutionPlan) IOException(java.io.IOException) Collectors(java.util.stream.Collectors) LogInfo(org.finos.legend.engine.shared.core.operational.logs.LogInfo) JavaVersion(org.finos.legend.engine.shared.javaCompiler.JavaVersion) Base64(java.util.Base64) List(java.util.List) JavaCompileException(org.finos.legend.engine.shared.javaCompiler.JavaCompileException) Lists(org.eclipse.collections.impl.factory.Lists) StringJavaSource(org.finos.legend.engine.shared.javaCompiler.StringJavaSource) CompiledClass(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.CompiledClass) Collections(java.util.Collections) EngineJavaCompiler(org.finos.legend.engine.shared.javaCompiler.EngineJavaCompiler) ArrayList(java.util.ArrayList) JavaClass(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass) JavaPlatformImplementation(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaPlatformImplementation) MutableList(org.eclipse.collections.api.list.MutableList) FastList(org.eclipse.collections.impl.list.mutable.FastList) ArrayList(java.util.ArrayList) List(java.util.List)

Example 3 with JavaClass

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;
        });
    }
}
Also used : JavaClass(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass) LoggingEventType(org.finos.legend.engine.shared.core.operational.logs.LoggingEventType) SingleFileCompiler(org.finos.legend.engine.shared.javaCompiler.SingleFileCompiler) CommonProfile(org.pac4j.core.profile.CommonProfile) ExecutionPlanDependenciesFilter(org.finos.legend.engine.plan.compilation.ExecutionPlanDependenciesFilter) ClassPathFilter(org.finos.legend.engine.shared.javaCompiler.ClassPathFilter) CompositeClassPathFilter(org.finos.legend.engine.shared.javaCompiler.CompositeClassPathFilter) MutableList(org.eclipse.collections.api.list.MutableList) FastList(org.eclipse.collections.impl.list.mutable.FastList) ArrayList(java.util.ArrayList) Maps(org.eclipse.collections.api.factory.Maps) CompileException(org.codehaus.commons.compiler.CompileException) Map(java.util.Map) ExecutionNode(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.ExecutionNode) JavaPlatformImplementation(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaPlatformImplementation) ErrorResult(org.finos.legend.engine.plan.execution.result.ErrorResult) UnifiedMap(org.eclipse.collections.impl.map.mutable.UnifiedMap) Logger(org.slf4j.Logger) EngineJavaCompiler(org.finos.legend.engine.shared.javaCompiler.EngineJavaCompiler) SingleExecutionPlan(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.SingleExecutionPlan) IOException(java.io.IOException) Collectors(java.util.stream.Collectors) LogInfo(org.finos.legend.engine.shared.core.operational.logs.LogInfo) JavaVersion(org.finos.legend.engine.shared.javaCompiler.JavaVersion) Base64(java.util.Base64) List(java.util.List) JavaCompileException(org.finos.legend.engine.shared.javaCompiler.JavaCompileException) Lists(org.eclipse.collections.impl.factory.Lists) StringJavaSource(org.finos.legend.engine.shared.javaCompiler.StringJavaSource) CompiledClass(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.CompiledClass) Collections(java.util.Collections) JavaClass(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass)

Example 4 with JavaClass

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;
}
Also used : JavaClass(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass)

Example 5 with 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;
}
Also used : JavaClass(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass)

Aggregations

JavaClass (org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaClass)7 JavaPlatformImplementation (org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.JavaPlatformImplementation)4 ErrorResult (org.finos.legend.engine.plan.execution.result.ErrorResult)3 CompiledClass (org.finos.legend.engine.protocol.pure.v1.model.executionPlan.nodes.CompiledClass)3 LogInfo (org.finos.legend.engine.shared.core.operational.logs.LogInfo)3 EngineJavaCompiler (org.finos.legend.engine.shared.javaCompiler.EngineJavaCompiler)3 StringJavaSource (org.finos.legend.engine.shared.javaCompiler.StringJavaSource)3 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 Base64 (java.util.Base64)2 Collections (java.util.Collections)2 List (java.util.List)2 Map (java.util.Map)2 Collectors (java.util.stream.Collectors)2 CompileException (org.codehaus.commons.compiler.CompileException)2 Maps (org.eclipse.collections.api.factory.Maps)2 MutableList (org.eclipse.collections.api.list.MutableList)2 Lists (org.eclipse.collections.impl.factory.Lists)2 FastList (org.eclipse.collections.impl.list.mutable.FastList)2 UnifiedMap (org.eclipse.collections.impl.map.mutable.UnifiedMap)2