diff --git a/jbpm-case-mgmt/jbpm-case-mgmt-api/src/main/java/org/jbpm/casemgmt/api/CaseService.java b/jbpm-case-mgmt/jbpm-case-mgmt-api/src/main/java/org/jbpm/casemgmt/api/CaseService.java index 5223351e7a..1781177c87 100644 --- a/jbpm-case-mgmt/jbpm-case-mgmt-api/src/main/java/org/jbpm/casemgmt/api/CaseService.java +++ b/jbpm-case-mgmt/jbpm-case-mgmt-api/src/main/java/org/jbpm/casemgmt/api/CaseService.java @@ -27,7 +27,9 @@ import org.jbpm.casemgmt.api.model.instance.CommentInstance; import org.jbpm.casemgmt.api.model.instance.CommentSortBy; import org.jbpm.services.api.ProcessInstanceNotFoundException; +import org.kie.api.task.model.Group; import org.kie.api.task.model.OrganizationalEntity; +import org.kie.api.task.model.User; import org.kie.internal.query.QueryContext; /** @@ -401,4 +403,18 @@ public interface CaseService { * @return */ TaskSpecification newTaskSpec(String nodeType, String nodeName, Map parameters); + + /** + * Creates new user with given id; + * @param userId user id to be used when creating User instance + * @return new instance for userId + */ + User newUser(String userId); + + /** + * Creates new group with given id; + * @param groupId group id to be used when creating Group instance + * @return new instance for groupId + */ + Group newGroup(String groupId); } diff --git a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/CaseServiceImpl.java b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/CaseServiceImpl.java index 4fa09a648c..f0d1a8495a 100644 --- a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/CaseServiceImpl.java +++ b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/CaseServiceImpl.java @@ -66,12 +66,16 @@ import org.kie.api.command.KieCommands; import org.kie.api.runtime.manager.RuntimeManager; import org.kie.api.runtime.process.ProcessInstance; +import org.kie.api.task.model.Group; import org.kie.api.task.model.OrganizationalEntity; +import org.kie.api.task.model.User; import org.kie.internal.KieInternalServices; import org.kie.internal.process.CorrelationKeyFactory; import org.kie.internal.query.QueryContext; import org.kie.internal.runtime.manager.context.CaseContext; import org.kie.internal.runtime.manager.context.ProcessInstanceIdContext; +import org.kie.internal.task.api.TaskModelFactory; +import org.kie.internal.task.api.TaskModelProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,6 +86,7 @@ public class CaseServiceImpl implements CaseService { private CorrelationKeyFactory correlationKeyFactory = KieInternalServices.Factory.get().newCorrelationKeyFactory(); private KieCommands commandsFactory = KieServices.Factory.get().getCommands(); + private TaskModelFactory factory = TaskModelProvider.getFactory(); private CaseIdGenerator caseIdGenerator; @@ -144,7 +149,7 @@ public String startCase(String deploymentId, String caseDefinitionId, CaseFileIn @Override public CaseFileInstance getCaseFileInstance(String caseId) throws CaseNotFoundException { - ProcessInstanceDesc pi = verifyCaseIdExists(caseId); + ProcessInstanceDesc pi = verifyCaseIdExisted(caseId); return internalGetCaseFileInstance(caseId, pi); } @@ -194,7 +199,7 @@ public void cancelCase(String caseId) throws CaseNotFoundException { @Override public void destroyCase(String caseId) throws CaseNotFoundException { logger.debug("About to destroy permanently case {}", caseId); - ProcessInstanceDesc pi = verifyCaseIdExists(caseId); + ProcessInstanceDesc pi = verifyCaseIdExisted(caseId); processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new CancelCaseCommand(caseId, processService, runtimeDataService, true)); } @@ -461,6 +466,16 @@ public TaskSpecification newHumanTaskSpec(String taskName, String description, S public TaskSpecification newTaskSpec(String nodeType, String nodeName, Map parameters) { return new WorkItemTaskSpecification(nodeType, nodeName, parameters); } + + @Override + public User newUser(String userId) { + return factory.newUser(userId); + } + + @Override + public Group newGroup(String groupId) { + return factory.newGroup(groupId); + } /* * internal methods @@ -470,7 +485,9 @@ public TaskSpecification newTaskSpec(String nodeType, String nodeName, Map caseFiles = (Collection) processService.execute(pi.getDeploymentId(), CaseContext.get(caseId), commandsFactory.newGetObjects(new ClassObjectFilter(CaseFileInstance.class))); - if (caseFiles.size() == 1) { + if (caseFiles.size() == 0) { + throw new CaseNotFoundException("Case with id " + caseId + " was not found"); + } else if (caseFiles.size() == 1) { CaseFileInstance caseFile = caseFiles.iterator().next(); logger.debug("Single case file {} found in working memory", caseFile); return caseFile; @@ -496,6 +513,15 @@ protected ProcessInstanceDesc verifyCaseIdExists(String caseId) throws CaseNotFo return pi; } + + protected ProcessInstanceDesc verifyCaseIdExisted(String caseId) throws CaseNotFoundException { + Collection instances = runtimeDataService.getProcessInstancesByCorrelationKey(correlationKeyFactory.newCorrelationKey(caseId), new org.kie.api.runtime.query.QueryContext(0, 1)); + if (instances.isEmpty()) { + throw new CaseNotFoundException("Case with id " + caseId + " was not found"); + } + + return instances.iterator().next(); + } protected CaseEventSupport getCaseEventSupport(String deploymentId) { @@ -509,4 +535,5 @@ protected CaseEventSupport getCaseEventSupport(String deploymentId) { return emptyCaseEventSupport; } + } diff --git a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/command/StartCaseCommand.java b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/command/StartCaseCommand.java index 50e6b9904e..fd2af107f4 100644 --- a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/command/StartCaseCommand.java +++ b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/command/StartCaseCommand.java @@ -18,17 +18,26 @@ import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; +import org.drools.core.command.impl.GenericCommand; +import org.drools.core.command.impl.KnowledgeCommandContext; +import org.drools.core.common.InternalKnowledgeRuntime; +import org.drools.core.event.ProcessEventSupport; import org.jbpm.casemgmt.api.model.instance.CaseFileInstance; import org.jbpm.casemgmt.impl.event.CaseEventSupport; +import org.jbpm.process.instance.InternalProcessRuntime; +import org.jbpm.process.instance.ProcessInstance; import org.jbpm.services.api.ProcessService; import org.kie.api.KieServices; import org.kie.api.command.KieCommands; import org.kie.api.runtime.EnvironmentName; +import org.kie.api.runtime.KieSession; import org.kie.internal.KieInternalServices; import org.kie.internal.command.Context; import org.kie.internal.process.CorrelationKey; import org.kie.internal.process.CorrelationKeyFactory; +import org.kie.internal.runtime.KnowledgeRuntime; import org.kie.internal.runtime.manager.context.CaseContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,8 +81,35 @@ public Void execute(Context context) { Map params = new HashMap<>(); // set case id to allow it to use CaseContext when creating runtime engine params.put(EnvironmentName.CASE_ID, caseId); - long processInstanceId = processService.startProcess(deploymentId, caseDefinitionId, correlationKey, params); + final long processInstanceId = processService.startProcess(deploymentId, caseDefinitionId, correlationKey, params); logger.debug("Case {} successfully started (process instance id {})", caseId, processInstanceId); + + final Map caseData = caseFile.getData(); + if (caseData != null && !caseData.isEmpty()) { + processService.execute(deploymentId, CaseContext.get(caseId), new GenericCommand() { + + private static final long serialVersionUID = -7093369406457484236L; + + @Override + public Void execute(Context context) { + KieSession ksession = ((KnowledgeCommandContext) context).getKieSession(); + ProcessInstance pi = (ProcessInstance) ksession.getProcessInstance(processInstanceId); + if (pi != null) { + ProcessEventSupport processEventSupport = ((InternalProcessRuntime) ((InternalKnowledgeRuntime) ksession).getProcessRuntime()).getProcessEventSupport(); + for (Entry entry : caseData.entrySet()) { + String name = "caseFile_" + entry.getKey(); + processEventSupport.fireAfterVariableChanged( + name, + name, + null, entry.getValue(), + pi, + (KnowledgeRuntime) ksession); + } + } + return null; + } + }); + } caseEventSupport.fireAfterCaseStarted(caseId, deploymentId, caseDefinitionId, caseFile, processInstanceId); return null; } diff --git a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/model/instance/CaseFileInstanceImpl.java b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/model/instance/CaseFileInstanceImpl.java index 4fb4b6b62f..d92158bed7 100644 --- a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/model/instance/CaseFileInstanceImpl.java +++ b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/main/java/org/jbpm/casemgmt/impl/model/instance/CaseFileInstanceImpl.java @@ -34,6 +34,8 @@ import org.jbpm.casemgmt.api.model.instance.CommentInstance; import org.kie.api.runtime.process.CaseAssignment; import org.kie.api.task.model.OrganizationalEntity; +import org.kie.internal.task.api.TaskModelFactory; +import org.kie.internal.task.api.TaskModelProvider; /* * Implementation note: since the CaseFileInstanceImpl will be marshalled/unmarshalled by @@ -55,6 +57,8 @@ public class CaseFileInstanceImpl implements CaseFileInstance, CaseAssignment, S private Map roles = new HashMap<>(); private List comments = new ArrayList<>(); + private TaskModelFactory factory = TaskModelProvider.getFactory(); + public CaseFileInstanceImpl() { } @@ -169,6 +173,19 @@ public void remove(String roleName, OrganizationalEntity entity) { } } + + @Override + public void assignUser(String roleName, String userId) { + assign(roleName, factory.newUser(userId)); + + } + + @Override + public void assignGroup(String roleName, String groupId) { + assign(roleName, factory.newGroup(groupId)); + + } + @Override public Collection getAssignments(String roleName) { String[] roleNames = roleName.split(separator); diff --git a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/java/org/jbpm/casemgmt/impl/CaseServiceImplTest.java b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/java/org/jbpm/casemgmt/impl/CaseServiceImplTest.java index 1de5f009c2..264c9be994 100644 --- a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/java/org/jbpm/casemgmt/impl/CaseServiceImplTest.java +++ b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/java/org/jbpm/casemgmt/impl/CaseServiceImplTest.java @@ -54,6 +54,7 @@ import org.jbpm.services.api.model.DeploymentUnit; import org.jbpm.services.api.model.NodeInstanceDesc; import org.jbpm.services.api.model.ProcessInstanceDesc; +import org.jbpm.services.api.model.VariableDesc; import org.jbpm.services.task.impl.model.UserImpl; import org.junit.After; import org.junit.Before; @@ -63,6 +64,8 @@ import org.kie.api.task.model.OrganizationalEntity; import org.kie.api.task.model.Status; import org.kie.api.task.model.TaskSummary; +import org.kie.internal.KieInternalServices; +import org.kie.internal.process.CorrelationKey; import org.kie.internal.query.QueryContext; import org.kie.internal.query.QueryFilter; import org.kie.scanner.MavenRepository; @@ -212,6 +215,14 @@ public void testStartEmptyCaseWithCaseFile() { assertEquals("my first case", cInstance.getCaseFile().getData("name")); assertEquals(deploymentUnit.getIdentifier(), cInstance.getDeploymentId()); + + Collection vars = runtimeDataService.getVariablesCurrentState(((CaseInstanceImpl)cInstance).getProcessInstanceId()); + assertNotNull(vars); + assertEquals(2, vars.size()); + Map mappedVars = vars.stream().collect(toMap(v-> v.getVariableId(), v -> v.getNewValue())); + assertEquals("my first case", mappedVars.get("caseFile_name")); + assertEquals(FIRST_CASE_ID, mappedVars.get("CaseId")); + caseService.cancelCase(caseId); try { caseService.getCaseInstance(caseId); @@ -1203,6 +1214,204 @@ public void testStartCaseWithoutStartNode() { } } + @Test + public void testStartEmptyCaseViaProcessService() { + assertNotNull(deploymentService); + DeploymentUnit deploymentUnit = new KModuleDeploymentUnit(GROUP_ID, ARTIFACT_ID, VERSION); + + deploymentService.deploy(deploymentUnit); + units.add(deploymentUnit); + + String caseId = FIRST_CASE_ID; + + CorrelationKey correlationKey = KieInternalServices.Factory.get().newCorrelationKeyFactory().newCorrelationKey(caseId); + Map params = new HashMap<>(); + params.put("name", "my case via process service"); + Long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), EMPTY_CASE_P_ID, correlationKey, params); + + assertNotNull(processInstanceId); + + try { + CaseInstance cInstance = caseService.getCaseInstance(caseId); + assertNotNull(cInstance); + assertEquals(deploymentUnit.getIdentifier(), cInstance.getDeploymentId()); + assertEquals(caseId, cInstance.getCaseId()); + + caseService.cancelCase(caseId); + try { + caseService.getCaseInstance(caseId); + fail("Case was aborted so it should not be found any more"); + } catch (CaseNotFoundException e) { + // expected as it was aborted + } + caseId = null; + } catch (Exception e) { + logger.error("Unexpected error {}", e.getMessage(), e); + fail("Unexpected exception " + e.getMessage()); + } finally { + if (caseId != null) { + caseService.cancelCase(caseId); + } + } + } + + @Test + public void testStartEmptyCaseViaProcessServiceWithoutCorrelationKey() { + assertNotNull(deploymentService); + DeploymentUnit deploymentUnit = new KModuleDeploymentUnit(GROUP_ID, ARTIFACT_ID, VERSION); + + deploymentService.deploy(deploymentUnit); + units.add(deploymentUnit); + + Map params = new HashMap<>(); + params.put("name", "my case via process service"); + Long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), EMPTY_CASE_P_ID, params); + assertNotNull(processInstanceId); + + String caseId = processInstanceId.toString(); + + try { + CaseInstance cInstance = caseService.getCaseInstance(caseId); + assertNotNull(cInstance); + assertEquals(deploymentUnit.getIdentifier(), cInstance.getDeploymentId()); + assertEquals(caseId, cInstance.getCaseId()); + + caseService.cancelCase(caseId); + try { + caseService.getCaseInstance(caseId); + fail("Case was aborted so it should not be found any more"); + } catch (CaseNotFoundException e) { + // expected as it was aborted + } + caseId = null; + } catch (Exception e) { + logger.error("Unexpected error {}", e.getMessage(), e); + fail("Unexpected exception " + e.getMessage()); + } finally { + if (caseId != null) { + caseService.cancelCase(caseId); + } + } + } + + @Test + public void testStartEmptyCaseViaProcessServiceWithoutCorrelationKeyWithMilestones() { + assertNotNull(deploymentService); + DeploymentUnit deploymentUnit = new KModuleDeploymentUnit(GROUP_ID, ARTIFACT_ID, VERSION); + + deploymentService.deploy(deploymentUnit); + units.add(deploymentUnit); + + Map params = new HashMap<>(); + params.put("s", "my case via process service"); + Long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), USER_TASK_CASE_P_ID, params); + assertNotNull(processInstanceId); + + String caseId = processInstanceId.toString(); + + try { + CaseInstance cInstance = caseService.getCaseInstance(caseId); + assertNotNull(cInstance); + assertEquals(deploymentUnit.getIdentifier(), cInstance.getDeploymentId()); + assertEquals(caseId, cInstance.getCaseId()); + + Collection milestones = caseRuntimeDataService.getCaseInstanceMilestones(caseId, true, new QueryContext()); + assertNotNull(milestones); + assertEquals(0, milestones.size()); + + // trigger milestone node + caseService.triggerAdHocFragment(caseId, "Milestone1", null); + + milestones = caseRuntimeDataService.getCaseInstanceMilestones(caseId, true, new QueryContext()); + assertNotNull(milestones); + assertEquals(1, milestones.size()); + + caseService.cancelCase(caseId); + try { + caseService.getCaseInstance(caseId); + fail("Case was aborted so it should not be found any more"); + } catch (CaseNotFoundException e) { + // expected as it was aborted + } + caseId = null; + } catch (Exception e) { + logger.error("Unexpected error {}", e.getMessage(), e); + fail("Unexpected exception " + e.getMessage()); + } finally { + if (caseId != null) { + caseService.cancelCase(caseId); + } + } + } + + @Test + public void testStartThenCancelRetrieveCaseFile() { + assertNotNull(deploymentService); + DeploymentUnit deploymentUnit = new KModuleDeploymentUnit(GROUP_ID, ARTIFACT_ID, VERSION); + + deploymentService.deploy(deploymentUnit); + units.add(deploymentUnit); + + try { + caseService.getCaseFileInstance(FIRST_CASE_ID); + fail("There is no case yet started"); + } catch (CaseNotFoundException e) { + // expected + } + + Map data = new HashMap<>(); + data.put("name", "my first case"); + CaseFileInstance caseFile = caseService.newCaseFileInstance(deploymentUnit.getIdentifier(), EMPTY_CASE_P_ID, data); + + String caseId = caseService.startCase(deploymentUnit.getIdentifier(), EMPTY_CASE_P_ID, caseFile); + assertNotNull(caseId); + assertEquals(FIRST_CASE_ID, caseId); + try { + CaseInstance cInstance = caseService.getCaseInstance(caseId); + assertNotNull(cInstance); + assertEquals(deploymentUnit.getIdentifier(), cInstance.getDeploymentId()); + assertEquals("my first case", cInstance.getCaseDescription()); + + CaseFileInstance caseFileFromCase = caseService.getCaseFileInstance(FIRST_CASE_ID); + assertNotNull(caseFileFromCase); + + caseService.cancelCase(caseId); + try { + caseService.getCaseInstance(caseId); + fail("Case was aborted so it should not be found any more"); + } catch (CaseNotFoundException e) { + // expected as it was aborted + } + + caseFileFromCase = caseService.getCaseFileInstance(FIRST_CASE_ID); + assertNotNull(caseFileFromCase); + + caseService.destroyCase(caseId); + try { + caseService.getCaseInstance(caseId); + fail("Case was aborted so it should not be found any more"); + } catch (CaseNotFoundException e) { + // expected as it was aborted + } + caseId = null; + + try { + caseService.getCaseFileInstance(FIRST_CASE_ID); + fail("There is no case yet started"); + } catch (CaseNotFoundException e) { + // expected + } + + } catch (Exception e) { + logger.error("Unexpected error {}", e.getMessage(), e); + fail("Unexpected exception " + e.getMessage()); + } finally { + if (caseId != null) { + caseService.cancelCase(caseId); + } + } + } + /* * Helper methods */ diff --git a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/resources/cases/ScriptRoleAssignmentCase.bpmn2 b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/resources/cases/ScriptRoleAssignmentCase.bpmn2 index 4e745f95d6..5d03999599 100644 --- a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/resources/cases/ScriptRoleAssignmentCase.bpmn2 +++ b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/resources/cases/ScriptRoleAssignmentCase.bpmn2 @@ -24,7 +24,7 @@ SequenceFlow_1 SequenceFlow_2 org.kie.api.runtime.process.CaseAssignment assignments = kcontext.getCaseAssignment(); -assignments.assign("owner", new org.jbpm.services.task.impl.model.UserImpl("john")); +assignments.assignUser("owner", "john"); System.out.println("Onwer role assigned to john"); diff --git a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/resources/org/jbpm/casemgmt/demo/insurance/CarInsuranceClaimCase.bpmn2 b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/resources/org/jbpm/casemgmt/demo/insurance/CarInsuranceClaimCase.bpmn2 index 02275e8beb..ba80950445 100644 --- a/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/resources/org/jbpm/casemgmt/demo/insurance/CarInsuranceClaimCase.bpmn2 +++ b/jbpm-case-mgmt/jbpm-case-mgmt-impl/src/test/resources/org/jbpm/casemgmt/demo/insurance/CarInsuranceClaimCase.bpmn2 @@ -27,9 +27,9 @@ - - - + + + @@ -75,7 +75,7 @@ - claimReport + caseFile_claimReport _A5816D33-903D-4CFD-AC24-A9EF21794079__claimReportInputX @@ -333,7 +333,7 @@ - claimReport + caseFile_claimReport _14392A9B-D1E5-426A-9AD4-10B905159BD6__claimReportInputX @@ -372,7 +372,7 @@ - claimReport + caseFile_claimReport _C88DB70F-951D-4F4F-BE06-651EBFC184AB__claimReportInputX @@ -388,7 +388,7 @@ - + @@ -412,7 +412,7 @@ - claimReport + caseFile_claimReport _0DC21BCB-1E29-4255-A43D-1EFBEEDCF6B4__claimReportInputX @@ -482,7 +482,7 @@ - claimReport + caseFile_claimReport _27E8BA49-0BB5-4153-B7CF-80D44B675A0D__claimReportInputX diff --git a/jbpm-persistence-jpa/src/main/java/org/jbpm/persistence/processinstance/JPAProcessInstanceManager.java b/jbpm-persistence-jpa/src/main/java/org/jbpm/persistence/processinstance/JPAProcessInstanceManager.java index b3cd28989b..043c193638 100644 --- a/jbpm-persistence-jpa/src/main/java/org/jbpm/persistence/processinstance/JPAProcessInstanceManager.java +++ b/jbpm-persistence-jpa/src/main/java/org/jbpm/persistence/processinstance/JPAProcessInstanceManager.java @@ -29,6 +29,7 @@ import org.jbpm.persistence.ProcessPersistenceContext; import org.jbpm.persistence.ProcessPersistenceContextManager; import org.jbpm.persistence.correlation.CorrelationKeyInfo; +import org.jbpm.persistence.correlation.CorrelationPropertyInfo; import org.jbpm.process.instance.InternalProcessRuntime; import org.jbpm.process.instance.ProcessInstanceManager; import org.jbpm.process.instance.impl.ProcessInstanceImpl; @@ -78,12 +79,15 @@ public void addProcessInstance(ProcessInstance processInstance, CorrelationKey c processInstanceInfo = context.persist( processInstanceInfo ); ((org.jbpm.process.instance.ProcessInstance) processInstance).setId( processInstanceInfo.getId() ); processInstanceInfo.updateLastReadDate(); - // persist correlation if exists - if (correlationKey != null) { - CorrelationKeyInfo correlationKeyInfo = (CorrelationKeyInfo) correlationKey; - correlationKeyInfo.setProcessInstanceId(processInstanceInfo.getId()); - context.persist(correlationKeyInfo); + // generate correlation key if not given which is same as process instance id to keep uniqueness + if (correlationKey == null) { + correlationKey = new CorrelationKeyInfo(); + ((CorrelationKeyInfo)correlationKey).addProperty(new CorrelationPropertyInfo(null, processInstanceInfo.getId().toString())); + ((org.jbpm.process.instance.ProcessInstance) processInstance).getMetaData().put("CorrelationKey", correlationKey); } + CorrelationKeyInfo correlationKeyInfo = (CorrelationKeyInfo) correlationKey; + correlationKeyInfo.setProcessInstanceId(processInstanceInfo.getId()); + context.persist(correlationKeyInfo); internalAddProcessInstance(processInstance); } diff --git a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManager.java b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManager.java index 2425f438b6..c4c7294ee5 100644 --- a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManager.java +++ b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManager.java @@ -149,12 +149,14 @@ public RuntimeEngine getRuntimeEngine(Context context) { Object contexts = mapper.findContextId(ksession.getIdentifier(), this.identifier); if (contexts instanceof Collection) { RuntimeEngine finalRuntimeEngnie = runtime; + KieSession finalKieSession = ksession; ((Collection) contexts).forEach(o -> { try { saveLocalRuntime(null, Long.parseLong(o.toString()), finalRuntimeEngnie); } catch (NumberFormatException e) { saveLocalRuntime(o.toString(), null, finalRuntimeEngnie); + finalKieSession.getEnvironment().set("CaseId", o.toString()); } }); } @@ -662,13 +664,14 @@ public KieSession initKieSession(Context context, InternalRuntimeManager mana } else { Object contexts = mapper.findContextId(ksession.getIdentifier(), manager.getIdentifier()); if (contexts instanceof Collection) { - + KieSession finalKieSession = ksession; ((Collection) contexts).forEach(o -> { try { saveLocalRuntime(null, Long.parseLong(o.toString()), engine); } catch (NumberFormatException e) { saveLocalRuntime(o.toString(), null, engine); + finalKieSession.getEnvironment().set("CaseId", o.toString()); } }); }