Author: swiderski.maciej
Date: 2010-07-03 09:07:34 -0400 (Sat, 03 Jul 2010)
New Revision: 6454
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/timer/TimerTest.java
Log:
JBPM-2890: support for expression in timer repeat attribute, applies as well to reminder
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java 2010-07-03
03:49:45 UTC (rev 6453)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java 2010-07-03
13:07:34 UTC (rev 6454)
@@ -34,6 +34,7 @@
import org.jbpm.api.JbpmException;
import org.jbpm.internal.log.Log;
import org.jbpm.pvm.internal.cal.CronExpression;
+import org.jbpm.pvm.internal.el.Expression;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.history.HistoryEvent;
import org.jbpm.pvm.internal.history.events.VariableCreate;
@@ -318,7 +319,14 @@
if (retries!=null) {
timer.setRetries(retries);
}
- timer.setRepeat(timerDefinition.getRepeat());
+ // support for repeat attribute given as expression
+ // only if repeat is specified
+ if (timerDefinition.getRepeat() != null) {
+ Object repeatEl = Expression.create(timerDefinition.getRepeat(),
Expression.LANGUAGE_UEL_VALUE).evaluate();
+ timer.setRepeat(repeatEl.toString());
+ } else {
+ timer.setRepeat(timerDefinition.getRepeat());
+ }
}
return timer;
Modified: jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/timer/TimerTest.java
===================================================================
---
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/timer/TimerTest.java 2010-07-03
03:49:45 UTC (rev 6453)
+++
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/timer/TimerTest.java 2010-07-03
13:07:34 UTC (rev 6454)
@@ -22,6 +22,7 @@
package org.jbpm.test.timer;
import java.util.Calendar;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -428,7 +429,98 @@
assertProcessInstanceEnded(processInstance);
}
+
+ public void testTimerRepeat() {
+ deployJpdlXmlString(
+ "<process name='Insurance claim' key='ICL'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <state name='a'>" +
+ " <on event='timeout'>" +
+ " <timer duedate='20 minutes' repeat='10 seconds'
/>" +
+ " <event-listener class='" + MyCustomWait.class.getName() +
"' />" +
+ " </on>" +
+ " <transition to='b' />" +
+ " </state>" +
+ " <state name='b' >" +
+ " <transition to='escalate' />" +
+ " </state>" +
+ " <end name='escalate' />" +
+ "</process>"
+ );
+ ProcessInstance processInstance =
executionService.startProcessInstanceByKey("ICL", "82436");
+
+ Job job = managementService.createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .uniqueResult();
+
+ managementService.executeJob(job.getId());
+
+
+ job = managementService.createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .uniqueResult();
+
+ managementService.executeJob(job.getId());
+
+ processInstance = executionService.findProcessInstanceById(processInstance.getId());
+ String processInstanceId =
processInstance.findActiveExecutionIn("a").getId();
+
+ processInstance = executionService.signalExecutionById(processInstanceId);
+
+ processInstance = executionService.signalExecutionById(processInstance.getId());
+
+ assertProcessInstanceEnded(processInstance);
+ }
+
+ public void testTimerELRepeat() {
+ deployJpdlXmlString(
+ "<process name='Insurance claim' key='ICL'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <state name='a'>" +
+ " <on event='timeout'>" +
+ " <timer duedate='20 minutes' repeat='#{repeat}'
/>" +
+ " <event-listener class='" + MyCustomWait.class.getName() +
"' />" +
+ " </on>" +
+ " <transition to='b' />" +
+ " </state>" +
+ " <state name='b' >" +
+ " <transition to='escalate' />" +
+ " </state>" +
+ " <end name='escalate' />" +
+ "</process>"
+ );
+
+ Map<String, String> variables = Collections.singletonMap("repeat",
"20 seconds");
+ ProcessInstance processInstance =
executionService.startProcessInstanceByKey("ICL", variables,
"82436");
+
+ Job job = managementService.createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .uniqueResult();
+
+ managementService.executeJob(job.getId());
+
+
+ job = managementService.createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .uniqueResult();
+
+ managementService.executeJob(job.getId());
+
+ processInstance = executionService.findProcessInstanceById(processInstance.getId());
+ String processInstanceId =
processInstance.findActiveExecutionIn("a").getId();
+
+ processInstance = executionService.signalExecutionById(processInstanceId);
+
+ processInstance = executionService.signalExecutionById(processInstance.getId());
+
+ assertProcessInstanceEnded(processInstance);
+ }
+
public static class MyCustomWait implements ExternalActivityBehaviour, EventListener {
private static final long serialVersionUID = 1L;
Show replies by date