Search in sources :

Example 26 with WorkItemNode

use of org.jbpm.workflow.core.node.WorkItemNode in project jbpm by kiegroup.

the class XmlBPMNProcessDumper method visitInterfaces.

protected void visitInterfaces(Node[] nodes, StringBuilder xmlDump) {
    for (Node node : nodes) {
        if (node instanceof WorkItemNode) {
            Work work = ((WorkItemNode) node).getWork();
            if (work != null) {
                if ("Service Task".equals(work.getName())) {
                    String interfaceName = (String) work.getParameter("Interface");
                    if (interfaceName == null) {
                        interfaceName = "";
                    }
                    String interfaceRef = (String) work.getParameter("interfaceImplementationRef");
                    if (interfaceRef == null) {
                        interfaceRef = "";
                    }
                    String operationName = (String) work.getParameter("Operation");
                    if (operationName == null) {
                        operationName = "";
                    }
                    String operationRef = (String) work.getParameter("operationImplementationRef");
                    if (operationRef == null) {
                        operationRef = "";
                    }
                    String parameterType = (String) work.getParameter("ParameterType");
                    if (parameterType == null) {
                        parameterType = "";
                    }
                    xmlDump.append("  <itemDefinition id=\"" + getUniqueNodeId(node) + "_InMessageType\" " + ("".equals(parameterType) || "java.lang.Object".equals(parameterType) ? "" : "structureRef=\"" + parameterType + "\" ") + "/>" + EOL + "  <message id=\"" + getUniqueNodeId(node) + "_InMessage\" itemRef=\"" + getUniqueNodeId(node) + "_InMessageType\" />" + EOL + "  <interface id=\"" + getUniqueNodeId(node) + "_ServiceInterface\" name=\"" + interfaceName + "\" implementationRef=\"" + interfaceRef + "\" >" + EOL + "    <operation id=\"" + getUniqueNodeId(node) + "_ServiceOperation\" name=\"" + operationName + "\" implementationRef=\"" + operationRef + "\" >" + EOL + "      <inMessageRef>" + getUniqueNodeId(node) + "_InMessage</inMessageRef>" + EOL + "    </operation>" + EOL + "  </interface>" + EOL + EOL);
                } else if ("Send Task".equals(work.getName())) {
                    String messageType = (String) work.getParameter("MessageType");
                    if (messageType == null) {
                        messageType = "";
                    }
                    xmlDump.append("  <itemDefinition id=\"" + getUniqueNodeId(node) + "_MessageType\" " + ("".equals(messageType) || "java.lang.Object".equals(messageType) ? "" : "structureRef=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(messageType) + "\" ") + "/>" + EOL + "  <message id=\"" + getUniqueNodeId(node) + "_Message\" itemRef=\"" + getUniqueNodeId(node) + "_MessageType\" />" + EOL + EOL);
                } else if ("Receive Task".equals(work.getName())) {
                    String messageId = (String) work.getParameter("MessageId");
                    String messageType = (String) work.getParameter("MessageType");
                    if (messageType == null) {
                        messageType = "";
                    }
                    xmlDump.append("  <itemDefinition id=\"" + getUniqueNodeId(node) + "_MessageType\" " + ("".equals(messageType) || "java.lang.Object".equals(messageType) ? "" : "structureRef=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(messageType) + "\" ") + "/>" + EOL + "  <message id=\"" + messageId + "\" itemRef=\"" + getUniqueNodeId(node) + "_MessageType\" />" + EOL + EOL);
                }
            }
        } else if (node instanceof EndNode) {
            String messageType = (String) node.getMetaData().get("MessageType");
            if (messageType != null) {
                xmlDump.append("  <itemDefinition id=\"" + getUniqueNodeId(node) + "_MessageType\" " + ("".equals(messageType) || "java.lang.Object".equals(messageType) ? "" : "structureRef=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(messageType) + "\" ") + "/>" + EOL + "  <message id=\"" + getUniqueNodeId(node) + "_Message\" itemRef=\"" + getUniqueNodeId(node) + "_MessageType\" />" + EOL + EOL);
            }
        } else if (node instanceof ActionNode) {
            String messageType = (String) node.getMetaData().get("MessageType");
            if (messageType != null) {
                xmlDump.append("  <itemDefinition id=\"" + getUniqueNodeId(node) + "_MessageType\" " + ("".equals(messageType) || "java.lang.Object".equals(messageType) ? "" : "structureRef=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(messageType) + "\" ") + "/>" + EOL + "  <message id=\"" + getUniqueNodeId(node) + "_Message\" itemRef=\"" + getUniqueNodeId(node) + "_MessageType\" />" + EOL + EOL);
            }
        } else if (node instanceof EventNode) {
            List<EventFilter> filters = ((EventNode) node).getEventFilters();
            if (filters.size() > 0) {
                String messageRef = ((EventTypeFilter) filters.get(0)).getType();
                if (messageRef.startsWith("Message-")) {
                    messageRef = messageRef.substring(8);
                    String messageType = (String) node.getMetaData().get("MessageType");
                    xmlDump.append("  <itemDefinition id=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(messageRef) + "Type\" " + ("".equals(messageType) || "java.lang.Object".equals(messageType) ? "" : "structureRef=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(messageType) + "\" ") + "/>" + EOL + "  <message id=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(messageRef) + "\" itemRef=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(messageRef) + "Type\" />" + EOL + EOL);
                }
            }
        } else if (node instanceof StartNode) {
            StartNode startNode = (StartNode) node;
            if (startNode.getTriggers() != null && !startNode.getTriggers().isEmpty()) {
                Trigger trigger = startNode.getTriggers().get(0);
                if (trigger instanceof EventTrigger) {
                    String eventType = ((EventTypeFilter) ((EventTrigger) trigger).getEventFilters().get(0)).getType();
                    if (eventType.startsWith("Message-")) {
                        eventType = eventType.substring(8);
                        String messageType = (String) node.getMetaData().get("MessageType");
                        xmlDump.append("  <itemDefinition id=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(eventType) + "Type\" " + ("".equals(messageType) || "java.lang.Object".equals(messageType) ? "" : "structureRef=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(messageType) + "\" ") + "/>" + EOL + "  <message id=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(eventType) + "\" itemRef=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(eventType) + "Type\" />" + EOL + EOL);
                    }
                }
            }
        } else if (node instanceof ForEachNode) {
            ForEachNode forEachNode = (ForEachNode) node;
            String type = null;
            if (forEachNode.getVariableType() instanceof ObjectDataType) {
                type = ((ObjectDataType) forEachNode.getVariableType()).getClassName();
            }
            xmlDump.append("  <itemDefinition id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(forEachNode) + "_multiInstanceItemType\" " + (type == null || "java.lang.Object".equals(type) ? "" : "structureRef=\"" + XmlBPMNProcessDumper.replaceIllegalCharsAttribute(type) + "\" ") + "/>" + EOL + EOL);
        }
        if (node instanceof CompositeNode) {
            visitInterfaces(((CompositeNode) node).getNodes(), xmlDump);
        }
    }
}
Also used : StartNode(org.jbpm.workflow.core.node.StartNode) HumanTaskNode(org.jbpm.workflow.core.node.HumanTaskNode) ForEachNode(org.jbpm.workflow.core.node.ForEachNode) StartNode(org.jbpm.workflow.core.node.StartNode) CompositeNode(org.jbpm.workflow.core.node.CompositeNode) FaultNode(org.jbpm.workflow.core.node.FaultNode) WorkItemNode(org.jbpm.workflow.core.node.WorkItemNode) ActionNode(org.jbpm.workflow.core.node.ActionNode) EndNode(org.jbpm.workflow.core.node.EndNode) EventNode(org.jbpm.workflow.core.node.EventNode) Node(org.kie.api.definition.process.Node) ActionNode(org.jbpm.workflow.core.node.ActionNode) ObjectDataType(org.jbpm.process.core.datatype.impl.type.ObjectDataType) EventNode(org.jbpm.workflow.core.node.EventNode) EventTypeFilter(org.jbpm.process.core.event.EventTypeFilter) CompositeNode(org.jbpm.workflow.core.node.CompositeNode) EventTrigger(org.jbpm.workflow.core.node.EventTrigger) Trigger(org.jbpm.workflow.core.node.Trigger) EndNode(org.jbpm.workflow.core.node.EndNode) WorkItemNode(org.jbpm.workflow.core.node.WorkItemNode) Work(org.jbpm.process.core.Work) List(java.util.List) ArrayList(java.util.ArrayList) ForEachNode(org.jbpm.workflow.core.node.ForEachNode) EventTrigger(org.jbpm.workflow.core.node.EventTrigger)

Example 27 with WorkItemNode

use of org.jbpm.workflow.core.node.WorkItemNode in project jbpm by kiegroup.

the class ProcessHandler method checkBoundaryEventCompensationHandler.

/**
 * This logic belongs in {@link RuleFlowProcessValidator} -- except that {@link Association}s are a jbpm-bpmn2 class,
 * and {@link RuleFlowProcessValidator} is a jbpm-flow class..
 * </p>
 * Maybe we should have a BPMNProcessValidator class?
 *
 * @param association The association to check.
 * @param source The source of the association.
 * @param target The target of the association.
 */
private static void checkBoundaryEventCompensationHandler(Association association, Node source, Node target) {
    // - event node is boundary event node
    if (!(source instanceof BoundaryEventNode)) {
        throw new IllegalArgumentException("(Compensation) activities may only be associated with Boundary Event Nodes (not with" + source.getClass().getSimpleName() + " nodes [node " + ((String) source.getMetaData().get("UniqueId")) + "].");
    }
    BoundaryEventNode eventNode = (BoundaryEventNode) source;
    // - event node has compensationEvent
    List<EventFilter> eventFilters = eventNode.getEventFilters();
    boolean compensationCheckPassed = false;
    if (eventFilters != null) {
        for (EventFilter filter : eventFilters) {
            if (filter instanceof EventTypeFilter) {
                String type = ((EventTypeFilter) filter).getType();
                if (type != null && type.equals("Compensation")) {
                    compensationCheckPassed = true;
                }
            }
        }
    }
    if (!compensationCheckPassed) {
        throw new IllegalArgumentException("An Event [" + ((String) eventNode.getMetaData("UniqueId")) + "] linked from an association [" + association.getId() + "] must be a (Boundary) Compensation Event.");
    }
    // - boundary event node is attached to the correct type of node?
    /**
     * Tasks:
     * business: RuleSetNode
     * manual: WorkItemNode
     * receive: WorkItemNode
     * script: ActionNode
     * send: WorkItemNode
     * service: WorkItemNode
     * task: WorkItemNode
     * user: HumanTaskNode
     */
    String attachedToId = eventNode.getAttachedToNodeId();
    Node attachedToNode = null;
    for (Node node : eventNode.getNodeContainer().getNodes()) {
        if (attachedToId.equals(node.getMetaData().get("UniqueId"))) {
            attachedToNode = node;
            break;
        }
    }
    if (attachedToNode == null) {
        throw new IllegalArgumentException("Boundary Event [" + ((String) eventNode.getMetaData("UniqueId")) + "] is not attached to a node [" + attachedToId + "] that can be found.");
    }
    if (!(attachedToNode instanceof RuleSetNode || attachedToNode instanceof WorkItemNode || attachedToNode instanceof ActionNode || attachedToNode instanceof HumanTaskNode || attachedToNode instanceof CompositeNode || attachedToNode instanceof SubProcessNode)) {
        throw new IllegalArgumentException("Compensation Boundary Event [" + ((String) eventNode.getMetaData("UniqueId")) + "] must be attached to a task or sub-process.");
    }
    // - associated node is a task or subProcess
    compensationCheckPassed = false;
    if (target instanceof WorkItemNode || target instanceof HumanTaskNode || target instanceof CompositeContextNode || target instanceof SubProcessNode) {
        compensationCheckPassed = true;
    } else if (target instanceof ActionNode) {
        Object nodeTypeObj = ((ActionNode) target).getMetaData("NodeType");
        if (nodeTypeObj != null && nodeTypeObj.equals("ScriptTask")) {
            compensationCheckPassed = true;
        }
    }
    if (!compensationCheckPassed) {
        throw new IllegalArgumentException("An Activity [" + ((String) ((NodeImpl) target).getMetaData("UniqueId")) + "] associated with a Boundary Compensation Event must be a Task or a (non-Event) Sub-Process");
    }
    // - associated node does not have outgoingConnections of it's own
    compensationCheckPassed = true;
    NodeImpl targetNode = (NodeImpl) target;
    Map<String, List<org.kie.api.definition.process.Connection>> connectionsMap = targetNode.getOutgoingConnections();
    ConnectionImpl outgoingConnection = null;
    for (String connectionType : connectionsMap.keySet()) {
        List<org.kie.api.definition.process.Connection> connections = connectionsMap.get(connectionType);
        if (connections != null && !connections.isEmpty()) {
            for (org.kie.api.definition.process.Connection connection : connections) {
                Object hiddenObj = connection.getMetaData().get("hidden");
                if (hiddenObj != null && ((Boolean) hiddenObj)) {
                    continue;
                }
                outgoingConnection = (ConnectionImpl) connection;
                compensationCheckPassed = false;
                break;
            }
        }
    }
    if (!compensationCheckPassed) {
        throw new IllegalArgumentException("A Compensation Activity [" + ((String) targetNode.getMetaData("UniqueId")) + "] may not have any outgoing connection [" + (String) outgoingConnection.getMetaData("UniqueId") + "]");
    }
}
Also used : RuleSetNode(org.jbpm.workflow.core.node.RuleSetNode) CompositeContextNode(org.jbpm.workflow.core.node.CompositeContextNode) HumanTaskNode(org.jbpm.workflow.core.node.HumanTaskNode) BoundaryEventNode(org.jbpm.workflow.core.node.BoundaryEventNode) StartNode(org.jbpm.workflow.core.node.StartNode) CompositeNode(org.jbpm.workflow.core.node.CompositeNode) StateNode(org.jbpm.workflow.core.node.StateNode) RuleSetNode(org.jbpm.workflow.core.node.RuleSetNode) SubProcessNode(org.jbpm.workflow.core.node.SubProcessNode) CompositeContextNode(org.jbpm.workflow.core.node.CompositeContextNode) StateBasedNode(org.jbpm.workflow.core.node.StateBasedNode) EventSubProcessNode(org.jbpm.workflow.core.node.EventSubProcessNode) FaultNode(org.jbpm.workflow.core.node.FaultNode) WorkItemNode(org.jbpm.workflow.core.node.WorkItemNode) ActionNode(org.jbpm.workflow.core.node.ActionNode) EndNode(org.jbpm.workflow.core.node.EndNode) EventNode(org.jbpm.workflow.core.node.EventNode) Node(org.kie.api.definition.process.Node) ActionNode(org.jbpm.workflow.core.node.ActionNode) ConnectionImpl(org.jbpm.workflow.core.impl.ConnectionImpl) EventTypeFilter(org.jbpm.process.core.event.EventTypeFilter) SubProcessNode(org.jbpm.workflow.core.node.SubProcessNode) EventSubProcessNode(org.jbpm.workflow.core.node.EventSubProcessNode) WorkItemNode(org.jbpm.workflow.core.node.WorkItemNode) List(java.util.List) ArrayList(java.util.ArrayList) HumanTaskNode(org.jbpm.workflow.core.node.HumanTaskNode) NodeImpl(org.jbpm.workflow.core.impl.NodeImpl) ExtendedNodeImpl(org.jbpm.workflow.core.impl.ExtendedNodeImpl) Connection(org.jbpm.workflow.core.Connection) BoundaryEventNode(org.jbpm.workflow.core.node.BoundaryEventNode) EventFilter(org.jbpm.process.core.event.EventFilter) CompositeNode(org.jbpm.workflow.core.node.CompositeNode)

Example 28 with WorkItemNode

use of org.jbpm.workflow.core.node.WorkItemNode in project jbpm by kiegroup.

the class ReceiveTaskHandler 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);
    WorkItemNode workItemNode = (WorkItemNode) node;
    String messageRef = element.getAttribute("messageRef");
    Map<String, Message> messages = (Map<String, Message>) ((ProcessBuildData) parser.getData()).getMetaData("Messages");
    if (messages == null) {
        throw new IllegalArgumentException("No messages found");
    }
    Message message = messages.get(messageRef);
    if (message == null) {
        throw new IllegalArgumentException("Could not find message " + messageRef);
    }
    workItemNode.getWork().setParameter("MessageId", message.getId());
    workItemNode.getWork().setParameter("MessageType", message.getType());
}
Also used : Message(org.jbpm.bpmn2.core.Message) WorkItemNode(org.jbpm.workflow.core.node.WorkItemNode) Map(java.util.Map)

Example 29 with WorkItemNode

use of org.jbpm.workflow.core.node.WorkItemNode in project jbpm by kiegroup.

the class SendTaskHandler 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);
    WorkItemNode workItemNode = (WorkItemNode) node;
    String messageRef = element.getAttribute("messageRef");
    Map<String, Message> messages = (Map<String, Message>) ((ProcessBuildData) parser.getData()).getMetaData("Messages");
    if (messages == null) {
        throw new IllegalArgumentException("No messages found");
    }
    Message message = messages.get(messageRef);
    if (message == null) {
        throw new IllegalArgumentException("Could not find message " + messageRef);
    }
    workItemNode.getWork().setParameter("MessageType", message.getType());
}
Also used : Message(org.jbpm.bpmn2.core.Message) WorkItemNode(org.jbpm.workflow.core.node.WorkItemNode) Map(java.util.Map)

Example 30 with WorkItemNode

use of org.jbpm.workflow.core.node.WorkItemNode in project jbpm by kiegroup.

the class ServiceTaskHandler 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);
    WorkItemNode workItemNode = (WorkItemNode) node;
    String operationRef = element.getAttribute("operationRef");
    String implementation = element.getAttribute("implementation");
    List<Interface> interfaces = (List<Interface>) ((ProcessBuildData) parser.getData()).getMetaData("Interfaces");
    workItemNode.setMetaData("OperationRef", operationRef);
    workItemNode.setMetaData("Implementation", implementation);
    workItemNode.setMetaData("Type", "Service Task");
    if (interfaces != null) {
        // throw new IllegalArgumentException("No interfaces found");
        Operation operation = null;
        for (Interface i : interfaces) {
            operation = i.getOperation(operationRef);
            if (operation != null) {
                break;
            }
        }
        if (operation == null) {
            throw new IllegalArgumentException("Could not find operation " + operationRef);
        }
        // avoid overriding parameters set by data input associations
        if (workItemNode.getWork().getParameter("Interface") == null) {
            workItemNode.getWork().setParameter("Interface", operation.getInterface().getName());
        }
        if (workItemNode.getWork().getParameter("Operation") == null) {
            workItemNode.getWork().setParameter("Operation", operation.getName());
        }
        if (workItemNode.getWork().getParameter("ParameterType") == null) {
            workItemNode.getWork().setParameter("ParameterType", operation.getMessage().getType());
        }
        // parameters to support web service invocation
        if (implementation != null) {
            workItemNode.getWork().setParameter("interfaceImplementationRef", operation.getInterface().getImplementationRef());
            workItemNode.getWork().setParameter("operationImplementationRef", operation.getImplementationRef());
            workItemNode.getWork().setParameter("implementation", implementation);
        }
    }
}
Also used : WorkItemNode(org.jbpm.workflow.core.node.WorkItemNode) List(java.util.List) Operation(org.jbpm.bpmn2.core.Interface.Operation) Interface(org.jbpm.bpmn2.core.Interface)

Aggregations

WorkItemNode (org.jbpm.workflow.core.node.WorkItemNode)33 EndNode (org.jbpm.workflow.core.node.EndNode)15 StartNode (org.jbpm.workflow.core.node.StartNode)15 Work (org.jbpm.process.core.Work)14 ActionNode (org.jbpm.workflow.core.node.ActionNode)13 RuleFlowProcess (org.jbpm.ruleflow.core.RuleFlowProcess)12 ArrayList (java.util.ArrayList)10 WorkImpl (org.jbpm.process.core.impl.WorkImpl)10 SubProcessNode (org.jbpm.workflow.core.node.SubProcessNode)9 DroolsConsequenceAction (org.jbpm.workflow.core.impl.DroolsConsequenceAction)8 Variable (org.jbpm.process.core.context.variable.Variable)7 ObjectDataType (org.jbpm.process.core.datatype.impl.type.ObjectDataType)7 EventTypeFilter (org.jbpm.process.core.event.EventTypeFilter)7 RuleSetNode (org.jbpm.workflow.core.node.RuleSetNode)7 CompositeNode (org.jbpm.workflow.core.node.CompositeNode)6 EventSubProcessNode (org.jbpm.workflow.core.node.EventSubProcessNode)6 ForEachNode (org.jbpm.workflow.core.node.ForEachNode)6 NodeCreator (org.jbpm.process.test.NodeCreator)5 DroolsAction (org.jbpm.workflow.core.DroolsAction)5 Node (org.jbpm.workflow.core.Node)5