diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/ModelContext.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/ModelContext.java index 606d5c52a02..a5486c33902 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/ModelContext.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/ModelContext.java @@ -21,6 +21,8 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.schema.ObjectTreeDeltas; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -109,4 +111,6 @@ default String dumpFocusPolicyRules(int indent) { Long getSequenceCounter(String sequenceOid); void setSequenceCounter(String sequenceOid, long counter); + + String getTaskTreeOid(Task task, OperationResult result); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java index 4fcbab38cf6..9b979a15def 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java @@ -218,6 +218,8 @@ public enum ExportType { @NotNull private transient final List operationApprovedBy = new ArrayList<>(); @NotNull private transient final List operationApproverComments = new ArrayList<>(); + private String taskTreeOid; + public LensContext(Class focusClass, PrismContext prismContext, ProvisioningService provisioningService) { Validate.notNull(prismContext, "No prismContext"); @@ -1725,4 +1727,11 @@ public boolean isExperimentalCodeEnabled() { return systemConfiguration != null && systemConfiguration.asObjectable().getInternals() != null && Boolean.TRUE.equals(systemConfiguration.asObjectable().getInternals().isEnableExperimentalCode()); } + + public String getTaskTreeOid(Task task, OperationResult result) throws SchemaException { + if (taskTreeOid == null) { + taskTreeOid = task.getTaskTreeId(result); + } + return taskTreeOid; + } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/OperationExecutionRecorder.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/OperationExecutionRecorder.java index 81c42589ffb..d1f3cafc615 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/OperationExecutionRecorder.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/OperationExecutionRecorder.java @@ -108,8 +108,7 @@ private boolean recordFocusOperationExecution(LensContext List> executedDeltas = getExecutedDeltas(focusContext, (Class) objectNew.asObjectable().getClass(), clockworkException, result); LOGGER.trace("recordFocusOperationExecution: executedDeltas: {}", executedDeltas.size()); - return recordOperationExecution(objectNew, false, executedDeltas, now, context.getChannel(), - getSkipWhenSuccess(context), task, result); + return recordOperationExecution(context, objectNew, false, executedDeltas, now, task, result); } @NotNull @@ -149,16 +148,14 @@ private void recordProjectionOperationExecution(LensConte } List> executedDeltas = getExecutedDeltas(projectionContext, ShadowType.class, clockworkException, result); - recordOperationExecution(object, true, executedDeltas, now, - context.getChannel(), getSkipWhenSuccess(context), task, result); + recordOperationExecution(context, object, true, executedDeltas, now, task, result); } /** * @return true if the operation execution was recorded (or would be recorded, but skipped because of the configuration) */ - private boolean recordOperationExecution(PrismObject object, boolean deletedOk, - List> executedDeltas, XMLGregorianCalendar now, - String channel, boolean skipWhenSuccess, Task task, OperationResult result) + private boolean recordOperationExecution(LensContext context, PrismObject object, boolean deletedOk, + List> executedDeltas, XMLGregorianCalendar now, Task task, OperationResult result) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException { OperationExecutionType operation = new OperationExecutionType(prismContext); OperationResult summaryResult = new OperationResult("recordOperationExecution"); @@ -176,10 +173,11 @@ private boolean recordOperationExecution(PrismObject o LOGGER.trace("recordOperationExecution: skipping because oid is null for object = {}", object); return false; } + createTaskRef(context, operation, task, result); summaryResult.computeStatus(); OperationResultStatusType overallStatus = summaryResult.getStatus().createStatusType(); - setOperationContext(operation, overallStatus, now, channel, task, result); - storeOperationExecution(object, oid, operation, deletedOk, skipWhenSuccess, result); + setOperationContext(operation, overallStatus, now, context.getChannel(), task); + storeOperationExecution(object, oid, operation, deletedOk, getSkipWhenSuccess(context), result); return true; } @@ -283,17 +281,31 @@ private void storeOperationExecution(@NotNull PrismObject } private void setOperationContext(OperationExecutionType operation, - OperationResultStatusType overallStatus, XMLGregorianCalendar now, String channel, Task task, OperationResult result) throws SchemaException { + OperationResultStatusType overallStatus, XMLGregorianCalendar now, String channel, Task task) { + + operation.setStatus(overallStatus); + operation.setInitiatorRef(ObjectTypeUtil.createObjectRef(task.getOwner(), prismContext)); // TODO what if the real initiator is different? (e.g. when executing approved changes) + operation.setChannel(channel); + operation.setTimestamp(now); + } + + private void createTaskRef(LensContext context, OperationExecutionType operation, Task task, OperationResult result) { if (task instanceof RunningTask && ((RunningTask) task).getParentForLightweightAsynchronousTask() != null) { task = ((RunningTask) task).getParentForLightweightAsynchronousTask(); } if (task.isPersistent()) { - operation.setTaskRef(ObjectTypeUtil.createObjectRef(task.getTaskTreeId(result), ObjectTypes.TASK)); + String taskOid; + try { + taskOid = context.getTaskTreeOid(task, result); + } catch (SchemaException e) { + //if something unexpeced happened, let's try current task oid + LOGGER.warn("Cannot get task tree oid, current task oid will be used, task: {}, \nreason: {}", task, e.getMessage(), e); + result.recordWarning("Cannot get task tree oid, current task oid will be used, task: " + task + "\nreason: " + e.getMessage(), e); + taskOid = task.getOid(); + } + + operation.setTaskRef(ObjectTypeUtil.createObjectRef(taskOid, ObjectTypes.TASK)); } - operation.setStatus(overallStatus); - operation.setInitiatorRef(ObjectTypeUtil.createObjectRef(task.getOwner(), prismContext)); // TODO what if the real initiator is different? (e.g. when executing approved changes) - operation.setChannel(channel); - operation.setTimestamp(now); } private ObjectDeltaOperationType createObjectDeltaOperation(LensObjectDeltaOperation deltaOperation) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java index 09870360fea..deef0e46b28 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java @@ -43,7 +43,7 @@ public void execute(@NotNull ModelContext context, Tas return; } - String id = task.getTaskTreeId(result); + String id = context.getTaskTreeOid(task, result); if (id == null) { LOGGER.trace("No persistent task context, no counting!"); return;