Search in sources :

Example 11 with Expression

use of org.jbpm.bpmn2.core.Expression in project kogito-runtimes by kiegroup.

the class SequenceFlowHandler method end.

public Object end(final String uri, final String localName, final ExtensibleXmlParser parser) throws SAXException {
    final Element element = parser.endElementBuilder();
    SequenceFlow sequenceFlow = (SequenceFlow) parser.getCurrent();
    org.w3c.dom.Node xmlNode = element.getFirstChild();
    while (xmlNode != null) {
        String nodeName = xmlNode.getNodeName();
        if ("conditionExpression".equals(nodeName)) {
            String expression = xmlNode.getTextContent();
            org.w3c.dom.Node languageNode = xmlNode.getAttributes().getNamedItem("language");
            if (languageNode != null) {
                String language = languageNode.getNodeValue();
                if (XmlBPMNProcessDumper.JAVA_LANGUAGE.equals(language)) {
                    sequenceFlow.setLanguage("java");
                } else if (XmlBPMNProcessDumper.MVEL_LANGUAGE.equals(language)) {
                    sequenceFlow.setLanguage("mvel");
                } else if (XmlBPMNProcessDumper.RULE_LANGUAGE.equals(language)) {
                    sequenceFlow.setType("rule");
                } else if (XmlBPMNProcessDumper.XPATH_LANGUAGE.equals(language)) {
                    sequenceFlow.setLanguage("XPath");
                } else if (XmlBPMNProcessDumper.FEEL_LANGUAGE.equals(language) || XmlBPMNProcessDumper.DMN_FEEL_LANGUAGE.equals(language)) {
                    sequenceFlow.setLanguage("FEEL");
                } else {
                    throw new ProcessParsingValidationException("Unknown language " + language);
                }
            }
            sequenceFlow.setExpression(expression);
        }
        xmlNode = xmlNode.getNextSibling();
    }
    return sequenceFlow;
}
Also used : SequenceFlow(org.jbpm.bpmn2.core.SequenceFlow) Element(org.w3c.dom.Element)

Example 12 with Expression

use of org.jbpm.bpmn2.core.Expression in project kogito-runtimes by kiegroup.

the class CorrelationSubscriptionHandler method buildPropertyProcessBindings.

private Map<String, Expression> buildPropertyProcessBindings(NodeList childNodes, ExtensibleXmlParser parser) {
    Map<String, Expression> correlationKeys = new HashMap<>();
    for (int i = 0; i < childNodes.getLength(); i++) {
        Node node = childNodes.item(i);
        if ("correlationPropertyBinding".equals(node.getNodeName())) {
            Element elementBinding = (Element) node;
            correlationKeys.put(elementBinding.getAttribute("correlationPropertyRef"), buildBindingExpression(elementBinding.getChildNodes(), parser));
        }
    }
    return correlationKeys;
}
Also used : Expression(org.jbpm.bpmn2.core.Expression) HashMap(java.util.HashMap) Node(org.w3c.dom.Node) Element(org.w3c.dom.Element)

Example 13 with Expression

use of org.jbpm.bpmn2.core.Expression in project kogito-runtimes by kiegroup.

the class CorrelationSubscriptionHandler method buildBindingExpression.

private Expression buildBindingExpression(NodeList childNodes, ExtensibleXmlParser parser) {
    for (int i = 0; i < childNodes.getLength(); i++) {
        Node node = childNodes.item(i);
        if ("dataPath".equals(node.getNodeName())) {
            Element expressionElement = (Element) node;
            Expression expression = new Expression();
            expression.setId(expressionElement.getAttribute("id"));
            expression.setLang(expressionElement.getAttribute("language"));
            expression.setScript(expressionElement.getTextContent());
            expression.setOutcomeType(HandlerUtil.definitions(parser).get(expressionElement.getAttribute("evaluatesToTypeRef")).getStructureRef());
            return expression;
        }
    }
    throw new RuntimeException("message Path not found for correlation property " + parser.getCurrent());
}
Also used : Expression(org.jbpm.bpmn2.core.Expression) Node(org.w3c.dom.Node) Element(org.w3c.dom.Element)

Example 14 with Expression

use of org.jbpm.bpmn2.core.Expression in project kogito-runtimes by kiegroup.

the class ActivityTest method testServiceTaskWithCustomTransformation.

@Test
public void testServiceTaskWithCustomTransformation() throws Exception {
    DataTransformerRegistry.get().register("http://custom/transformer", new DataTransformer() {

        @Override
        public Object transform(Object expression, Map<String, Object> parameters) {
            // support only single object
            String value = parameters.values().iterator().next().toString();
            Object result = null;
            if ("caplitalizeFirst".equals(expression)) {
                String first = value.substring(0, 1);
                String main = value.substring(1, value.length());
                result = first.toUpperCase() + main;
            } else if ("caplitalizeLast".equals(expression)) {
                String last = value.substring(value.length() - 1);
                String main = value.substring(0, value.length() - 1);
                result = main + last.toUpperCase();
            } else {
                throw new IllegalArgumentException("Unknown expression " + expression);
            }
            return result;
        }

        @Override
        public Object compile(String expression, Map<String, Object> parameters) {
            // compilation not supported
            return expression;
        }
    });
    kruntime = createKogitoProcessRuntime("BPMN2-ServiceProcessWithCustomTransformation.bpmn2");
    kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Service Task", new ServiceTaskHandler());
    Map<String, Object> params = new HashMap<>();
    params.put("s", "john doe");
    KogitoWorkflowProcessInstance processInstance = (KogitoWorkflowProcessInstance) kruntime.startProcess("ServiceProcess", params);
    assertProcessInstanceFinished(processInstance, kruntime);
    assertEquals("John doE", processInstance.getVariable("s"));
}
Also used : ServiceTaskHandler(org.jbpm.bpmn2.handler.ServiceTaskHandler) KogitoWorkflowProcessInstance(org.kie.kogito.internal.process.runtime.KogitoWorkflowProcessInstance) DataTransformer(org.kie.api.runtime.process.DataTransformer) HashMap(java.util.HashMap) Test(org.junit.jupiter.api.Test)

Example 15 with Expression

use of org.jbpm.bpmn2.core.Expression 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;
}
Also used : SequenceFlow(org.jbpm.bpmn2.core.SequenceFlow) ForEachNode(org.jbpm.workflow.core.node.ForEachNode) LoggerFactory(org.slf4j.LoggerFactory) PatternConstants(org.jbpm.util.PatternConstants) NodeImpl(org.jbpm.workflow.core.impl.NodeImpl) Thread.currentThread(java.lang.Thread.currentThread) DroolsConsequenceAction(org.jbpm.workflow.core.impl.DroolsConsequenceAction) ItemDefinition(org.jbpm.bpmn2.core.ItemDefinition) Assignment(org.jbpm.workflow.core.node.Assignment) ExtensibleXmlParser(org.drools.core.xml.ExtensibleXmlParser) Association(org.jbpm.bpmn2.core.Association) StateNode(org.jbpm.workflow.core.node.StateNode) Matcher(java.util.regex.Matcher) ProcessBuildData(org.jbpm.compiler.xml.ProcessBuildData) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Map(java.util.Map) Signal(org.jbpm.bpmn2.core.Signal) Transformation(org.jbpm.workflow.core.node.Transformation) IOSpecification(org.jbpm.workflow.core.impl.IOSpecification) XmlDumper(org.drools.compiler.compiler.xml.XmlDumper) MultiInstanceSpecification(org.jbpm.workflow.core.impl.MultiInstanceSpecification) CatchLinkNode(org.jbpm.workflow.core.node.CatchLinkNode) CompositeContextNode(org.jbpm.workflow.core.node.CompositeContextNode) Collection(java.util.Collection) Set(java.util.Set) UUID(java.util.UUID) VariableScope(org.jbpm.process.core.context.variable.VariableScope) List(java.util.List) Error(org.jbpm.bpmn2.core.Error) ContextContainer(org.jbpm.process.core.ContextContainer) Node(org.jbpm.workflow.core.Node) JavaDialect(org.drools.mvel.java.JavaDialect) SAXException(org.xml.sax.SAXException) Optional(java.util.Optional) MAPPING_VARIABLE_INPUT(org.jbpm.ruleflow.core.Metadata.MAPPING_VARIABLE_INPUT) VARIABLE(org.jbpm.ruleflow.core.Metadata.VARIABLE) RuleFlowProcess(org.jbpm.ruleflow.core.RuleFlowProcess) DataDefinition(org.jbpm.workflow.core.impl.DataDefinition) HashMap(java.util.HashMap) Function(java.util.function.Function) ArrayList(java.util.ArrayList) Lane(org.jbpm.bpmn2.core.Lane) TimerNode(org.jbpm.workflow.core.node.TimerNode) HashSet(java.util.HashSet) DataTypeResolver.fromType(org.jbpm.process.core.datatype.DataTypeResolver.fromType) NodeContainer(org.jbpm.workflow.core.NodeContainer) DataAssociation(org.jbpm.workflow.core.impl.DataAssociation) Attributes(org.xml.sax.Attributes) BaseAbstractHandler(org.drools.core.xml.BaseAbstractHandler) FaultNode(org.jbpm.workflow.core.node.FaultNode) DroolsAction(org.jbpm.workflow.core.DroolsAction) Variable(org.jbpm.process.core.context.variable.Variable) DataTransformer(org.kie.api.runtime.process.DataTransformer) ActionNode(org.jbpm.workflow.core.node.ActionNode) EndNode(org.jbpm.workflow.core.node.EndNode) Logger(org.slf4j.Logger) NodeList(org.w3c.dom.NodeList) Iterator(java.util.Iterator) EventNode(org.jbpm.workflow.core.node.EventNode) COMPLETION_CONDITION(org.jbpm.ruleflow.core.Metadata.COMPLETION_CONDITION) Handler(org.drools.core.xml.Handler) DataTypeResolver(org.jbpm.process.core.datatype.DataTypeResolver) SAXParseException(org.xml.sax.SAXParseException) Element(org.w3c.dom.Element) DataTransformerRegistry(org.jbpm.process.core.impl.DataTransformerRegistry) MAPPING_VARIABLE(org.jbpm.ruleflow.core.Metadata.MAPPING_VARIABLE) Definitions(org.jbpm.bpmn2.core.Definitions) ExtendedNodeImpl(org.jbpm.workflow.core.impl.ExtendedNodeImpl) Variable(org.jbpm.process.core.context.variable.Variable) DataAssociation(org.jbpm.workflow.core.impl.DataAssociation) ForEachNode(org.jbpm.workflow.core.node.ForEachNode) DataDefinition(org.jbpm.workflow.core.impl.DataDefinition) VariableScope(org.jbpm.process.core.context.variable.VariableScope)

Aggregations

Element (org.w3c.dom.Element)10 HashMap (java.util.HashMap)8 Expression (org.jbpm.bpmn2.core.Expression)8 SequenceFlow (org.jbpm.bpmn2.core.SequenceFlow)7 Node (org.w3c.dom.Node)6 List (java.util.List)5 Map (java.util.Map)4 ItemDefinition (org.jbpm.bpmn2.core.ItemDefinition)4 ProcessBuildData (org.jbpm.compiler.xml.ProcessBuildData)4 ArrayList (java.util.ArrayList)3 Collection (java.util.Collection)3 HashSet (java.util.HashSet)3 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)3 BaseAbstractHandler (org.drools.core.xml.BaseAbstractHandler)3 ExtensibleXmlParser (org.drools.core.xml.ExtensibleXmlParser)3 Handler (org.drools.core.xml.Handler)3 Association (org.jbpm.bpmn2.core.Association)3 Definitions (org.jbpm.bpmn2.core.Definitions)3 Error (org.jbpm.bpmn2.core.Error)3 Lane (org.jbpm.bpmn2.core.Lane)3