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]