private void generateJavaCode()

in jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodeGenerationSupport.java [152:228]


    private void generateJavaCode(KogitoWorkflowProcess process) throws IOException {
        ProcessMetaData metadata = processCodeGenerator.generate(process);
        ModelMetaData modelMetadata = processCodeGenerator.generateModel(process);
        ModelMetaData inputMdelMetadata = processCodeGenerator.generateInputModel(process);
        ModelMetaData outputModelMetadata = processCodeGenerator.generateOutputModel(process);

        // process
        CompilationUnit processUnit = metadata.getGeneratedClassModel();
        addMembers(metadata, processUnit);

        RuleFlowProcess ruleFlowProcess = (RuleFlowProcess) process;
        for (String importClass : ruleFlowProcess.getImports()) {
            processUnit.addImport(importClass);
        }

        ClassOrInterfaceDeclaration processType = processUnit.findFirst(ClassOrInterfaceDeclaration.class).get();
        ClassOrInterfaceType modelType = StaticJavaParser.parseClassOrInterfaceType(modelMetadata.getModelClassName());
        processType.getExtendedTypes(0).setTypeArguments(modelType);
        processType.findAll(ObjectCreationExpr.class, e -> "BpmnProcessInstance".equals(e.getType().getNameAsString())).forEach(e -> e.setType(processType.getNameAsString() + "Instance"));
        processType.findAll(ObjectCreationExpr.class, e -> "ThisIsJustTemplate".equals(e.getType().getNameAsString())).forEach(e -> e.setType(processType.getNameAsString()));
        processType.findAll(ObjectCreationExpr.class, e -> "BpmnVariables".equals(e.getType().getNameAsString())).forEach(e -> e.setType(modelType.getNameAsString()));
        processType.findAll(VariableDeclarationExpr.class, e -> "BpmnVariables".equals(e.getVariable(0).getTypeAsString())).forEach(e -> {
            if (e.getVariables().isNonEmpty()) {
                e.getVariable(0).setType(modelType.getNameWithScope());
            }
        });
        processType.findAll(MethodDeclaration.class, TreeTraversal.DIRECT_CHILDREN).forEach(e -> {
            if ("BpmnVariables".equals(e.getTypeAsString())) {
                e.setType(modelType);
            }
            e.getParameterByType("BpmnVariables").ifPresent(t -> t.setType(modelType));

            if (!(e.getType() instanceof ClassOrInterfaceType)) {
                return;
            }

            ClassOrInterfaceType returnType = (ClassOrInterfaceType) e.getType();
            if ("org.kie.kogito.process.Process".equals(returnType.getNameWithScope())) {
                returnType.setTypeArguments(modelType);
            } else if ("ProcessInstance".equals(returnType.getNameAsString())) {
                returnType.setTypeArguments(modelType);
            }

        });
        processType.findAll(ConstructorDeclaration.class).forEach(e -> {
            e.setName(processType.getNameAsString());
        });

        // process instance
        CompilationUnit instance = StaticJavaParser.parse(TemplateHelper.findTemplate("ModelProcessInstance.java"));
        instance.setPackageDeclaration(processUnit.getPackageDeclaration().get());
        ClassOrInterfaceDeclaration instanceType = instance.findFirst(ClassOrInterfaceDeclaration.class).get();
        instanceType.getExtendedTypes(0).setTypeArguments(modelType);
        instanceType.findAll(ClassOrInterfaceType.class, e -> "AbstractProcess".equals(e.getNameAsString())).forEach(e -> e.setTypeArguments(modelType));
        instanceType.setName(processType.getNameAsString() + "Instance");
        instanceType.findAll(ConstructorDeclaration.class).forEach(e -> {
            e.setName(instanceType.getNameAsString());
            e.getParameterByType("BpmnVariables").ifPresent(t -> t.setType(modelType));

        });
        instanceType.findAll(MethodDeclaration.class, TreeTraversal.DIRECT_CHILDREN).forEach(e -> {
            if ("BpmnVariables".equals(e.getTypeAsString())) {
                e.setType(modelType);
            }
            e.getParameterByType("BpmnVariables").ifPresent(t -> t.setType(modelType));
        });

        // write to disk
        writeCompilationUnit(processUnit);
        writeCompilationUnit(instance);
        writeCompilationUnit(modelMetadata.generateUnit());
        writeCompilationUnit(inputMdelMetadata.generateUnit());
        writeCompilationUnit(outputModelMetadata.generateUnit());
        for (CompilationUnit handler : metadata.getGeneratedHandlers().values()) {
            writeCompilationUnit(handler);
        }
    }