[jbpm-commits] JBoss JBPM SVN: r4867 - in jbpm4/trunk/modules: api/src/main/java/org/jbpm/api/activity and 27 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu May 21 05:29:36 EDT 2009


Author: alex.guizar at jboss.com
Date: 2009-05-21 05:29:36 -0400 (Thu, 21 May 2009)
New Revision: 4867

Added:
   jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification/
   jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification/MailNotificationTest.java
   jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification/
   jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification/process.jpdl.xml
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/history/events/TaskAssign.java
Removed:
   jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification/MailNotificationTest.java
   jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification/process.jpdl.xml
Modified:
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/ExecutionService.java
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/activity/ExternalActivityBehaviour.java
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/client/ClientExecution.java
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/OpenTask.java
   jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/TaskHandler.java
   jbpm4/trunk/modules/enterprise/src/test/java/org/jbpm/enterprise/internal/custom/WaitState.java
   jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/mail/template/TemplateMailTest.java
   jbpm4/trunk/modules/examples/src/test/resources/jbpm.mail.templates.examples.xml
   jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/mail/template/process.jpdl.xml
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/GroupActivity.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/StateActivity.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessActivity.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/xml/JpdlParser.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/SignalCmd.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/StartProcessInstanceInLatestCmd.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/VariablesCmd.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/AttachmentTemplate.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/email/impl/MailSessionImpl.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/identity/impl/IdentitySessionImpl.java
   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/ScopeInstanceImpl.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/Signal.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/svc/ExecutionServiceImpl.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycleState.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
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/XmlUtil.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java
   jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/activities/WaitState.java
   jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/executionmode/embedded/WaitState.java
   jbpm4/trunk/modules/test-load/src/test/java/org/jbpm/test/load/async/ExclusiveMessagesTest.java
   jbpm4/trunk/modules/test-load/src/test/java/org/jbpm/test/load/async/WaitState.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/AutomaticDecisionTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/BasicExecutionFlowTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExceptionHandlerTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExecutionStateTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExternalDecisionTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/FunctionalActivityTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/LoopingTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeStateTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableDeclarationTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/SubProcessTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/VariableTest.java
   jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/WaitState.java
Log:
JBPM-2254 restore build broken by query change in IdentitySessionImpl; reintroduce variable API change after clarifying the intent

Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/ExecutionService.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/ExecutionService.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/ExecutionService.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -70,14 +70,14 @@
    * @param variables are the initial values of the process variables that
    *   will be set before the execution starts (read: before the initial
    *   activity is executed). */
-  ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);
+  ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables);
 
   /** starts a new process instance in the latest version of the given processDefinitionName.
    * @param processDefinitionKey is the key of the process definition for which the latest version will be taken.
    * @param variables are the initial values of the process variables that will be set before the execution starts.
    * @param processInstanceKey is a user provided reference for the new execution that must be unique over all
    *    process versions with the same name. */
-  ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables, String processInstanceKey);
+  ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables, String processInstanceKey);
 
   /** the path of execution that is uniquely defined by the execution id. */
   Execution findExecutionById(String executionId);
@@ -92,10 +92,10 @@
   ProcessInstance signalExecutionById(String executionId, String signalName);
 
   /** provides a named external trigger to an execution with parameters. */
-  ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, Object> parameters);
+  ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, ?> parameters);
 
   /** provides a external trigger to an execution with parameters. */
-  ProcessInstance signalExecutionById(String executionId, Map<String, Object> parameters);
+  ProcessInstance signalExecutionById(String executionId, Map<String, ?> parameters);
 
 
   /** search for process instances with criteria */
@@ -105,7 +105,7 @@
   void setVariable(String executionId, String name, Object value);
 
   /** creates or overwrites the variable values on the referenced execution */
-  void setVariables(String executionId, Map<String, Object> variables);
+  void setVariables(String executionId, Map<String, ?> variables);
 
   /** retrieves a variable */
   Object getVariable(String executionId, String variableName);

Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/activity/ExternalActivityBehaviour.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/activity/ExternalActivityBehaviour.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/activity/ExternalActivityBehaviour.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -64,5 +64,5 @@
    *   considered non recoverable.  After an Exception, the execution should not be 
    *   used any more and if this is during a transaction, the transaction should be 
    *   rolled back. */
-  void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) throws Exception;
+  void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception;
 }

Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/client/ClientExecution.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/client/ClientExecution.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/client/ClientExecution.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -94,7 +94,7 @@
    * 
    * @see #signal() See the unnamed signal for more information
    */
-  void signal(Map<String, Object> parameters);
+  void signal(Map<String, ?> parameters);
 
   /** feeds a named {@link #signal() external trigger} into the execution with parameters.
    *
@@ -111,7 +111,7 @@
    * 
    * @see #signal() See the unnamed signal for more information
    */
-  void signal(String signalName, Map<String, Object> parameters);
+  void signal(String signalName, Map<String, ?> parameters);
 
   /** feeds a external trigger into the given execution.
    * 
@@ -154,7 +154,7 @@
    * 
    * @see #signal() See the unnamed signal for more information
    */
-  void signal(Map<String, Object> parameters, Execution execution);
+  void signal(Map<String, ?> parameters, Execution execution);
 
   /** feeds a named {@link #signal() external trigger} into a given execution with parameters.
    *
@@ -171,7 +171,7 @@
    * 
    * @see #signal() See the unnamed signal for more information
    */
-  void signal(String signalName, Map<String, Object> parameters, Execution execution);
+  void signal(String signalName, Map<String, ?> parameters, Execution execution);
 
   
   /** suspends this execution and all it's child executions.  Human tasks 

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-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -21,7 +21,6 @@
  */
 package org.jbpm.api.model;
 
-import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
 
@@ -29,7 +28,6 @@
 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 
  * model.
@@ -78,7 +76,7 @@
    * variables will <b>not</b> be removed. 
    * @throws JbpmException is variables is not null and if null is present 
    * as a key in the provided variables map. */
-  void setVariables(Map<String, Object> variables);
+  void setVariables(Map<String, ?> variables);
 
   /** indicates presenve of the given key. 
    * No exception will be thrown if key is null. 

Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/OpenTask.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/OpenTask.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/OpenTask.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -37,6 +37,9 @@
   /** fires a history event that marks the start of this task. */
   void historyTaskStart();
 
+  /** fires a history event that marks the assignment of this task. */
+  void historyTaskAssign(String userId);
+
   /** fires a history event that marks the completion of this task. */
   void historyTaskComplete(String outcome);
   

Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/TaskHandler.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/TaskHandler.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/TaskHandler.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -21,7 +21,6 @@
  */
 package org.jbpm.api.task;
 
-
 /** for advanced task customization.
  * 
  * The default implementation can be found in {@link DefaultTaskHandler}.
@@ -30,7 +29,7 @@
  */
 public class TaskHandler {
 
-  /** is called after the task is created according 
+  /** called after the task is created according 
    * to the task definition.  This method allows to 
    * create subtasks.
    * @return indicates if the process execution should wait. */
@@ -39,7 +38,7 @@
     return true;
   }
   
-  /** is called when the related execution gets a 
+  /** called when the related execution gets a 
    * signal.  this method must either 
    * {@link OpenTask#setSignalling(boolean) remove signalling} from this task
    * or {@link OpenTask#cancel(String) cancel} it. */
@@ -47,12 +46,17 @@
     task.setSignalling(false);
   }
   
-  /** is called when this task is cancelled. */ 
+  /** called when the given task is assigned to an actor. */
+  public void taskAssign(OpenTask task, String userId) {
+    task.historyTaskAssign(userId);
+  }
+
+  /** called when the given task is cancelled. */ 
   public void taskCancel(OpenTask task, String reason) {
     task.historyTaskCancel(reason);
   }
   
-  /** is called when this task completes.  The default behaviour 
+  /** called when the given task completes.  The default behaviour 
    * will send a signal to the execution if this task is still signalling. */
   public void taskComplete(OpenTask task, String outcome) {
     task.historyTaskComplete(outcome);

Modified: jbpm4/trunk/modules/enterprise/src/test/java/org/jbpm/enterprise/internal/custom/WaitState.java
===================================================================
--- jbpm4/trunk/modules/enterprise/src/test/java/org/jbpm/enterprise/internal/custom/WaitState.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/enterprise/src/test/java/org/jbpm/enterprise/internal/custom/WaitState.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -39,7 +39,7 @@
     execution.waitForSignal();
   }
 
-  public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters)
+  public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters)
       throws Exception {
     if (parameters != null) {
       execution.setVariables(parameters);

Modified: jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/mail/template/TemplateMailTest.java
===================================================================
--- jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/mail/template/TemplateMailTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/mail/template/TemplateMailTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -98,7 +98,7 @@
       // start process instance
       executionService.startProcessInstanceByKey("TemplateMail", variables);
 
-      // examine produced message
+      // examine produced messages
       List<WiserMessage> wisMessages = wiser.getMessages();
       // winston, bb, innerparty(obrien), thinkpol(charr, obrien)
       assertEquals(5, wisMessages.size());

Copied: jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification (from rev 4865, jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification)

Deleted: jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification/MailNotificationTest.java
===================================================================
--- jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification/MailNotificationTest.java	2009-05-21 06:16:03 UTC (rev 4865)
+++ jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification/MailNotificationTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -1,99 +0,0 @@
-/*
- * 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.examples.task.notification;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import javax.mail.Address;
-import javax.mail.MessagingException;
-import javax.mail.Message.RecipientType;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
-
-import org.subethamail.wiser.Wiser;
-import org.subethamail.wiser.WiserMessage;
-
-import org.jbpm.examples.task.assignee.Order;
-import org.jbpm.test.JbpmTestCase;
-
-/**
- * @author Alejandro Guizar
- */
-public class MailNotificationTest extends JbpmTestCase {
-
-  Wiser wiser = new Wiser();
-
-  protected void setUp() throws Exception {
-    super.setUp();
-
-    // deploy process
-    long deploymentDbid = repositoryService.createDeployment()
-        .addResourceFromClasspath("org/jbpm/examples/task/notification/process.jpdl.xml")
-        .deploy();
-    registerDeployment(deploymentDbid);
-
-    // create actors
-    identityService.createUser("johndoe", "John", "Doe", "john at doe");
-
-    // start mail server
-    wiser.setPort(2525);
-    wiser.start();
-  }
-
-  protected void tearDown() throws Exception {
-    // stop mail server
-    wiser.stop();
-
-    // delete actors
-    identityService.deleteUser("johndoe");
-
-    super.tearDown();
-  }
-
-  public void testTaskNotification() throws MessagingException, IOException {
-    Map<String, Order> variables = Collections.singletonMap("order", new Order("johndoe"));
-    executionService.startProcessInstanceByKey("TaskAssignee", variables);
-
-    // examine produced messages
-    List<WiserMessage> wiserMessages = wiser.getMessages();
-    assertEquals(1, wiserMessages.size());
-
-    WiserMessage wiserMessage = wiserMessages.get(0);
-    MimeMessage message = wiserMessage.getMimeMessage();
-    // from
-    Address[] from = message.getFrom();
-    assertEquals(1, from.length);
-    assertEquals("noreply at jbpm.org", from[0].toString());
-    // to
-    Address[] expectedTo = InternetAddress.parse("john at doe");
-    Address[] to = message.getRecipients(RecipientType.TO);
-    assert Arrays.equals(expectedTo, to) : Arrays.asList(to);
-    // subject
-    assertEquals("review", message.getSubject());
-    // text
-    assertTextPresent("Task \"review\" has been assigned to you.", (String) message.getContent());
-  }
-}

Copied: jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification/MailNotificationTest.java (from rev 4865, jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification/MailNotificationTest.java)
===================================================================
--- jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification/MailNotificationTest.java	                        (rev 0)
+++ jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/task/notification/MailNotificationTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -0,0 +1,99 @@
+/*
+ * 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.examples.task.notification;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.mail.Address;
+import javax.mail.MessagingException;
+import javax.mail.Message.RecipientType;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+
+import org.subethamail.wiser.Wiser;
+import org.subethamail.wiser.WiserMessage;
+
+import org.jbpm.examples.task.assignee.Order;
+import org.jbpm.test.JbpmTestCase;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class MailNotificationTest extends JbpmTestCase {
+
+  Wiser wiser = new Wiser();
+
+  protected void setUp() throws Exception {
+    super.setUp();
+
+    // deploy process
+    long deploymentDbid = repositoryService.createDeployment()
+        .addResourceFromClasspath("org/jbpm/examples/task/notification/process.jpdl.xml")
+        .deploy();
+    registerDeployment(deploymentDbid);
+
+    // create actors
+    identityService.createUser("johndoe", "John", "Doe", "john at doe");
+
+    // start mail server
+    wiser.setPort(2525);
+    wiser.start();
+  }
+
+  protected void tearDown() throws Exception {
+    // stop mail server
+    wiser.stop();
+
+    // delete actors
+    identityService.deleteUser("johndoe");
+
+    super.tearDown();
+  }
+
+  public void testTaskNotification() throws MessagingException, IOException {
+    Map<String, Order> variables = Collections.singletonMap("order", new Order("johndoe"));
+    executionService.startProcessInstanceByKey("TaskAssignee", variables);
+
+    // examine produced messages
+    List<WiserMessage> wiserMessages = wiser.getMessages();
+    assertEquals(1, wiserMessages.size());
+
+    WiserMessage wiserMessage = wiserMessages.get(0);
+    MimeMessage message = wiserMessage.getMimeMessage();
+    // from
+    Address[] from = message.getFrom();
+    assertEquals(1, from.length);
+    assertEquals("noreply at jbpm.org", from[0].toString());
+    // to
+    Address[] expectedTo = InternetAddress.parse("john at doe");
+    Address[] to = message.getRecipients(RecipientType.TO);
+    assert Arrays.equals(expectedTo, to) : Arrays.asList(to);
+    // subject
+    assertEquals("review", message.getSubject());
+    // text
+    assertTextPresent("Task \"review\" has been assigned to you.", (String) message.getContent());
+  }
+}

Modified: jbpm4/trunk/modules/examples/src/test/resources/jbpm.mail.templates.examples.xml
===================================================================
--- jbpm4/trunk/modules/examples/src/test/resources/jbpm.mail.templates.examples.xml	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/examples/src/test/resources/jbpm.mail.templates.examples.xml	2009-05-21 09:29:36 UTC (rev 4867)
@@ -4,7 +4,29 @@
 
   <process-engine-context>
 
-    <mail-template name="rectify template">
+    <mail-template name='task-notification'>
+      <to users="${task.assignee}"/>
+      <subject>${task.name}</subject>
+      <text><![CDATA[Hi ${task.assignee},
+Task "${task.name}" has been assigned to you.
+${task.description}
+
+Sent by JBoss jBPM
+]]></text>
+    </mail-template>
+  
+    <mail-template name='task-reminder'>
+      <to users="${task.assignee}"/>
+      <subject>${task.name}</subject>
+      <text><![CDATA[Hey ${task.assignee},
+Do not forget about task "${task.name}".
+${task.description}
+
+Sent by JBoss jBPM
+]]></text>
+    </mail-template>
+
+    <mail-template name="rectify-template">
       <to addresses="${addressee}" />
       <cc users="bb" groups="innerparty" />
       <bcc groups="thinkpol" />

Modified: jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/mail/template/process.jpdl.xml
===================================================================
--- jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/mail/template/process.jpdl.xml	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/mail/template/process.jpdl.xml	2009-05-21 09:29:36 UTC (rev 4867)
@@ -6,7 +6,7 @@
     <transition to="send rectify note" />
   </start>
 
-  <mail name="send rectify note" template="rectify template">
+  <mail name="send rectify note" template="rectify-template">
     <transition to="end" />
   </mail>
 

Copied: jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification (from rev 4865, jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification)

Deleted: jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification/process.jpdl.xml
===================================================================
--- jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification/process.jpdl.xml	2009-05-21 06:16:03 UTC (rev 4865)
+++ jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification/process.jpdl.xml	2009-05-21 09:29:36 UTC (rev 4867)
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<process name="TaskAssignee">
-
-  <start g="20,20,48,48">
-    <transition to="review"/>
-  </start>
-
-  <task name="review" 
-        assignee="#{order.owner}"
-        g="96,16,127,52">
-     <notification/> 
-     <transition to="wait"/>
-  </task>
-  
-  <state name="wait" g="255,16,88,52"/>
-
-</process>

Copied: jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification/process.jpdl.xml (from rev 4865, jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification/process.jpdl.xml)
===================================================================
--- jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification/process.jpdl.xml	                        (rev 0)
+++ jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/task/notification/process.jpdl.xml	2009-05-21 09:29:36 UTC (rev 4867)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<process name="TaskAssignee">
+
+  <start g="20,20,48,48">
+    <transition to="review"/>
+  </start>
+
+  <task name="review" 
+        assignee="#{order.owner}"
+        g="96,16,127,52">
+     <notification/> 
+     <transition to="wait"/>
+  </task>
+  
+  <state name="wait" g="255,16,88,52"/>
+
+</process>

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/GroupActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/GroupActivity.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/GroupActivity.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -83,7 +83,7 @@
     return startActivities;
   }
 
-  public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) throws Exception {
+  public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
     Transition transition = null;
     Activity activity = execution.getActivity();
     List<Transition> outgoingTransitions = activity.getOutgoingTransitions();

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailBinding.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailBinding.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -23,14 +23,7 @@
 
 import org.w3c.dom.Element;
 
-import org.jbpm.api.env.Environment;
-import org.jbpm.pvm.internal.email.impl.MailProducerImpl;
-import org.jbpm.pvm.internal.email.impl.MailTemplate;
-import org.jbpm.pvm.internal.email.impl.MailTemplateRegistry;
-import org.jbpm.pvm.internal.email.spi.MailProducer;
-import org.jbpm.pvm.internal.util.XmlUtil;
-import org.jbpm.pvm.internal.wire.binding.MailTemplateBinding;
-import org.jbpm.pvm.internal.wire.binding.ObjectBinding;
+import org.jbpm.jpdl.internal.xml.JpdlParser;
 import org.jbpm.pvm.internal.xml.Parse;
 import org.jbpm.pvm.internal.xml.Parser;
 
@@ -39,48 +32,13 @@
  */
 public class MailBinding extends JpdlBinding {
 
-  private static final ObjectBinding objectBinding = new ObjectBinding();
-  private static final MailTemplateBinding templateBinding = new MailTemplateBinding();
-
   public MailBinding() {
     super("mail");
   }
 
   public Object parse(Element element, Parse parse, Parser parser) {
     MailActivity activity = new MailActivity();
-    activity.setMailProducer(parseProducer(element, parse, parser));
+    activity.setMailProducer(JpdlParser.parseMailProducer(element, parse, null));
     return activity;
   }
-
-  protected MailProducer parseProducer(Element element, Parse parse, Parser parser) {
-    // check whether the element is a generic object descriptor
-    if (ObjectBinding.isObjectDescriptor(element)) {
-      return (MailProducer) objectBinding.parse(element, parse, parser);
-    }
-
-    // parse the default producer
-    MailProducerImpl mailProducer = new MailProducerImpl();
-    mailProducer.setTemplate(parseTemplate(element, parse, parser));
-    return mailProducer;
-  }
-
-  protected MailTemplate parseTemplate(Element element, Parse parse, Parser parser) {
-    MailTemplate template;
-
-    // look for template reference
-    String templateName = XmlUtil.attribute(element, "template");
-    if (templateName != null) {
-      // load template from configuration
-      MailTemplateRegistry templateRegistry = Environment.getFromCurrent(MailTemplateRegistry.class);
-      template = templateRegistry.getTemplate(templateName);
-      if (template == null) {
-        parse.addProblem("mail template not found: " + templateName, element);
-      }
-    }
-    else {
-      // parse inline template
-      template = templateBinding.parseMailTemplate(element, parse, parser);
-    }
-    return template;
-  }
 }

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/StateActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/StateActivity.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/StateActivity.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -40,7 +40,7 @@
     execution.waitForSignal();
   }
 
-  public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+  public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
     Activity activity = execution.getActivity();
     
     if (parameters!=null) {

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessActivity.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessActivity.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -87,7 +87,7 @@
     execution.waitForSignal();
   }
 
-  public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+  public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
     JpdlExecution jpdlExecution = execution.getExtension(JpdlExecution.class);
 
     ExecutionImpl subProcessInstance = jpdlExecution.getSubProcessInstance();

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-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -61,7 +61,7 @@
     }
   }
   
-  public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+  public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
     Activity activity = execution.getActivity();
     
     if (parameters!=null) {

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-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -38,6 +38,10 @@
 import org.jbpm.internal.log.Log;
 import org.jbpm.jpdl.internal.activity.JpdlBinding;
 import org.jbpm.jpdl.internal.model.JpdlProcessDefinition;
+import org.jbpm.pvm.internal.email.impl.MailProducerImpl;
+import org.jbpm.pvm.internal.email.impl.MailTemplate;
+import org.jbpm.pvm.internal.email.impl.MailTemplateRegistry;
+import org.jbpm.pvm.internal.email.spi.MailProducer;
 import org.jbpm.pvm.internal.model.ActivityCoordinatesImpl;
 import org.jbpm.pvm.internal.model.ActivityImpl;
 import org.jbpm.pvm.internal.model.CompositeElementImpl;
@@ -58,6 +62,10 @@
 import org.jbpm.pvm.internal.util.ReflectUtil;
 import org.jbpm.pvm.internal.util.XmlUtil;
 import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.binding.MailTemplateBinding;
+import org.jbpm.pvm.internal.wire.binding.ObjectBinding;
 import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
 import org.jbpm.pvm.internal.wire.operation.Operation;
 import org.jbpm.pvm.internal.wire.xml.WireParser;
@@ -461,6 +469,13 @@
   
     JpdlParser.parseAssignmentAttributes(element, taskDefinition, parse);
     
+    // parse notification mail producer
+    Element notificationElement = XmlUtil.element(element, "notification");
+    if (notificationElement != null) {
+      MailProducer mailProducer = parseMailProducer(notificationElement, parse, "task-notification");
+      taskDefinition.setNotificationMailProducer(mailProducer);
+    }
+
     return taskDefinition;
   }
 
@@ -552,4 +567,49 @@
     return variableOutDefinitionSet;
   }
 
+  public static MailProducer parseMailProducer(Element element, Parse parse,
+      String defaultTemplateName) {
+    // check whether the element is a generic object descriptor
+    if (ObjectBinding.isObjectDescriptor(element)) {
+      // TODO test custom mail producer
+      ObjectDescriptor objectDescriptor = parseObjectDescriptor(element, parse);
+      WireDefinition wireDefinition = parse.findObject(WireDefinition.class);
+      return (MailProducer) objectDescriptor.construct(new WireContext(wireDefinition));
+    }
+
+    // parse the default producer
+    MailProducerImpl mailProducer = new MailProducerImpl();
+    mailProducer.setTemplate(parseMailTemplate(element, parse, defaultTemplateName));
+    return mailProducer;
+  }
+
+  private static MailTemplate parseMailTemplate(Element element, Parse parse,
+      String defaultTemplateName) {
+    if (element.hasAttribute("template")) {
+      // fetch template from configuration
+      return findTemplate(element, parse, element.getAttribute("template"));
+    }
+    if (!XmlUtil.isTextOnly(element)) {
+      // parse inline template
+      return MailTemplateBinding.parseMailTemplate(element, parse);
+    }
+    if (defaultTemplateName != null) {
+      // fetch default template
+      return findTemplate(element, parse, defaultTemplateName);
+    }
+    parse.addProblem("mail template must be referenced in the 'template' attribute "
+        + "or specified inline", element);
+    return null;
+  }
+
+  private static MailTemplate findTemplate(Element element, Parse parse, String templateName) {
+    MailTemplateRegistry templateRegistry = Environment.getFromCurrent(MailTemplateRegistry.class);
+    if (templateRegistry != null) {
+      MailTemplate template = templateRegistry.getTemplate(templateName);
+      if (template != null) return template;
+    }
+    parse.addProblem("mail template not found: " + templateName, element);
+    return null;
+  }
+  
 }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/SignalCmd.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/SignalCmd.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/SignalCmd.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -38,9 +38,9 @@
 
   protected String executionId;
   protected String signalName;
-  protected Map<String, Object> parameters;
+  protected Map<String, ?> parameters;
 
-  public SignalCmd(String executionId, String signalName, Map<String, Object> parameters) {
+  public SignalCmd(String executionId, String signalName, Map<String, ?> parameters) {
     if (executionId==null) {
       throw new JbpmException("executionId is null");
     }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/StartProcessInstanceInLatestCmd.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/StartProcessInstanceInLatestCmd.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/StartProcessInstanceInLatestCmd.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -25,14 +25,12 @@
 
 import org.hibernate.Session;
 import org.jbpm.api.JbpmException;
-import org.jbpm.api.ProcessDefinitionQuery;
 import org.jbpm.api.ProcessInstance;
 import org.jbpm.api.client.ClientProcessDefinition;
 import org.jbpm.api.client.ClientProcessInstance;
 import org.jbpm.api.env.Environment;
 import org.jbpm.api.session.RepositorySession;
 
-
 /**
  * @author Tom Baeyens
  */
@@ -43,13 +41,13 @@
   protected String processDefinitionKey;
   protected String executionKey;
 
-  public StartProcessInstanceInLatestCmd(String processDefinitionKey, Map<String, Object> variables, String executionKey) {
+  public StartProcessInstanceInLatestCmd(String processDefinitionKey, Map<String, ?> variables, String executionKey) {
     if (processDefinitionKey==null) {
       throw new JbpmException("processDefinitionKey is null");
     }
     this.processDefinitionKey = processDefinitionKey;
-    this.variables = variables;
     this.executionKey = executionKey;
+    setVariables(variables);
   }
   
   public ProcessInstance execute(Environment environment) throws Exception {

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/VariablesCmd.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/VariablesCmd.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/VariablesCmd.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -36,28 +36,32 @@
 
   private static final long serialVersionUID = 1L;
 
-  protected Map<String, Object> variables;
+  protected Map<String, ?> variables;
+  private Map<String, Object> internalMap;
 
   public void addVariable(String key, Object variable) {
-    if (variables==null) {
-      variables = new HashMap<String, Object>();
+    if (internalMap == null) {
+      if (variables != null) {
+        throw new JbpmException("variables were set externally");
+      }
+      variables = internalMap = new HashMap<String, Object>();
     }
-    variables.put(key, variable);
+    internalMap.put(key, variable);
   }
 
-  public Map<String, Object> getVariables() {
+  public Map<String, ?> getVariables() {
     return variables;
   }
 
-  public void setVariables(Map<String, Object> variables) {
+  public void setVariables(Map<String, ?> variables) {
     this.variables = variables;
   }
-  
+
   protected ClientExecution getExecution(Environment environment, String executionId) {
     PvmDbSession dbSession = environment.get(PvmDbSession.class);
     ClientExecution execution = dbSession.findExecutionById(executionId);
-    if (execution==null) {
-      throw new JbpmException("execution "+executionId+" doesn't exist");
+    if (execution == null) {
+      throw new JbpmException("execution " + executionId + " doesn't exist");
     }
     return execution;
   }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/AttachmentTemplate.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/AttachmentTemplate.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/AttachmentTemplate.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -21,8 +21,6 @@
  */
 package org.jbpm.pvm.internal.email.impl;
 
-import java.net.URL;
-
 /**
  * @author Alejandro Guizar
  */

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-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -83,9 +83,16 @@
     return new MimeMessage((Session) null);
   }
 
+  /**
+   * Fills the <code>from</code> attribute of the given email. The sender addresses are an optional
+   * element in the mail template. If absent, each mail server supplies the current user's email
+   * address.
+   * 
+   * @see {@link InternetAddress#getLocalAddress(Session)}
+   */
   protected void fillFrom(Execution execution, Message email) {
     AddressTemplate fromTemplate = template.getFrom();
-    // from field is optional; if absent, each mail server will supply its "local address"
+    // "from" attribute is optional
     if (fromTemplate == null) return;
 
     // resolve and parse addresses
@@ -129,7 +136,10 @@
   }
 
   private String[] tokenizeActors(String recipients, Execution execution) {
-    return evaluateExpression(recipients, execution).split("[,|\\s]+");
+    String[] actors = evaluateExpression(recipients, execution).split("[,|\\s]+");
+    if (actors.length == 0)
+      throw new JbpmException("recipient list is empty: " + recipients);
+    return actors;
   }
 
   /** construct recipient addresses from user entities */
@@ -219,16 +229,20 @@
   }
 
   protected void fillSubject(Execution execution, Message email) {
-    String subject = evaluateExpression(template.getSubject(), execution);
-    try {
-      email.setSubject(subject);
+    String subject = template.getSubject();
+    if (subject != null) {
+      subject = evaluateExpression(subject, execution);
+      try {
+        email.setSubject(subject);
+      }
+      catch (MessagingException e) {
+        throw new JbpmException("failed to set subject to " + subject, e);
+      }
     }
-    catch (MessagingException e) {
-      throw new JbpmException("failed to set subject to " + subject, e);
-    }
   }
 
   protected void fillContent(Execution execution, Message email) {
+    String text = template.getText();
     String html = template.getHtml();
     List<AttachmentTemplate> attachmentTemplates = template.getAttachmentTemplates();
 
@@ -237,9 +251,9 @@
       Multipart multipart = new MimeMultipart("related");
 
       // text
-      if (template.getText() != null) {
+      if (text != null) {
         BodyPart textPart = new MimeBodyPart();
-        String text = evaluateExpression(template.getText(), execution);
+        text = evaluateExpression(text, execution);
         try {
           textPart.setText(text);
           multipart.addBodyPart(textPart);
@@ -274,9 +288,9 @@
         throw new JbpmException("failed to set multipart content: " + multipart, e);
       }
     }
-    else {
+    else if (text != null) {
       // unipart
-      String text = evaluateExpression(template.getText(), execution);
+      text = evaluateExpression(text, execution);
       try {
         email.setText(text);
       }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailSessionImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailSessionImpl.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailSessionImpl.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -10,7 +10,6 @@
 import javax.mail.Transport;
 import javax.mail.Message.RecipientType;
 import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
 
 import org.jbpm.api.JbpmException;
 import org.jbpm.pvm.internal.email.spi.MailSession;

Copied: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/history/events/TaskAssign.java (from rev 4865, jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/history/events/TaskAssign.java)
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/history/events/TaskAssign.java	                        (rev 0)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/history/events/TaskAssign.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -0,0 +1,44 @@
+/*
+ * 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.internal.history.events;
+
+import org.jbpm.pvm.internal.history.HistoryEvent;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class TaskAssign extends HistoryEvent {
+
+  private static final long serialVersionUID = 1L;
+
+  protected String userId;
+
+  public TaskAssign(String userId) {
+    this.userId = userId;
+  }
+
+  @Override
+  public void process() {
+    // TODO
+  }
+
+}

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/identity/impl/IdentitySessionImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/identity/impl/IdentitySessionImpl.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/identity/impl/IdentitySessionImpl.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -21,9 +21,9 @@
  */
 package org.jbpm.pvm.internal.identity.impl;
 
+import java.util.Arrays;
 import java.util.List;
 
-import org.hibernate.Query;
 import org.hibernate.Session;
 import org.hibernate.criterion.Projections;
 import org.hibernate.criterion.Restrictions;
@@ -39,7 +39,8 @@
 
   protected Session session;
 
-  public String createUser(String userName, String givenName, String familyName, String businessEmail) {
+  public String createUser(String userName, String givenName, String familyName,
+      String businessEmail) {
     UserImpl user = new UserImpl(userName, givenName, familyName);
     user.setBusinessEmail(businessEmail);
     session.save(user);
@@ -54,7 +55,13 @@
   }
 
   public List<User> findUsersById(String... userIds) {
-    return session.createCriteria(UserImpl.class).add(Restrictions.in("id", userIds)).list();
+    List<User> users = session.createCriteria(UserImpl.class)
+        .add(Restrictions.in("id", userIds))
+        .list();
+    if (userIds.length != users.size()) {
+      throw new JbpmException("not all users were found: " + Arrays.toString(userIds));
+    }
+    return users;
   }
 
   public List<User> findUsers() {
@@ -66,12 +73,9 @@
     User user = findUserById(userId);
 
     // cascade the deletion to the memberships 
-    Query query = session.createQuery("from "
-        + MembershipImpl.class.getName()
-        + " as m "
-        + "where m.user is :user");
-    query.setEntity("user", user);
-    List<MembershipImpl> memberships = query.list();
+    List<MembershipImpl> memberships = session.createCriteria(MembershipImpl.class)
+        .add(Restrictions.eq("user", user))
+        .list();
 
     // delete the related memberships 
     for (MembershipImpl membership : memberships) {
@@ -108,43 +112,31 @@
   }
 
   public GroupImpl findGroupById(String groupId) {
-    GroupImpl group = (GroupImpl) session.createQuery("select group "
-        + "from "
-        + GroupImpl.class.getName()
-        + " as group "
-        + "where group.id = '"
-        + groupId
-        + "'").uniqueResult();
-    return group;
+    return (GroupImpl) session.createCriteria(GroupImpl.class)
+        .add(Restrictions.eq("id", groupId))
+        .uniqueResult();
   }
 
   public List<Group> findGroupsByUserAndGroupType(String userId, String groupType) {
-    Query query = session.createQuery("select distinct membership.group "
-        + "from "
+    return session.createQuery("select distinct m.group"
+        + " from "
         + MembershipImpl.class.getName()
-        + " as membership "
-        + "where membership.user.id = '"
-        + userId
-        + "'"
-        + "  and membership.group.type = '"
-        + groupType
-        + "'");
-    return query.list();
+        + " as m where m.user.id = :userId"
+        + " and m.group.type = :groupType")
+        .setString("userId", userId)
+        .setString("groupType", groupType)
+        .list();
   }
 
   public List<Group> findGroupsByUser(String userId) {
-    Query query = session.createQuery("select distinct membership.group "
-        + "from "
+    return session.createQuery("select distinct m.group"
+        + " from "
         + MembershipImpl.class.getName()
-        + " as membership "
-        + "where membership.user.id = '"
-        + userId
-        + "'");
-    return query.list();
+        + " as m where m.user.id = :userId").setString("userId", userId).list();
   }
 
   public List<Group> findGroups() {
-    return session.createQuery("from " + GroupImpl.class.getName()).list();
+    return session.createCriteria(GroupImpl.class).list();
   }
 
   public void deleteGroup(String groupId) {
@@ -152,12 +144,9 @@
     GroupImpl group = findGroupById(groupId);
 
     // cascade the deletion to the memberships 
-    Query query = session.createQuery("from "
-        + MembershipImpl.class.getName()
-        + " as m "
-        + "where m.group is :group");
-    query.setEntity("group", group);
-    List<MembershipImpl> memberships = query.list();
+    List<MembershipImpl> memberships = session.createCriteria(MembershipImpl.class)
+        .add(Restrictions.eq("group", group))
+        .list();
 
     // delete the related memberships 
     for (MembershipImpl membership : memberships) {
@@ -173,7 +162,7 @@
     if (user == null) {
       throw new JbpmException("user " + userId + " doesn't exist");
     }
-    GroupImpl group = findGroupById(groupId);
+    Group group = findGroupById(groupId);
     if (group == null) {
       throw new JbpmException("group " + groupId + " doesn't exist");
     }
@@ -187,7 +176,13 @@
   }
 
   public void deleteMembership(String userId, String groupId, String role) {
-    throw new UnsupportedOperationException("please implement me");
+    MembershipImpl membership = (MembershipImpl) session.createCriteria(MembershipImpl.class)
+        .createAlias("user", "u")
+        .createAlias("group", "g")
+        .add(Restrictions.eq("u.id", userId))
+        .add(Restrictions.eq("g.id", groupId))
+        .uniqueResult();
+    session.delete(membership);
   }
 
   public void setSession(Session session) {

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	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -363,18 +363,18 @@
   // execution method : signal ////////////////////////////////////////////////
 
   public void signal() {
-    signal(null, (Map)null);
+    signal(null, (Map<String,?>)null);
   }
 
   public void signal(String signal) {
-    signal(signal, (Map)null);
+    signal(signal, (Map<String,?>)null);
   }
   
-  public void signal(Map<String, Object> parameters) {
+  public void signal(Map<String, ?> parameters) {
     signal(null, parameters);
   }
 
-  public void signal(String signal, Map<String, Object> parameters) {
+  public void signal(String signal, Map<String, ?> parameters) {
     checkActive();
     propagation = Propagation.EXPLICIT;
     if (getActivity()!=null) {
@@ -387,18 +387,18 @@
   }
   
   public void signal(Execution execution) {
-    ((ExecutionImpl)execution).signal(null, (Map)null);
+    ((ExecutionImpl)execution).signal(null, (Map<String,?>)null);
   }
 
   public void signal(String signalName, Execution execution) {
-    ((ExecutionImpl)execution).signal(signalName, (Map)null);
+    ((ExecutionImpl)execution).signal(signalName, (Map<String,?>)null);
   }
 
-  public void signal(Map<String, Object> parameters, Execution execution) {
+  public void signal(Map<String, ?> parameters, Execution execution) {
     ((ExecutionImpl)execution).signal(null, parameters);
   }
 
-  public void signal(String signalName, Map<String, Object> parameters, Execution execution) {
+  public void signal(String signalName, Map<String, ?> parameters, Execution execution) {
     ((ExecutionImpl)execution).signal(signalName, parameters);
   }
 

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	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -33,13 +33,10 @@
 
 import org.jbpm.api.Execution;
 import org.jbpm.api.JbpmException;
-import org.jbpm.api.client.ClientExecution;
-import org.jbpm.api.client.ClientProcessDefinition;
 import org.jbpm.api.env.Environment;
 import org.jbpm.api.job.Timer;
 import org.jbpm.api.session.TimerSession;
 import org.jbpm.internal.log.Log;
-import org.jbpm.pvm.internal.hibernate.HibernatePvmDbSession;
 import org.jbpm.pvm.internal.job.TimerImpl;
 import org.jbpm.pvm.internal.type.Converter;
 import org.jbpm.pvm.internal.type.Type;
@@ -168,18 +165,15 @@
     }
   }
   
-  public void setVariables(Map<String, Object> variables) {
+  public void setVariables(Map<String, ?> variables) {
     if (variables!=null) {
-      for (String key: variables.keySet()) {
-        Object value = variables.get(key);
-        setVariable(key, value);
-       }
+      for (Map.Entry<String, ?> entry : variables.entrySet()) {
+        setVariable(entry.getKey(), entry.getValue());
+      }
     }
   }
   
   public Object getVariable(String key) {
-    Object value = null;
-
     Variable variable = getVariableObject(key);
     if (variable!=null) {
       return variable.getValue();

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/Signal.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/Signal.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/Signal.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -39,10 +39,10 @@
   private static final Log log = Log.getLog(Signal.class.getName());
 
   String signalName;
-  Map<String, Object> parameters;
+  Map<String, ?> parameters;
   ActivityImpl activity;
 
-  public Signal(String signalName, Map<String, Object> parameters, ActivityImpl activity) {
+  public Signal(String signalName, Map<String, ?> parameters, ActivityImpl activity) {
     this.signalName = signalName;
     this.parameters = parameters;
     this.activity = activity;

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/svc/ExecutionServiceImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/svc/ExecutionServiceImpl.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/svc/ExecutionServiceImpl.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -22,7 +22,6 @@
 package org.jbpm.pvm.internal.svc;
 
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -33,7 +32,6 @@
 import org.jbpm.pvm.internal.cmd.DeleteProcessInstance;
 import org.jbpm.pvm.internal.cmd.EndProcessInstance;
 import org.jbpm.pvm.internal.cmd.FindExecutionCmd;
-import org.jbpm.pvm.internal.cmd.FindExecutionsCmd;
 import org.jbpm.pvm.internal.cmd.GetVariableNamesCmd;
 import org.jbpm.pvm.internal.cmd.GetVariablesCmd;
 import org.jbpm.pvm.internal.cmd.SetVariablesCmd;
@@ -42,7 +40,6 @@
 import org.jbpm.pvm.internal.cmd.StartProcessInstanceInLatestCmd;
 import org.jbpm.pvm.internal.query.ProcessInstanceQueryImpl;
 
-
 /**
  * @author Tom Baeyens
  */
@@ -68,7 +65,7 @@
     return commandService.execute(new StartProcessInstanceInLatestCmd(processDefinitionKey, null, null));
   }
   
-  public ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables){
+  public ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables){
     return commandService.execute(new StartProcessInstanceInLatestCmd(processDefinitionKey, variables, null));
   }
   
@@ -76,7 +73,7 @@
     return commandService.execute(new StartProcessInstanceInLatestCmd(processDefinitionKey, null, executionKey));
   }
 
-  public ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables, String executionKey){
+  public ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables, String executionKey){
     return commandService.execute(new StartProcessInstanceInLatestCmd(processDefinitionKey, variables, executionKey));
   }
 
@@ -90,11 +87,11 @@
     return commandService.execute(new SignalCmd(executionId, signalName, null));
   }
 
-  public ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, Object> parameters) {
+  public ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, ?> parameters) {
     return commandService.execute(new SignalCmd(executionId, signalName, parameters));
   }
 
-  public ProcessInstance signalExecutionById(String executionId, Map<String, Object> parameters) {
+  public ProcessInstance signalExecutionById(String executionId, Map<String, ?> parameters) {
     return commandService.execute(new SignalCmd(executionId, null, parameters));
   }
 
@@ -141,7 +138,7 @@
     commandService.execute(cmd);
   }
 
-  public void setVariables(String executionId, Map<String, Object> variables) {
+  public void setVariables(String executionId, Map<String, ?> variables) {
     SetVariablesCmd cmd = new SetVariablesCmd(executionId);
     cmd.setVariables(variables);
     commandService.execute(cmd);

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycleState.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycleState.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycleState.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -38,7 +38,7 @@
   }
 
   public void signal(ActivityExecution execution, String signalName,
-      Map<String, Object> parameters) throws Exception {
+      Map<String, ?> parameters) throws Exception {
     execution.take(signalName);
   }
 }

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-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -24,6 +24,7 @@
 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;
 
@@ -41,6 +42,8 @@
   protected SwimlaneDefinitionImpl swimlaneDefinition;
   protected Descriptor taskHandlerDescriptor;
 
+  protected transient MailProducer notificationMailProducer;
+
   public int getPriority() {
     return priority;
   }
@@ -77,4 +80,10 @@
   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-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskImpl.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -23,12 +23,15 @@
 
 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;
@@ -40,6 +43,9 @@
 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;
 import org.jbpm.pvm.internal.history.events.TaskStart;
@@ -52,16 +58,15 @@
 import org.jbpm.pvm.internal.wire.WireContext;
 
 /**
- * is one task instance that can be assigned to an actor (read: put in 
- * someones task list) and that can trigger the continuation of execution 
- * of the token upon completion.
+ * is one task instance that can be assigned to an actor (read: put in someone's task list) and that
+ * can trigger the continuation of execution of the token upon completion.
  */
 public class TaskImpl extends ScopeInstanceImpl implements Serializable, OpenTask, Assignable {
 
   private static final long serialVersionUID = 1L;
-  
+
   // private static Log log = Log.getLog(TaskImpl.class.getName());
-  
+
   private static final TaskHandler DEFAULT_TASK_HANDLER = new TaskHandler();
 
   protected String name;
@@ -85,48 +90,66 @@
 
   protected String taskDefinitionName;
   protected TaskDefinitionImpl taskDefinition;
-  
+
   protected ExecutionImpl execution;
   protected ExecutionImpl processInstance;
   protected SwimlaneImpl swimlane;
-  
+
   protected TaskImpl superTask;
   protected Set<TaskImpl> subTasks;
-  
+
   protected Long executionDbid;
   protected Long superTaskDbid;
 
   public TaskImpl() {
   }
-  
+
   // parent for variable lookup /////////////////////////////////////////////// 
 
   public ScopeInstanceImpl getParentVariableScope() {
     return execution;
   }
-  
+
   // assignment ///////////////////////////////////////////////////////////////
-  
+
   public void take(String userId) {
-    if (assignee!=null) {
-      throw new JbpmException("task already taken by "+this.assignee);
+    if (assignee != null) {
+      throw new JbpmException("task already taken by " + this.assignee);
     }
     setAssignee(userId, true);
   }
-  
+
   public void setAssignee(String userId) {
-    this.assignee = userId;
+    setAssignee(userId, false);
   }
 
   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);
+    }
+    finally {
+      execution.removeVariable("task");
+    }
+  }
+
   protected void propagateAssigneeToSwimlane() {
-    if (swimlane!=null) {
+    if (swimlane != null) {
       swimlane.setAssignee(assignee);
     }
   }
@@ -135,7 +158,7 @@
 
   // TODO: Why does it return the impl. not the interface?
   public Set<ParticipationImpl> getParticipations() {
-    if (participations ==null) {
+    if (participations == null) {
       return Collections.emptySet();
     }
     return participations;
@@ -143,17 +166,18 @@
 
   public Set<ParticipationImpl> getAllParticipants() {
     Set<ParticipationImpl> allRoles = null;
-    if (participations !=null) {
+    if (participations != null) {
       allRoles = new HashSet<ParticipationImpl>(participations);
-    } else {
+    }
+    else {
       allRoles = new HashSet<ParticipationImpl>();
     }
-    if (swimlane!=null) {
-      allRoles.addAll((Set)swimlane.getParticipations());
+    if (swimlane != null) {
+      allRoles.addAll((Set) swimlane.getParticipations());
     }
     return allRoles;
   }
-  
+
   public void addCandidateGroup(String groupId) {
     addParticipation(null, groupId, Participation.CANDIDATE);
   }
@@ -165,10 +189,10 @@
   public Participation addParticipation(String userId, String groupId, String type) {
     return addParticipant(new ParticipationImpl(userId, groupId, type));
   }
-  
+
   private Participation addParticipant(ParticipationImpl participation) {
     participation.setTask(this);
-    if (participations ==null) {
+    if (participations == null) {
       participations = new HashSet<ParticipationImpl>();
     }
     participations.add(participation);
@@ -176,16 +200,14 @@
   }
 
   public void removeParticipant(ParticipationImpl participation) {
-    if (participation==null) {
+    if (participation == null) {
       throw new JbpmException("participant is null");
     }
-    if ( (participations !=null)
-         && (participations.remove(participation))
-       ) {
+    if ((participations != null) && (participations.remove(participation))) {
       participation.setTask(null);
     }
   }
-  
+
   // completion ///////////////////////////////////////////////////////////////
 
   public void complete() {
@@ -194,7 +216,7 @@
 
   public void complete(String outcome) {
     getTaskHandler().taskComplete(this, outcome);
-    if (superTask!=null) {
+    if (superTask != null) {
       superTask.subTaskComplete(this, outcome);
     }
   }
@@ -206,23 +228,21 @@
   public void cancel(String reason) {
     getTaskHandler().taskCancel(this, reason);
   }
-  
+
   // state ////////////////////////////////////////////////////////////////////
-  
+
   public boolean isCompleted() {
     if (Task.STATE_COMPLETED.equals(state)) {
       return true;
     }
-    if ( (Task.STATE_OPEN.equals(state))
-         || (Task.STATE_SUSPENDED.equals(state))
-       ) {
+    if ((Task.STATE_OPEN.equals(state)) || (Task.STATE_SUSPENDED.equals(state))) {
       return false;
     }
     return true;
   }
 
   // variables ////////////////////////////////////////////////////////////////
-  
+
   public void setVariable(String key, Object value) {
     super.setVariable(key, value);
     getTaskHandler().taskVariableUpdate(this, key, value);
@@ -231,14 +251,14 @@
   // comments /////////////////////////////////////////////////////////////////
 
   public List<Comment> getComments() {
-    if (comments==null) {
+    if (comments == null) {
       return Collections.emptyList();
     }
     return (List) comments;
   }
 
   public Comment createComment(String commentText) {
-    if (comments==null) {
+    if (comments == null) {
       comments = new ArrayList<CommentImpl>();
     }
     CommentImpl comment = new CommentImpl(commentText);
@@ -247,18 +267,18 @@
   }
 
   public void removeComment(Comment comment) {
-    if (comment==null) {
+    if (comment == null) {
       throw new JbpmException("comment is null");
     }
-    if (comments!=null) {
+    if (comments != null) {
       comments.remove(comment);
     }
   }
-  
+
   // subtasks /////////////////////////////////////////////////////////////////
-  
+
   public Set<Task> getSubTasks() {
-    if (subTasks==null) {
+    if (subTasks == null) {
       return Collections.emptySet();
     }
     return (Set) subTasks;
@@ -267,7 +287,7 @@
   public TaskImpl createSubTask() {
     TaskDbSession taskDbSession = Environment.getFromCurrent(TaskDbSession.class);
     TaskImpl subTask = (TaskImpl) taskDbSession.createTask();
-    if (subTasks==null) {
+    if (subTasks == null) {
       subTasks = new HashSet<TaskImpl>();
     }
     addSubTask(subTask);
@@ -281,9 +301,9 @@
     subtask.setName(name);
     return subtask;
   }
-  
+
   public TaskImpl addSubTask(TaskImpl subtask) {
-    if (subTasks==null) {
+    if (subTasks == null) {
       subTasks = new HashSet<TaskImpl>();
     }
     subtask.setSuperTask(this);
@@ -292,211 +312,242 @@
   }
 
   public void removeSubTask(Task subtask) {
-    if (subtask==null) {
+    if (subtask == null) {
       throw new JbpmException("subtask is null");
     }
-    if ( (subTasks!=null)
-         && (subTasks.remove(subtask))
-       ) {
-      ((TaskImpl)subtask).setSuperTask(null);
+    if ((subTasks != null) && (subTasks.remove(subtask))) {
+      ((TaskImpl) subtask).setSuperTask(null);
     }
   }
-  
+
   // equals ///////////////////////////////////////////////////////////////////
   // hack to support comparing hibernate proxies against the real objects
   // since this always falls back to ==, we don't need to overwrite the hashcode
   public boolean equals(Object o) {
     return EqualsUtil.equals(this, o);
   }
-  
+
   public String toString() {
-    return "Task("+name+")";
+    return "Task(" + name + ")";
   }
 
   public String getLifeCycleResource() {
     // the default lifecycle can be overridden in subclasses
     return "jbpm.task.lifecycle.xml";
   }
-  
+
   // modified getters and setters /////////////////////////////////////////////
   public void setProgress(Integer progress) {
-    if ( (progress<0)
-         || (progress>100)
-       ) {
-      throw new JbpmException("task progress is a percentage (integer) and must be expressed between 0 and 100");
+    if ((progress < 0) || (progress > 100)) {
+      throw new JbpmException(
+          "task progress is a percentage (integer) and must be expressed between 0 and 100");
     }
     this.progress = progress;
   }
 
   public boolean isPersisted() {
-    return dbid!=0;
+    return dbid != 0;
   }
 
   public void cancelExecution(String signal) {
-    if (execution!=null){
+    if (execution != null) {
       execution.end("cancel");
     }
   }
 
+  public void historyTaskStart() {
+    if (execution != null) {
+      execution.fireHistoryEvent(new TaskStart(this));
+    }
+  }
+
+  public void historyTaskAssign(String userId) {
+    if (execution != null) {
+      execution.fireHistoryEvent(new TaskAssign(userId));
+    }
+  }
+
   public void historyTaskCancel(String reason) {
-    if (execution!=null){
+    if (execution != null) {
       execution.fireHistoryEvent(new TaskCancel(reason));
     }
   }
 
   public void historyTaskComplete(String outcome) {
-    if (execution!=null){
+    if (execution != null) {
       execution.fireHistoryEvent(new TaskComplete(outcome));
     }
   }
 
-  public void historyTaskStart() {
-    if (execution!=null){
-      execution.fireHistoryEvent(new TaskStart(this));
-    }
-  }
-
   public void signalExecution(String signalName) {
-    if (execution!=null){
+    if (execution != null) {
       execution.signal(signalName);
     }
   }
 
   public TaskHandler getTaskHandler() {
-    if ( (getTaskDefinition()==null)
-         || (taskDefinition.getTaskHandlerDescriptor()==null)
-       ) {
+    if ((getTaskDefinition() == null) || (taskDefinition.getTaskHandlerDescriptor() == null)) {
       return DEFAULT_TASK_HANDLER;
     }
-    
+
     TaskHandler taskHandler = (TaskHandler) WireContext.create(taskDefinition.getTaskHandlerDescriptor());
     return taskHandler;
   }
-  
+
   // special getters and setters //////////////////////////////////////////////
-  
+
   public TaskDefinitionImpl getTaskDefinition() {
-    if ( (taskDefinition==null)
-         && (taskDefinitionName!=null)
-         && (execution!=null)
-       ) {
+    if ((taskDefinition == null) && (taskDefinitionName != null) && (execution != null)) {
       ProcessDefinitionImpl processDefinition = execution.getProcessDefinition();
       taskDefinition = processDefinition.getTaskDefinition(taskDefinitionName);
     }
-         
+
     return taskDefinition;
   }
-  
+
   public void setTaskDefinition(TaskDefinitionImpl taskDefinition) {
     this.taskDefinition = taskDefinition;
     this.taskDefinitionName = taskDefinition.getName();
   }
 
-  
   // getters and setters //////////////////////////////////////////////////////
-  
+
   public long getDbid() {
     return dbid;
   }
+
   public String getName() {
     return name;
   }
+
   public void setName(String name) {
     this.name = name;
   }
+
   public String getDescription() {
     return description;
   }
+
   public void setDescription(String description) {
     this.description = description;
   }
+
   public int getPriority() {
     return priority;
   }
+
   public void setPriority(int priority) {
     this.priority = priority;
   }
+
   public void setComments(List<CommentImpl> comments) {
     this.comments = comments;
   }
+
   public Date getCreate() {
     return create;
   }
+
   public void setCreate(Date create) {
     this.create = create;
   }
+
   public Date getDueDate() {
     return dueDate;
   }
+
   public void setDueDate(Date dueDate) {
     this.dueDate = dueDate;
   }
+
   public ExecutionImpl getExecution() {
     return execution;
   }
+
   public void setExecution(Execution execution) {
     this.execution = (ExecutionImpl) execution;
   }
+
   public String getState() {
     return state;
   }
+
   public String getAssignee() {
     return assignee;
   }
+
   public Swimlane getSwimlane() {
     return swimlane;
   }
+
   public void setSwimlane(SwimlaneImpl swimlane) {
     this.swimlane = swimlane;
   }
+
   public TaskImpl getSuperTask() {
     return superTask;
   }
+
   public void setSuperTask(TaskImpl superTask) {
     this.superTask = superTask;
   }
+
   public Integer getProgress() {
     return progress;
   }
+
   public Long getExecutionDbid() {
     return executionDbid;
   }
+
   public void setExecutionDbid(Long executionDbid) {
     this.executionDbid = executionDbid;
   }
+
   public Long getSuperTaskDbid() {
     return superTaskDbid;
   }
+
   public void setSuperTaskDbid(Long parentTaskDbid) {
     this.superTaskDbid = parentTaskDbid;
   }
+
   public void setParticipations(Set<ParticipationImpl> participations) {
     this.participations = participations;
   }
+
   public void setState(String state) {
     this.state = state;
   }
+
   public void setExecution(ExecutionImpl execution) {
     this.execution = execution;
   }
+
   public void setSubTasks(Set<TaskImpl> subTasks) {
     this.subTasks = subTasks;
   }
+
   public ExecutionImpl getProcessInstance() {
     return processInstance;
   }
+
   public void setProcessInstance(ExecutionImpl processInstance) {
     this.processInstance = processInstance;
   }
+
   public boolean isSignalling() {
     return isSignalling;
   }
+
   public void setSignalling(boolean isSignalling) {
     this.isSignalling = isSignalling;
   }
+
   public String getForm() {
     return form;
   }
+
   public void setForm(String form) {
     this.form = form;
   }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/XmlUtil.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/XmlUtil.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/XmlUtil.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -247,14 +247,11 @@
   }
 
   public static boolean isTextOnly(Element element) {
-    boolean isTextOnly = true;
-    NodeList activityList = element.getChildNodes();
-    for (int i = 0; ((i < activityList.getLength()) && (isTextOnly)); i++) {
-      if (Element.class.isAssignableFrom(activityList.item(i).getClass())) {
-        isTextOnly = false;
-      }
+    for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+      if (child.getNodeType() == Node.ELEMENT_NODE)
+        return false;
     }
-    return isTextOnly;
+    return true;
   }
 
   public static List<Attr> attributes(Element element) {

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -47,7 +47,7 @@
   public Object parse(Element element, Parse parse, Parser parser) {
     // MailTemplateRegistry is added to the WireDescriptor with a ProvidedObjectDescriptor
     // The MailTemplateRegistry descriptor is lazy initialized by this binding 
-    // mail-templates will add a MailTemplate to the MailTemplateRegistry 
+    // mail-template will add a MailTemplate to the MailTemplateRegistry 
     ProvidedObjectDescriptor templateRegistryDescriptor;
     MailTemplateRegistry templateRegistry;
 
@@ -57,7 +57,6 @@
     if (templateRegistryDescriptorName != null) {
       templateRegistryDescriptor = (ProvidedObjectDescriptor) wireDefinition.getDescriptor(templateRegistryDescriptorName);
       templateRegistry = (MailTemplateRegistry) templateRegistryDescriptor.getProvidedObject();
-      templateRegistryDescriptor = null; // setting it to null so that the wire parser doesn't add it to the wiredefinition again 
     }
     else {
       templateRegistry = new MailTemplateRegistry();
@@ -65,21 +64,21 @@
     }
 
     // create the mail template and add it to the registry
-    MailTemplate mailTemplate = parseMailTemplate(element, parse, parser);
+    MailTemplate mailTemplate = parseMailTemplate(element, parse);
     String templateName = XmlUtil.attribute(element, "name", true, parse);
     templateRegistry.addTemplate(templateName, mailTemplate);
 
     return templateRegistryDescriptor;
   }
 
-  public MailTemplate parseMailTemplate(Element element, Parse parse, Parser parser) {
+  public static MailTemplate parseMailTemplate(Element element, Parse parse) {
     MailTemplate mailTemplate = new MailTemplate();
     mailTemplate.setLanguage(XmlUtil.attribute(element, "language"));
 
-    mailTemplate.setFrom(parseRecipientTemplate(element, "from", parse, parser));
-    mailTemplate.setTo(parseRecipientTemplate(element, "to", parse, parser));
-    mailTemplate.setCc(parseRecipientTemplate(element, "cc", parse, parser));
-    mailTemplate.setBcc(parseRecipientTemplate(element, "bcc", parse, parser));
+    mailTemplate.setFrom(parseRecipientTemplate(element, "from", parse));
+    mailTemplate.setTo(parseRecipientTemplate(element, "to", parse));
+    mailTemplate.setCc(parseRecipientTemplate(element, "cc", parse));
+    mailTemplate.setBcc(parseRecipientTemplate(element, "bcc", parse));
 
     Element subjectElement = XmlUtil.element(element, "subject");
     if (subjectElement != null) {
@@ -117,15 +116,22 @@
     return mailTemplate;
   }
 
-  protected AddressTemplate parseRecipientTemplate(Element element, String tagName, Parse parse,
-      Parser parser) {
+  private static AddressTemplate parseRecipientTemplate(Element element, String tagName, Parse parse) {
     Element recipientElement = XmlUtil.element(element, tagName);
     if (recipientElement == null) return null;
 
+    String addresses = XmlUtil.attribute(recipientElement, "addresses");
+    String users = XmlUtil.attribute(recipientElement, "users");
+    String groups = XmlUtil.attribute(recipientElement, "groups");
+
+    if (addresses == null && users == null && groups == null) {
+      parse.addProblem(tagName + " does not specify any recipient", element);
+    }
+
     AddressTemplate addressTemplate = new AddressTemplate();
-    addressTemplate.setAddresses(XmlUtil.attribute(recipientElement, "addresses"));
-    addressTemplate.setUsers(XmlUtil.attribute(recipientElement, "users"));
-    addressTemplate.setGroups(XmlUtil.attribute(recipientElement, "groups"));
+    addressTemplate.setAddresses(addresses);
+    addressTemplate.setUsers(users);
+    addressTemplate.setGroups(groups);
     return addressTemplate;
   }
 }

Modified: jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/activities/WaitState.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/activities/WaitState.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/activities/WaitState.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -39,7 +39,7 @@
 
   public void signal(ActivityExecution execution, 
                      String signalName, 
-                     Map<String, Object> parameters) {
+                     Map<String, ?> parameters) {
     execution.setVariables(parameters);
     execution.take(signalName);
   }

Modified: jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/executionmode/embedded/WaitState.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/executionmode/embedded/WaitState.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/executionmode/embedded/WaitState.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -40,7 +40,7 @@
     execution.waitForSignal();
   }
 
-  public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) throws Exception {
+  public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
     execution.take(signalName);
   }
 }
\ No newline at end of file

Modified: jbpm4/trunk/modules/test-load/src/test/java/org/jbpm/test/load/async/ExclusiveMessagesTest.java
===================================================================
--- jbpm4/trunk/modules/test-load/src/test/java/org/jbpm/test/load/async/ExclusiveMessagesTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-load/src/test/java/org/jbpm/test/load/async/ExclusiveMessagesTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -92,7 +92,7 @@
     public void execute(ActivityExecution execution) throws Exception {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) throws Exception {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
       execution.take(signalName);
     }
   }

Modified: jbpm4/trunk/modules/test-load/src/test/java/org/jbpm/test/load/async/WaitState.java
===================================================================
--- jbpm4/trunk/modules/test-load/src/test/java/org/jbpm/test/load/async/WaitState.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-load/src/test/java/org/jbpm/test/load/async/WaitState.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -40,7 +40,7 @@
     ContinuationTest.recorder.record(execution.getId(), "execute("+execution.getActivity().getName()+")");
   }
 
-  public void signal(ActivityExecution execution, String signal, Map<String, Object> parameters) throws Exception {
+  public void signal(ActivityExecution execution, String signal, Map<String, ?> parameters) throws Exception {
     throw new UnsupportedOperationException();
   }
 }
\ No newline at end of file

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/AutomaticDecisionTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/AutomaticDecisionTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/AutomaticDecisionTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -60,7 +60,7 @@
     public void execute(ActivityExecution execution) {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
       execution.take(signalName);
     }
   }

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/BasicExecutionFlowTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/BasicExecutionFlowTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/BasicExecutionFlowTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -64,7 +64,7 @@
       events.add("execute["+execution.getActivityName()+"]");
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) throws Exception {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
       events.add("signal["+execution.getActivityName()+"]");
       execution.take(signalName);
     }

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -170,7 +170,7 @@
     public void execute(ActivityExecution execution) throws Exception {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signal, Map<String, Object> parameters) throws Exception {
+    public void signal(ActivityExecution execution, String signal, Map<String, ?> parameters) throws Exception {
       Activity activity = execution.getActivity();
       if ( (signal!=null)
            && (activity!=null)

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExceptionHandlerTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExceptionHandlerTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExceptionHandlerTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -44,7 +44,7 @@
     public void execute(ActivityExecution execution) {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters){
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters){
     }
   }
 

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExecutionStateTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExecutionStateTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExecutionStateTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -70,7 +70,7 @@
       assertEquals(Execution.STATE_ACTIVE_ROOT, execution.getState());
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
       assertEquals(Execution.STATE_ACTIVE_ROOT, execution.getState());
       execution.take(signalName);
     }

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExternalDecisionTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExternalDecisionTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ExternalDecisionTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -42,7 +42,7 @@
     public void execute(ActivityExecution execution) throws Exception {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) throws Exception {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
       execution.take(signalName);
     }
   }
@@ -52,7 +52,7 @@
     public void execute(ActivityExecution execution) {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
       execution.take(signalName);
     }
   }

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/FunctionalActivityTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/FunctionalActivityTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/FunctionalActivityTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -141,7 +141,7 @@
       Activity nestedActivity = execution.getActivity().getActivities().get(0);
       execution.execute(nestedActivity);
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
     }
   }
 

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/LoopingTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/LoopingTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/LoopingTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -45,7 +45,7 @@
         }
       }
     }
-    public void signal(ActivityExecution execution, String signal, Map<String, Object> parameters) throws Exception {
+    public void signal(ActivityExecution execution, String signal, Map<String, ?> parameters) throws Exception {
       throw new UnsupportedOperationException();
     }
     
@@ -77,7 +77,7 @@
     public void execute(ActivityExecution execution) {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters){
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters){
     }
   }
 

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeStateTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeStateTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeStateTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -51,7 +51,7 @@
       assertEquals(Execution.STATE_ACTIVE_ROOT, execution.getState());
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) throws Exception {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
       assertEquals(Execution.STATE_ACTIVE_ROOT, execution.getState());
       execution.take(signalName);
     }

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableDeclarationTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableDeclarationTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableDeclarationTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -45,7 +45,7 @@
     public void execute(ActivityExecution execution) {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
       execution.take(signalName);
     }
   }
@@ -56,7 +56,7 @@
       Activity child = execution.getActivity().getActivities().get(0);
       execution.execute(child);
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
     }
   }
   

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -23,7 +23,6 @@
 
 import java.util.Map;
 
-import org.jbpm.api.JbpmException;
 import org.jbpm.api.activity.ActivityExecution;
 import org.jbpm.api.activity.ExternalActivityBehaviour;
 import org.jbpm.api.client.ClientExecution;
@@ -50,7 +49,7 @@
     public void execute(ActivityExecution execution) {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
       execution.take(signalName);
     }
   }

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/SubProcessTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/SubProcessTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/SubProcessTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -51,7 +51,7 @@
         execution.waitForSignal();
       }
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) throws Exception {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
     }
   }
   
@@ -66,11 +66,12 @@
     public void execute(ActivityExecution execution) {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters){
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters){
     }
   }
 
   public static class EndState implements ActivityBehaviour {
+    private static final long serialVersionUID = 1L;
     public void execute(ActivityExecution execution) throws Exception {
       execution.end();
     }

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/VariableTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/VariableTest.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/VariableTest.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -44,7 +44,7 @@
     public void execute(ActivityExecution execution) {
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters){
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters){
     }
   }
 
@@ -195,7 +195,7 @@
       execution.setVariable("message", "Killroy was here");
       execution.waitForSignal();
     }
-    public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
+    public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) {
     }
   }
 

Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/WaitState.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/WaitState.java	2009-05-21 07:42:27 UTC (rev 4866)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/WaitState.java	2009-05-21 09:29:36 UTC (rev 4867)
@@ -39,6 +39,6 @@
 
   public void signal(ActivityExecution execution, 
                      String signalName, 
-                     Map<String, Object> parameters) {
+                     Map<String, ?> parameters) {
   }
 }




More information about the jbpm-commits mailing list