[jbpm-commits] JBoss JBPM SVN: r6100 - in jbpm4/trunk/modules: pvm/src/main/java/org/jbpm/pvm/internal/job and 2 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Wed Jan 20 05:21:31 EST 2010
Author: kukeltje
Date: 2010-01-20 05:21:31 -0500 (Wed, 20 Jan 2010)
New Revision: 6100
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/BusinessCalendar.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/BusinessCalendarImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/timer/TimerTest.java
Log:
JBPM-2745 Fix for code, documentation follows
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/BusinessCalendar.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/BusinessCalendar.java 2010-01-20 08:16:39 UTC (rev 6099)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/BusinessCalendar.java 2010-01-20 10:21:31 UTC (rev 6100)
@@ -25,9 +25,11 @@
/**
* @author Tom Baeyens
+ * @author Ronald Van Kuijk
*/
public interface BusinessCalendar {
Date add(Date date, String duration);
+ Date subtract(Date date, String duration);
}
\ No newline at end of file
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/BusinessCalendarImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/BusinessCalendarImpl.java 2010-01-20 08:16:39 UTC (rev 6099)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/BusinessCalendarImpl.java 2010-01-20 10:21:31 UTC (rev 6100)
@@ -27,6 +27,8 @@
import java.util.GregorianCalendar;
import java.util.TimeZone;
+import org.jbpm.api.JbpmException;
+
/**
* a calendar that knows about business hours.
*/
@@ -71,7 +73,25 @@
public Date add(Date date, String duration) {
return add(date, new Duration(duration));
}
+
+ public Date subtract(Date date, String duration) {
+ if (duration.contains("business")) {
+ throw new JbpmException("Duedate subtraction not supported for business durations");
+ }
+ return subtract(date, new Duration(duration));
+ }
+ public Date subtract(Date date, Duration duration) {
+ Date end = null;
+ long millis = convertToMillis(duration);
+ end = new Date(date.getTime()-millis);
+ if (end.before(new Date())) {
+ throw new JbpmException("Duedate "+ end+ " in the past");
+ }
+ return end;
+ }
+
+
public Date add(Date date, Duration duration) {
Date end = null;
if (duration.isBusinessTime()) {
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java 2010-01-20 08:16:39 UTC (rev 6099)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java 2010-01-20 10:21:31 UTC (rev 6100)
@@ -22,6 +22,7 @@
package org.jbpm.pvm.internal.job;
import java.text.SimpleDateFormat;
+import java.util.Calendar;
import java.util.Date;
import org.jbpm.api.JbpmException;
@@ -48,6 +49,7 @@
* @author Tom Baeyens
* @author Pascal Verdage
* @author Alejandro Guizar
+ * @author Ronald Van Kuijk
*/
public class TimerImpl extends JobImpl<Boolean> implements Timer {
@@ -71,12 +73,59 @@
timerSession.schedule(this);
}
- public void setDueDateDescription(String dueDateDescription) {
- ScriptManager scriptManager = ScriptManager.getScriptManager();
- dueDateDescription = (String) scriptManager.evaluateExpression(dueDateDescription, null);
- Date now = Clock.getCurrentTime();
- BusinessCalendar businessCalendar = EnvironmentImpl.getFromCurrent(BusinessCalendar.class);
- duedate = businessCalendar.add(now, dueDateDescription);
+ public void setDueDateDescription(String dueDateDescription) {
+
+ ScriptManager scriptManager = ScriptManager.getScriptManager();
+
+ Date baseDate;
+ String durationString = null;
+ char durationSeparator = '+'; // needs to be initialized
+
+ if (dueDateDescription.startsWith("#")) {
+
+ String baseDateEL = dueDateDescription.substring(0, dueDateDescription.indexOf("}") + 1);
+ Object result = scriptManager.evaluateExpression(baseDateEL, null);
+
+ if (result instanceof Date) {
+ baseDate = (Date)result;
+ }
+ else if (result instanceof Calendar) {
+ baseDate = ((Calendar)result).getTime();
+ } else {
+ throw new JbpmException("Invalid basedate type: " + baseDateEL + " is of type " + result.getClass().getName()
+ + ". Only Date and Calendar are supported");
+ }
+
+ int endOfELIndex = dueDateDescription.indexOf("}");
+ if (endOfELIndex < (dueDateDescription.length() - 1)) {
+ durationSeparator = dueDateDescription.substring(endOfELIndex + 1).trim().charAt(0);
+ if (durationSeparator != '+' && durationSeparator != '-') {
+ throw new JbpmException("Invalid duedate, + or - missing after EL");
+ }
+ durationString = dueDateDescription.substring(endOfELIndex + 1).substring(2).trim();
+ log.debug("durationString: " + durationString);
+ }
+
+ } else {
+
+ baseDate = Clock.getCurrentTime();
+ durationString = dueDateDescription;
+
+ }
+
+ if (durationString == null || durationString.length() == 0) {
+ duedate = baseDate;
+ } else {
+ if (durationString.contains("business") && durationSeparator == '-') {
+ throw new JbpmException("Invalid duedate, subtraction ('-') not supported if duedate contains 'business'");
+ }
+ BusinessCalendar businessCalendar = EnvironmentImpl.getFromCurrent(BusinessCalendar.class);
+ if (durationSeparator == '+') {
+ duedate = businessCalendar.add(baseDate, durationString);
+ } else {
+ duedate = businessCalendar.subtract(baseDate, durationString);
+ }
+ }
}
public Boolean execute(Environment environment) throws Exception {
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java 2010-01-20 08:16:39 UTC (rev 6099)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java 2010-01-20 10:21:31 UTC (rev 6100)
@@ -793,6 +793,12 @@
UserCodeReference assignmentHandlerReference = assignableDefinition.getAssignmentHandlerReference();
if (assignmentHandlerReference!=null) {
+
+ // JBPM-2758
+ // TODO Find out why processdefinition is null in at this time....
+ if (processDefinition == null) {
+ processDefinition = getProcessDefinition();
+ }
AssignmentHandler assignmentHandler = (AssignmentHandler) assignmentHandlerReference.getObject(processDefinition);
if (assignmentHandler!=null) {
try {
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-01-20 08:16:39 UTC (rev 6099)
+++ jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/timer/TimerTest.java 2010-01-20 10:21:31 UTC (rev 6100)
@@ -22,6 +22,8 @@
package org.jbpm.test.timer;
import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
import java.util.Map;
import org.jbpm.api.Execution;
@@ -123,6 +125,268 @@
assertEquals(currentYear + 10, jobDate.get(Calendar.YEAR));
}
+ public void testTimerELDate() {
+ deployJpdlXmlString(
+ "<process name='Insurance claim' key='ICL'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <state name='a'>" +
+ " <transition to='b' />" +
+ " <transition name='timeout' to='escalate'>" +
+ " <timer duedate='#{proc_var}' />" +
+ " </transition>" +
+ " </state>" +
+ " <state name='b' />" +
+ " <end name='escalate' />" +
+ "</process>"
+ );
+
+ Map<String, Object> proc_vars = new HashMap<String, Object>();
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DAY_OF_MONTH, 6);
+ proc_vars.put("proc_var", cal.getTime());
+ ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", proc_vars, "82436");
+
+ Job job = managementService.createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .uniqueResult();
+
+ Calendar jobDate = Calendar.getInstance();
+ jobDate.setTime(job.getDuedate());
+
+ assertEquals(cal.get(Calendar.DAY_OF_MONTH), jobDate.get(Calendar.DAY_OF_MONTH));
+
+ managementService.executeJob(job.getId());
+ assertProcessInstanceEnded(processInstance);
+ }
+
+ public void testTimerELCalendar() {
+ deployJpdlXmlString(
+ "<process name='Insurance claim' key='ICL'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <state name='a'>" +
+ " <transition to='b' />" +
+ " <transition name='timeout' to='escalate'>" +
+ " <timer duedate='#{proc_var}' />" +
+ " </transition>" +
+ " </state>" +
+ " <state name='b' />" +
+ " <end name='escalate' />" +
+ "</process>"
+ );
+
+ Map<String, Object> proc_vars = new HashMap<String, Object>();
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DAY_OF_MONTH, 6);
+ proc_vars.put("proc_var", cal);
+ ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", proc_vars, "82436");
+
+ Job job = managementService.createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .uniqueResult();
+
+ Calendar jobDate = Calendar.getInstance();
+ jobDate.setTime(job.getDuedate());
+
+ assertEquals(cal.get(Calendar.DAY_OF_MONTH), jobDate.get(Calendar.DAY_OF_MONTH));
+
+ managementService.executeJob(job.getId());
+ assertProcessInstanceEnded(processInstance);
+ }
+
+ public void testTimerELCalendarAdd() {
+ deployJpdlXmlString(
+ "<process name='Insurance claim' key='ICL'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <state name='a'>" +
+ " <transition to='b' />" +
+ " <transition name='timeout' to='escalate'>" +
+ " <timer duedate='#{proc_var} + 5 days' />" +
+ " </transition>" +
+ " </state>" +
+ " <state name='b' />" +
+ " <end name='escalate' />" +
+ "</process>"
+ );
+
+ Map<String, Object> proc_vars = new HashMap<String, Object>();
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DAY_OF_MONTH, 6);
+ proc_vars.put("proc_var", cal);
+ ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", proc_vars, "82436");
+
+ Job job = managementService.createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .uniqueResult();
+
+ Calendar jobDate = Calendar.getInstance();
+ jobDate.setTime(job.getDuedate());
+
+ assertEquals(cal.get(Calendar.DAY_OF_MONTH) + 5 , jobDate.get(Calendar.DAY_OF_MONTH));
+
+ managementService.executeJob(job.getId());
+ assertProcessInstanceEnded(processInstance);
+ }
+
+ public void testTimerELCalendarSubtract() {
+ deployJpdlXmlString(
+ "<process name='Insurance claim' key='ICL'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <state name='a'>" +
+ " <transition to='b' />" +
+ " <transition name='timeout' to='escalate'>" +
+ " <timer duedate='#{proc_var} - 5 days' />" +
+ " </transition>" +
+ " </state>" +
+ " <state name='b' />" +
+ " <end name='escalate' />" +
+ "</process>"
+ );
+
+ Map<String, Object> proc_vars = new HashMap<String, Object>();
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DAY_OF_MONTH, 6);
+ proc_vars.put("proc_var", cal);
+ ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", proc_vars, "82436");
+
+ Job job = managementService.createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .uniqueResult();
+
+ Calendar jobDate = Calendar.getInstance();
+ jobDate.setTime(job.getDuedate());
+
+ // 6 days from now minus 5 days is tomorrow so subtract 5 from the original added 6.
+ assertEquals(cal.get(Calendar.DAY_OF_MONTH) -5 , jobDate.get(Calendar.DAY_OF_MONTH));
+
+ managementService.executeJob(job.getId());
+ assertProcessInstanceEnded(processInstance);
+ }
+
+
+ public void testTimerELCalendarAddBusiness() {
+ deployJpdlXmlString(
+ "<process name='Insurance claim' key='ICL'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <state name='a'>" +
+ " <transition to='b' />" +
+ " <transition name='timeout' to='escalate'>" +
+ " <timer duedate='#{proc_var} + 5 business days' />" +
+ " </transition>" +
+ " </state>" +
+ " <state name='b' />" +
+ " <end name='escalate' />" +
+ "</process>"
+ );
+
+ Map<String, Object> proc_vars = new HashMap<String, Object>();
+ Calendar cal = Calendar.getInstance();
+ cal.set(2010, 01, 12, 12, 00, 00); // 12 feb 2010 noon
+ proc_vars.put("proc_var", cal);
+ ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", proc_vars, "82436");
+
+ Job job = managementService.createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .uniqueResult();
+
+ Calendar jobDate = Calendar.getInstance();
+ jobDate.setTime(job.getDuedate());
+
+ // 12 feb is friday, 5 businessdays further is friday 19th
+ assertEquals(19 , jobDate.get(Calendar.DAY_OF_MONTH));
+
+ managementService.executeJob(job.getId());
+ assertProcessInstanceEnded(processInstance);
+ }
+
+ public void testTimerELFail() {
+ deployJpdlXmlString(
+ "<process name='Insurance claim' key='ICL'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <state name='a'>" +
+ " <transition to='b' />" +
+ " <transition name='timeout' to='escalate'>" +
+ " <timer duedate='#{proc_var}' />" +
+ " </transition>" +
+ " </state>" +
+ " <state name='b' />" +
+ " <end name='escalate' />" +
+ "</process>"
+ );
+
+ Map<String, Object> proc_vars = new HashMap<String, Object>();
+ proc_vars.put("proc_var", new Long(0));
+ try {
+ ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", proc_vars, "82436");
+ fail("Should not happen, exception expected");
+ } catch (Exception e) {}
+ }
+
+ public void testTimerELSubtractBusinessFail() {
+ deployJpdlXmlString(
+ "<process name='Insurance claim' key='ICL'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <state name='a'>" +
+ " <transition to='b' />" +
+ " <transition name='timeout' to='escalate'>" +
+ " <timer duedate='#{proc_var} - 6 business days' />" +
+ " </transition>" +
+ " </state>" +
+ " <state name='b' />" +
+ " <end name='escalate' />" +
+ "</process>"
+ );
+
+ Map<String, Object> proc_vars = new HashMap<String, Object>();
+ Calendar cal = Calendar.getInstance();
+ cal.set(2010, 01, 12, 12, 00, 00); // 12 feb 2010 noon
+ proc_vars.put("proc_var", cal);
+ try {
+ ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", proc_vars, "82436");
+ fail("Should not happen, exception expected");
+ } catch (Exception e) {}
+ }
+
+ public void testTimerELSubtractPastFail() {
+ deployJpdlXmlString(
+ "<process name='Insurance claim' key='ICL'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <state name='a'>" +
+ " <transition to='b' />" +
+ " <transition name='timeout' to='escalate'>" +
+ " <timer duedate='#{proc_var} - 3 days' />" +
+ " </transition>" +
+ " </state>" +
+ " <state name='b' />" +
+ " <end name='escalate' />" +
+ "</process>"
+ );
+
+ Map<String, Object> proc_vars = new HashMap<String, Object>();
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DAY_OF_MONTH, 2);
+ proc_vars.put("proc_var", cal);
+ try {
+ ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", proc_vars, "82436");
+ fail("Should not happen, exception expected");
+ } catch (Exception e) {}
+}
+
public void testTimerTimeoutCustom() {
deployJpdlXmlString(TEST_PROCESS_CUSTOM);
More information about the jbpm-commits
mailing list