Skip to content

Commit

Permalink
Set task.objectRef where it's missing
Browse files Browse the repository at this point in the history
This is to enable e.g. displaying tasks related to a specific resource.
(Note, though, that the value is set only after the activity starts.)

Should resolve MID-7256.
  • Loading branch information
mederly committed Oct 1, 2021
1 parent c807d94 commit 0bf0626
Show file tree
Hide file tree
Showing 17 changed files with 151 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,10 @@ public static ObjectReferenceType createObjectRefWithFullObject(ObjectType objec
return createObjectRefWithFullObject(objectType.asPrismObject(), prismContext);
}

public static ObjectReferenceType createObjectRef(ObjectType object) {
return createObjectRef(object, PrismContext.get());
}

public static ObjectReferenceType createObjectRef(ObjectType object, PrismContext prismContext) {
if (object == null) {
return null;
Expand Down Expand Up @@ -311,6 +315,10 @@ public static ObjectReferenceType createObjectRef(ObjectType objectType, QName r
return createObjectRef(objectType.asPrismObject(), relation);
}

public static ObjectReferenceType createObjectRef(PrismObject<?> object) {
return createObjectRef(object, PrismContext.get());
}

public static ObjectReferenceType createObjectRef(PrismObject<?> object, PrismContext prismContext) {
if (object == null) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@

import javax.xml.namespace.QName;

import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand Down Expand Up @@ -66,6 +69,10 @@ public String toString() {
return resource;
}

public @NotNull ObjectReferenceType getResourceRef() {
return ObjectTypeUtil.createObjectRef(resource);
}

public @NotNull RefinedResourceSchema getRefinedResourceSchema() {
return refinedResourceSchema;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

package com.evolveum.midpoint.model.impl.sync.tasks.async;

import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.model.impl.ModelBeans;
Expand All @@ -25,10 +27,6 @@
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.RunningTask;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractActivityWorkStateType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivityItemCountingOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivityOverallItemCountingOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectSetType;

public class AsyncUpdateActivityExecution
extends PlainIterativeActivityExecution
Expand Down Expand Up @@ -65,6 +63,11 @@ public void beforeExecution(OperationResult result) throws ActivityExecutionExce
objectClassSpecification.checkNotInMaintenance();
}

@Override
protected @NotNull ObjectReferenceType getDesiredTaskObjectRef() {
return objectClassSpecification.getResourceRef();
}

@Override
public void iterateOverItemsInBucket(OperationResult opResult)
throws CommunicationException, ObjectNotFoundException, SchemaException,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

import com.evolveum.midpoint.repo.common.task.SearchBasedActivityExecution;

import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.model.impl.ModelBeans;
Expand All @@ -30,10 +32,6 @@
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.RunningTask;
import com.evolveum.midpoint.util.exception.CommonException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractActivityWorkStateType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FetchErrorReportingMethodType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectSetType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;

public class ImportActivityExecution
extends SearchBasedActivityExecution<ShadowType, ImportWorkDefinition, ImportActivityHandler, AbstractActivityWorkStateType> {
Expand Down Expand Up @@ -65,6 +63,11 @@ public void beforeExecution(OperationResult result) throws ActivityExecutionExce
resourceObjectClassSpecification.checkNotInMaintenance();
}

@Override
protected @NotNull ObjectReferenceType getDesiredTaskObjectRef() {
return resourceObjectClassSpecification.getResourceRef();
}

private Synchronizer createSynchronizer() {
return new Synchronizer(
resourceObjectClassSpecification.getResource(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

import com.evolveum.midpoint.repo.common.task.SearchBasedActivityExecution;

import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.model.impl.ModelBeans;
Expand Down Expand Up @@ -58,6 +60,11 @@ public void beforeExecution(OperationResult result) throws CommonException, Acti
setContextDescription(getShortName() + " on " + objectClassSpec.getContextDescription()); // TODO?
}

@Override
protected @NotNull ObjectReferenceType getDesiredTaskObjectRef() {
return objectClassSpec.getResourceRef();
}

protected @NotNull ResourceObjectSetType getResourceObjectSet() {
return getWorkDefinition().getResourceObjectSetSpecification();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,11 @@ public void beforeExecution(OperationResult result) throws ActivityExecutionExce
objectClassSpecification.checkNotInMaintenance();
}

@Override
protected @NotNull ObjectReferenceType getDesiredTaskObjectRef() {
return objectClassSpecification.getResourceRef();
}

@Override
public void afterExecution(OperationResult result) throws SchemaException {
int itemsProcessed = transientExecutionStatistics.getItemsProcessed();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ public void beforeExecution(OperationResult result) throws ActivityExecutionExce
resourceObjectClassSpecification.checkResourceUp();
}

@Override
protected @NotNull ObjectReferenceType getDesiredTaskObjectRef() {
return resourceObjectClassSpecification.getResourceRef();
}

@Override
public ObjectQuery customizeQuery(ObjectQuery configuredQuery, OperationResult result) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class DummyInterruptedSyncResource extends AbstractResourceDummyInterrupt
private static final File TEST_DIR = new File("src/test/resources/tasks/livesync"); // TODO

private static final File FILE = new File(TEST_DIR, "resource-dummy-interrupted-sync.xml");
private static final String OID = "7a58233a-1cfb-46d1-a404-08cdf4626ebb";
static final String OID = "7a58233a-1cfb-46d1-a404-08cdf4626ebb";
private static final String NAME = "interruptedSync";

public static DummyInterruptedSyncResource create(DummyResourceCollection collection, Task task, OperationResult result)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,9 @@ public void test100SuspendWhileIcfSync() throws Exception {
Task taskAfter = taskManager.getTaskWithResult(TASK_SLOW_RESOURCE.oid, result);
displayTaskWithOperationStats("Task after", taskAfter);
assertEquals("Wrong token value", (Integer) 0, getIntToken(taskAfter));
assertThat(taskAfter.getObjectOid())
.as("object OID")
.isEqualTo(DummyInterruptedSyncResource.OID);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,11 @@ public void beforeExecution(OperationResult result) throws ActivityExecutionExce
controller.beforeBucketExecution(1, result);
}

@Override
protected @NotNull ObjectReferenceType getDesiredTaskObjectRef() {
return support.getReportRef();
}

@Override
public @Nullable Integer determineOverallSize(OperationResult result) throws CommonException {
return support.countRecords(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,11 @@ public void beforeExecution(OperationResult result) throws ActivityExecutionExce
}
}

@Override
protected @NotNull ObjectReferenceType getDesiredTaskObjectRef() {
return support.getReportRef();
}

@Override
public Integer determineOverallSize(OperationResult result) throws CommonException {
int expectedTotal = support.getDashboard().getWidget().size();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,7 @@
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;

import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractActivityWorkStateType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivityItemCountingOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivityOverallItemCountingOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

Expand Down Expand Up @@ -89,6 +86,11 @@ public void beforeExecution(OperationResult result) throws CommonException, Acti
}
}

@Override
protected @NotNull ObjectReferenceType getDesiredTaskObjectRef() {
return support.getReportRef();
}

@Override
public @Nullable Integer determineOverallSize(OperationResult result) throws CommonException {
return variables.size();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

package com.evolveum.midpoint.report.impl.activity;

import com.evolveum.midpoint.audit.api.AuditService;
import com.evolveum.midpoint.model.api.ModelAuditService;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
Expand All @@ -17,12 +16,14 @@
import com.evolveum.midpoint.repo.common.task.CommonTaskBeans;
import com.evolveum.midpoint.report.impl.ReportServiceImpl;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.task.api.RunningTask;
import com.evolveum.midpoint.util.MiscUtil;
import com.evolveum.midpoint.util.exception.CommonException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType;

Expand Down Expand Up @@ -86,6 +87,13 @@ private void setupReportObject(OperationResult result) throws CommonException {
return requireNonNull(report);
}

/**
* Should be called only after initialization.
*/
public @NotNull ObjectReferenceType getReportRef() {
return ObjectTypeUtil.createObjectRef(getReport());
}

public ReportParameterType getReportParameters() {
return workDefinition.getReportParams();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ private void initializeController(OperationResult result) throws CommonException
// }
}

@Override
protected @NotNull ObjectReferenceType getDesiredTaskObjectRef() {
return support.getReportRef();
}

private void initializeAuditReportBucketing(OperationResult result)
throws SchemaException, ObjectNotFoundException {
ObjectFilter filter = masterSearchSpecification.getQuery().getFilter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@
import java.util.List;

import com.evolveum.midpoint.repo.common.activity.execution.ExecutionInstantiationContext;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractActivityWorkStateType;

import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.PrismContext;
Expand Down Expand Up @@ -61,6 +64,11 @@ public void beforeExecution(OperationResult result) throws CommonException {
setContextDescription("to " + resource);
}

@Override
protected @NotNull ObjectReferenceType getDesiredTaskObjectRef() {
return ObjectTypeUtil.createObjectRef(resource);
}

@Override
@NotNull
public SearchSpecification<ShadowType> createCustomSearchSpecification(OperationResult result) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,22 @@
import com.evolveum.midpoint.repo.common.activity.definition.WorkDefinition;
import com.evolveum.midpoint.repo.common.activity.handlers.ActivityHandler;
import com.evolveum.midpoint.repo.common.activity.state.ActivityState;
import com.evolveum.midpoint.repo.common.task.IterativeActivityExecutionSpecifics;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.util.exception.CommonException;
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.task.api.RunningTask;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.annotation.Experimental;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractActivityWorkStateType;

import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.xml.datatype.XMLGregorianCalendar;

Expand All @@ -44,6 +49,8 @@ public abstract class LocalActivityExecution<
AH extends ActivityHandler<WD, AH>,
BS extends AbstractActivityWorkStateType> extends AbstractActivityExecution<WD, AH, BS> {

private static final Trace LOGGER = TraceManager.getTrace(LocalActivityExecution.class);

private static final long DEFAULT_TREE_PROGRESS_UPDATE_INTERVAL_FOR_STANDALONE = 9000;
private static final long DEFAULT_TREE_PROGRESS_UPDATE_INTERVAL_FOR_WORKERS = 60000;

Expand Down Expand Up @@ -194,4 +201,53 @@ public void setCurrentResultStatus(@NotNull OperationResultStatus currentResultS
public boolean isExcludedFromStalenessChecking() {
return false;
}

/**
* Updates task objectRef. This is e.g. to allow displaying of all tasks related to given resource.
* Conditions:
*
* 1. task.objectRef has no value yet,
* 2. the value provided by {@link #getDesiredTaskObjectRef()} is non-null.
*
* The method does this recursively towards the root of the task tree.
*/
@Experimental
protected final void setTaskObjectRef(OperationResult result) throws CommonException {
RunningTask task = getRunningTask();
if (task.getObjectOid() != null) {
LOGGER.trace("Task.objectRef is already set for the current task. We assume it is also set for parent tasks.");
return;
}

ObjectReferenceType desiredObjectRef = getDesiredTaskObjectRef();
LOGGER.trace("Desired task object ref: {}", desiredObjectRef);
if (desiredObjectRef == null) {
return;
}
setObjectRefRecursivelyUpwards(task, desiredObjectRef, result);
}

/**
* Returns the value that should be put into task.objectRef.
*
* Should be overridden by subclasses.
*
* It should be called _after_ {@link IterativeActivityExecutionSpecifics#beforeExecution(OperationResult)} method,
* in order to give the execution a chance to prepare data for this method.
*/
protected @Nullable ObjectReferenceType getDesiredTaskObjectRef() {
return null; // By default, we don't try to set up that item.
}

/** Sets objectRef on the given task and its ancestors (if not already set). */
private void setObjectRefRecursivelyUpwards(@NotNull Task task, @NotNull ObjectReferenceType desiredObjectRef,
@NotNull OperationResult result)
throws CommonException {
task.setObjectRef(desiredObjectRef);
task.flushPendingModifications(result);
Task parent = task.getParentTask(result);
if (parent != null && parent.getObjectOid() != null) {
setObjectRefRecursivelyUpwards(parent, desiredObjectRef, result);
}
}
}

0 comments on commit 0bf0626

Please sign in to comment.