From 406405e44e4cc736f86c7f9254e296b1c48d39b2 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 1 Mar 2017 22:50:05 +0100 Subject: [PATCH] Storing operation business context in workflow process (in "process created" event). --- .../page/admin/workflow/dto/WorkItemDto.java | 13 +++++--- .../web/page/self/PageAssignmentsList.java | 11 ++++--- .../midpoint/schema/util/WfContextUtil.java | 15 ++++++--- .../ns/public/common/common-workflows-3.xsd | 33 ++++++++++++++----- .../PcpChildWfTaskCreationInstruction.java | 17 +++++++--- .../impl/tasks/WfTaskCreationInstruction.java | 2 +- .../policy/other/TestSimpleCompletion.java | 29 ++++++++++++---- .../midpoint/testing/story/TestStrings.java | 8 ++--- 8 files changed, 92 insertions(+), 36 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDto.java index 4fa32d8d723..76ce7c69215 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDto.java @@ -94,6 +94,8 @@ public class WorkItemDto extends Selectable { public static final String F_PROCESS_INSTANCE_ID = "processInstanceId"; public static final String F_CHANGES = "changes"; + public static final String F_REQUESTER_COMMENT = "requesterComment"; + // workItem may or may not contain resolved taskRef; // and this task may or may not contain filled-in workflowContext -> and then requesterRef object // @@ -232,11 +234,7 @@ public String getTargetName() { public WfContextType getWorkflowContext() { TaskType task = getTaskType(); - if (task == null || task.getWorkflowContext() == null) { - return null; - } else { - return task.getWorkflowContext(); - } + return task != null ? task.getWorkflowContext() : null; } public String getRequesterName() { @@ -401,4 +399,9 @@ public ObjectType getFocus(PageBase pageBase) { } return focus; } + + public String getRequesterComment() { + OperationBusinessContextType businessContext = WfContextUtil.getBusinessContext(getWorkflowContext()); + return businessContext != null ? businessContext.getComment() : null; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentsList.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentsList.java index 2d2e021db59..d76fd6421dc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentsList.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentsList.java @@ -184,10 +184,13 @@ private void onRequestPerformed(AjaxRequestTarget target) { PrismContainerDefinition def = user.getDefinition().findContainerDefinition(UserType.F_ASSIGNMENT); handleAssignmentDeltas(delta, addAssignmentsToUser(), def); - OperationBusinessContextType businessContextType = new OperationBusinessContextType(); - businessContextType.setComment(descriptionModel.getObject() != null ? - descriptionModel.getObject() : ""); - + OperationBusinessContextType businessContextType; + if (descriptionModel.getObject() != null) { + businessContextType = new OperationBusinessContextType(); + businessContextType.setComment(descriptionModel.getObject()); + } else { + businessContextType = null; + } getModelService().executeChanges(deltas, ModelExecuteOptions.createRequestBusinessContext(businessContextType), createSimpleTask(OPERATION_REQUEST_ASSIGNMENTS), result); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/WfContextUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/WfContextUtil.java index 1d4d9b935d6..b72df860ac4 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/WfContextUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/WfContextUtil.java @@ -20,10 +20,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -267,4 +264,14 @@ public static void checkLevelsOrderingStrict(ApprovalSchemaType schema) { } } } + + public static OperationBusinessContextType getBusinessContext(WfContextType wfc) { + if (wfc == null) { + return null; + } + return wfc.getEvent().stream() + .filter(e -> e instanceof WfProcessCreationEventType) + .map(e -> ((WfProcessCreationEventType) e).getBusinessContext()) + .findFirst().orElse(null); + } } diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-workflows-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-workflows-3.xsd index 64509b8b762..a0981da4350 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-workflows-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-workflows-3.xsd @@ -1399,14 +1399,6 @@ - - - - - - - - @@ -1624,6 +1616,31 @@ + + + + Event describing the creation of a workflow process instance. + + + 3.6 + + + + + + + + + Business context of the operation, if provided. + TODO move to WfProcessEventType? + + + + + + + + diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java index 7bf11d95439..9e2d4ed319a 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java @@ -21,7 +21,9 @@ import com.evolveum.midpoint.model.impl.lens.LensContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.ObjectTreeDeltas; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; @@ -33,12 +35,11 @@ import com.evolveum.midpoint.wf.impl.processors.primary.aspect.PrimaryChangeAspect; import com.evolveum.midpoint.wf.impl.tasks.ProcessSpecificContent; import com.evolveum.midpoint.wf.impl.tasks.WfTaskCreationInstruction; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ApprovalSchemaType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SchemaAttachedPolicyRulesType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.jetbrains.annotations.NotNull; +import java.util.Date; + /** * @author mederly */ @@ -77,6 +78,14 @@ public void prepareCommonAttributes(PrimaryChangeAspect aspect, ModelContext setTaskModelContext(((PrimaryChangeProcessor) getChangeProcessor()).contextCopyWithNoDelta((LensContext) modelContext)); setExecuteModelOperationHandler(true); } + + WfProcessCreationEventType event = new WfProcessCreationEventType(); + event.setTimestamp(XmlTypeConverter.createXMLGregorianCalendar(new Date())); + if (requester != null) { + event.setInitiatorRef(ObjectTypeUtil.createObjectRef(requester)); + } + event.setBusinessContext(((LensContext) modelContext).getRequestBusinessContext()); + wfContext.getEvent().add(event); } public void setDeltasToProcess(ObjectDelta delta) { diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskCreationInstruction.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskCreationInstruction.java index 87919ede5c5..625557ec2d9 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskCreationInstruction.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskCreationInstruction.java @@ -59,7 +59,7 @@ public class WfTaskCreationInstruction userDelta = createAssignmentUserDelta(userJackOid, roleRole1aOid, RoleType.COMPLEX_TYPE, null, null, null, true); + Collection> deltas = MiscSchemaUtil.createCollection(userDelta); + modelService.executeChanges(deltas, ModelExecuteOptions.createRequestBusinessContext(businessContext), task, result); + assertNotAssignedRole(userJackOid, roleRole1aOid, task, result); WorkItemType workItem = getWorkItem(task, result); @@ -72,12 +84,17 @@ public void test100SimpleApprove() throws Exception { TaskType wfTask = getTask(workItem.getTaskRef().getOid()).asObjectable(); display("workflow context", wfTask.getWorkflowContext()); List events = wfTask.getWorkflowContext().getEvent(); - assertEquals("Wrong # of events", 1, events.size()); - WorkItemEventType event = (WorkItemEventType) events.get(0); - display("Event", event); + assertEquals("Wrong # of events", 2, events.size()); + + WfProcessCreationEventType event1 = (WfProcessCreationEventType) events.get(0); + display("Event 1", event1); + assertEquals("Wrong requester comment", "req.comment", WfContextUtil.getBusinessContext(wfTask.getWorkflowContext()).getComment()); + + WorkItemEventType event2 = (WorkItemEventType) events.get(1); + display("Event 2", event2); - assertNotNull("Original assignee is null", event.getOriginalAssigneeRef()); - assertEquals("Wrong original assignee OID", userLead1Oid, event.getOriginalAssigneeRef().getOid()); + assertNotNull("Original assignee is null", event2.getOriginalAssigneeRef()); + assertEquals("Wrong original assignee OID", userLead1Oid, event2.getOriginalAssigneeRef().getOid()); } } diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestStrings.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestStrings.java index ecb21045c9c..d1ef3686c3b 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestStrings.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestStrings.java @@ -351,8 +351,8 @@ public void test102SimpleAssignmentApproveByLechuck() throws Exception { "Allocated to: Horridly Scarred Barkeep (barkeeper)", "(in 7 days)", "^Result:"); // events - List events = assertEvents(wfTask, 1); - assertCompletionEvent(events.get(0), userLechuckOid, userLechuckOid, 1, "Line managers", WorkItemOutcomeType.APPROVE, "OK. LeChuck"); + List events = assertEvents(wfTask, 2); + assertCompletionEvent(events.get(1), userLechuckOid, userLechuckOid, 1, "Line managers", WorkItemOutcomeType.APPROVE, "OK. LeChuck"); display("audit", dummyAuditService); } @@ -687,8 +687,8 @@ public void test204SixDaysLater() throws Exception { assertEquals("Wrong escalation level #", (Integer) 1, workItem.getEscalationLevelNumber()); assertEquals("Wrong escalation level name", "Line manager escalation", workItem.getEscalationLevelName()); - List events = assertEvents(wfTask, 1); - assertEscalationEvent(events.get(0), userAdministrator.getOid(), userGuybrushOid, 1, "Line managers", + List events = assertEvents(wfTask, 2); + assertEscalationEvent(events.get(1), userAdministrator.getOid(), userGuybrushOid, 1, "Line managers", Collections.singletonList(userGuybrushOid), Collections.singletonList(userCheeseOid), WorkItemDelegationMethodType.ADD_ASSIGNEES, 1, "Line manager escalation");