diff --git a/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/handler/LoggingTaskHandlerDecorator.java b/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/handler/LoggingTaskHandlerDecorator.java index be049745f4f..087d09ece76 100755 --- a/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/handler/LoggingTaskHandlerDecorator.java +++ b/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/handler/LoggingTaskHandlerDecorator.java @@ -65,7 +65,7 @@ */ public class LoggingTaskHandlerDecorator extends AbstractExceptionHandlingTaskHandler { - private static final Logger logger = LoggerFactory.getLogger(LoggingTaskHandlerDecorator.class); + private static Logger logger = LoggerFactory.getLogger(LoggingTaskHandlerDecorator.class); private int loggedExceptionsLimit = 100; private Queue exceptionInfoList = new ArrayDeque<>(loggedExceptionsLimit); @@ -210,6 +210,10 @@ public synchronized void handleAbortException(Throwable cause, KogitoWorkItem wo logMessage(false, workItem, cause); } + public static void setLogger(Logger logger) { + LoggingTaskHandlerDecorator.logger = logger; + } + private void logMessage(boolean onExecute, KogitoWorkItem workItem, Throwable cause) { String handlerMethodStem = "execut"; if (!onExecute) { diff --git a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java index e23c5b4bc82..f71a5ef44f4 100755 --- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java +++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java @@ -258,6 +258,7 @@ public final void trigger(KogitoNodeInstance from, String type) { protected void captureError(Exception e) { logger.error("capture error", e); + e.printStackTrace(); getProcessInstance().setErrorState(this, e); } diff --git a/jbpm/jbpm-tests/src/main/java/org/jbpm/bpmn2/services/Interface1.java b/jbpm/jbpm-tests/src/main/java/org/jbpm/bpmn2/services/Interface1.java new file mode 100644 index 00000000000..9fe7b02d265 --- /dev/null +++ b/jbpm/jbpm-tests/src/main/java/org/jbpm/bpmn2/services/Interface1.java @@ -0,0 +1,32 @@ +/* + * 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.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Interface1 { + + Logger LOGGER = LoggerFactory.getLogger(Interface1.class); + + public void operation1(String value) { + LOGGER.info("operation1 in interface1 = {}", value); + } +} diff --git a/jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceProcess.bpmn2 b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceProcess.bpmn2 similarity index 98% rename from jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceProcess.bpmn2 rename to jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceProcess.bpmn2 index ab68586d063..a86de045b3b 100755 --- a/jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceProcess.bpmn2 +++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceProcess.bpmn2 @@ -40,7 +40,7 @@ - + diff --git a/jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceProcessWithCustomTransformation.bpmn2 b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceProcessWithCustomTransformation.bpmn2 similarity index 98% rename from jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceProcessWithCustomTransformation.bpmn2 rename to jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceProcessWithCustomTransformation.bpmn2 index 35dacbb1e2b..0e12a854894 100755 --- a/jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceProcessWithCustomTransformation.bpmn2 +++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceProcessWithCustomTransformation.bpmn2 @@ -40,7 +40,7 @@ - + diff --git a/jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceTask.bpmn2 b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceTask.bpmn2 similarity index 91% rename from jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceTask.bpmn2 rename to jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceTask.bpmn2 index cdd54812030..8e280875447 100755 --- a/jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceTask.bpmn2 +++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceTask.bpmn2 @@ -18,9 +18,18 @@ ~ under the License. --> - + - + EAID_DE09F4BA_6B35_4699_8AC9_84819B916A98 @@ -48,8 +57,8 @@ - - + + EAID_137CB429_F782_4fee_8CC8_D57206264E3E diff --git a/jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceTask-web-service.bpmn2 b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceTaskWebService.bpmn2 similarity index 96% rename from jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceTask-web-service.bpmn2 rename to jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceTaskWebService.bpmn2 index dd1777fba92..f340b2b894f 100755 --- a/jbpm/jbpm-tests/src/test/resources/BPMN2-ServiceTask-web-service.bpmn2 +++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/service/BPMN2-ServiceTaskWebService.bpmn2 @@ -27,12 +27,12 @@ - - + + _2_InMessage - + SequenceFlow_3 diff --git a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExceptionServiceProcess-ErrorSignalling.bpmn2 b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/subprocess/BPMN2-ExceptionServiceProcessErrorSignalling.bpmn2 similarity index 97% rename from jbpm/jbpm-tests/src/test/resources/BPMN2-ExceptionServiceProcess-ErrorSignalling.bpmn2 rename to jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/subprocess/BPMN2-ExceptionServiceProcessErrorSignalling.bpmn2 index ee463734de9..f2b3d63627a 100755 --- a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExceptionServiceProcess-ErrorSignalling.bpmn2 +++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/subprocess/BPMN2-ExceptionServiceProcessErrorSignalling.bpmn2 @@ -49,7 +49,7 @@ - + diff --git a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExceptionServiceProcess-Signalling.bpmn2 b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/subprocess/BPMN2-ExceptionServiceProcessSignalling.bpmn2 similarity index 96% rename from jbpm/jbpm-tests/src/test/resources/BPMN2-ExceptionServiceProcess-Signalling.bpmn2 rename to jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/subprocess/BPMN2-ExceptionServiceProcessSignalling.bpmn2 index a19dc5623a4..aa3663715a8 100755 --- a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExceptionServiceProcess-Signalling.bpmn2 +++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/subprocess/BPMN2-ExceptionServiceProcessSignalling.bpmn2 @@ -49,7 +49,9 @@ - + diff --git a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExceptionThrowingServiceProcess.bpmn2 b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/subprocess/BPMN2-ExceptionThrowingServiceProcess.bpmn2 similarity index 95% rename from jbpm/jbpm-tests/src/test/resources/BPMN2-ExceptionThrowingServiceProcess.bpmn2 rename to jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/subprocess/BPMN2-ExceptionThrowingServiceProcess.bpmn2 index 25d3e932c0d..9e07fce205c 100755 --- a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExceptionThrowingServiceProcess.bpmn2 +++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/subprocess/BPMN2-ExceptionThrowingServiceProcess.bpmn2 @@ -40,7 +40,7 @@ - + diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/ActivityTest.java b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/ActivityTest.java index df4988a093d..2578981db0b 100755 --- a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/ActivityTest.java +++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/ActivityTest.java @@ -59,18 +59,23 @@ import org.jbpm.bpmn2.flow.XORSameTargetProcess; import org.jbpm.bpmn2.handler.ReceiveTaskHandler; import org.jbpm.bpmn2.handler.SendTaskHandler; -import org.jbpm.bpmn2.handler.ServiceTaskHandler; import org.jbpm.bpmn2.objects.Account; import org.jbpm.bpmn2.objects.Address; import org.jbpm.bpmn2.objects.HelloService; import org.jbpm.bpmn2.objects.Person; import org.jbpm.bpmn2.objects.TestWorkItemHandler; +import org.jbpm.bpmn2.service.ServiceProcessModel; +import org.jbpm.bpmn2.service.ServiceProcessProcess; import org.jbpm.bpmn2.service.ServiceProcessWithMvelCollectionTransformationModel; import org.jbpm.bpmn2.service.ServiceProcessWithMvelCollectionTransformationProcess; import org.jbpm.bpmn2.service.ServiceProcessWithMvelJaxbTransformationModel; import org.jbpm.bpmn2.service.ServiceProcessWithMvelJaxbTransformationProcess; import org.jbpm.bpmn2.service.ServiceProcessWithMvelTransformationModel; import org.jbpm.bpmn2.service.ServiceProcessWithMvelTransformationProcess; +import org.jbpm.bpmn2.service.ServiceTaskModel; +import org.jbpm.bpmn2.service.ServiceTaskProcess; +import org.jbpm.bpmn2.service.ServiceTaskWebServiceModel; +import org.jbpm.bpmn2.service.ServiceTaskWebServiceProcess; import org.jbpm.bpmn2.subprocess.AssignmentProcessModel; import org.jbpm.bpmn2.subprocess.AssignmentProcessProcess; import org.jbpm.bpmn2.subprocess.AssignmentSubProcessModel; @@ -154,13 +159,14 @@ import org.kie.kogito.auth.SecurityPolicy; import org.kie.kogito.handlers.HelloService_hello__2_Handler; import org.kie.kogito.handlers.HelloService_validate__2_Handler; +import org.kie.kogito.handlers.Interface1_operation1_EAID_3344916D_2BAC_4ab6_92D4_F739156D0933_Handler; +import org.kie.kogito.handlers.Interface1_operation1_ServiceTask_2_Handler; import org.kie.kogito.internal.process.event.DefaultKogitoProcessEventListener; import org.kie.kogito.internal.process.runtime.KogitoNode; import org.kie.kogito.internal.process.runtime.KogitoNodeInstance; import org.kie.kogito.internal.process.runtime.KogitoProcessInstance; import org.kie.kogito.internal.process.runtime.KogitoProcessRuntime; import org.kie.kogito.internal.process.runtime.KogitoWorkItem; -import org.kie.kogito.internal.process.runtime.KogitoWorkItemManager; import org.kie.kogito.internal.process.runtime.KogitoWorkflowProcessInstance; import org.kie.kogito.process.ProcessInstance; import org.kie.kogito.process.workitems.InternalKogitoWorkItem; @@ -811,63 +817,32 @@ public void testAdHocProcessDynamicSubProcess() throws Exception { @Test public void testServiceTask() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ServiceProcess.bpmn2"); - - kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service Task", - new ServiceTaskHandler()); - Map params = new HashMap<>(); - params.put("s", "john"); - KogitoWorkflowProcessInstance processInstance = (KogitoWorkflowProcessInstance) kruntime - .startProcess("ServiceProcess", params); - assertProcessInstanceFinished(processInstance, kruntime); - assertThat(processInstance.getVariable("s")).isEqualTo("Hello john!"); - } - - @Test - public void testServiceTaskWithAccessToWorkItemInfo() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ServiceProcess.bpmn2"); + Application app = ProcessTestHelper.newApplication(); + ProcessTestHelper.registerHandler(app, "org.jbpm.bpmn2.objects.HelloService_hello__2_Handler", new HelloService_hello__2_Handler()); + org.kie.kogito.process.Process definition = ServiceProcessProcess.newProcess(app); - kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service Task", - new ServiceTaskHandler() { + ServiceProcessModel model = definition.createModel(); + model.setS("john"); + org.kie.kogito.process.ProcessInstance instance = definition.createInstance(model); + instance.start(); - @Override - public void executeWorkItem(org.kie.kogito.internal.process.runtime.KogitoWorkItem workItem, KogitoWorkItemManager manager) { - assertThat(workItem.getProcessInstance()).isNotNull(); - assertThat(workItem.getNodeInstance()).isNotNull(); - super.executeWorkItem(workItem, manager); - } + assertThat(instance.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_COMPLETED); + assertThat(instance.variables().getS()).isEqualTo("Hello john!"); - }); - Map params = new HashMap<>(); - params.put("s", "john"); - KogitoWorkflowProcessInstance processInstance = (KogitoWorkflowProcessInstance) kruntime.startProcess("ServiceProcess", params); - assertProcessInstanceFinished(processInstance, kruntime); - assertThat(processInstance.getVariable("s")).isEqualTo("Hello john!"); } @Test public void testServiceTaskNoInterfaceName() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ServiceTask-web-service.bpmn2"); + Application app = ProcessTestHelper.newApplication(); + ProcessTestHelper.registerHandler(app, "org.jbpm.bpmn2.services.Interface1_operation1_ServiceTask_2_Handler", new Interface1_operation1_ServiceTask_2_Handler()); + org.kie.kogito.process.Process definition = ServiceTaskWebServiceProcess.newProcess(app); - kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service Task", - new SystemOutWorkItemHandler() { + ServiceTaskWebServiceModel model = definition.createModel(); + org.kie.kogito.process.ProcessInstance instance = definition.createInstance(model); + instance.start(); - @Override - public void executeWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager manager) { - assertThat(workItem.getParameter("Interface")).isEqualTo("SimpleService"); - assertThat(workItem.getParameter("Operation")).isEqualTo("hello"); - assertThat(workItem.getParameter("ParameterType")).isEqualTo("java.lang.String"); - assertThat(workItem.getParameter("implementation")).isEqualTo("##WebService"); - assertThat(workItem.getParameter("operationImplementationRef")).isEqualTo("hello"); - assertThat(workItem.getParameter("interfaceImplementationRef")).isEqualTo("SimpleService"); - super.executeWorkItem(workItem, manager); - } + assertThat(instance.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_COMPLETED); - }); - Map params = new HashMap<>(); - KogitoWorkflowProcessInstance processInstance = (KogitoWorkflowProcessInstance) kruntime - .startProcess("org.jboss.qa.jbpm.CallWS", params); - assertProcessInstanceFinished(processInstance, kruntime); } @Test @@ -1131,17 +1106,16 @@ public void testInvalidServiceTask() { assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> createKogitoProcessRuntime("BPMN2-InvalidServiceProcess.bpmn2")); } - @Test // JBPM-3951 + @Test public void testServiceTaskInterface() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ServiceTask.bpmn2"); - - kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service Task", new SystemOutWorkItemHandler()); - Map params = new HashMap<>(); - - KogitoWorkflowProcessInstance processInstance = (KogitoWorkflowProcessInstance) kruntime - .startProcess("EAID_DP000000_23D3_4e7e_80FE_6D8C0AF83CAA", params); - assertProcessInstanceFinished(processInstance, kruntime); + Application app = ProcessTestHelper.newApplication(); + Interface1_operation1_EAID_3344916D_2BAC_4ab6_92D4_F739156D0933_Handler handler = new Interface1_operation1_EAID_3344916D_2BAC_4ab6_92D4_F739156D0933_Handler(); + ProcessTestHelper.registerHandler(app, handler.getName(), handler); + org.kie.kogito.process.Process definition = ServiceTaskProcess.newProcess(app); + org.kie.kogito.process.ProcessInstance instance = definition.createInstance(definition.createModel()); + instance.start(); + assertThat(instance.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_COMPLETED); } @SuppressWarnings("unchecked") 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 48374b5bd74..98611a1f179 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 @@ -38,9 +38,14 @@ import org.jbpm.bpmn2.event.BoundaryErrorEventSubProcessExceptionMappingProcess; import org.jbpm.bpmn2.handler.SignallingTaskHandlerDecorator; import org.jbpm.bpmn2.objects.ExceptionOnPurposeHandler; +import org.jbpm.bpmn2.objects.ExceptionService; import org.jbpm.bpmn2.objects.MyError; import org.jbpm.bpmn2.objects.Person; import org.jbpm.bpmn2.objects.TestWorkItemHandler; +import org.jbpm.bpmn2.service.ExceptionServiceProcessErrorSignallingModel; +import org.jbpm.bpmn2.service.ExceptionServiceProcessErrorSignallingProcess; +import org.jbpm.bpmn2.subprocess.ExceptionServiceProcessSignallingModel; +import org.jbpm.bpmn2.subprocess.ExceptionServiceProcessSignallingProcess; import org.jbpm.process.instance.event.listeners.RuleAwareProcessEventListener; import org.jbpm.process.instance.impl.demo.DoNothingWorkItemHandler; import org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler; @@ -52,6 +57,9 @@ 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.ExceptionService_handleException__X_2_Handler; +import org.kie.kogito.handlers.ExceptionService_throwException__2_Handler; +import org.kie.kogito.handlers.ExceptionService_throwException__3_Handler; import org.kie.kogito.handlers.HelloService_helloException_ServiceTask_2_Handler; import org.kie.kogito.handlers.LoggingComponent_logException__E5B0E78B_0112_42F4_89FF_0DCC4FCB6BCD_Handler; import org.kie.kogito.internal.process.event.DefaultKogitoProcessEventListener; @@ -331,16 +339,53 @@ public void abortWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager manager @Test public void testErrorSignallingExceptionServiceTask() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ExceptionServiceProcess-ErrorSignalling.bpmn2"); + String input = "this is my service input"; - StandaloneBPMNProcessTest.runTestErrorSignallingExceptionServiceTask(kruntime); + Application app = ProcessTestHelper.newApplication(); + SignallingTaskHandlerDecorator signallingTaskWrapper = new SignallingTaskHandlerDecorator(ExceptionService_throwException__3_Handler.class, "Error-code"); + signallingTaskWrapper.setWorkItemExceptionParameterName(ExceptionService.exceptionParameterName); + Object[] caughtEventObjectHolder = new Object[1]; + caughtEventObjectHolder[0] = null; + ExceptionService.setCaughtEventObjectHolder(caughtEventObjectHolder); + + ProcessTestHelper.registerHandler(app, "org.jbpm.bpmn2.objects.ExceptionService_throwException__3_Handler", signallingTaskWrapper); + ProcessTestHelper.registerHandler(app, "org.jbpm.bpmn2.objects.ExceptionService_handleException__X_2_Handler", new ExceptionService_handleException__X_2_Handler()); + org.kie.kogito.process.Process definition = ExceptionServiceProcessErrorSignallingProcess.newProcess(app); + + ExceptionServiceProcessErrorSignallingModel model = definition.createModel(); + model.setServiceInputItem(input); + org.kie.kogito.process.ProcessInstance instance = definition.createInstance(model); + instance.start(); + + ProcessTestHelper.completeWorkItem(instance, "john", Collections.emptyMap()); + assertThat(instance.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_ABORTED); + assertThat(caughtEventObjectHolder[0] != null && caughtEventObjectHolder[0] instanceof KogitoWorkItem).withFailMessage("Event was not passed to Event Subprocess.").isTrue(); } @Test public void testSignallingExceptionServiceTask() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ExceptionServiceProcess-Signalling.bpmn2"); + String input = "this is my service input"; + + SignallingTaskHandlerDecorator signallingTaskWrapper = new SignallingTaskHandlerDecorator(ExceptionService_throwException__2_Handler.class, "exception-signal"); + signallingTaskWrapper.setWorkItemExceptionParameterName(ExceptionService.exceptionParameterName); + Object[] caughtEventObjectHolder = new Object[1]; + caughtEventObjectHolder[0] = null; + ExceptionService.setCaughtEventObjectHolder(caughtEventObjectHolder); + + Application app = ProcessTestHelper.newApplication(); + ProcessTestHelper.registerHandler(app, "org.jbpm.bpmn2.objects.ExceptionService_throwException__2_Handler", signallingTaskWrapper); + ProcessTestHelper.registerHandler(app, "org.jbpm.bpmn2.objects.ExceptionService_handleException__X_2_Handler", new ExceptionService_handleException__X_2_Handler()); + org.kie.kogito.process.Process definition = ExceptionServiceProcessSignallingProcess.newProcess(app); + + ExceptionServiceProcessSignallingModel model = definition.createModel(); + model.setServiceInputItem(input); + org.kie.kogito.process.ProcessInstance instance = definition.createInstance(model); + instance.start(); + + ProcessTestHelper.completeWorkItem(instance, "john", Collections.emptyMap()); + assertThat(instance.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_COMPLETED); + assertThat(caughtEventObjectHolder[0] != null && caughtEventObjectHolder[0] instanceof KogitoWorkItem).withFailMessage("Event was not passed to Event Subprocess.").isTrue(); - StandaloneBPMNProcessTest.runTestSignallingExceptionServiceTask(kruntime); } @Test diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/IntermediateEventTest.java b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/IntermediateEventTest.java index 3ea81f5e6f6..6cf41494546 100755 --- a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/IntermediateEventTest.java +++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/IntermediateEventTest.java @@ -1632,12 +1632,6 @@ public void testConditionalBoundaryEventInterrupting() throws Exception { } - @Test - public void testSignallingExceptionServiceTask() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ExceptionServiceProcess-Signalling.bpmn2"); - StandaloneBPMNProcessTest.runTestSignallingExceptionServiceTask(kruntime); - } - @Test public void testSignalBoundaryEventOnSubprocessTakingDifferentPaths() throws Exception { kruntime = createKogitoProcessRuntime( diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StandaloneBPMNProcessTest.java b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StandaloneBPMNProcessTest.java index 32c2874cb4a..640515b1e1d 100755 --- a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StandaloneBPMNProcessTest.java +++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StandaloneBPMNProcessTest.java @@ -40,11 +40,8 @@ import org.jbpm.bpmn2.adhoc.AdHocTerminateEndEventProcess; import org.jbpm.bpmn2.handler.ReceiveTaskHandler; import org.jbpm.bpmn2.handler.SendTaskHandler; -import org.jbpm.bpmn2.handler.ServiceTaskHandler; -import org.jbpm.bpmn2.handler.SignallingTaskHandlerDecorator; import org.jbpm.bpmn2.intermediate.IntermediateThrowEventMessageModel; import org.jbpm.bpmn2.intermediate.IntermediateThrowEventMessageProcess; -import org.jbpm.bpmn2.objects.ExceptionService; import org.jbpm.bpmn2.objects.Person; import org.jbpm.bpmn2.objects.TestWorkItemHandler; import org.jbpm.process.instance.impl.demo.DoNothingWorkItemHandler; @@ -63,7 +60,6 @@ import org.kie.kogito.event.impl.MessageProducer; import org.kie.kogito.internal.process.event.DefaultKogitoProcessEventListener; import org.kie.kogito.internal.process.runtime.KogitoProcessInstance; -import org.kie.kogito.internal.process.runtime.KogitoProcessRuntime; import org.kie.kogito.internal.process.runtime.KogitoWorkItem; import org.kie.kogito.internal.process.runtime.KogitoWorkflowProcessInstance; import org.w3c.dom.Document; @@ -651,18 +647,6 @@ public void testErrorEndEventProcess() throws Exception { assertProcessInstanceAborted(processInstance.getStringId(), kruntime); } - @Test - public void testServiceTask() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ServiceProcess.bpmn2"); - - kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service Task", new ServiceTaskHandler()); - Map params = new HashMap<>(); - params.put("s", "john"); - KogitoWorkflowProcessInstance processInstance = (KogitoWorkflowProcessInstance) kruntime.startProcess("ServiceProcess", params); - assertProcessInstanceCompleted(processInstance.getStringId(), kruntime); - assertThat(processInstance.getVariable("s")).isEqualTo("Hello john!"); - } - @Test public void testSendTask() throws Exception { kruntime = createKogitoProcessRuntime("org/jbpm/bpmn2/task/BPMN2-SendTask.bpmn2"); @@ -793,60 +777,6 @@ public void testNoneIntermediateThrow() throws Exception { assertThat(processInstance.getState()).isEqualTo(KogitoProcessInstance.STATE_COMPLETED); } - @Test - public void testErrorSignallingExceptionServiceTask() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ExceptionServiceProcess-ErrorSignalling.bpmn2"); - - runTestErrorSignallingExceptionServiceTask(kruntime); - } - - public static void runTestErrorSignallingExceptionServiceTask(KogitoProcessRuntime kruntime) throws Exception { - - // Setup - String eventType = "Error-code"; - SignallingTaskHandlerDecorator signallingTaskWrapper = new SignallingTaskHandlerDecorator(ServiceTaskHandler.class, eventType); - signallingTaskWrapper.setWorkItemExceptionParameterName(ExceptionService.exceptionParameterName); - kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service Task", signallingTaskWrapper); - - Object[] caughtEventObjectHolder = new Object[1]; - caughtEventObjectHolder[0] = null; - ExceptionService.setCaughtEventObjectHolder(caughtEventObjectHolder); - - TestWorkItemHandler workItemHandler = new TestWorkItemHandler(); - kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Human Task", workItemHandler); - // Start process - Map params = new HashMap<>(); - String input = "this is my service input"; - params.put("serviceInputItem", input); - KogitoProcessInstance processInstance = kruntime.startProcess("ServiceProcess", params); - - assertThat(processInstance.getState()).isEqualTo(KogitoProcessInstance.STATE_ACTIVE); - - KogitoWorkItem workItem = workItemHandler.getWorkItem(); - assertThat(workItem).isNotNull(); - kruntime.getKogitoWorkItemManager().completeWorkItem(workItem.getStringId(), null); - // Check that event was passed to Event SubProcess (and grabbed by WorkItemHandler); - assertThat(caughtEventObjectHolder[0] != null && caughtEventObjectHolder[0] instanceof KogitoWorkItem).withFailMessage("Event was not passed to Event Subprocess.").isTrue(); - workItem = (KogitoWorkItem) caughtEventObjectHolder[0]; - Object throwObj = workItem.getParameter(ExceptionService.exceptionParameterName); - assertThat(throwObj).withFailMessage("KogitoWorkItem doesn't contain Throwable.").isInstanceOf(Throwable.class); - assertThat(((Throwable) throwObj).getMessage()).withFailMessage("Exception message does not match service input.").endsWith(input); - - // Complete process - processInstance = kruntime.getProcessInstance(processInstance.getStringId()); - assertThat(processInstance == null || processInstance.getState() == KogitoProcessInstance.STATE_ABORTED).withFailMessage("Process instance has not been aborted.").isTrue(); - - } - - @Test - public void testSignallingExceptionServiceTask() throws Exception { - // dump/reread functionality seems to work for this test - // .. but I'm pretty sure that's more coincidence than design (mriet, 2013-03-06) - kruntime = createKogitoProcessRuntime("BPMN2-ExceptionServiceProcess-Signalling.bpmn2"); - - runTestSignallingExceptionServiceTask(kruntime); - } - @Test public void testXXEProcessVulnerability() throws Exception { Resource processResource = ResourceFactory.newClassPathResource("xxe-protection/BPMN2-XXE-Process.bpmn2"); @@ -898,38 +828,4 @@ public void testVariableRefInIntermediateThrowEvent() throws Exception { assertThat(processInstance).isNotNull(); } - public static void runTestSignallingExceptionServiceTask(KogitoProcessRuntime kruntime) throws Exception { - - // Setup - String eventType = "exception-signal"; - SignallingTaskHandlerDecorator signallingTaskWrapper = new SignallingTaskHandlerDecorator(ServiceTaskHandler.class, eventType); - signallingTaskWrapper.setWorkItemExceptionParameterName(ExceptionService.exceptionParameterName); - kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service Task", signallingTaskWrapper); - - Object[] caughtEventObjectHolder = new Object[1]; - caughtEventObjectHolder[0] = null; - ExceptionService.setCaughtEventObjectHolder(caughtEventObjectHolder); - - // Start process - Map params = new HashMap<>(); - String input = "this is my service input"; - params.put("serviceInputItem", input); - KogitoProcessInstance processInstance = kruntime.startProcess("ServiceProcess", params); - - // Check that event was passed to Event SubProcess (and grabbed by WorkItemHandler); - assertThat(caughtEventObjectHolder[0] != null && caughtEventObjectHolder[0] instanceof KogitoWorkItem).withFailMessage("Event was not passed to Event Subprocess.").isTrue(); - KogitoWorkItem workItem = (KogitoWorkItem) caughtEventObjectHolder[0]; - Object throwObj = workItem.getParameter(ExceptionService.exceptionParameterName); - assertThat(throwObj).withFailMessage("KogitoWorkItem doesn't contain Throwable.").isInstanceOf(Throwable.class); - assertThat(((Throwable) throwObj).getMessage()).withFailMessage("Exception message does not match service input.").endsWith(input); - - // Complete process - assertThat(processInstance.getState()).withFailMessage("Process instance is not active.").isEqualTo(KogitoProcessInstance.STATE_ACTIVE); - kruntime.getKogitoWorkItemManager().completeWorkItem(workItem.getStringId(), null); - processInstance = kruntime.getProcessInstance(processInstance.getStringId()); - if (processInstance != null) { - assertThat(processInstance.getState()).withFailMessage("Process instance is not completed.").isEqualTo(KogitoProcessInstance.STATE_COMPLETED); - } // otherwise, persistence use => processInstance == null => process is completed - } - } diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/handler/LoggingTaskHandlerWrapperTest.java b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/handler/LoggingTaskHandlerWrapperTest.java index d830287b1b9..9668f485b03 100755 --- a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/handler/LoggingTaskHandlerWrapperTest.java +++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/handler/LoggingTaskHandlerWrapperTest.java @@ -19,31 +19,47 @@ package org.jbpm.bpmn2.handler; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.jbpm.bpmn2.JbpmBpmn2TestCase; import org.jbpm.bpmn2.handler.LoggingTaskHandlerDecorator.InputParameter; +import org.jbpm.bpmn2.subprocess.ExceptionThrowingServiceProcessModel; +import org.jbpm.bpmn2.subprocess.ExceptionThrowingServiceProcessProcess; +import org.jbpm.test.utils.ProcessTestHelper; import org.junit.jupiter.api.Test; +import org.kie.kogito.Application; +import org.kie.kogito.handlers.ExceptionService_throwException__2_Handler; +import org.slf4j.LoggerFactory; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; import static org.assertj.core.api.Assertions.assertThat; -public class LoggingTaskHandlerWrapperTest extends JbpmBpmn2TestCase { +public class LoggingTaskHandlerWrapperTest { @Test public void testLimitExceptionInfoList() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ExceptionThrowingServiceProcess.bpmn2"); + Application app = ProcessTestHelper.newApplication(); - LoggingTaskHandlerDecorator loggingTaskHandlerWrapper = new LoggingTaskHandlerDecorator(ServiceTaskHandler.class, 2); - loggingTaskHandlerWrapper.setPrintStackTrace(false); - kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service Task", loggingTaskHandlerWrapper); + LoggingTaskHandlerDecorator loggingTaskHandlerWrapper = new LoggingTaskHandlerDecorator(ExceptionService_throwException__2_Handler.class, 2); + + ProcessTestHelper.registerHandler(app, "org.jbpm.bpmn2.objects.ExceptionService_throwException__2_Handler", loggingTaskHandlerWrapper); + + org.kie.kogito.process.Process definition = ExceptionThrowingServiceProcessProcess.newProcess(app); + ExceptionThrowingServiceProcessModel model = definition.createModel(); + model.setServiceInputItem("exception message"); + org.kie.kogito.process.ProcessInstance instance1 = definition.createInstance(model); + instance1.start(); + assertThat(instance1.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_ACTIVE); - Map params = new HashMap<>(); - params.put("serviceInputItem", "exception message"); - kruntime.startProcess("ServiceProcess", params); - kruntime.startProcess("ServiceProcess", params); - kruntime.startProcess("ServiceProcess", params); + org.kie.kogito.process.ProcessInstance instance2 = definition.createInstance(model); + instance2.start(); + assertThat(instance2.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_ACTIVE); + + org.kie.kogito.process.ProcessInstance instance3 = definition.createInstance(model); + instance3.start(); + assertThat(instance3.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_ACTIVE); int size = loggingTaskHandlerWrapper.getWorkItemExceptionInfoList().size(); assertThat(size).as("WorkItemExceptionInfoList is too large: " + size).isEqualTo(2); @@ -51,26 +67,41 @@ public void testLimitExceptionInfoList() throws Exception { @Test public void testFormatLoggingError() throws Exception { - kruntime = createKogitoProcessRuntime("BPMN2-ExceptionThrowingServiceProcess.bpmn2"); + ListAppender logAppender = new ListAppender<>(); + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + logAppender.setContext(loggerContext); + ch.qos.logback.classic.Logger decoratorLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LoggingTaskHandlerDecorator.class); + decoratorLogger.addAppender(logAppender); + + logAppender.start(); + + Application app = ProcessTestHelper.newApplication(); - LoggingTaskHandlerDecorator loggingTaskHandlerWrapper = new LoggingTaskHandlerDecorator(ServiceTaskHandler.class, 2); + LoggingTaskHandlerDecorator loggingTaskHandlerWrapper = new LoggingTaskHandlerDecorator(ExceptionService_throwException__2_Handler.class, 2); + LoggingTaskHandlerDecorator.setLogger(decoratorLogger); loggingTaskHandlerWrapper.setLoggedMessageFormat("{0} - {1} - {2} - {3}"); List inputParameters = new ArrayList(); inputParameters.add(InputParameter.EXCEPTION_CLASS); inputParameters.add(InputParameter.WORK_ITEM_ID); inputParameters.add(InputParameter.WORK_ITEM_NAME); inputParameters.add(InputParameter.PROCESS_INSTANCE_ID); - loggingTaskHandlerWrapper.setLoggedMessageInput(inputParameters); - loggingTaskHandlerWrapper.setPrintStackTrace(false); - kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service Task", loggingTaskHandlerWrapper); - Map params = new HashMap<>(); - params.put("serviceInputItem", "exception message"); - kruntime.startProcess("ServiceProcess", params); - kruntime.startProcess("ServiceProcess", params); - kruntime.startProcess("ServiceProcess", params); + ProcessTestHelper.registerHandler(app, "org.jbpm.bpmn2.objects.ExceptionService_throwException__2_Handler", loggingTaskHandlerWrapper); + + org.kie.kogito.process.Process definition = ExceptionThrowingServiceProcessProcess.newProcess(app); + ExceptionThrowingServiceProcessModel model = definition.createModel(); + model.setServiceInputItem("exception message"); + org.kie.kogito.process.ProcessInstance instance1 = definition.createInstance(model); + instance1.start(); + assertThat(instance1.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_ACTIVE); + + String wid = loggingTaskHandlerWrapper.getWorkItemExceptionInfoList().get(0).getWorkItemId(); + assertThat(logAppender.list.get(0).getFormattedMessage()).isEqualTo("RuntimeException - " + wid + " - org.jbpm.bpmn2.objects.ExceptionService_throwException__2_Handler - " + instance1.id()); + + decoratorLogger.detachAppender(logAppender); + } }