[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