Skip to content

Commit

Permalink
Loose model-impl/cases-impl dependency
Browse files Browse the repository at this point in the history
The model-impl was made dependent on cases-impl by autowiring
CaseManager in CorrelationCaseEngineExtension, in order to register
the extension in the manager.

This commit relaxes the dependency by changing the registration
mechanism: it is now done by Spring autowiring, so the extension
can be present even if the CaseManager is not. In such situations,
cases will be created but will not be processed by the case engine.
  • Loading branch information
mederly committed Feb 21, 2022
1 parent 407e5ff commit 1df262a
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

package com.evolveum.midpoint.cases.api;

import com.evolveum.midpoint.cases.api.extensions.EngineExtension;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.WorkItemId;
import com.evolveum.midpoint.task.api.RunningTask;
Expand Down Expand Up @@ -125,7 +124,4 @@ boolean isCurrentUserAuthorizedToDelegate(CaseWorkItemType workItem, Task task,

// TODO decide on the fate of this method
PerformerCommentsFormatter createPerformerCommentsFormatter(PerformerCommentsFormattingType formatting);

// TODO
void registerEngineExtension(@NotNull String archetypeOid, @NotNull EngineExtension extension);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@

package com.evolveum.midpoint.cases.api.extensions;

import com.evolveum.midpoint.audit.api.AuditEventRecord;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.cases.api.CaseEngineOperation;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.exception.*;

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

import org.jetbrains.annotations.NotNull;
import java.util.Collection;

/**
* Provides functionality that the case engine calls when dealing with specific case archetypes (like approval cases, etc).
Expand All @@ -23,6 +23,11 @@
*/
public interface EngineExtension {

/**
* Returns the case archetype OID(s) this extension handles.
*/
@NotNull Collection<String> getArchetypeOids();

/**
* Called to finish case closing procedure. E.g. for approvals we may submit execution task here.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@

import javax.annotation.PostConstruct;

import com.evolveum.midpoint.cases.api.extensions.EngineExtension;

import com.evolveum.midpoint.cases.impl.engine.CaseEngineImpl;

import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -192,9 +190,4 @@ public boolean isCurrentUserAuthorizedToDelegate(CaseWorkItemType workItem, Task
public PerformerCommentsFormatter createPerformerCommentsFormatter(PerformerCommentsFormattingType formatting) {
return new PerformerCommentsFormatterImpl(formatting, repositoryService, expressionEvaluationHelper);
}

@Override
public void registerEngineExtension(@NotNull String archetypeOid, @NotNull EngineExtension extension) {
caseEngine.registerEngineExtension(archetypeOid, extension);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@

package com.evolveum.midpoint.cases.impl.engine;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

Expand Down Expand Up @@ -107,8 +106,7 @@ public class CaseEngineImpl implements CaseCreationListener, CaseEngine {
@Autowired public AuthorizationHelper authorizationHelper;
@Autowired private CaseEventDispatcher caseEventDispatcher;
@Autowired private ArchetypeManager archetypeManager;

@NotNull private final Map<String, EngineExtension> engineExtensionMap = new HashMap<>();
@Autowired private List<EngineExtension> engineExtensions;

@PostConstruct
public void init() {
Expand Down Expand Up @@ -180,15 +178,21 @@ private CaseEngineOperationImpl createOperation(String caseOid, Task task, Opera
String archetypeOid = getCaseArchetypeOid(aCase, result);
LOGGER.trace("Going to determine engine extension for {}, archetype: {}", aCase, archetypeOid);
if (archetypeOid != null) {
EngineExtension fromMap = engineExtensionMap.get(archetypeOid);
LOGGER.trace("Information from the map of registered extensions: {}", fromMap);
if (fromMap != null) {
return fromMap;
Optional<EngineExtension> found = findRegisteredExtension(archetypeOid);
LOGGER.trace("Information from the collection of registered extensions: {}", found);
if (found.isPresent()) {
return found.get();
}
}
return new DefaultEngineExtension();
}

private Optional<EngineExtension> findRegisteredExtension(@NotNull String archetypeOid) {
return engineExtensions.stream()
.filter(e -> e.getArchetypeOids().contains(archetypeOid))
.findFirst();
}

private String getCaseArchetypeOid(@NotNull PrismObject<CaseType> aCase, OperationResult result) throws SchemaException {
PrismObject<ArchetypeType> structuralArchetype = archetypeManager.determineStructuralArchetype(aCase, result);
if (structuralArchetype != null) {
Expand Down Expand Up @@ -223,8 +227,4 @@ public void onCaseCreation(CaseType aCase, Task task, OperationResult result) {
throw new SystemException("Couldn't open the case: " + aCase, e);
}
}

public void registerEngineExtension(String archetypeOid, EngineExtension extension) {
engineExtensionMap.put(archetypeOid, extension);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;

import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
Expand All @@ -39,6 +41,11 @@ public class DefaultEngineExtension implements EngineExtension {

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

@Override
public @NotNull Collection<String> getArchetypeOids() {
return List.of(); // This extension is applied "manually" after no suitable extension is found.
}

@Override
public void finishCaseClosing(@NotNull CaseEngineOperation operation, @NotNull OperationResult result)
throws SchemaException, ObjectAlreadyExistsException, ObjectNotFoundException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,40 +7,34 @@

package com.evolveum.midpoint.model.impl.correlator.extension;

import com.evolveum.midpoint.cases.api.CaseManager;
import com.evolveum.midpoint.model.impl.correlator.CorrelationCaseManager;

import com.evolveum.midpoint.util.exception.*;

import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkItemOutputType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkItemType;

import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.cases.api.CaseEngineOperation;
import com.evolveum.midpoint.cases.api.extensions.*;
import com.evolveum.midpoint.model.impl.correlator.CorrelationCaseManager;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkItemOutputType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkItemType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType;

@Component
public class CorrelationCaseEngineExtension implements EngineExtension {

@Autowired private CaseManager caseManager;
@Autowired private CorrelationCaseManager correlationCaseManager;

@PostConstruct
public void init() {
caseManager.registerEngineExtension(SystemObjectsType.ARCHETYPE_CORRELATION_CASE.value(), this);
@Override
public @NotNull Collection<String> getArchetypeOids() {
return List.of(SystemObjectsType.ARCHETYPE_CORRELATION_CASE.value());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,15 @@

package com.evolveum.midpoint.wf.impl;

import javax.annotation.PostConstruct;

import com.evolveum.midpoint.cases.api.extensions.*;
import com.evolveum.midpoint.wf.impl.processors.primary.cases.WorkItemCompletion;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType;
import java.util.Collection;
import java.util.List;

import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.cases.api.CaseEngineOperation;
import com.evolveum.midpoint.cases.api.CaseManager;
import com.evolveum.midpoint.cases.api.extensions.*;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.cases.ApprovalContextUtil;
import com.evolveum.midpoint.util.exception.*;
Expand All @@ -27,7 +24,9 @@
import com.evolveum.midpoint.wf.impl.processors.primary.PrimaryChangeProcessor;
import com.evolveum.midpoint.wf.impl.processors.primary.cases.CaseStageClosing;
import com.evolveum.midpoint.wf.impl.processors.primary.cases.CaseStageOpening;
import com.evolveum.midpoint.wf.impl.processors.primary.cases.WorkItemCompletion;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ApprovalContextType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType;

@Component
Expand All @@ -36,13 +35,12 @@ public class ApprovalsCaseEngineExtension implements EngineExtension {
private static final Trace LOGGER = TraceManager.getTrace(ApprovalsCaseEngineExtension.class);

@Autowired private ApprovalBeans beans;
@Autowired private CaseManager caseManager;
@Autowired private PrimaryChangeProcessor primaryChangeProcessor;
@Autowired private ApprovalsAuditingExtension auditingExtension;

@PostConstruct
public void init() {
caseManager.registerEngineExtension(SystemObjectsType.ARCHETYPE_APPROVAL_CASE.value(), this);
@Override
public @NotNull Collection<String> getArchetypeOids() {
return List.of(SystemObjectsType.ARCHETYPE_APPROVAL_CASE.value());
}

@Override
Expand Down

0 comments on commit 1df262a

Please sign in to comment.