protected Node createNode(Attributes attrs) { DynamicNode result = new DynamicNode(); VariableScope variableScope = new VariableScope(); result.addContext(variableScope); result.setDefaultContext(variableScope); return result; }
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 stageNode = (DynamicNode) node; // by default it should not autocomplete as it's adhoc stageNode.setAutoComplete(false); stageNode.setLanguage("rule"); ProcessBuildData buildData = (ProcessBuildData) parser.getData(); Map<String, PlanItem> planItems = (Map<String, PlanItem>) buildData.getMetaData("PlanItems"); PlanItem stagePlanItem = planItems.get(stageNode.getMetaData("UniqueId")); if (stagePlanItem != null && stagePlanItem.getEntryCriterion() != null) { if ("autostart".equalsIgnoreCase(stagePlanItem.getEntryCriterion().getExpression())) { stageNode.setMetaData("customAutoStart", "true"); } else { stageNode.setActivationExpression(stagePlanItem.getEntryCriterion().getExpression()); } } if (stagePlanItem != null && stagePlanItem.getExitCriterion() != null) { if (AUTOCOMPLETE_EXPRESSIONS.contains(stagePlanItem.getExitCriterion().getExpression())) { stageNode.setAutoComplete(true); } else { stageNode.setCompletionExpression(stagePlanItem.getExitCriterion().getExpression()); } } }
private String createAdHocCompletionRule(Process process, DynamicNode dynamicNode) { return "rule \"RuleFlow-AdHocComplete-" + process.getId() + "-" + dynamicNode.getUniqueId() + "\" @Propagation(EAGER) \n" + " ruleflow-group \"DROOLS_SYSTEM\" \n" + " when \n" + " " + dynamicNode.getCompletionExpression() + "\n" + " then \n" + "end \n\n"; }
private String createAdHocActivationRule(Process process, DynamicNode dynamicNode) { return "rule \"RuleFlow-AdHocActivate-" + process.getId() + "-" + dynamicNode.getUniqueId() + "\" @Propagation(EAGER) \n" + " ruleflow-group \"DROOLS_SYSTEM\" \n" + " when \n" + " " + dynamicNode.getActivationExpression() + "\n" + " then \n" + "end \n\n"; }
process.setDynamic(true); DynamicNode dynamicNode = new DynamicNode(); dynamicNode.setName("MyDynamicNode"); dynamicNode.setId(1); dynamicNode.setAutoComplete(false); dynamicNode.setCompletionExpression("completion-expression"); process.addNode(dynamicNode); DynamicNode dynamicNode2 = new DynamicNode(); dynamicNode2.setName("MyDynamicNode"); dynamicNode2.setId(1); dynamicNode2.setAutoComplete(false); dynamicNode2.setCompletionExpression(""); process.addNode(dynamicNode2);
String cancelRemainingInstances = element.getAttribute("cancelRemainingInstances"); if ("false".equals(cancelRemainingInstances)) { dynamicNode.setCancelRemainingInstances(false); dynamicNode.setAutoComplete(false); dynamicNode.setActivationExpression((String)dynamicNode.getMetaData("customActivationCondition")); String expression = xmlNode.getTextContent(); if(AUTOCOMPLETE_EXPRESSIONS.contains(expression)) { dynamicNode.setAutoComplete(true); } else { dynamicNode.setCompletionExpression(expression == null?"":expression); 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); dynamicNode.setLanguage("mvel"); dynamicNode.getMetaData(ProcessHandler.CONNECTIONS); ProcessHandler.linkConnections(dynamicNode, connections); ProcessHandler.linkBoundaryEvents(dynamicNode);
assertThat(stage.getName()).isEqualTo("First stage"); assertThat(stage.getActivationExpression()).isEqualTo("org.kie.api.runtime.process.CaseData(data.get(\"ordered\") !=null)"); assertThat(stage.getCompletionExpression()).isEqualTo("org.kie.api.runtime.process.CaseData(data.get(\"shipped\") !=null)"); Node[] stageNodes = stage.getNodes(); assertThat(stageNodes).hasSize(1);
final DynamicNode dynamicNode = (DynamicNode) node; if (dynamicNode.getDefaultIncomingConnections().size() == 0 && !acceptsNoIncomingConnections(dynamicNode)) { addErrorMessage(process, node, if (dynamicNode.getDefaultOutgoingConnections().size() == 0 && !acceptsNoOutgoingConnections(dynamicNode)) { addErrorMessage(process, node, if ("".equals(dynamicNode.getCompletionExpression()) && !dynamicNode.isAutoComplete()) { addErrorMessage(process, node, "Dynamic has no completion condition set"); validateNodes(dynamicNode.getNodes(), errors, process);
public DynamicNodeFactory(RuleFlowNodeContainerFactory nodeContainerFactory, NodeContainer nodeContainer, long id) { this.nodeContainerFactory = nodeContainerFactory; this.nodeContainer = nodeContainer; DynamicNode compositeNode = new DynamicNode(); compositeNode.setId(id); setNodeContainer(compositeNode); }
protected Node createNode() { return new DynamicNode(); }
public void nodeInstanceCompleted(org.jbpm.workflow.instance.NodeInstance nodeInstance, String outType) { Node nodeInstanceNode = nodeInstance.getNode(); if( nodeInstanceNode != null ) { Object compensationBoolObj = nodeInstanceNode.getMetaData().get("isForCompensation"); boolean isForCompensation = compensationBoolObj == null ? false : ((Boolean) compensationBoolObj); if( isForCompensation ) { return; } } String completionCondition = getDynamicNode().getCompletionExpression(); // TODO what if we reach the end of one branch but others might still need to be created ? // TODO are we sure there will always be node instances left if we are not done yet? if (isTerminated(nodeInstance)) { triggerCompleted(NodeImpl.CONNECTION_DEFAULT_TYPE); } else if (getDynamicNode().isAutoComplete() && getNodeInstances(false).isEmpty()) { triggerCompleted(NodeImpl.CONNECTION_DEFAULT_TYPE); } else if (completionCondition != null && "mvel".equals(getDynamicNode().getLanguage())) { Object value = MVELSafeHelper.getEvaluator().eval(completionCondition, new NodeInstanceResolverFactory(this)); if ( !(value instanceof Boolean) ) { throw new RuntimeException( "Completion condition expression must return boolean values: " + value + " for expression " + completionCondition); } if (((Boolean) value).booleanValue()) { triggerCompleted(NodeImpl.CONNECTION_DEFAULT_TYPE); } } }
if ( nodes[i] instanceof DynamicNode) { DynamicNode dynamicNode = (DynamicNode) nodes[i]; if (dynamicNode.getCompletionExpression() != null && "rule".equals(((DynamicNode) nodes[i]).getLanguage())) { builder.append( createAdHocCompletionRule( process, dynamicNode ) ); if (dynamicNode.getActivationExpression() != null && !dynamicNode.getActivationExpression().isEmpty()) { builder.append( createAdHocActivationRule( process, dynamicNode ) );
assertThat(stage.getName()).isEqualTo("First stage"); assertThat(stage.getActivationExpression()).isNull(); assertThat(stage.getCompletionExpression()).isNull();
@Override public boolean acceptsEvent(String type, Object event, Function<String, String> resolver) { if (type.equals(getActivationEventName())) { return true; } for (Node node : getNodes()) { if (resolver.apply(node.getName()).contains(type) && node.getIncomingConnections().isEmpty()) { return true; } } return super.acceptsEvent(type, event); }
public DynamicNodeFactory autoComplete(boolean autoComplete) { getDynamicNode().setAutoComplete(autoComplete); return this; }
public List<Node> getAutoStartNodes() { List<Node> nodes = Arrays.stream(getNodes()) .filter(n -> n.getIncomingConnections().isEmpty() && "true".equalsIgnoreCase((String)n.getMetaData().get("customAutoStart"))) .collect(Collectors.toList()); return nodes; }
process.setDynamic(false); DynamicNode dynamicNode = new DynamicNode(); dynamicNode.setName("MyDynamicNode"); dynamicNode.setId(1); dynamicNode.setAutoComplete(false); dynamicNode.setCompletionExpression(""); process.addNode(dynamicNode);
String cancelRemainingInstances = element.getAttribute("cancelRemainingInstances"); if ("false".equals(cancelRemainingInstances)) { dynamicNode.setCancelRemainingInstances(false); dynamicNode.setAutoComplete(false); dynamicNode.setActivationExpression((String)dynamicNode.getMetaData("customActivationCondition")); String expression = xmlNode.getTextContent(); if(AUTOCOMPLETE_EXPRESSIONS.contains(expression)) { dynamicNode.setAutoComplete(true); } else { dynamicNode.setCompletionExpression(expression == null?"":expression); 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); dynamicNode.setLanguage("mvel"); dynamicNode.getMetaData(ProcessHandler.CONNECTIONS); ProcessHandler.linkConnections(dynamicNode, connections); ProcessHandler.linkBoundaryEvents(dynamicNode);
assertThat(stage.getName()).isEqualTo("First stage"); assertThat(stage.getActivationExpression()).isEqualTo("org.kie.api.runtime.process.CaseData(data.get(\"ordered\") !=null)"); assertThat(stage.getCompletionExpression()).isEqualTo("org.kie.api.runtime.process.CaseData(data.get(\"shipped\") !=null)"); Node[] stageNodes = stage.getNodes(); assertThat(stageNodes).hasSize(1);
final DynamicNode dynamicNode = (DynamicNode) node; if (dynamicNode.getDefaultIncomingConnections().size() == 0 && !acceptsNoIncomingConnections(dynamicNode)) { addErrorMessage(process, node, if (dynamicNode.getDefaultOutgoingConnections().size() == 0 && !acceptsNoOutgoingConnections(dynamicNode)) { addErrorMessage(process, node, if ("".equals(dynamicNode.getCompletionExpression()) && !dynamicNode.isAutoComplete()) { addErrorMessage(process, node, "Dynamic has no completion condition set"); validateNodes(dynamicNode.getNodes(), errors, process);