/**
* 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 java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.xml.xpath.XPathConstants;
import org.apache.ode.utils.xsd.Duration;
import org.drools.bpel.core.BPELWait;
import org.drools.bpel.xpath.XPathReturnValueEvaluator;
import org.drools.process.core.timer.Timer;
import org.drools.process.instance.ProcessInstance;
import org.drools.spi.ProcessContext;
import org.drools.workflow.instance.NodeInstance;
import org.drools.workflow.instance.node.TimerNodeInstance;
import org.w3c.dom.Element;
/**
*
* @author <a href="mailto:kris_verlaenen@hotmail.com">Kris Verlaenen</a>
*/
public class BPELWaitInstance extends TimerNodeInstance {
private static final long serialVersionUID = 510l;
public BPELWait getBPELWait() {
return (BPELWait) getNode();
}
public void internalTrigger(NodeInstance from, String type) {
if (BPELLinkManager.checkActivityEnabled(this)) {
super.internalTrigger(from, type);
}
}
protected Timer createTimer() {
Timer timer = new Timer();
BPELWait wait = getBPELWait();
if (wait.getForExpression() != null) {
timer.setDelay(getTimerDelayFor(wait.getForExpression()));
} else if (wait.getUntilExpression() != null) {
timer.setDelay(getTimerDelayUntil(wait.getUntilExpression()));
}
timer.setPeriod("0");
return timer;
}
private String getTimerDelayFor(String forExpression) {
try {
XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
evaluator.setExpression(forExpression);
ProcessContext processContext = new ProcessContext();
processContext.setNodeInstance(this);
String literal = (String) evaluator.evaluate(
((ProcessInstance) getProcessInstance()).getWorkingMemory(), processContext, XPathConstants.STRING);
Calendar cal = Calendar.getInstance();
Duration duration = new Duration(literal);
duration.addTo(cal);
long delay = cal.getTime().getTime() - Calendar.getInstance().getTime().getTime();
if (delay < 0) {
delay = 0;
}
return delay + "";
} catch (Throwable t) {
throw new IllegalArgumentException(
"Could not get timer delay for", t);
}
}
private String getTimerDelayUntil(String untilExpression) {
try {
XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
evaluator.setExpression(untilExpression);
ProcessContext processContext = new ProcessContext();
processContext.setNodeInstance(this);
List<?> literal = (List<?>) evaluator.evaluate(
((ProcessInstance) getProcessInstance()).getWorkingMemory(), processContext, XPathConstants.NODESET);
Calendar calendar = null;
if (literal.size() == 0) {
throw new IllegalArgumentException("No results for timer until");
}
if (literal.size() > 1) {
throw new IllegalArgumentException("Multiple results for timer until");
}
Object date = literal.get(0);
if (date instanceof Calendar) {
calendar = (Calendar) date;
} else if (date instanceof Date) {
calendar = Calendar.getInstance();
calendar.setTime((Date) date);
} else if (date instanceof Element) {
date = ((Element) date).getTextContent();
// TODO
}
long delay = calendar.getTime().getTime() - Calendar.getInstance().getTime().getTime();
if (delay < 0) {
delay = 0;
}
return delay + "";
} catch (Throwable t) {
throw new IllegalArgumentException(
"Could not get timer delay until", t);
}
}
public void triggerCompleted() {
super.triggerCompleted();
BPELLinkManager.activateTargetLinks(this);
}
}