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 cb8ca879c1 [incubator-kie-issues-1278] Support for codegen in project 
class loading handler descriptors. (error event) (#3537)
cb8ca879c1 is described below

commit cb8ca879c1270129a07311bf56d124645e813ef4
Author: Enrique <[email protected]>
AuthorDate: Mon Jun 10 11:32:58 2024 +0200

    [incubator-kie-issues-1278] Support for codegen in project class loading 
handler descriptors. (error event) (#3537)
---
 .../bpmn2/services/AlwaysThrowingComponent.java    | 28 +++++++++++
 .../org/jbpm/bpmn2/services/LoggingComponent.java  | 26 ++++++++++
 .../org/jbpm/bpmn2/error/BPMN2-EndError.bpmn2}     |  2 +-
 .../jbpm/bpmn2/error/BPMN2-ErrorVariable.bpmn2}    |  4 +-
 .../test/java/org/jbpm/bpmn2/ErrorEventTest.java   | 43 +++++++++++++----
 .../org/jbpm/tools/maven/ClassLoaderHelper.java    | 55 ++++++++++++++++++++++
 .../tools/maven/ProcessCodeGenerationSupport.java  |  7 ++-
 .../org/jbpm/tools/maven/ProcessCodegenMojo.java   |  2 +-
 .../jbpm/tools/maven/ProcessCodegenTestMojo.java   |  2 +-
 9 files changed, 152 insertions(+), 17 deletions(-)

diff --git 
a/jbpm/jbpm-tests/src/main/java/org/jbpm/bpmn2/services/AlwaysThrowingComponent.java
 
b/jbpm/jbpm-tests/src/main/java/org/jbpm/bpmn2/services/AlwaysThrowingComponent.java
new file mode 100644
index 0000000000..49d42aecbc
--- /dev/null
+++ 
b/jbpm/jbpm-tests/src/main/java/org/jbpm/bpmn2/services/AlwaysThrowingComponent.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jbpm.bpmn2.services;
+
+import org.kie.kogito.process.workitem.WorkItemExecutionException;
+
+public class AlwaysThrowingComponent {
+
+    public void throwException() {
+        throw new WorkItemExecutionException("MY_ERROR");
+    }
+}
diff --git 
a/jbpm/jbpm-tests/src/main/java/org/jbpm/bpmn2/services/LoggingComponent.java 
b/jbpm/jbpm-tests/src/main/java/org/jbpm/bpmn2/services/LoggingComponent.java
new file mode 100644
index 0000000000..b0db16fc91
--- /dev/null
+++ 
b/jbpm/jbpm-tests/src/main/java/org/jbpm/bpmn2/services/LoggingComponent.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jbpm.bpmn2.services;
+
+public class LoggingComponent {
+
+    public void logException(Throwable exception) {
+        System.out.println(exception);
+    }
+}
diff --git a/jbpm/jbpm-tests/src/test/resources/error/EndError.bpmn2 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/error/BPMN2-EndError.bpmn2
similarity index 97%
rename from jbpm/jbpm-tests/src/test/resources/error/EndError.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/error/BPMN2-EndError.bpmn2
index 4f7ee3b992..958f327ec1 100644
--- a/jbpm/jbpm-tests/src/test/resources/error/EndError.bpmn2
+++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/error/BPMN2-EndError.bpmn2
@@ -19,7 +19,7 @@
 
 <bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"; 
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"; 
xmlns:bpsim="http://www.bpsim.org/schemas/1.0"; 
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"; 
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"; 
xmlns:drools="http://www.jboss.org/drools"; id="_QqMV0EhdEDm-BsDfCQnCnA" 
exporter="jBPM Process Modeler" exporterVersion="2.0" 
targetNamespace="http://www.omg.org/bpmn20";>
   <bpmn2:error id="error1" errorCode="error1"/>
-  <bpmn2:process id="EndError" drools:packageName="com.example" 
drools:version="1.0" drools:adHoc="false" name="EndError" isExecutable="true" 
processType="Public">
+  <bpmn2:process id="EndError" drools:packageName="org.jbpm.bpmn2.error" 
drools:version="1.0" drools:adHoc="false" name="EndError" isExecutable="true" 
processType="Public">
     <bpmn2:sequenceFlow id="_F0C4E1CF-5937-41F8-8B29-AB8A882C4ABE" 
sourceRef="_2503B623-FE50-4341-B4FA-CD5174B306C2" 
targetRef="_9D44A52D-5F79-4F07-8438-7ED84AA4ED51">
       <bpmn2:extensionElements>
         <drools:metaData name="isAutoConnection.source">
diff --git a/jbpm/jbpm-tests/src/test/resources/error/ErrorVariable.bpmn2 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/error/BPMN2-ErrorVariable.bpmn2
similarity index 94%
rename from jbpm/jbpm-tests/src/test/resources/error/ErrorVariable.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/error/BPMN2-ErrorVariable.bpmn2
index 11a44c7f5b..324413b93a 100644
--- a/jbpm/jbpm-tests/src/test/resources/error/ErrorVariable.bpmn2
+++ 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/error/BPMN2-ErrorVariable.bpmn2
@@ -29,7 +29,7 @@
   <bpmn2:interface id="_E5B0E78B-0112-42F4-89FF-0DCC4FCB6BCD_ServiceInterface" 
name="org.jbpm.services.LoggingComponent" 
implementationRef="org.jbpm.bpmn2.services.LoggingComponent">
     <bpmn2:operation 
id="_E5B0E78B-0112-42F4-89FF-0DCC4FCB6BCD_ServiceOperation" name="logException" 
implementationRef="logException"/>
   </bpmn2:interface>
-  <bpmn2:process id="ErrorVariable" drools:packageName="com.example" 
drools:version="1.0" drools:adHoc="false" name="ErrorVariable" 
isExecutable="true" processType="Public">
+  <bpmn2:process id="ErrorVariable" drools:packageName="org.jbpm.bpmn2.error" 
drools:version="1.0" drools:adHoc="false" name="ErrorVariable" 
isExecutable="true" processType="Public">
     <bpmn2:property id="theException" itemSubjectRef="_theExceptionItem" 
name="theException"/>
     <bpmn2:sequenceFlow id="_52EEDF72-07C7-46FE-BB5C-9513565AB210" 
sourceRef="_E5B0E78B-0112-42F4-89FF-0DCC4FCB6BCD" 
targetRef="_62803D2E-7500-4772-99F8-12CF68FB029A"/>
     <bpmn2:sequenceFlow id="_96D31184-08C6-4DC9-B405-4FC97B477DCC" 
sourceRef="_62803D2E-7500-4772-99F8-12CF68FB029A" 
targetRef="_D318B115-D923-4448-AA4E-CACCCDEB9DD5"/>
@@ -47,7 +47,7 @@
       <bpmn2:incoming>_52EEDF72-07C7-46FE-BB5C-9513565AB210</bpmn2:incoming>
       <bpmn2:outgoing>_96D31184-08C6-4DC9-B405-4FC97B477DCC</bpmn2:outgoing>
     </bpmn2:exclusiveGateway>
-    <bpmn2:serviceTask id="_E5B0E78B-0112-42F4-89FF-0DCC4FCB6BCD" 
drools:serviceimplementation="Java" 
drools:serviceinterface="org.jbpm.bpmn2.servicesLoggingComponent" 
drools:serviceoperation="logException" name="Error Handling" 
implementation="Java" 
operationRef="_E5B0E78B-0112-42F4-89FF-0DCC4FCB6BCD_ServiceOperation">
+    <bpmn2:serviceTask id="_E5B0E78B-0112-42F4-89FF-0DCC4FCB6BCD" 
drools:serviceimplementation="Java" 
drools:serviceinterface="org.jbpm.bpmn2.services.LoggingComponent" 
drools:serviceoperation="logException" name="Error Handling" 
implementation="Java" 
operationRef="_E5B0E78B-0112-42F4-89FF-0DCC4FCB6BCD_ServiceOperation">
       <bpmn2:extensionElements>
         <drools:metaData name="elementname">
           <drools:metaValue><![CDATA[Error Handling]]></drools:metaValue>
diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/ErrorEventTest.java 
b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/ErrorEventTest.java
index 813cdee2b3..6930c8557b 100755
--- a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/ErrorEventTest.java
+++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/ErrorEventTest.java
@@ -23,6 +23,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.jbpm.bpmn2.error.EndErrorModel;
+import org.jbpm.bpmn2.error.EndErrorProcess;
+import org.jbpm.bpmn2.error.ErrorVariableModel;
+import org.jbpm.bpmn2.error.ErrorVariableProcess;
 import org.jbpm.bpmn2.handler.ServiceTaskHandler;
 import org.jbpm.bpmn2.handler.SignallingTaskHandlerDecorator;
 import org.jbpm.bpmn2.objects.ExceptionOnPurposeHandler;
@@ -32,10 +36,15 @@ import org.jbpm.bpmn2.objects.TestWorkItemHandler;
 import org.jbpm.process.instance.event.listeners.RuleAwareProcessEventListener;
 import org.jbpm.process.instance.impl.demo.DoNothingWorkItemHandler;
 import org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler;
+import org.jbpm.test.utils.EventTrackerProcessListener;
+import org.jbpm.test.utils.ProcessTestHelper;
 import org.jbpm.workflow.instance.WorkflowProcessInstance;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.kie.api.event.process.ProcessNodeLeftEvent;
+import org.kie.kogito.Application;
+import 
org.kie.kogito.handlers.AlwaysThrowingComponent_throwException__8DA0CD88_0714_43C1_B492_A70FADE42361_Handler;
+import 
org.kie.kogito.handlers.LoggingComponent_logException__E5B0E78B_0112_42F4_89FF_0DCC4FCB6BCD_Handler;
 import org.kie.kogito.internal.process.event.DefaultKogitoProcessEventListener;
 import org.kie.kogito.internal.process.event.KogitoProcessEventListener;
 import org.kie.kogito.internal.process.runtime.KogitoNodeInstance;
@@ -440,22 +449,36 @@ public class ErrorEventTest extends JbpmBpmn2TestCase {
 
     @Test
     public void testEndError() throws Exception {
-        kruntime = createKogitoProcessRuntime("error/EndError.bpmn2");
+        Application app = ProcessTestHelper.newApplication();
+        EventTrackerProcessListener eventTrackerProcessListener = new 
EventTrackerProcessListener();
+        ProcessTestHelper.registerProcessEventListener(app, 
eventTrackerProcessListener);
+        org.kie.kogito.process.Process<EndErrorModel> processDefinition = 
EndErrorProcess.newProcess(app);
+        org.kie.kogito.process.ProcessInstance<EndErrorModel> instance = 
processDefinition.createInstance(processDefinition.createModel());
+        instance.start();
 
-        KogitoProcessInstance processInstance = 
kruntime.startProcess("EndError");
+        
assertThat(eventTrackerProcessListener.tracked()).anyMatch(ProcessTestHelper.triggered("start"));
+        
assertThat(eventTrackerProcessListener.tracked()).anyMatch(ProcessTestHelper.triggered("task"));
+        
assertThat(instance.status()).isEqualTo(KogitoProcessInstance.STATE_ABORTED);
 
-        assertNodeTriggered(processInstance.getStringId(), "start", "task");
-
-        
assertThat(processInstance.getState()).isEqualTo(KogitoProcessInstance.STATE_ABORTED);
     }
 
     @Test
     public void testErrorVariable() throws Exception {
-        kruntime = createKogitoProcessRuntime("error/ErrorVariable.bpmn2");
-        kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service 
Task", new WorkItemExecutionErrorWorkItemHandler("MY_ERROR"));
-        KogitoProcessInstance processInstance = 
kruntime.startProcess("ErrorVariable");
-        Object theException = 
processInstance.getVariables().get("theException");
-        
assertThat(theException).isInstanceOf(WorkItemExecutionException.class);
+
+        Application app = ProcessTestHelper.newApplication();
+        ProcessTestHelper.registerHandler(app, "Service Task", new 
WorkItemExecutionErrorWorkItemHandler("MY_ERROR"));
+        ProcessTestHelper.registerHandler(app, 
"org.jbpm.bpmn2.services.AlwaysThrowingComponent_throwException__8DA0CD88_0714_43C1_B492_A70FADE42361_Handler",
+                new 
AlwaysThrowingComponent_throwException__8DA0CD88_0714_43C1_B492_A70FADE42361_Handler());
+        ProcessTestHelper.registerHandler(app, 
"org.jbpm.bpmn2.services.LoggingComponent_logException__E5B0E78B_0112_42F4_89FF_0DCC4FCB6BCD_Handler",
+                new 
LoggingComponent_logException__E5B0E78B_0112_42F4_89FF_0DCC4FCB6BCD_Handler());
+        org.kie.kogito.process.Process<ErrorVariableModel> processDefinition = 
ErrorVariableProcess.newProcess(app);
+        ErrorVariableModel model = processDefinition.createModel();
+        model.setTheException("theException");
+        org.kie.kogito.process.ProcessInstance<ErrorVariableModel> instance = 
processDefinition.createInstance(model);
+        instance.start();
+
+        
assertThat(instance.variables().getTheException()).isInstanceOf(WorkItemExecutionException.class);
+        
assertThat(instance.status()).isEqualTo(KogitoProcessInstance.STATE_COMPLETED);
     }
 
     class ExceptionWorkItemHandler implements KogitoWorkItemHandler {
diff --git 
a/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ClassLoaderHelper.java
 
b/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ClassLoaderHelper.java
new file mode 100644
index 0000000000..6068a2240b
--- /dev/null
+++ 
b/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ClassLoaderHelper.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jbpm.tools.maven;
+
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.maven.project.MavenProject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClassLoaderHelper {
+    private static Logger LOGGER = 
LoggerFactory.getLogger(ClassLoaderHelper.class);
+
+    public static ClassLoader getClassLoader(MavenProject project) {
+        ClassLoader contextClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+
+            Set<URL> classPathUrls = new HashSet<>();
+
+            // adding the projects classes itself
+            List<String> classpathElements = 
project.getCompileClasspathElements();
+            classpathElements.add(project.getBuild().getOutputDirectory());
+            classpathElements.add(project.getBuild().getTestOutputDirectory());
+            for (final String classpathElement : classpathElements) {
+                LOGGER.info("adding classpath element {} to classloader", 
classpathElement);
+                classPathUrls.add(new File(classpathElement).toURI().toURL());
+            }
+
+            return new 
URLClassLoader(classPathUrls.stream().toArray(URL[]::new), contextClassLoader);
+        } catch (final Exception e) {
+            return contextClassLoader;
+        }
+    }
+}
diff --git 
a/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodeGenerationSupport.java
 
b/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodeGenerationSupport.java
index 8fa641bf94..6988db18b3 100644
--- 
a/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodeGenerationSupport.java
+++ 
b/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodeGenerationSupport.java
@@ -70,13 +70,13 @@ public class ProcessCodeGenerationSupport {
 
     private Path rootOutputFolder;
 
-    public ProcessCodeGenerationSupport(Path sourceFolder, Path outputFolder) {
+    public ProcessCodeGenerationSupport(Path sourceFolder, Path outputFolder, 
ClassLoader classLoader) {
         this.printer = new DefaultPrettyPrinter();
         this.bpmnSemanticModules = new SemanticModules();
         this.bpmnSemanticModules.addSemanticModule(new BPMNSemanticModule());
         this.bpmnSemanticModules.addSemanticModule(new 
BPMNExtensionsSemanticModule());
         this.bpmnSemanticModules.addSemanticModule(new BPMNDISemanticModule());
-        this.processCodeGenerator = new 
ProcessToExecModelGenerator("StaticProcessTemplate.java", 
Thread.currentThread().getContextClassLoader());
+        this.processCodeGenerator = new 
ProcessToExecModelGenerator("StaticProcessTemplate.java", classLoader);
         this.rootSourceFolder = sourceFolder;
         this.rootOutputFolder = outputFolder;
     }
@@ -212,6 +212,9 @@ public class ProcessCodeGenerationSupport {
         writeCompilationUnit(modelMetadata.generateUnit());
         writeCompilationUnit(inputMdelMetadata.generateUnit());
         writeCompilationUnit(outputModelMetadata.generateUnit());
+        for (CompilationUnit handler : 
metadata.getGeneratedHandlers().values()) {
+            writeCompilationUnit(handler);
+        }
     }
 
     private void writeCompilationUnit(CompilationUnit unit) throws IOException 
{
diff --git 
a/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodegenMojo.java
 
b/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodegenMojo.java
index e8aabcbe5c..a18283f651 100644
--- 
a/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodegenMojo.java
+++ 
b/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodegenMojo.java
@@ -43,7 +43,7 @@ public class ProcessCodegenMojo extends AbstractMojo {
     public void execute() throws MojoExecutionException {
         Path sourceFolder = Paths.get(project.getBasedir().toString(), 
resources);
         Path outputFolder = Paths.get(project.getBuild().getDirectory(), 
"generated-sources", "jbpm");
-        ProcessCodeGenerationSupport codeGenSupport = new 
ProcessCodeGenerationSupport(sourceFolder, outputFolder);
+        ProcessCodeGenerationSupport codeGenSupport = new 
ProcessCodeGenerationSupport(sourceFolder, outputFolder, 
ClassLoaderHelper.getClassLoader(project));
         codeGenSupport.execute();
     }
 
diff --git 
a/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodegenTestMojo.java
 
b/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodegenTestMojo.java
index 6a0ba150b7..7fb05cbcbb 100644
--- 
a/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodegenTestMojo.java
+++ 
b/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/main/java/org/jbpm/tools/maven/ProcessCodegenTestMojo.java
@@ -44,7 +44,7 @@ public class ProcessCodegenTestMojo extends AbstractMojo {
 
         Path sourceTestFolder = Paths.get(project.getBasedir().toString(), 
resources);
         Path outputTestFolder = Paths.get(project.getBuild().getDirectory(), 
"generated-test-sources", "jbpm");
-        ProcessCodeGenerationSupport codeGenSupport = new 
ProcessCodeGenerationSupport(sourceTestFolder, outputTestFolder);
+        ProcessCodeGenerationSupport codeGenSupport = new 
ProcessCodeGenerationSupport(sourceTestFolder, outputTestFolder, 
ClassLoaderHelper.getClassLoader(project));
         codeGenSupport.execute();
     }
 


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

Reply via email to