[jbpm-commits] JBoss JBPM SVN: r4876 - in jbpm4/trunk/modules: api/src/main/java/org/jbpm/api/session and 7 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Sat May 23 08:41:04 EDT 2009
Author: alex.guizar at jboss.com
Date: 2009-05-23 08:41:04 -0400 (Sat, 23 May 2009)
New Revision: 4876
Added:
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailListener.java
Modified:
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/session/PvmDbSession.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskBinding.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/model/JpdlExecution.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateDbSession.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateTaskDbSession.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeElementImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskImpl.java
Log:
JBPM-2254: first stab at reminder, refactor notification as event listener
Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -24,9 +24,6 @@
import java.util.List;
import java.util.Map;
-import org.jbpm.api.Execution;
-
-
/**
* a activity in a {@link OpenProcessDefinition} graph.
*
Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -34,4 +34,8 @@
String START = "start";
/** fired when a process or an activity ends */
String END = "end";
+ /** fired when a task is assigned */
+ String ASSIGN = "assign";
+ /** fired when an assignee is reminded of a task */
+ String REMIND = "remind";
}
Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -26,7 +26,6 @@
import org.jbpm.api.Execution;
import org.jbpm.api.JbpmException;
-import org.jbpm.api.job.Timer;
/** execution that opens up access to the related
* objects in the execution and process definition
@@ -39,7 +38,7 @@
* an open persistence session. Typically inside of
* an environment block. Navigation over the
* related model objects will load the related objects
- * transparantly with lazy loading.
+ * transparently with lazy loading.
*
* @author Tom Baeyens
*/
Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -21,9 +21,6 @@
*/
package org.jbpm.api.model;
-import java.util.Set;
-
-
/**
* a transition in a {@link OpenProcessDefinition} graph.
*
Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/session/PvmDbSession.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/session/PvmDbSession.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/session/PvmDbSession.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -23,7 +23,6 @@
import java.util.List;
-import org.jbpm.api.Execution;
import org.jbpm.api.client.ClientExecution;
import org.jbpm.api.client.ClientProcessDefinition;
import org.jbpm.api.job.Job;
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -87,7 +87,7 @@
unresolvedTransitions.add(transition, transitionElement);
- jpdlParser.parseOnEvent(transitionElement, transition, Event.TAKE, parse);
+ jpdlParser.parseOnEvent(transitionElement, parse, transition, Event.TAKE);
}
}
}
Added: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailListener.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailListener.java (rev 0)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/MailListener.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.Collection;
+
+import javax.mail.Message;
+
+import org.jbpm.api.env.Environment;
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.api.listener.EventListenerExecution;
+import org.jbpm.api.session.TaskDbSession;
+import org.jbpm.api.task.Task;
+import org.jbpm.pvm.internal.email.spi.MailProducer;
+import org.jbpm.pvm.internal.email.spi.MailSession;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class MailListener implements EventListener {
+
+ protected transient MailProducer mailProducer;
+
+ private static final long serialVersionUID = 1L;
+ private static final String TASK_VARIABLE_NAME = "task";
+
+ public void notify(EventListenerExecution execution) throws Exception {
+ // find current task
+ Environment environment = Environment.getCurrent();
+ Task task = environment.get(TaskDbSession.class).findTaskByExecution(execution);
+ // make task available to mail templates through execution variable
+ // TODO find a cleaner way
+ execution.setVariable(TASK_VARIABLE_NAME, task);
+ try {
+ Collection<Message> messages = mailProducer.produce(execution);
+ environment.get(MailSession.class).send(messages);
+ }
+ finally {
+// execution.removeVariable(TASK_VARIABLE_NAME);
+ }
+ }
+
+ public void setMailProducer(MailProducer mailProducer) {
+ this.mailProducer = mailProducer;
+ }
+
+}
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -52,9 +52,6 @@
TaskHandler taskHandler = task.getTaskHandler();
boolean wait = taskHandler.executionCreateTask(task);
-
- TaskDbSession taskDbSession = Environment.getFromCurrent(TaskDbSession.class);
- taskDbSession.save(task);
if (wait) {
execution.waitForSignal();
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskBinding.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskBinding.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -22,6 +22,7 @@
package org.jbpm.jpdl.internal.activity;
import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.model.ScopeElementImpl;
import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
import org.jbpm.pvm.internal.xml.Parse;
import org.jbpm.pvm.internal.xml.Parser;
@@ -41,7 +42,8 @@
public Object parse(Element element, Parse parse, Parser parser) {
TaskActivity taskActivity = new TaskActivity();
- TaskDefinitionImpl taskDefinition = JpdlParser.parseTaskDefinition(element, parse, parser);
+ ScopeElementImpl scopeElement = parse.findObject(ScopeElementImpl.class);
+ TaskDefinitionImpl taskDefinition = JpdlParser.parseTaskDefinition(element, parse, scopeElement);
taskActivity.setTaskDefinition(taskDefinition);
return taskActivity;
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/model/JpdlExecution.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/model/JpdlExecution.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/model/JpdlExecution.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -58,11 +58,11 @@
if (extensionClass==null) {
throw new JbpmException("extensionClass is null");
}
- if (extensionClass.equals(JpdlExecution.class)) {
+ if (extensionClass == JpdlExecution.class) {
Session session = Environment.getFromCurrent(Session.class);
- return (T) session.load(JpdlExecution.class, dbid);
+ return extensionClass.cast(session.load(JpdlExecution.class, dbid));
}
- throw new JbpmException("unsuppported extension "+extensionClass.getName());
+ throw new JbpmException("unsupported extension "+extensionClass.getName());
}
// tasks ////////////////////////////////////////////////////////////////////
@@ -86,6 +86,9 @@
task.setPriority(taskDefinition.getPriority());
task.setForm(taskDefinition.getForm());
+ // save task so that TaskDbSession.findTaskByExecution works for assign event listeners
+ taskDbSession.saveTask(task);
+
SwimlaneDefinitionImpl swimlaneDefinition = taskDefinition.getSwimlaneDefinition();
if (swimlaneDefinition!=null) {
JpdlExecution jpdlProcessInstance = processInstance.getExtension(JpdlExecution.class);
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -31,12 +31,15 @@
import java.util.Set;
import java.util.StringTokenizer;
+import org.w3c.dom.Element;
+
import org.jbpm.api.activity.ActivityBehaviour;
import org.jbpm.api.env.Environment;
import org.jbpm.api.listener.EventListener;
import org.jbpm.api.model.Event;
import org.jbpm.internal.log.Log;
import org.jbpm.jpdl.internal.activity.JpdlBinding;
+import org.jbpm.jpdl.internal.activity.MailListener;
import org.jbpm.jpdl.internal.model.JpdlProcessDefinition;
import org.jbpm.pvm.internal.email.impl.MailProducerImpl;
import org.jbpm.pvm.internal.email.impl.MailTemplate;
@@ -73,7 +76,6 @@
import org.jbpm.pvm.internal.xml.Parse;
import org.jbpm.pvm.internal.xml.Parser;
import org.jbpm.pvm.internal.xml.ProblemImpl;
-import org.w3c.dom.Element;
/**
* @author Tom Baeyens
@@ -84,12 +86,14 @@
public static final WireParser wireParser = WireParser.getInstance();
- public static final String[] DEFAULT_ACTIVITIES_RESOURCES = new String[]{
+ // array elements are mutable, even when final
+ // never make a static array public
+ static final String[] DEFAULT_ACTIVITIES_RESOURCES = {
"jbpm.jpdl.activities.xml",
"jbpm.user.activities.xml"
};
- public static final String[] DEFAULT_EVENTLISTENERS_RESOURCES = new String[]{
+ static final String[] DEFAULT_EVENTLISTENERS_RESOURCES = {
"jbpm.jpdl.eventlisteners.xml",
"jbpm.user.eventlisteners.xml"
};
@@ -128,7 +132,6 @@
binding.setCategory(CATEGORY_ACTIVITY);
bindings.addBinding(binding);
}
-
}
} else {
log.trace("skipping unavailable jpdl activities resource: "+activityResource);
@@ -151,7 +154,6 @@
binding.setCategory(CATEGORY_EVENT_LISTENER);
bindings.addBinding(binding);
}
-
}
} else {
log.trace("skipping unavailable jpdl eventlistener resource: "+eventListenerResource);
@@ -217,7 +219,6 @@
} finally {
parse.popObject();
}
-
if (processDefinition.getInitial()==null) {
parse.addProblem("no start activity in process");
@@ -236,65 +237,65 @@
List<Element> elements = XmlUtil.elements(documentElement);
for (Element nestedElement : elements) {
String tagName = XmlUtil.getTagLocalName(nestedElement);
- if ( !"on".equals(tagName)
- && !"timer".equals(tagName)
- && !"swimlane".equals(tagName)
- ) {
- JpdlBinding activityBinding = (JpdlBinding) getBinding(nestedElement, CATEGORY_ACTIVITY);
- if (activityBinding != null) {
- ActivityImpl activity = compositeElement.createActivity();
- parse.pushObject(activity);
- try {
- activity.setType(activityBinding.getTagName());
- activityBinding.parseName(nestedElement, activity, parse);
- parseTransitions(nestedElement, activity, parse);
+ if ("on".equals(tagName)
+ || "timer".equals(tagName)
+ || "swimlane".equals(tagName)) continue;
- String continuationText = XmlUtil.attribute(nestedElement, "continue");
- if (continuationText!=null) {
- if ("async".equals(continuationText)) {
- activity.setContinuation(Continuation.ASYNCHRONOUS);
- } else if ("exclusive".equals(continuationText)) {
- activity.setContinuation(Continuation.EXCLUSIVE);
- }
- }
+ JpdlBinding activityBinding = (JpdlBinding) getBinding(nestedElement, CATEGORY_ACTIVITY);
+ if (activityBinding == null) {
+ log.debug("unrecognized activity: " + tagName);
+ continue;
+ }
- ActivityBehaviour activityBehaviour = (ActivityBehaviour) activityBinding.parse(nestedElement, parse, this);
- activity.setBehaviour(activityBehaviour);
+ ActivityImpl activity = compositeElement.createActivity();
+ parse.pushObject(activity);
+ try {
+ activity.setType(activityBinding.getTagName());
+ activityBinding.parseName(nestedElement, activity, parse);
+ parseTransitions(nestedElement, activity, parse);
- parseOnEvents(nestedElement, parse, activity);
+ String continuationText = XmlUtil.attribute(nestedElement, "continue");
+ if (continuationText!=null) {
+ if ("async".equals(continuationText)) {
+ activity.setContinuation(Continuation.ASYNCHRONOUS);
+ } else if ("exclusive".equals(continuationText)) {
+ activity.setContinuation(Continuation.EXCLUSIVE);
+ }
+ }
- String g = XmlUtil.attribute(nestedElement, "g");
- if (g != null) {
- StringTokenizer stringTokenizer = new StringTokenizer(g, ",");
- ActivityCoordinatesImpl coordinates = null;
- if (stringTokenizer.countTokens() == 4) {
- try {
- int x = Integer.parseInt(stringTokenizer.nextToken());
- int y = Integer.parseInt(stringTokenizer.nextToken());
- int width = Integer.parseInt(stringTokenizer.nextToken());
- int height = Integer.parseInt(stringTokenizer.nextToken());
- coordinates = new ActivityCoordinatesImpl(x, y, width, height);
- } catch (NumberFormatException e) {
- coordinates = null;
- }
- }
- if (coordinates != null) {
- activity.setCoordinates(coordinates);
- } else {
- parse.addProblem("invalid coordinates g=\"" + g + "\" in " + activity);
- }
- }
- } finally {
- parse.popObject();
+ ActivityBehaviour activityBehaviour = (ActivityBehaviour) activityBinding.parse(nestedElement, parse, this);
+ activity.setBehaviour(activityBehaviour);
+
+ parseOnEvents(nestedElement, parse, activity);
+
+ String g = XmlUtil.attribute(nestedElement, "g");
+ if (g == null) continue;
+
+ StringTokenizer stringTokenizer = new StringTokenizer(g, ",");
+ ActivityCoordinatesImpl coordinates = null;
+ if (stringTokenizer.countTokens() == 4) {
+ try {
+ int x = Integer.parseInt(stringTokenizer.nextToken());
+ int y = Integer.parseInt(stringTokenizer.nextToken());
+ int width = Integer.parseInt(stringTokenizer.nextToken());
+ int height = Integer.parseInt(stringTokenizer.nextToken());
+ coordinates = new ActivityCoordinatesImpl(x, y, width, height);
+ } catch (NumberFormatException e) {
+ coordinates = null;
}
+ }
+ if (coordinates != null) {
+ activity.setCoordinates(coordinates);
} else {
- log.debug("unrecognized activity: " + tagName);
+ parse.addProblem("invalid coordinates g=\"" + g + "\" in " + activity, nestedElement);
}
+ } finally {
+ parse.popObject();
}
}
}
- public TimerDefinitionImpl parseTimerDefinition(Element timerElement, Parse parse, ScopeElementImpl scopeElement) {
+ public static TimerDefinitionImpl parseTimerDefinition(Element timerElement, Parse parse, ScopeElementImpl scopeElement) {
TimerDefinitionImpl timerDefinition = scopeElement.createTimerDefinition();
String duedate = XmlUtil.attribute(timerElement, "duedate");
@@ -330,7 +331,7 @@
List<Element> onElements = XmlUtil.elements(element, "on");
for (Element onElement: onElements) {
String eventName = XmlUtil.attribute(onElement, "event", true, parse);
- parseOnEvent(onElement, scopeElement, eventName, parse);
+ parseOnEvent(onElement, parse, scopeElement, eventName);
Element timerElement = XmlUtil.element(onElement, "timer");
if (timerElement!=null) {
@@ -340,7 +341,7 @@
}
}
- public void parseOnEvent(Element element, ObservableElementImpl observableElement, String eventName, Parse parse) {
+ public void parseOnEvent(Element element, Parse parse, ObservableElementImpl observableElement, String eventName) {
if (eventName!=null) {
EventImpl event = observableElement.getEvent(eventName);
if (event==null) {
@@ -391,7 +392,6 @@
) {
parse.addProblem("unrecognized event listener: "+tagName, null, ProblemImpl.TYPE_WARNING, eventListenerElement);
}
-
}
}
}
@@ -414,7 +414,7 @@
unresolvedTransitions.add(transition, transitionElement);
- parseOnEvent(transitionElement, transition, Event.TAKE, parse);
+ parseOnEvent(transitionElement, parse, transition, Event.TAKE);
}
}
@@ -450,7 +450,7 @@
assignableDefinition.setCandidateGroupsExpressionLanguage(candidateGroupsExpressionLanguage);
}
- public static TaskDefinitionImpl parseTaskDefinition(Element element, Parse parse, Parser parser) {
+ public static TaskDefinitionImpl parseTaskDefinition(Element element, Parse parse, ScopeElementImpl scopeElement) {
TaskDefinitionImpl taskDefinition = new TaskDefinitionImpl();
String taskName = XmlUtil.attribute(element, "name");
@@ -488,10 +488,17 @@
// parse notification mail producer
Element notificationElement = XmlUtil.element(element, "notification");
if (notificationElement != null) {
- MailProducer mailProducer = parseMailProducer(notificationElement, parse, "task-notification");
- taskDefinition.setNotificationMailProducer(mailProducer);
+ parseMailEvent(notificationElement, parse, scopeElement, Event.ASSIGN);
}
+ Element reminderElement = XmlUtil.element(element, "reminder");
+ if (reminderElement != null) {
+ parseMailEvent(notificationElement, parse, scopeElement, Event.REMIND);
+ // associate timer to event
+ TimerDefinitionImpl timerDefinition = parseTimerDefinition(reminderElement, parse, scopeElement);
+ timerDefinition.setEventName(Event.REMIND);
+ }
+
return taskDefinition;
}
@@ -583,6 +590,29 @@
return variableOutDefinitionSet;
}
+ public static void parseMailEvent(Element element, Parse parse,
+ ObservableElementImpl observableElement, String eventName) {
+ // obtain assign event
+ EventImpl event = observableElement.getEvent(eventName);
+ if (event == null) {
+ event = observableElement.createEvent(eventName);
+ }
+ // register event listener
+ MailListener eventListener = new MailListener();
+ EventListenerReference eventListenerRef = event.createEventListenerReference(eventListener);
+ // set continuation mode
+ String continuationText = XmlUtil.attribute(element, "continue");
+ if ("async".equals(continuationText)) {
+ eventListenerRef.setContinuation(Continuation.ASYNCHRONOUS);
+ }
+ else if ("exclusive".equals(continuationText)) {
+ eventListenerRef.setContinuation(Continuation.EXCLUSIVE);
+ }
+ // associate mail producer to event listener
+ MailProducer mailProducer = parseMailProducer(element, parse, "task-notification");
+ eventListener.setMailProducer(mailProducer);
+ }
+
public static MailProducer parseMailProducer(Element element, Parse parse,
String defaultTemplateName) {
// check whether the element is a generic object descriptor
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -131,14 +131,19 @@
private String evaluateExpression(String expression, Execution execution) {
ScriptManager scriptManager = Environment.getFromCurrent(ScriptManager.class);
- return scriptManager.evaluateExpression(expression, execution, template.getLanguage())
- .toString();
+ Object value = scriptManager.evaluateExpression(expression, execution, template.getLanguage());
+ if (!(value instanceof String)) {
+ throw new JbpmException("expected expression '"
+ + expression
+ + "' to return string, but was: "
+ + value);
+ }
+ return (String) value;
}
private String[] tokenizeActors(String recipients, Execution execution) {
String[] actors = evaluateExpression(recipients, execution).split("[,|\\s]+");
- if (actors.length == 0)
- throw new JbpmException("recipient list is empty: " + recipients);
+ if (actors.length == 0) throw new JbpmException("recipient list is empty: " + recipients);
return actors;
}
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateDbSession.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateDbSession.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateDbSession.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -47,7 +47,7 @@
}
public void forceVersionUpdate(Object entity) {
- session.lock(entity, LockMode.NONE);
+ session.lock(entity, LockMode.FORCE);
}
public void lockPessimistically(Object entity) {
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateTaskDbSession.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateTaskDbSession.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/hibernate/HibernateTaskDbSession.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -21,9 +21,8 @@
*/
package org.jbpm.pvm.internal.hibernate;
-import java.io.Serializable;
-
import org.hibernate.Query;
+
import org.jbpm.api.Execution;
import org.jbpm.api.session.TaskDbSession;
import org.jbpm.api.task.Task;
@@ -52,12 +51,7 @@
taskImpl.setSuperTaskDbid(null);
}
- if (! taskImpl.isPersisted()) {
- Serializable dbid = session.save(taskImpl);
-
- } else {
- session.update(taskImpl);
- }
+ session.saveOrUpdate(task);
}
public Task createTask() {
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeElementImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeElementImpl.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeElementImpl.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -51,7 +51,7 @@
public List<VariableDefinitionImpl> getVariableDefinitions() {
if (!hasVariableDefinitions()) {
- return Collections.EMPTY_LIST;
+ return Collections.emptyList();
}
return variableDefinitions;
}
@@ -75,7 +75,7 @@
public Set<TimerDefinitionImpl> getTimerDefinitions() {
if (!hasTimerDefinitions()) {
- return Collections.EMPTY_SET;
+ return Collections.emptySet();
}
return timerDefinitions;
}
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -24,7 +24,6 @@
import java.io.Serializable;
import java.util.List;
-import org.jbpm.pvm.internal.email.spi.MailProducer;
import org.jbpm.pvm.internal.util.Priority;
import org.jbpm.pvm.internal.wire.Descriptor;
@@ -42,8 +41,6 @@
protected SwimlaneDefinitionImpl swimlaneDefinition;
protected Descriptor taskHandlerDescriptor;
- protected transient MailProducer notificationMailProducer;
-
public int getPriority() {
return priority;
}
@@ -80,10 +77,4 @@
public void setTaskHandlerDescriptor(Descriptor taskHandlerDescriptor) {
this.taskHandlerDescriptor = taskHandlerDescriptor;
}
- public MailProducer getNotificationMailProducer() {
- return notificationMailProducer;
- }
- public void setNotificationMailProducer(MailProducer notificationMailProducer) {
- this.notificationMailProducer = notificationMailProducer;
- }
}
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskImpl.java 2009-05-23 10:38:45 UTC (rev 4875)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/TaskImpl.java 2009-05-23 12:41:04 UTC (rev 4876)
@@ -23,19 +23,17 @@
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import javax.mail.Message;
-
import org.jbpm.api.Execution;
import org.jbpm.api.JbpmException;
import org.jbpm.api.env.Environment;
import org.jbpm.api.model.Comment;
+import org.jbpm.api.model.Event;
import org.jbpm.api.session.TaskDbSession;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.OpenTask;
@@ -43,8 +41,6 @@
import org.jbpm.api.task.Swimlane;
import org.jbpm.api.task.Task;
import org.jbpm.api.task.TaskHandler;
-import org.jbpm.pvm.internal.email.spi.MailProducer;
-import org.jbpm.pvm.internal.email.spi.MailSession;
import org.jbpm.pvm.internal.history.events.TaskAssign;
import org.jbpm.pvm.internal.history.events.TaskCancel;
import org.jbpm.pvm.internal.history.events.TaskComplete;
@@ -125,27 +121,12 @@
public void setAssignee(String userId, boolean propagateToSwimlane) {
this.assignee = userId;
- notifyAssignee();
if (propagateToSwimlane) {
propagateAssigneeToSwimlane();
}
- }
-
- protected void notifyAssignee() {
- if (taskDefinition == null) return;
-
- MailProducer mailProducer = taskDefinition.getNotificationMailProducer();
- if (mailProducer == null) return;
-
- // TODO how to insert predefined variables cleanly?
- execution.setVariable("task", this);
- try {
- Collection<Message> messages = mailProducer.produce(execution);
- Environment.getFromCurrent(MailSession.class).send(messages);
+ if (execution != null) {
+ execution.fire(Event.ASSIGN, execution.getActivity());
}
- finally {
- execution.removeVariable("task");
- }
}
protected void propagateAssigneeToSwimlane() {
@@ -345,10 +326,6 @@
this.progress = progress;
}
- public boolean isPersisted() {
- return dbid != 0;
- }
-
public void cancelExecution(String signal) {
if (execution != null) {
execution.end("cancel");
More information about the jbpm-commits
mailing list