use of org.jbpm.workflow.core.node.DynamicNode in project jbpm by kiegroup.
the class RuleFlowProcessValidatorTest method testDynamicNodeValidationInNotDynamicProcess.
@Test
public void testDynamicNodeValidationInNotDynamicProcess() throws Exception {
RuleFlowProcess process = new RuleFlowProcess();
process.setId("org.drools.core.process");
process.setName("Dynamic Node Process");
process.setPackageName("org.mycomp.myprocess");
process.setDynamic(false);
DynamicNode dynamicNode = new DynamicNode();
dynamicNode.setName("MyDynamicNode");
dynamicNode.setId(1);
dynamicNode.setAutoComplete(false);
// empty completion expression to trigger validation error
dynamicNode.setCompletionExpression("");
process.addNode(dynamicNode);
ProcessValidationError[] errors = validator.validateProcess(process);
assertNotNull(errors);
// in non-dynamic processes all check should be triggered
// they should also include process level checks (start node, end node etc)
assertEquals(6, errors.length);
assertEquals("Process has no start node.", errors[0].getMessage());
assertEquals("Process has no end node.", errors[1].getMessage());
assertEquals("Node 'MyDynamicNode' [1] Dynamic has no incoming connection", errors[2].getMessage());
assertEquals("Node 'MyDynamicNode' [1] Dynamic has no outgoing connection", errors[3].getMessage());
assertEquals("Node 'MyDynamicNode' [1] Dynamic has no completion condition set", errors[4].getMessage());
assertEquals("Node 'MyDynamicNode' [1] Has no connection to the start node.", errors[5].getMessage());
}
use of org.jbpm.workflow.core.node.DynamicNode in project jbpm by kiegroup.
the class RuleFlowProcessValidatorTest method testDynamicNodeValidationInDynamicProcess.
@Test
public void testDynamicNodeValidationInDynamicProcess() throws Exception {
RuleFlowProcess process = new RuleFlowProcess();
process.setId("org.drools.core.process");
process.setName("Dynamic Node Process");
process.setPackageName("org.mycomp.myprocess");
process.setDynamic(true);
DynamicNode dynamicNode = new DynamicNode();
dynamicNode.setName("MyDynamicNode");
dynamicNode.setId(1);
dynamicNode.setAutoComplete(false);
dynamicNode.setCompletionExpression("completion-expression");
process.addNode(dynamicNode);
ProcessValidationError[] errors = validator.validateProcess(process);
assertNotNull(errors);
// if dynamic process no longer triggering incoming / outgoing connection errors for dynamic nodes
assertEquals(0, errors.length);
// empty completion expression to trigger validation error
process.removeNode(dynamicNode);
DynamicNode dynamicNode2 = new DynamicNode();
dynamicNode2.setName("MyDynamicNode");
dynamicNode2.setId(1);
dynamicNode2.setAutoComplete(false);
dynamicNode2.setCompletionExpression("");
process.addNode(dynamicNode2);
ProcessValidationError[] errors2 = validator.validateProcess(process);
assertNotNull(errors2);
// autocomplete set to false and empty completion condition triggers error
assertEquals(1, errors2.length);
assertEquals("Node 'MyDynamicNode' [1] Dynamic has no completion condition set", errors2[0].getMessage());
}
use of org.jbpm.workflow.core.node.DynamicNode in project jbpm by kiegroup.
the class CaseRuntimeDataServiceImpl method collectCaseStages.
private Collection<CaseStage> collectCaseStages(String deploymentId, String processId, NodeContainer process) {
Collection<CaseStage> result = new ArrayList<CaseStage>();
for (Node node : process.getNodes()) {
if (node instanceof DynamicNode) {
DynamicNode dynamicNode = (DynamicNode) node;
Collection<AdHocFragment> adHocFragments = collectAdHocFragments(dynamicNode);
result.add(new CaseStageImpl((String) ((DynamicNode) node).getMetaData("UniqueId"), node.getName(), adHocFragments));
}
}
return result;
}
use of org.jbpm.workflow.core.node.DynamicNode in project jbpm by kiegroup.
the class CaseRuntimeDataServiceImpl method internalGetCaseStages.
/*
* Helper methods to parse process and extract case related information
*/
public List<CaseStageInstance> internalGetCaseStages(CaseDefinition caseDef, String caseId, boolean activeOnly, QueryContext queryContext) {
CorrelationKey correlationKey = correlationKeyFactory.newCorrelationKey(caseId);
Collection<org.jbpm.services.api.model.NodeInstanceDesc> nodes = runtimeDataService.getNodeInstancesByCorrelationKeyNodeType(correlationKey, Arrays.asList(ProcessInstance.STATE_ACTIVE), Arrays.asList("DynamicNode"), queryContext);
Collection<Long> completedNodes = nodes.stream().filter(n -> ((NodeInstanceDesc) n).getType() == 1).map(n -> n.getId()).collect(toList());
Map<String, CaseStage> stagesByName = caseDef.getCaseStages().stream().collect(toMap(CaseStage::getId, c -> c));
Predicate<org.jbpm.services.api.model.NodeInstanceDesc> filterNodes = null;
if (activeOnly) {
filterNodes = n -> ((NodeInstanceDesc) n).getType() == 0 && !completedNodes.contains(((NodeInstanceDesc) n).getId());
} else {
filterNodes = n -> ((NodeInstanceDesc) n).getType() == 0;
}
List<String> triggeredStages = new ArrayList<>();
List<CaseStageInstance> stages = new ArrayList<>();
nodes.stream().filter(filterNodes).map(n -> {
StageStatus status = StageStatus.Active;
if (completedNodes.contains(((NodeInstanceDesc) n).getId())) {
status = StageStatus.Completed;
}
Collection<org.jbpm.services.api.model.NodeInstanceDesc> activeNodes = getActiveNodesForCaseAndStage(caseId, n.getNodeId(), new QueryContext(0, 100));
return new CaseStageInstanceImpl(n.getNodeId(), n.getName(), stagesByName.get(n.getNodeId()).getAdHocFragments(), activeNodes, status);
}).forEach(csi -> {
stages.add(csi);
triggeredStages.add(csi.getName());
});
if (!activeOnly) {
// add other stages that are present in the definition
caseDef.getCaseStages().stream().filter(cs -> !triggeredStages.contains(cs.getName())).map(cs -> new CaseStageInstanceImpl(cs.getId(), cs.getName(), cs.getAdHocFragments(), Collections.emptyList(), StageStatus.Available)).forEach(csi -> stages.add(csi));
}
return stages;
}
use of org.jbpm.workflow.core.node.DynamicNode in project jbpm by kiegroup.
the class AdHocSubProcessHandler method handleNode.
@SuppressWarnings("unchecked")
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);
DynamicNode dynamicNode = (DynamicNode) node;
String cancelRemainingInstances = element.getAttribute("cancelRemainingInstances");
if ("false".equals(cancelRemainingInstances)) {
dynamicNode.setCancelRemainingInstances(false);
}
// by default it should not autocomplete as it's adhoc
dynamicNode.setAutoComplete(false);
dynamicNode.setActivationExpression((String) dynamicNode.getMetaData("customActivationCondition"));
org.w3c.dom.Node xmlNode = element.getFirstChild();
while (xmlNode != null) {
String nodeName = xmlNode.getNodeName();
if ("completionCondition".equals(nodeName)) {
String expression = xmlNode.getTextContent();
if (AUTOCOMPLETE_EXPRESSIONS.contains(expression)) {
dynamicNode.setAutoComplete(true);
} else {
dynamicNode.setCompletionExpression(expression == null ? "" : expression);
}
org.w3c.dom.Node languageNode = xmlNode.getAttributes().getNamedItem("language");
if (languageNode != null) {
String language = languageNode.getNodeValue();
if (XmlBPMNProcessDumper.MVEL_LANGUAGE.equals(language)) {
dynamicNode.setLanguage("mvel");
} else if (XmlBPMNProcessDumper.RULE_LANGUAGE.equals(language)) {
dynamicNode.setLanguage("rule");
} else {
throw new IllegalArgumentException("Unknown language " + language);
}
} else {
dynamicNode.setLanguage("mvel");
}
}
xmlNode = xmlNode.getNextSibling();
}
List<SequenceFlow> connections = (List<SequenceFlow>) dynamicNode.getMetaData(ProcessHandler.CONNECTIONS);
ProcessHandler.linkConnections(dynamicNode, connections);
ProcessHandler.linkBoundaryEvents(dynamicNode);
handleScript(dynamicNode, element, "onEntry");
handleScript(dynamicNode, element, "onExit");
}
Aggregations