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

egonzalez 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 a913910966 [incubator-kie-issues-1195] Process Variable support 
multiple metadata fields (#3508)
a913910966 is described below

commit a913910966183a5fdacd825211a027655a66828e
Author: Enrique <[email protected]>
AuthorDate: Wed May 29 10:52:24 2024 +0200

    [incubator-kie-issues-1195] Process Variable support multiple metadata 
fields (#3508)
---
 .../jbpm/compiler/canonical/AbstractVisitor.java   | 27 +++++++++++++++++-----
 .../canonical/ProcessToExecModelGeneratorTest.java |  6 +++--
 .../core/RuleFlowNodeContainerFactory.java         |  8 ++++---
 .../jbpm/ruleflow/core/RuleFlowProcessFactory.java | 18 ++++++++-------
 .../core/factory/AbstractCompositeNodeFactory.java | 17 ++++++++------
 .../test/java/org/jbpm/bpmn2/VariableTagsTest.java | 20 ++++++++++++++++
 .../workflow/parser/handlers/StateHandler.java     |  2 +-
 .../quarkus/ServerlessWorkflowCodestartTest.java   |  4 ++++
 8 files changed, 75 insertions(+), 27 deletions(-)

diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractVisitor.java
index 17dd3cd9d3..65932b1d76 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractVisitor.java
@@ -32,11 +32,11 @@ import 
org.jbpm.ruleflow.core.WorkflowElementIdentifierFactory;
 import org.kie.api.definition.process.NodeContainer;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 import org.kie.kogito.internal.process.runtime.KogitoNode;
-import org.kie.kogito.internal.utils.KogitoTags;
 
 import com.github.javaparser.ast.NodeList;
 import com.github.javaparser.ast.expr.ClassExpr;
 import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.FieldAccessExpr;
 import com.github.javaparser.ast.expr.MethodCallExpr;
 import com.github.javaparser.ast.expr.NameExpr;
 import com.github.javaparser.ast.expr.NullLiteralExpr;
@@ -102,13 +102,28 @@ public abstract class AbstractVisitor {
                 if (!visitedVariables.add(variable.getName())) {
                     continue;
                 }
-                String tags = (String) 
variable.getMetaData(KogitoTags.VARIABLE_TAGS);
+
+                Map<String, Object> metaData = variable.getMetaData();
+                NodeList<Expression> parameters = new NodeList<>();
+                for (Map.Entry<String, Object> entry : 
metaData.entrySet().stream().filter(e -> e.getValue() != null).toList()) {
+                    parameters.add(new StringLiteralExpr(entry.getKey()));
+                    parameters.add(new 
StringLiteralExpr(entry.getValue().toString()));
+                }
+
+                Expression metadataExpression = new FieldAccessExpr(new 
NameExpr(Map.class.getPackage().getName()), Map.class.getSimpleName());
+                metadataExpression = new MethodCallExpr(metadataExpression, 
"of", parameters);
                 Object defaultValue = variable.getValue();
                 
body.tryAddImportToParentCompilationUnit(variable.getType().getClass());
-                body.addStatement(getFactoryMethod(field, METHOD_VARIABLE, new 
StringLiteralExpr(variable.getName()),
-                        new MethodCallExpr(DataTypeResolver.class.getName() + 
".fromClass", new 
ClassExpr(parseClassOrInterfaceType(variable.getType().getStringType()).removeTypeArguments())),
-                        defaultValue != null ? new 
StringLiteralExpr(defaultValue.toString()) : new NullLiteralExpr(), new 
StringLiteralExpr(KogitoTags.VARIABLE_TAGS),
-                        tags != null ? new StringLiteralExpr(tags) : new 
NullLiteralExpr()));
+
+                NodeList<Expression> variableFactoryParameters = new 
NodeList<>();
+                variableFactoryParameters.add(new 
StringLiteralExpr(variable.getName()));
+                variableFactoryParameters
+                        .add(new 
MethodCallExpr(DataTypeResolver.class.getName() + ".fromClass", new 
ClassExpr(parseClassOrInterfaceType(variable.getType().getStringType()).removeTypeArguments())));
+                if (defaultValue != null) {
+                    variableFactoryParameters.add(new 
StringLiteralExpr(defaultValue.toString()));
+                }
+                variableFactoryParameters.add(metadataExpression);
+                body.addStatement(getFactoryMethod(field, METHOD_VARIABLE, 
variableFactoryParameters.stream().toArray(Expression[]::new)));
             }
         }
     }
diff --git 
a/jbpm/jbpm-flow-builder/src/test/java/org/jbpm/compiler/canonical/ProcessToExecModelGeneratorTest.java
 
b/jbpm/jbpm-flow-builder/src/test/java/org/jbpm/compiler/canonical/ProcessToExecModelGeneratorTest.java
index e454d26ee0..eec5facfaf 100644
--- 
a/jbpm/jbpm-flow-builder/src/test/java/org/jbpm/compiler/canonical/ProcessToExecModelGeneratorTest.java
+++ 
b/jbpm/jbpm-flow-builder/src/test/java/org/jbpm/compiler/canonical/ProcessToExecModelGeneratorTest.java
@@ -18,6 +18,8 @@
  */
 package org.jbpm.compiler.canonical;
 
+import java.util.Collections;
+
 import org.jbpm.process.core.datatype.impl.type.IntegerDataType;
 import org.jbpm.process.core.datatype.impl.type.ObjectDataType;
 import org.jbpm.process.core.datatype.impl.type.StringDataType;
@@ -130,8 +132,8 @@ public class ProcessToExecModelGeneratorTest {
         RuleFlowProcessFactory factory = 
RuleFlowProcessFactory.createProcess("demo.orders");
         factory
                 .variable("order", new 
ObjectDataType("com.myspace.demo.Order"))
-                .variable("approver", new StringDataType(), "john", 
"customTags", null)
-                .variable("age", new IntegerDataType(), "1", "customTags", 
null)
+                .variable("approver", new StringDataType(), "john", 
Collections.singletonMap("customTags", null))
+                .variable("age", new IntegerDataType(), "1", 
Collections.singletonMap("customTags", null))
                 .name("orders")
                 .packageName("com.myspace.demo")
                 .dynamic(false)
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowNodeContainerFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowNodeContainerFactory.java
index 8dbdc4769c..b994fc5042 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowNodeContainerFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowNodeContainerFactory.java
@@ -18,6 +18,8 @@
  */
 package org.jbpm.ruleflow.core;
 
+import java.util.Map;
+
 import org.jbpm.process.core.Context;
 import org.jbpm.process.core.ContextContainer;
 import org.jbpm.process.core.context.exception.ActionExceptionHandler;
@@ -237,11 +239,11 @@ public abstract class RuleFlowNodeContainerFactory<T 
extends RuleFlowNodeContain
 
     public abstract T variable(String name, DataType type);
 
-    public abstract T variable(String name, DataType type, Object value);
+    public abstract T variable(String name, DataType type, Map<String, Object> 
metadata);
 
-    public abstract T variable(String name, DataType type, String 
metaDataName, Object metaDataValue);
+    public abstract T variable(String name, DataType type, Object value);
 
-    public abstract T variable(String name, DataType type, Object value, 
String metaDataName, Object metaDataValue);
+    public abstract T variable(String name, DataType type, Object value, 
Map<String, Object> metadata);
 
     private <S extends Context> S getScope(String scopeType, Class<S> 
scopeClass) {
         ContextContainer contextContainer = (ContextContainer) 
getNodeContainer();
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcessFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcessFactory.java
index ccfdb3d993..3c6089e19a 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcessFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcessFactory.java
@@ -20,6 +20,7 @@ package org.jbpm.ruleflow.core;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -201,29 +202,30 @@ public class RuleFlowProcessFactory extends 
RuleFlowNodeContainerFactory<RuleFlo
 
     @Override
     public RuleFlowProcessFactory variable(String name, DataType type) {
-        return variable(name, type, null);
+        return variable(name, type, Collections.emptyMap());
     }
 
     @Override
     public RuleFlowProcessFactory variable(String name, DataType type, Object 
value) {
-        return variable(name, type, value, null, null);
+        return variable(name, type, value, Collections.emptyMap());
     }
 
     @Override
-    public RuleFlowProcessFactory variable(String name, DataType type, String 
metaDataName, Object metaDataValue) {
-        return variable(name, type, null, metaDataName, metaDataValue);
+    public RuleFlowProcessFactory variable(String name, DataType type, 
Map<String, Object> metadata) {
+        return this.variable(name, type, null, metadata);
     }
 
     @Override
-    public RuleFlowProcessFactory variable(String name, DataType type, Object 
value, String metaDataName, Object metaDataValue) {
-
+    public RuleFlowProcessFactory variable(String name, DataType type, Object 
value, Map<String, Object> metadata) {
         Variable variable = new Variable();
         variable.setName(name);
         variable.setType(type);
         variable.setValue(type.verifyDataType(value) ? value : 
type.readValue((String) value));
-        if (metaDataName != null && metaDataValue != null) {
-            variable.setMetaData(metaDataName, metaDataValue);
+
+        for (Map.Entry<String, Object> entry : metadata.entrySet()) {
+            variable.setMetaData(entry.getKey(), entry.getValue());
         }
+
         getRuleFlowProcess().getVariableScope().getVariables().add(variable);
         return this;
     }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/AbstractCompositeNodeFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/AbstractCompositeNodeFactory.java
index aacc99b20b..144de670ac 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/AbstractCompositeNodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/AbstractCompositeNodeFactory.java
@@ -18,6 +18,9 @@
  */
 package org.jbpm.ruleflow.core.factory;
 
+import java.util.Collections;
+import java.util.Map;
+
 import org.jbpm.process.core.context.variable.Variable;
 import org.jbpm.process.core.context.variable.VariableScope;
 import org.jbpm.process.core.datatype.DataType;
@@ -53,28 +56,28 @@ public abstract class AbstractCompositeNodeFactory<T 
extends RuleFlowNodeContain
 
     @Override
     public T variable(String name, DataType type) {
-        return variable(name, type, null);
+        return variable(name, type, Collections.emptyMap());
     }
 
     @Override
     public T variable(String name, DataType type, Object value) {
-        return variable(name, type, value, null, null);
+        return variable(name, type, value, Collections.emptyMap());
     }
 
     @Override
-    public T variable(String name, DataType type, String metaDataName, Object 
metaDataValue) {
-        return variable(name, type, null, metaDataName, metaDataValue);
+    public T variable(String name, DataType type, Map<String, Object> 
metaData) {
+        return variable(name, type, null, metaData);
     }
 
     @Override
-    public T variable(String name, DataType type, Object value, String 
metaDataName, Object metaDataValue) {
+    public T variable(String name, DataType type, Object value, Map<String, 
Object> metadata) {
         Variable variable = new Variable();
         variable.setName(name);
         variable.setType(type);
         variable.setValue(value);
         VariableScope variableScope = (VariableScope) 
getCompositeNode().getDefaultContext(VariableScope.VARIABLE_SCOPE);
-        if (metaDataName != null && metaDataValue != null) {
-            variable.setMetaData(metaDataName, metaDataValue);
+        for (Map.Entry<String, Object> entry : metadata.entrySet()) {
+            variable.setMetaData(entry.getKey(), entry.getValue());
         }
         if (variableScope == null) {
             variableScope = new VariableScope();
diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/VariableTagsTest.java 
b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/VariableTagsTest.java
index 20542c6671..90d63909c9 100644
--- a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/VariableTagsTest.java
+++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/VariableTagsTest.java
@@ -22,11 +22,17 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import org.drools.io.ClassPathResource;
 import org.jbpm.bpmn2.objects.TestWorkItemHandler;
+import org.jbpm.bpmn2.tags.ApprovalWithRequiredVariableTagsProcess;
+import org.jbpm.process.core.context.variable.Variable;
+import org.jbpm.ruleflow.core.RuleFlowProcess;
+import org.jbpm.test.utils.ProcessTestHelper;
 import org.junit.jupiter.api.Test;
 import org.kie.api.event.process.ProcessVariableChangedEvent;
+import org.kie.kogito.Application;
 import org.kie.kogito.internal.process.event.DefaultKogitoProcessEventListener;
 import org.kie.kogito.internal.process.runtime.KogitoProcessInstance;
 import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
@@ -36,11 +42,25 @@ import org.kie.kogito.process.bpmn2.BpmnVariables;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.assertj.core.api.Assertions.entry;
 import static 
org.kie.kogito.internal.process.runtime.KogitoProcessInstance.STATE_ABORTED;
 import static 
org.kie.kogito.internal.process.runtime.KogitoProcessInstance.STATE_ACTIVE;
 
 public class VariableTagsTest extends JbpmBpmn2TestCase {
 
+    @Test
+    public void testVariableMultipleMetadata() throws Exception {
+        Application app = ProcessTestHelper.newApplication();
+        ApprovalWithRequiredVariableTagsProcess processDefinition = 
(ApprovalWithRequiredVariableTagsProcess) 
ApprovalWithRequiredVariableTagsProcess.newProcess(app);
+
+        RuleFlowProcess processEngine = (RuleFlowProcess) 
processDefinition.process();
+        Optional<Variable> var = 
processEngine.getVariableScope().getVariables().stream().filter(e -> 
"approver".equals(e.getName())).findAny();
+        assertThat(var).isPresent();
+        assertThat(var.get().getMetaData()).hasSize(3);
+        assertThat(var.get().getMetaData()).containsExactly(entry("approver", 
"approver"), entry("customTags", "required"), entry("ItemSubjectRef", 
"ItemDefinition_9"));
+
+    }
+
     @Test
     public void testProcessWithMissingRequiredVariable() throws Exception {
         kruntime = 
createKogitoProcessRuntime("org/jbpm/bpmn2/tags/BPMN2-ApprovalWithRequiredVariableTags.bpmn2");
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
index 3cec858b91..63610ad6b7 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
@@ -436,7 +436,7 @@ public abstract class StateHandler<S extends State> {
             boolean shouldMerge, FilterableNodeSupplier nodeSupplier) {
 
         if (isTempVariable(actionVarName)) {
-            embeddedSubProcess.variable(actionVarName, new 
ObjectDataType(JsonNode.class.getCanonicalName()), KogitoTags.VARIABLE_TAGS, 
KogitoTags.INTERNAL_TAG);
+            embeddedSubProcess.variable(actionVarName, new 
ObjectDataType(JsonNode.class.getCanonicalName()), 
Map.of(KogitoTags.VARIABLE_TAGS, KogitoTags.INTERNAL_TAG));
         }
         NodeFactory<?, ?> startNode, currentNode;
         if (fromStateExpr != null) {
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/ServerlessWorkflowCodestartTest.java
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/ServerlessWorkflowCodestartTest.java
index ffce8e0e5c..9c1dbf98c5 100644
--- 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/ServerlessWorkflowCodestartTest.java
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/ServerlessWorkflowCodestartTest.java
@@ -20,19 +20,23 @@ package org.kie.kogito.quarkus;
 
 import java.util.Map;
 
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import io.quarkus.devtools.codestarts.quarkus.QuarkusCodestartData;
+import io.quarkus.devtools.project.BuildTool;
 import io.quarkus.devtools.testing.codestarts.QuarkusCodestartTest;
 import io.quarkus.maven.dependency.ArtifactKey;
 
 import static 
io.quarkus.devtools.codestarts.quarkus.QuarkusCodestartCatalog.Language.JAVA;
 
+@Disabled
 public class ServerlessWorkflowCodestartTest {
 
     @RegisterExtension
     public static QuarkusCodestartTest codestartTest = 
QuarkusCodestartTest.builder()
+            .buildTool(BuildTool.MAVEN)
             
.setupStandaloneExtensionTest("org.apache.kie.sonataflow:sonataflow-quarkus")
             
.extension(ArtifactKey.fromString("io.quarkus:quarkus-config-yaml"))
             .putData(QuarkusCodestartData.QuarkusDataKey.APP_CONFIG, 
Map.of("quarkus.devservices.enabled", "false"))


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

Reply via email to