Workflow Manual / Version 2307
Table Of ContentsPerformer policies control to which users a task instance should be offered. A performers policy calculates this set of users based on the users which have permission to accept the task instance defined by the rights policy. The performer policy is called by the CoreMedia Workflow Server.
A performers policy may optionally support:
Users who must be excluded from the offer (determined by the ExcludePerformer or ExcludeUser action).
Users who may be preferred (determined by the PreferPerformer action).
Groups which may be preferred.
Users who actively reject the offered task instance.
A single user who must perform the task (which will force an accept of the instance as soon as the user logs on to the workflow server, determined by the ForceUser action)
The DefaultPerformersPolicy supports all options.
Note
There is no automatic recalculation of the user sets if there are changes in the user management. This may cause the following effects:
New users or users assigned to new groups won't see any offers already pending.
Users removed from groups won't see already offered task disappear from their task lists. This is not a security problem, since the rights are checked on every access on the server.
Interface to implement
Own performer policies must implement the interface
com.coremedia.workflow.WfPerformersPolicy.
The important method is calculateAssignment(WfTaskInstance taskInstance, WfUser[]
permittedUsers)
which is called by the CoreMedia Workflow
Server. It returns a
WfUserAssignment
object (see the Workflow API documentation for details).
Default implementation
If you only want to adapt the default performer policy to your needs it would be easier to subclass the default performer policy DefaultPerformersPolicy and to override the appropriate methods.
Defining the policy in the workflow definition
In Example 5.12, “Defining a performer policy in the workflow definition” you see how to define your own performer policy in the workflow definition.
<Workflow> <Process name="PerformerTest" startTask="One"> . . <UserTask name="One" final="true"> <Performers policyClass= "com.coremedia.example.DemoPerformersPolicy"/> <Rights> <Grant group="composer-role" rights="read, accept, complete"/> </Rights> </UserTask> . . </Process> </Workflow>
Example 5.12. Defining a performer policy in the workflow definition
Customize the performer policy
See Example 5.13, “Invoking a performer policy” for a customization of the default performer policy which performs a very simple task. It calls the default performer policy and cuts off the last user from the result.
1: package com.coremedia.example.policy; 2: 3: import com.coremedia.workflow.*; 4: import com.coremedia.workflow.common.policies. DefaultPerformersPolicy; 5: 6: public class DemoPerformersPolicy extends DefaultPerformersPolicy { 7: 8: public String toString() { 9: return "DemoPerformersPolicy()"; 10: } 11: 12: public String getName() { 13: return "DemoPerformersPolicy"; 14: } 15: 16: public String getDescription() { 17: return "quite simple policy implementation"; 18: } 19: 20: public WfUserAssignment 21: calculateAssignment(WfTaskInstance taskInstance, WfUser[] permittedUsers) throws WfException { 22: WfUserAssignment userAssignment = 23: super.calculateAssignment(taskInstance, permittedUsers); 24: 25: WfUser[] users = userAssignment.getUsers(); 26: WfUser[] result = new WfUser[users.length-1]; 27: if (result.length < 1) { 28: result = users; 29: } else { 30: System.arraycopy(users, 0, result, 0, result.length); 31: } 32: return new WfUserAssignment(result, false); 33: } 34: }
Example 5.13. Invoking a performer policy
Line 1 - 4: Your package and the packages to import.
Line 6: You subclass DefaultPerformersPolicy for convenience.
Line 12 -14: Return the name of the policy.
Line 16 - 18: Return a description of the policy.
Line 20 - 33: The most important method which is called by the workflow server.
Line 20- 21: On call, the workflow server passes a
WfTaskInstance
and the WfUsers
to the method. WfUsers contains all users which are allowed to
accept the task.
Line 22 -23: At first you call the method
calculateAssignment
method of the super class, because the aim of
this example policy is to modify the default result.
Line 25: Prepare the manipulation of the result by getting the WfUser from the WfUserAssignment.
Line 26: Prepare a new
WfUser
array which should keep the resulting users. Remember, you only want to get rid of the
last user, so the length of the array is users.length-1
.
Line 27 - 29: If the result contains no user, this result is returned.
Line 30: Otherwise, all users but the last are copied from the default result array to the returned array.
Line 32: The result array is returned to the workflow server. The second parameter determines that the selected user is not forced to accept the task.