in jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/SubProcessNodeInstance.java [74:154]
public void internalTrigger(final KogitoNodeInstance from, String type) {
super.internalTrigger(from, type);
// if node instance was cancelled, abort
if (getNodeInstanceContainer().getNodeInstance(getStringId()) == null) {
return;
}
if (!Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
throw new IllegalArgumentException(
"A SubProcess node only accepts default incoming connections!");
}
Map<String, Object> parameters = NodeIoHelper.processInputs(this, key -> getVariable(key));
String processIdExpression = getSubProcessNode().getProcessId();
if (processIdExpression == null) {
// if process id is not given try with process name
processIdExpression = getSubProcessNode().getProcessName();
}
String processId = resolveExpression(processIdExpression);
KieBase kbase = getProcessInstance().getKnowledgeRuntime().getKieBase();
// start process instance
Process process = kbase.getProcess(processId);
if (process == null) {
// try to find it by name
String latestProcessId = StartProcessHelper.findLatestProcessByName(kbase, processId);
if (latestProcessId != null) {
processId = latestProcessId;
process = kbase.getProcess(processId);
}
}
if (process == null) {
logger.error("Could not find process {}", processId);
logger.error("Aborting process");
getProcessInstance().setState(KogitoProcessInstance.STATE_ABORTED);
throw new RuntimeException("Could not find process " + processId);
} else {
KogitoProcessRuntime kruntime = InternalProcessRuntime.asKogitoProcessRuntime(getProcessInstance().getKnowledgeRuntime());
if (getSubProcessNode().getMetaData("MICollectionInput") != null) {
// remove foreach input variable to avoid problems when running in variable strict mode
parameters.remove(getSubProcessNode().getMetaData("MICollectionInput"));
}
ProcessInstance processInstance = null;
if (getProcessInstance().getCorrelationKey() != null) {
// in case there is correlation key on parent instance pass it along to child so it can be easily correlated
// since correlation key must be unique for active instances it appends processId and timestamp
List<String> businessKeys = new ArrayList<>();
businessKeys.add(getProcessInstance().getCorrelationKey());
businessKeys.add(processId);
businessKeys.add(String.valueOf(System.currentTimeMillis()));
CorrelationKeyFactory correlationKeyFactory = KieInternalServices.Factory.get().newCorrelationKeyFactory();
CorrelationKey subProcessCorrelationKey = correlationKeyFactory.newCorrelationKey(businessKeys);
processInstance = (ProcessInstance) ((CorrelationAwareProcessRuntime) kruntime).createProcessInstance(processId, subProcessCorrelationKey, parameters);
} else {
processInstance = (ProcessInstance) kruntime.createProcessInstance(processId, parameters);
}
this.processInstanceId = processInstance.getStringId();
processInstance.setMetaData("ParentProcessInstanceId", getProcessInstance().getStringId());
processInstance.setMetaData("ParentNodeInstanceId", getUniqueId());
processInstance.setMetaData("ParentNodeId", getSubProcessNode().getUniqueId());
processInstance.setParentProcessInstanceId(getProcessInstance().getStringId());
processInstance.setRootProcessInstanceId(
StringUtils.isEmpty(getProcessInstance().getRootProcessInstanceId()) ? getProcessInstance().getStringId() : getProcessInstance().getRootProcessInstanceId());
processInstance.setRootProcessId(StringUtils.isEmpty(getProcessInstance().getRootProcessId()) ? getProcessInstance().getProcessId() : getProcessInstance().getRootProcessId());
processInstance.setSignalCompletion(getSubProcessNode().isWaitForCompletion());
kruntime.startProcessInstance(processInstance.getStringId());
if (!getSubProcessNode().isWaitForCompletion()) {
triggerCompleted();
} else if (processInstance.getState() == KogitoProcessInstance.STATE_COMPLETED
|| processInstance.getState() == KogitoProcessInstance.STATE_ABORTED) {
processInstanceCompleted(processInstance);
} else {
addProcessListener();
}
}
}