org.drools.bpmn2.legacy.beta1.IntermediateThrowEventHandler Maven / Gradle / Ivy
/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.bpmn2.legacy.beta1;
import java.util.Map;
import org.drools.bpmn2.core.Message;
import org.drools.compiler.xml.ProcessBuildData;
import org.drools.workflow.core.Node;
import org.drools.workflow.core.NodeContainer;
import org.drools.workflow.core.impl.DroolsConsequenceAction;
import org.drools.workflow.core.node.ActionNode;
import org.drools.xml.ExtensibleXmlParser;
import org.w3c.dom.Element;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
public class IntermediateThrowEventHandler extends AbstractNodeHandler {
protected Node createNode(Attributes attrs) {
return new ActionNode();
}
@SuppressWarnings("unchecked")
public Class generateNodeFor() {
return Node.class;
}
public Object end(final String uri, final String localName,
final ExtensibleXmlParser parser) throws SAXException {
final Element element = parser.endElementBuilder();
ActionNode node = (ActionNode) parser.getCurrent();
// determine type of event definition, so the correct type of node
// can be generated
org.w3c.dom.Node xmlNode = element.getFirstChild();
while (xmlNode != null) {
String nodeName = xmlNode.getNodeName();
if ("signalEventDefinition".equals(nodeName)) {
// reuse already created ActionNode
handleSignalNode(node, element, uri, localName, parser);
break;
} else if ("messageEventDefinition".equals(nodeName)) {
// reuse already created ActionNode
handleMessageNode(node, element, uri, localName, parser);
break;
} else if ("escalationEventDefinition".equals(nodeName)) {
// reuse already created ActionNode
handleEscalationNode(node, element, uri, localName, parser);
break;
} else if ("compensateEventDefinition".equals(nodeName)) {
// reuse already created ActionNode
handleCompensationNode(node, element, uri, localName, parser);
break;
}
xmlNode = xmlNode.getNextSibling();
}
// none event definition
if (node.getAction() == null) {
node.setAction(new DroolsConsequenceAction("mvel", ""));
node.setMetaData("NodeType", "IntermediateThrowEvent-None");
}
NodeContainer nodeContainer = (NodeContainer) parser.getParent();
nodeContainer.addNode(node);
return node;
}
public void handleSignalNode(final Node node, final Element element, final String uri,
final String localName, final ExtensibleXmlParser parser) throws SAXException {
ActionNode actionNode = (ActionNode) node;
org.w3c.dom.Node xmlNode = element.getFirstChild();
while (xmlNode != null) {
String nodeName = xmlNode.getNodeName();
if ("dataInputAssociation".equals(nodeName)) {
readDataInputAssociation(xmlNode, actionNode);
} else if ("signalEventDefinition".equals(nodeName)) {
String signalName = ((Element) xmlNode).getAttribute("signalRef");
String variable = (String) actionNode.getMetaData("MappingVariable");
actionNode.setAction(new DroolsConsequenceAction("mvel",
"kcontext.getKnowledgeRuntime().signalEvent(\""
+ signalName + "\", " + (variable == null ? "null" : variable) + ")"));
}
xmlNode = xmlNode.getNextSibling();
}
}
@SuppressWarnings("unchecked")
public void handleMessageNode(final Node node, final Element element, final String uri,
final String localName, final ExtensibleXmlParser parser) throws SAXException {
ActionNode actionNode = (ActionNode) node;
org.w3c.dom.Node xmlNode = element.getFirstChild();
while (xmlNode != null) {
String nodeName = xmlNode.getNodeName();
if ("dataInputAssociation".equals(nodeName)) {
readDataInputAssociation(xmlNode, actionNode);
} else if ("messageEventDefinition".equals(nodeName)) {
String messageRef = ((Element) xmlNode).getAttribute("messageRef");
Map messages = (Map)
((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);
}
String variable = (String) actionNode.getMetaData("MappingVariable");
actionNode.setMetaData("MessageType", message.getType());
actionNode.setAction(new DroolsConsequenceAction("java",
"org.drools.process.instance.impl.WorkItemImpl workItem = new org.drools.process.instance.impl.WorkItemImpl();" + EOL +
"workItem.setName(\"Send Task\");" + EOL +
"workItem.setParameter(\"MessageType\", \"" + message.getType() + "\");" + EOL +
(variable == null ? "" : "workItem.setParameter(\"Message\", " + variable + ");" + EOL) +
"((org.drools.process.instance.WorkItemManager) kcontext.getKnowledgeRuntime().getWorkItemManager()).internalExecuteWorkItem(workItem);"));
}
xmlNode = xmlNode.getNextSibling();
}
}
public void handleEscalationNode(final Node node, final Element element, final String uri,
final String localName, final ExtensibleXmlParser parser) throws SAXException {
ActionNode actionNode = (ActionNode) node;
org.w3c.dom.Node xmlNode = element.getFirstChild();
while (xmlNode != null) {
String nodeName = xmlNode.getNodeName();
if ("dataInputAssociation".equals(nodeName)) {
readDataInputAssociation(xmlNode, actionNode);
} else if ("escalationEventDefinition".equals(nodeName)) {
String faultName = ((Element) xmlNode).getAttribute("escalationCode");
if (faultName != null && faultName.trim().length() > 0) {
actionNode.setAction(new DroolsConsequenceAction("java",
"org.drools.process.instance.context.exception.ExceptionScopeInstance scopeInstance = (org.drools.process.instance.context.exception.ExceptionScopeInstance) ((org.drools.workflow.instance.NodeInstance) kcontext.getNodeInstance()).resolveContextInstance(org.drools.process.core.context.exception.ExceptionScope.EXCEPTION_SCOPE, \"" + faultName + "\");" + EOL +
"if (scopeInstance != null) {" + EOL +
" scopeInstance.handleException(\"" + faultName + "\", null);" + EOL +
"} else {" + EOL +
" ((org.drools.process.instance.ProcessInstance) kcontext.getProcessInstance()).setState(org.drools.process.instance.ProcessInstance.STATE_ABORTED);" + EOL +
"}"));
}
}
xmlNode = xmlNode.getNextSibling();
}
}
public void handleCompensationNode(final Node node, final Element element, final String uri,
final String localName, final ExtensibleXmlParser parser) throws SAXException {
ActionNode actionNode = (ActionNode) node;
org.w3c.dom.Node xmlNode = element.getFirstChild();
while (xmlNode != null) {
String nodeName = xmlNode.getNodeName();
if ("compensateEventDefinition".equals(nodeName)) {
String activityRef = ((Element) xmlNode).getAttribute("activityRef");
if (activityRef != null && activityRef.trim().length() > 0) {
actionNode.setMetaData("Compensate", activityRef);
actionNode.setAction(new DroolsConsequenceAction("java",
"kcontext.getProcessInstance().signalEvent(\"Compensate-" + activityRef + "\", null);"));
}
// boolean waitForCompletion = true;
// String waitForCompletionString = ((Element) xmlNode).getAttribute("waitForCompletion");
// if ("false".equals(waitForCompletionString)) {
// waitForCompletion = false;
// }
}
xmlNode = xmlNode.getNextSibling();
}
}
protected void readDataInputAssociation(org.w3c.dom.Node xmlNode, ActionNode actionNode) {
// sourceRef
org.w3c.dom.Node subNode = xmlNode.getFirstChild();
String eventVariable = subNode.getTextContent();
if (eventVariable != null && eventVariable.trim().length() > 0) {
actionNode.setMetaData("MappingVariable", eventVariable);
}
}
public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
throw new IllegalArgumentException("Writing out should be handled by action node handler");
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy