Skip to content

Commit 34389fe

Browse files
authored
[incubator-kie-issues-1439] UserTask Decouple codegen and interface from engine (#3655)
1 parent 8f828b3 commit 34389fe

File tree

348 files changed

+9053
-12988
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

348 files changed

+9053
-12988
lines changed

addons/common/human-task-prediction/api/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@
5858
<artifactId>jbpm-deps-group-engine</artifactId>
5959
<type>pom</type>
6060
</dependency>
61+
<dependency>
62+
<groupId>org.kie.kogito</groupId>
63+
<artifactId>jbpm-usertask</artifactId>
64+
</dependency>
6165

6266

6367
<!-- test dependencies -->

addons/common/human-task-prediction/api/src/main/java/org/kie/kogito/prediction/api/PredictionAwareHumanTaskLifeCycle.java

Lines changed: 0 additions & 84 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.kie.kogito.prediction.api;
20+
21+
import java.util.Optional;
22+
23+
import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
24+
import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
25+
import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager;
26+
import org.kie.kogito.internal.process.workitem.WorkItemTransition;
27+
import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
28+
import org.slf4j.Logger;
29+
import org.slf4j.LoggerFactory;
30+
31+
public class PredictionAwareHumanTaskWorkItemHandler extends DefaultKogitoWorkItemHandler {
32+
33+
private static final Logger logger = LoggerFactory.getLogger(PredictionAwareHumanTaskWorkItemHandler.class);
34+
35+
private PredictionService predictionService;
36+
37+
public PredictionAwareHumanTaskWorkItemHandler(PredictionService predictionService) {
38+
this.predictionService = predictionService;
39+
}
40+
41+
public Optional<WorkItemTransition> activateWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler handler, KogitoWorkItem workItem, WorkItemTransition transition) {
42+
PredictionOutcome outcome = predictionService.predict(workItem, workItem.getParameters());
43+
logger.debug("Prediction service returned confidence level {} for work item {}", outcome.getConfidenceLevel(), workItem.getStringId());
44+
45+
if (outcome.isCertain()) {
46+
workItem.setOutputs(outcome.getData());
47+
logger.debug("Prediction service is certain (confidence level {}) on the outputs, completing work item {}", outcome.getConfidenceLevel(), workItem.getStringId());
48+
49+
return Optional.of(this.newTransition("skip", workItem.getPhaseStatus(), outcome.getData()));
50+
} else if (outcome.isPresent()) {
51+
logger.debug("Prediction service is NOT certain (confidence level {}) on the outputs, setting recommended outputs on work item {}",
52+
outcome.getConfidenceLevel(),
53+
workItem.getStringId());
54+
workItem.setOutputs(outcome.getData());
55+
}
56+
return Optional.empty();
57+
}
58+
59+
public Optional<WorkItemTransition> completeWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler handler, KogitoWorkItem workItem, WorkItemTransition transition) {
60+
// upon actual transition train the data if it's completion phase
61+
predictionService.train(workItem, workItem.getParameters(), transition.data());
62+
return Optional.empty();
63+
}
64+
65+
}

addons/common/human-task-prediction/api/src/test/java/org/kie/kogito/prediction/api/PredictionAwareHumanTaskLifeCycleTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@
2525
import java.util.concurrent.atomic.AtomicBoolean;
2626

2727
import org.drools.io.ClassPathResource;
28-
import org.jbpm.process.instance.impl.humantask.HumanTaskWorkItemHandler;
2928
import org.junit.jupiter.api.BeforeEach;
3029
import org.junit.jupiter.api.Test;
3130
import org.kie.kogito.Model;
3231
import org.kie.kogito.auth.SecurityPolicy;
32+
import org.kie.kogito.internal.process.workitem.Policy;
3333
import org.kie.kogito.process.ProcessConfig;
3434
import org.kie.kogito.process.ProcessInstance;
3535
import org.kie.kogito.process.WorkItem;
@@ -38,7 +38,6 @@
3838
import org.kie.kogito.process.impl.CachedWorkItemHandlerConfig;
3939
import org.kie.kogito.process.impl.DefaultProcessEventListenerConfig;
4040
import org.kie.kogito.process.impl.StaticProcessConfig;
41-
import org.kie.kogito.process.workitem.Policy;
4241
import org.kie.kogito.process.workitems.InternalKogitoWorkItem;
4342
import org.kie.kogito.services.identity.StaticIdentityProvider;
4443
import org.kie.kogito.services.uow.CollectingUnitOfWorkFactory;
@@ -50,7 +49,7 @@
5049

5150
public class PredictionAwareHumanTaskLifeCycleTest {
5251

53-
private Policy<?> securityPolicy = SecurityPolicy.of(new StaticIdentityProvider("john"));
52+
private Policy securityPolicy = SecurityPolicy.of(new StaticIdentityProvider("john"));
5453

5554
private AtomicBoolean predictNow;
5655
private List<String> trainedTasks;
@@ -88,7 +87,7 @@ public String getIdentifier() {
8887
};
8988

9089
CachedWorkItemHandlerConfig wiConfig = new CachedWorkItemHandlerConfig();
91-
wiConfig.register("Human Task", new HumanTaskWorkItemHandler(new PredictionAwareHumanTaskLifeCycle(predictionService)));
90+
wiConfig.register("Human Task", new PredictionAwareHumanTaskWorkItemHandler(predictionService));
9291
config = new StaticProcessConfig(wiConfig, new DefaultProcessEventListenerConfig(), new DefaultUnitOfWorkManager(new CollectingUnitOfWorkFactory()));
9392
}
9493

addons/common/human-task-prediction/smile/src/main/java/org/kie/kogito/predictions/smile/SmileRandomForest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import java.util.Set;
2929

3030
import org.kie.api.runtime.process.WorkItem;
31-
import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
31+
import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
3232
import org.kie.kogito.prediction.api.PredictionOutcome;
3333
import org.kie.kogito.prediction.api.PredictionService;
3434
import org.slf4j.Logger;

addons/common/human-task-prediction/smile/src/test/java/org/kie/kogito/predictions/smile/SmileRandomForestPredictionTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@
2323
import java.util.Map;
2424

2525
import org.drools.io.ClassPathResource;
26-
import org.jbpm.process.instance.impl.humantask.HumanTaskWorkItemHandler;
2726
import org.junit.jupiter.api.BeforeEach;
2827
import org.junit.jupiter.api.Test;
2928
import org.kie.kogito.Model;
30-
import org.kie.kogito.prediction.api.PredictionAwareHumanTaskLifeCycle;
29+
import org.kie.kogito.prediction.api.PredictionAwareHumanTaskWorkItemHandler;
3130
import org.kie.kogito.prediction.api.PredictionService;
3231
import org.kie.kogito.process.ProcessConfig;
3332
import org.kie.kogito.process.ProcessInstance;
@@ -64,7 +63,7 @@ public void configure() {
6463

6564
predictionService = new SmileRandomForest(configuration);
6665
CachedWorkItemHandlerConfig wiConfig = new CachedWorkItemHandlerConfig();
67-
wiConfig.register("Human Task", new HumanTaskWorkItemHandler(new PredictionAwareHumanTaskLifeCycle(predictionService)));
66+
wiConfig.register("Human Task", new PredictionAwareHumanTaskWorkItemHandler(predictionService));
6867
config = new StaticProcessConfig(wiConfig, new DefaultProcessEventListenerConfig(), new DefaultUnitOfWorkManager(new CollectingUnitOfWorkFactory()));
6968

7069
for (int i = 0; i < 10; i++) {
@@ -77,7 +76,6 @@ public void configure() {
7776

7877
@Test
7978
public void testUserTaskWithPredictionService() {
80-
8179
BpmnProcess process = (BpmnProcess) BpmnProcess.from(config, new ClassPathResource("BPMN2-UserTask.bpmn2")).get(0);
8280
process.configure();
8381

addons/common/persistence/filesystem/src/test/java/org/kie/persistence/filesystem/FileSystemProcessInstancesTest.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,13 @@
3737
import org.kie.kogito.process.WorkItem;
3838
import org.kie.kogito.process.bpmn2.BpmnProcess;
3939
import org.kie.kogito.process.bpmn2.BpmnVariables;
40-
import org.kie.kogito.services.identity.StaticIdentityProvider;
40+
import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
41+
import org.kie.kogito.process.impl.StaticProcessConfig;
42+
import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
4143
import org.kie.kogito.uow.UnitOfWork;
4244
import org.kie.kogito.uow.UnitOfWorkManager;
4345

46+
import static java.util.Collections.emptyList;
4447
import static org.assertj.core.api.Assertions.assertThat;
4548
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
4649
import static org.assertj.core.api.Assertions.entry;
@@ -59,10 +62,12 @@
5962

6063
class FileSystemProcessInstancesTest {
6164

62-
private SecurityPolicy securityPolicy = SecurityPolicy.of(new StaticIdentityProvider("john"));
65+
private SecurityPolicy securityPolicy = SecurityPolicy.of("john", emptyList());
6366

6467
private BpmnProcess createProcess(String fileName) {
65-
BpmnProcess process = BpmnProcess.from(new ClassPathResource(fileName)).get(0);
68+
StaticProcessConfig config = new StaticProcessConfig();
69+
((DefaultWorkItemHandlerConfig) config.workItemHandlers()).register("Human Task", new DefaultKogitoWorkItemHandler());
70+
BpmnProcess process = BpmnProcess.from(config, new ClassPathResource(fileName)).get(0);
6671
process.setProcessInstancesFactory(new FileSystemProcessInstancesFactory());
6772
process.configure();
6873
abort(process.instances());

addons/common/persistence/infinispan/src/test/java/org/kie/kogito/infinispan/CacheProcessInstancesIT.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,14 @@
3939
import org.kie.kogito.process.WorkItem;
4040
import org.kie.kogito.process.bpmn2.BpmnProcess;
4141
import org.kie.kogito.process.bpmn2.BpmnVariables;
42-
import org.kie.kogito.services.identity.StaticIdentityProvider;
42+
import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
43+
import org.kie.kogito.process.impl.StaticProcessConfig;
44+
import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
4345
import org.kie.kogito.testcontainers.KogitoInfinispanContainer;
4446
import org.testcontainers.junit.jupiter.Container;
4547
import org.testcontainers.junit.jupiter.Testcontainers;
4648

49+
import static java.util.Collections.emptyList;
4750
import static org.assertj.core.api.Assertions.assertThat;
4851
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
4952
import static org.assertj.core.api.Assertions.entry;
@@ -82,7 +85,9 @@ void close() {
8285

8386
@Test
8487
void testFindByIdReadMode() {
85-
BpmnProcess process = BpmnProcess.from(new ClassPathResource("BPMN2-UserTask-Script.bpmn2")).get(0);
88+
StaticProcessConfig config = new StaticProcessConfig();
89+
((DefaultWorkItemHandlerConfig) config.workItemHandlers()).register("Human Task", new DefaultKogitoWorkItemHandler());
90+
BpmnProcess process = BpmnProcess.from(config, new ClassPathResource("BPMN2-UserTask-Script.bpmn2")).get(0);
8691
// workaround as BpmnProcess does not compile the scripts but just reads the xml
8792
for (Node node : ((WorkflowProcess) process.get()).getNodes()) {
8893
if (node instanceof ActionNode) {
@@ -126,7 +131,9 @@ void testFindByIdReadMode() {
126131

127132
@Test
128133
void testValuesReadMode() {
129-
BpmnProcess process = BpmnProcess.from(new ClassPathResource("BPMN2-UserTask.bpmn2")).get(0);
134+
StaticProcessConfig config = new StaticProcessConfig();
135+
((DefaultWorkItemHandlerConfig) config.workItemHandlers()).register("Human Task", new DefaultKogitoWorkItemHandler());
136+
BpmnProcess process = BpmnProcess.from(config, new ClassPathResource("BPMN2-UserTask.bpmn2")).get(0);
130137
process.setProcessInstancesFactory(new CacheProcessInstancesFactory(cacheManager));
131138
process.configure();
132139

@@ -143,7 +150,9 @@ void testValuesReadMode() {
143150

144151
@Test
145152
void testBasicFlow() {
146-
BpmnProcess process = BpmnProcess.from(new ClassPathResource("BPMN2-UserTask.bpmn2")).get(0);
153+
StaticProcessConfig config = new StaticProcessConfig();
154+
((DefaultWorkItemHandlerConfig) config.workItemHandlers()).register("Human Task", new DefaultKogitoWorkItemHandler());
155+
BpmnProcess process = BpmnProcess.from(config, new ClassPathResource("BPMN2-UserTask.bpmn2")).get(0);
147156
process.setProcessInstancesFactory(new CacheProcessInstancesFactory(cacheManager));
148157
process.configure();
149158

@@ -154,7 +163,7 @@ void testBasicFlow() {
154163

155164
assertOne(process.instances());
156165

157-
SecurityPolicy asJohn = SecurityPolicy.of(new StaticIdentityProvider("john"));
166+
SecurityPolicy asJohn = SecurityPolicy.of("john", emptyList());
158167

159168
assertThat(getFirst(process.instances()).workItems(asJohn)).hasSize(1);
160169

addons/common/persistence/infinispan/src/test/java/org/kie/kogito/infinispan/CacheProcessInstancesWithLockIT.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
import org.kie.kogito.process.bpmn2.BpmnProcess;
3434
import org.kie.kogito.process.bpmn2.BpmnVariables;
3535
import org.kie.kogito.process.impl.AbstractProcessInstance;
36+
import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
37+
import org.kie.kogito.process.impl.StaticProcessConfig;
38+
import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
3639
import org.kie.kogito.testcontainers.KogitoInfinispanContainer;
3740
import org.testcontainers.junit.jupiter.Container;
3841
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -71,7 +74,9 @@ void close() {
7174
}
7275

7376
private BpmnProcess createProcess(String fileName) {
74-
BpmnProcess process = BpmnProcess.from(new ClassPathResource(fileName)).get(0);
77+
StaticProcessConfig config = new StaticProcessConfig();
78+
((DefaultWorkItemHandlerConfig) config.workItemHandlers()).register("Human Task", new DefaultKogitoWorkItemHandler());
79+
BpmnProcess process = BpmnProcess.from(config, new ClassPathResource(fileName)).get(0);
7580
AbstractProcessInstancesFactory factory = mock(AbstractProcessInstancesFactory.class);
7681
process.setProcessInstancesFactory(factory);
7782
process.configure();
@@ -80,6 +85,8 @@ private BpmnProcess createProcess(String fileName) {
8085

8186
@Test
8287
public void testBasic() {
88+
StaticProcessConfig config = new StaticProcessConfig();
89+
((DefaultWorkItemHandlerConfig) config.workItemHandlers()).register("Human Task", new DefaultKogitoWorkItemHandler());
8390
BpmnProcess process = createProcess("BPMN2-UserTask.bpmn2");
8491

8592
CacheProcessInstances pi = new CacheProcessInstances(process, cacheManager, null, true);

addons/common/persistence/jdbc/src/test/java/org/kie/persistence/jdbc/AbstractProcessInstancesIT.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,16 @@
3030
import org.junit.jupiter.api.Test;
3131
import org.kie.kogito.auth.IdentityProviders;
3232
import org.kie.kogito.auth.SecurityPolicy;
33+
import org.kie.kogito.internal.process.workitem.Policy;
3334
import org.kie.kogito.persistence.jdbc.JDBCProcessInstances;
3435
import org.kie.kogito.process.ProcessInstance;
3536
import org.kie.kogito.process.WorkItem;
3637
import org.kie.kogito.process.bpmn2.BpmnProcess;
3738
import org.kie.kogito.process.bpmn2.BpmnProcessInstance;
3839
import org.kie.kogito.process.bpmn2.BpmnVariables;
40+
import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
41+
import org.kie.kogito.process.impl.StaticProcessConfig;
42+
import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
3943
import org.testcontainers.containers.JdbcDatabaseContainer;
4044

4145
import static java.util.Collections.singletonMap;
@@ -56,7 +60,7 @@
5660
abstract class AbstractProcessInstancesIT {
5761

5862
public static final String TEST_ID = "02ac3854-46ee-42b7-8b63-5186c9889d96";
59-
public static SecurityPolicy securityPolicy = SecurityPolicy.of(IdentityProviders.of("john"));
63+
public static Policy securityPolicy = SecurityPolicy.of(IdentityProviders.of("john"));
6064

6165
DataSource dataSource;
6266

@@ -69,7 +73,9 @@ public static void initMigration(JdbcDatabaseContainer container, String dbKind)
6973
}
7074

7175
public static BpmnProcess createProcess(TestProcessInstancesFactory factory, String fileName) {
72-
BpmnProcess process = BpmnProcess.from(new ClassPathResource(fileName)).get(0);
76+
StaticProcessConfig config = new StaticProcessConfig();
77+
((DefaultWorkItemHandlerConfig) config.workItemHandlers()).register("Human Task", new DefaultKogitoWorkItemHandler());
78+
BpmnProcess process = BpmnProcess.from(config, new ClassPathResource(fileName)).get(0);
7379
process.setProcessInstancesFactory(factory);
7480
process.configure();
7581
abort(process.instances());

0 commit comments

Comments
 (0)