Skip to content

Commit

Permalink
Support define yourself TaskListener and BpmnParseListener
Browse files Browse the repository at this point in the history
  • Loading branch information
flashcloud committed Jul 20, 2013
1 parent 35b1ff4 commit 0131b0f
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 0 deletions.
69 changes: 69 additions & 0 deletions ActivitiGrailsPlugin.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import grails.util.GrailsNameUtils
import grails.util.Environment
import org.codehaus.groovy.grails.commons.ConfigurationHolder as CH
import org.codehaus.groovy.grails.commons.ControllerArtefactHandler
import org.grails.activiti.task.GlobalUserTaskEventListener
import org.springframework.core.io.Resource
import org.grails.activiti.ActivitiConstants
import org.grails.activiti.serializable.SerializableVariableType
Expand Down Expand Up @@ -73,10 +74,62 @@ class ActivitiGrailsPlugin {
}

def doWithSpring = {
def activitiListenersRef = { listenersName ->
def listeners = []
if (listenersName) {
def listenersNameList = []
if (listenersName instanceof String)
listenersNameList << listenersName
else if (listenersName instanceof List)
listenersNameList = listenersName
else
throw new RuntimeException('activiti.preParseListenersName参数必须是字符串或List')

listenersNameList.each {
listeners << ref(it)
}
}

return listeners
}
def isUsedGlobalUserTaskEventListener = false

def disabledActiviti = System.getProperty("disabledActiviti")

if (!disabledActiviti && !CH.config.activiti.disabled) {
println "Configuring Activiti Process Engine ..."

//dynamic define user task event litener listeners:
/**
* 1. define user task event litener beans name in grails app conf/config.groovy:
* globalCreateTaskListenersName = ["myCreateTaskListener1", "myCreateTaskListener2"]
* globalAssignmentTaskListenersName = ["myAssignmentTaskListener1", "myAssignmentTaskListener2"]
* globalCompleteTaskListenersName = ["myCompleteTaskListener1", "myCompleteTaskListener2"]
*
* 2.define user task event litener beans in grails app conf/spring/resources.groovy
* myCreateTaskListener1(MyCreateTaskListener1)
* myCreateTaskListener2(MyCreateTaskListener2)
* myAssignmentTaskListener1(MyAssignmentTaskListener1Service)
* ...
*/
globalUserTaskEventListener(GlobalUserTaskEventListener) {
def listeners = []
listeners = activitiListenersRef(application.config.activiti.globalCreateTaskListenersName)
if (listeners) {
createTaskListeners = listeners
isUsedGlobalUserTaskEventListener = true
}
listeners = activitiListenersRef(application.config.activiti.globalAssignmentTaskListenersName)
if (listeners) {
assignmentTaskListeners = listeners
isUsedGlobalUserTaskEventListener = true
}
listeners = activitiListenersRef(application.config.activiti.globalCompleteTaskListenersName)
if (listeners) {
completeTaskListeners = listeners
isUsedGlobalUserTaskEventListener = true
}
}

processEngineConfiguration(org.activiti.spring.SpringProcessEngineConfiguration) {
processEngineName = CH.config.activiti.processEngineName?:ActivitiConstants.DEFAULT_PROCESS_ENGINE_NAME
Expand All @@ -96,6 +149,22 @@ class ActivitiGrailsPlugin {

// Define custom serializable types for fix issue with serialization
customPreVariableTypes = [new SerializableVariableType()]

//dynamic define pre. BPMN parse litener listeners:
/**
* 1. define BPMN parse. litener beans name in grails app conf/config.groovy:
* preParseBpmnListenersName = ["preParseBpmnListener1", "preParseBpmnListener3", "preParseBpmnListener2"]
*
* 2.define BPMN parse litener beans in grails app conf/spring/resources.groovy
* preParseBpmnListener1(MyPreParseBpmnListener1)
* preParseBpmnListener2(MyPreParseBpmnListener1)
* preParseBpmnListener3(MyPreParseBpmnListener1)
*/
def listeners = activitiListenersRef(application.config.activiti.preParseBpmnListenersName)
if (isUsedGlobalUserTaskEventListener)
listeners << ref('globalUserTaskEventListener')
if (listeners)
preParseListeners = listeners
}

processEngine(org.activiti.spring.ProcessEngineFactoryBean) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.grails.activiti.task

import org.activiti.engine.delegate.TaskListener
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior
import org.activiti.engine.impl.bpmn.parser.AbstractBpmnParseListener
import org.activiti.engine.impl.pvm.delegate.ActivityBehavior
import org.activiti.engine.impl.pvm.process.ActivityImpl
import org.activiti.engine.impl.pvm.process.ScopeImpl
import org.activiti.engine.impl.util.xml.Element

class GlobalUserTaskEventListener extends AbstractBpmnParseListener {
List<TaskListener> createTaskListeners = []
List<TaskListener> assignmentTaskListeners = []
List<TaskListener> completeTaskListeners = []

@Override
void parseUserTask(Element userTaskElement, ScopeImpl scope, ActivityImpl activity) {
ActivityBehavior activitybehaviour = activity.getActivityBehavior();
if (activitybehaviour instanceof UserTaskActivityBehavior){
UserTaskActivityBehavior userTaskActivity = (UserTaskActivityBehavior) activitybehaviour;
createTaskListeners.each {
userTaskActivity.getTaskDefinition().addTaskListener(TaskListener.EVENTNAME_CREATE, it);
}
assignmentTaskListeners.each {
userTaskActivity.getTaskDefinition().addTaskListener(TaskListener.EVENTNAME_ASSIGNMENT, it);
}
completeTaskListeners.each {
userTaskActivity.getTaskDefinition().addTaskListener(TaskListener.EVENTNAME_COMPLETE, it);
}
}
}
}

0 comments on commit 0131b0f

Please sign in to comment.