package org.camunda.bpm.extension.mockito.delegate;
import org.camunda.bpm.engine.ProcessEngineServices;
import org.camunda.bpm.engine.delegate.DelegateCaseExecution;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.camunda.bpm.engine.task.IdentityLink;
import org.camunda.bpm.model.bpmn.BpmnModelInstance;
import org.camunda.bpm.model.bpmn.instance.UserTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.StringJoiner;
import java.util.UUID;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import static org.camunda.bpm.engine.task.IdentityLinkType.CANDIDATE;
@SuppressWarnings("unused")
public class DelegateTaskFake extends VariableScopeFake<DelegateTaskFake> implements DelegateTask, Serializable {
public static Set<String> candidateUserIds(DelegateTask task) {
return userIds(task, CANDIDATE);
}
public static Set<String> candidateGroupIds(DelegateTask task) {
return groupIds(task, CANDIDATE);
}
public static Set<String> userIds(DelegateTask task) {
return userIds(task, null);
}
public static Set<String> userIds(DelegateTask task, String type) {
return linkIds(task, IdentityLink::getUserId, type);
}
public static Set<String> groupIds(DelegateTask task) {
return groupIds(task, null);
}
public static Set<String> groupIds(DelegateTask task, String type) {
return linkIds(task, IdentityLink::getGroupId, type);
}
private static Set<String> linkIds(DelegateTask task, Function<IdentityLink, String> extract, String type) {
return Optional.ofNullable(task.getCandidates()).orElseGet(HashSet::new)
.stream()
.filter(link -> type == null || type.equals(link.getType()))
.map(extract)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
}
private static Predicate<IdentityLink> isUserLink = link -> link.getUserId() != null;
private static Predicate<IdentityLink> isGroupLink = link -> link.getGroupId() != null;
private final Logger log = LoggerFactory.getLogger(this.getClass());
private String id;
private final Set<IdentityLink> candidates = new LinkedHashSet<>();
private String name;
private String description;
private int priority;
private String processInstanceId;
private String executionId;
private String processDefinitionId;
private String caseInstanceId;
private String caseExecutionId;
private String caseDefinitionId;
private Date createTime;
private String taskDefinitionKey;
private String eventName;
private String owner;
private String assignee;
private Date dueDate;
private String deleteReason;
private String tenantId;
private boolean completed;
private ProcessEngineServices processEngineServices;
@Override
public String getId() {
return id;
}
public DelegateTaskFake withId(String id) {
this.id = id;
return this;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
public DelegateTaskFake withName(String name) {
setName(name);
return this;
}
@Override
public String getDescription() {
return description;
}
@Override
public void setDescription(String description) {
this.description = description;
}
public DelegateTaskFake withDescription(String description) {
setDescription(description);
return this;
}
@Override
public int getPriority() {
return priority;
}
@Override
public void setPriority(int priority) {
this.priority = priority;
}
public DelegateTaskFake withPriority(int priority) {
setPriority(priority);
return this;
}
@Override
public String getProcessInstanceId() {
return processInstanceId;
}
public DelegateTaskFake withProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
return this;
}
@Override
public String getExecutionId() {
return executionId;
}
public DelegateTaskFake withExecutionI(String executionId) {
this.executionId = executionId;
return this;
}
@Override
public String getProcessDefinitionId() {
return processDefinitionId;
}
public DelegateTaskFake withProcessDefinitionId(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
return this;
}
@Override
public String getCaseInstanceId() {
return caseInstanceId;
}
public DelegateTaskFake withCaseInstanceId(String caseInstanceId) {
this.caseInstanceId = caseInstanceId;
return this;
}
@Override
public String getCaseExecutionId() {
return caseExecutionId;
}
public DelegateTaskFake withCaseExecutionId(String caseExecutionId) {
this.caseExecutionId = caseExecutionId;
return this;
}
@Override
public String getCaseDefinitionId() {
return caseDefinitionId;
}
public DelegateTaskFake withCaseDefinitionId(String caseDefinitionId) {
this.caseDefinitionId = caseDefinitionId;
return this;
}
@Override
public Date getCreateTime() {
return createTime;
}
public DelegateTaskFake withCreateTime(Date createTime) {
this.createTime = createTime;
return this;
}
@Override
public String getTaskDefinitionKey() {
return taskDefinitionKey;
}
public DelegateTaskFake withTaskDefinitionKey(String taskDefinitionKey) {
this.taskDefinitionKey = taskDefinitionKey;
return this;
}
@Override
public DelegateExecution getExecution() {
throw new UnsupportedOperationException("not implemented");
}
@Override
public DelegateCaseExecution getCaseExecution() {
throw new UnsupportedOperationException("not implemented");
}
@Override
public String getEventName() {
return eventName;
}
public DelegateTaskFake withEventName(String eventName) {
this.eventName = eventName;
return this;
}
private IdentityLink identityLink(String userId, String groupId, String type) {
return new IdentityLink() {
@Override
public String getId() {
return UUID.randomUUID().toString();
}
@Override
public String getType() {
return type;
}
@Override
public String getUserId() {
return userId;
}
@Override
public String getGroupId() {
return groupId;
}
@Override
public String getTaskId() {
return getId();
}
@Override
public String getProcessDefId() {
return getProcessDefinitionId();
}
@Override
public String getTenantId() {
return getTenantId();
}
@Override
public String toString() {
return new StringJoiner(", ", IdentityLink.class.getSimpleName() + "[", "]")
.add("userId=" + getUserId())
.add("groupId=" + getGroupId())
.add("type=" + getType())
.toString();
}
};
}
@Override
public void addCandidateUser(String userId) {
addUserIdentityLink(userId, CANDIDATE);
}
@Override
public void addCandidateUsers(Collection<String> candidateUsers) {
candidateUsers.forEach(this::addCandidateUser);
}
@Override
public void addCandidateGroup(String groupId) {
addGroupIdentityLink(groupId, CANDIDATE);
}
@Override
public void addCandidateGroups(Collection<String> candidateGroups) {
candidateGroups.forEach(this::addCandidateGroup);
}
@Override
public void addUserIdentityLink(String userId, String type) {
candidates.add(identityLink(userId, null, type));
}
@Override
public void addGroupIdentityLink(String groupId, String type) {
candidates.add(identityLink(null, groupId, type));
}
@Override
public void deleteCandidateUser(String userId) {
deleteUserIdentityLink(userId, CANDIDATE);
}
@Override
public void deleteCandidateGroup(String groupId) {
deleteGroupIdentityLink(groupId, CANDIDATE);
}
@Override
public void deleteUserIdentityLink(String userId, String type) {
candidates.removeIf(identityLink -> type.equals(identityLink.getType()) && identityLink.getUserId() != null && userId.equals(identityLink.getUserId()));
}
@Override
public void deleteGroupIdentityLink(String groupId, String type) {
candidates.removeIf(identityLink -> type.equals(identityLink.getType()) && identityLink.getGroupId() != null && groupId.equals(identityLink.getGroupId()));
}
@Override
public Set<IdentityLink> getCandidates() {
return candidates;
}
@Override
public String getOwner() {
return owner;
}
@Override
public void setOwner(String owner) {
this.owner = owner;
}
@Override
public String getAssignee() {
return assignee;
}
@Override
public void setAssignee(String assignee) {
this.assignee = assignee;
}
@Override
public Date getDueDate() {
return dueDate;
}
@Override
public void setDueDate(Date dueDate) {
this.dueDate = dueDate;
}
@Override
public String getDeleteReason() {
return deleteReason;
}
public DelegateTaskFake withDeleteReason(String deleteReason) {
this.deleteReason = deleteReason;
return this;
}
@Override
public BpmnModelInstance getBpmnModelInstance() {
throw new UnsupportedOperationException("not implemented");
}
@Override
public UserTask getBpmnModelElementInstance() {
throw new UnsupportedOperationException("not implemented");
}
@Override
public String getTenantId() {
return tenantId;
}
public DelegateTaskFake withTenantId(String tenantId) {
this.tenantId = tenantId;
return this;
}
@Override
public void complete() {
log.info("task completed!");
this.completed = true;
}
public boolean isCompleted() {
return completed;
}
@Override
public ProcessEngineServices getProcessEngineServices() {
return processEngineServices;
}
public DelegateTaskFake withProcessEngineServices(ProcessEngineServices processEngineServices) {
this.processEngineServices = processEngineServices;
return this;
}
}