From bf4e9f6614ad1a4d6d5f9fb3037352081d6b73a9 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 8 Mar 2016 19:53:11 +0100 Subject: [PATCH] Cleaned up common process instance variables. --- .../schema/constants/SchemaConstants.java | 1 + .../activiti/dao/ProcessInstanceManager.java | 2 +- .../activiti/dao/ProcessInstanceProvider.java | 2 +- .../impl/activiti/dao/WorkItemProvider.java | 4 +- .../wf/impl/jobs/WfTaskController.java | 2 +- .../impl/jobs/WfTaskCreationInstruction.java | 13 +--- .../processes/ProcessInterfaceFinder.java | 4 +- .../impl/processes/common/ActivitiUtil.java | 23 +++++- .../common/CommonProcessVariableNames.java | 71 +++++++++---------- .../common/MidPointProcessListener.java | 2 +- .../SpringApplicationContextHolder.java | 5 ++ ...InitializeLoopThroughApproversInLevel.java | 70 ++++++++---------- .../wf/impl/processors/BaseAuditHelper.java | 6 +- .../processors/BaseExternalizationHelper.java | 5 +- .../scenarios/BaseGcpScenarioBean.java | 2 +- .../PcpChildWfTaskCreationInstruction.java | 1 - .../primary/PcpExternalizationHelper.java | 24 ------- .../primary/PcpRepoAccessHelper.java | 54 -------------- .../primary/objects/AddObjectAspect.java | 2 +- .../midpoint/wf/impl/util/MiscDataUtil.java | 53 +++----------- 20 files changed, 118 insertions(+), 228 deletions(-) diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java index 361898ed500..78e6cd11c97 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java @@ -68,6 +68,7 @@ public abstract class SchemaConstants { public static final QName C_ITEM = new QName(NS_C, "item"); public static final QName C_OBJECTS = new QName(NS_C, "objects"); public static final QName C_OBJECT = new QName(NS_C, "object"); + public static final QName C_TARGET = new QName(NS_C, "target"); public static final QName C_ABSTRACT_ROLE = new QName(NS_C, "abstractRole"); public static final QName C_FOCUS = new QName(NS_C, "focus"); public static final QName C_OBJECT_TYPE = new QName(NS_C, "ObjectType"); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceManager.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceManager.java index 04bafa322df..af714cd9475 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceManager.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceManager.java @@ -58,7 +58,7 @@ public void stopProcessInstance(String instanceId, String username, OperationRes LOGGER.trace("Stopping process instance {} on the request of {}", instanceId, username); String deletionMessage = "Process instance stopped on the request of " + username; // rs.setVariable(instanceId, CommonProcessVariableNames.VARIABLE_WF_STATE, deletionMessage); - rs.setVariable(instanceId, CommonProcessVariableNames.VARIABLE_MIDPOINT_IS_PROCESS_INSTANCE_STOPPING, Boolean.TRUE); + rs.setVariable(instanceId, CommonProcessVariableNames.VARIABLE_PROCESS_INSTANCE_IS_STOPPING, Boolean.TRUE); rs.deleteProcessInstance(instanceId, deletionMessage); result.recordSuccess(); } catch (ActivitiException e) { diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceProvider.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceProvider.java index 193c2c568d7..5abe9b6559e 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceProvider.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceProvider.java @@ -149,7 +149,7 @@ private WfContextType activitiToMidpointWfContextHistory(HistoricProcessInstance wfc.setTargetRef(targetRef.toObjectReferenceType()); } - ChangeProcessor cp = wfConfiguration.findChangeProcessor((String) vars.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_CHANGE_PROCESSOR)); + ChangeProcessor cp = wfConfiguration.findChangeProcessor((String) vars.get(CommonProcessVariableNames.VARIABLE_CHANGE_PROCESSOR)); if (cp == null) { throw new SchemaException("No change processor information in process instance " + instance.getId()); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/WorkItemProvider.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/WorkItemProvider.java index ab156978346..f6781d68027 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/WorkItemProvider.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/WorkItemProvider.java @@ -593,7 +593,7 @@ private WorkItemType taskExtractToWorkItem(TaskExtract task, boolean getAssignee } wi.setName(new PolyStringType(task.getName())); wi.setProcessInstanceId(task.getProcessInstanceId()); - wi.setChangeProcessor((String) task.getVariables().get(CommonProcessVariableNames.VARIABLE_MIDPOINT_CHANGE_PROCESSOR)); + wi.setChangeProcessor((String) task.getVariables().get(CommonProcessVariableNames.VARIABLE_CHANGE_PROCESSOR)); MetadataType metadataType = new MetadataType(); metadataType.setCreateTimestamp(XmlTypeConverter.createXMLGregorianCalendar(task.getCreateTime())); wi.setMetadata(metadataType); @@ -660,7 +660,7 @@ private T asObjectable(PrismObject prismObject) { } private ChangeProcessor getChangeProcessor(TaskExtract task, Map variables) { - String cpClassName = (String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_CHANGE_PROCESSOR); + String cpClassName = (String) variables.get(CommonProcessVariableNames.VARIABLE_CHANGE_PROCESSOR); if (cpClassName == null) { throw new IllegalStateException("Change processor is unknown for task: " + task); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskController.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskController.java index e3b57e668ab..72d741d01ce 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskController.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskController.java @@ -353,7 +353,7 @@ private void onProcessFinishedEvent(ProcessEvent event, WfTask wfTask, Operation } private ChangeProcessor getChangeProcessor(Map variables) { - String cpName = (String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_CHANGE_PROCESSOR); + String cpName = (String) variables.get(CommonProcessVariableNames.VARIABLE_CHANGE_PROCESSOR); Validate.notNull(cpName, "Change processor is not defined among process instance variables"); return wfConfiguration.findChangeProcessor(cpName); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskCreationInstruction.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskCreationInstruction.java index 96afda1438c..033354885a9 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskCreationInstruction.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskCreationInstruction.java @@ -346,30 +346,21 @@ public void addTaskModelContext(ModelContext modelContext) throws SchemaExceptio //region Setters for process variables public void initializeCommonProcessVariables() { addProcessVariable(VARIABLE_UTIL, new ActivitiUtil()); - addProcessVariable(VARIABLE_MIDPOINT_CHANGE_PROCESSOR, changeProcessor.getClass().getName()); + addProcessVariable(VARIABLE_CHANGE_PROCESSOR, changeProcessor.getClass().getName()); addProcessVariable(VARIABLE_START_TIME, new Date()); } public void setRequesterOidAndRefInProcess(PrismObject requester) { - addProcessVariable(VARIABLE_MIDPOINT_REQUESTER_OID, requester.getOid()); addProcessVariable(VARIABLE_REQUESTER_REF, new LightweightObjectRefImpl(createObjectRef(requester))); } - public void setObjectOidInProcess(String objectOid) { - if (objectOid != null) { - addProcessVariable(VARIABLE_MIDPOINT_OBJECT_OID, objectOid); - } else { - removeProcessVariable(VARIABLE_MIDPOINT_OBJECT_OID); - } - } - public void setProcessInstanceName(String name) { processInstanceName = name; addProcessVariable(VARIABLE_PROCESS_INSTANCE_NAME, name); } public void setProcessInterfaceBean(ProcessMidPointInterface processInterfaceBean) { - addProcessVariable(VARIABLE_MIDPOINT_PROCESS_INTERFACE_BEAN_NAME, processInterfaceBean.getBeanName()); + addProcessVariable(VARIABLE_PROCESS_INTERFACE_BEAN_NAME, processInterfaceBean.getBeanName()); } //endregion diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/ProcessInterfaceFinder.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/ProcessInterfaceFinder.java index a8354e69211..8a7a7f213b8 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/ProcessInterfaceFinder.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/ProcessInterfaceFinder.java @@ -34,9 +34,9 @@ public class ProcessInterfaceFinder implements BeanFactoryAware { private BeanFactory beanFactory; public ProcessMidPointInterface getProcessInterface(Map variables) { - String interfaceBeanName = (String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_PROCESS_INTERFACE_BEAN_NAME); + String interfaceBeanName = (String) variables.get(CommonProcessVariableNames.VARIABLE_PROCESS_INTERFACE_BEAN_NAME); if (interfaceBeanName == null) { - throw new IllegalStateException("No " + CommonProcessVariableNames.VARIABLE_MIDPOINT_PROCESS_INTERFACE_BEAN_NAME + " variable found"); + throw new IllegalStateException("No " + CommonProcessVariableNames.VARIABLE_PROCESS_INTERFACE_BEAN_NAME + " variable found"); } return beanFactory.getBean(interfaceBeanName, ProcessMidPointInterface.class); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ActivitiUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ActivitiUtil.java index 088bf197934..fa800e7d836 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ActivitiUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ActivitiUtil.java @@ -18,13 +18,21 @@ import com.evolveum.midpoint.model.api.expr.MidpointFunctions; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.wf.impl.util.SerializationSafeContainer; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; +import org.activiti.engine.delegate.DelegateExecution; import java.io.Serializable; +import static com.evolveum.midpoint.wf.impl.processes.common.SpringApplicationContextHolder.*; + /** * General utilities that can be used from within processes. * @@ -64,11 +72,24 @@ public void revive(SerializationSafeContainer container) { // todo - better name? public MidpointFunctions midpoint() { - return SpringApplicationContextHolder.getMidpointFunctions(); + return getMidpointFunctions(); } @Override public String toString() { return this.getClass().getName() + " object."; } + + 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()); + } + + try { + return getTaskManager().getTask(oid, result); + } catch (ObjectNotFoundException|SchemaException|RuntimeException e) { + throw new SystemException("Couldn't get task " + oid + " corresponding to process " + execution.getProcessInstanceId(), e); + } + } } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/CommonProcessVariableNames.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/CommonProcessVariableNames.java index 13c5523efa5..90a67e46ad3 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/CommonProcessVariableNames.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/CommonProcessVariableNames.java @@ -26,57 +26,52 @@ public class CommonProcessVariableNames { // Used for diagnostic purposes. public static final String VARIABLE_PROCESS_INSTANCE_NAME = "processInstanceName"; - // When the process instance was started. [java.util.Date] + // [java.util.Date] + // When the process instance was started. public static final String VARIABLE_START_TIME = "startTime"; - // OID of task related to the process instance. [String] + // [String] + // OID of task related to the process instance. public static final String VARIABLE_MIDPOINT_TASK_OID = "midPointTaskOid"; - // Java class name of the change processor (the same as wf:changeProcessor task property) [String] - public static final String VARIABLE_MIDPOINT_CHANGE_PROCESSOR = "midPointChangeProcessor"; + // [String] + // Java class name of the change processor (the same as wf:changeProcessor task property) + public static final String VARIABLE_CHANGE_PROCESSOR = "changeProcessor"; - // OID of the user who requested the particular operation. - // Used e.g. for searching for process instances requested by particular user. [String] - public static final String VARIABLE_MIDPOINT_REQUESTER_OID = "requesterOid"; - - // Requester - OID + name + perhaps additional information [LightweightObjectRef] - // Pure OID is kept in order to allow searching. + // [LightweightObjectRef] + // Requester - OID + name + perhaps additional information public static final String VARIABLE_REQUESTER_REF = "requesterRef"; + // [LightweightObjectRef] + // Object of the operation - if can be specified like this + public static final String VARIABLE_OBJECT_REF = "objectRef"; - // OID of the object (typically, a user) that is being changed within the operation. [String] - // In some cases (e.g. for PrimaryChangeProcessor) the OID is determined clearly. - // In other situations, e.g. for GeneralChangeProcessor there must be a code that provides - // this information. In some cases, there may be no OID - e.g. when an object is yet to be created. - // - // TODO think about storing also object class (currently we fetch an object from the repo as "ObjectType.class" but that's far from ideal). - public static final String VARIABLE_MIDPOINT_OBJECT_OID = "midPointObjectOid"; - - // Object that provides various utility methods for use in processes, e.g. getApprover(RoleType r). [ActivitiUtil] - public static final String VARIABLE_UTIL = "util"; - - // Basic decision returned from a work item. - // for most work items it is simple __APPROVED__ or __REJECTED__, but in principle this can be any string value - public static final String FORM_FIELD_DECISION = "[H]decision"; - - // Comment related to that decision - set by user task (form). [String] - // this value is put into audit record, so its advisable to use this particular name - public static final String FORM_FIELD_COMMENT = "comment"; - - public static final String FORM_BUTTON_PREFIX = "[B]"; + // [LightweightObjectRef] + // Target of the operation - if any + public static final String VARIABLE_TARGET_REF = "targetRef"; + // [Boolean] // A signal that the process instance is being stopped. Used e.g. to suppress propagation of exceptions // occurring in the process instance end listener. - // [Boolean] - public static final String VARIABLE_MIDPOINT_IS_PROCESS_INSTANCE_STOPPING = "midPointIsProcessInstanceStopping"; + public static final String VARIABLE_PROCESS_INSTANCE_IS_STOPPING = "processInstanceIsStopping"; + + // [String] + // Name of process interface bean (ProcessMidPointInterface implementation) that is related to this process + public static final String VARIABLE_PROCESS_INTERFACE_BEAN_NAME = "processInterfaceBeanName"; - // Name of process interface bean (ProcessMidPointInterface implementation) that is related to this process [String] - public static final String VARIABLE_MIDPOINT_PROCESS_INTERFACE_BEAN_NAME = "midPointProcessInterfaceBeanName"; + // [ActivitiUtil] + // Object that provides various utility methods for use in processes, e.g. getApprover(RoleType r). + public static final String VARIABLE_UTIL = "util"; - // Object of the operation - if can be specified like this [LightweightObjectRef] - public static final String VARIABLE_OBJECT_REF = "objectRef"; + // [String] + // Basic decision returned from a work item. + // for most work items it is simple __APPROVED__ or __REJECTED__, but in principle this can be any string value + public static final String FORM_FIELD_DECISION = "[H]decision"; - // Target of the operation - if any [LightweightObjectRef] - public static final String VARIABLE_TARGET_REF = "targetRef"; + // [String] + // Comment related to that decision - set by user task (form). + // this value is put into audit record, so its advisable to use this particular name + public static final String FORM_FIELD_COMMENT = "comment"; + public static final String FORM_BUTTON_PREFIX = "[B]"; } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/MidPointProcessListener.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/MidPointProcessListener.java index 9cc26f07d67..f102f81bf90 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/MidPointProcessListener.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/MidPointProcessListener.java @@ -49,7 +49,7 @@ public void notify(DelegateExecution execution) { getActivitiInterface().notifyMidpointAboutProcessFinishedEvent(execution); } catch (RuntimeException e) { LOGGER.trace("Got exception while processing process end event in midpoint", e); - if (TRUE.equals(execution.getVariable(CommonProcessVariableNames.VARIABLE_MIDPOINT_IS_PROCESS_INSTANCE_STOPPING))) { + if (TRUE.equals(execution.getVariable(CommonProcessVariableNames.VARIABLE_PROCESS_INSTANCE_IS_STOPPING))) { LOGGER.trace("... the process is ending anyway, so we just ignore this exception"); } else { throw e; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/SpringApplicationContextHolder.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/SpringApplicationContextHolder.java index 31e7e0a4d12..2b161aa1abf 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/SpringApplicationContextHolder.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/SpringApplicationContextHolder.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.model.api.expr.MidpointFunctions; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.task.api.TaskManager; import com.evolveum.midpoint.wf.impl.activiti.ActivitiInterface; import com.evolveum.midpoint.wf.impl.jobs.WfTaskController; import com.evolveum.midpoint.wf.impl.processors.primary.PcpRepoAccessHelper; @@ -91,6 +92,10 @@ public static MidpointFunctions getMidpointFunctions() { public static PcpRepoAccessHelper getPcpRepoAccessHelper() { return getBean("pcpRepoAccessHelper", PcpRepoAccessHelper.class); } + + public static TaskManager getTaskManager() { + return getBean(TaskManager.class); + } } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java index 85d3bf0fa01..0eb4f75c714 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.task.api.TaskManager; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; @@ -34,10 +35,8 @@ import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames; -import com.evolveum.midpoint.wf.impl.processes.common.LightweightObjectRef; -import com.evolveum.midpoint.wf.impl.processes.common.LightweightObjectRefImpl; -import com.evolveum.midpoint.wf.impl.processes.common.SpringApplicationContextHolder; +import com.evolveum.midpoint.wf.impl.jobs.WfTask; +import com.evolveum.midpoint.wf.impl.processes.common.*; import com.evolveum.midpoint.wf.impl.processors.primary.PcpProcessVariableNames; import com.evolveum.midpoint.wf.impl.util.MiscDataUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -51,6 +50,11 @@ import java.util.*; +import static com.evolveum.midpoint.schema.constants.SchemaConstants.C_OBJECT; +import static com.evolveum.midpoint.schema.constants.SchemaConstants.C_REQUESTER; +import static com.evolveum.midpoint.schema.constants.SchemaConstants.C_TARGET; +import static com.evolveum.midpoint.wf.impl.processes.common.SpringApplicationContextHolder.*; + /** * @author mederly */ @@ -65,21 +69,22 @@ public void execute(DelegateExecution execution) { LOGGER.trace("Executing the delegate; execution = {}", execution); OperationResult result = new OperationResult("dummy"); - Task task = null; + Task wfTask = ActivitiUtil.getTask(execution, result); + Task opTask = getTaskManager().createTaskInstance(); ExpressionVariables expressionVariables = null; ApprovalLevelImpl level = (ApprovalLevelImpl) execution.getVariable(ProcessVariableNames.LEVEL); Validate.notNull(level, "Variable " + ProcessVariableNames.LEVEL + " is undefined"); - level.setPrismContext(SpringApplicationContextHolder.getPrismContext()); + level.setPrismContext(getPrismContext()); List decisionList = new ArrayList(); boolean preApproved = false; if (level.getAutomaticallyApproved() != null) { try { - expressionVariables = getDefaultVariables(execution, result); - preApproved = evaluateBooleanExpression(level.getAutomaticallyApproved(), expressionVariables, execution, task, result); + expressionVariables = getDefaultVariables(execution, wfTask, result); + preApproved = evaluateBooleanExpression(level.getAutomaticallyApproved(), expressionVariables, execution, opTask, result); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Pre-approved = " + preApproved + " for level " + level); } @@ -95,8 +100,8 @@ public void execute(DelegateExecution execution) { if (!level.getApproverExpressions().isEmpty()) { try { - expressionVariables = getDefaultVariablesIfNeeded(expressionVariables, execution, result); - approverRefs.addAll(evaluateExpressions(level.getApproverExpressions(), expressionVariables, execution, task, result)); + expressionVariables = getDefaultVariablesIfNeeded(expressionVariables, execution, wfTask, result); + approverRefs.addAll(evaluateExpressions(level.getApproverExpressions(), expressionVariables, execution, opTask, result)); } catch (Exception e) { // todo throw new SystemException("Couldn't evaluate approvers expressions", e); } @@ -124,7 +129,7 @@ public void execute(DelegateExecution execution) { private Collection evaluateExpressions(List approverExpressionList, ExpressionVariables expressionVariables, DelegateExecution execution, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException { - List retval = new ArrayList(); + List retval = new ArrayList<>(); for (ExpressionType approverExpression : approverExpressionList) { retval.addAll(evaluateExpression(approverExpression, expressionVariables, execution, task, result)); } @@ -181,7 +186,7 @@ private boolean evaluateBooleanExpression(ExpressionType expressionType, Express private ExpressionFactory getExpressionFactory() { LOGGER.trace("Getting expressionFactory"); - ExpressionFactory ef = SpringApplicationContextHolder.getApplicationContext().getBean("expressionFactory", ExpressionFactory.class); + ExpressionFactory ef = getApplicationContext().getBean("expressionFactory", ExpressionFactory.class); if (ef == null) { throw new IllegalStateException("expressionFactory bean cannot be found"); } @@ -189,46 +194,31 @@ private ExpressionFactory getExpressionFactory() { } - private ExpressionVariables getDefaultVariablesIfNeeded(ExpressionVariables variables, DelegateExecution execution, OperationResult result) throws SchemaException, ObjectNotFoundException { + private ExpressionVariables getDefaultVariablesIfNeeded(ExpressionVariables variables, DelegateExecution execution, Task wfTask, OperationResult result) throws SchemaException, ObjectNotFoundException { if (variables != null) { return variables; } else { - return getDefaultVariables(execution, result); + return getDefaultVariables(execution, wfTask, result); } } - private ExpressionVariables getDefaultVariables(DelegateExecution execution, OperationResult result) throws SchemaException, ObjectNotFoundException { + private ExpressionVariables getDefaultVariables(DelegateExecution execution, Task wfTask, OperationResult result) throws SchemaException, ObjectNotFoundException { - RepositoryService repositoryService = SpringApplicationContextHolder.getCacheRepositoryService(); - MiscDataUtil miscDataUtil = SpringApplicationContextHolder.getMiscDataUtil(); + RepositoryService repositoryService = getCacheRepositoryService(); + MiscDataUtil miscDataUtil = getMiscDataUtil(); ExpressionVariables variables = new ExpressionVariables(); - try { - variables.addVariableDefinition(SchemaConstants.C_REQUESTER, miscDataUtil.getRequester(execution.getVariables(), result)); - } catch (SchemaException e) { - throw new SchemaException("Couldn't get requester object due to schema exception", e); // todo do we really want to skip the whole processing? perhaps yes, otherwise we could get NPEs - } catch (ObjectNotFoundException e) { - throw new ObjectNotFoundException("Couldn't get requester object due to object not found exception", e); - } + ObjectReferenceType requesterRef = wfTask.getWorkflowContext().getRequesterRef(); + variables.addVariableDefinition(C_REQUESTER, miscDataUtil.resolveObjectReference(requesterRef, result)); - PrismObject objectToBeAdded = (PrismObject) execution.getVariable(PcpProcessVariableNames.VARIABLE_MIDPOINT_OBJECT_TO_BE_ADDED); - if (objectToBeAdded != null) { - variables.addVariableDefinition(SchemaConstants.C_OBJECT, objectToBeAdded); - } else { - String objectOid = (String) execution.getVariable(CommonProcessVariableNames.VARIABLE_MIDPOINT_OBJECT_OID); - if (objectOid != null) { - try { - variables.addVariableDefinition(SchemaConstants.C_OBJECT, repositoryService.getObject(ObjectType.class, objectOid, null, result)); - } catch (SchemaException e) { - throw new SchemaException("Couldn't get requester object due to schema exception", e); // todo do we really want to skip the whole processing? perhaps yes, otherwise we could get NPEs - } catch (ObjectNotFoundException e) { - throw new ObjectNotFoundException("Couldn't get requester object due to object not found exception", e); - } - } - } + ObjectReferenceType objectRef = wfTask.getWorkflowContext().getObjectRef(); + variables.addVariableDefinition(C_OBJECT, miscDataUtil.resolveObjectReference(objectRef, result)); + + ObjectReferenceType targetRef = wfTask.getWorkflowContext().getTargetRef(); // might be null + variables.addVariableDefinition(C_TARGET, miscDataUtil.resolveObjectReference(targetRef, result)); - ObjectDelta objectDelta = null; + ObjectDelta objectDelta = null; try { objectDelta = miscDataUtil.getFocusPrimaryDelta(execution.getVariables(), true); } catch (JAXBException e) { diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseAuditHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseAuditHelper.java index 56a76bbc0e7..8eab97d43bc 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseAuditHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseAuditHelper.java @@ -36,8 +36,10 @@ import com.evolveum.midpoint.wf.impl.jobs.WfTask; import com.evolveum.midpoint.wf.impl.messages.TaskEvent; import com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames; +import com.evolveum.midpoint.wf.impl.processes.common.LightweightObjectRef; import com.evolveum.midpoint.wf.impl.util.MiscDataUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.GenericObjectType; +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.WorkItemType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; @@ -103,8 +105,8 @@ public AuditEventRecord prepareWorkItemAuditRecord(TaskEvent taskEvent, AuditEve auditEventRecord.setEventStage(stage); Map variables = taskEvent.getVariables(); - String requesterOid = (String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_REQUESTER_OID); - if (requesterOid != null) { + LightweightObjectRef requesterRef = (LightweightObjectRef) variables.get(CommonProcessVariableNames.VARIABLE_REQUESTER_REF); + if (requesterRef != null) { try { auditEventRecord.setInitiator(miscDataUtil.getRequester(variables, result)); } catch (SchemaException e) { diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseExternalizationHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseExternalizationHelper.java index 4dc4b25070a..12081e02b29 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseExternalizationHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseExternalizationHelper.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.wf.impl.processes.ProcessInterfaceFinder; import com.evolveum.midpoint.wf.impl.processes.ProcessMidPointInterface; import com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ProcessInstanceState; import org.springframework.beans.factory.annotation.Autowired; @@ -55,9 +56,7 @@ public PrismObject externalizeState(Map va extState.setProcessInstanceName((String) variables.get(CommonProcessVariableNames.VARIABLE_PROCESS_INSTANCE_NAME)); extState.setStartTime(XmlTypeConverter.createXMLGregorianCalendar((Date) variables.get(CommonProcessVariableNames.VARIABLE_START_TIME))); extState.setShadowTaskOid((String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_TASK_OID)); - extState.setChangeProcessor((String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_CHANGE_PROCESSOR)); - extState.setRequesterOid((String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_REQUESTER_OID)); - extState.setObjectOid((String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_OBJECT_OID)); + extState.setChangeProcessor((String) variables.get(CommonProcessVariableNames.VARIABLE_CHANGE_PROCESSOR)); ProcessMidPointInterface processMidPointInterface = processInterfaceFinder.getProcessInterface(variables); extState.setAnswer(processMidPointInterface.getAnswer(variables)); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/scenarios/BaseGcpScenarioBean.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/scenarios/BaseGcpScenarioBean.java index 3611591222b..df868f03383 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/scenarios/BaseGcpScenarioBean.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/scenarios/BaseGcpScenarioBean.java @@ -87,7 +87,7 @@ public PrismObject externalizeWorkItemContents(Task @Override public ProcessSpecificState externalizeInstanceState(Map variables) throws SchemaException { - if (variables.containsKey(CommonProcessVariableNames.VARIABLE_MIDPOINT_PROCESS_INTERFACE_BEAN_NAME)) { + if (variables.containsKey(CommonProcessVariableNames.VARIABLE_PROCESS_INTERFACE_BEAN_NAME)) { return processInterfaceFinder.getProcessInterface(variables).externalizeProcessInstanceState(variables); } else { return null; 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 589628dd4a9..f17d40e81bd 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 @@ -76,7 +76,6 @@ public void setExecuteApprovedChangeImmediately(boolean executeApprovedChangeImm public void prepareCommonAttributes(PrimaryChangeAspect aspect, ModelContext modelContext, String objectOid, PrismObject requester) throws SchemaException { setRequesterOidAndRefInProcess(requester); - setObjectOidInProcess(objectOid); setExecuteApprovedChangeImmediately(ModelExecuteOptions.isExecuteImmediatelyAfterApproval(((LensContext) modelContext).getOptions())); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpExternalizationHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpExternalizationHelper.java index 9557cb91704..06dae2209c2 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpExternalizationHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpExternalizationHelper.java @@ -91,32 +91,8 @@ public PrismObject externalizeWorkItemContents(org.a PrismObject wicPrism = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(GeneralChangeApprovalWorkItemContents.class).instantiate(); GeneralChangeApprovalWorkItemContents wic = wicPrism.asObjectable(); - PrismObject objectBefore = pcpRepoAccessHelper.getObjectBefore(processInstanceVariables, prismContext, result); - if (objectBefore != null) { - wic.setObjectOld(objectBefore.asObjectable()); - if (objectBefore.getOid() != null) { - wic.setObjectOldRef(MiscSchemaUtil.createObjectReference(objectBefore.getOid(), SchemaConstants.C_OBJECT_TYPE)); // todo ...or will we determine real object type? - } - } - wic.setObjectDelta(miscDataUtil.getFocusPrimaryObjectDeltaType(processInstanceVariables, true)); - PrismObject objectAfter = pcpRepoAccessHelper.getObjectAfter(processInstanceVariables, wic.getObjectDelta(), objectBefore, prismContext, result); - if (objectAfter != null) { - wic.setObjectNew(objectAfter.asObjectable()); - if (objectAfter.getOid() != null) { - wic.setObjectNewRef(MiscSchemaUtil.createObjectReference(objectAfter.getOid(), SchemaConstants.C_OBJECT_TYPE)); // todo ...or will we determine real object type? - } - } - - PrismObject relatedObject = getRelatedObject(task, processInstanceVariables, result); - if (relatedObject != null) { - wic.setRelatedObject(relatedObject.asObjectable()); - if (relatedObject.getOid() != null) { - wic.setRelatedObjectRef(MiscSchemaUtil.createObjectReference(relatedObject.getOid(), SchemaConstants.C_OBJECT_TYPE)); // todo ...or will we determine real object type? - } - } - wic.setQuestionForm(asObjectable(getQuestionForm(task, processInstanceVariables, result))); return wicPrism; } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpRepoAccessHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpRepoAccessHelper.java index dae6521362d..92afabba7a9 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpRepoAccessHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpRepoAccessHelper.java @@ -67,59 +67,5 @@ public class PcpRepoAccessHelper { @Autowired private MiscDataUtil miscDataUtil; - public PrismObject getObjectBefore(Map variables, PrismContext prismContext, OperationResult result) throws SchemaException, ObjectNotFoundException, JAXBException { - String objectXml = (String) variables.get(PcpProcessVariableNames.VARIABLE_MIDPOINT_OBJECT_TO_BE_ADDED); - PrismObject object; - if (objectXml != null) { - object = prismContext.parseObject(objectXml, PrismContext.LANG_XML); - } else { - String oid = (String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_OBJECT_OID); - if (oid == null) { - return null; - } - //Validate.notNull(oid, "Object OID in process variables is null"); - object = repositoryService.getObject(ObjectType.class, oid, null, result); - } - - if (object.asObjectable() instanceof UserType) { - miscDataUtil.resolveAssignmentTargetReferences((PrismObject) object, result); - } - return object; - } - - public PrismObject getObjectAfter(Map variables, ObjectDeltaType deltaType, PrismObject objectBefore, PrismContext prismContext, OperationResult result) throws JAXBException, SchemaException { - - ObjectDelta delta; - if (deltaType != null) { - delta = DeltaConvertor.createObjectDelta(deltaType, prismContext); - } else { - delta = miscDataUtil.getFocusPrimaryDelta(variables, true); - } - - if (delta == null) { - return null; - } - - PrismObject objectAfter; - if (delta.isAdd()) { - if (delta.getObjectToAdd() != null) { - objectAfter = delta.getObjectToAdd().clone(); - } else { - return null; - } - } else if (delta.isModify()) { - objectAfter = objectBefore.clone(); - delta.applyTo(objectAfter); - } else if (delta.isDelete()) { - return null; - } else { - return null; // should not occur - } - - if (objectAfter.asObjectable() instanceof UserType) { // quite a hack - miscDataUtil.resolveAssignmentTargetReferences((PrismObject) objectAfter, result); - } - return objectAfter; - } } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/objects/AddObjectAspect.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/objects/AddObjectAspect.java index c9fb5b52340..226cd42047f 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/objects/AddObjectAspect.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/objects/AddObjectAspect.java @@ -139,7 +139,7 @@ private List prepareJobCreateInstructions(Mod return instructions; } - private ObjectDelta assignmentToDelta(ModelContext modelContext) { + private ObjectDelta assignmentToDelta(ModelContext modelContext) { return modelContext.getFocusContext().getPrimaryDelta(); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java index c981a92c9d3..886363cefa7 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java @@ -44,6 +44,7 @@ import com.evolveum.midpoint.wf.impl.WfConfiguration; import com.evolveum.midpoint.wf.impl.activiti.ActivitiEngine; import com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames; +import com.evolveum.midpoint.wf.impl.processes.common.LightweightObjectRef; import com.evolveum.midpoint.wf.impl.processes.common.StringHolder; import com.evolveum.midpoint.wf.impl.processors.primary.ObjectTreeDeltas; import com.evolveum.midpoint.wf.impl.processors.primary.PcpProcessVariableNames; @@ -131,28 +132,8 @@ public String getUserNameByOid(String oid, OperationResult result) { } public PrismObject getRequester(Map variables, OperationResult result) throws SchemaException, ObjectNotFoundException { - String oid = (String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_REQUESTER_OID); - return repositoryService.getObject(UserType.class, oid, null, result); - } - - public PrismObject getObjectBefore(Map variables, PrismContext prismContext, OperationResult result) throws SchemaException, ObjectNotFoundException, JAXBException { - String objectXml = (String) variables.get(PcpProcessVariableNames.VARIABLE_MIDPOINT_OBJECT_TO_BE_ADDED); - PrismObject object; - if (objectXml != null) { - object = prismContext.parseObject(objectXml, PrismContext.LANG_XML); - } else { - String oid = (String) variables.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_OBJECT_OID); - if (oid == null) { - return null; - } - //Validate.notNull(oid, "Object OID in process variables is null"); - object = repositoryService.getObject(ObjectType.class, oid, null, result); - } - - if (object.asObjectable() instanceof UserType) { - resolveAssignmentTargetReferences((PrismObject) object, result); - } - return object; + LightweightObjectRef ref = (LightweightObjectRef) variables.get(CommonProcessVariableNames.VARIABLE_REQUESTER_REF); + return repositoryService.getObject(UserType.class, ref.getOid(), null, result); } public ObjectTreeDeltas getObjectTreeDeltas(Map variables, boolean mayBeNull) throws JAXBException, SchemaException { @@ -185,28 +166,6 @@ public ObjectTreeDeltasType getObjectTreeDeltaType(Map variables deltasXml.getValue(), ObjectTreeDeltasType.COMPLEX_TYPE, PrismContext.LANG_XML); } - public PrismObject getObjectAfter(Map variables, ObjectDeltaType deltaType, PrismObject objectBefore, PrismContext prismContext, OperationResult result) throws JAXBException, SchemaException { - - ObjectDelta delta; - if (deltaType != null) { - delta = DeltaConvertor.createObjectDelta(deltaType, prismContext); - } else { - delta = getFocusPrimaryDelta(variables, true); - } - - if (delta == null) { - return null; - } - - PrismObject objectAfter = objectBefore.clone(); - delta.applyTo(objectAfter); - - if (objectAfter.asObjectable() instanceof UserType) { - resolveAssignmentTargetReferences((PrismObject) objectAfter, result); - } - return objectAfter; - } - public static String serializeObjectToXml(PrismObject object) { return serializeObjectToXml(object, object.getPrismContext()); } @@ -404,6 +363,12 @@ public List getGroupsForUser(String oid, OperationResult result) throws } public PrismObject resolveObjectReference(ObjectReferenceType ref, OperationResult result) { + if (ref == null) { + return null; + } + if (ref.asReferenceValue().getObject() != null) { + return ref.asReferenceValue().getObject(); + } try { return repositoryService.getObject((Class) prismContext.getSchemaRegistry().getCompileTimeClass(ref.getType()), ref.getOid(), null, result); } catch (ObjectNotFoundException e) {