[jbpm-commits] JBoss JBPM SVN: r1737 - in jbpm4/pvm/trunk/modules/core/src: main/java/org/jbpm/pvm/internal/jobexecutor and 6 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Mon Jul 28 10:22:18 EDT 2008
Author: tom.baeyens at jboss.com
Date: 2008-07-28 10:22:17 -0400 (Mon, 28 Jul 2008)
New Revision: 1737
Added:
jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TestTimerSession.java
jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TestTimerSessionBinding.java
jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerConfiguration.java
jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerIntegrationTest.java
jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerUnitTest.java
Removed:
jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/DbTimerTests.java
jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerTest.java
Modified:
jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java
jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/jobexecutor/JobTestTimerSession.java
jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java
jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java
jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/model/ProcessFactory.java
jbpm4/pvm/trunk/modules/core/src/main/resources/org/jbpm/pvm/hibernate.definition.hbm.xml
jbpm4/pvm/trunk/modules/core/src/main/resources/org/jbpm/pvm/hibernate.job.hbm.xml
jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/DbTests.java
jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/pvm.wire.bindings.xml
jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/IncrementCounterWaitState.java
jbpm4/pvm/trunk/modules/core/src/test/resources/org/jbpm/pvm/timer/environment.cfg.xml
Log:
revert pascal's timer patch
Modified: jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -21,7 +21,6 @@
*/
package org.jbpm.pvm.internal.job;
-import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -34,7 +33,6 @@
import org.jbpm.pvm.internal.jobexecutor.JobAddedNotification;
import org.jbpm.pvm.internal.jobexecutor.JobExecutor;
import org.jbpm.pvm.internal.log.Log;
-import org.jbpm.pvm.internal.script.ScriptManager;
import org.jbpm.pvm.internal.util.Clock;
import org.jbpm.pvm.job.Timer;
import org.jbpm.pvm.model.ObservableElement;
@@ -55,115 +53,45 @@
private static final long serialVersionUID = 1L;
private static final Log log = Log.getLog(TimerImpl.class.getName());
- private static String dateFormat = "yyyy-MM-dd HH:mm:ss,SSS";
+ private final static String dateFormat = "yyyy-MM-dd HH:mm:ss,SSS";
protected String signalName;
protected String eventName;
protected String repeat;
- protected String language;
public static final String EVENT_TIMER = "timer";
public TimerImpl() {
}
- private static Date getDateFromDuration(String expression) {
- Duration duration = new Duration(expression);
+ public void setDueDateDescription(String dueDateDescription) {
+ Duration duration = new Duration(dueDateDescription);
Date now = Clock.getCurrentTime();
- Date result = null;
-
+
if ( duration.isBusinessTime()
- || duration.getMonths()>0
- || duration.getYears()>0
- ) {
+ || duration.getMonths()>0
+ || duration.getYears()>0
+ ) {
Environment environment = Environment.getCurrent();
if (environment==null) {
- log.debug("no environment to get business calendar for calculating dueDate "+expression);
- } else {
- BusinessCalendar businessCalendar = environment.get(BusinessCalendar.class);
- if (businessCalendar==null) {
- log.debug("no business calendar to calculate dueDate "+expression);
- } else {
- result = businessCalendar.add(now, duration);
- }
+ throw new PvmException("no environment to get business calendar for calculating dueDate "+dueDateDescription);
}
+ BusinessCalendar businessCalendar = environment.get(BusinessCalendar.class);
+ dueDate = businessCalendar.add(now, duration);
+
} else {
long millis = duration.getMillis() +
- 1000*( duration.getSeconds() +
- 60*( duration.getMinutes() +
- 60*( duration.getHours() +
- 24*( duration.getDays() +
- 7*duration.getWeeks()))));
- result = new Date(now.getTime() + millis);
+ 1000*( duration.getSeconds() +
+ 60*( duration.getMinutes() +
+ 60*( duration.getHours() +
+ 24*( duration.getDays() +
+ 7*duration.getWeeks()))));
+ dueDate = new Date(now.getTime() + millis);
}
- return result;
}
- private Object evaluateExpression(String expression) {
- Object result = null;
- Environment environment = Environment.getCurrent();
- if (environment==null) {
- log.debug("no environment to get script manager to evaluate "+expression);
- } else {
- ScriptManager scriptManager = environment.getEnvironmentFactory().get(ScriptManager.class);
- if (scriptManager==null) {
- log.debug("no script manager to evaluate "+expression);
- } else {
- log.debug("evaluates "+expression);
- result = scriptManager.evaluateExpression(expression, execution, language);
- }
- }
- return result;
- }
-
- public void setDueDateDescription(String expression) {
- Exception exception = null;
- Object dueDateDescription = evaluateExpression(expression);
-
- // now we analyse the description
- Date date = null;
- // date?
- if (dueDateDescription instanceof Date) {
- date = (Date)dueDateDescription;
- } else if (dueDateDescription instanceof String) {
- // formatted date?
- try {
- date = new SimpleDateFormat(dateFormat).parse((String) dueDateDescription);
- } catch (ParseException e) {
- // not a formatted date
- exception = e;
- }
-
- // duration?
- try {
- date = getDateFromDuration((String) dueDateDescription);
- } catch (PvmException e) {
- // not a duration
- exception = e;
- }
- } else {
- throw new PvmException("invalid timer's dueDateDescription");
- }
-
- if (date!=null) {
- setDueDate(date);
- } else {
- throw new PvmException("Unable to set dueDate from " + expression+". " +
- "This might be a environment configuration error", exception);
- }
- }
-
- private void repeatTimer(String repeat) {
- Object description = evaluateExpression(repeat);
- if (description instanceof String && description!=null) {
- setDueDate(getDateFromDuration((String)description));
- } else {
- throw new PvmException("invalid timer's repeat: "+repeat);
- }
- }
-
public Boolean execute(Environment environment) throws Exception {
- log.debug("executing " + this);
+ if (log.isDebugEnabled()) log.debug("executing " + this);
if (environment==null) {
throw new PvmException("environment is null");
@@ -173,13 +101,13 @@
environment.addContext(jobContext);
try {
if (signalName!=null) {
- log.debug("feeding timer signal "+signalName+" into "+execution);
+ if (log.isDebugEnabled()) log.debug("feeding timer signal "+signalName+" into "+execution);
execution.signal(signalName);
}
if (eventName!=null) {
ObservableElement eventSource = execution.getNode();
- log.debug("firing event "+signalName+" into "+eventSource);
+ if (log.isDebugEnabled()) log.debug("firing event "+signalName+" into "+eventSource);
execution.fire(eventName, eventSource);
}
@@ -191,7 +119,7 @@
// if there is no repeat on this timer
if (repeat==null) {
// delete the jobImpl
- log.debug("deleting " + this);
+ if (log.isDebugEnabled()) log.debug("deleting " + this);
DbSession dbSession = environment.get(DbSession.class);
if (dbSession==null) {
throw new PvmException("no "+DbSession.class.getName()+" in environment");
@@ -203,10 +131,10 @@
// suppose that it took the timer runner thread a very long time to execute the timers
// then the repeat action dueDate could already have passed
do {
- repeatTimer(repeat);
+ setDueDateDescription(repeat);
} while (dueDate.getTime() <= Clock.getCurrentTime().getTime());
- log.debug("rescheduled "+this+" for "+formatDueDate(dueDate));
+ if (log.isDebugEnabled()) log.debug("rescheduled "+this+" for "+formatDueDate(dueDate));
// release the lock on the timer
setLockOwner(null);
@@ -250,9 +178,6 @@
public static String formatDueDate(Date date) {
return new SimpleDateFormat(dateFormat).format(date);
}
- public static void setDateFormat(String dateFormat) {
- TimerImpl.dateFormat = dateFormat;
- }
public String getSignalName() {
return signalName;
@@ -272,14 +197,4 @@
public void setRepeat(String repeat) {
this.repeat = repeat;
}
-
-
- public String getLanguage() {
- return language;
- }
-
-
- public void setLanguage(String language) {
- this.language = language;
- }
}
Modified: jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/jobexecutor/JobTestTimerSession.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/jobexecutor/JobTestTimerSession.java 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/jobexecutor/JobTestTimerSession.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -28,7 +28,6 @@
/**
* @author Tom Baeyens
- * @author Pascal Verdage
*/
public class JobTestTimerSession implements TimerSession {
@@ -36,15 +35,11 @@
Session session;
public void schedule(Timer timer) {
- if (session!=null) {
- session.save(timer);
- }
+ session.save(timer);
}
public void cancel(Timer timer) {
- if (session!=null) {
- session.delete(timer);
- }
+ session.delete(timer);
}
}
Modified: jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -25,6 +25,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
@@ -75,7 +76,6 @@
/**
* @author Tom Baeyens
- * @author Pascal Verdage
*/
public class ExecutionImpl implements ClientProcessInstance,
ActivityExecution,
@@ -792,8 +792,8 @@
createTimer(
timerDefinition.getEventName(),
timerDefinition.getSignalName(),
- timerDefinition.getExpression(),
- timerDefinition.getLanguage(),
+ timerDefinition.getDueDateDescription(),
+ timerDefinition.getDueDate(),
timerDefinition.getRepeat(),
timerDefinition.isExclusive(),
timerDefinition.getRetries()
@@ -822,16 +822,15 @@
}
}
- public void createTimer(String eventName, String signalName, String expression) {
- createTimer(eventName, signalName, expression, null, null, null, null);
+ public void createTimer(String eventName, String signalName, String dueDateDescription) {
+ createTimer(eventName, signalName, dueDateDescription, null, null, null, null);
}
- public void createTimer(String eventName, String signalName, String expression, String repeat) {
- createTimer(eventName, signalName, expression, null, repeat, null, null);
+ public void createTimer(String eventName, String signalName, String dueDateDescription, String repeat) {
+ createTimer(eventName, signalName, dueDateDescription, null, repeat, null, null);
}
- public void createTimer(String eventName, String signalName, String expression,
- String language, String repeat, Boolean isExclusive, Integer retries) {
+ public void createTimer(String eventName, String signalName, String dueDateDescription, Date dueDate, String repeat, Boolean isExclusive, Integer retries) {
if ( (eventName==null)
&& (signalName==null)
) {
@@ -847,17 +846,16 @@
timerImpl.setExecution(this);
timers.add(timerImpl);
hasTimers = true;
+ // setInverseReference(timerImpl);
- // initialize all the timer properties
+ // initialise all the timer properties
timerImpl.setEventName(eventName);
timerImpl.setSignalName(signalName);
-
- // the if is added to keep the original default
- if (language!=null) {
- timerImpl.setLanguage(language);
+ if (dueDate!=null) {
+ timerImpl.setDueDate(dueDate);
+ } else {
+ timerImpl.setDueDateDescription(dueDateDescription);
}
- // language has to be set before expression
- timerImpl.setDueDateDescription(expression);
// the if is added to keep the original default
if (isExclusive!=null) {
Modified: jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -22,6 +22,7 @@
package org.jbpm.pvm.internal.model;
import java.io.Serializable;
+import java.util.Date;
/**
@@ -34,13 +35,13 @@
protected long dbid;
protected int dbversion;
- protected String expression;
- protected String language;
+ protected String dueDateDescription;
protected String repeat;
protected Boolean isExclusive;
protected Integer retries;
protected String eventName;
protected String signalName;
+ protected Date dueDate;
public TimerDefinitionImpl() {
}
@@ -54,6 +55,12 @@
public long getDbid() {
return dbid;
}
+ public String getDueDateDescription() {
+ return dueDateDescription;
+ }
+ public void setDueDateDescription(String dueDateDescription) {
+ this.dueDateDescription = dueDateDescription;
+ }
public Boolean isExclusive() {
return isExclusive;
}
@@ -78,20 +85,10 @@
public void setEventName(String eventName) {
this.eventName = eventName;
}
-
- public String getExpression() {
- return expression;
+ public Date getDueDate() {
+ return dueDate;
}
-
- public void setExpression(String expression) {
- this.expression = expression;
+ public void setDueDate(Date dueDate) {
+ this.dueDate = dueDate;
}
-
- public String getLanguage() {
- return language;
- }
-
- public void setLanguage(String language) {
- this.language = language;
- }
}
Modified: jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/model/ProcessFactory.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/model/ProcessFactory.java 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/main/java/org/jbpm/pvm/model/ProcessFactory.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -22,6 +22,7 @@
package org.jbpm.pvm.model;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import java.util.Stack;
@@ -191,26 +192,34 @@
}
/** declares a timer on the current node or process. {@link #scope()} is
- * automatically implied.
- * @param expression can be a formatted date or duration
- * or an expression in the default expression language if defined */
- public ProcessFactory timer(String expression, String signalName) {
- return timer(expression, null, signalName, null);
+ * automatically implied. */
+ public ProcessFactory timer(String dueDateDescription, String signalName) {
+ return timer(dueDateDescription, null, signalName, null);
}
/** declares a timer on the current node or process. {@link #scope()} is
- * automatically implied.
- * @param expression can be a formatted date or duration
- * or an expression in the given language.
- * @param language is a supposed known language (environment configuration) */
- public ProcessFactory timer(String expression, String language,
- String signalName, String repeat) {
+ * automatically implied. */
+ public ProcessFactory timer(String dueDateDescription, String signalName, String repeat) {
+ return timer(dueDateDescription, null, signalName, repeat);
+ }
+
+ /** declares a timer on the current node or process. {@link #scope()} is
+ * automatically implied. */
+ public ProcessFactory timer(Date dueDate, String signalName) {
+ return timer(null, dueDate, signalName, null);
+ }
+
+ protected ProcessFactory timer(String dueDateDescription, Date dueDate,
+ String signalName, String repeat) {
if (node!=null && scope==null) {
scope();
}
TimerDefinitionImpl timerDefinition = scope.createTimerDefinition();
- timerDefinition.setExpression(expression);
- timerDefinition.setLanguage(language);
+ if (dueDate!=null) {
+ timerDefinition.setDueDate(dueDate);
+ } else {
+ timerDefinition.setDueDateDescription(dueDateDescription);
+ }
timerDefinition.setSignalName(signalName);
timerDefinition.setRepeat(repeat);
return this;
Modified: jbpm4/pvm/trunk/modules/core/src/main/resources/org/jbpm/pvm/hibernate.definition.hbm.xml
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/main/resources/org/jbpm/pvm/hibernate.definition.hbm.xml 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/main/resources/org/jbpm/pvm/hibernate.definition.hbm.xml 2008-07-28 14:22:17 UTC (rev 1737)
@@ -378,13 +378,13 @@
<generator class="native" />
</id>
<version name="dbversion" column="DBVERSION_" />
- <property name="expression" column="EXPRESSION_"/>
- <property name="language" column="LANGUAGE_"/>
+ <property name="dueDateDescription" column="DUEDATEDESCR_"/>
<property name="repeat" column="REPEAT_"/>
<property name="isExclusive" column="ISEXCL_"/>
<property name="retries" column="RETRIES_"/>
<property name="eventName" column="EVENT_"/>
<property name="signalName" column="SIGNAL_"/>
+ <property name="dueDate" column="DUEDATE_" type="timestamp"/>
</class>
<!-- ### QUERIES ######################################################## -->
Modified: jbpm4/pvm/trunk/modules/core/src/main/resources/org/jbpm/pvm/hibernate.job.hbm.xml
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/main/resources/org/jbpm/pvm/hibernate.job.hbm.xml 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/main/resources/org/jbpm/pvm/hibernate.job.hbm.xml 2008-07-28 14:22:17 UTC (rev 1737)
@@ -49,7 +49,6 @@
<property name="signalName" column="SIGNAL_" />
<property name="eventName" column="EVENT_" />
<property name="repeat" column="REPEAT_" />
- <property name="language" column="LANGUAGE_" />
</subclass>
</class>
Modified: jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/DbTests.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/DbTests.java 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/DbTests.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -28,7 +28,6 @@
import org.jbpm.pvm.db.model.DbModelTests;
import org.jbpm.pvm.db.svc.DbSvcTests;
import org.jbpm.pvm.jobexecutor.JobExecutorTests;
-import org.jbpm.pvm.timer.DbTimerTests;
/**
@@ -44,8 +43,7 @@
suite.addTest(DbModelTests.suite());
suite.addTest(DbSvcTests.suite());
suite.addTest(JobExecutorTests.suite());
- suite.addTest(DbTimerTests.suite());
-
+
//$JUnit-END$
return suite;
}
Modified: jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/pvm.wire.bindings.xml
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/pvm.wire.bindings.xml 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/pvm.wire.bindings.xml 2008-07-28 14:22:17 UTC (rev 1737)
@@ -1,2 +1,5 @@
<wire-bindings>
+
+ <binding class="org.jbpm.pvm.timer.TestTimerSessionBinding" />
+
</wire-bindings>
Deleted: jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/DbTimerTests.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/DbTimerTests.java 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/DbTimerTests.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -1,17 +0,0 @@
-package org.jbpm.pvm.timer;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-
-public class DbTimerTests {
-
- public static Test suite() {
- TestSuite suite = new TestSuite("Test for org.jbpm.pvm.timer");
- //$JUnit-BEGIN$
- suite.addTestSuite(TimerTest.class);
- //$JUnit-END$
- return suite;
- }
-
-}
Modified: jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/IncrementCounterWaitState.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/IncrementCounterWaitState.java 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/IncrementCounterWaitState.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -53,10 +53,8 @@
}
}
if (continueToWait) {
- log.debug("continue to wait");
execution.waitForSignal();
} else {
- log.debug("take a timeout transition");
execution.take("timeout");
}
}
Added: jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TestTimerSession.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TestTimerSession.java (rev 0)
+++ jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TestTimerSession.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -0,0 +1,85 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.timer;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.jbpm.pvm.env.Environment;
+import org.jbpm.pvm.internal.job.TimerImpl;
+import org.jbpm.pvm.job.Timer;
+import org.jbpm.pvm.session.TimerSession;
+
+/**
+ * @author Tom Baeyens
+ * @author Pascal Verdage
+ */
+public class TestTimerSession implements TimerSession {
+
+ private static final long serialVersionUID = 1L;
+
+ protected List<TimerImpl> timers = new ArrayList<TimerImpl>();
+
+ public void cancel(Timer timer) {
+ timers.remove(timer);
+ }
+
+ public void schedule(Timer timer) {
+ timers.add((TimerImpl)timer);
+ }
+
+ /** execute the first timer (ordered by dueDate)
+ * @throws Exception */
+ public void executeFirstTimer() throws Exception {
+ TimerImpl timerImpl = getFirstTimer();
+ if (timerImpl != null) {
+ TimerConfiguration.getEnvironmentFactory().openEnvironment();
+ try {
+ boolean deleteThisJob = timerImpl.execute(Environment.getCurrent());
+ if (deleteThisJob) {
+ timers.remove(timerImpl);
+ }
+ } finally {
+ Environment.getCurrent().close();
+ }
+ }
+ }
+
+ /** return the first timer (ordered by dueDate) */
+ public TimerImpl getFirstTimer() {
+ TimerImpl firstTimer = null;
+ Date firstDueDate = new Date(Long.MAX_VALUE);
+ for (TimerImpl timerImpl : timers) {
+ if (firstDueDate.after(timerImpl.getDueDate())) {
+ firstTimer = timerImpl;
+ firstDueDate = timerImpl.getDueDate();
+ }
+ }
+ return firstTimer;
+ }
+
+ /** return the number of scheduled timers */
+ public int getNbTimer() {
+ return timers.size();
+ }
+}
Added: jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TestTimerSessionBinding.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TestTimerSessionBinding.java (rev 0)
+++ jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TestTimerSessionBinding.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.timer;
+
+import org.jbpm.pvm.internal.util.TagBinding;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TestTimerSessionBinding extends TagBinding {
+
+ public TestTimerSessionBinding() {
+ super("test-timer-session", null, WireParser.CATEGORY_DESCRIPTOR);
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new ObjectDescriptor(TestTimerSession.class);
+ }
+
+}
Added: jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerConfiguration.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerConfiguration.java (rev 0)
+++ jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerConfiguration.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -0,0 +1,50 @@
+ package org.jbpm.pvm.timer;
+
+import org.jbpm.pvm.ExecutionService;
+import org.jbpm.pvm.ManagementService;
+import org.jbpm.pvm.ProcessService;
+import org.jbpm.pvm.env.EnvironmentFactory;
+import org.jbpm.pvm.env.PvmEnvironmentFactory;
+
+/**
+ * @author Pascal Verdage
+ */
+public abstract class TimerConfiguration {
+
+ static boolean isInitialized;
+ static ProcessService processService;
+ static ExecutionService executionService;
+ static ManagementService managementService;
+ static EnvironmentFactory environmentFactory;
+
+ public static ProcessService getProcessService() {
+ initialize();
+ return processService;
+ }
+
+ public static ExecutionService getExecutionService() {
+ initialize();
+ return executionService;
+ }
+
+ public static ManagementService getManagementService() {
+ initialize();
+ return managementService;
+ }
+
+ public static EnvironmentFactory getEnvironmentFactory() {
+ initialize();
+ return environmentFactory;
+ }
+
+ private synchronized static void initialize() {
+ if (!isInitialized) {
+ isInitialized = true;
+ environmentFactory = new PvmEnvironmentFactory("org/jbpm/pvm/timer/environment.cfg.xml");
+ processService = environmentFactory.get(ProcessService.class);
+ executionService = environmentFactory.get(ExecutionService.class);
+ managementService = environmentFactory.get(ManagementService.class);
+ }
+ }
+
+}
Added: jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerIntegrationTest.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerIntegrationTest.java (rev 0)
+++ jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerIntegrationTest.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -0,0 +1,342 @@
+/**
+ * Copyright (C) 2006 Bull S. A. S.
+ * Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois
+ * This library is free software; you can redistribute it and/or modify it under the terms
+ * of the GNU Lesser General Public License as published by the Free Software Foundation
+ * version 2.1 of the License.
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License along with this
+ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
+ * Floor, Boston, MA 02110-1301, USA.
+ **/
+package org.jbpm.pvm.timer;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.jbpm.pvm.Execution;
+import org.jbpm.pvm.ExecutionService;
+import org.jbpm.pvm.ProcessService;
+import org.jbpm.pvm.activity.ActivityExecution;
+import org.jbpm.pvm.activity.ExternalActivity;
+import org.jbpm.pvm.env.Environment;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.NodeImpl;
+import org.jbpm.pvm.internal.util.Clock;
+import org.jbpm.pvm.job.JobTestHelper;
+import org.jbpm.pvm.job.Timer;
+import org.jbpm.pvm.model.OpenExecution;
+import org.jbpm.pvm.model.ProcessDefinition;
+import org.jbpm.pvm.model.ProcessFactory;
+import org.jbpm.pvm.samples.activities.AutomaticActivity;
+import org.jbpm.pvm.session.DbSession;
+import org.jbpm.pvm.session.PvmDbSession;
+import org.jbpm.pvm.test.base.DbTestCase;
+
+/**
+ * @author Pascal Verdage
+ */
+public class TimerIntegrationTest extends DbTestCase {
+ public static class WaitState implements ExternalActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) {
+ execution.waitForSignal();
+ }
+
+ public void signal(ActivityExecution execution,
+ String signalName,
+ Map<String, Object> parameters) {
+ if (signalName!=null) {
+ execution.take(signalName);
+ }
+ }
+ }
+
+ private static Date getDueDate(long duration) {
+ return new Date(System.currentTimeMillis() + duration);
+ }
+
+ private static long twoDaysDuration = 2*24*60*60*1000;
+
+ private static ExecutionService getExecutionService() {
+ return Environment.getCurrent().get(ExecutionService.class);
+ }
+
+ private static ExecutionImpl deployAndInstanciateProcess(ProcessDefinition definition) {
+ ProcessService processService = Environment.getCurrent().get(ProcessService.class);
+ processService.deploy(definition);
+
+ Execution processInstance = getExecutionService().startExecution(definition.getName());
+
+ return (ExecutionImpl) processInstance;
+ }
+
+ public void testTimerDefinition() {
+ ProcessDefinition processDefinition = ProcessFactory.build("timerDefinition")
+ .node("request").initial().behaviour(WaitState.class)
+ .transition().to("decide")
+ .node("decide").behaviour(WaitState.class)
+ .timer(getDueDate(twoDaysDuration), "timeout")
+ .transition("decision made").to("response") // first defined transition is the default one
+ .transition("timeout").to("reassign")
+ .node("reassign").behaviour(WaitState.class)
+ .node("response").behaviour(WaitState.class)
+ .done();
+
+ ExecutionImpl processInstance = deployAndInstanciateProcess(processDefinition);
+
+ Execution execution = processInstance;
+ assertEquals("request", execution.getNodeName());
+ // first node is a wait state with no timer
+ execution = getExecutionService().signalExecution(execution.getDbid());
+ assertEquals("decide", execution.getNodeName());
+
+ assertTrue(execution instanceof OpenExecution);
+ OpenExecution openExecution = (OpenExecution) execution;
+
+ // timer are created in a child execution
+ assertFalse(openExecution.hasTimers());
+
+ assertEquals(1, openExecution.getExecutions().size());
+ OpenExecution child = openExecution.getExecutions().iterator().next();
+
+ NodeImpl node1 = (NodeImpl) openExecution.getNode();
+ NodeImpl node2 = (NodeImpl) child.getNode();
+ assertEquals(node1, node2);
+ assertEquals("decide", node1.getName());
+ assertNotNull(node1.getTimerDefinitions());
+
+ assertTrue(child.hasTimers());
+ Set<Timer> timers = child.getTimers();
+ assertEquals(1, timers.size());
+ }
+
+ private static ExecutionImpl loadExecutionFromDb(long id) {
+ return Environment.getCurrent().get(DbSession.class).get(ExecutionImpl.class, id);
+ }
+
+ public void testTimerExecution() {
+ ProcessDefinition processDefinition = ProcessFactory.build("timerExecution")
+ .node("decide").initial().behaviour(WaitState.class)
+ .timer(getDueDate(twoDaysDuration), "timeout")
+ .transition("decision made").to("response") // first defined transition is the default one
+ .transition("timeout").to("reassign")
+ .node("reassign").behaviour(WaitState.class)
+ .node("response").behaviour(WaitState.class)
+ .done();
+
+ ExecutionImpl processInstance = deployAndInstanciateProcess(processDefinition);
+
+ Execution execution = processInstance;
+ assertEquals("decide", execution.getNodeName());
+
+ OpenExecution child = ((OpenExecution) execution).getExecutions().iterator().next();
+ assertEquals("decide", child.getNodeName());
+ Timer timer = child.getTimers().iterator().next();
+
+ JobTestHelper jobTestHelper = getEnvironmentFactory().get(JobTestHelper.class);
+ child = (OpenExecution) jobTestHelper.executeTimer(timer.getDbid());
+ assertEquals(Execution.STATE_ENDED, child.getState());
+
+ // check that the subExecution was deleted
+ child = loadExecutionFromDb(child.getDbid());
+ assertNull(child);
+
+ // check that timers have been deleted
+ List<Timer> timers = Environment.getCurrent().get(PvmDbSession.class).findTimers();
+ assertNotNull(timers);
+ assertTrue(timers.isEmpty());
+
+ // check that process is in the right state
+ execution = loadExecutionFromDb(processInstance.getDbid());
+ assertEquals("reassign", execution.getNodeName());
+ }
+
+ public void testCanceledTimer() {
+ ProcessDefinition processDefinition = ProcessFactory.build("timerCanceled")
+ .node("decide").initial().behaviour(WaitState.class)
+ .timer(getDueDate(twoDaysDuration), "timeout")
+ .transition("decision made").to("response") // first defined transition is the default one
+ .transition("timeout").to("reassign")
+ .node("reassign").behaviour(WaitState.class)
+ .node("response").behaviour(WaitState.class)
+ .done();
+
+ ExecutionImpl processInstance = deployAndInstanciateProcess(processDefinition);
+
+ Execution execution = processInstance;
+ assertEquals("decide", execution.getNodeName());
+
+ // signal child execution
+ Execution child = ((OpenExecution)execution).getExecutions().iterator().next();
+ execution = getExecutionService().signalExecution(child.getDbid());
+ assertEquals(Execution.STATE_ENDED, execution.getState());
+
+ // check that the subExecution was deleted
+ child = loadExecutionFromDb(child.getDbid());
+ assertNull(child);
+
+ // check that timers have been deleted
+ List<Timer> timers = Environment.getCurrent().get(PvmDbSession.class).findTimers();
+ assertNotNull(timers);
+ assertTrue(timers.isEmpty());
+
+ // check that process is in the right state
+ execution = loadExecutionFromDb(processInstance.getDbid());
+ assertEquals("response", execution.getNodeName());
+ }
+
+ public void testFixedDateTimer() {
+ Date now = new Date();
+ long twoDaysFromNow = now.getTime() + twoDaysDuration;
+
+ ProcessDefinition processDefinition = ProcessFactory.build("fixedDateTimer")
+ .node("decide").initial().behaviour(WaitState.class)
+ .timer(getDueDate(twoDaysDuration), "timeout")
+ .transition("decision made").to("response") // first defined transition is the default one
+ .transition("timeout").to("reassign")
+ .node("reassign").behaviour(WaitState.class)
+ .node("response").behaviour(WaitState.class)
+ .done();
+
+ ExecutionImpl processInstance = deployAndInstanciateProcess(processDefinition);
+
+ Execution execution = processInstance;
+ OpenExecution child = ((OpenExecution) execution).getExecutions().iterator().next();
+ assertEquals("decide", child.getNodeName());
+
+ // check that timer's dueDate is good
+ Timer timer = child.getTimers().iterator().next();
+ assertTrue(twoDaysFromNow <= timer.getDueDate().getTime());
+
+ // timer execution is tested in testTimerExecution
+ }
+
+ public void testDueDateDescriptionTimer() {
+ Date now = new Date();
+ long twoDaysFromNow = now.getTime() + twoDaysDuration;
+
+ ProcessDefinition processDefinition = ProcessFactory.build("dueDateDescriptionTimer")
+ .node("decide").initial().behaviour(WaitState.class)
+ .timer("2 days", "timeout")
+ .transition("decision made").to("response") // first defined transition is the default one
+ .transition("timeout").to("reassign")
+ .node("reassign").behaviour(WaitState.class)
+ .node("response").behaviour(WaitState.class)
+ .done();
+
+ ExecutionImpl processInstance = deployAndInstanciateProcess(processDefinition);
+
+ Execution execution = processInstance;
+ OpenExecution child = ((OpenExecution) execution).getExecutions().iterator().next();
+ assertEquals("decide", child.getNodeName());
+
+ // check that timer's dueDate is good
+ Timer timer = child.getTimers().iterator().next();
+ assertTrue(twoDaysFromNow <= timer.getDueDate().getTime());
+
+ // timer execution is tested in testTimerExecution
+ }
+
+ public void testReschedulingTimer() {
+ Date now = Clock.getCurrentTime();
+ long twoDaysFromNow = now.getTime() + twoDaysDuration;
+
+ ProcessDefinition processDefinition = ProcessFactory.build("reschedulingTimer")
+ .node("decide").initial().behaviour(IncrementCounterWaitState.class)
+ .variable(IncrementCounterWaitState.COUNTER, "0")
+ .timer("2 days", "increment", "2 days")
+ .transition("decision made").to("response") // first defined transition is the default one
+ .transition("timeout").to("reassign")
+ .node("reassign").behaviour(WaitState.class)
+ .node("response").behaviour(WaitState.class)
+ .done();
+
+ ExecutionImpl processInstance = deployAndInstanciateProcess(processDefinition);
+
+ Execution execution = processInstance;
+ OpenExecution child = ((OpenExecution) execution).getExecutions().iterator().next();
+
+ for (int i=0; i<IncrementCounterWaitState.MAX_COUNTER_VALUE; i++) {
+ // check that the execution is in the right node
+ assertNotNull(child);
+ assertEquals("decide", child.getNodeName());
+ assertEquals(Execution.STATE_ACTIVE, child.getState());
+
+ // check there is one timer
+ assertTrue(child.hasTimers());
+ assertEquals(1, child.getTimers().size());
+
+ // check that timer's dueDate is good
+ Timer timer = child.getTimers().iterator().next();
+ assertTrue("error is "+(timer.getDueDate().getTime()-twoDaysFromNow)+" millis",
+ twoDaysFromNow <= timer.getDueDate().getTime()+200);
+
+ // set next minimum due date
+ twoDaysFromNow = Clock.getCurrentTime().getTime() + twoDaysDuration;
+
+ // execute timer
+ JobTestHelper jobTestHelper = getEnvironmentFactory().get(JobTestHelper.class);
+ jobTestHelper.executeTimer(timer.getDbid());
+ child = loadExecutionFromDb(child.getDbid());
+ }
+
+ newTransaction();
+ child = loadExecutionFromDb(child.getDbid());
+ assertNull(child);
+
+ // check that timers have been deleted
+ List<Timer> timers = Environment.getCurrent().get(PvmDbSession.class).findTimers();
+ assertNotNull(timers);
+ assertTrue(timers.isEmpty());
+
+ // check that process is in the right state
+ execution = loadExecutionFromDb(processInstance.getDbid());
+ assertEquals("reassign", execution.getNodeName());
+ }
+
+ public void testTimerEndingProcessExecution() {
+ ProcessDefinition processDefinition = ProcessFactory.build("timerEndingProcess")
+ .node("decide").initial().behaviour(WaitState.class)
+ .timer("2 business days", "timeout")
+ .transition("decision made").to("response") // first defined transition is the default one
+ .transition("timeout").to("reassign")
+ .node("reassign").behaviour(AutomaticActivity.class)
+ .node("response").behaviour(WaitState.class)
+ .done();
+
+ ExecutionImpl processInstance = deployAndInstanciateProcess(processDefinition);
+
+ Execution execution = processInstance;
+ OpenExecution child = ((OpenExecution) execution).getExecutions().iterator().next();
+ assertEquals("decide", child.getNodeName());
+
+ // timer execution
+ Timer timer = child.getTimers().iterator().next();
+
+ JobTestHelper jobTestHelper = getEnvironmentFactory().get(JobTestHelper.class);
+ child = (OpenExecution) jobTestHelper.executeTimer(timer.getDbid());
+ assertEquals(Execution.STATE_ENDED, child.getState());
+
+ // check that the subExecution was deleted
+ child = loadExecutionFromDb(child.getDbid());
+ assertNull(child);
+
+ // check that timers have been deleted
+ List<Timer> timers = Environment.getCurrent().get(PvmDbSession.class).findTimers();
+ assertNotNull(timers);
+ assertTrue(timers.isEmpty());
+
+ // check that process is in the right state
+ execution = loadExecutionFromDb(processInstance.getDbid());
+ assertEquals("reassign", execution.getNodeName());
+ assertEquals(Execution.STATE_ENDED, execution.getState());
+ }
+
+}
Deleted: jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerTest.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerTest.java 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerTest.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -1,475 +0,0 @@
-/**
- * Copyright (C) 2006 Bull S. A. S.
- * Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois
- * This library is free software; you can redistribute it and/or modify it under the terms
- * of the GNU Lesser General Public License as published by the Free Software Foundation
- * version 2.1 of the License.
- * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU Lesser General Public License for more details.
- * You should have received a copy of the GNU Lesser General Public License along with this
- * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301, USA.
- **/
-package org.jbpm.pvm.timer;
-
-import java.util.Date;
-import java.util.Map;
-
-import org.jbpm.pvm.Execution;
-import org.jbpm.pvm.ExecutionService;
-import org.jbpm.pvm.ProcessService;
-import org.jbpm.pvm.activity.ActivityExecution;
-import org.jbpm.pvm.activity.ExternalActivity;
-import org.jbpm.pvm.env.Environment;
-import org.jbpm.pvm.internal.job.TimerImpl;
-import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.util.Clock;
-import org.jbpm.pvm.job.JobTestHelper;
-import org.jbpm.pvm.job.Timer;
-import org.jbpm.pvm.model.OpenExecution;
-import org.jbpm.pvm.model.ProcessDefinition;
-import org.jbpm.pvm.model.ProcessFactory;
-import org.jbpm.pvm.samples.activities.AutomaticActivity;
-import org.jbpm.pvm.session.DbSession;
-import org.jbpm.pvm.session.PvmDbSession;
-import org.jbpm.pvm.test.base.DbTestCase;
-
-/**
- * @author Pascal Verdage
- */
-public class TimerTest extends DbTestCase {
- /** Wait state that tries to take a transition when signalled */
- public static class WaitState implements ExternalActivity {
-
- private static final long serialVersionUID = 1L;
-
- public void execute(ActivityExecution execution) {
- execution.waitForSignal();
- }
-
- public void signal(ActivityExecution execution,
- String signalName,
- Map<String, Object> parameters) {
- if (signalName!=null &&
- execution.getNode().hasOutgoingTransition(signalName)) {
- execution.take(signalName);
- }
- }
- }
-
- /** Wait state whose execution sets 'dueDate' variable to a fixed Date */
- public static class SetDueDateWaitState extends WaitState {
- private static final long serialVersionUID = 1L;
-
- public void execute(ActivityExecution execution) {
- Date dueDate = new Date(Clock.getCurrentTime().getTime() + twoDaysDuration);
- execution.setVariable("dueDate", dueDate);
- super.execute(execution);
- }
-
- }
- /////////////////////////////////////////////////////////
- // Tools
- /////////////////////////////////////////////////////////
- private static long twoDaysDuration = 2*24*60*60*1000;
-
- private static String getFormattedDate(long delay) {
- return TimerImpl.formatDueDate(new Date(System.currentTimeMillis() + delay));
- }
-
- private static OpenExecution signalExecution(long executionDbid) {
- ExecutionService executionService =
- Environment.getCurrent().get(ExecutionService.class);
- return (OpenExecution) executionService.signalExecution(executionDbid);
- }
-
- private static OpenExecution deployAndInstanciateProcess(ProcessDefinition definition) {
- ProcessService processService = Environment.getCurrent().get(ProcessService.class);
- processService.deploy(definition);
-
- ExecutionService executionService =
- Environment.getCurrent().get(ExecutionService.class);
- Execution processInstance = executionService.startExecution(definition.getName());
-
- return (ExecutionImpl) processInstance;
- }
-
- private static OpenExecution loadExecutionFromDb(long id) {
- return Environment.getCurrent().get(DbSession.class).get(ExecutionImpl.class, id);
- }
-
- private static void assertNoTimer() {
- assertTrue(Environment.getCurrent().get(PvmDbSession.class).findTimers().isEmpty());
- }
-
- /////////////////////////////////////////////////////////
- // test methods
- /////////////////////////////////////////////////////////
- private OpenExecution initTest(ProcessDefinition definition) {
- OpenExecution processInstance = deployAndInstanciateProcess(definition);
- OpenExecution execution = processInstance;
-
- if ("request".equals(execution.getNodeName())) {
- /* the request node might be use to have a specific initialisation
- * through the node execution */
- // go to test node
- execution = signalExecution(execution.getDbid());
- }
- return execution;
- }
-
- private long makeTestNode(long minimumDate, OpenExecution execution) {
- // check there is one sub execution
- assertEquals(1, execution.getExecutions().size());
-
- // check the execution state
- assertEquals("decide", execution.getNodeName());
- OpenExecution child = execution.getExecutions().iterator().next();
- assertEquals("decide", child.getNodeName());
-
- // check there is one timer
- assertFalse(execution.hasTimers());
- assertTrue(child.hasTimers());
- assertEquals(1, child.getTimers().size());
-
- // check that timer's dueDate is good
- Timer timer = child.getTimers().iterator().next();
- assertTrue("error is "+(minimumDate-timer.getDueDate().getTime()),
- minimumDate <= timer.getDueDate().getTime());
-
- // execute the timer
- JobTestHelper jobTestHelper = getEnvironmentFactory().get(JobTestHelper.class);
- child = (OpenExecution) jobTestHelper.executeTimer(timer.getDbid());
-
- return child.getDbid();
- }
-
- private void endTest(long executionDbid, long childDbid, String expectedState) {
- newTransaction();
-
- // check that the sub execution has been deleted
- OpenExecution child = loadExecutionFromDb(childDbid);
- assertNull(child);
-
- // check that timers have been deleted
- assertNoTimer();
-
- // check that process is in the right state
- OpenExecution execution = loadExecutionFromDb(executionDbid);
- assertEquals(0, execution.getExecutions().size());
- assertEquals("reassign", execution.getNodeName());
- assertEquals(expectedState, execution.getState());
- }
-
- private void makeTestNoRepeat(ProcessDefinition definition) {
- long twoDaysFromNow =Clock.getCurrentTime().getTime() + twoDaysDuration;
- OpenExecution execution = initTest(definition);
-
- long childDbid = makeTestNode(twoDaysFromNow - 100, execution);
-
- endTest(execution.getDbid(), childDbid, Execution.STATE_ACTIVE);
- }
-
- private void makeTestRepeat(ProcessDefinition definition) {
- OpenExecution execution = initTest(definition);
- long childDbid = -1;
-
- for (int i=0; i<IncrementCounterWaitState.MAX_COUNTER_VALUE; i++) {
- long twoDaysFromNow = Clock.getCurrentTime().getTime() + twoDaysDuration;
- childDbid = makeTestNode(twoDaysFromNow-200, execution);
- newTransaction();
- execution = loadExecutionFromDb(execution.getDbid());
- }
-
- endTest(execution.getDbid(), childDbid, Execution.STATE_ACTIVE);
- }
-
- /////////////////////////////////////////////////////////
- // simple timer execution
- // not repeated timer when due date is not a script
- /////////////////////////////////////////////////////////
- /** This scenario test a timer defined by a string.
- * The string represents a formatted date. */
- public void testFormattedDateTimer() {
- String dueDate = getFormattedDate(twoDaysDuration);
-
- ProcessDefinition processDefinition = ProcessFactory.build("formattedDateTimer")
- .node("decide").initial().behaviour(WaitState.class)
- .timer(dueDate, "timeout")
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestNoRepeat(processDefinition);
- }
-
- /** This scenario test a timer defined by a string.
- * The string represents a formatted date. */
- public void testCustomFormattedDateTimer() {
- TimerImpl.setDateFormat("EE, MM dd yyyy, hh:mm:ss,SSS a");
- try {
- String dueDate = getFormattedDate(twoDaysDuration);
-
- ProcessDefinition processDefinition = ProcessFactory.build("customFormattedDateTimer")
- .node("decide").initial().behaviour(WaitState.class)
- .timer(dueDate, "timeout")
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestNoRepeat(processDefinition);
- } finally {
- // reset original date format
- TimerImpl.setDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
- }
- }
-
- /** This scenario test a timer defined by a string.
- * The string represents a duration. */
- public void testDurationTimer() {
- ProcessDefinition processDefinition = ProcessFactory.build("durationTimer")
- .node("decide").initial().behaviour(WaitState.class)
- .timer("2 days", "juel", "timeout", null)
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestNoRepeat(processDefinition);
- }
-
- /////////////////////////////////////////////////////////
- // simple timer execution
- // not repeated timer when due date is a juel script
- /////////////////////////////////////////////////////////
- /** This scenario test a timer defined by a juel script.
- * The corresponding variable is a Date object */
- public void testDateVariableJuelTimer() {
- ProcessDefinition processDefinition = ProcessFactory.build("dateVariableJuelTimer")
- .variable("dueDate")
- .node("request").initial().behaviour(SetDueDateWaitState.class)
- .transition().to("decide")
- .node("decide").behaviour(WaitState.class)
- .timer("#{dueDate}", "juel", "timeout", null)
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestNoRepeat(processDefinition);
- }
-
- /** This scenario test a timer defined by a juel script.
- * The corresponding variable is a String object.
- * The string represents a formatted date */
- public void testFormattedDateVariableJuelTimer() {
- String dueDate = getFormattedDate(twoDaysDuration);
-
- ProcessDefinition processDefinition = ProcessFactory.build("formattedDateVariableJuelTimer")
- .variable("timerDelay", dueDate)
- .node("decide").initial().behaviour(WaitState.class)
- .timer("#{timerDelay}", "juel", "timeout", null)
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestNoRepeat(processDefinition);
- }
-
- /** This scenario test a timer defined by a juel script.
- * The corresponding variable is a String object.
- * The string represents a duration */
- public void testDurationVariableJuelTimer() {
- ProcessDefinition processDefinition = ProcessFactory.build("durationVariableJuelTimer")
- .variable("timerDelay", "2 days")
- .node("decide").initial().behaviour(WaitState.class)
- .timer("#{timerDelay}", "juel", "timeout", null)
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestNoRepeat(processDefinition);
- }
-
- /*
- /////////////////////////////////////////////////////////
- // simple timer execution
- // not repeated timer when due date is a groovy script
- /////////////////////////////////////////////////////////
- public void testDateVariableGroovyTimer() {
- ProcessDefinition processDefinition = ProcessFactory.build("dateVariableGroovyTimer")
- .variable("dueDate")
- .node("request").initial().behaviour(SetDueDateWaitState.class)
- .transition().to("decide")
- .node("decide").behaviour(WaitState.class)
- .timer("dueDate", "groovy", "timeout", null)
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestNoRepeat(processDefinition);
- }
-
- public void testFormattedDateVariableGroovyTimer() {
- String dueDate = getFormattedDate(twoDaysDuration);
-
- ProcessDefinition processDefinition = ProcessFactory.build("formattedDateVariableGroovyTimer")
- .variable("timerDelay", dueDate)
- .node("decide").initial().behaviour(WaitState.class)
- .timer("timerDelay", "groovy", "timeout", null)
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestNoRepeat(processDefinition);
- }
-
- public void testDurationVariableGroovyTimer() {
- ProcessDefinition processDefinition = ProcessFactory.build("durationVariableGroovyTimer")
- .variable("timerDelay", "2 days")
- .node("decide").initial().behaviour(WaitState.class)
- .timer("timerDelay", "groovy", "timeout", null)
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestNoRepeat(processDefinition);
- }
- */
-
- /////////////////////////////////////////////////////////
- // repeated timer execution
- /////////////////////////////////////////////////////////
- /** <p>this scenario tests a repeated timer.
- * When signalled, the node makes an alert (logs).<br>
- * After IncrementCounterWaitState.COUNTER loops,
- * the node takes a timeout transition.</p>
- * <p>Repeat is a string representing a duration.</p> */
- public void testDurationRepeat() {
- ProcessDefinition processDefinition = ProcessFactory.build("durationRepeat")
- .node("decide").initial().behaviour(IncrementCounterWaitState.class)
- .variable(IncrementCounterWaitState.COUNTER, "0")
- .timer("2 days", null, "increment", "2 days")
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestRepeat(processDefinition);
- }
-
- /*
- public void testDurationVariableGroovyRepeat() {
- // groovy constraint
- // if we use '2 days' instead of 'timerDelay' variable,
- // scripting fails to evaluate '2 days'
- ProcessDefinition processDefinition = ProcessFactory.build("durationGroovyRepeat")
- .variable("repeat", "2 days")
- .node("decide").initial().behaviour(IncrementCounterWaitState.class)
- .variable(IncrementCounterWaitState.COUNTER, "0")
- .timer("'2 days'", "groovy", "increment", "repeat")
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestRepeat(processDefinition);
- }
- */
-
- /** <p>this scenario tests a repeated timer.
- * When signalled, the node makes an alert (logs).<br>
- * After IncrementCounterWaitState.COUNTER loops,
- * the node takes a timeout transition.</p>
- * <p>Repeat is a juel script referring to a duration.</p> */
- public void testDurationVariableJuelRepeat() {
- ProcessDefinition processDefinition = ProcessFactory.build("durationJuelRepeat")
- .variable("repeat", "2 days")
- .node("decide").initial().behaviour(IncrementCounterWaitState.class)
- .variable(IncrementCounterWaitState.COUNTER, "0")
- .timer("2 days", "juel", "increment", "#{repeat}")
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- makeTestRepeat(processDefinition);
- }
-
- /////////////////////////////////////////////////////////
- // others
- /////////////////////////////////////////////////////////
- /** this scenario tests a timer that doesn't fire */
- public void testCanceledTimer() {
- String dueDate = getFormattedDate(twoDaysDuration);
- ProcessDefinition processDefinition = ProcessFactory.build("timerCanceled")
- .node("decide").initial().behaviour(WaitState.class)
- .timer(dueDate, "timeout")
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(WaitState.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- OpenExecution processInstance = deployAndInstanciateProcess(processDefinition);
-
- OpenExecution execution = processInstance;
- assertEquals("decide", execution.getNodeName());
-
- // signal child execution
- OpenExecution child = execution.getExecutions().iterator().next();
- execution = signalExecution(child.getDbid());
- assertEquals(Execution.STATE_ENDED, execution.getState());
-
- // check that the subExecution was deleted
- child = loadExecutionFromDb(child.getDbid());
- assertNull(child);
-
- // check that timers have been deleted
- assertNoTimer();
-
- // check that process is in the right state
- execution = loadExecutionFromDb(processInstance.getDbid());
- assertEquals("response", execution.getNodeName());
- assertEquals(Execution.STATE_ACTIVE, execution.getState());
- }
-
- /** this scenario tests the case where the process execution ends
- * in the transaction that executes the timer */
- public void testTimerEndingProcessExecution() {
- ProcessDefinition processDefinition = ProcessFactory.build("timerEndingProcess")
- .node("decide").initial().behaviour(WaitState.class)
- .timer("2 business days", "timeout")
- .transition("decision made").to("response")
- .transition("timeout").to("reassign")
- .node("reassign").behaviour(AutomaticActivity.class)
- .node("response").behaviour(WaitState.class)
- .done();
-
- long twoDaysFromNow = Clock.getCurrentTime().getTime()+twoDaysDuration;
- OpenExecution execution = initTest(processDefinition);
- long childDbid = makeTestNode(twoDaysFromNow, execution);
- endTest(execution.getDbid(), childDbid, Execution.STATE_ENDED);
- }
-
-}
Added: jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerUnitTest.java
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerUnitTest.java (rev 0)
+++ jbpm4/pvm/trunk/modules/core/src/test/java/org/jbpm/pvm/timer/TimerUnitTest.java 2008-07-28 14:22:17 UTC (rev 1737)
@@ -0,0 +1,176 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.timer;
+
+import java.util.Date;
+
+import org.jbpm.pvm.test.base.JbpmTestCase;
+import org.jbpm.pvm.internal.job.TimerImpl;
+import org.jbpm.pvm.job.Timer;
+
+/**
+ * @author Tom Baeyens
+ * @author Pascal Verdage
+ */
+public class TimerUnitTest extends JbpmTestCase
+{
+
+
+ protected Timer timer() {
+ return new TimerImpl();
+ }
+
+ public void testSetDueDate() throws Exception {
+ TimerImpl timer = new TimerImpl();
+ Date now = new Date(System.currentTimeMillis());
+ timer.setDueDate(now);
+ TestTimerSession timerSession = new TestTimerSession();
+ timerSession.schedule(timer);
+ assertEquals(1, timerSession.getNbTimer());
+ assertEquals(timer, timerSession.getFirstTimer());
+ timerSession.executeFirstTimer();
+ assertEquals(0, timerSession.getNbTimer());
+ }
+
+ /*
+ TODO finish after refactoring
+
+
+ public void testSetDueDateDescription() throws Exception {
+ TimerImpl timerImpl = new TimerImpl();
+ timerImpl.setDueDateDescription("5 seconds");
+ TestTimerSession timerSession = new TestTimerSession();
+ timerSession.schedule(timerImpl);
+ assertEquals(1, timerSession.getNbTimer());
+ assertEquals(timerImpl, timerSession.getFirstTimer());
+ timerSession.executeFirstTimer();
+ assertEquals(0, timerSession.getNbTimer());
+ }
+
+ public void testRepeatedTimer() throws Exception {
+ TimerImpl timerImpl = new TimerImpl();
+ Date now= new Date();
+ timerImpl.setDueDate(now);
+ timerImpl.setRepeat("3 seconds");
+ TestTimerSession timerSession = new TestTimerSession();
+ timerSession.schedule(timerImpl);
+ assertEquals(1, timerSession.getNbTimer());
+ assertEquals(timerImpl, timerSession.getFirstTimer());
+ timerSession.executeFirstTimer();
+ assertEquals(1, timerSession.getNbTimer());
+ }
+
+ private static class TestActivityInstance extends ActivityInstanceImpl {
+ private static final long serialVersionUID = 1L;
+ private int executionCount = 0;
+
+ public void signal(String signalName, Map<String, Object> parameters) {
+ executionCount++;
+ }
+ public int getExecutionCount() {
+ return executionCount;
+ }
+
+ public String toString() {
+ return "test activity";
+ }
+ }
+
+ public void testActivityInstanceNoSignalNoEvent() throws Exception {
+ TimerImpl timerImpl = new TimerImpl();
+ TestActivityInstance instance = new TestActivityInstance();
+ TestExecution execution = new TestExecution();
+ timerImpl.setActivityInstance(instance);
+ timerImpl.setExecution(execution);
+ TestTimerSession timerSession = new TestTimerSession();
+ timerSession.schedule(timerImpl);
+ assertEquals(1, timerSession.getNbTimer());
+ timerSession.executeFirstTimer();
+ assertEquals(0, timerSession.getNbTimer());
+ assertEquals(0, instance.getExecutionCount());
+ assertEquals(0, execution.getExecutionCount());
+ }
+
+ public void testActivityInstanceWithSignal() throws Exception {
+ TimerImpl timerImpl = new TimerImpl();
+ TestActivityInstance instance = new TestActivityInstance();
+ TestExecution execution = new TestExecution();
+ timerImpl.setActivityInstance(instance);
+ timerImpl.setSignalName("timeout");
+ timerImpl.setExecution(execution);
+ TestTimerSession timerSession = new TestTimerSession();
+ timerSession.schedule(timerImpl);
+ assertEquals(1, timerSession.getNbTimer());
+ timerSession.executeFirstTimer();
+ assertEquals(0, timerSession.getNbTimer());
+ assertEquals(1, instance.getExecutionCount());
+ assertEquals(0, execution.getExecutionCount());
+ }
+
+ private static class TestExecution extends ExecutionImpl {
+ private static final long serialVersionUID = 1L;
+ private int executionCount = 0;
+
+ public int getExecutionCount() {
+ return executionCount;
+ }
+
+ public void fire(String eventName, ObservableElement eventSource) {
+ executionCount++;
+ }
+
+ public String toString() {
+ return "test execution";
+ }
+ }
+
+ public void testActivityInstanceWithEvent() throws Exception {
+ TimerImpl timerImpl = new TimerImpl();
+ TestActivityInstance instance = new TestActivityInstance();
+ TestExecution execution = new TestExecution();
+ timerImpl.setActivityInstance(instance);
+ timerImpl.setEventName("timeout");
+ timerImpl.setExecution(execution);
+ TestTimerSession timerSession = new TestTimerSession();
+ timerSession.schedule(timerImpl);
+ assertEquals(1, timerSession.getNbTimer());
+ timerSession.executeFirstTimer();
+ assertEquals(0, timerSession.getNbTimer());
+ assertEquals(0, instance.getExecutionCount());
+ assertEquals(1, execution.getExecutionCount());
+ }
+
+ public void testEventWithNoActivityInstance() throws Exception {
+ TimerImpl timerImpl = new TimerImpl();
+ TestExecution execution = new TestExecution();
+ timerImpl.setEventName("timeout");
+ timerImpl.setExecution(execution);
+ TestTimerSession timerSession = new TestTimerSession();
+ timerSession.schedule(timerImpl);
+ assertEquals(1, timerSession.getNbTimer());
+ timerSession.executeFirstTimer();
+ assertEquals(0, timerSession.getNbTimer());
+ assertEquals(1, execution.getExecutionCount());
+ }
+
+ */
+}
Modified: jbpm4/pvm/trunk/modules/core/src/test/resources/org/jbpm/pvm/timer/environment.cfg.xml
===================================================================
--- jbpm4/pvm/trunk/modules/core/src/test/resources/org/jbpm/pvm/timer/environment.cfg.xml 2008-07-28 11:15:05 UTC (rev 1736)
+++ jbpm4/pvm/trunk/modules/core/src/test/resources/org/jbpm/pvm/timer/environment.cfg.xml 2008-07-28 14:22:17 UTC (rev 1737)
@@ -7,7 +7,6 @@
<job-test-helper />
<process-service />
- <execution-service />
<command-service>
<retry-interceptor />
@@ -40,14 +39,6 @@
<holiday period="01/07/2008 - 31/08/2008"/>
</business-calendar>
- <script-manager default-expression-language='juel'
- default-script-language='juel'
- read-contexts='execution, environment, environment-factory'
- write-context='null'>
- <script-language name='juel' factory='com.sun.script.juel.JuelScriptEngineFactory' />
-<!-- <script-language name='groovy' factory='com.sun.script.groovy.GroovyScriptEngineFactory' />-->
- </script-manager>
-
</environment-factory>
<environment>
More information about the jbpm-commits
mailing list