use of org.jbpm.workflow.core.impl.DataDefinition in project kogito-runtimes by kiegroup.
the class AbstractNodeHandler method getVariableDataSpec.
protected DataDefinition getVariableDataSpec(ExtensibleXmlParser parser, String propertyIdRef) {
RuleFlowProcess process = (RuleFlowProcess) ((ProcessBuildData) parser.getData()).getMetaData(ProcessHandler.CURRENT_PROCESS);
Optional<Variable> var = process.getVariableScope().getVariables().stream().filter(e -> e.getId().equals(propertyIdRef)).findAny();
if (var.isEmpty()) {
return null;
}
Variable variable = var.get();
return new DataDefinition(variable.getId(), variable.getName(), variable.getType().getStringType());
}
use of org.jbpm.workflow.core.impl.DataDefinition in project kogito-runtimes by kiegroup.
the class ForEachNodeFactory method outputVariable.
public ForEachNodeFactory<T> outputVariable(String varRef, String variableName, DataType dataType) {
getForEachNode().setOutputRef(variableName);
getForEachNode().addContextVariable(varRef, variableName, dataType);
getForEachNode().getMultiInstanceSpecification().setOutputDataItem(new DataDefinition(varRef, variableName, dataType.getStringType()));
return this;
}
use of org.jbpm.workflow.core.impl.DataDefinition in project kogito-runtimes by kiegroup.
the class AbstractNodeHandler method decorateMultiInstanceSpecification.
protected ForEachNode decorateMultiInstanceSpecification(NodeImpl nodeTarget, MultiInstanceSpecification multiInstanceSpecification) {
ForEachNode forEachNode = new ForEachNode();
forEachNode.setId(nodeTarget.getId());
forEachNode.setName(nodeTarget.getName());
nodeTarget.setMetaData("hidden", true);
forEachNode.setIoSpecification(nodeTarget.getIoSpecification());
DataDefinition dataInput = multiInstanceSpecification.getInputDataItem();
DataDefinition dataOutput = multiInstanceSpecification.getOutputDataItem();
if (dataInput != null) {
forEachNode.setInputRef(dataInput.getLabel());
forEachNode.addContextVariable(dataInput.getId(), dataInput.getLabel(), fromType(dataInput.getType(), currentThread().getContextClassLoader()));
forEachNode.getIoSpecification().getDataInputAssociation().stream().filter(e -> !e.getSources().isEmpty() && e.getSources().get(0).getId().equals(dataInput.getId())).forEach(da -> {
da.getSources().clear();
da.getSources().add(dataInput);
});
}
if (dataOutput != null) {
forEachNode.setOutputRef(dataOutput.getLabel());
forEachNode.addContextVariable(dataOutput.getId(), dataOutput.getLabel(), fromType(dataOutput.getType(), currentThread().getContextClassLoader()));
forEachNode.getIoSpecification().getDataOutputAssociation().stream().filter(e -> e.getTarget().getId().equals(dataOutput.getId())).forEach(da -> {
da.setTarget(dataOutput);
});
}
if (multiInstanceSpecification.hasLoopDataInputRef()) {
DataDefinition dataInputRef = multiInstanceSpecification.getLoopDataInputRef();
// inputs and outputs are still processes so we need to get rid of the input of belonging to the
// loop
nodeTarget.getMetaData().put("MICollectionInput", dataInputRef.getLabel());
// this is a correction as the input collection is the source of the expr (target)
// so target is the input collection of the node
// so we look in the source of the data input a target is equal to the data input getting the source we get the source
// collection at context level (subprocess or activity)
forEachNode.getIoSpecification().getDataInputAssociation().stream().filter(e -> e.getTarget().getId().equals(dataInputRef.getId())).findAny().ifPresent(pVar -> {
String expr = pVar.getSources().get(0).getLabel();
forEachNode.setCollectionExpression(expr);
});
}
if (multiInstanceSpecification.hasLoopDataOutputRef()) {
// same correction as input
// we determine the output ref and locate the source. if set the target we get the variable at that level.
DataDefinition dataOutputRef = multiInstanceSpecification.getLoopDataOutputRef();
nodeTarget.getMetaData().put("MICollectionOutput", dataOutputRef.getLabel());
forEachNode.getIoSpecification().getDataOutputAssociation().stream().filter(e -> e.getSources().get(0).getId().equals(dataOutputRef.getId())).findAny().ifPresent(e -> {
forEachNode.setOutputCollectionExpression(e.getTarget().getLabel());
});
// another correction colletion output is not being stored in the composite context multiinstance
// we use foreach_output
Iterator<DataAssociation> iterator = forEachNode.getIoSpecification().getDataOutputAssociation().iterator();
while (iterator.hasNext()) {
DataAssociation current = iterator.next();
if (!current.getSources().isEmpty() && current.getSources().get(0).equals(dataOutputRef)) {
iterator.remove();
}
}
}
// this is just an expression
forEachNode.setCompletionConditionExpression(multiInstanceSpecification.getCompletionCondition());
forEachNode.setMultiInstanceSpecification(multiInstanceSpecification);
// This variable is used for adding items computed by each subcontext.
// after foreach is finished it will be moved to the data output ref collection of the multiinstance
// this is the context of each subprocess
VariableScope foreachContext = ((VariableScope) forEachNode.getCompositeNode().getDefaultContext(VariableScope.VARIABLE_SCOPE));
Variable forEach = new Variable();
forEach.setId("foreach_output");
forEach.setName("foreach_output");
forEach.setType(DataTypeResolver.fromType(Collection.class.getCanonicalName(), Thread.currentThread().getContextClassLoader()));
foreachContext.addVariable(forEach);
return forEachNode;
}
use of org.jbpm.workflow.core.impl.DataDefinition in project kogito-runtimes by kiegroup.
the class AbstractNodeHandler method readAssignments.
private List<Assignment> readAssignments(Element parent, DataDefinition dst, Function<String, DataDefinition> sourceResolver, Function<String, DataDefinition> targetResolver) {
List<Assignment> assignments = new ArrayList<>();
readChildrenElementsByTag(parent, "assignment").forEach(element -> {
Optional<Element> from = readSingleChildElementByTag(element, "from");
Optional<Element> to = readSingleChildElementByTag(element, "to");
String language = element.getAttribute("expressionLanguage");
if (language == null || language.isEmpty()) {
language = element.getAttribute("language");
}
String source = from.get().getTextContent();
String target = to.get().getTextContent();
if (!language.isEmpty()) {
assignments.add(new Assignment(language, toDataExpression(source), toDataExpression(target)));
} else {
source = cleanUp(source);
target = cleanUp(target);
DataDefinition sourceDataSpec = isExpr(source) ? toDataExpression(source) : sourceResolver.apply(source);
if (sourceDataSpec == null) {
// it is constant source
sourceDataSpec = toDataExpression(source);
}
DataDefinition targetDataSpec = isExpr(target) ? toDataExpression(target) : targetResolver.apply(target);
if (targetDataSpec == null) {
targetDataSpec = toDataExpression(target);
}
logger.debug("No language set for assignment {} to {}. Applying heuristics", sourceDataSpec, targetDataSpec);
assignments.add(new Assignment(language.isEmpty() ? null : language, sourceDataSpec, targetDataSpec));
}
});
return assignments;
}
use of org.jbpm.workflow.core.impl.DataDefinition in project kogito-runtimes by kiegroup.
the class AbstractNodeHandler method writeThrow.
protected void writeThrow(IOSpecification ioSpecification, StringBuilder xmlDump) {
for (DataDefinition input : ioSpecification.getDataInput().values()) {
xmlDump.append(" <dataInput id=\"" + input.getId() + "\" name=\"" + input.getLabel() + "\" />" + EOL);
}
for (DataAssociation input : ioSpecification.getDataInputAssociation()) {
xmlDump.append(" <dataInputAssociation>" + EOL);
writeDataAssociation(input, xmlDump);
xmlDump.append(" </dataInputAssociation>" + EOL);
}
}
Aggregations