[jbpm-commits] JBoss JBPM SVN: r4876 - in jbpm4/trunk/modules: api/src/main/java/org/jbpm/api/session and 7 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Sat May 23 08:41:04 EDT 2009


Author: alex.guizar at jboss.com
Date: 2009-05-23 08:41:04 -0400 (Sat, 23 May 2009)
New Revision: 4876

Added:
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailListener.java
Modified:
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/session/PvmDbSession.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/model/JpdlExecution.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateDbSession.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateTaskDbSession.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeElementImpl.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskImpl.java
Log:
JBPM-2254: first stab at reminder, refactor notification as event listener


Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -24,9 +24,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.jbpm.api.Execution;
-
-
 /**
  * a activity in a {@link OpenProcessDefinition} graph.
  * 

Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -34,4 +34,8 @@
   String START = "start";
   /** fired when a process or an activity ends */
   String END = "end";
+  /** fired when a task is assigned */
+  String ASSIGN = "assign";
+  /** fired when an assignee is reminded of a task */
+  String REMIND = "remind";
 }

Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -26,7 +26,6 @@
 
 import org.jbpm.api.Execution;
 import org.jbpm.api.JbpmException;
-import org.jbpm.api.job.Timer;
 
 /** execution that opens up access to the related 
  * objects in the execution and process definition 
@@ -39,7 +38,7 @@
  * an open persistence session.  Typically inside of 
  * an environment block.  Navigation over the 
  * related model objects will load the related objects
- * transparantly with lazy loading.
+ * transparently with lazy loading.
  * 
  * @author Tom Baeyens
  */

Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -21,9 +21,6 @@
  */
 package org.jbpm.api.model;
 
-import java.util.Set;
-
-
 /**
  * a transition in a {@link OpenProcessDefinition} graph.
  * 

Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/session/PvmDbSession.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/session/PvmDbSession.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/session/PvmDbSession.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -23,7 +23,6 @@
 
 import java.util.List;
 
-import org.jbpm.api.Execution;
 import org.jbpm.api.client.ClientExecution;
 import org.jbpm.api.client.ClientProcessDefinition;
 import org.jbpm.api.job.Job;

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -87,7 +87,7 @@
 
       unresolvedTransitions.add(transition, transitionElement);
       
-      jpdlParser.parseOnEvent(transitionElement, transition, Event.TAKE, parse);
+      jpdlParser.parseOnEvent(transitionElement, parse, transition, Event.TAKE);
     }
   }
 }

Added: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailListener.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailListener.java	                        (rev 0)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailListener.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -0,0 +1,66 @@
+/*
+ * 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.jpdl.internal.activity;
+
+import java.util.Collection;
+
+import javax.mail.Message;
+
+import org.jbpm.api.env.Environment;
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.api.listener.EventListenerExecution;
+import org.jbpm.api.session.TaskDbSession;
+import org.jbpm.api.task.Task;
+import org.jbpm.pvm.internal.email.spi.MailProducer;
+import org.jbpm.pvm.internal.email.spi.MailSession;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class MailListener implements EventListener {
+
+  protected transient MailProducer mailProducer;
+
+  private static final long serialVersionUID = 1L;
+  private static final String TASK_VARIABLE_NAME = "task";
+
+  public void notify(EventListenerExecution execution) throws Exception {
+    // find current task
+    Environment environment = Environment.getCurrent();
+    Task task = environment.get(TaskDbSession.class).findTaskByExecution(execution);
+    // make task available to mail templates through execution variable
+    // TODO find a cleaner way
+    execution.setVariable(TASK_VARIABLE_NAME, task);
+    try {
+      Collection<Message> messages = mailProducer.produce(execution);
+      environment.get(MailSession.class).send(messages);
+    }
+    finally {
+//      execution.removeVariable(TASK_VARIABLE_NAME);
+    }
+  }
+
+  public void setMailProducer(MailProducer mailProducer) {
+    this.mailProducer = mailProducer;
+  }
+
+}

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -52,9 +52,6 @@
 
     TaskHandler taskHandler = task.getTaskHandler();
     boolean wait = taskHandler.executionCreateTask(task);
-
-    TaskDbSession taskDbSession = Environment.getFromCurrent(TaskDbSession.class);
-    taskDbSession.save(task);
     
     if (wait) {
       execution.waitForSignal();

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskBinding.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskBinding.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -22,6 +22,7 @@
 package org.jbpm.jpdl.internal.activity;
 
 import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.model.ScopeElementImpl;
 import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
 import org.jbpm.pvm.internal.xml.Parse;
 import org.jbpm.pvm.internal.xml.Parser;
@@ -41,7 +42,8 @@
   public Object parse(Element element, Parse parse, Parser parser) {
     TaskActivity taskActivity = new TaskActivity();
 
-    TaskDefinitionImpl taskDefinition = JpdlParser.parseTaskDefinition(element, parse, parser);
+    ScopeElementImpl scopeElement = parse.findObject(ScopeElementImpl.class);
+    TaskDefinitionImpl taskDefinition = JpdlParser.parseTaskDefinition(element, parse, scopeElement);
     taskActivity.setTaskDefinition(taskDefinition);
     
     return taskActivity;

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/model/JpdlExecution.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/model/JpdlExecution.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/model/JpdlExecution.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -58,11 +58,11 @@
     if (extensionClass==null) {
       throw new JbpmException("extensionClass is null");
     }
-    if (extensionClass.equals(JpdlExecution.class)) {
+    if (extensionClass == JpdlExecution.class) {
       Session session = Environment.getFromCurrent(Session.class);
-      return (T) session.load(JpdlExecution.class, dbid);
+      return extensionClass.cast(session.load(JpdlExecution.class, dbid));
     }
-    throw new JbpmException("unsuppported extension "+extensionClass.getName());
+    throw new JbpmException("unsupported extension "+extensionClass.getName());
   }
   
   // tasks ////////////////////////////////////////////////////////////////////
@@ -86,6 +86,9 @@
     task.setPriority(taskDefinition.getPriority());
     task.setForm(taskDefinition.getForm());
     
+    // save task so that TaskDbSession.findTaskByExecution works for assign event listeners
+    taskDbSession.saveTask(task);
+    
     SwimlaneDefinitionImpl swimlaneDefinition = taskDefinition.getSwimlaneDefinition();
     if (swimlaneDefinition!=null) {
       JpdlExecution jpdlProcessInstance = processInstance.getExtension(JpdlExecution.class); 

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -31,12 +31,15 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 
+import org.w3c.dom.Element;
+
 import org.jbpm.api.activity.ActivityBehaviour;
 import org.jbpm.api.env.Environment;
 import org.jbpm.api.listener.EventListener;
 import org.jbpm.api.model.Event;
 import org.jbpm.internal.log.Log;
 import org.jbpm.jpdl.internal.activity.JpdlBinding;
+import org.jbpm.jpdl.internal.activity.MailListener;
 import org.jbpm.jpdl.internal.model.JpdlProcessDefinition;
 import org.jbpm.pvm.internal.email.impl.MailProducerImpl;
 import org.jbpm.pvm.internal.email.impl.MailTemplate;
@@ -73,7 +76,6 @@
 import org.jbpm.pvm.internal.xml.Parse;
 import org.jbpm.pvm.internal.xml.Parser;
 import org.jbpm.pvm.internal.xml.ProblemImpl;
-import org.w3c.dom.Element;
 
 /**
  * @author Tom Baeyens
@@ -84,12 +86,14 @@
   
   public static final WireParser wireParser = WireParser.getInstance();
 
-  public static final String[] DEFAULT_ACTIVITIES_RESOURCES = new String[]{
+  // array elements are mutable, even when final
+  // never make a static array public
+  static final String[] DEFAULT_ACTIVITIES_RESOURCES = {
     "jbpm.jpdl.activities.xml",
     "jbpm.user.activities.xml"
   }; 
 
-  public static final String[] DEFAULT_EVENTLISTENERS_RESOURCES = new String[]{
+  static final String[] DEFAULT_EVENTLISTENERS_RESOURCES = {
     "jbpm.jpdl.eventlisteners.xml",
     "jbpm.user.eventlisteners.xml"
   }; 
@@ -128,7 +132,6 @@
             binding.setCategory(CATEGORY_ACTIVITY);
             bindings.addBinding(binding);
           }
-          
         }
       } else {
         log.trace("skipping unavailable jpdl activities resource: "+activityResource);
@@ -151,7 +154,6 @@
             binding.setCategory(CATEGORY_EVENT_LISTENER);
             bindings.addBinding(binding);
           }
-          
         }
       } else {
         log.trace("skipping unavailable jpdl eventlistener resource: "+eventListenerResource);
@@ -217,7 +219,6 @@
     } finally {
       parse.popObject();
     }
-    
 
     if (processDefinition.getInitial()==null) {
       parse.addProblem("no start activity in process");
@@ -236,65 +237,65 @@
     List<Element> elements = XmlUtil.elements(documentElement);
     for (Element nestedElement : elements) {
       String tagName = XmlUtil.getTagLocalName(nestedElement);
-      if ( !"on".equals(tagName) 
-           && !"timer".equals(tagName)
-           && !"swimlane".equals(tagName)
-         ) {
-        JpdlBinding activityBinding = (JpdlBinding) getBinding(nestedElement, CATEGORY_ACTIVITY);
-        if (activityBinding != null) {
-          ActivityImpl activity = compositeElement.createActivity();
-          parse.pushObject(activity);
-          try {
-            activity.setType(activityBinding.getTagName());
-            activityBinding.parseName(nestedElement, activity, parse);
-            parseTransitions(nestedElement, activity, parse);
+      if ("on".equals(tagName) 
+          || "timer".equals(tagName)
+          || "swimlane".equals(tagName)) continue;
 
-            String continuationText = XmlUtil.attribute(nestedElement, "continue");
-            if (continuationText!=null) {
-              if ("async".equals(continuationText)) {
-                activity.setContinuation(Continuation.ASYNCHRONOUS);
-              } else if ("exclusive".equals(continuationText)) {
-                activity.setContinuation(Continuation.EXCLUSIVE);
-              }
-            }
+      JpdlBinding activityBinding = (JpdlBinding) getBinding(nestedElement, CATEGORY_ACTIVITY);
+      if (activityBinding == null) {
+        log.debug("unrecognized activity: " + tagName);
+        continue;
+      }
 
-            ActivityBehaviour activityBehaviour = (ActivityBehaviour) activityBinding.parse(nestedElement, parse, this);
-            activity.setBehaviour(activityBehaviour);
+      ActivityImpl activity = compositeElement.createActivity();
+      parse.pushObject(activity);
+      try {
+        activity.setType(activityBinding.getTagName());
+        activityBinding.parseName(nestedElement, activity, parse);
+        parseTransitions(nestedElement, activity, parse);
 
-            parseOnEvents(nestedElement, parse, activity);
+        String continuationText = XmlUtil.attribute(nestedElement, "continue");
+        if (continuationText!=null) {
+          if ("async".equals(continuationText)) {
+            activity.setContinuation(Continuation.ASYNCHRONOUS);
+          } else if ("exclusive".equals(continuationText)) {
+            activity.setContinuation(Continuation.EXCLUSIVE);
+          }
+        }
 
-            String g = XmlUtil.attribute(nestedElement, "g");
-            if (g != null) {
-              StringTokenizer stringTokenizer = new StringTokenizer(g, ",");
-              ActivityCoordinatesImpl coordinates = null;
-              if (stringTokenizer.countTokens() == 4) {
-                try {
-                  int x = Integer.parseInt(stringTokenizer.nextToken());
-                  int y = Integer.parseInt(stringTokenizer.nextToken());
-                  int width = Integer.parseInt(stringTokenizer.nextToken());
-                  int height = Integer.parseInt(stringTokenizer.nextToken());
-                  coordinates = new ActivityCoordinatesImpl(x, y, width, height);
-                } catch (NumberFormatException e) {
-                  coordinates = null;
-                }
-              }
-              if (coordinates != null) {
-                activity.setCoordinates(coordinates);
-              } else {
-                parse.addProblem("invalid coordinates g=\"" + g + "\" in " + activity);
-              }
-            }
-          } finally {
-            parse.popObject();
+        ActivityBehaviour activityBehaviour = (ActivityBehaviour) activityBinding.parse(nestedElement, parse, this);
+        activity.setBehaviour(activityBehaviour);
+
+        parseOnEvents(nestedElement, parse, activity);
+
+        String g = XmlUtil.attribute(nestedElement, "g");
+        if (g == null) continue;
+
+        StringTokenizer stringTokenizer = new StringTokenizer(g, ",");
+        ActivityCoordinatesImpl coordinates = null;
+        if (stringTokenizer.countTokens() == 4) {
+          try {
+            int x = Integer.parseInt(stringTokenizer.nextToken());
+            int y = Integer.parseInt(stringTokenizer.nextToken());
+            int width = Integer.parseInt(stringTokenizer.nextToken());
+            int height = Integer.parseInt(stringTokenizer.nextToken());
+            coordinates = new ActivityCoordinatesImpl(x, y, width, height);
+          } catch (NumberFormatException e) {
+            coordinates = null;
           }
+        }
+        if (coordinates != null) {
+          activity.setCoordinates(coordinates);
         } else {
-          log.debug("unrecognized activity: " + tagName);
+          parse.addProblem("invalid coordinates g=\"" + g + "\" in " + activity, nestedElement);
         }
+      } finally {
+        parse.popObject();
       }
     }
   }
   
-  public TimerDefinitionImpl parseTimerDefinition(Element timerElement, Parse parse, ScopeElementImpl scopeElement) {
+  public static TimerDefinitionImpl parseTimerDefinition(Element timerElement, Parse parse, ScopeElementImpl scopeElement) {
     TimerDefinitionImpl timerDefinition = scopeElement.createTimerDefinition();
 
     String duedate = XmlUtil.attribute(timerElement, "duedate");
@@ -330,7 +331,7 @@
     List<Element> onElements = XmlUtil.elements(element, "on");
     for (Element onElement: onElements) {
       String eventName = XmlUtil.attribute(onElement, "event", true, parse);
-      parseOnEvent(onElement, scopeElement, eventName, parse);
+      parseOnEvent(onElement, parse, scopeElement, eventName);
 
       Element timerElement = XmlUtil.element(onElement, "timer");
       if (timerElement!=null) {
@@ -340,7 +341,7 @@
     }
   }
 
-  public void parseOnEvent(Element element, ObservableElementImpl observableElement, String eventName, Parse parse) {
+  public void parseOnEvent(Element element, Parse parse, ObservableElementImpl observableElement, String eventName) {
     if (eventName!=null) {
       EventImpl event = observableElement.getEvent(eventName);
       if (event==null) {
@@ -391,7 +392,6 @@
              ) {
             parse.addProblem("unrecognized event listener: "+tagName, null, ProblemImpl.TYPE_WARNING, eventListenerElement);
           }
-               
         }
       }
     }
@@ -414,7 +414,7 @@
   
       unresolvedTransitions.add(transition, transitionElement);
       
-      parseOnEvent(transitionElement, transition, Event.TAKE, parse);
+      parseOnEvent(transitionElement, parse, transition, Event.TAKE);
     }
   }
 
@@ -450,7 +450,7 @@
     assignableDefinition.setCandidateGroupsExpressionLanguage(candidateGroupsExpressionLanguage);
   }
 
-  public static TaskDefinitionImpl parseTaskDefinition(Element element, Parse parse, Parser parser) {
+  public static TaskDefinitionImpl parseTaskDefinition(Element element, Parse parse, ScopeElementImpl scopeElement) {
     TaskDefinitionImpl taskDefinition = new TaskDefinitionImpl();
   
     String taskName = XmlUtil.attribute(element, "name");
@@ -488,10 +488,17 @@
     // parse notification mail producer
     Element notificationElement = XmlUtil.element(element, "notification");
     if (notificationElement != null) {
-      MailProducer mailProducer = parseMailProducer(notificationElement, parse, "task-notification");
-      taskDefinition.setNotificationMailProducer(mailProducer);
+      parseMailEvent(notificationElement, parse, scopeElement, Event.ASSIGN);
     }
 
+    Element reminderElement = XmlUtil.element(element, "reminder");
+    if (reminderElement != null) {
+      parseMailEvent(notificationElement, parse, scopeElement, Event.REMIND);
+      // associate timer to event
+      TimerDefinitionImpl timerDefinition = parseTimerDefinition(reminderElement, parse, scopeElement);
+      timerDefinition.setEventName(Event.REMIND);
+    }
+
     return taskDefinition;
   }
 
@@ -583,6 +590,29 @@
     return variableOutDefinitionSet;
   }
 
+  public static void parseMailEvent(Element element, Parse parse,
+      ObservableElementImpl observableElement, String eventName) {
+    // obtain assign event
+    EventImpl event = observableElement.getEvent(eventName);
+    if (event == null) {
+      event = observableElement.createEvent(eventName);
+    }
+    // register event listener
+    MailListener eventListener = new MailListener();
+    EventListenerReference eventListenerRef = event.createEventListenerReference(eventListener);
+    // set continuation mode
+    String continuationText = XmlUtil.attribute(element, "continue");
+    if ("async".equals(continuationText)) {
+      eventListenerRef.setContinuation(Continuation.ASYNCHRONOUS);
+    }
+    else if ("exclusive".equals(continuationText)) {
+      eventListenerRef.setContinuation(Continuation.EXCLUSIVE);
+    }
+    // associate mail producer to event listener
+    MailProducer mailProducer = parseMailProducer(element, parse, "task-notification");
+    eventListener.setMailProducer(mailProducer);
+  }
+
   public static MailProducer parseMailProducer(Element element, Parse parse,
       String defaultTemplateName) {
     // check whether the element is a generic object descriptor

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -131,14 +131,19 @@
 
   private String evaluateExpression(String expression, Execution execution) {
     ScriptManager scriptManager = Environment.getFromCurrent(ScriptManager.class);
-    return scriptManager.evaluateExpression(expression, execution, template.getLanguage())
-        .toString();
+    Object value = scriptManager.evaluateExpression(expression, execution, template.getLanguage());
+    if (!(value instanceof String)) {
+      throw new JbpmException("expected expression '"
+          + expression
+          + "' to return string, but was: "
+          + value);
+    }
+    return (String) value;
   }
 
   private String[] tokenizeActors(String recipients, Execution execution) {
     String[] actors = evaluateExpression(recipients, execution).split("[,|\\s]+");
-    if (actors.length == 0)
-      throw new JbpmException("recipient list is empty: " + recipients);
+    if (actors.length == 0) throw new JbpmException("recipient list is empty: " + recipients);
     return actors;
   }
 

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateDbSession.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateDbSession.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateDbSession.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -47,7 +47,7 @@
   }
 
   public void forceVersionUpdate(Object entity) {
-    session.lock(entity, LockMode.NONE);
+    session.lock(entity, LockMode.FORCE);
   }
 
   public void lockPessimistically(Object entity) {

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateTaskDbSession.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateTaskDbSession.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateTaskDbSession.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -21,9 +21,8 @@
  */
 package org.jbpm.pvm.internal.hibernate;
 
-import java.io.Serializable;
-
 import org.hibernate.Query;
+
 import org.jbpm.api.Execution;
 import org.jbpm.api.session.TaskDbSession;
 import org.jbpm.api.task.Task;
@@ -52,12 +51,7 @@
       taskImpl.setSuperTaskDbid(null);
     }
     
-    if (! taskImpl.isPersisted()) {
-      Serializable dbid = session.save(taskImpl);
-
-    } else {
-      session.update(taskImpl);
-    }
+    session.saveOrUpdate(task);
   }
 
   public Task createTask() {

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeElementImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeElementImpl.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeElementImpl.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -51,7 +51,7 @@
 
   public List<VariableDefinitionImpl> getVariableDefinitions() {
     if (!hasVariableDefinitions()) {
-      return Collections.EMPTY_LIST;
+      return Collections.emptyList();
     }
     return variableDefinitions;
   }
@@ -75,7 +75,7 @@
 
   public Set<TimerDefinitionImpl> getTimerDefinitions() {
     if (!hasTimerDefinitions()) {
-      return Collections.EMPTY_SET;
+      return Collections.emptySet();
     }
     return timerDefinitions;
   }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -24,7 +24,6 @@
 import java.io.Serializable;
 import java.util.List;
 
-import org.jbpm.pvm.internal.email.spi.MailProducer;
 import org.jbpm.pvm.internal.util.Priority;
 import org.jbpm.pvm.internal.wire.Descriptor;
 
@@ -42,8 +41,6 @@
   protected SwimlaneDefinitionImpl swimlaneDefinition;
   protected Descriptor taskHandlerDescriptor;
 
-  protected transient MailProducer notificationMailProducer;
-
   public int getPriority() {
     return priority;
   }
@@ -80,10 +77,4 @@
   public void setTaskHandlerDescriptor(Descriptor taskHandlerDescriptor) {
     this.taskHandlerDescriptor = taskHandlerDescriptor;
   }
-  public MailProducer getNotificationMailProducer() {
-    return notificationMailProducer;
-  }
-  public void setNotificationMailProducer(MailProducer notificationMailProducer) {
-    this.notificationMailProducer = notificationMailProducer;
-  }
 }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskImpl.java	2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskImpl.java	2009-05-23 12:41:04 UTC (rev 4876)
@@ -23,19 +23,17 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import javax.mail.Message;
-
 import org.jbpm.api.Execution;
 import org.jbpm.api.JbpmException;
 import org.jbpm.api.env.Environment;
 import org.jbpm.api.model.Comment;
+import org.jbpm.api.model.Event;
 import org.jbpm.api.session.TaskDbSession;
 import org.jbpm.api.task.Assignable;
 import org.jbpm.api.task.OpenTask;
@@ -43,8 +41,6 @@
 import org.jbpm.api.task.Swimlane;
 import org.jbpm.api.task.Task;
 import org.jbpm.api.task.TaskHandler;
-import org.jbpm.pvm.internal.email.spi.MailProducer;
-import org.jbpm.pvm.internal.email.spi.MailSession;
 import org.jbpm.pvm.internal.history.events.TaskAssign;
 import org.jbpm.pvm.internal.history.events.TaskCancel;
 import org.jbpm.pvm.internal.history.events.TaskComplete;
@@ -125,27 +121,12 @@
 
   public void setAssignee(String userId, boolean propagateToSwimlane) {
     this.assignee = userId;
-    notifyAssignee();
     if (propagateToSwimlane) {
       propagateAssigneeToSwimlane();
     }
-  }
-
-  protected void notifyAssignee() {
-    if (taskDefinition == null) return;
-
-    MailProducer mailProducer = taskDefinition.getNotificationMailProducer();
-    if (mailProducer == null) return;
-
-    // TODO how to insert predefined variables cleanly?
-    execution.setVariable("task", this);
-    try {
-      Collection<Message> messages = mailProducer.produce(execution);
-      Environment.getFromCurrent(MailSession.class).send(messages);
+    if (execution != null) {
+      execution.fire(Event.ASSIGN, execution.getActivity());
     }
-    finally {
-      execution.removeVariable("task");
-    }
   }
 
   protected void propagateAssigneeToSwimlane() {
@@ -345,10 +326,6 @@
     this.progress = progress;
   }
 
-  public boolean isPersisted() {
-    return dbid != 0;
-  }
-
   public void cancelExecution(String signal) {
     if (execution != null) {
       execution.end("cancel");




More information about the jbpm-commits mailing list