use of org.jbpm.workflow.core.node.RuleSetNode in project jbpm by kiegroup.
the class RuleSetNodeInstance method processOutputs.
private void processOutputs(Map<String, Object> objects) {
RuleSetNode ruleSetNode = getRuleSetNode();
if (ruleSetNode != null) {
for (Iterator<DataAssociation> iterator = ruleSetNode.getOutAssociations().iterator(); iterator.hasNext(); ) {
DataAssociation association = iterator.next();
if (association.getTransformation() != null) {
Transformation transformation = association.getTransformation();
DataTransformer transformer = DataTransformerRegistry.get().find(transformation.getLanguage());
if (transformer != null) {
Object parameterValue = transformer.transform(transformation.getCompiledExpression(), objects);
VariableScopeInstance variableScopeInstance = (VariableScopeInstance) resolveContextInstance(VariableScope.VARIABLE_SCOPE, association.getTarget());
if (variableScopeInstance != null && parameterValue != null) {
variableScopeInstance.setVariable(association.getTarget(), parameterValue);
} else {
logger.warn("Could not find variable scope for variable {}", association.getTarget());
logger.warn("Continuing without setting variable.");
}
if (parameterValue != null) {
variableScopeInstance.setVariable(association.getTarget(), parameterValue);
}
}
} else if (association.getAssignments() == null || association.getAssignments().isEmpty()) {
VariableScopeInstance variableScopeInstance = (VariableScopeInstance) resolveContextInstance(VariableScope.VARIABLE_SCOPE, association.getTarget());
if (variableScopeInstance != null) {
Object value = objects.get(association.getSources().get(0));
if (value == null) {
try {
value = MVELSafeHelper.getEvaluator().eval(association.getSources().get(0), new MapVariableResolverFactory(objects));
} catch (Throwable t) {
// do nothing
}
}
Variable varDef = variableScopeInstance.getVariableScope().findVariable(association.getTarget());
DataType dataType = varDef.getType();
// exclude java.lang.Object as it is considered unknown type
if (!dataType.getStringType().endsWith("java.lang.Object") && value instanceof String) {
value = dataType.readValue((String) value);
}
variableScopeInstance.setVariable(association.getTarget(), value);
} else {
logger.warn("Could not find variable scope for variable {}", association.getTarget());
}
}
}
}
}
use of org.jbpm.workflow.core.node.RuleSetNode in project jbpm by kiegroup.
the class XMLPersistenceTest method testPersistenceOfFullNodes.
@Test
public void testPersistenceOfFullNodes() throws Exception {
RuleFlowProcess process = new RuleFlowProcess() {
private static final long serialVersionUID = 510l;
int id = 0;
public void addNode(org.kie.api.definition.process.Node node) {
((Node) node).setId(++id);
super.addNode(node);
}
};
process.setMetaData("routerLayout", 1);
Set<String> imports = new HashSet<String>();
imports.add("import1");
imports.add("import2");
process.setImports(imports);
Map<String, String> globals = new HashMap<String, String>();
globals.put("name1", "type1");
globals.put("name2", "type2");
process.setGlobals(globals);
List<Variable> variables = new ArrayList<Variable>();
Variable variable = new Variable();
variable.setName("variable1");
variable.setType(new StringDataType());
variable.setValue("value");
variables.add(variable);
variable = new Variable();
variable.setName("variable2");
variable.setType(new IntegerDataType());
variable.setValue(2);
variables.add(variable);
variable = new Variable();
variable.setName("variable3");
variable.setType(new ObjectDataType("org.jbpm.integrationtests.test.Person"));
Person person = new Person();
person.setName("John");
variable.setValue(person);
variables.add(variable);
variable = new Variable();
variable.setName("variable4");
ListDataType listDataType = new ListDataType();
listDataType.setType(new ObjectDataType("java.lang.Integer"));
variable.setType(listDataType);
List<Integer> list = new ArrayList<Integer>();
list.add(10);
list.add(20);
variable.setValue(list);
variables.add(variable);
process.getVariableScope().setVariables(variables);
Swimlane swimlane = new Swimlane();
swimlane.setName("actor1");
process.getSwimlaneContext().addSwimlane(swimlane);
swimlane = new Swimlane();
swimlane.setName("actor2");
process.getSwimlaneContext().addSwimlane(swimlane);
ActionExceptionHandler exceptionHandler = new ActionExceptionHandler();
exceptionHandler.setFaultVariable("faultVariable");
DroolsConsequenceAction action = new DroolsConsequenceAction("dialect", "consequence");
exceptionHandler.setAction(action);
process.getExceptionScope().setExceptionHandler("myFault", exceptionHandler);
exceptionHandler = new ActionExceptionHandler();
exceptionHandler.setFaultVariable("faultVariable2");
action = new DroolsConsequenceAction("dialect2", "consequence2");
exceptionHandler.setAction(action);
process.getExceptionScope().setExceptionHandler("myFault2", exceptionHandler);
StartNode startNode = new StartNode();
startNode.setName("start");
startNode.setMetaData("x", 1);
startNode.setMetaData("y", 2);
startNode.setMetaData("width", 3);
startNode.setMetaData("height", 4);
startNode.setMetaData("meta1", "someValue");
startNode.setMetaData("meta2", "someOtherValue");
ConstraintTrigger constraintTrigger = new ConstraintTrigger();
constraintTrigger.setConstraint("constraint");
Map<String, String> inMapping = new HashMap<String, String>();
inMapping.put("key", "value");
inMapping.put("key2", "value2");
constraintTrigger.setInMappings(inMapping);
startNode.addTrigger(constraintTrigger);
EventTrigger eventTrigger = new EventTrigger();
EventTypeFilter eventTypeFilter = new EventTypeFilter();
eventTypeFilter.setType("eventType");
eventTrigger.addEventFilter(eventTypeFilter);
inMapping = new HashMap<String, String>();
inMapping.put("key", "value");
inMapping.put("key2", "value2");
eventTrigger.setInMappings(inMapping);
startNode.addTrigger(eventTrigger);
process.addNode(startNode);
ActionNode actionNode = new ActionNode();
actionNode.setName("action");
actionNode.setMetaData("x", 1);
actionNode.setMetaData("y", 2);
actionNode.setMetaData("width", 3);
actionNode.setMetaData("height", 4);
action = new DroolsConsequenceAction("dialect", "consequence");
actionNode.setAction(action);
process.addNode(actionNode);
RuleSetNode ruleSetNode = new RuleSetNode();
ruleSetNode.setName("action");
ruleSetNode.setMetaData("x", 1);
ruleSetNode.setMetaData("y", 2);
ruleSetNode.setMetaData("width", 3);
ruleSetNode.setMetaData("height", 4);
ruleSetNode.setRuleFlowGroup("ruleFlowGroup");
Timer timer = new Timer();
timer.setDelay("100");
timer.setPeriod("100");
action = new DroolsConsequenceAction("dialect", "consequence");
ruleSetNode.addTimer(timer, action);
timer = new Timer();
timer.setDelay("200");
timer.setPeriod("200");
action = new DroolsConsequenceAction("dialect", "consequence");
ruleSetNode.addTimer(timer, action);
process.addNode(ruleSetNode);
FaultNode faultNode = new FaultNode();
faultNode.setName("action");
faultNode.setMetaData("x", 1);
faultNode.setMetaData("y", 2);
faultNode.setMetaData("width", 3);
faultNode.setMetaData("height", 4);
faultNode.setFaultName("faultName");
faultNode.setFaultVariable("faultVariable");
process.addNode(faultNode);
Split split = new Split();
split.setName("split");
split.setMetaData("x", 1);
split.setMetaData("y", 2);
split.setMetaData("width", 3);
split.setMetaData("height", 4);
split.setType(Split.TYPE_XOR);
Connection connection = new ConnectionImpl(split, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
Constraint constraint = new ConstraintImpl();
constraint.setName("constraint1 ><&&");
constraint.setPriority(1);
constraint.setDialect("dialect1");
constraint.setType("type1");
constraint.setConstraint("constraint-text1");
split.setConstraint(connection, constraint);
connection = new ConnectionImpl(split, Node.CONNECTION_DEFAULT_TYPE, ruleSetNode, Node.CONNECTION_DEFAULT_TYPE);
constraint = new ConstraintImpl();
constraint.setName("constraint2");
constraint.setPriority(2);
constraint.setDialect("dialect2");
constraint.setType("type2");
constraint.setConstraint("constraint-text2");
split.setConstraint(connection, constraint);
process.addNode(split);
new ConnectionImpl(startNode, Node.CONNECTION_DEFAULT_TYPE, split, Node.CONNECTION_DEFAULT_TYPE);
EventNode eventNode = new EventNode();
eventNode.setName("action");
eventNode.setMetaData("x", 1);
eventNode.setMetaData("y", 2);
eventNode.setMetaData("width", 3);
eventNode.setMetaData("height", 4);
eventNode.setVariableName("eventVariable");
EventTypeFilter eventFilter = new EventTypeFilter();
eventFilter.setType("eventType");
eventNode.addEventFilter(eventFilter);
process.addNode(eventNode);
Join join = new Join();
join.setName("join");
join.setMetaData("x", 1);
join.setMetaData("y", 2);
join.setMetaData("width", 3);
join.setMetaData("height", 4);
join.setType(Join.TYPE_N_OF_M);
join.setN("#{var1}");
process.addNode(join);
new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE);
new ConnectionImpl(ruleSetNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE);
new ConnectionImpl(eventNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE);
MilestoneNode milestone = new MilestoneNode();
milestone.setName("milestone");
milestone.setMetaData("x", 1);
milestone.setMetaData("y", 2);
milestone.setMetaData("width", 3);
milestone.setMetaData("height", 4);
milestone.setConstraint("constraint");
timer = new Timer();
timer.setDelay("100");
timer.setPeriod("100");
action = new DroolsConsequenceAction("dialect", "consequence");
milestone.addTimer(timer, action);
timer = new Timer();
timer.setDelay("200");
timer.setPeriod("200");
action = new DroolsConsequenceAction("dialect", "consequence");
milestone.addTimer(timer, action);
List<DroolsAction> actions = new ArrayList<DroolsAction>();
DroolsAction action1 = new DroolsConsequenceAction("java", "System.out.println(\"action1\");");
actions.add(action1);
DroolsAction action2 = new DroolsConsequenceAction("java", "System.out.println(\"action2\");");
actions.add(action2);
milestone.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions);
milestone.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions);
process.addNode(milestone);
connection = new ConnectionImpl(join, Node.CONNECTION_DEFAULT_TYPE, milestone, Node.CONNECTION_DEFAULT_TYPE);
connection.setMetaData("bendpoints", "[10,10;20,20]");
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");
timer.setPeriod("100");
action = new DroolsConsequenceAction("dialect", "consequence");
subProcess.addTimer(timer, action);
timer = new Timer();
timer.setDelay("200");
timer.setPeriod("200");
action = new DroolsConsequenceAction("dialect", "consequence");
subProcess.addTimer(timer, action);
subProcess.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions);
subProcess.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions);
process.addNode(subProcess);
connection = new ConnectionImpl(milestone, Node.CONNECTION_DEFAULT_TYPE, subProcess, Node.CONNECTION_DEFAULT_TYPE);
connection.setMetaData("bendpoints", "[10,10]");
WorkItemNode workItemNode = new WorkItemNode();
workItemNode.setName("WorkItem");
Work work = new WorkImpl();
work.setName("workname");
Set<ParameterDefinition> parameterDefinitions = new HashSet<ParameterDefinition>();
ParameterDefinition parameterDefinition = new ParameterDefinitionImpl("param1", new StringDataType());
parameterDefinitions.add(parameterDefinition);
parameterDefinition = new ParameterDefinitionImpl("param2", new IntegerDataType());
parameterDefinitions.add(parameterDefinition);
work.setParameterDefinitions(parameterDefinitions);
work.setParameter("param1", "value1");
work.setParameter("param2", 1);
workItemNode.setWork(work);
workItemNode.setWaitForCompletion(false);
workItemNode.addInMapping("param1", "var1");
workItemNode.addOutMapping("param2", "var2");
timer = new Timer();
timer.setDelay("100");
timer.setPeriod("100");
action = new DroolsConsequenceAction("dialect", "consequence");
workItemNode.addTimer(timer, action);
timer = new Timer();
timer.setDelay("200");
timer.setPeriod("200");
action = new DroolsConsequenceAction("dialect", "consequence");
workItemNode.addTimer(timer, action);
workItemNode.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions);
workItemNode.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions);
process.addNode(workItemNode);
connection = new ConnectionImpl(subProcess, Node.CONNECTION_DEFAULT_TYPE, workItemNode, Node.CONNECTION_DEFAULT_TYPE);
connection.setMetaData("bendpoints", "[]");
HumanTaskNode humanTaskNode = new HumanTaskNode();
humanTaskNode.setName("Human Task");
work = humanTaskNode.getWork();
parameterDefinitions = new HashSet<ParameterDefinition>();
parameterDefinition = new ParameterDefinitionImpl("TaskName", new StringDataType());
parameterDefinitions.add(parameterDefinition);
parameterDefinition = new ParameterDefinitionImpl("ActorId", new StringDataType());
parameterDefinitions.add(parameterDefinition);
parameterDefinition = new ParameterDefinitionImpl("Priority", new StringDataType());
parameterDefinitions.add(parameterDefinition);
parameterDefinition = new ParameterDefinitionImpl("Comment", new StringDataType());
parameterDefinitions.add(parameterDefinition);
work.setParameterDefinitions(parameterDefinitions);
work.setParameter("TaskName", "Do something");
work.setParameter("ActorId", "John Doe");
humanTaskNode.setWaitForCompletion(false);
humanTaskNode.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions);
humanTaskNode.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions);
process.addNode(humanTaskNode);
connection = new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, humanTaskNode, Node.CONNECTION_DEFAULT_TYPE);
TimerNode timerNode = new TimerNode();
timerNode.setName("timer");
timerNode.setMetaData("x", 1);
timerNode.setMetaData("y", 2);
timerNode.setMetaData("width", 3);
timerNode.setMetaData("height", 4);
timer = new Timer();
timer.setDelay("1000");
timer.setPeriod("1000");
timerNode.setTimer(timer);
process.addNode(timerNode);
new ConnectionImpl(humanTaskNode, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
ForEachNode forEachNode = new ForEachNode();
forEachNode.setName("ForEach");
forEachNode.setCollectionExpression("collection");
forEachNode.setVariable("variableName", new ObjectDataType());
forEachNode.setWaitForCompletion(false);
ActionNode subActionNode1 = new ActionNode();
forEachNode.getCompositeNode().addNode(subActionNode1);
ActionNode subActionNode2 = new ActionNode();
forEachNode.getCompositeNode().addNode(subActionNode2);
new ConnectionImpl(subActionNode1, Node.CONNECTION_DEFAULT_TYPE, subActionNode2, Node.CONNECTION_DEFAULT_TYPE);
forEachNode.getCompositeNode().linkIncomingConnections(Node.CONNECTION_DEFAULT_TYPE, subActionNode1.getId(), Node.CONNECTION_DEFAULT_TYPE);
forEachNode.getCompositeNode().linkOutgoingConnections(subActionNode2.getId(), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE);
process.addNode(forEachNode);
new ConnectionImpl(timerNode, Node.CONNECTION_DEFAULT_TYPE, forEachNode, Node.CONNECTION_DEFAULT_TYPE);
CompositeContextNode compositeNode = new CompositeContextNode();
compositeNode.setName("Composite");
VariableScope variableScope = new VariableScope();
compositeNode.addContext(variableScope);
compositeNode.setDefaultContext(variableScope);
variableScope.setVariables(variables);
ExceptionScope exceptionScope = new ExceptionScope();
compositeNode.addContext(exceptionScope);
compositeNode.setDefaultContext(exceptionScope);
exceptionHandler = new ActionExceptionHandler();
exceptionHandler.setFaultVariable("faultVariable");
action = new DroolsConsequenceAction("dialect", "consequence");
exceptionHandler.setAction(action);
exceptionScope.setExceptionHandler("MyFault", exceptionHandler);
exceptionHandler = new ActionExceptionHandler();
exceptionHandler.setFaultVariable("faultVariable2");
action = new DroolsConsequenceAction("dialect2", "consequence2");
exceptionHandler.setAction(action);
exceptionScope.setExceptionHandler("MyFault2", exceptionHandler);
subActionNode1 = new ActionNode();
compositeNode.addNode(subActionNode1);
subActionNode2 = new ActionNode();
compositeNode.addNode(subActionNode2);
new ConnectionImpl(subActionNode1, Node.CONNECTION_DEFAULT_TYPE, subActionNode2, Node.CONNECTION_DEFAULT_TYPE);
compositeNode.linkIncomingConnections(Node.CONNECTION_DEFAULT_TYPE, subActionNode1.getId(), Node.CONNECTION_DEFAULT_TYPE);
compositeNode.linkOutgoingConnections(subActionNode2.getId(), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE);
process.addNode(compositeNode);
new ConnectionImpl(forEachNode, Node.CONNECTION_DEFAULT_TYPE, compositeNode, Node.CONNECTION_DEFAULT_TYPE);
EndNode endNode = new EndNode();
endNode.setName("end");
endNode.setTerminate(false);
endNode.setMetaData("x", 1);
endNode.setMetaData("y", 2);
endNode.setMetaData("width", 3);
endNode.setMetaData("height", 4);
process.addNode(endNode);
StateNode stateNode = new StateNode();
stateNode.setName("state");
stateNode.setMetaData("x", 1);
stateNode.setMetaData("y", 2);
stateNode.setMetaData("width", 3);
stateNode.setMetaData("height", 4);
timer = new Timer();
timer.setDelay("100");
timer.setPeriod("100");
action = new DroolsConsequenceAction("dialect", "consequence");
stateNode.addTimer(timer, action);
timer = new Timer();
timer.setDelay("200");
timer.setPeriod("200");
action = new DroolsConsequenceAction("dialect", "consequence");
stateNode.addTimer(timer, action);
actions = new ArrayList<DroolsAction>();
action1 = new DroolsConsequenceAction("java", "System.out.println(\"action1\");");
actions.add(action1);
action2 = new DroolsConsequenceAction("java", "System.out.println(\"action2\");");
actions.add(action2);
stateNode.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions);
stateNode.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions);
new ConnectionImpl(compositeNode, Node.CONNECTION_DEFAULT_TYPE, stateNode, Node.CONNECTION_DEFAULT_TYPE);
connection = new ConnectionImpl(stateNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE);
constraint = new ConstraintImpl();
constraint.setName("constraint1 ><&&");
constraint.setPriority(1);
constraint.setDialect("dialect1");
constraint.setType("type1");
constraint.setConstraint("constraint-text1 %&<>");
stateNode.setConstraint(connection, constraint);
connection = new ConnectionImpl(stateNode, Node.CONNECTION_DEFAULT_TYPE, endNode, Node.CONNECTION_DEFAULT_TYPE);
constraint = new ConstraintImpl();
constraint.setName("constraint2");
constraint.setPriority(2);
constraint.setDialect("dialect2");
constraint.setType("type2");
constraint.setConstraint("constraint-text2");
stateNode.setConstraint(connection, constraint);
process.addNode(stateNode);
String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, true);
if (xml == null) {
throw new IllegalArgumentException("Failed to persist full nodes!");
}
SemanticModules modules = new SemanticModules();
modules.addSemanticModule(new ProcessSemanticModule());
XmlProcessReader reader = new XmlProcessReader(modules, getClass().getClassLoader());
List<Process> processes = reader.read(new StringReader(xml));
assertNotNull(processes);
process = (RuleFlowProcess) processes.get(0);
if (process == null) {
throw new IllegalArgumentException("Failed to reload process!");
}
assertEquals(16, process.getNodes().length);
assertEquals(2, process.getImports().size());
assertEquals(2, process.getGlobals().size());
assertEquals(4, process.getVariableScope().getVariables().size());
assertEquals(2, process.getSwimlaneContext().getSwimlanes().size());
assertEquals(2, process.getExceptionScope().getExceptionHandlers().size());
String xml2 = XmlRuleFlowProcessDumper.INSTANCE.dump(process, true);
if (xml2 == null) {
throw new IllegalArgumentException("Failed to persist empty nodes!");
}
Document control = XMLUnit.buildDocument(XMLUnit.newControlParser(), new StringReader(xml));
Document test = XMLUnit.buildDocument(XMLUnit.newTestParser(), new StringReader(xml2));
Diff diff = new Diff(control, test, null, new ElementNameAndAttributeQualifier("name"));
assertTrue(diff.toString(), diff.similar());
// test serialization of process elements
}
use of org.jbpm.workflow.core.node.RuleSetNode in project jbpm by kiegroup.
the class XMLPersistenceTest method testPersistenceOfEmptyNodes.
@Test
public void testPersistenceOfEmptyNodes() throws Exception {
RuleFlowProcess process = new RuleFlowProcess() {
private static final long serialVersionUID = 510l;
int id = 0;
public void addNode(org.kie.api.definition.process.Node node) {
((Node) node).setId(++id);
super.addNode(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());
process.addNode(new ForEachNode());
process.addNode(new CompositeContextNode());
process.addNode(new EventNode());
process.addNode(new FaultNode());
process.addNode(new StateNode());
process.addNode(new DynamicNode());
String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, false);
if (xml == null) {
throw new IllegalArgumentException("Failed to persist empty nodes!");
}
SemanticModules modules = new SemanticModules();
modules.addSemanticModule(new ProcessSemanticModule());
XmlProcessReader reader = new XmlProcessReader(modules, getClass().getClassLoader());
List<Process> processes = reader.read(new StringReader(xml));
assertNotNull(processes);
process = (RuleFlowProcess) processes.get(0);
if (process == null) {
throw new IllegalArgumentException("Failed to reload process!");
}
assertEquals(17, process.getNodes().length);
String xml2 = XmlRuleFlowProcessDumper.INSTANCE.dump(process, false);
if (xml2 == null) {
throw new IllegalArgumentException("Failed to persist empty nodes!");
}
assertXMLEqual(xml, xml2);
// assertEquals(xml, xml2);
}
use of org.jbpm.workflow.core.node.RuleSetNode in project jbpm by kiegroup.
the class RuleSetNodeBuilder method build.
@Override
public void build(Process process, ProcessDescr processDescr, ProcessBuildContext context, Node node) {
super.build(process, processDescr, context, node);
WorkflowProcess wfProcess = (WorkflowProcess) process;
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("imports", wfProcess.getImports());
parameters.put("classloader", context.getConfiguration().getClassLoader());
for (DataAssociation dataAssociation : ((RuleSetNode) node).getInAssociations()) {
Transformation transformation = dataAssociation.getTransformation();
if (transformation != null) {
DataTransformer transformer = DataTransformerRegistry.get().find(transformation.getLanguage());
transformation.setCompiledExpression(transformer.compile(transformation.getExpression(), parameters));
}
}
for (DataAssociation dataAssociation : ((RuleSetNode) node).getOutAssociations()) {
Transformation transformation = dataAssociation.getTransformation();
if (transformation != null) {
DataTransformer transformer = DataTransformerRegistry.get().find(transformation.getLanguage());
transformation.setCompiledExpression(transformer.compile(transformation.getExpression(), parameters));
}
}
}
use of org.jbpm.workflow.core.node.RuleSetNode in project jbpm by kiegroup.
the class RuleSetNodeInstance method internalTrigger.
public void internalTrigger(final NodeInstance from, String type) {
try {
super.internalTrigger(from, type);
// if node instance was cancelled, abort
if (getNodeInstanceContainer().getNodeInstance(getId()) == null) {
return;
}
if (!org.jbpm.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
throw new IllegalArgumentException("A RuleSetNode only accepts default incoming connections!");
}
RuleSetNode ruleSetNode = getRuleSetNode();
KieRuntime kruntime = getProcessInstance().getKnowledgeRuntime();
Map<String, Object> inputs = evaluateParameters(ruleSetNode);
if (ruleSetNode.isDMN()) {
String namespace = resolveVariable(ruleSetNode.getNamespace());
String model = resolveVariable(ruleSetNode.getModel());
String decision = resolveVariable(ruleSetNode.getDecision());
DMNRuntime runtime = ((KieSession) kruntime).getKieRuntime(DMNRuntime.class);
DMNModel dmnModel = runtime.getModel(namespace, model);
if (dmnModel == null) {
throw new IllegalArgumentException("DMN model '" + model + "' not found with namespace '" + namespace + "'");
}
DMNResult dmnResult = null;
DMNContext context = runtime.newContext();
for (Entry<String, Object> entry : inputs.entrySet()) {
context.set(entry.getKey(), entry.getValue());
}
if (decision != null && !decision.isEmpty()) {
dmnResult = runtime.evaluateByName(dmnModel, context, decision);
} else {
dmnResult = runtime.evaluateAll(dmnModel, context);
}
if (dmnResult.hasErrors()) {
String errors = dmnResult.getMessages(Severity.ERROR).stream().map(message -> message.toString()).collect(Collectors.joining(", "));
throw new RuntimeException("DMN result errors:: " + errors);
}
processOutputs(dmnResult.getContext().getAll());
triggerCompleted();
} else {
// first set rule flow group
setRuleFlowGroup(resolveRuleFlowGroup(ruleSetNode.getRuleFlowGroup()));
// proceed
for (Entry<String, Object> entry : inputs.entrySet()) {
if (FIRE_RULE_LIMIT_PARAMETER.equals(entry.getKey())) {
// don't put control parameter for fire limit into working memory
continue;
}
String inputKey = getRuleFlowGroup() + "_" + getProcessInstance().getId() + "_" + entry.getKey();
factHandles.put(inputKey, kruntime.insert(entry.getValue()));
}
if (actAsWaitState()) {
addRuleSetListener();
((InternalAgenda) getProcessInstance().getKnowledgeRuntime().getAgenda()).activateRuleFlowGroup(getRuleFlowGroup(), getProcessInstance().getId(), getUniqueId());
} else {
int fireLimit = DEFAULT_FIRE_RULE_LIMIT;
if (inputs.containsKey(FIRE_RULE_LIMIT_PARAMETER)) {
fireLimit = Integer.parseInt(inputs.get(FIRE_RULE_LIMIT_PARAMETER).toString());
}
((InternalAgenda) getProcessInstance().getKnowledgeRuntime().getAgenda()).activateRuleFlowGroup(getRuleFlowGroup(), getProcessInstance().getId(), getUniqueId());
int fired = ((KieSession) getProcessInstance().getKnowledgeRuntime()).fireAllRules(fireLimit);
if (fired == fireLimit) {
throw new RuntimeException("Fire rule limit reached " + fireLimit + ", limit can be set via system property " + FIRE_RULE_LIMIT_PROPERTY + " or via data input of business rule task named " + FIRE_RULE_LIMIT_PARAMETER);
}
removeEventListeners();
retractFacts();
triggerCompleted();
}
}
} catch (Exception e) {
handleException(e);
}
}
Aggregations