As we transition to the new Hyland Community, some post links may be temporarily disrupted as we finalize redirects. We apologize for the inconvenience and are working to resolve this as quickly as possible. Details.
You can use a BPMNParseListener for this, adding your listener to ALL parsed nodes.see ProcessEngineConfigurationImpl.preParseListeners (invoked before activiti's custom parselisteners) and ProcessEngineConfigurationImpl.postParseListeenerssee org.activiti.engine.impl.bpmn.parser.BpmnParseListenersee example in Alfresco integration http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD/root/projects/repository/source/java/org/alfresco/repo/workflow/activiti/AddTaskListenerParseListener.java
<br>/* Licensed under the Apache License, Version 2.0 (the "License");<br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at<br> * <br> * <a href="http://www.apache.org/licenses/LICENSE-2.0" rel="nofollow noopener noreferrer">http://www.apache.org/licenses/LICENSE-2.0</a><br> * <br> * Unless required by applicable law or agreed to in writing, software<br> * distributed under the License is distributed on an "AS IS" BASIS,<br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br> * See the License for the specific language governing permissions and<br> * limitations under the License.<br> */<br>package org.alfresco.repo.workflow.activiti;<br><br>import java.util.ArrayList;<br>import java.util.List;<br><br>import org.activiti.bpmn.model.BaseElement;<br>import org.activiti.bpmn.model.UserTask;<br>import org.activiti.engine.delegate.TaskListener;<br>import org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior;<br>import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;<br>import org.activiti.engine.impl.bpmn.parser.BpmnParse;<br>import org.activiti.engine.impl.bpmn.parser.handler.AbstractBpmnParseHandler;<br>import org.activiti.engine.impl.pvm.delegate.ActivityBehavior;<br>import org.activiti.engine.impl.pvm.process.ActivityImpl;<br>import org.activiti.engine.parse.BpmnParseHandler;<br><br>/**<br> * A {@link BpmnParseHandler} that adds execution listeners to a<br> * {@link UserTask} which are specifically for Alfresco usage.<br> * <br> * @author Joram Barrez<br> * @author Frederik Heremans<br> * @author Nick Smith<br> */<br>public class AlfrescoUserTaskBpmnParseHandler extends AbstractBpmnParseHandler<UserTask><br>{<br> private TaskListener completeTaskListener;<br> private TaskListener createTaskListener;<br> private TaskListener notificationTaskListener;<br><br> protected Class<? extends BaseElement> getHandledType()<br> {<br> return UserTask.class;<br> }<br><br> protected void executeParse(BpmnParse bpmnParse, UserTask userTask)<br> {<br> ActivityImpl activity = findActivity(bpmnParse, userTask.getId());<br> ActivityBehavior activitybehaviour = activity.getActivityBehavior();<br> if (activitybehaviour instanceof UserTaskActivityBehavior)<br> {<br> addListeners((UserTaskActivityBehavior) activity.getActivityBehavior());<br> } <br> else if(activitybehaviour instanceof MultiInstanceActivityBehavior) <br> {<br> MultiInstanceActivityBehavior multiInstance = (MultiInstanceActivityBehavior) activitybehaviour;<br> if(multiInstance.getInnerActivityBehavior() instanceof UserTaskActivityBehavior) <br> {<br> addListeners((UserTaskActivityBehavior) multiInstance.getInnerActivityBehavior());<br> }<br> }<br> }<br> <br> protected void addListeners(UserTaskActivityBehavior activityBehavior) <br> {<br> if (createTaskListener != null)<br> {<br> addTaskListenerAsFirst(createTaskListener, TaskListener.EVENTNAME_CREATE, activityBehavior);<br> }<br> if (completeTaskListener != null)<br> {<br> addTaskListenerAsFirst(completeTaskListener, TaskListener.EVENTNAME_COMPLETE, activityBehavior);<br> }<br> if(notificationTaskListener != null)<br> {<br> addTaskListenerAsLast(notificationTaskListener, TaskListener.EVENTNAME_CREATE, activityBehavior);<br> }<br> }<br> <br> public void setCompleteTaskListener(TaskListener completeTaskListener)<br> {<br> this.completeTaskListener = completeTaskListener;<br> }<br><br> public void setCreateTaskListener(TaskListener createTaskListener)<br> {<br> this.createTaskListener = createTaskListener;<br> }<br> <br> public void setNotificationTaskListener(TaskListener notificationTaskListener)<br> {<br> this.notificationTaskListener = notificationTaskListener;<br> }<br> <br> protected void addTaskListenerAsFirst(TaskListener taskListener, String eventName, UserTaskActivityBehavior userTask) <br> {<br> getOrCreateListenerList(eventName, userTask).add(0, taskListener);<br> }<br> <br> protected void addTaskListenerAsLast(TaskListener taskListener, String eventName, UserTaskActivityBehavior userTask) <br> {<br> getOrCreateListenerList(eventName, userTask).add(taskListener);<br> }<br> <br> protected List<TaskListener> getOrCreateListenerList(String eventName, UserTaskActivityBehavior userTask) <br> {<br> List<TaskListener> taskEventListeners = userTask.getTaskDefinition().getTaskListeners().get(eventName);<br> if (taskEventListeners == null) {<br> taskEventListeners = new ArrayList<TaskListener>();<br> userTask.getTaskDefinition().getTaskListeners().put(eventName, taskEventListeners);<br> }<br> return taskEventListeners;<br> }<br>}<br>