Skip to content

Commit

Permalink
Kill separate ActivityExecutionSpecifics hierarchy
Browse files Browse the repository at this point in the history
The idea of separation of generic activity framework code
from specific implementations using object composition
(via implementing xxxActivityExecutionSpecifics interfaces
in "small" classes) - in 63812e8 -
was most probably flawed.

So this commit returns to the original design of subclassing
xxxActivityExecution classes, with some differences:

1. The xxxActivityExecutionSpecifics interfaces remain there. They
indicate what methods should implementers provide to get the full
functionality.

2. The implementors are not allowed to override internal methods
in xxxActivityExecution classes. They are now either private or final.
(This should simplify the maintenance of the solution.)

3. ModelSearchBasedActivityExecution was removed. The required model-
level functionality is now provided by AdvancedActivityExecutionSupport
and its implementation residing in model-impl.
  • Loading branch information
mederly committed Sep 10, 2021
1 parent 85f0e0e commit 5395a18
Show file tree
Hide file tree
Showing 84 changed files with 1,011 additions and 1,051 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@

import com.evolveum.midpoint.model.api.ModelPublicConstants;
import com.evolveum.midpoint.model.impl.tasks.ModelActivityHandler;
import com.evolveum.midpoint.model.impl.tasks.ModelSearchBasedActivityExecution;
import com.evolveum.midpoint.model.impl.tasks.scanner.ScanActivityExecutionSpecifics;
import com.evolveum.midpoint.model.impl.tasks.scanner.ScanActivityExecution;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.repo.common.activity.ActivityExecutionException;
Expand All @@ -26,7 +25,6 @@
import com.evolveum.midpoint.repo.common.activity.execution.ExecutionInstantiationContext;
import com.evolveum.midpoint.repo.common.task.ActivityReportingOptions;
import com.evolveum.midpoint.repo.common.task.ItemProcessingRequest;
import com.evolveum.midpoint.repo.common.task.SearchBasedActivityExecution;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectQueryUtil;
import com.evolveum.midpoint.schema.util.task.work.LegacyWorkDefinitionSource;
Expand Down Expand Up @@ -66,7 +64,7 @@ public void unregister() {
public AbstractActivityExecution<MyWorkDefinition, ShadowRefreshActivityHandler, ?> createExecution(
@NotNull ExecutionInstantiationContext<MyWorkDefinition, ShadowRefreshActivityHandler> context,
@NotNull OperationResult result) {
return new ModelSearchBasedActivityExecution<>(context, "Shadow refresh", MyActivityExecutionSpecifics::new);
return new MyActivityExecution(context);
}

@Override
Expand All @@ -87,12 +85,11 @@ public String getDefaultArchetypeOid() {
return ARCHETYPE_OID;
}

public static class MyActivityExecutionSpecifics
extends ScanActivityExecutionSpecifics<ShadowType, MyWorkDefinition, ShadowRefreshActivityHandler> {
public static class MyActivityExecution
extends ScanActivityExecution<ShadowType, MyWorkDefinition, ShadowRefreshActivityHandler> {

MyActivityExecutionSpecifics(@NotNull SearchBasedActivityExecution<ShadowType, MyWorkDefinition,
ShadowRefreshActivityHandler, ?> activityExecution) {
super(activityExecution);
MyActivityExecution(@NotNull ExecutionInstantiationContext<MyWorkDefinition, ShadowRefreshActivityHandler> context) {
super(context, "Shadow refresh");
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import java.util.Map;
import javax.xml.namespace.QName;

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

import com.google.common.base.MoreObjects;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
Expand All @@ -18,10 +16,10 @@
import com.evolveum.midpoint.repo.common.activity.definition.AbstractWorkDefinition;
import com.evolveum.midpoint.repo.common.activity.definition.ObjectSetSpecificationProvider;
import com.evolveum.midpoint.repo.common.activity.definition.WorkDefinitionFactory;
import com.evolveum.midpoint.repo.common.activity.execution.ExecutionInstantiationContext;
import com.evolveum.midpoint.repo.common.task.ActivityReportingOptions;
import com.evolveum.midpoint.repo.common.task.ItemProcessingRequest;
import com.evolveum.midpoint.repo.common.task.SearchBasedActivityExecution;
import com.evolveum.midpoint.repo.common.task.SearchBasedActivityExecution.SearchBasedSpecificsSupplier;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand All @@ -36,10 +34,7 @@
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectIntegrityCheckWorkDefinitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSetType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

/**
* Task handler for "Object integrity check" task.
Expand Down Expand Up @@ -79,8 +74,8 @@ public class ObjectIntegrityCheckActivityHandler
}

@Override
protected @NotNull SearchBasedSpecificsSupplier<ObjectType, MyWorkDefinition, ObjectIntegrityCheckActivityHandler> getSpecificSupplier() {
return MyExecutionSpecifics::new;
protected @NotNull ExecutionSupplier<ObjectType, MyWorkDefinition, ObjectIntegrityCheckActivityHandler> getExecutionSupplier() {
return MyExecution::new;
}

@Override
Expand All @@ -103,14 +98,15 @@ public String getIdentifierPrefix() {
return "object-integrity-check";
}

static class MyExecutionSpecifics extends
BaseSearchBasedExecutionSpecificsImpl<ObjectType, MyWorkDefinition, ObjectIntegrityCheckActivityHandler> {
static class MyExecution extends
SearchBasedActivityExecution<ObjectType, MyWorkDefinition, ObjectIntegrityCheckActivityHandler, AbstractActivityWorkStateType> {

final ObjectStatistics objectStatistics = new ObjectStatistics();

MyExecutionSpecifics(
@NotNull SearchBasedActivityExecution<ObjectType, MyWorkDefinition, ObjectIntegrityCheckActivityHandler, ?> activityExecution) {
super(activityExecution);
MyExecution(
@NotNull ExecutionInstantiationContext<MyWorkDefinition, ObjectIntegrityCheckActivityHandler> context,
String shortName) {
super(context, shortName);
}

@Override
Expand All @@ -134,7 +130,7 @@ public boolean doesRequireDirectRepositoryAccess() {

@Override
public void beforeExecution(OperationResult result) {
activityExecution.ensureNoWorkerThreads();
ensureNoWorkerThreads();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
import java.util.*;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.model.impl.ModelBeans;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.Item;
Expand All @@ -26,7 +24,10 @@
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.repo.common.activity.ActivityExecutionException;
import com.evolveum.midpoint.repo.common.task.*;
import com.evolveum.midpoint.repo.common.activity.execution.ExecutionInstantiationContext;
import com.evolveum.midpoint.repo.common.task.ActivityReportingOptions;
import com.evolveum.midpoint.repo.common.task.ItemProcessingRequest;
import com.evolveum.midpoint.repo.common.task.SearchBasedActivityExecution;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.task.api.RunningTask;
Expand All @@ -41,19 +42,19 @@
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

public class ShadowIntegrityCheckActivityExecutionSpecifics
extends BaseSearchBasedExecutionSpecificsImpl
<ShadowType, ShadowIntegrityCheckWorkDefinition, ShadowIntegrityCheckActivityHandler> {
public class ShadowIntegrityCheckActivityExecution
extends SearchBasedActivityExecution
<ShadowType, ShadowIntegrityCheckWorkDefinition, ShadowIntegrityCheckActivityHandler, AbstractActivityWorkStateType> {

private ShadowCheckConfiguration configuration;
private WorkingState workingState;
private ShadowIntegrityCheckItemProcessor itemProcessor;

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

ShadowIntegrityCheckActivityExecutionSpecifics(@NotNull SearchBasedActivityExecution<ShadowType,
ShadowIntegrityCheckWorkDefinition, ShadowIntegrityCheckActivityHandler, ?> activityExecution) {
super(activityExecution);
ShadowIntegrityCheckActivityExecution(
@NotNull ExecutionInstantiationContext<ShadowIntegrityCheckWorkDefinition, ShadowIntegrityCheckActivityHandler> context) {
super(context, "Shadow integrity check");
}

@Override
Expand All @@ -70,9 +71,9 @@ public boolean doesRequireDirectRepositoryAccess() {
}

@Override
public void beforeExecution(OperationResult opResult)
public void beforeExecution(OperationResult result)
throws CommonException {
activityExecution.ensureNoWorkerThreads();
ensureNoWorkerThreads();

ExecutionModeType executionMode = getActivityDefinition().getExecutionMode();
configuration = new ShadowCheckConfiguration(LOGGER, getWorkDefinition(), executionMode);
Expand Down Expand Up @@ -101,11 +102,11 @@ private static class WorkingState {
}

@Override
public void afterExecution(OperationResult opResult) throws SchemaException {
public void afterExecution(OperationResult result) throws SchemaException {

String uniquenessReport;
if (configuration.checkUniqueness) {
uniquenessReport = reportOrFixUniqueness(opResult);
uniquenessReport = reportOrFixUniqueness(result);
} else {
uniquenessReport = null;
}
Expand Down Expand Up @@ -323,7 +324,7 @@ String skippedForDryRun() {
}
}

public void duplicateShadowDetected(String oid) {
void duplicateShadowDetected(String oid) {
workingState.duplicateShadowsDetected.add(oid);
}

Expand All @@ -334,8 +335,4 @@ public ObjectTypeContext getObjectTypeContext(ContextMapKey key) {
public void putObjectTypeContext(ContextMapKey key, ObjectTypeContext context) {
workingState.contextMap.put(key, context);
}

@NotNull ModelBeans getModelBeans() {
return getActivityHandler().getModelBeans();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import com.evolveum.midpoint.model.impl.tasks.ModelSearchBasedActivityExecution;

import com.evolveum.midpoint.repo.common.activity.execution.AbstractActivityExecution;

import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -61,7 +59,7 @@ public void unregister() {
public AbstractActivityExecution<ShadowIntegrityCheckWorkDefinition, ShadowIntegrityCheckActivityHandler, ?> createExecution(
@NotNull ExecutionInstantiationContext<ShadowIntegrityCheckWorkDefinition, ShadowIntegrityCheckActivityHandler> context,
@NotNull OperationResult result) {
return new ModelSearchBasedActivityExecution<>(context, "Shadow integrity check", ShadowIntegrityCheckActivityExecutionSpecifics::new);
return new ShadowIntegrityCheckActivityExecution(context);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import java.util.*;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.model.impl.ModelBeans;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition;
Expand Down Expand Up @@ -46,11 +48,11 @@ public class ShadowIntegrityCheckItemProcessor {

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

@NotNull private final ShadowIntegrityCheckActivityExecutionSpecifics executionSpecifics;
@NotNull private final ShadowIntegrityCheckActivityExecution activityExecution;
@NotNull private final PrismContext prismContext;

ShadowIntegrityCheckItemProcessor(@NotNull ShadowIntegrityCheckActivityExecutionSpecifics executionSpecifics) {
this.executionSpecifics = executionSpecifics;
ShadowIntegrityCheckItemProcessor(@NotNull ShadowIntegrityCheckActivityExecution activityExecution) {
this.activityExecution = activityExecution;
this.prismContext = PrismContext.get();
}

Expand Down Expand Up @@ -97,7 +99,7 @@ public boolean processObject(PrismObject<ShadowType> shadow,

private void checkShadow(ShadowCheckResult checkResult, PrismObject<ShadowType> shadow, Task workerTask, OperationResult result) throws SchemaException {

ShadowCheckConfiguration cfg = executionSpecifics.getConfiguration();
ShadowCheckConfiguration cfg = activityExecution.getConfiguration();

ShadowType shadowType = shadow.asObjectable();
ObjectReferenceType resourceRef = shadowType.getResourceRef();
Expand Down Expand Up @@ -162,7 +164,7 @@ private void checkShadow(ShadowCheckResult checkResult, PrismObject<ShadowType>
}

if (cfg.checkOwners) {
List<PrismObject<FocusType>> owners = executionSpecifics.searchOwners(shadow, result);
List<PrismObject<FocusType>> owners = activityExecution.searchOwners(shadow, result);
if (owners != null) {
shadow.setUserData(KEY_OWNERS, owners);
if (owners.size() > 1) {
Expand Down Expand Up @@ -194,7 +196,7 @@ private void checkShadow(ShadowCheckResult checkResult, PrismObject<ShadowType>
}

ContextMapKey key = new ContextMapKey(resourceOid, objectClassName);
ObjectTypeContext context = executionSpecifics.getObjectTypeContext(key);
ObjectTypeContext context = activityExecution.getObjectTypeContext(key);
if (context == null) {
context = new ObjectTypeContext();
context.setResource(resource);
Expand All @@ -216,7 +218,7 @@ private void checkShadow(ShadowCheckResult checkResult, PrismObject<ShadowType>
checkResult.recordError(ShadowStatistics.NO_OBJECT_CLASS_REFINED_SCHEMA, new SchemaException("No refined object class definition for kind=" + kind + ", intent=" + intent));
return;
}
executionSpecifics.putObjectTypeContext(key, context);
activityExecution.putObjectTypeContext(key, context);
}

try {
Expand Down Expand Up @@ -271,11 +273,11 @@ private void checkShadow(ShadowCheckResult checkResult, PrismObject<ShadowType>
}

private void cacheResource(PrismObject<ResourceType> resource) {
executionSpecifics.cacheResource(resource);
activityExecution.cacheResource(resource);
}

private PrismObject<ResourceType> getCachedResource(String resourceOid) {
return executionSpecifics.getCachedResource(resourceOid);
return activityExecution.getCachedResource(resourceOid);
}

private void applyFixes(ShadowCheckResult checkResult, PrismObject<ShadowType> shadow, Task workerTask,
Expand Down Expand Up @@ -348,7 +350,7 @@ private void doFixIntent(ShadowCheckResult checkResult, PrismObject<ShadowType>
}

private void applyFix(ShadowCheckResult checkResult, PrismObject<ShadowType> shadow, Task workerTask, OperationResult result) throws CommonException {
LOGGER.info("Applying shadow fix{}:\n{}", executionSpecifics.skippedForDryRun(),
LOGGER.info("Applying shadow fix{}:\n{}", activityExecution.skippedForDryRun(),
checkResult.isFixByRemovingShadow() ?
"DELETE " + ObjectTypeUtil.toShortString(shadow)
: DebugUtil.debugDump(checkResult.getFixDeltas()));
Expand All @@ -375,7 +377,7 @@ private void doCheckNormalization(ShadowCheckResult checkResult, RefinedAttribut

MatchingRule<Object> matchingRule;
try {
matchingRule = executionSpecifics.getBeans().matchingRuleRegistry
matchingRule = activityExecution.getBeans().matchingRuleRegistry
.getMatchingRule(matchingRuleQName, identifier.getTypeName());
} catch (SchemaException e) {
checkResult.recordError(
Expand Down Expand Up @@ -421,7 +423,7 @@ private void addIdentifierValue(ObjectTypeContext context, QName identifierName,
valueMap.put(identifierValue, existingShadowOids);
} else {
// duplicate shadows statistics are collected in a special way
executionSpecifics.duplicateShadowDetected(shadow.getOid());
activityExecution.duplicateShadowDetected(shadow.getOid());
LOGGER.error("Multiple shadows with the value of identifier attribute {} = {}: existing one(s): {}, duplicate: {}",
identifierName, identifierValue, existingShadowOids, ObjectTypeUtil.toShortString(shadow.asObjectable()));
existingShadowOids.add(shadow.getOid());
Expand Down Expand Up @@ -462,22 +464,26 @@ private void checkOrFixActivationItem(ShadowCheckResult checkResult, PrismObject
}

private ShadowCheckConfiguration getConfiguration() {
return executionSpecifics.getConfiguration();
return activityExecution.getConfiguration();
}

private ShadowStatistics getStats() {
return executionSpecifics.getStatistics();
return activityExecution.getStatistics();
}

private ProvisioningService getProvisioningService() {
return executionSpecifics.getModelBeans().provisioningService;
return getModelBeans().provisioningService;
}

private RepositoryService getRepositoryService() {
return executionSpecifics.getModelBeans().cacheRepositoryService;
return getModelBeans().cacheRepositoryService;
}

private SynchronizationService getSynchronizationService() {
return executionSpecifics.getModelBeans().synchronizationService;
return getModelBeans().synchronizationService;
}

private @NotNull ModelBeans getModelBeans() {
return activityExecution.getActivityHandler().getModelBeans();
}
}

0 comments on commit 5395a18

Please sign in to comment.