Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JBPM-5541 - Case file conditional event fails other cases #724

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions jbpm-bpmn2/src/test/java/org/jbpm/bpmn2/ActivityTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1062,7 +1062,7 @@ public void testAdHocProcess() throws Exception {
assertProcessInstanceActive(processInstance);
ksession.signalEvent("User1", null, processInstance.getId());
assertProcessInstanceActive(processInstance);
ksession.insert(new Person());
ksession.getEntryPoint("AdHocProcess").insert(new Person());
ksession.signalEvent("Task3", null, processInstance.getId());
assertProcessInstanceFinished(processInstance, ksession);
}
Expand Down Expand Up @@ -1090,7 +1090,7 @@ public void testAdHocProcessDynamicTask() throws Exception {
ksession.getWorkItemManager().completeWorkItem(workItem.getId(), null);
ksession.signalEvent("User1", null, processInstance.getId());
assertProcessInstanceActive(processInstance);
ksession.insert(new Person());
ksession.getEntryPoint("AdHocProcess").insert(new Person());
ksession.signalEvent("Task3", null, processInstance.getId());
assertProcessInstanceFinished(processInstance, ksession);
}
Expand All @@ -1116,7 +1116,7 @@ public void testAdHocProcessDynamicSubProcess() throws Exception {
ksession = restoreSession(ksession, true);
ksession.signalEvent("User1", null, processInstance.getId());
assertProcessInstanceActive(processInstance);
ksession.insert(new Person());
ksession.getEntryPoint("AdHocProcess").insert(new Person());
ksession.signalEvent("Task3", null, processInstance.getId());
assertProcessInstanceFinished(processInstance, ksession);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ public interface CaseFileInstance extends CaseData {
*/
String getCaseId();

/**
* Returns case definition id this case instance is associated with.
* @return
*/
String getCaseDefinitionId();

/**
* Returns start date of the associated case
* @return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.stream.Collectors;

import org.drools.core.ClassObjectFilter;
import org.drools.core.command.runtime.rule.GetObjectsInEntryPointCommand;
import org.jbpm.casemgmt.api.CaseActiveException;
import org.jbpm.casemgmt.api.CaseNotFoundException;
import org.jbpm.casemgmt.api.CaseRuntimeDataService;
Expand Down Expand Up @@ -141,11 +142,12 @@ public String startCase(String deploymentId, String caseDefinitionId, CaseFileIn
logger.debug("Generated case id {} for case definition id {}", caseId, caseDefinitionId);

if (caseFile == null) {
caseFile = new CaseFileInstanceImpl(caseId);
caseFile = new CaseFileInstanceImpl(caseId, caseDefinitionId);
((CaseFileInstanceImpl)caseFile).setupRoles(caseDef.getCaseRoles());
logger.debug("CaseFile was not given, creating new empty one.");
} else {
((CaseFileInstanceImpl)caseFile).setCaseId(caseId);
((CaseFileInstanceImpl)caseFile).setCaseDefinitionId(caseDefinitionId);
logger.debug("CaseFile {} was given, associating it with case {}", caseFile, caseId);
}

Expand Down Expand Up @@ -290,7 +292,7 @@ public Long addDynamicSubprocess(String caseId, String processId, Map<String, Ob
if (pi == null || !pi.getState().equals(ProcessInstance.STATE_ACTIVE)) {
throw new ProcessInstanceNotFoundException("No process instance found with id " + pi.getId() + " or it's not active anymore");
}
return processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new AddDynamicProcessCommand(caseId, pi.getId(), processId, parameters));
return processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new AddDynamicProcessCommand(caseId, pi.getId(), processId, parameters, pi.getProcessId()));
}

@Override
Expand All @@ -301,14 +303,14 @@ public Long addDynamicSubprocess(Long processInstanceId, String processId, Map<S
}

String caseId = pi.getCorrelationKey();
return processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(processInstanceId), new AddDynamicProcessCommand(caseId, pi.getId(), processId, parameters));
return processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(processInstanceId), new AddDynamicProcessCommand(caseId, pi.getId(), processId, parameters, pi.getProcessId()));
}

@Override
public Long addDynamicSubprocessToStage(String caseId, String stageId, String processId, Map<String, Object> parameters) throws CaseNotFoundException {
ProcessInstanceDesc pi = verifyCaseIdExists(caseId);

return processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new AddDynamicProcessToStageCommand(caseId, pi.getId(), stageId, processId, parameters));
return processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new AddDynamicProcessToStageCommand(caseId, pi.getId(), stageId, processId, parameters, pi.getProcessId()));
}

@Override
Expand All @@ -318,7 +320,7 @@ public Long addDynamicSubprocessToStage(Long processInstanceId, String stageId,
throw new ProcessInstanceNotFoundException("No process instance found with id " + processInstanceId + " or it's not active anymore");
}
String caseId = pi.getCorrelationKey();
return processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(processInstanceId), new AddDynamicProcessToStageCommand(caseId, pi.getId(), stageId, processId, parameters));
return processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(processInstanceId), new AddDynamicProcessToStageCommand(caseId, pi.getId(), stageId, processId, parameters, pi.getProcessId()));
}

@Override
Expand All @@ -344,31 +346,31 @@ public void addDataToCaseFile(String caseId, String name, Object value) throws C

Map<String, Object> parameters = new HashMap<>();
parameters.put(name, value);
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new AddDataCaseFileInstanceCommand(parameters));
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new AddDataCaseFileInstanceCommand(pi.getProcessId(), parameters));

}

@Override
public void addDataToCaseFile(String caseId, Map<String, Object> data) throws CaseNotFoundException {
ProcessInstanceDesc pi = verifyCaseIdExists(caseId);

processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new AddDataCaseFileInstanceCommand(data));
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new AddDataCaseFileInstanceCommand(pi.getProcessId(), data));
}

@Override
public void removeDataFromCaseFile(String caseId, String name) throws CaseNotFoundException {
ProcessInstanceDesc pi = verifyCaseIdExists(caseId);


processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new RemoveDataCaseFileInstanceCommand(Arrays.asList(name)));
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new RemoveDataCaseFileInstanceCommand(pi.getProcessId(), Arrays.asList(name)));

}

@Override
public void removeDataFromCaseFile(String caseId, List<String> variableNames) throws CaseNotFoundException {
ProcessInstanceDesc pi = verifyCaseIdExists(caseId);

processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new RemoveDataCaseFileInstanceCommand(variableNames));
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new RemoveDataCaseFileInstanceCommand(pi.getProcessId(), variableNames));
}

/*
Expand All @@ -378,13 +380,13 @@ public void removeDataFromCaseFile(String caseId, List<String> variableNames) th
@Override
public void assignToCaseRole(String caseId, String role, OrganizationalEntity entity) throws CaseNotFoundException {
ProcessInstanceDesc pi = verifyCaseIdExists(caseId);
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new ModifyRoleAssignmentCommand(role, entity, true));
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new ModifyRoleAssignmentCommand(pi.getProcessId(), role, entity, true));
}

@Override
public void removeFromCaseRole(String caseId, String role, OrganizationalEntity entity) throws CaseNotFoundException {
ProcessInstanceDesc pi = verifyCaseIdExists(caseId);
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new ModifyRoleAssignmentCommand(role, entity, false));
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new ModifyRoleAssignmentCommand(pi.getProcessId(), role, entity, false));
}

@Override
Expand Down Expand Up @@ -432,20 +434,20 @@ public Collection<CommentInstance> getCaseComments(String caseId, CommentSortBy
@Override
public void addCaseComment(String caseId, String author, String comment) throws CaseNotFoundException {
ProcessInstanceDesc pi = verifyCaseIdExists(caseId);
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new CaseCommentCommand(author, comment));
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new CaseCommentCommand(pi.getProcessId(), author, comment));
}

@Override
public void updateCaseComment(String caseId, String commentId, String author, String text) throws CaseNotFoundException {
ProcessInstanceDesc pi = verifyCaseIdExists(caseId);
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new CaseCommentCommand(commentId, author, text));
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new CaseCommentCommand(pi.getProcessId(), commentId, author, text));

}

@Override
public void removeCaseComment(String caseId, String commentId) throws CaseNotFoundException {
ProcessInstanceDesc pi = verifyCaseIdExists(caseId);
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new CaseCommentCommand(commentId));
processService.execute(pi.getDeploymentId(), ProcessInstanceIdContext.get(pi.getId()), new CaseCommentCommand(pi.getProcessId(), commentId));
}

/*
Expand All @@ -455,7 +457,7 @@ public void removeCaseComment(String caseId, String commentId) throws CaseNotFou
@Override
public CaseFileInstance newCaseFileInstance(String deploymentId, String caseDefinition, Map<String, Object> data) {
CaseDefinition def = caseRuntimeDataService.getCase(deploymentId, caseDefinition);
CaseFileInstanceImpl caseFile = new CaseFileInstanceImpl(data);
CaseFileInstanceImpl caseFile = new CaseFileInstanceImpl(data, caseDefinition);
caseFile.setupRoles(def.getCaseRoles());

return caseFile;
Expand All @@ -464,7 +466,7 @@ public CaseFileInstance newCaseFileInstance(String deploymentId, String caseDefi
@Override
public CaseFileInstance newCaseFileInstance(String deploymentId, String caseDefinition, Map<String, Object> data, Map<String, OrganizationalEntity> rolesAssignment) {
CaseDefinition def = caseRuntimeDataService.getCase(deploymentId, caseDefinition);
CaseFileInstanceImpl caseFile = new CaseFileInstanceImpl(data);
CaseFileInstanceImpl caseFile = new CaseFileInstanceImpl(data, caseDefinition);
caseFile.setupRoles(def.getCaseRoles());

rolesAssignment.entrySet().stream().forEach(entry -> caseFile.assign(entry.getKey(), entry.getValue()));
Expand Down Expand Up @@ -500,7 +502,7 @@ public Group newGroup(String groupId) {
@SuppressWarnings("unchecked")
protected CaseFileInstance internalGetCaseFileInstance(String caseId, ProcessInstanceDesc pi) {
logger.debug("Retrieving case file from working memory for case " + caseId);
Collection<CaseFileInstance> caseFiles = (Collection<CaseFileInstance>) processService.execute(pi.getDeploymentId(), CaseContext.get(caseId), commandsFactory.newGetObjects(new ClassObjectFilter(CaseFileInstance.class)));
Collection<CaseFileInstance> caseFiles = (Collection<CaseFileInstance>) processService.execute(pi.getDeploymentId(), CaseContext.get(caseId), new GetObjectsInEntryPointCommand(new ClassObjectFilter(CaseFileInstance.class), pi.getProcessId()));
if (caseFiles.size() == 0) {
throw new CaseNotFoundException("Case with id " + caseId + " was not found");
} else if (caseFiles.size() == 1) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,28 +35,30 @@ public class AddDataCaseFileInstanceCommand extends CaseCommand<Void> {
private static final long serialVersionUID = 6345222909719335953L;

private Map<String, Object> parameters;
private String caseDefinitionId;

public AddDataCaseFileInstanceCommand(Map<String, Object> parameters) {
public AddDataCaseFileInstanceCommand(String caseDefinitionId, Map<String, Object> parameters) {
this.caseDefinitionId = caseDefinitionId;
this.parameters = parameters;
}

@Override
public Void execute(Context context) {
KieSession ksession = ((RegistryContext) context).lookup( KieSession.class );

Collection<? extends Object> caseFiles = ksession.getObjects(new ClassObjectFilter(CaseFileInstance.class));
Collection<? extends Object> caseFiles = ksession.getEntryPoint(caseDefinitionId).getObjects(new ClassObjectFilter(CaseFileInstance.class));
if (caseFiles.size() != 1) {
throw new IllegalStateException("Not able to find distinct case file - found case files " + caseFiles.size());
}
CaseFileInstance caseFile = (CaseFileInstance) caseFiles.iterator().next();
FactHandle factHandle = ksession.getFactHandle(caseFile);
FactHandle factHandle = ksession.getEntryPoint(caseDefinitionId).getFactHandle(caseFile);

CaseEventSupport caseEventSupport = getCaseEventSupport(context);
caseEventSupport.fireBeforeCaseDataAdded(caseFile.getCaseId(), parameters);
caseFile.addAll(parameters);
caseEventSupport.fireAfterCaseDataAdded(caseFile.getCaseId(), parameters);

ksession.update(factHandle, caseFile);
ksession.getEntryPoint(caseDefinitionId).update(factHandle, caseFile);
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.runtime.Context;

import java.util.HashMap;
import java.util.Map;

/**
Expand All @@ -38,12 +39,16 @@ public class AddDynamicProcessCommand extends CaseCommand<Long> {
private long processInstanceId;
private Map<String, Object> parameters;

public AddDynamicProcessCommand(String caseId, Long processInstanceId, String processId, Map<String, Object> parameters) {
private String caseDefinitionId;

public AddDynamicProcessCommand(String caseId, Long processInstanceId, String processId, Map<String, Object> parameters, String caseDefinitionId) {
this.caseId = caseId;
this.processInstanceId = processInstanceId;
this.processId = processId;
this.parameters = parameters;

this.caseDefinitionId = caseDefinitionId;

if (processInstanceId == null || processId == null) {
throw new IllegalArgumentException("Mandatory parameters are missing - process instance id and process id");
}
Expand All @@ -57,6 +62,11 @@ public Long execute(Context context) {
if (processInstance == null) {
throw new ProcessInstanceNotFoundException("No process instance found with id " + processInstanceId);
}
if (parameters == null) {
parameters = new HashMap<>();
}
parameters.put(ENTRY_POINT_VAR_NAME, caseDefinitionId);

CaseEventSupport caseEventSupport = getCaseEventSupport(context);
caseEventSupport.fireBeforeDynamicProcessAdded(caseId, processInstanceId, processId, parameters);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.runtime.Context;

import java.util.HashMap;
import java.util.Map;

/**
Expand All @@ -41,13 +42,17 @@ public class AddDynamicProcessToStageCommand extends CaseCommand<Long> {
private String stageId;
private long processInstanceId;
private Map<String, Object> parameters;

private String caseDefinitionId;

public AddDynamicProcessToStageCommand(String caseId, Long processInstanceId, String stageId, String processId, Map<String, Object> parameters) {
public AddDynamicProcessToStageCommand(String caseId, Long processInstanceId, String stageId, String processId, Map<String, Object> parameters, String caseDefinitionId) {
this.caseId = caseId;
this.processInstanceId = processInstanceId;
this.stageId = stageId;
this.processId = processId;
this.parameters = parameters;

this.caseDefinitionId = caseDefinitionId;

if (processInstanceId == null || processId == null || stageId == null) {
throw new IllegalArgumentException("Mandatory parameters are missing - process instance id / process id / stage id");
Expand All @@ -62,6 +67,10 @@ public Long execute(Context context) {
if (processInstance == null) {
throw new ProcessInstanceNotFoundException("No process instance found with id " + processInstanceId);
}
if (parameters == null) {
parameters = new HashMap<>();
}
parameters.put(ENTRY_POINT_VAR_NAME, caseDefinitionId);

DynamicNodeInstance dynamicContext = (DynamicNodeInstance) ((WorkflowProcessInstanceImpl) processInstance).getNodeInstances(true).stream()
.filter(ni -> (ni instanceof DynamicNodeInstance) && stageId.equals(ni.getNode().getMetaData().get("UniqueId")))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
public abstract class CaseCommand<T> implements ExecutableCommand<T> {

private static final long serialVersionUID = 4116744986913465571L;
protected static final String ENTRY_POINT_VAR_NAME = "_EntryPoint_";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have some doubts about using a variable for storing this, as this will result in an internal implementation detail be very visible in the process instance details.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here but couldn't find anything better

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alternative would be to make metadata persisted (like it is at definition side).


private CaseEventSupport emptyCaseEventSupport = new CaseEventSupport(Collections.emptyList());

Expand Down
Loading