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-examples.git
The following commit(s) were added to refs/heads/main by this push:
new 0d1096ca3 [incubator-kie-issues-1439] UserTask Decouple codegen and
interface from engine (#2009)
0d1096ca3 is described below
commit 0d1096ca360daac24c9ef8ece22e91f94223a31e
Author: Enrique <[email protected]>
AuthorDate: Wed Sep 18 08:47:08 2024 +0200
[incubator-kie-issues-1439] UserTask Decouple codegen and interface from
engine (#2009)
---
.../kogito/examples/BaseWorkItemHandlerConfig.java | 2 +-
.../onboarding/DecisionTaskWorkItemHandler.java | 20 ++-
.../kie/kogito/examples/WorkItemHandlerConfig.java | 2 +-
.../examples/onboarding/OnboardingEndpointIT.java | 4 +-
.../test/RecordedOutputWorkItemHandler.java | 21 ++-
.../org/acme/wih/CustomTaskWorkItemHandler.java | 29 ++--
.../config/CustomWorkItemHandlerConfig.java | 5 +-
.../travels/usertasks/CompleteStartedOnly.java | 49 -------
.../usertasks/CustomHumanTaskLifeCycle.java | 149 ---------------------
.../usertasks/CustomHumanTaskWorkItemHandler.java | 72 ++++++++++
.../java/org/acme/travels/usertasks/Start.java | 67 ---------
.../lifecycle/quarkus/ApprovalsProcessTest.java | 34 ++---
.../acme/travels/quarkus/ApprovalsProcessTest.java | 23 ++--
.../java/org/acme/travels/ApprovalsProcessIT.java | 20 +--
.../security/quarkus/ApprovalsProcessTest.java | 19 ++-
.../kie/kogito/examples/WorkItemHandlerConfig.java | 2 +-
.../onboarding/DecisionTaskWorkItemHandler.java | 21 ++-
.../examples/onboarding/OnboardingEndpointIT.java | 4 +-
.../test/RecordedOutputWorkItemHandler.java | 21 ++-
.../test/RecordedWorkItemHandlerConfig.java | 2 +-
.../config/CustomWorkItemHandlerConfig.java | 5 +-
.../travels/usertasks/CompleteStartedOnly.java | 49 -------
.../usertasks/CustomHumanTaskLifeCycle.java | 149 ---------------------
.../usertasks/CustomHumanTaskWorkItemHandler.java | 73 ++++++++++
.../java/org/acme/travels/usertasks/Start.java | 67 ---------
.../lifecycle/springboot/ApprovalsProcessTest.java | 42 +++---
.../travels/springboot/ApprovalsProcessTest.java | 21 ++-
.../oidc/springboot/ApprovalsProcessTest.java | 19 ++-
.../security/springboot/ApprovalsProcessTest.java | 19 ++-
.../sw/custom/RPCCustomWorkItemHandler.java | 17 ++-
30 files changed, 331 insertions(+), 696 deletions(-)
diff --git
a/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/main/java/org/kie/kogito/examples/BaseWorkItemHandlerConfig.java
b/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/main/java/org/kie/kogito/examples/BaseWorkItemHandlerConfig.java
index ab82bcc7c..9b9d6ad92 100644
---
a/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/main/java/org/kie/kogito/examples/BaseWorkItemHandlerConfig.java
+++
b/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/main/java/org/kie/kogito/examples/BaseWorkItemHandlerConfig.java
@@ -31,7 +31,7 @@ import org.kie.kogito.addons.k8s.EndpointQueryKey;
import org.kie.kogito.addons.k8s.LocalEndpointDiscovery;
import
org.kie.kogito.addons.quarkus.k8s.workitems.QuarkusDiscoveredEndpointCaller;
import org.kie.kogito.examples.onboarding.DecisionTaskWorkItemHandler;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
import jakarta.annotation.PostConstruct;
diff --git
a/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/main/java/org/kie/kogito/examples/onboarding/DecisionTaskWorkItemHandler.java
b/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/main/java/org/kie/kogito/examples/onboarding/DecisionTaskWorkItemHandler.java
index 25ffb1aa0..8ddf1cd26 100644
---
a/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/main/java/org/kie/kogito/examples/onboarding/DecisionTaskWorkItemHandler.java
+++
b/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/main/java/org/kie/kogito/examples/onboarding/DecisionTaskWorkItemHandler.java
@@ -19,15 +19,18 @@
package org.kie.kogito.examples.onboarding;
import java.util.Map;
+import java.util.Optional;
import
org.kie.kogito.addons.quarkus.k8s.workitems.QuarkusDiscoveredEndpointCaller;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.WorkItemTransition;
+import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
import jakarta.ws.rs.HttpMethod;
-public class DecisionTaskWorkItemHandler implements KogitoWorkItemHandler {
+public class DecisionTaskWorkItemHandler extends DefaultKogitoWorkItemHandler {
private QuarkusDiscoveredEndpointCaller endpointCaller;
@@ -36,14 +39,9 @@ public class DecisionTaskWorkItemHandler implements
KogitoWorkItemHandler {
}
@Override
- public void executeWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager
manager) {
+ public Optional<WorkItemTransition>
activateWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler
handler, KogitoWorkItem workItem, WorkItemTransition transition) {
Map<String, Object> results = endpointCaller.discoverAndCall(workItem,
System.getenv("NAMESPACE"), "Decision", HttpMethod.POST);
- manager.completeWorkItem(workItem.getStringId(), results);
- }
-
- @Override
- public void abortWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager
manager) {
-
+ return
Optional.of(handler.completeTransition(workItem.getPhaseStatus(), results));
}
@Override
diff --git
a/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/WorkItemHandlerConfig.java
b/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/WorkItemHandlerConfig.java
index 98dc9a248..77926dd05 100644
---
a/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/WorkItemHandlerConfig.java
+++
b/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/WorkItemHandlerConfig.java
@@ -19,7 +19,7 @@
package org.kie.kogito.examples;
import org.kie.kogito.examples.test.RecordedOutputWorkItemHandler;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
public class WorkItemHandlerConfig extends BaseWorkItemHandlerConfig {
diff --git
a/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/onboarding/OnboardingEndpointIT.java
b/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/onboarding/OnboardingEndpointIT.java
index d640de590..70d1de4b0 100644
---
a/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/onboarding/OnboardingEndpointIT.java
+++
b/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/onboarding/OnboardingEndpointIT.java
@@ -28,8 +28,8 @@ import java.util.function.Function;
import org.junit.jupiter.api.Test;
import org.kie.kogito.examples.test.RecordedOutputWorkItemHandler;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.ProcessConfig;
import org.kie.kogito.testcontainers.quarkus.InfinispanQuarkusTestResource;
diff --git
a/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/test/RecordedOutputWorkItemHandler.java
b/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/test/RecordedOutputWorkItemHandler.java
index 05a679991..f7559da0d 100644
---
a/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/test/RecordedOutputWorkItemHandler.java
+++
b/kogito-quarkus-examples/onboarding-example/onboarding-quarkus/src/test/java/org/kie/kogito/examples/test/RecordedOutputWorkItemHandler.java
@@ -20,26 +20,23 @@ package org.kie.kogito.examples.test;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import java.util.function.Function;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.WorkItemTransition;
+import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
-public class RecordedOutputWorkItemHandler implements KogitoWorkItemHandler {
+public class RecordedOutputWorkItemHandler extends
DefaultKogitoWorkItemHandler {
private Map<String, Function<KogitoWorkItem, Map<String, Object>>>
recorded = new HashMap<>();
@Override
- public void executeWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager
manager) {
+ public Optional<WorkItemTransition>
activateWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler
handler, KogitoWorkItem workItem, WorkItemTransition transition) {
Map<String, Object> results =
recorded.remove(workItem.getParameter("TaskName")).apply(workItem);
-
- manager.completeWorkItem(workItem.getStringId(), results);
- }
-
- @Override
- public void abortWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager
manager) {
-
+ return
Optional.of(handler.completeTransition(workItem.getPhaseStatus(), results));
}
public void record(String name, Function<KogitoWorkItem, Map<String,
Object>> item) {
diff --git
a/kogito-quarkus-examples/process-error-handling/src/main/java/org/acme/wih/CustomTaskWorkItemHandler.java
b/kogito-quarkus-examples/process-error-handling/src/main/java/org/acme/wih/CustomTaskWorkItemHandler.java
index ee6309cd6..aba8a9730 100644
---
a/kogito-quarkus-examples/process-error-handling/src/main/java/org/acme/wih/CustomTaskWorkItemHandler.java
+++
b/kogito-quarkus-examples/process-error-handling/src/main/java/org/acme/wih/CustomTaskWorkItemHandler.java
@@ -20,20 +20,23 @@ package org.acme.wih;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import org.kie.api.runtime.process.ProcessWorkItemHandlerException;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.WorkItemTransition;
+import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class CustomTaskWorkItemHandler implements KogitoWorkItemHandler {
+public class CustomTaskWorkItemHandler extends DefaultKogitoWorkItemHandler {
private static final Logger LOG =
LoggerFactory.getLogger(CustomTaskWorkItemHandler.class);
@Override
- public void executeWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager
manager) {
+ public Optional<WorkItemTransition>
activateWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler
handler, KogitoWorkItem workItem, WorkItemTransition transition) {
LOG.debug("start");
LOG.debug("Passed parameters:");
@@ -51,15 +54,22 @@ public class CustomTaskWorkItemHandler implements
KogitoWorkItemHandler {
if (input.matches("(RETRY|COMPLETE|RETHROW)")) {
handleError(input);
} else if (input.contentEquals("ABORT")) {
- manager.abortWorkItem(workItem.getStringId());
+ return
Optional.of(handler.abortTransition(workItem.getPhaseStatus()));
} else {
// Don’t forget to finish the work item otherwise the process
// will be active infinitely and never will pass the flow
// to the next node.
- manager.completeWorkItem(workItem.getStringId(), results);
+ return
Optional.of(handler.completeTransition(workItem.getPhaseStatus(), results));
}
LOG.debug("end");
+ return Optional.empty();
+ }
+
+ @Override
+ public Optional<WorkItemTransition>
abortWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler
handler, KogitoWorkItem workitem, WorkItemTransition transition) {
+ LOG.debug("ABORT!");
+ return Optional.empty();
}
private void handleError(String strategy) {
@@ -68,9 +78,4 @@ public class CustomTaskWorkItemHandler implements
KogitoWorkItemHandler {
new IllegalStateException(strategy + " strategy test"));
}
- @Override
- public void abortWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager
manager) {
- LOG.debug("ABORT!");
- manager.abortWorkItem(workItem.getStringId());
- }
}
\ No newline at end of file
diff --git
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/config/CustomWorkItemHandlerConfig.java
b/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/config/CustomWorkItemHandlerConfig.java
index 2e973282b..745f9f2e0 100644
---
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/config/CustomWorkItemHandlerConfig.java
+++
b/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/config/CustomWorkItemHandlerConfig.java
@@ -18,8 +18,7 @@
*/
package org.acme.travels.config;
-import org.acme.travels.usertasks.CustomHumanTaskLifeCycle;
-import org.jbpm.process.instance.impl.humantask.HumanTaskWorkItemHandler;
+import org.acme.travels.usertasks.CustomHumanTaskWorkItemHandler;
import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
import jakarta.enterprise.context.ApplicationScoped;
@@ -37,6 +36,6 @@ import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class CustomWorkItemHandlerConfig extends DefaultWorkItemHandlerConfig {
{
- register("Human Task", new HumanTaskWorkItemHandler(new
CustomHumanTaskLifeCycle()));
+ register("Human Task", new CustomHumanTaskWorkItemHandler());
}
}
diff --git
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/CompleteStartedOnly.java
b/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/CompleteStartedOnly.java
deleted file mode 100644
index 7465bf0a4..000000000
---
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/CompleteStartedOnly.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.acme.travels.usertasks;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.jbpm.process.instance.impl.workitem.Complete;
-import org.kie.kogito.process.workitem.LifeCyclePhase;
-
-/**
- * Extension to Complete life cycle phase that applies to any human task.
- * It will set the status to "Completed"
- *
- * This phase will only allow to complete tasks that are in started phase.
- *
- * It can transition from
- * <ul>
- * <li>Start</li>
- * </ul>
- *
- * This is a terminating (final) phase.
- */
-public class CompleteStartedOnly extends Complete {
-
- private List<String> allowedTransitions = Arrays.asList(Start.ID);
-
- @Override
- public boolean canTransition(LifeCyclePhase phase) {
- return allowedTransitions.contains(phase.id());
- }
-
-}
diff --git
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/CustomHumanTaskLifeCycle.java
b/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/CustomHumanTaskLifeCycle.java
deleted file mode 100644
index c83b80302..000000000
---
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/CustomHumanTaskLifeCycle.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * 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.acme.travels.usertasks;
-
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.jbpm.process.instance.impl.humantask.BaseHumanTaskLifeCycle;
-import org.jbpm.process.instance.impl.humantask.InternalHumanTaskWorkItem;
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.humantask.phases.Release;
-import org.jbpm.process.instance.impl.humantask.phases.Skip;
-import org.jbpm.process.instance.impl.workitem.Abort;
-import org.jbpm.process.instance.impl.workitem.Active;
-import org.jbpm.process.instance.impl.workitem.Complete;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemManager;
-import org.kie.kogito.process.workitem.InvalidLifeCyclePhaseException;
-import org.kie.kogito.process.workitem.InvalidTransitionException;
-import org.kie.kogito.process.workitem.LifeCycle;
-import org.kie.kogito.process.workitem.LifeCyclePhase;
-import org.kie.kogito.process.workitem.NotAuthorizedException;
-import org.kie.kogito.process.workitem.Policy;
-import org.kie.kogito.process.workitem.Transition;
-import org.kie.kogito.process.workitems.InternalKogitoWorkItemManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Custom life cycle definition for human tasks. It comes with following phases
- *
- * <ul>
- * <li>Active</li>
- * <li>Claim</li>
- * <li>Release</li>
- * <li>Start</li>
- * <li>Complete - extended one that allows to only complete started tasks</li>
- * <li>Skip</li>
- * <li>Abort</li>
- * </ul>
- * At the beginning human task enters
- *
- * <pre>
- * Active
- * </pre>
- *
- * phase. From there it can go to
- *
- * <ul>
- * <li>Claim</li>
- * <li>Skip</li>
- * <li>Abort</li>
- * </ul>
- *
- * at any time. At each phase data can be associated and by that set on work
item.
- *
- * Completion can only be performed on started tasks.
- */
-public class CustomHumanTaskLifeCycle implements LifeCycle<Map<String,
Object>> {
-
- private static final Logger logger =
LoggerFactory.getLogger(BaseHumanTaskLifeCycle.class);
-
- private Map<String, LifeCyclePhase> phases = new LinkedHashMap<>();
-
- public CustomHumanTaskLifeCycle() {
- phases.put(Claim.ID, new Claim());
- phases.put(Release.ID, new Release());
- phases.put(Start.ID, new Start());
- phases.put(Complete.ID, new CompleteStartedOnly());
- phases.put(Skip.ID, new Skip());
- phases.put(Active.ID, new Active());
- phases.put(Abort.ID, new Abort());
- }
-
- @Override
- public LifeCyclePhase phaseById(String phaseId) {
- return phases.get(phaseId);
- }
-
- @Override
- public Collection<LifeCyclePhase> phases() {
- return phases.values();
- }
-
- @Override
- public Map<String, Object> transitionTo(KogitoWorkItem workItem,
KogitoWorkItemManager manager, Transition<Map<String, Object>> transition) {
- logger.debug("Transition method invoked for work item {} to transition
to {}, currently in phase {} and status {}", workItem.getStringId(),
transition.phase(), workItem.getPhaseId(),
- workItem.getPhaseStatus());
-
- InternalHumanTaskWorkItem humanTaskWorkItem =
(InternalHumanTaskWorkItem) workItem;
-
- LifeCyclePhase targetPhase = phases.get(transition.phase());
- if (targetPhase == null) {
- logger.debug("Target life cycle phase '{}' does not exist in {}",
transition.phase(), this.getClass().getSimpleName());
- throw new InvalidLifeCyclePhaseException(transition.phase());
- }
-
- LifeCyclePhase currentPhase =
phases.get(humanTaskWorkItem.getPhaseId());
-
- if (!targetPhase.canTransition(currentPhase)) {
- logger.debug("Target life cycle phase '{}' cannot transition from
current state '{}'", targetPhase.id(), currentPhase.id());
- throw new InvalidTransitionException("Cannot transition from " +
humanTaskWorkItem.getPhaseId() + " to " + targetPhase.id());
- }
-
- if (!targetPhase.id().equals(Active.ID) &&
!targetPhase.id().equals(Abort.ID) &&
!humanTaskWorkItem.enforce(transition.policies().toArray(new
Policy[transition.policies().size()]))) {
- throw new NotAuthorizedException("User is not authorized to access
task instance with id " + humanTaskWorkItem.getStringId());
- }
-
- humanTaskWorkItem.setPhaseId(targetPhase.id());
- humanTaskWorkItem.setPhaseStatus(targetPhase.status());
-
- targetPhase.apply(humanTaskWorkItem, transition);
- if (transition.data() != null) {
- logger.debug("Updating data for phase {} and work item {}",
targetPhase.id(), humanTaskWorkItem.getStringId());
- humanTaskWorkItem.getResults().putAll(transition.data());
- }
- logger.debug("Transition for work item {} to {} done, currently in
phase {} and status {}", workItem.getStringId(), transition.phase(),
workItem.getPhaseId(), workItem.getPhaseStatus());
-
- if (targetPhase.isTerminating()) {
- logger.debug("Target life cycle phase '{}' is terminiating,
completing work item {}", targetPhase.id(), humanTaskWorkItem.getStringId());
- // since target life cycle phase is terminating completing work
item
- ((InternalKogitoWorkItemManager)
manager).internalCompleteWorkItem(humanTaskWorkItem);
- }
-
- return data(humanTaskWorkItem);
- }
-
- @Override
- public Map<String, Object> data(KogitoWorkItem workItem) {
- return ((InternalHumanTaskWorkItem) workItem).getResults();
- }
-}
diff --git
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/CustomHumanTaskWorkItemHandler.java
b/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/CustomHumanTaskWorkItemHandler.java
new file mode 100644
index 000000000..0a3fa0eab
--- /dev/null
+++
b/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/CustomHumanTaskWorkItemHandler.java
@@ -0,0 +1,72 @@
+/*
+ * 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.acme.travels.usertasks;
+
+import java.util.Optional;
+
+import org.kie.kogito.auth.SecurityPolicy;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.WorkItemLifeCycle;
+import org.kie.kogito.internal.process.workitem.WorkItemPhaseState;
+import org.kie.kogito.internal.process.workitem.WorkItemTerminationType;
+import org.kie.kogito.internal.process.workitem.WorkItemTransition;
+import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
+import org.kie.kogito.process.workitems.impl.DefaultWorkItemLifeCycle;
+import org.kie.kogito.process.workitems.impl.DefaultWorkItemLifeCyclePhase;
+
+public class CustomHumanTaskWorkItemHandler extends
DefaultKogitoWorkItemHandler {
+
+ public static final String TRANSITION_COMPLETE = "complete";
+ public static final String TRANSITION_ABORT = "abort";
+ public static final String TRANSITION_ACTIVATE = "activate";
+ public static final String TRANSITION_START = "start";
+ public static final String TRANSITION_SKIP = "skip";
+
+ @Override
+ public WorkItemLifeCycle initialize() {
+ WorkItemPhaseState initialized = WorkItemPhaseState.initialized();
+ WorkItemPhaseState completed = WorkItemPhaseState.of("Completed",
WorkItemTerminationType.COMPLETE);
+ WorkItemPhaseState aborted = WorkItemPhaseState.of("Aborted",
WorkItemTerminationType.ABORT);
+ WorkItemPhaseState activated = WorkItemPhaseState.of("Activated");
+ WorkItemPhaseState started = WorkItemPhaseState.of("Started");
+
+ DefaultWorkItemLifeCyclePhase active = new
DefaultWorkItemLifeCyclePhase(TRANSITION_ACTIVATE, initialized, activated,
this::activateWorkItemHandler);
+ DefaultWorkItemLifeCyclePhase start = new
DefaultWorkItemLifeCyclePhase(TRANSITION_START, activated, started,
this::activateWorkItemHandler);
+ DefaultWorkItemLifeCyclePhase complete = new
DefaultWorkItemLifeCyclePhase(TRANSITION_COMPLETE, started, completed,
this::completeWorkItemHandler);
+ DefaultWorkItemLifeCyclePhase abort = new
DefaultWorkItemLifeCyclePhase(TRANSITION_ABORT, started, aborted,
this::abortWorkItemHandler);
+
+ return new DefaultWorkItemLifeCycle(active, start, abort, complete);
+ }
+
+ @Override
+ public Optional<WorkItemTransition>
completeWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler
handler, KogitoWorkItem workitem, WorkItemTransition transition) {
+ getUserFromTransition(transition).ifPresent(e ->
workitem.setOutput("ActorId", e));
+ return Optional.empty();
+ }
+
+ private Optional<String> getUserFromTransition(WorkItemTransition
transition) {
+ Optional<SecurityPolicy> securityPolicy =
transition.policies().stream().filter(SecurityPolicy.class::isInstance).map(SecurityPolicy.class::cast).findAny();
+ if (securityPolicy.isPresent()) {
+ return Optional.ofNullable(securityPolicy.get().getUser());
+ }
+ return Optional.empty();
+ }
+}
diff --git
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/Start.java
b/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/Start.java
deleted file mode 100644
index 7a5199de1..000000000
---
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/main/java/org/acme/travels/usertasks/Start.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.acme.travels.usertasks;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.humantask.phases.Release;
-import org.jbpm.process.instance.impl.workitem.Active;
-import org.kie.kogito.process.workitem.LifeCyclePhase;
-
-/**
- * Start life cycle phase that applies to any human task.
- * It will set the status to "Started"
- *
- * It can transition from
- * <ul>
- * <li>Active</li>
- * <li>Claim</li>
- * <li>Release</li>
- * </ul>
- *
- */
-public class Start implements LifeCyclePhase {
-
- public static final String ID = "start";
- public static final String STATUS = "Started";
-
- private List<String> allowedTransitions = Arrays.asList(Active.ID,
Claim.ID, Release.ID);
-
- @Override
- public String id() {
- return ID;
- }
-
- @Override
- public String status() {
- return STATUS;
- }
-
- @Override
- public boolean isTerminating() {
- return false;
- }
-
- @Override
- public boolean canTransition(LifeCyclePhase phase) {
- return allowedTransitions.contains(phase.id());
- }
-}
diff --git
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/test/java/org/acme/travels/custom/lifecycle/quarkus/ApprovalsProcessTest.java
b/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/test/java/org/acme/travels/custom/lifecycle/quarkus/ApprovalsProcessTest.java
index 573ab8f19..59af5b65f 100644
---
a/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/test/java/org/acme/travels/custom/lifecycle/quarkus/ApprovalsProcessTest.java
+++
b/kogito-quarkus-examples/process-usertasks-custom-lifecycle-quarkus/src/test/java/org/acme/travels/custom/lifecycle/quarkus/ApprovalsProcessTest.java
@@ -25,25 +25,23 @@ import java.util.Map;
import org.acme.travels.Address;
import org.acme.travels.Traveller;
-import org.acme.travels.usertasks.Start;
-import org.jbpm.process.instance.impl.humantask.HumanTaskTransition;
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.workitem.Complete;
import org.junit.jupiter.api.Test;
import org.kie.kogito.Model;
import org.kie.kogito.auth.IdentityProvider;
import org.kie.kogito.auth.IdentityProviders;
import org.kie.kogito.auth.SecurityPolicy;
+import org.kie.kogito.internal.process.workitem.InvalidTransitionException;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.Process;
import org.kie.kogito.process.ProcessInstance;
import org.kie.kogito.process.WorkItem;
-import org.kie.kogito.process.workitem.InvalidTransitionException;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.inject.Inject;
import jakarta.inject.Named;
+import static java.util.Collections.singletonList;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -78,9 +76,12 @@ public class ApprovalsProcessTest {
assertEquals(1, workItems.size());
Map<String, Object> results = new HashMap<>();
results.put("approved", true);
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Start.ID, null, policy));
+ KogitoWorkItemHandler handler =
approvalsProcess.getKogitoWorkItemHandler(workItems.get(0).getWorkItemHandlerName());
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("start", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
+ workItems = processInstance.workItems(policy);
processInstance.completeWorkItem(workItems.get(0).getId(), results,
policy);
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -93,7 +94,8 @@ public class ApprovalsProcessTest {
assertEquals(1, workItems.size());
results.put("approved", false);
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Start.ID, null, policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("start", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
+ workItems = processInstance.workItems(policy);
processInstance.completeWorkItem(workItems.get(0).getId(), results,
policy);
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED,
processInstance.status());
@@ -129,15 +131,17 @@ public class ApprovalsProcessTest {
final String wiId = workItems.get(0).getId();
// test to make sure you can't complete if the task is not in started
state
- assertThrows(InvalidTransitionException.class, () ->
processInstance.transitionWorkItem(wiId, new HumanTaskTransition(Complete.ID,
+ assertThrows(InvalidTransitionException.class, () ->
processInstance.completeWorkItem(wiId,
Collections.singletonMap("approved", true),
- SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("managers"))))));
+ SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("managers")))));
// now test going through phases
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Start.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", true),
policy));
+ KogitoWorkItemHandler handler =
approvalsProcess.getKogitoWorkItemHandler(workItems.get(0).getWorkItemHandlerName());
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("start", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
Collections.singletonMap("approved", true), policy));
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -149,9 +153,9 @@ public class ApprovalsProcessTest {
workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- // test that claim can be skipped
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Start.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", false),
policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("start", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
Collections.singletonMap("approved", false), policy));
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED,
processInstance.status());
diff --git
a/kogito-quarkus-examples/process-usertasks-quarkus/src/test/java/org/acme/travels/quarkus/ApprovalsProcessTest.java
b/kogito-quarkus-examples/process-usertasks-quarkus/src/test/java/org/acme/travels/quarkus/ApprovalsProcessTest.java
index a5a41285c..289bd1976 100644
---
a/kogito-quarkus-examples/process-usertasks-quarkus/src/test/java/org/acme/travels/quarkus/ApprovalsProcessTest.java
+++
b/kogito-quarkus-examples/process-usertasks-quarkus/src/test/java/org/acme/travels/quarkus/ApprovalsProcessTest.java
@@ -25,25 +25,23 @@ import java.util.Map;
import org.acme.travels.Address;
import org.acme.travels.Traveller;
-import org.jbpm.process.instance.impl.humantask.HumanTaskTransition;
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.workitem.Complete;
import org.junit.jupiter.api.Test;
import org.kie.kogito.Model;
import org.kie.kogito.auth.IdentityProviders;
import org.kie.kogito.auth.SecurityPolicy;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.Process;
import org.kie.kogito.process.ProcessInstance;
import org.kie.kogito.process.WorkItem;
import io.quarkus.test.junit.QuarkusTest;
-import jakarta.inject.Inject;
-import jakarta.inject.Named;
-
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
+
@QuarkusTest
public class ApprovalsProcessTest {
@@ -75,6 +73,7 @@ public class ApprovalsProcessTest {
results.put("approved", true);
processInstance.completeWorkItem(workItems.get(0).getId(), results,
policy);
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -117,9 +116,12 @@ public class ApprovalsProcessTest {
List<WorkItem> workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", true),
policy));
+ KogitoWorkItemHandler handler =
approvalsProcess.getKogitoWorkItemHandler(workItems.get(0).getWorkItemHandlerName());
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
Collections.singletonMap("approved", true), policy));
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -130,8 +132,9 @@ public class ApprovalsProcessTest {
workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", false),
policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
Collections.singletonMap("approved", false), policy));
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED,
processInstance.status());
diff --git
a/kogito-quarkus-examples/process-usertasks-with-security-oidc-quarkus/src/test/java/org/acme/travels/ApprovalsProcessIT.java
b/kogito-quarkus-examples/process-usertasks-with-security-oidc-quarkus/src/test/java/org/acme/travels/ApprovalsProcessIT.java
index 2d4660efd..5485991ea 100644
---
a/kogito-quarkus-examples/process-usertasks-with-security-oidc-quarkus/src/test/java/org/acme/travels/ApprovalsProcessIT.java
+++
b/kogito-quarkus-examples/process-usertasks-with-security-oidc-quarkus/src/test/java/org/acme/travels/ApprovalsProcessIT.java
@@ -19,18 +19,15 @@
package org.acme.travels;
import java.util.Arrays;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.jbpm.process.instance.impl.humantask.HumanTaskTransition;
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.workitem.Complete;
import org.junit.jupiter.api.Test;
import org.kie.kogito.Model;
import org.kie.kogito.auth.IdentityProviders;
import org.kie.kogito.auth.SecurityPolicy;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.Process;
import org.kie.kogito.process.ProcessInstance;
import org.kie.kogito.process.WorkItem;
@@ -42,6 +39,8 @@ import io.quarkus.test.junit.QuarkusTest;
import jakarta.inject.Inject;
import jakarta.inject.Named;
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singletonMap;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -77,6 +76,7 @@ public class ApprovalsProcessIT {
results.put("approved", true);
processInstance.completeWorkItem(workItems.get(0).getId(), results,
policy);
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Arrays.asList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -118,9 +118,12 @@ public class ApprovalsProcessIT {
List<WorkItem> workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", true),
policy));
+ KogitoWorkItemHandler handler =
approvalsProcess.getKogitoWorkItemHandler(workItems.get(0).getWorkItemHandlerName());
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(), emptyMap(),
policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", true), policy));
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Arrays.asList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -131,8 +134,9 @@ public class ApprovalsProcessIT {
workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", false),
policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(), emptyMap(),
policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", false), policy));
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED,
processInstance.status());
diff --git
a/kogito-quarkus-examples/process-usertasks-with-security-quarkus/src/test/java/org/acme/travels/security/quarkus/ApprovalsProcessTest.java
b/kogito-quarkus-examples/process-usertasks-with-security-quarkus/src/test/java/org/acme/travels/security/quarkus/ApprovalsProcessTest.java
index fffafa26b..7faa81a29 100644
---
a/kogito-quarkus-examples/process-usertasks-with-security-quarkus/src/test/java/org/acme/travels/security/quarkus/ApprovalsProcessTest.java
+++
b/kogito-quarkus-examples/process-usertasks-with-security-quarkus/src/test/java/org/acme/travels/security/quarkus/ApprovalsProcessTest.java
@@ -25,13 +25,11 @@ import java.util.Map;
import org.acme.travels.Address;
import org.acme.travels.Traveller;
-import org.jbpm.process.instance.impl.humantask.HumanTaskTransition;
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.workitem.Complete;
import org.junit.jupiter.api.Test;
import org.kie.kogito.Model;
import org.kie.kogito.auth.IdentityProviders;
import org.kie.kogito.auth.SecurityPolicy;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.Process;
import org.kie.kogito.process.ProcessInstance;
import org.kie.kogito.process.WorkItem;
@@ -41,6 +39,8 @@ import io.quarkus.test.junit.QuarkusTest;
import jakarta.inject.Inject;
import jakarta.inject.Named;
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singletonMap;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -75,6 +75,7 @@ public class ApprovalsProcessTest {
results.put("approved", true);
processInstance.completeWorkItem(workItems.get(0).getId(), results,
policy);
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -117,9 +118,12 @@ public class ApprovalsProcessTest {
List<WorkItem> workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", true),
policy));
+ KogitoWorkItemHandler handler =
approvalsProcess.getKogitoWorkItemHandler(workItems.get(0).getWorkItemHandlerName());
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(), emptyMap(),
policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", true), policy));
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -130,8 +134,9 @@ public class ApprovalsProcessTest {
workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", false),
policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(), emptyMap(),
policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", false), policy));
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED,
processInstance.status());
diff --git
a/kogito-springboot-examples/onboarding-springboot/src/main/java/org/kie/kogito/examples/WorkItemHandlerConfig.java
b/kogito-springboot-examples/onboarding-springboot/src/main/java/org/kie/kogito/examples/WorkItemHandlerConfig.java
index fc2f30843..52a809ca0 100644
---
a/kogito-springboot-examples/onboarding-springboot/src/main/java/org/kie/kogito/examples/WorkItemHandlerConfig.java
+++
b/kogito-springboot-examples/onboarding-springboot/src/main/java/org/kie/kogito/examples/WorkItemHandlerConfig.java
@@ -30,7 +30,7 @@ import org.kie.kogito.addons.k8s.EndpointQueryKey;
import org.kie.kogito.addons.k8s.LocalEndpointDiscovery;
import
org.kie.kogito.addons.springboot.k8s.workitems.SpringDiscoveredEndpointCaller;
import org.kie.kogito.examples.onboarding.DecisionTaskWorkItemHandler;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
diff --git
a/kogito-springboot-examples/onboarding-springboot/src/main/java/org/kie/kogito/examples/onboarding/DecisionTaskWorkItemHandler.java
b/kogito-springboot-examples/onboarding-springboot/src/main/java/org/kie/kogito/examples/onboarding/DecisionTaskWorkItemHandler.java
index f958f4591..81be4f66a 100644
---
a/kogito-springboot-examples/onboarding-springboot/src/main/java/org/kie/kogito/examples/onboarding/DecisionTaskWorkItemHandler.java
+++
b/kogito-springboot-examples/onboarding-springboot/src/main/java/org/kie/kogito/examples/onboarding/DecisionTaskWorkItemHandler.java
@@ -19,14 +19,17 @@
package org.kie.kogito.examples.onboarding;
import java.util.Map;
+import java.util.Optional;
import
org.kie.kogito.addons.springboot.k8s.workitems.SpringDiscoveredEndpointCaller;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.WorkItemTransition;
+import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
import org.springframework.http.HttpMethod;
-public class DecisionTaskWorkItemHandler implements KogitoWorkItemHandler {
+public class DecisionTaskWorkItemHandler extends DefaultKogitoWorkItemHandler {
private SpringDiscoveredEndpointCaller endpointCaller;
@@ -35,15 +38,9 @@ public class DecisionTaskWorkItemHandler implements
KogitoWorkItemHandler {
}
@Override
- public void executeWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager
manager) {
+ public Optional<WorkItemTransition>
activateWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler
handler, KogitoWorkItem workItem, WorkItemTransition transition) {
Map<String, Object> results =
this.endpointCaller.discoverAndCall(workItem, System.getenv("NAMESPACE"),
"Decision", HttpMethod.POST.toString());
-
- manager.completeWorkItem(workItem.getStringId(), results);
- }
-
- @Override
- public void abortWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager
manager) {
-
+ return
Optional.of(handler.completeTransition(workItem.getPhaseStatus(), results));
}
@Override
diff --git
a/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/onboarding/OnboardingEndpointIT.java
b/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/onboarding/OnboardingEndpointIT.java
index 3cb334537..920a89545 100644
---
a/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/onboarding/OnboardingEndpointIT.java
+++
b/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/onboarding/OnboardingEndpointIT.java
@@ -31,8 +31,8 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.kie.kogito.examples.KogitoOnboardingApplication;
import org.kie.kogito.examples.test.RecordedOutputWorkItemHandler;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.ProcessConfig;
import
org.kie.kogito.testcontainers.springboot.InfinispanSpringBootTestResource;
import org.springframework.beans.factory.annotation.Autowired;
diff --git
a/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/test/RecordedOutputWorkItemHandler.java
b/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/test/RecordedOutputWorkItemHandler.java
index 05a679991..f7559da0d 100644
---
a/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/test/RecordedOutputWorkItemHandler.java
+++
b/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/test/RecordedOutputWorkItemHandler.java
@@ -20,26 +20,23 @@ package org.kie.kogito.examples.test;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import java.util.function.Function;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.WorkItemTransition;
+import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
-public class RecordedOutputWorkItemHandler implements KogitoWorkItemHandler {
+public class RecordedOutputWorkItemHandler extends
DefaultKogitoWorkItemHandler {
private Map<String, Function<KogitoWorkItem, Map<String, Object>>>
recorded = new HashMap<>();
@Override
- public void executeWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager
manager) {
+ public Optional<WorkItemTransition>
activateWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler
handler, KogitoWorkItem workItem, WorkItemTransition transition) {
Map<String, Object> results =
recorded.remove(workItem.getParameter("TaskName")).apply(workItem);
-
- manager.completeWorkItem(workItem.getStringId(), results);
- }
-
- @Override
- public void abortWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager
manager) {
-
+ return
Optional.of(handler.completeTransition(workItem.getPhaseStatus(), results));
}
public void record(String name, Function<KogitoWorkItem, Map<String,
Object>> item) {
diff --git
a/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/test/RecordedWorkItemHandlerConfig.java
b/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/test/RecordedWorkItemHandlerConfig.java
index 26b40467a..ea4983a3a 100644
---
a/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/test/RecordedWorkItemHandlerConfig.java
+++
b/kogito-springboot-examples/onboarding-springboot/src/test/java/org/kie/kogito/examples/test/RecordedWorkItemHandlerConfig.java
@@ -23,7 +23,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.List;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
diff --git
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/config/CustomWorkItemHandlerConfig.java
b/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/config/CustomWorkItemHandlerConfig.java
index 3021d7685..7727ba2c4 100644
---
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/config/CustomWorkItemHandlerConfig.java
+++
b/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/config/CustomWorkItemHandlerConfig.java
@@ -18,8 +18,7 @@
*/
package org.acme.travels.config;
-import org.acme.travels.usertasks.CustomHumanTaskLifeCycle;
-import org.jbpm.process.instance.impl.humantask.HumanTaskWorkItemHandler;
+import org.acme.travels.usertasks.CustomHumanTaskWorkItemHandler;
import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
import org.springframework.stereotype.Component;
@@ -36,6 +35,6 @@ import org.springframework.stereotype.Component;
@Component
public class CustomWorkItemHandlerConfig extends DefaultWorkItemHandlerConfig {
{
- register("Human Task", new HumanTaskWorkItemHandler(new
CustomHumanTaskLifeCycle()));
+ register("Human Task", new CustomHumanTaskWorkItemHandler());
}
}
\ No newline at end of file
diff --git
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/CompleteStartedOnly.java
b/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/CompleteStartedOnly.java
deleted file mode 100644
index 7465bf0a4..000000000
---
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/CompleteStartedOnly.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.acme.travels.usertasks;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.jbpm.process.instance.impl.workitem.Complete;
-import org.kie.kogito.process.workitem.LifeCyclePhase;
-
-/**
- * Extension to Complete life cycle phase that applies to any human task.
- * It will set the status to "Completed"
- *
- * This phase will only allow to complete tasks that are in started phase.
- *
- * It can transition from
- * <ul>
- * <li>Start</li>
- * </ul>
- *
- * This is a terminating (final) phase.
- */
-public class CompleteStartedOnly extends Complete {
-
- private List<String> allowedTransitions = Arrays.asList(Start.ID);
-
- @Override
- public boolean canTransition(LifeCyclePhase phase) {
- return allowedTransitions.contains(phase.id());
- }
-
-}
diff --git
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/CustomHumanTaskLifeCycle.java
b/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/CustomHumanTaskLifeCycle.java
deleted file mode 100644
index d5c071561..000000000
---
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/CustomHumanTaskLifeCycle.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * 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.acme.travels.usertasks;
-
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.jbpm.process.instance.impl.humantask.BaseHumanTaskLifeCycle;
-import org.jbpm.process.instance.impl.humantask.InternalHumanTaskWorkItem;
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.humantask.phases.Release;
-import org.jbpm.process.instance.impl.humantask.phases.Skip;
-import org.jbpm.process.instance.impl.workitem.Abort;
-import org.jbpm.process.instance.impl.workitem.Active;
-import org.jbpm.process.instance.impl.workitem.Complete;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItemManager;
-import org.kie.kogito.process.workitem.InvalidLifeCyclePhaseException;
-import org.kie.kogito.process.workitem.InvalidTransitionException;
-import org.kie.kogito.process.workitem.LifeCycle;
-import org.kie.kogito.process.workitem.LifeCyclePhase;
-import org.kie.kogito.process.workitem.NotAuthorizedException;
-import org.kie.kogito.process.workitem.Policy;
-import org.kie.kogito.process.workitem.Transition;
-import org.kie.kogito.process.workitems.InternalKogitoWorkItemManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Custom life cycle definition for human tasks. It comes with following phases
- *
- * <ul>
- * <li>Active</li>
- * <li>Claim</li>
- * <li>Release</li>
- * <li>Start</li>
- * <li>Complete - extended one that allows to only complete started tasks</li>
- * <li>Skip</li>
- * <li>Abort</li>
- * </ul>
- * At the beginning human task enters
- *
- * <pre>
- * Active
- * </pre>
- *
- * phase. From there it can go to
- *
- * <ul>
- * <li>Claim</li>
- * <li>Skip</li>
- * <li>Abort</li>
- * </ul>
- *
- * at any time. At each phase data can be associated and by that set on work
item.
- *
- * Completion can only be performed on started tasks.
- */
-public class CustomHumanTaskLifeCycle implements LifeCycle<Map<String,
Object>> {
-
- private static final Logger logger =
LoggerFactory.getLogger(BaseHumanTaskLifeCycle.class);
-
- private Map<String, LifeCyclePhase> phases = new LinkedHashMap<>();
-
- public CustomHumanTaskLifeCycle() {
- phases.put(Claim.ID, new Claim());
- phases.put(Release.ID, new Release());
- phases.put(Start.ID, new Start());
- phases.put(Complete.ID, new CompleteStartedOnly());
- phases.put(Skip.ID, new Skip());
- phases.put(Active.ID, new Active());
- phases.put(Abort.ID, new Abort());
- }
-
- @Override
- public LifeCyclePhase phaseById(String phaseId) {
- return phases.get(phaseId);
- }
-
- @Override
- public Collection<LifeCyclePhase> phases() {
- return phases.values();
- }
-
- @Override
- public Map<String, Object> transitionTo(KogitoWorkItem workItem,
KogitoWorkItemManager manager, Transition<Map<String, Object>> transition) {
- logger.debug("Transition method invoked for work item {} to transition
to {}, currently in phase {} and status {}", workItem.getStringId(),
transition.phase(), workItem.getPhaseId(),
- workItem.getPhaseStatus());
-
- InternalHumanTaskWorkItem humanTaskWorkItem =
(InternalHumanTaskWorkItem) workItem;
-
- LifeCyclePhase targetPhase = phases.get(transition.phase());
- if (targetPhase == null) {
- logger.debug("Target life cycle phase '{}' does not exist in {}",
transition.phase(), this.getClass().getSimpleName());
- throw new InvalidLifeCyclePhaseException(transition.phase());
- }
-
- LifeCyclePhase currentPhase =
phases.get(humanTaskWorkItem.getPhaseId());
-
- if (!targetPhase.canTransition(currentPhase)) {
- logger.debug("Target life cycle phase '{}' cannot transition from
current state '{}'", targetPhase.id(), currentPhase.id());
- throw new InvalidTransitionException("Cannot transition from " +
humanTaskWorkItem.getPhaseId() + " to " + targetPhase.id());
- }
-
- if (!targetPhase.id().equals(Active.ID) &&
!targetPhase.id().equals(Abort.ID) &&
!humanTaskWorkItem.enforce(transition.policies().toArray(new
Policy[transition.policies().size()]))) {
- throw new NotAuthorizedException("User is not authorized to access
task instance with id " + humanTaskWorkItem.getStringId());
- }
-
- humanTaskWorkItem.setPhaseId(targetPhase.id());
- humanTaskWorkItem.setPhaseStatus(targetPhase.status());
-
- targetPhase.apply(humanTaskWorkItem, transition);
- if (transition.data() != null) {
- logger.debug("Updating data for work item {}", targetPhase.id(),
humanTaskWorkItem.getStringId());
- humanTaskWorkItem.getResults().putAll(transition.data());
- }
- logger.debug("Transition for work item {} to {} done, currently in
phase {} and status {}", workItem.getStringId(), transition.phase(),
workItem.getPhaseId(), workItem.getPhaseStatus());
-
- if (targetPhase.isTerminating()) {
- logger.debug("Target life cycle phase '{}' is terminiating,
completing work item {}", targetPhase.id(), humanTaskWorkItem.getStringId());
- // since target life cycle phase is terminating completing work
item
- ((InternalKogitoWorkItemManager)
manager).internalCompleteWorkItem(humanTaskWorkItem);
- }
-
- return data(humanTaskWorkItem);
- }
-
- @Override
- public Map<String, Object> data(KogitoWorkItem workItem) {
- return ((InternalHumanTaskWorkItem) workItem).getResults();
- }
-}
diff --git
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/CustomHumanTaskWorkItemHandler.java
b/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/CustomHumanTaskWorkItemHandler.java
new file mode 100644
index 000000000..aa2251344
--- /dev/null
+++
b/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/CustomHumanTaskWorkItemHandler.java
@@ -0,0 +1,73 @@
+/*
+ * 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.acme.travels.usertasks;
+
+import java.util.Optional;
+
+import org.kie.kogito.auth.SecurityPolicy;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.WorkItemLifeCycle;
+import org.kie.kogito.internal.process.workitem.WorkItemPhaseState;
+import org.kie.kogito.internal.process.workitem.WorkItemTerminationType;
+import org.kie.kogito.internal.process.workitem.WorkItemTransition;
+import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
+import org.kie.kogito.process.workitems.impl.DefaultWorkItemLifeCycle;
+import org.kie.kogito.process.workitems.impl.DefaultWorkItemLifeCyclePhase;
+
+public class CustomHumanTaskWorkItemHandler extends
DefaultKogitoWorkItemHandler {
+
+ public static final String TRANSITION_COMPLETE = "complete";
+ public static final String TRANSITION_ABORT = "abort";
+ public static final String TRANSITION_ACTIVATE = "activate";
+ public static final String TRANSITION_START = "start";
+ public static final String TRANSITION_SKIP = "skip";
+
+ @Override
+ public WorkItemLifeCycle initialize() {
+ WorkItemPhaseState initialized = WorkItemPhaseState.initialized();
+ WorkItemPhaseState completed = WorkItemPhaseState.of("Completed",
WorkItemTerminationType.COMPLETE);
+ WorkItemPhaseState aborted = WorkItemPhaseState.of("Aborted",
WorkItemTerminationType.ABORT);
+ WorkItemPhaseState activated = WorkItemPhaseState.of("Activated");
+ WorkItemPhaseState started = WorkItemPhaseState.of("Started");
+
+ DefaultWorkItemLifeCyclePhase active = new
DefaultWorkItemLifeCyclePhase(TRANSITION_ACTIVATE, initialized, activated,
this::activateWorkItemHandler);
+ DefaultWorkItemLifeCyclePhase start = new
DefaultWorkItemLifeCyclePhase(TRANSITION_START, activated, started,
this::activateWorkItemHandler);
+ DefaultWorkItemLifeCyclePhase complete = new
DefaultWorkItemLifeCyclePhase(TRANSITION_COMPLETE, started, completed,
this::completeWorkItemHandler);
+ DefaultWorkItemLifeCyclePhase abort = new
DefaultWorkItemLifeCyclePhase(TRANSITION_ABORT, started, aborted,
this::abortWorkItemHandler);
+
+ return new DefaultWorkItemLifeCycle(active, start, abort, complete);
+ }
+
+ @Override
+ public Optional<WorkItemTransition>
completeWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler
handler, KogitoWorkItem workitem, WorkItemTransition transition) {
+ getUserFromTransition(transition).ifPresent(e ->
workitem.setOutput("ActorId", e));
+ return Optional.empty();
+ }
+
+ private Optional<String> getUserFromTransition(WorkItemTransition
transition) {
+ Optional<SecurityPolicy> securityPolicy =
transition.policies().stream().filter(SecurityPolicy.class::isInstance).map(SecurityPolicy.class::cast).findAny();
+ if (securityPolicy.isPresent()) {
+ return Optional.ofNullable(securityPolicy.get().getUser());
+ }
+ return Optional.empty();
+ }
+}
diff --git
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/Start.java
b/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/Start.java
deleted file mode 100644
index 7a5199de1..000000000
---
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/main/java/org/acme/travels/usertasks/Start.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.acme.travels.usertasks;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.humantask.phases.Release;
-import org.jbpm.process.instance.impl.workitem.Active;
-import org.kie.kogito.process.workitem.LifeCyclePhase;
-
-/**
- * Start life cycle phase that applies to any human task.
- * It will set the status to "Started"
- *
- * It can transition from
- * <ul>
- * <li>Active</li>
- * <li>Claim</li>
- * <li>Release</li>
- * </ul>
- *
- */
-public class Start implements LifeCyclePhase {
-
- public static final String ID = "start";
- public static final String STATUS = "Started";
-
- private List<String> allowedTransitions = Arrays.asList(Active.ID,
Claim.ID, Release.ID);
-
- @Override
- public String id() {
- return ID;
- }
-
- @Override
- public String status() {
- return STATUS;
- }
-
- @Override
- public boolean isTerminating() {
- return false;
- }
-
- @Override
- public boolean canTransition(LifeCyclePhase phase) {
- return allowedTransitions.contains(phase.id());
- }
-}
diff --git
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/test/java/org/acme/travels/custom/lifecycle/springboot/ApprovalsProcessTest.java
b/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/test/java/org/acme/travels/custom/lifecycle/springboot/ApprovalsProcessTest.java
index 4b5af8bfd..e761d10a6 100644
---
a/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/test/java/org/acme/travels/custom/lifecycle/springboot/ApprovalsProcessTest.java
+++
b/kogito-springboot-examples/process-usertasks-custom-lifecycle-springboot/src/test/java/org/acme/travels/custom/lifecycle/springboot/ApprovalsProcessTest.java
@@ -25,19 +25,16 @@ import java.util.Map;
import org.acme.travels.Address;
import org.acme.travels.Traveller;
-import org.acme.travels.usertasks.Start;
-import org.jbpm.process.instance.impl.humantask.HumanTaskTransition;
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.workitem.Complete;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.kie.kogito.Model;
import org.kie.kogito.auth.IdentityProviders;
import org.kie.kogito.auth.SecurityPolicy;
+import org.kie.kogito.internal.process.workitem.InvalidTransitionException;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.Process;
import org.kie.kogito.process.ProcessInstance;
import org.kie.kogito.process.WorkItem;
-import org.kie.kogito.process.workitem.InvalidTransitionException;
import org.kie.kogito.tests.KogitoInfinispanSpringbootApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -46,6 +43,8 @@ import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.junit.jupiter.SpringExtension;
+import static java.util.Collections.singletonList;
+import static java.util.Collections.singletonMap;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.fail;
@@ -73,7 +72,7 @@ public class ApprovalsProcessTest {
processInstance.start();
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_ACTIVE,
processInstance.status());
- SecurityPolicy policy =
SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("managers")));
+ SecurityPolicy policy =
SecurityPolicy.of(IdentityProviders.of("admin", singletonList("managers")));
processInstance.workItems(policy);
@@ -81,13 +80,15 @@ public class ApprovalsProcessTest {
assertEquals(1, workItems.size());
Map<String, Object> results = new HashMap<>();
results.put("approved", true);
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Start.ID, null, policy));
+ KogitoWorkItemHandler handler =
approvalsProcess.getKogitoWorkItemHandler(workItems.get(0).getWorkItemHandlerName());
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("start", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
processInstance.completeWorkItem(workItems.get(0).getId(), results,
policy);
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
- policy = SecurityPolicy.of(IdentityProviders.of("john",
Collections.singletonList("managers")));
+ policy = SecurityPolicy.of(IdentityProviders.of("john",
singletonList("managers")));
processInstance.workItems(policy);
@@ -95,7 +96,7 @@ public class ApprovalsProcessTest {
assertEquals(1, workItems.size());
results.put("approved", false);
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Start.ID, null, policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("start", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
processInstance.completeWorkItem(workItems.get(0).getId(), results,
policy);
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED,
processInstance.status());
@@ -120,7 +121,7 @@ public class ApprovalsProcessTest {
processInstance.start();
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_ACTIVE,
processInstance.status());
- SecurityPolicy policy =
SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("managers")));
+ SecurityPolicy policy =
SecurityPolicy.of(IdentityProviders.of("admin", singletonList("managers")));
List<WorkItem> workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
@@ -128,24 +129,26 @@ public class ApprovalsProcessTest {
final String wiId = workItems.get(0).getId();
// test to make sure you can't complete if the task is not in started
state
+ KogitoWorkItemHandler handler =
approvalsProcess.getKogitoWorkItemHandler(workItems.get(0).getWorkItemHandlerName());
+
try {
- processInstance.transitionWorkItem(wiId, new
HumanTaskTransition(Complete.ID,
- Collections.singletonMap("approved", true),
- SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("managers")))));
+ processInstance.transitionWorkItem(wiId,
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", true),
+ SecurityPolicy.of(IdentityProviders.of("admin",
singletonList("managers")))));
fail("It's not possible to complete non started tasks");
} catch (InvalidTransitionException e) {
// expected
}
// now test going through phases
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Start.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", true),
policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("start", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", true), policy));
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
- policy = SecurityPolicy.of(IdentityProviders.of("john",
Collections.singletonList("managers")));
+ policy = SecurityPolicy.of(IdentityProviders.of("john",
singletonList("managers")));
processInstance.workItems(policy);
@@ -153,8 +156,9 @@ public class ApprovalsProcessTest {
assertEquals(1, workItems.size());
// test that claim can be skipped
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Start.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", false),
policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("start", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", false), policy));
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED,
processInstance.status());
diff --git
a/kogito-springboot-examples/process-usertasks-springboot/src/test/java/org/acme/travels/springboot/ApprovalsProcessTest.java
b/kogito-springboot-examples/process-usertasks-springboot/src/test/java/org/acme/travels/springboot/ApprovalsProcessTest.java
index 9ec367111..4258f6a1d 100644
---
a/kogito-springboot-examples/process-usertasks-springboot/src/test/java/org/acme/travels/springboot/ApprovalsProcessTest.java
+++
b/kogito-springboot-examples/process-usertasks-springboot/src/test/java/org/acme/travels/springboot/ApprovalsProcessTest.java
@@ -25,14 +25,12 @@ import java.util.Map;
import org.acme.travels.Address;
import org.acme.travels.Traveller;
-import org.jbpm.process.instance.impl.humantask.HumanTaskTransition;
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.workitem.Complete;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.kie.kogito.Model;
import org.kie.kogito.auth.IdentityProviders;
import org.kie.kogito.auth.SecurityPolicy;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.Process;
import org.kie.kogito.process.ProcessInstance;
import org.kie.kogito.process.WorkItem;
@@ -72,21 +70,18 @@ public class ApprovalsProcessTest {
SecurityPolicy policy =
SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("managers")));
- processInstance.workItems(policy);
-
List<WorkItem> workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
Map<String, Object> results = new HashMap<>();
results.put("approved", true);
processInstance.completeWorkItem(workItems.get(0).getId(), results,
policy);
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
policy = SecurityPolicy.of(IdentityProviders.of("john",
Collections.singletonList("managers")));
- processInstance.workItems(policy);
-
workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
@@ -122,9 +117,12 @@ public class ApprovalsProcessTest {
List<WorkItem> workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", true),
policy));
+ KogitoWorkItemHandler handler =
approvalsProcess.getKogitoWorkItemHandler(workItems.get(0).getWorkItemHandlerName());
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
Collections.singletonMap("approved", true), policy));
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -135,8 +133,9 @@ public class ApprovalsProcessTest {
workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", false),
policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(),
Collections.emptyMap(), policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
Collections.singletonMap("approved", false), policy));
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED,
processInstance.status());
diff --git
a/kogito-springboot-examples/process-usertasks-with-security-oidc-springboot/src/test/java/org/acme/travels/security/oidc/springboot/ApprovalsProcessTest.java
b/kogito-springboot-examples/process-usertasks-with-security-oidc-springboot/src/test/java/org/acme/travels/security/oidc/springboot/ApprovalsProcessTest.java
index fa25b9e3d..8ac670823 100644
---
a/kogito-springboot-examples/process-usertasks-with-security-oidc-springboot/src/test/java/org/acme/travels/security/oidc/springboot/ApprovalsProcessTest.java
+++
b/kogito-springboot-examples/process-usertasks-with-security-oidc-springboot/src/test/java/org/acme/travels/security/oidc/springboot/ApprovalsProcessTest.java
@@ -25,14 +25,12 @@ import java.util.Map;
import org.acme.travels.Address;
import org.acme.travels.Traveller;
-import org.jbpm.process.instance.impl.humantask.HumanTaskTransition;
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.workitem.Complete;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.kie.kogito.Model;
import org.kie.kogito.auth.IdentityProviders;
import org.kie.kogito.auth.SecurityPolicy;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.Process;
import org.kie.kogito.process.ProcessInstance;
import org.kie.kogito.process.WorkItem;
@@ -44,6 +42,8 @@ import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.junit.jupiter.SpringExtension;
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singletonMap;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -80,6 +80,7 @@ public class ApprovalsProcessTest {
results.put("approved", true);
processInstance.completeWorkItem(workItems.get(0).getId(), results,
policy);
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -122,9 +123,12 @@ public class ApprovalsProcessTest {
List<WorkItem> workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", true),
policy));
+ KogitoWorkItemHandler handler =
approvalsProcess.getKogitoWorkItemHandler(workItems.get(0).getWorkItemHandlerName());
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(), emptyMap(),
policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", true), policy));
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -135,8 +139,9 @@ public class ApprovalsProcessTest {
workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", false),
policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(), emptyMap(),
policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", false), policy));
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED,
processInstance.status());
diff --git
a/kogito-springboot-examples/process-usertasks-with-security-springboot/src/test/java/org/acme/travels/security/springboot/ApprovalsProcessTest.java
b/kogito-springboot-examples/process-usertasks-with-security-springboot/src/test/java/org/acme/travels/security/springboot/ApprovalsProcessTest.java
index 2a1467f4d..5f5625137 100644
---
a/kogito-springboot-examples/process-usertasks-with-security-springboot/src/test/java/org/acme/travels/security/springboot/ApprovalsProcessTest.java
+++
b/kogito-springboot-examples/process-usertasks-with-security-springboot/src/test/java/org/acme/travels/security/springboot/ApprovalsProcessTest.java
@@ -25,14 +25,12 @@ import java.util.Map;
import org.acme.travels.Address;
import org.acme.travels.Traveller;
-import org.jbpm.process.instance.impl.humantask.HumanTaskTransition;
-import org.jbpm.process.instance.impl.humantask.phases.Claim;
-import org.jbpm.process.instance.impl.workitem.Complete;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.kie.kogito.Model;
import org.kie.kogito.auth.IdentityProviders;
import org.kie.kogito.auth.SecurityPolicy;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
import org.kie.kogito.process.Process;
import org.kie.kogito.process.ProcessInstance;
import org.kie.kogito.process.WorkItem;
@@ -44,6 +42,8 @@ import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.junit.jupiter.SpringExtension;
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singletonMap;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -80,6 +80,7 @@ public class ApprovalsProcessTest {
results.put("approved", true);
processInstance.completeWorkItem(workItems.get(0).getId(), results,
policy);
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -122,9 +123,12 @@ public class ApprovalsProcessTest {
List<WorkItem> workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", true),
policy));
+ KogitoWorkItemHandler handler =
approvalsProcess.getKogitoWorkItemHandler(workItems.get(0).getWorkItemHandlerName());
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(), emptyMap(),
policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", true), policy));
+ policy = SecurityPolicy.of(IdentityProviders.of("admin",
Collections.singletonList("mgmt")));
workItems = processInstance.workItems(policy);
assertEquals(0, workItems.size());
@@ -135,8 +139,9 @@ public class ApprovalsProcessTest {
workItems = processInstance.workItems(policy);
assertEquals(1, workItems.size());
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Claim.ID, null, policy));
- processInstance.transitionWorkItem(workItems.get(0).getId(), new
HumanTaskTransition(Complete.ID, Collections.singletonMap("approved", false),
policy));
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("claim", workItems.get(0).getPhaseStatus(), emptyMap(),
policy));
+ workItems = processInstance.workItems(policy);
+ processInstance.transitionWorkItem(workItems.get(0).getId(),
handler.newTransition("complete", workItems.get(0).getPhaseStatus(),
singletonMap("approved", false), policy));
assertEquals(org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED,
processInstance.status());
diff --git
a/serverless-workflow-examples/serverless-workflow-custom-type/serverless-workflow-custom-rpc/src/main/java/org/kie/kogito/examples/sw/custom/RPCCustomWorkItemHandler.java
b/serverless-workflow-examples/serverless-workflow-custom-type/serverless-workflow-custom-rpc/src/main/java/org/kie/kogito/examples/sw/custom/RPCCustomWorkItemHandler.java
index 64beded70..87dc72441 100644
---
a/serverless-workflow-examples/serverless-workflow-custom-type/serverless-workflow-custom-rpc/src/main/java/org/kie/kogito/examples/sw/custom/RPCCustomWorkItemHandler.java
+++
b/serverless-workflow-examples/serverless-workflow-custom-type/serverless-workflow-custom-rpc/src/main/java/org/kie/kogito/examples/sw/custom/RPCCustomWorkItemHandler.java
@@ -26,10 +26,9 @@ import java.util.Map;
import jakarta.enterprise.context.ApplicationScoped;
import org.kie.kogito.examples.sw.custom.CalculatorClient.OperationId;
-import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
import org.kie.kogito.serverless.workflow.WorkflowWorkItemHandler;
-
@ApplicationScoped
public class RPCCustomWorkItemHandler extends WorkflowWorkItemHandler {
@@ -37,23 +36,23 @@ public class RPCCustomWorkItemHandler extends
WorkflowWorkItemHandler {
public static final String HOST = "host";
public static final String PORT = "port";
public static final String OPERATION = "operation";
-
+
@Override
- protected Object internalExecute(KogitoWorkItem workItem, Map<String,
Object> parameters) {
+ protected Object internalExecute(KogitoWorkItem workItem, Map<String,
Object> parameters) {
try {
Iterator<?> iter = parameters.values().iterator();
Map<String, Object> metadata =
workItem.getNodeInstance().getNode().getMetaData();
String operationId = (String) metadata.get(OPERATION);
if (operationId == null) {
- throw new IllegalArgumentException ("Operation is a mandatory
parameter");
+ throw new IllegalArgumentException("Operation is a mandatory
parameter");
}
- return
CalculatorClient.invokeOperation((String)metadata.getOrDefault(HOST,"localhost"),
(int) metadata.getOrDefault(PORT, 8082),
- OperationId.valueOf(operationId.toUpperCase()),
(Integer)iter.next(), (Integer)iter.next());
- } catch (IOException io ) {
+ return CalculatorClient.invokeOperation((String)
metadata.getOrDefault(HOST, "localhost"), (int) metadata.getOrDefault(PORT,
8082),
+ OperationId.valueOf(operationId.toUpperCase()), (Integer)
iter.next(), (Integer) iter.next());
+ } catch (IOException io) {
throw new UncheckedIOException(io);
}
}
-
+
@Override
public String getName() {
return NAME;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]