Skip to content

Commit

Permalink
code cleanup around AssignmentPathSegmentImpl and AssignmentCollector
Browse files Browse the repository at this point in the history
  • Loading branch information
virgo47 committed Dec 6, 2022
1 parent e471951 commit 3de5b3b
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ private EvaluatedPolicyRule evaluatePolicyRule(
.source(collection.asObjectable())
.sourceDescription("object collection " + collection)
.assignment(assignmentType)
.isAssignment(true)
.isAssignment()
.evaluationOrder(EvaluationOrderImpl.zero(relationRegistry))
.evaluationOrderForTarget(EvaluationOrderImpl.zero(relationRegistry))
.direct(true) // to be reconsidered - but assignment path is empty, so we consider this to be directly assigned
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2018 Evolveum and contributors
* Copyright (C) 2010-2022 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
Expand All @@ -14,9 +14,6 @@
import java.util.Collection;
import java.util.List;

import com.evolveum.midpoint.model.impl.ModelBeans;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LifecycleStateModelType;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
Expand All @@ -26,8 +23,8 @@
import com.evolveum.midpoint.model.api.context.EvaluatedAssignment;
import com.evolveum.midpoint.model.api.util.ReferenceResolver;
import com.evolveum.midpoint.model.common.archetypes.ArchetypeManager;
import com.evolveum.midpoint.repo.common.SystemObjectCache;
import com.evolveum.midpoint.model.common.mapping.MappingFactory;
import com.evolveum.midpoint.model.impl.ModelBeans;
import com.evolveum.midpoint.model.impl.lens.assignments.AssignmentEvaluator;
import com.evolveum.midpoint.model.impl.lens.projector.AssignmentOrigin;
import com.evolveum.midpoint.model.impl.lens.projector.loader.ContextLoader;
Expand All @@ -41,6 +38,7 @@
import com.evolveum.midpoint.prism.util.ObjectDeltaObject;
import com.evolveum.midpoint.repo.cache.RepositoryCache;
import com.evolveum.midpoint.repo.common.ObjectResolver;
import com.evolveum.midpoint.repo.common.SystemObjectCache;
import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.cache.CacheConfigurationManager;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand All @@ -52,6 +50,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.ArchetypePolicyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LifecycleStateModelType;

/**
* @author katka
Expand Down Expand Up @@ -84,7 +83,8 @@ public <AH extends AssignmentHolderType> Collection<EvaluatedAssignment> collect

Collection<EvaluatedAssignment> evaluatedAssignments = new ArrayList<>();

Collection<AssignmentType> forcedAssignments = collectForcedAssignments(focusBean, lensContext.getFocusContext().getLifecycleModel(), task, result);
Collection<AssignmentType> forcedAssignments = collectForcedAssignments(
focusBean, lensContext.getFocusContext().getLifecycleModel(), task, result);
if (!focusBean.getAssignment().isEmpty() || forcedAssignments != null) {
AssignmentEvaluator.Builder<AH> builder =
new AssignmentEvaluator.Builder<AH>()
Expand Down Expand Up @@ -122,27 +122,30 @@ public <AH extends AssignmentHolderType> Collection<EvaluatedAssignment> collect
return evaluatedAssignments;
}

private <AH extends AssignmentHolderType> Collection<EvaluatedAssignment> evaluateAssignments(AH focus,
Collection<AssignmentType> assignments, AssignmentOrigin origin, AssignmentEvaluator<AH> assignmentEvaluator, Task task, OperationResult result) {
private <AH extends AssignmentHolderType> Collection<EvaluatedAssignment> evaluateAssignments(
AH focus, Collection<AssignmentType> assignments, AssignmentOrigin origin,
AssignmentEvaluator<AH> assignmentEvaluator, Task task, OperationResult result) {

List<EvaluatedAssignment> evaluatedAssignments = new ArrayList<>();
RepositoryCache.enterLocalCaches(cacheConfigurationManager);
try {
PrismContainerDefinition<AssignmentType> standardAssignmentDefinition = prismContext.getSchemaRegistry()
.findObjectDefinitionByCompileTimeClass(AssignmentHolderType.class)
.findContainerDefinition(AssignmentHolderType.F_ASSIGNMENT);
for (AssignmentType assignmentType : emptyIfNull(assignments)) {
for (AssignmentType assignment : emptyIfNull(assignments)) {
try {
//noinspection unchecked
PrismContainerDefinition<AssignmentType> definition = defaultIfNull(
assignmentType.asPrismContainerValue().getDefinition(), standardAssignmentDefinition);
assignment.asPrismContainerValue().getDefinition(), standardAssignmentDefinition);
ItemDeltaItem<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> assignmentIdi =
new ItemDeltaItem<>(LensUtil.createAssignmentSingleValueContainer(assignmentType), definition);
EvaluatedAssignment assignment = assignmentEvaluator.evaluate(assignmentIdi, PlusMinusZero.ZERO, false, focus, focus.toString(), origin, task, result);
evaluatedAssignments.add(assignment);
} catch (SchemaException | ObjectNotFoundException | ExpressionEvaluationException | PolicyViolationException | SecurityViolationException | ConfigurationException | CommunicationException e) {
new ItemDeltaItem<>(LensUtil.createAssignmentSingleValueContainer(assignment), definition);
EvaluatedAssignment evaluatedAssignment = assignmentEvaluator.evaluate(
assignmentIdi, PlusMinusZero.ZERO, false, focus, focus.toString(), origin, task, result);
evaluatedAssignments.add(evaluatedAssignment);
} catch (SchemaException | ObjectNotFoundException | ExpressionEvaluationException | PolicyViolationException
| SecurityViolationException | ConfigurationException | CommunicationException e) {
LOGGER.error("Error while processing assignment of {}: {}; assignment: {}",
focus, e.getMessage(), assignmentType, e);
focus, e.getMessage(), assignment, e);
}
}
} finally {
Expand All @@ -151,14 +154,16 @@ private <AH extends AssignmentHolderType> Collection<EvaluatedAssignment> evalua
return evaluatedAssignments;
}

private <AH extends AssignmentHolderType> LensContext<AH> createAuthenticationLensContext(PrismObject<AH> user, OperationResult result) throws SchemaException {
private <AH extends AssignmentHolderType> LensContext<AH> createAuthenticationLensContext(
PrismObject<AH> user, OperationResult result) throws SchemaException {
LensContext<AH> lensContext = new LensContextPlaceholder<>(user);
ArchetypePolicyType policyConfigurationType = determineObjectPolicyConfiguration(user, result);
lensContext.getFocusContext().setArchetypePolicy(policyConfigurationType);
return lensContext;
}

private <AH extends AssignmentHolderType> Collection<AssignmentType> collectForcedAssignments(AH focusBean, LifecycleStateModelType lifecycleModel, Task task, OperationResult result) {
private <AH extends AssignmentHolderType> Collection<AssignmentType> collectForcedAssignments(
AH focusBean, LifecycleStateModelType lifecycleModel, Task task, OperationResult result) {
try {
return LensUtil.getForcedAssignments(lifecycleModel,
focusBean.getLifecycleState(), objectResolver, prismContext, task, result);
Expand All @@ -169,7 +174,8 @@ private <AH extends AssignmentHolderType> Collection<AssignmentType> collectForc
}
}

private <AH extends AssignmentHolderType> ArchetypePolicyType determineObjectPolicyConfiguration(PrismObject<AH> user, OperationResult result) throws SchemaException {
private <AH extends AssignmentHolderType> ArchetypePolicyType determineObjectPolicyConfiguration(
PrismObject<AH> user, OperationResult result) throws SchemaException {
ArchetypePolicyType archetypePolicy;
try {
archetypePolicy = archetypeManager.determineArchetypePolicy(user, result);
Expand All @@ -178,7 +184,9 @@ private <AH extends AssignmentHolderType> ArchetypePolicyType determineObjectPol
}
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Selected policy configuration from subtypes {}:\n{}",
FocusTypeUtil.determineSubTypes(user), archetypePolicy == null ? null : archetypePolicy.asPrismContainerValue().debugDump(1));
FocusTypeUtil.determineSubTypes(user), archetypePolicy == null
? null
: archetypePolicy.asPrismContainerValue().debugDump(1));
}

return archetypePolicy;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ public EvaluatedAssignmentImpl<AH> evaluate(
.build();
AssignmentEvaluationTraceType trace;
if (result.isTracingNormal(AssignmentEvaluationTraceType.class)) {
trace = new AssignmentEvaluationTraceType(prismContext)
trace = new AssignmentEvaluationTraceType()
.assignmentOld(LensUtil.cloneResolveResource(getAssignmentBean(assignmentIdi, true), lensContext))
.assignmentNew(LensUtil.cloneResolveResource(getAssignmentBean(assignmentIdi, false), lensContext))
.primaryAssignmentMode(PlusMinusZeroType.fromValue(primaryAssignmentMode))
Expand All @@ -178,7 +178,7 @@ public EvaluatedAssignmentImpl<AH> evaluate(
.source(source)
.sourceDescription(sourceDescription)
.assignmentIdi(assignmentIdi)
.isAssignment(true)
.isAssignment()
.evaluateOld(evaluateOld)
.evaluationOrder(getInitialEvaluationOrder(evaluatedAssignment.getNormalizedRelation()))
.evaluationOrderForTarget(EvaluationOrderImpl.zero(relationRegistry))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,23 @@
import java.util.Objects;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.PlusMinusZero;

import com.evolveum.midpoint.schema.SchemaService;

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

import com.evolveum.midpoint.model.api.context.AssignmentPathSegment;
import com.evolveum.midpoint.model.api.context.EvaluationOrder;
import com.evolveum.midpoint.model.impl.lens.LensUtil;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.PlusMinusZero;
import com.evolveum.midpoint.prism.util.ItemDeltaItem;
import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.SchemaService;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.Nullable;

/**
* Primary duty of this class is to be a part of assignment path. (This is what is visible through its interface,
* AssignmentPathSegment.)
Expand Down Expand Up @@ -63,7 +60,7 @@ public class AssignmentPathSegmentImpl implements AssignmentPathSegment, Freezab
* Item-delta-item form of the assignment.
* TODO which ODO (absolute/relative)? MID-6404
*/
@NotNull private final ItemDeltaItem<PrismContainerValue<AssignmentType>,PrismContainerDefinition<AssignmentType>> assignmentIdi;
@NotNull private final ItemDeltaItem<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> assignmentIdi;

/**
* Are we evaluating the old or new state of the assignment?
Expand All @@ -87,9 +84,9 @@ public class AssignmentPathSegmentImpl implements AssignmentPathSegment, Freezab
private final boolean isAssignment;

/**
* Flag to make a difference between normal assignment/inducement and the one created based on the
* archetype hierarchy. If true, assignment/inducement was created based on the superArchetypeRef
* relation.
* Flag to make a difference between normal assignment/inducement and the one created based on the
* archetype hierarchy. If true, assignment/inducement was created based on the superArchetypeRef
* relation.
*/
private final boolean archetypeHierarchy;

Expand Down Expand Up @@ -279,7 +276,7 @@ public boolean isArchetypeHierarchy() {
}

@NotNull
public ItemDeltaItem<PrismContainerValue<AssignmentType>,PrismContainerDefinition<AssignmentType>> getAssignmentIdi() {
public ItemDeltaItem<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> getAssignmentIdi() {
return assignmentIdi;
}

Expand Down Expand Up @@ -409,31 +406,34 @@ public boolean isDelegation() {
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((assignmentIdi == null) ? 0 : assignmentIdi.hashCode());
result = prime * result + assignmentIdi.hashCode();
result = prime * result + ((source == null) ? 0 : source.hashCode());
result = prime * result + ((target == null) ? 0 : target.hashCode());
return result;
}

@SuppressWarnings({ "RedundantIfStatement" })
private boolean equalsExceptForTarget(Object obj) {
if (this == obj)
if (this == obj) {
return true;
if (obj == null)
}
if (obj == null) {
return false;
if (getClass() != obj.getClass())
}
if (getClass() != obj.getClass()) {
return false;
}
AssignmentPathSegmentImpl other = (AssignmentPathSegmentImpl) obj;
if (assignmentIdi == null) {
if (other.assignmentIdi != null)
return false;
} else if (!assignmentIdi.equals(other.assignmentIdi))
if (!assignmentIdi.equals(other.assignmentIdi)) {
return false;
}
if (source == null) {
if (other.source != null)
if (other.source != null) {
return false;
} else if (!source.equals(other.source))
}
} else if (!source.equals(other.source)) {
return false;
}
return true;
}

Expand Down Expand Up @@ -514,16 +514,12 @@ public String debugDump(int indent) {
StringBuilder sb = new StringBuilder();
DebugUtil.debugDumpLabel(sb, "AssignmentPathSegment", indent);
sb.append("\n");
DebugUtil.debugDumpWithLabelLn(sb, "source", source==null?"null":source.toString(), indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, "source", source == null ? "null" : source.toString(), indent + 1);
String assignmentOrInducement = isAssignment ? "assignment" : "inducement";
if (assignmentIdi != null) {
DebugUtil.debugDumpWithLabelLn(sb, assignmentOrInducement + " old", String.valueOf(assignmentIdi.getItemOld()), indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, assignmentOrInducement + " delta", String.valueOf(assignmentIdi.getDelta()), indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, assignmentOrInducement + " new", String.valueOf(assignmentIdi.getItemNew()), indent + 1);
} else {
DebugUtil.debugDumpWithLabelLn(sb, assignmentOrInducement, "null", indent + 1);
}
DebugUtil.debugDumpWithLabelLn(sb, "target", target==null?"null":target.toString(), indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, assignmentOrInducement + " old", String.valueOf(assignmentIdi.getItemOld()), indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, assignmentOrInducement + " delta", String.valueOf(assignmentIdi.getDelta()), indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, assignmentOrInducement + " new", String.valueOf(assignmentIdi.getItemNew()), indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, "target", target == null ? "null" : target.toString(), indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, "evaluationOrder", evaluationOrder, indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, "isMatchingOrder", isMatchingOrder, indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, "isMatchingOrderForTarget", isMatchingOrderForTarget, indent + 1);
Expand All @@ -541,12 +537,10 @@ public String debugDump(int indent) {
@Override
public AssignmentPathSegmentType toAssignmentPathSegmentType(boolean includeAssignmentsContent) {
AssignmentPathSegmentType rv = new AssignmentPathSegmentType();
if (assignment != null) {
if (includeAssignmentsContent) {
rv.setAssignment(assignment.clone());
}
rv.setAssignmentId(assignment.getId());
if (includeAssignmentsContent) {
rv.setAssignment(assignment.clone());
}
rv.setAssignmentId(assignment.getId());
if (source != null) {
rv.setSourceRef(ObjectTypeUtil.createObjectRef(source, getPrismContext()));
rv.setSourceDisplayName(ObjectTypeUtil.getDisplayName(source));
Expand Down Expand Up @@ -600,11 +594,13 @@ public Long getAssignmentId() {
return assignment.getId();
}

@NotNull private RelationRegistry getRelationRegistry() {
@NotNull
private RelationRegistry getRelationRegistry() {
return SchemaService.get().relationRegistry();
}

@NotNull private PrismContext getPrismContext() {
@NotNull
private PrismContext getPrismContext() {
return PrismService.get().prismContext();
}

Expand Down Expand Up @@ -661,8 +657,15 @@ public Builder evaluateOld(boolean val) {
return this;
}

public Builder isAssignment(boolean val) {
isAssignment = val;
/** Declares the segment as an assignment, not inducement. */
public Builder isAssignment() {
isAssignment = true;
return this;
}

/** Declares the segment as an inducement. */
public Builder isInducement() {
isAssignment = false;
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ void evaluate() throws SchemaException, ObjectNotFoundException, ExpressionEvalu
.source((AssignmentHolderType) segment.target)
.sourceDescription(segment.target+" in "+segment.sourceDescription)
.assignment(nextAssignment)
.isAssignment(true)
.isAssignment()
.evaluationOrder(nextEvaluationOrder)
.evaluationOrderForTarget(nextEvaluationOrderForTarget)
.pathToSourceValid(targetActivity.pathAndTargetActive)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ void evaluate() throws SchemaException, ObjectNotFoundException, ExpressionEvalu
.source((AssignmentHolderType) segment.target)
.sourceDescription(nextSourceDescription)
.assignment(inducement)
.isAssignment(false)
.isInducement()
.isHierarchy(archetypeHierarchy)
.pathToSourceValid(targetActivity.pathAndTargetActive)
.pathToSourceConditionState(targetOverallConditionState)
Expand Down

0 comments on commit 3de5b3b

Please sign in to comment.