package org.activiti.workflow.simple.definition;
import java.util.List;
import org.activiti.workflow.simple.exception.SimpleWorkflowException;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonValue;
/**
* Reusable assignment details for a task to be performed by a user,
* used in for example {@link HumanStepDefinition}.
*
* @author Frederik Heremans
*/
public class HumanStepAssignment {
/**
* Possible types of human step assignment.
*
* @author Frederik Heremans
*/
public enum HumanStepAssignmentType {
/**
* The initiator is the assignee of the human step.
*/
INITIATOR,
/**
* The human step is explicitally assigned to a specific user.
*/
USER,
/**
* One of the specified users is a candidate for the human step.
*/
USERS,
/**
* All users that are member of at least one of the specified groups, are candidate for
* the human step.
*/
GROUPS,
/**
* Both users and group-members can be candidates for the human step.
*/
MIXED;
@Override
@JsonValue
public String toString() {
return name().toLowerCase();
}
@JsonCreator
public static HumanStepAssignmentType forSimpleName(String name) {
for(HumanStepAssignmentType type : values()) {
if(type.toString().equals(name)) {
return type;
}
}
throw new SimpleWorkflowException("Invalid assignment type for human step: " + name);
}
}
protected String assignee;
protected List<String> candidateUsers;
protected List<String> candidateGroups;
protected HumanStepAssignmentType type = HumanStepAssignmentType.INITIATOR;
public HumanStepAssignmentType getType() {
return type;
}
/**
* @param type the type of assignment represented. Dependeing on the type,
* existing assignee/candidate will be removed if they are not allowed for the
* given type.
*/
public void setType(HumanStepAssignmentType type) {
this.type = type;
switch (type) {
case GROUPS:
this.candidateUsers = null;
this.assignee = null;
break;
case INITIATOR:
this.candidateGroups = null;
this.candidateUsers = null;
this.assignee = null;
break;
case MIXED:
this.assignee = null;
break;
case USER:
this.candidateGroups = null;
this.candidateUsers = null;
break;
case USERS:
this.candidateGroups = null;
this.assignee = null;
}
}
@JsonInclude(Include.NON_NULL)
public String getAssignee() {
return assignee;
}
public void setAssignee(String assignee) {
this.assignee = assignee;
if(assignee != null) {
setType(HumanStepAssignmentType.USER);
}
}
@JsonInclude(Include.NON_NULL)
public List<String> getCandidateGroups() {
return candidateGroups;
}
public void setCandidateGroups(List<String> candidateGroups) {
this.candidateGroups = candidateGroups;
if(candidateGroups != null && !candidateGroups.isEmpty()) {
if(this.candidateUsers != null && !this.candidateUsers.isEmpty()) {
setType(HumanStepAssignmentType.MIXED);
} else {
setType(HumanStepAssignmentType.GROUPS);
}
}
}
@JsonInclude(Include.NON_NULL)
public List<String> getCandidateUsers() {
return candidateUsers;
}
public void setCandidateUsers(List<String> candidateUsers) {
this.candidateUsers = candidateUsers;
if(candidateUsers != null && !candidateUsers.isEmpty()) {
if(this.candidateGroups != null && !this.candidateGroups.isEmpty()) {
setType(HumanStepAssignmentType.MIXED);
} else {
setType(HumanStepAssignmentType.USERS);
}
}
}
}