public static RuleFlowProcess newProcessWithOneSubProcess(String processId, String subProcessId) { RuleFlowProcess process = new RuleFlowProcess(); process.setId(processId); StartNode startNode = new StartNode(); startNode.setName( "Start" ); startNode.setId(1); SubProcessNode subProcessNode = new SubProcessNode(); subProcessNode.setId(2); subProcessNode.setProcessId(subProcessId); subProcessNode.setName("subProcess"); EndNode endNode = new EndNode(); endNode.setName("EndNode"); endNode.setId(4); connect( startNode, subProcessNode ); connect( subProcessNode, endNode ); process.addNode( startNode ); process.addNode( subProcessNode ); process.addNode( endNode ); return process; }
@Test public void testLoadProcessTaskReferenceCase() throws Exception { KieBase kbase = createKnowledgeBase("CMMN-ProcessTaskReferenceCase.cmmn"); assertThat(kbase).isNotNull(); Process process = kbase.getProcess("Case_636d4bea-4d52-46fb-b1ad-9ceeddf1be69"); assertThat(process).isNotNull(); assertThat(process).isInstanceOf(RuleFlowProcess.class); RuleFlowProcess caseProcess = (RuleFlowProcess) process; assertThat(caseProcess.isDynamic()).isTrue(); assertThat(caseProcess.getId()).isEqualTo("Case_636d4bea-4d52-46fb-b1ad-9ceeddf1be69"); assertThat(caseProcess.getName()).isEqualTo("ProcessTaskCase"); Node[] nodes = caseProcess.getNodes(); assertThat(nodes).hasSize(1); SubProcessNode processNode = (SubProcessNode) nodes[0]; assertThat(processNode.getName()).isEqualTo("call my process"); assertThat(processNode.getProcessId()).isEqualTo("_4e0c5178-c886-4a14-ab6b-6ec6c940194b"); assertThat(processNode.isWaitForCompletion()).isTrue(); assertThat(processNode.isIndependent()).isFalse(); assertThat(processNode.getInAssociations()).hasSize(0); assertThat(processNode.getOutAssociations()).hasSize(0); }
protected void handleNode(final Node node, final Element element, final String uri, final String localName, final ExtensibleXmlParser parser) throws SAXException { super.handleNode(node, element, uri, localName, parser); SubProcessNode subProcessNode = (SubProcessNode) node; String processId = element.getAttribute("processRef"); String isBlocking = element.getAttribute("isBlocking"); if (isBlocking == null || isBlocking.isEmpty()) { isBlocking = "true"; } subProcessNode.setProcessId(processId); subProcessNode.setWaitForCompletion(Boolean.parseBoolean(isBlocking)); subProcessNode.setIndependent(false); Map<String, String> inputs = new HashMap<>(); Map<String, String> outputs = new HashMap<>(); Map<String, String> inputTypes = new HashMap<>(); Map<String, String> outputTypes = new HashMap<>(); loadDataInputsAndOutputs(element, inputs, outputs, inputTypes, outputTypes, parser); subProcessNode.setMetaData("DataInputs", inputTypes); subProcessNode.setMetaData("DataOutputs", outputTypes); subProcessNode.setMetaData("customAbortParent", "false"); for (Entry<String, String> entry : inputs.entrySet()) { subProcessNode.addInAssociation(new DataAssociation(entry.getValue(), entry.getKey(), Collections.emptyList(), null)); } for (Entry<String, String> entry : outputs.entrySet()) { subProcessNode.addOutAssociation(new DataAssociation(entry.getKey(), entry.getValue(), Collections.emptyList(), null)); } }
public void handleNode(final Node node, final Element element, final String uri, final String localName, final ExtensibleXmlParser parser) throws SAXException { super.handleNode(node, element, uri, localName, parser); SubProcessNode subProcessNode = (SubProcessNode) node; String processId = element.getAttribute("processId"); if (processId != null && processId.length() > 0) { subProcessNode.setProcessId(processId); } String waitForCompletion = element.getAttribute("waitForCompletion"); subProcessNode.setWaitForCompletion(!"false".equals(waitForCompletion)); String independent = element.getAttribute("independent"); subProcessNode.setIndependent(!"false".equals(independent)); for (String eventType: subProcessNode.getActionTypes()) { handleAction(subProcessNode, element, eventType); } }
public void writeNode(Node node, StringBuilder xmlDump, int metaDataType) { SubProcessNode subProcessNode = (SubProcessNode) node; writeNode("callActivity", subProcessNode, xmlDump, metaDataType); if (subProcessNode.getProcessId() != null) { xmlDump.append("calledElement=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(subProcessNode.getProcessId()) + "\" "); } if (!subProcessNode.isWaitForCompletion()) { xmlDump.append("tns:waitForCompletion=\"false\" "); } if (!subProcessNode.isIndependent()) { xmlDump.append("tns:independent=\"false\" "); } xmlDump.append(">" + EOL); writeExtensionElements(subProcessNode, xmlDump); writeIO(subProcessNode, xmlDump); endNode("callActivity", xmlDump); }
StartNode start = new StartNode(); start.setId( 1 ); start.setName( "Start" ); process.addNode( start ); actionNode.setName( "Action" ); Node.CONNECTION_DEFAULT_TYPE ); SubProcessNode subProcessNode = new SubProcessNode(); subProcessNode.setId( 3 ); subProcessNode.setName( "SubProcess" ); subProcessNode.setProcessId( "org.drools.test.SubProcess" ); process.addNode( subProcessNode ); Node.CONNECTION_DEFAULT_TYPE ); EndNode end = new EndNode(); end.setId( 4 ); end.setName( "End" ); process.addNode( end ); Node.CONNECTION_DEFAULT_TYPE ); WorkItemNode workItemNode = new WorkItemNode(); workItemNode.setId( 3 ); workItemNode.setName( "WorkItem1" );
process.setMetaData("routerLayout", 1); process.setGlobals(globals); DroolsConsequenceAction action = new DroolsConsequenceAction("dialect", "consequence"); SubProcessNode subProcess = new SubProcessNode(); subProcess.setName("subProcess"); subProcess.setMetaData("x", 1); subProcess.setMetaData("y", 2); subProcess.setMetaData("width", 3); subProcess.setMetaData("height", 4); subProcess.setProcessId("processId"); subProcess.setWaitForCompletion(false); subProcess.setIndependent(false); subProcess.addInMapping("subvar1", "var1"); subProcess.addOutMapping("subvar2", "var2"); timer = new Timer(); timer.setDelay("100"); subProcess.addTimer(timer, action); timer = new Timer(); timer.setDelay("200"); subProcess.addTimer(timer, action); subProcess.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions); subProcess.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions);
assertThat(process).isInstanceOf(RuleFlowProcess.class); RuleFlowProcess caseProcess = (RuleFlowProcess) process; assertThat(caseProcess.isDynamic()).isTrue(); assertThat(caseProcess.getId()).isEqualTo("Case_517ac74c-fba4-4728-bcaf-e9853c864710"); assertThat(caseProcess.getName()).isEqualTo("First case"); List<Variable> variables = caseProcess.getVariableScope().getVariables(); assertThat(processNode.getName()).isEqualTo("Call subprocess"); assertThat(processNode.getProcessId()).isEqualTo("subprocessId"); assertThat(processNode.isWaitForCompletion()).isTrue(); assertThat(processNode.isIndependent()).isFalse(); assertThat(processNode.getInAssociations()).hasSize(1); assertThat(processNode.getInAssociations().get(0).getSources()).hasSize(1); assertThat(processNode.getInAssociations().get(0).getSources().get(0)).isEqualTo("caseFile_invoice"); assertThat(processNode.getInAssociations().get(0).getTarget()).isEqualTo("invoiceDoc"); assertThat(processNode.getOutAssociations()).hasSize(1); assertThat(processNode.getOutAssociations().get(0).getSources()).hasSize(1); assertThat(processNode.getOutAssociations().get(0).getSources().get(0)).isEqualTo("approved"); assertThat(processNode.getOutAssociations().get(0).getTarget()).isEqualTo("caseFile_invoice"); assertThat(caseTask.getName()).isEqualTo("Start another case"); assertThat(caseTask.getWork().getName()).isEqualTo("StartCaseInstance"); assertThat(caseTask.getWork().getParameter("CaseDefinitionId")).isEqualTo("caseDefId"); assertThat(caseTask.getInAssociations()).hasSize(1);
"Start has no outgoing connection."); if (subProcess.getFrom() == null && !acceptsNoIncomingConnections(node)) { addErrorMessage(process, node, "SubProcess has no incoming connection."); if (subProcess.getTo() == null && !acceptsNoOutgoingConnections(node)) { Object compensationObj = subProcess.getMetaData(isForCompensation); if (compensationObj == null || !((Boolean) compensationObj)) { addErrorMessage(process, if (subProcess.getProcessId() == null && subProcess.getProcessName() == null) { addErrorMessage(process, node, "SubProcess has no process id."); if (subProcess.getTimers() != null) { for (Timer timer : subProcess.getTimers().keySet()) { validateTimer(timer, node, if (!subProcess.isIndependent() && !subProcess.isWaitForCompletion()) { addErrorMessage(process, node,
process.addNode(new StartNode()); process.addNode(new EndNode()); process.addNode(new ActionNode()); process.addNode(new Split()); process.addNode(new Join()); process.addNode(new MilestoneNode()); process.addNode(new RuleSetNode()); process.addNode(new SubProcessNode()); process.addNode(new WorkItemNode()); process.addNode(new TimerNode()); process.addNode(new HumanTaskNode());
public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) { SubProcessNode subProcessNode = (SubProcessNode) node; writeNode("subProcess", subProcessNode, xmlDump, includeMeta); String processId = subProcessNode.getProcessId(); if (processId != null) { xmlDump.append("processId=\"" + processId + "\" "); if (!subProcessNode.isWaitForCompletion()) { xmlDump.append("waitForCompletion=\"false\" "); if (!subProcessNode.isIndependent()) { xmlDump.append("independent=\"false\" "); writeMetaData(subProcessNode, xmlDump); Map<String, String> inMappings = subProcessNode.getInMappings(); for (Map.Entry<String, String> inMapping: inMappings.entrySet()) { xmlDump.append( Map<String, String> outMappings = subProcessNode.getOutMappings(); for (Map.Entry<String, String> outMapping: outMappings.entrySet()) { xmlDump.append( for (String eventType: subProcessNode.getActionTypes()) { writeActions(eventType, subProcessNode.getActions(eventType), xmlDump); writeTimers(subProcessNode.getTimers(), xmlDump); endNode("subProcess", xmlDump);
if (endNode.isTerminate()) { cases.put(name, testCode); return true; WorkItemNode taskNode = (WorkItemNode) currentNode; testCode += " // if necessary, complete request for service task \"" + taskNode.getWork().getName() + "\"\n"; return processNodes(name, ((NodeImpl) currentNode).getTo().getTo(), testCode, cases, ongoingCases); } else if (currentNode instanceof EventNode) { if (node instanceof StartNode) { StartNode startNode = (StartNode) node; if (startNode.getTriggers() == null || startNode.getTriggers().isEmpty()) { done = processNodes(name, startNode.getTo().getTo(), testCode, cases, ongoingCases); break; } else if (currentNode instanceof SubProcessNode) { SubProcessNode subProcessNode = (SubProcessNode) currentNode; if (subProcessNode.isWaitForCompletion()) { testCode += " // invoking subprocess " + subProcessNode.getProcessId() + ", if necessary make sure it is completed\n";
String processId = element.getAttribute("calledElement"); if (processId != null && processId.length() > 0) { subProcessNode.setProcessId(processId); } else { String processName = element.getAttribute("calledElementByName"); subProcessNode.setProcessName(processName); subProcessNode.setWaitForCompletion(false); subProcessNode.setIndependent(false); subProcessNode.setMetaData("DataInputs", dataInputs); subProcessNode.setMetaData("DataOutputs", dataOutputs);
for (Iterator<DataAssociation> iterator = getSubProcessNode().getInAssociations().iterator(); iterator.hasNext(); ) { DataAssociation mapping = iterator.next(); Object parameterValue = null; } else { logger.error("Could not find variable scope for variable {}", mapping.getSources().get(0)); logger.error("when trying to execute SubProcess node {}", getSubProcessNode().getName()); logger.error("Continuing without setting parameter."); String processId = getSubProcessNode().getProcessId(); if (processId == null) { processId = getSubProcessNode().getProcessName(); if (getSubProcessNode().getMetaData("MICollectionInput") != null) { parameters.remove(getSubProcessNode().getMetaData("MICollectionInput")); ((ProcessInstanceImpl) processInstance).setMetaData("ParentProcessInstanceId", getProcessInstance().getId()); ((ProcessInstanceImpl) processInstance).setMetaData("ParentNodeInstanceId", getUniqueId()); ((ProcessInstanceImpl) processInstance).setMetaData("ParentNodeId", getSubProcessNode().getUniqueId()); ((ProcessInstanceImpl) processInstance).setParentProcessInstanceId(getProcessInstance().getId()); ((ProcessInstanceImpl) processInstance).setSignalCompletion(getSubProcessNode().isWaitForCompletion()); if (!getSubProcessNode().isWaitForCompletion()) { triggerCompleted(); } else if (processInstance.getState() == ProcessInstance.STATE_COMPLETED
protected Node createNode(Attributes attrs) { return new SubProcessNode(); }
private void postProcessNodes(RuleFlowProcess process, NodeContainer container, ProcessBuildData buildData, ExtensibleXmlParser parser) { for (Node node : container.getNodes()) { if (node instanceof SubProcessNode) { Map<String, String> processes = (Map<String, String>) buildData.getMetaData("ProcessElements"); if (processes != null) { SubProcessNode subprocessNode = (SubProcessNode) node; subprocessNode.setProcessId(processes.getOrDefault(subprocessNode.getProcessId(), subprocessNode.getProcessId())); } } else if (node instanceof RuleSetNode) { Map<String, Decision> decisions = (Map<String, Decision>) buildData.getMetaData("DecisionElements"); RuleSetNode ruleSetNode = (RuleSetNode) node; if (decisions != null && decisions.containsKey(ruleSetNode.getRuleFlowGroup())) { Decision decision = decisions.get(ruleSetNode.getRuleFlowGroup()); ruleSetNode.setRuleFlowGroup(null); ruleSetNode.setLanguage(RuleSetNode.DMN_LANG); ruleSetNode.setNamespace((String) parser.getNamespaceURI(decision.getNamespace())); ruleSetNode.setModel(decision.getModel()); ruleSetNode.setDecision(decision.getDecision()); } } if (node instanceof NodeContainer) { postProcessNodes(process, (NodeContainer) node, buildData, parser); } } }
@Override public void onNodeAdded(Node node) { if (node instanceof RuleSetNode) { RuleSetNode ruleSetNode = (RuleSetNode) node; String ruleFlowGroup = ruleSetNode.getRuleFlowGroup(); if (ruleFlowGroup != null) { addSharedReference(ruleFlowGroup, PartType.RULEFLOW_GROUP); } } else if (node instanceof WorkItemNode) { String taskName = ((WorkItemNode) node).getWork().getName(); addSharedReference(taskName, PartType.TASK_NAME); } else if (node instanceof SubProcessNode) { SubProcessNode subProcess = (SubProcessNode) node; String processName = subProcess.getProcessName(); if (!StringUtils.isEmpty(processName)) { addResourceReference(processName, getProcessNameResourceType()); } String processId = subProcess.getProcessId(); if (!StringUtils.isEmpty(processId)) { addResourceReference(processId, getProcessIdResourceType()); } } }
public SubProcessNodeFactory processId(final String processId) { getSubProcessNode().setProcessId(processId); return this; }
@Override protected void handleNode(Node node, Element element, String uri, String localName, ExtensibleXmlParser parser) throws SAXException { super.handleNode(node, element, uri, localName, parser); String mainProcessId = repositoryHelper.getProcess().getId(); SubProcessNode subProcess = (SubProcessNode) node; repository.getProcessDesc(mainProcessId).getReusableSubProcesses().add(subProcess.getProcessId()); }
public SubProcessNodeFactory waitForCompletion(boolean waitForCompletion) { getSubProcessNode().setWaitForCompletion(waitForCompletion); return this; }