/**
* 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.bpel.instance;
import org.drools.bpel.core.BPELActivity;
import org.drools.bpel.core.BPELActivity.SourceLink;
import org.drools.bpel.core.BPELActivity.TargetLink;
import org.drools.bpel.xpath.XPathReturnValueEvaluator;
import org.drools.core.util.ArrayUtils;
import org.drools.process.instance.ProcessInstance;
import org.drools.runtime.process.NodeInstance;
import org.drools.runtime.process.NodeInstanceContainer;
import org.drools.spi.ProcessContext;
import org.drools.workflow.instance.impl.NodeInstanceImpl;
/**
*
* @author <a href="mailto:kris_verlaenen@hotmail.com">Kris Verlaenen</a>
*/
public final class BPELLinkManager {
private BPELLinkManager() {
}
private static SourceLink[] getSourceLinks(NodeInstance activityInstance) {
return ((BPELActivity)
((NodeInstanceImpl) activityInstance).getNode())
.getSourceLinks();
}
private static TargetLink[] getTargetLinks(NodeInstance activityInstance) {
return ((BPELActivity)
((NodeInstanceImpl) activityInstance).getNode())
.getTargetLinks();
}
public static boolean checkActivityEnabled(NodeInstance activityInstance) {
boolean enabled = true;
TargetLink[] incomingLinks = getTargetLinks(activityInstance);
if (incomingLinks != null) {
for (int i = 0; i < incomingLinks.length; i++) {
BPELFlowInstance flowInstance = getFlowInstance(activityInstance, incomingLinks[i].getLinkName());
if (!flowInstance.isLinkActive(incomingLinks[i].getLinkName())) {
enabled = false;
flowInstance.addWaitingActivityInstance(activityInstance, incomingLinks[i].getLinkName());
}
}
}
return enabled;
}
public static void activateTargetLinks(NodeInstance activityInstance) {
SourceLink[] outgoingLinks = getSourceLinks(activityInstance);
if (outgoingLinks != null) {
for (int i = 0; i < outgoingLinks.length; i++) {
BPELFlowInstance flowInstance = getFlowInstance(activityInstance, outgoingLinks[i].getLinkName());
String transitionCondition = outgoingLinks[i].getTransitionCondition();
if (transitionCondition == null || evaluateTransitionCondition(transitionCondition, activityInstance)) {
flowInstance.activateLink(outgoingLinks[i].getLinkName());
}
}
}
}
private static BPELFlowInstance getFlowInstance(NodeInstance activityInstance, String linkName) {
NodeInstanceContainer parent = activityInstance.getNodeInstanceContainer();
while (!(parent instanceof BPELFlowInstance)
|| !ArrayUtils.contains(((BPELFlowInstance) parent).getBPELFlow().getLinks(), linkName)) {
parent = ((NodeInstance) parent).getNodeInstanceContainer();
}
return (BPELFlowInstance) parent;
}
private static boolean evaluateTransitionCondition(String transitionCondition, NodeInstance activityInstance) {
try {
XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
evaluator.setExpression(transitionCondition);
ProcessContext processContext = new ProcessContext();
processContext.setNodeInstance(activityInstance);
return (Boolean) evaluator.evaluate(((ProcessInstance) activityInstance.getProcessInstance()).getWorkingMemory(), processContext);
} catch (Throwable t) {
throw new IllegalArgumentException("Could not evaluate transition condition " + transitionCondition, t);
}
}
}