This is an automated email from the ASF dual-hosted git repository.

mweiler pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new 2f970d95de [incubator-kie-issues-2038] Imported classes are not 
supported as codegen works only with variables and globals and does not lookup 
for process imported classes (#3994)
2f970d95de is described below

commit 2f970d95de38569feb0e0de6f53e5a19864bab0e
Author: Enrique <[email protected]>
AuthorDate: Fri Aug 22 01:10:12 2025 +0200

    [incubator-kie-issues-2038] Imported classes are not supported as codegen 
works only with variables and globals and does not lookup for process imported 
classes (#3994)
    
    * [incubator-kie-issues-2038] Imported classes are not supported as codegen 
works only with variables and globals and does not lookup for process imported 
classes
    
    * fix imports
    
    * fix imports
    
    * Update JavaRuleFlowProcessValidator.java
---
 .../canonical/ProcessToExecModelGenerator.java     |  11 ++
 .../process/JavaRuleFlowProcessValidator.java      | 112 ++++++++++++++++++++-
 2 files changed, 120 insertions(+), 3 deletions(-)

diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessToExecModelGenerator.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessToExecModelGenerator.java
index 678c465733..ff607d3d2b 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessToExecModelGenerator.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessToExecModelGenerator.java
@@ -19,15 +19,18 @@
 package org.jbpm.compiler.canonical;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Optional;
+import java.util.Set;
 import java.util.function.Consumer;
 
 import org.drools.util.StringUtils;
 import org.jbpm.process.core.ContextContainer;
 import org.jbpm.process.core.context.variable.Variable;
 import org.jbpm.process.core.context.variable.VariableScope;
+import org.jbpm.ruleflow.core.RuleFlowProcess;
 import org.jbpm.workflow.core.impl.WorkflowProcessImpl;
 import org.jbpm.workflow.core.node.WorkItemNode;
 import org.kie.api.definition.process.Node;
@@ -36,6 +39,7 @@ import org.kie.kogito.ProcessInput;
 import org.kie.kogito.internal.process.runtime.KogitoWorkflowProcess;
 
 import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.ImportDeclaration;
 import com.github.javaparser.ast.Modifier;
 import com.github.javaparser.ast.NodeList;
 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
@@ -81,6 +85,13 @@ public class ProcessToExecModelGenerator {
 
     public ProcessMetaData generate(WorkflowProcess process) {
         CompilationUnit parsedClazzFile = 
parse(TemplateHelper.findTemplate(contextClassLoader, this.classTemplate));
+        if (process instanceof RuleFlowProcess ruleFlowProcess) {
+            List<String> currentImports = 
parsedClazzFile.getImports().stream().map(e -> e.getNameAsString()).toList();
+            Set<String> processImports = new 
HashSet<>(ruleFlowProcess.getImports());
+            processImports.removeAll(currentImports);
+            processImports.forEach(i -> parsedClazzFile.addImport(new 
ImportDeclaration(i, false, false)));
+        }
+
         parsedClazzFile.setPackageDeclaration(process.getPackageName());
         Optional<ClassOrInterfaceDeclaration> processClazzOptional = 
parsedClazzFile.findFirst(
                 ClassOrInterfaceDeclaration.class,
diff --git 
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/JavaRuleFlowProcessValidator.java
 
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/JavaRuleFlowProcessValidator.java
index 3679e7c90c..a83125d5d0 100755
--- 
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/JavaRuleFlowProcessValidator.java
+++ 
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/JavaRuleFlowProcessValidator.java
@@ -19,10 +19,12 @@
 package org.kie.kogito.codegen.process;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.jbpm.process.core.ContextContainer;
@@ -52,8 +54,18 @@ import com.github.javaparser.ast.stmt.BlockStmt;
 import com.github.javaparser.ast.visitor.VoidVisitor;
 import com.github.javaparser.printer.DefaultPrettyPrinterVisitor;
 import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration;
+import com.github.javaparser.resolution.MethodUsage;
 import com.github.javaparser.resolution.UnsolvedSymbolException;
+import 
com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedFieldDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
+import 
com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
+import 
com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.resolution.types.ResolvedType;
 import com.github.javaparser.symbolsolver.JavaSymbolSolver;
+import 
com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import 
com.github.javaparser.symbolsolver.resolution.typesolvers.MemoryTypeSolver;
 import 
com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
 
 import static java.lang.String.format;
@@ -90,12 +102,106 @@ class JavaRuleFlowProcessValidator extends 
RuleFlowProcessValidator {
 
     private void validateJava(ActionNode actionNode, 
List<ProcessValidationError> errors, RuleFlowProcess process) {
         DroolsConsequenceAction droolsAction = (DroolsConsequenceAction) 
actionNode.getAction();
-        ParseResult<CompilationUnit> parse = new JavaParser(new 
ParserConfiguration().setSymbolResolver(new JavaSymbolSolver(new 
ReflectionTypeSolver())))
-                .parse("import 
org.kie.kogito.internal.process.runtime.KogitoProcessContext;\n" +
+        String imports = process.getImports().stream().map(javaImport -> 
"import " + javaImport + ";").collect(Collectors.joining("\n"));
+
+        String dummyScript =
+                "import 
org.kie.kogito.internal.process.runtime.KogitoProcessContext;\n" +
                         "import org.jbpm.process.instance.impl.Action;\n" +
+                        imports + "\n" +
                         " class Test {\n" +
                         "    Action action = kcontext -> {" + 
droolsAction.getConsequence() + "\n};\n" +
-                        "}");
+                        "}";
+
+        MemoryTypeSolver memoryTypeSolver = new MemoryTypeSolver();
+        for (String fqn : process.getImports()) {
+            int idx = fqn.lastIndexOf(".");
+            String clazz = idx > 0 ? fqn.substring(idx + 1) : fqn;
+            String pakage = idx > 0 ? fqn.substring(0, idx) : "";
+            memoryTypeSolver.addDeclaration(clazz, new 
ResolvedReferenceTypeDeclaration() {
+
+                @Override
+                public Optional<ResolvedReferenceTypeDeclaration> 
containerType() {
+                    return Optional.empty();
+                }
+
+                @Override
+                public String getPackageName() {
+                    return pakage;
+                }
+
+                @Override
+                public String getClassName() {
+                    return clazz;
+                }
+
+                @Override
+                public String getQualifiedName() {
+                    return fqn;
+                }
+
+                @Override
+                public String getName() {
+                    return clazz;
+                }
+
+                @Override
+                public List<ResolvedTypeParameterDeclaration> 
getTypeParameters() {
+                    return Collections.emptyList();
+                }
+
+                @Override
+                public List<ResolvedReferenceType> getAncestors(boolean 
acceptIncompleteList) {
+                    return Collections.emptyList();
+                }
+
+                @Override
+                public List<ResolvedFieldDeclaration> getAllFields() {
+                    return Collections.emptyList();
+                }
+
+                @Override
+                public Set<ResolvedMethodDeclaration> getDeclaredMethods() {
+                    return Collections.emptySet();
+                }
+
+                @Override
+                public Set<MethodUsage> getAllMethods() {
+                    return Collections.emptySet();
+                }
+
+                @Override
+                public boolean isAssignableBy(ResolvedType type) {
+                    return false;
+                }
+
+                @Override
+                public boolean isAssignableBy(ResolvedReferenceTypeDeclaration 
other) {
+                    return false;
+                }
+
+                @Override
+                public boolean hasDirectlyAnnotation(String qualifiedName) {
+                    return false;
+                }
+
+                @Override
+                public boolean isFunctionalInterface() {
+                    return false;
+                }
+
+                @Override
+                public List<ResolvedConstructorDeclaration> getConstructors() {
+                    return Collections.emptyList();
+                }
+
+            });
+        }
+
+        ParseResult<CompilationUnit> parse = new JavaParser(new 
ParserConfiguration()
+                .setSymbolResolver(new JavaSymbolSolver(
+                        new CombinedTypeSolver(new ReflectionTypeSolver(), 
memoryTypeSolver))))
+                                .parse(dummyScript);
+
         if (parse.isSuccessful()) {
             CompilationUnit unit = parse.getResult().orElseThrow();
             try {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to