Skip to content

Commit

Permalink
Creating delegation events.
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Feb 4, 2017
1 parent 44c2361 commit 94eaf41
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 37 deletions.
Expand Up @@ -183,6 +183,13 @@ public static <T extends WfProcessEventType> List<T> getEvents(@NotNull WfContex
.collect(Collectors.toList());
}

public static <T extends WorkItemEventType> List<T> getWorkItemEvents(@NotNull WfContextType wfc, @NotNull String workItemId, Class<T> clazz) {
return wfc.getEvent().stream()
.filter(e -> clazz.isAssignableFrom(e.getClass()) && workItemId.equals(((WorkItemEventType) e).getWorkItemId()))
.map(e -> (T) e)
.collect(Collectors.toList());
}

public static String getBriefDiagInfo(WfContextType wfc) {
if (wfc == null) {
return "null";
Expand Down
Expand Up @@ -1372,7 +1372,7 @@
</xsd:appinfo>
</xsd:annotation>
<xsd:complexContent>
<xsd:extension base="tns:WfProcessEventType">
<xsd:extension base="tns:WorkItemEventType">
<xsd:sequence>
<xsd:element name="delegatedTo" type="tns:ObjectReferenceType" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="delegationMethod" type="tns:WorkItemDelegationMethodType" minOccurs="0" />
Expand Down
Expand Up @@ -28,6 +28,7 @@
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.wf.impl.activiti.dao.WorkItemProvider;
import com.evolveum.midpoint.wf.impl.processes.common.ActivitiUtil;
import com.evolveum.midpoint.wf.impl.tasks.WfTaskController;
import com.evolveum.midpoint.wf.impl.messages.ProcessEvent;
import com.evolveum.midpoint.wf.impl.messages.ProcessFinishedEvent;
Expand Down Expand Up @@ -171,10 +172,7 @@ public void notifyMidpointAboutProcessEvent(DelegateExecution execution) {
private void notifyMidpointAboutProcessEvent(ProcessEvent event) {
OperationResult result = new OperationResult(DOT_CLASS + "notifyMidpointAboutProcessEvent");

String taskOid = event.getVariable(CommonProcessVariableNames.VARIABLE_MIDPOINT_TASK_OID, String.class);
if (taskOid == null) {
throw new IllegalStateException("No task OID in process variables for " + event.getProcessDebugInfo());
}
String taskOid = ActivitiUtil.getTaskOid(event.getVariables());
Task task;
try {
task = taskManager.getTask(taskOid, result);
Expand Down
Expand Up @@ -34,12 +34,11 @@
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.wf.api.WorkflowManager;
import com.evolveum.midpoint.wf.impl.activiti.ActivitiEngine;
import com.evolveum.midpoint.wf.impl.processes.common.ActivitiUtil;
import com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames;
import com.evolveum.midpoint.wf.impl.processes.itemApproval.MidpointUtil;
import com.evolveum.midpoint.wf.impl.util.MiscDataUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemDelegationMethodType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType;
import org.activiti.engine.FormService;
import org.activiti.engine.TaskService;
Expand Down Expand Up @@ -232,14 +231,16 @@ public void delegateWorkItem(String workItemId, List<ObjectReferenceType> delega
}

List<ObjectReferenceType> newAssignees;
if (method == null || method == WorkItemDelegationMethodType.REPLACE_ASSIGNEES) {
newAssignees = new ArrayList<>();
} else if (method == WorkItemDelegationMethodType.ADD_ASSIGNEES) {
newAssignees = new ArrayList<>(workItem.getAssigneeRef());
} else {
throw new UnsupportedOperationException("Delegation method " + method + " is not supported yet.");
if (method == null) {
method = WorkItemDelegationMethodType.REPLACE_ASSIGNEES;
}
switch (method) {
case ADD_ASSIGNEES: newAssignees = new ArrayList<>(workItem.getAssigneeRef()); break;
case REPLACE_ASSIGNEES: newAssignees = new ArrayList<>(); break;
default: throw new UnsupportedOperationException("Delegation method " + method + " is not supported yet.");
}

List<ObjectReferenceType> delegatedTo = new ArrayList<>();
for (ObjectReferenceType delegate : delegates) {
if (delegate.getType() != null && !QNameUtil.match(UserType.COMPLEX_TYPE, delegate.getType())) {
throw new IllegalArgumentException("Couldn't use non-user object as a delegate: " + delegate);
Expand All @@ -249,6 +250,7 @@ public void delegateWorkItem(String workItemId, List<ObjectReferenceType> delega
}
if (!ObjectTypeUtil.containsOid(newAssignees, delegate.getOid())) {
newAssignees.add(delegate.clone());
delegatedTo.add(delegate.clone());
}
}

Expand All @@ -271,6 +273,14 @@ public void delegateWorkItem(String workItemId, List<ObjectReferenceType> delega
.map(d -> ADDITIONAL_ASSIGNEES_PREFIX + MiscDataUtil.refToString(d) + ADDITIONAL_ASSIGNEES_SUFFIX)
.collect(Collectors.joining(CommonProcessVariableNames.ADDITIONAL_ASSIGNEES_SEPARATOR));
taskService.setVariableLocal(workItemId, CommonProcessVariableNames.VARIABLE_ADDITIONAL_ASSIGNEES, additionalAssigneesAsString);

//Map<String, Object> variables = activitiEngine.getRuntimeService().getVariables(task.getExecutionId());
Map<String, Object> variables = taskService.getVariables(workItemId);
WorkItemDelegationEventType event = new WorkItemDelegationEventType();
ActivitiUtil.fillInWorkItemEvent(event, principal, workItemId, variables);
event.getDelegatedTo().addAll(delegatedTo);
event.setDelegationMethod(method); // not null at this moment
MidpointUtil.recordEventInTask(event, null, ActivitiUtil.getTaskOid(variables), result);
} catch (SecurityViolationException|RuntimeException e) {
result.recordFatalError("Couldn't delegate work item " + workItemId + ": " + e.getMessage(), e);
throw e;
Expand Down
Expand Up @@ -18,8 +18,11 @@

import com.evolveum.midpoint.model.api.expr.MidpointFunctions;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.schema.util.WfContextUtil;
import com.evolveum.midpoint.security.api.MidPointPrincipal;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand All @@ -28,19 +31,23 @@
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.wf.impl.processes.itemApproval.ApprovalLevel;
import com.evolveum.midpoint.wf.impl.processes.itemApproval.ProcessVariableNames;
import com.evolveum.midpoint.wf.impl.util.MiscDataUtil;
import com.evolveum.midpoint.wf.impl.util.SerializationSafeContainer;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ApprovalLevelType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemEventType;
import org.activiti.engine.delegate.DelegateExecution;
import org.jetbrains.annotations.NotNull;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames.*;
import static com.evolveum.midpoint.wf.impl.processes.common.SpringApplicationContextHolder.getMidpointFunctions;
import static com.evolveum.midpoint.wf.impl.processes.common.SpringApplicationContextHolder.getTaskManager;

Expand Down Expand Up @@ -99,12 +106,14 @@ public String toString() {
return this.getClass().getName() + " object.";
}

@NotNull
public static String getTaskOid(Map<String, Object> variables) {
return ActivitiUtil.getRequiredVariable(variables, CommonProcessVariableNames.VARIABLE_MIDPOINT_TASK_OID, String.class, null);
}

@NotNull
public static Task getTask(DelegateExecution execution, OperationResult result) {
String oid = execution.getVariable(CommonProcessVariableNames.VARIABLE_MIDPOINT_TASK_OID, String.class);
if (oid == null) {
throw new IllegalStateException("No task OID in process " + execution.getProcessInstanceId());
}
String oid = getTaskOid(execution.getVariables());
try {
return getTaskManager().getTask(oid, result);
} catch (ObjectNotFoundException|SchemaException|RuntimeException e) {
Expand Down Expand Up @@ -171,4 +180,21 @@ public static WfContextType getWorkflowContext(Task wfTask) {
public static List<LightweightObjectRef> toLightweightReferences(Collection<ObjectReferenceType> refs) {
return refs.stream().map(ort -> new LightweightObjectRefImpl(ort)).collect(Collectors.toList());
}

// TODO move to better place (it is called also from WorkItemManager)
public static void fillInWorkItemEvent(WorkItemEventType event, MidPointPrincipal currentUser, String workItemId, Map<String, Object> variables) {
if (currentUser != null) {
event.setInitiatorRef(ObjectTypeUtil.createObjectRef(currentUser.getUser()));
}
event.setTimestamp(XmlTypeConverter.createXMLGregorianCalendar(new Date()));
event.setWorkItemId(workItemId);
String originalAssigneeString = ActivitiUtil.getVariable(variables, VARIABLE_ORIGINAL_ASSIGNEE, String.class, null);
if (originalAssigneeString != null) {
event.setOriginalAssigneeRef(MiscDataUtil.stringToRef(originalAssigneeString));
}
event.setStageDisplayName(ActivitiUtil.getVariable(variables, VARIABLE_STAGE_DISPLAY_NAME, String.class, null));
event.setStageName(ActivitiUtil.getVariable(variables, VARIABLE_STAGE_NAME, String.class, null));
event.setStageNumber(ActivitiUtil.getRequiredVariable(variables, VARIABLE_STAGE_NUMBER, Integer.class, null));

}
}
Expand Up @@ -65,29 +65,18 @@ public void notify(DelegateTask delegateTask) {

new MidPointTaskListener().notify(delegateTask);

WorkItemCompletionEventType event = new WorkItemCompletionEventType();
MidPointPrincipal user;
try {
user = SecurityUtil.getPrincipal();
if (user != null) {
event.setInitiatorRef(ObjectTypeUtil.createObjectRef(user.getUser()));
}
} catch (SecurityViolationException e) {
throw new SystemException("Couldn't record a decision: " + e.getMessage(), e);
}

LOGGER.trace("======================================== Recording individual decision of {}", user);
WorkItemCompletionEventType event = new WorkItemCompletionEventType();
ActivitiUtil.fillInWorkItemEvent(event, user, delegateTask.getId(), execution.getVariables());
WorkItemResultType result = getItemApprovalProcessInterface().extractWorkItemResult(delegateTask.getVariables());
event.setResult(result);
event.setTimestamp(XmlTypeConverter.createXMLGregorianCalendar(new Date()));
event.setWorkItemId(delegateTask.getId());
String originalAssigneeString = ActivitiUtil.getVariable(execution, VARIABLE_ORIGINAL_ASSIGNEE, String.class, prismContext);
if (originalAssigneeString != null) {
event.setOriginalAssigneeRef(MiscDataUtil.stringToRef(originalAssigneeString));
}
event.setStageDisplayName(level.getDisplayName());
event.setStageName(level.getName());
event.setStageNumber(ActivitiUtil.getRequiredVariable(execution, VARIABLE_STAGE_NUMBER, Integer.class, prismContext));

boolean isApproved = ApprovalUtils.isApproved(result);

Expand Down
Expand Up @@ -21,6 +21,7 @@
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.WfContextUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.DebugUtil;
Expand All @@ -30,13 +31,15 @@
import com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemDelegationEventType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.Test;

import java.util.Collections;
import java.util.List;

import static com.evolveum.midpoint.test.IntegrationTestTools.display;
import static com.evolveum.midpoint.test.util.TestUtil.assertSuccess;
Expand Down Expand Up @@ -134,7 +137,9 @@ public void test120DelegateToUser2() throws Exception {

WorkItemType workItem = getWorkItem(task, result);
display("work item", workItem);
display("task", getObjectViaRepo(TaskType.class, taskOid));

PrismObject<TaskType> wfTask = getObjectViaRepo(TaskType.class, taskOid);
display("task", wfTask);

PrismAsserts.assertReferenceValues(ref(workItem.getAssigneeRef()), userLead1Oid, userLead2Oid);
assertRefEquals("Wrong originalAssigneeRef", ort(userLead1Oid), workItem.getOriginalAssigneeRef());
Expand All @@ -147,6 +152,10 @@ public void test120DelegateToUser2() throws Exception {
String additionalAssignees = (String) activitiEngine.getTaskService()
.getVariables(activitiTask.getId()).get(CommonProcessVariableNames.VARIABLE_ADDITIONAL_ASSIGNEES);
assertEquals("Wrong additional assignees", "[UserType:" + userLead2Oid + "]", additionalAssignees);

List<WorkItemDelegationEventType> events = WfContextUtil.getWorkItemEvents(wfTask.asObjectable().getWorkflowContext(), workItemId, WorkItemDelegationEventType.class);
assertEquals("Wrong # of delegation events", 1, events.size());
// TODO check content
}

@Test
Expand All @@ -165,7 +174,9 @@ public void test130DelegateToUser3ByReplace() throws Exception {

WorkItemType workItem = getWorkItem(task, result);
display("work item", workItem);
display("task", getObjectViaRepo(TaskType.class, taskOid));

PrismObject<TaskType> wfTask = getObjectViaRepo(TaskType.class, taskOid);
display("task", wfTask);

PrismAsserts.assertReferenceValues(ref(workItem.getAssigneeRef()), userLead3Oid);
assertRefEquals("Wrong originalAssigneeRef", ort(userLead1Oid), workItem.getOriginalAssigneeRef());
Expand All @@ -178,6 +189,10 @@ public void test130DelegateToUser3ByReplace() throws Exception {
String additionalAssignees = (String) activitiEngine.getTaskService()
.getVariables(activitiTask.getId()).get(CommonProcessVariableNames.VARIABLE_ADDITIONAL_ASSIGNEES);
assertNull("additionalAssignees present but it shouldn't be", additionalAssignees);

List<WorkItemDelegationEventType> events = WfContextUtil.getWorkItemEvents(wfTask.asObjectable().getWorkflowContext(), workItemId, WorkItemDelegationEventType.class);
assertEquals("Wrong # of delegation events", 2, events.size());
// TODO check content
}

@Test
Expand All @@ -196,7 +211,9 @@ public void test140DelegateToNoneByReplace() throws Exception {

WorkItemType workItem = getWorkItem(task, result);
display("work item", workItem);
display("task", getObjectViaRepo(TaskType.class, taskOid));

PrismObject<TaskType> wfTask = getObjectViaRepo(TaskType.class, taskOid);
display("task", wfTask);

assertEquals("Wrong assigneeRef count", 0, workItem.getAssigneeRef().size());
assertRefEquals("Wrong originalAssigneeRef", ort(userLead1Oid), workItem.getOriginalAssigneeRef());
Expand All @@ -209,7 +226,9 @@ public void test140DelegateToNoneByReplace() throws Exception {
String additionalAssignees = (String) activitiEngine.getTaskService()
.getVariables(activitiTask.getId()).get(CommonProcessVariableNames.VARIABLE_ADDITIONAL_ASSIGNEES);
assertNull("additionalAssignees present but it shouldn't be", additionalAssignees);
}


List<WorkItemDelegationEventType> events = WfContextUtil.getWorkItemEvents(wfTask.asObjectable().getWorkflowContext(), workItemId, WorkItemDelegationEventType.class);
assertEquals("Wrong # of delegation events", 3, events.size());
// TODO check content
}
}

0 comments on commit 94eaf41

Please sign in to comment.