From 55d661774846cc794eeb348c03166530b586d4c7 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 28 Nov 2016 15:47:26 +0100 Subject: [PATCH] Interim commit. --- .../model/api/context/AssignmentPath.java | 42 ++++++++++++++++++ .../api/context/AssignmentPathSegment.java | 37 ++++++++++++++++ .../api/context/EvaluatedPolicyRule.java | 4 +- .../model/api/context/EvaluationOrder.java | 38 ++++++++++++++++ .../model/impl/lens/AssignmentEvaluator.java | 43 ++++++++++--------- ...nmentPath.java => AssignmentPathImpl.java} | 38 +++++++++------- ...nt.java => AssignmentPathSegmentImpl.java} | 13 ++++-- .../model/impl/lens/Construction.java | 5 ++- .../impl/lens/EvaluatedAssignmentImpl.java | 2 +- .../impl/lens/EvaluatedPolicyRuleImpl.java | 13 ++++-- ...ionOrder.java => EvaluationOrderImpl.java} | 31 +++++++------ .../midpoint/model/impl/lens/LensContext.java | 15 ++++--- .../midpoint/model/impl/lens/LensUtil.java | 15 +++---- .../impl/lens/projector/FocusProcessor.java | 2 +- .../impl/lens/TestAssignmentProcessor.java | 2 + 15 files changed, 227 insertions(+), 73 deletions(-) create mode 100644 model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/AssignmentPath.java create mode 100644 model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/AssignmentPathSegment.java create mode 100644 model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluationOrder.java rename model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/{AssignmentPath.java => AssignmentPathImpl.java} (75%) rename model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/{AssignmentPathSegment.java => AssignmentPathSegmentImpl.java} (93%) rename model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/{EvaluationOrder.java => EvaluationOrderImpl.java} (87%) diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/AssignmentPath.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/AssignmentPath.java new file mode 100644 index 00000000000..2aa338626cd --- /dev/null +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/AssignmentPath.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.model.api.context; + +import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; + +import java.util.List; + +/** + * @author semancik + * @author mederly + */ +public interface AssignmentPath extends DebugDumpable { + List getSegments(); + + AssignmentPathSegment getFirstAssignmentSegment(); + + boolean isEmpty(); + + int size(); + + EvaluationOrder getEvaluationOrder(); + + AssignmentPathSegment last(); + + boolean containsTarget(ObjectType target); +} diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/AssignmentPathSegment.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/AssignmentPathSegment.java new file mode 100644 index 00000000000..12ad7ebd9cf --- /dev/null +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/AssignmentPathSegment.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.model.api.context; + +import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; + +/** + * @author semancik + * @author mederly + */ +public interface AssignmentPathSegment extends DebugDumpable { + AssignmentType getAssignment(); + + ObjectType getTarget(); + + ObjectType getSource(); + + EvaluationOrder getEvaluationOrder(); + + ObjectType getOrderOneObject(); +} diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java index 99eb7fe3bae..47c34c01076 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java @@ -36,7 +36,9 @@ public interface EvaluatedPolicyRule extends DebugDumpable, Serializable { String getName(); PolicyRuleType getPolicyRule(); - + + AssignmentPath getAssignmentPath(); + PolicyConstraintsType getPolicyConstraints(); String getPolicySituation(); diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluationOrder.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluationOrder.java new file mode 100644 index 00000000000..d275b587dbf --- /dev/null +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluationOrder.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.model.api.context; + +import com.evolveum.midpoint.util.DebugDumpable; + +import javax.xml.namespace.QName; + +/** + * @author semancik + * @author mederly + */ +public interface EvaluationOrder extends DebugDumpable { + + int getSummaryOrder(); + + EvaluationOrder advance(); + + EvaluationOrder advance(QName relation); + + int getMatchingRelationOrder(QName relation); + + String shortDump(); +} diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java index edd525c4b9c..470f6062184 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java @@ -23,7 +23,10 @@ import com.evolveum.midpoint.common.ActivationComputer; import com.evolveum.midpoint.model.api.PolicyViolationException; +import com.evolveum.midpoint.model.api.context.AssignmentPath; +import com.evolveum.midpoint.model.api.context.AssignmentPathSegment; import com.evolveum.midpoint.model.api.context.EvaluatedAssignment; +import com.evolveum.midpoint.model.api.context.EvaluationOrder; import com.evolveum.midpoint.model.api.util.DeputyUtils; import com.evolveum.midpoint.model.common.SystemObjectCache; import com.evolveum.midpoint.model.common.expression.ExpressionUtil; @@ -209,8 +212,8 @@ public EvaluatedAssignmentImpl evaluate(ItemDeltaItem evalAssignment = new EvaluatedAssignmentImpl<>(); evalAssignment.setAssignmentIdi(assignmentIdi); - AssignmentPath assignmentPath = new AssignmentPath(); - AssignmentPathSegment assignmentPathSegment = new AssignmentPathSegment(assignmentIdi, null); + AssignmentPathImpl assignmentPath = new AssignmentPathImpl(); + AssignmentPathSegmentImpl assignmentPathSegment = new AssignmentPathSegmentImpl(assignmentIdi, null); assignmentPathSegment.setSource(source); assignmentPathSegment.setEvaluationOrder(getInitialEvaluationOrder(assignmentIdi, evaluateOld)); assignmentPathSegment.setValidityOverride(true); @@ -232,12 +235,12 @@ private EvaluationOrder getInitialEvaluationOrder( if (assignmentType.getTargetRef() != null) { relation = assignmentType.getTargetRef().getRelation(); } - return EvaluationOrder.ZERO.advance(relation); + return EvaluationOrderImpl.ZERO.advance(relation); } - private void evaluateAssignment(EvaluatedAssignmentImpl evalAssignment, AssignmentPathSegment assignmentPathSegment, + private void evaluateAssignment(EvaluatedAssignmentImpl evalAssignment, AssignmentPathSegmentImpl assignmentPathSegment, boolean evaluateOld, PlusMinusZero mode, boolean isParentValid, ObjectType source, String sourceDescription, - AssignmentPath assignmentPath, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, PolicyViolationException { + AssignmentPathImpl assignmentPath, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, PolicyViolationException { assertSource(source, evalAssignment); LOGGER.trace("Evaluate assignment {} (eval constr: {}, mode: {})", assignmentPath, assignmentPathSegment.isMatchingOrder(), @@ -281,9 +284,9 @@ private void evaluateAssignment(EvaluatedAssignmentImpl void evaluateAssignmentWithResolvedTarget(EvaluatedAssignmentImpl evalAssignment, AssignmentPathSegment assignmentPathSegment, + private void evaluateAssignmentWithResolvedTarget(EvaluatedAssignmentImpl evalAssignment, AssignmentPathSegmentImpl assignmentPathSegment, boolean evaluateOld, PlusMinusZero mode, boolean isParentValid, ObjectType source, String sourceDescription, - AssignmentPath assignmentPath, AssignmentType assignmentType, PrismObject target, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, PolicyViolationException { + AssignmentPathImpl assignmentPath, AssignmentType assignmentType, PrismObject target, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, PolicyViolationException { if (target != null && evalAssignment.getTarget() == null) { evalAssignment.setTarget(target); } @@ -366,9 +369,9 @@ private void evaluateAssignmentWithResolvedTarget(Evaluat assignmentPath.remove(assignmentPathSegment); } - private void prepareConstructionEvaluation(EvaluatedAssignmentImpl evaluatedAssignment, AssignmentPathSegment assignmentPathSegment, + private void prepareConstructionEvaluation(EvaluatedAssignmentImpl evaluatedAssignment, AssignmentPathSegmentImpl assignmentPathSegment, boolean evaluateOld, PlusMinusZero mode, boolean isValid, ObjectType source, String sourceDescription, - AssignmentPath assignmentPath, ObjectType orderOneObject, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { + AssignmentPathImpl assignmentPath, ObjectType orderOneObject, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { assertSource(source, evaluatedAssignment); AssignmentType assignmentTypeNew = LensUtil.getAssignmentType(assignmentPathSegment.getAssignmentIdi(), evaluateOld); @@ -404,9 +407,9 @@ private void prepareConstructionEvaluation(EvaluatedAssignmentImpl evaluatedA } } - private void evaluateFocusMappings(EvaluatedAssignmentImpl evaluatedAssignment, AssignmentPathSegment assignmentPathSegment, + private void evaluateFocusMappings(EvaluatedAssignmentImpl evaluatedAssignment, AssignmentPathSegmentImpl assignmentPathSegment, boolean evaluateOld, ObjectType source, String sourceDescription, - AssignmentPath assignmentPath, ObjectType orderOneObject, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { + AssignmentPathImpl assignmentPath, ObjectType orderOneObject, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { assertSource(source, evaluatedAssignment); AssignmentType assignmentTypeNew = LensUtil.getAssignmentType(assignmentPathSegment.getAssignmentIdi(), evaluateOld); @@ -428,9 +431,9 @@ private void evaluateFocusMappings(EvaluatedAssignmentImpl evaluatedAssignmen } } - private void evaluatePolicyRule(EvaluatedAssignmentImpl evaluatedAssignment, AssignmentPathSegment assignmentPathSegment, + private void evaluatePolicyRule(EvaluatedAssignmentImpl evaluatedAssignment, AssignmentPathSegmentImpl assignmentPathSegment, boolean evaluateOld, PlusMinusZero mode, boolean isValid, ObjectType source, String sourceDescription, - AssignmentPath assignmentPath, ObjectType orderOneObject, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { + AssignmentPathImpl assignmentPath, ObjectType orderOneObject, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { assertSource(source, evaluatedAssignment); AssignmentType assignmentTypeNew = LensUtil.getAssignmentType(assignmentPathSegment.getAssignmentIdi(), evaluateOld); @@ -438,12 +441,12 @@ private void evaluatePolicyRule(EvaluatedAssignmentImpl evaluatedAssignment, LOGGER.trace("Evaluating policy rule '{}' in {}", policyRuleType.getName(), source); - EvaluatedPolicyRuleImpl policyRule = new EvaluatedPolicyRuleImpl(policyRuleType); + EvaluatedPolicyRuleImpl policyRule = new EvaluatedPolicyRuleImpl(policyRuleType, assignmentPath.clone()); evaluatedAssignment.addPolicyRule(policyRule); } - private List> resolveTargets(AssignmentType assignmentType, AssignmentPathSegment assignmentPathSegment, ObjectType source, String sourceDescription, AssignmentPath assignmentPath, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException { + private List> resolveTargets(AssignmentType assignmentType, AssignmentPathSegment assignmentPathSegment, ObjectType source, String sourceDescription, AssignmentPathImpl assignmentPath, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException { ObjectReferenceType targetRef = assignmentType.getTargetRef(); String oid = targetRef.getOid(); @@ -488,7 +491,7 @@ private List> resolveTargets(AssignmentTyp } - private List> resolveTargetsFromFilter(Class clazz, AssignmentPathSegment assignmentPathSegment, ObjectType source, SearchFilterType filter, String sourceDescription, AssignmentPath assignmentPath, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException{ + private List> resolveTargetsFromFilter(Class clazz, AssignmentPathSegment assignmentPathSegment, ObjectType source, SearchFilterType filter, String sourceDescription, AssignmentPathImpl assignmentPath, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException{ // SearchFilterType filter = targetRef.getFilter(); ModelExpressionThreadLocalHolder.pushLensContext(lensContext); ModelExpressionThreadLocalHolder.pushCurrentResult(result); @@ -524,9 +527,9 @@ private List> resolveTargetsFromFilter(Cla } - private boolean evaluateAssignmentTarget(EvaluatedAssignmentImpl assignment, AssignmentPathSegment assignmentPathSegment, + private boolean evaluateAssignmentTarget(EvaluatedAssignmentImpl assignment, AssignmentPathSegmentImpl assignmentPathSegment, boolean evaluateOld, PlusMinusZero mode, boolean isValid, FocusType targetType, ObjectType source, QName relation, String sourceDescription, - AssignmentPath assignmentPath, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, PolicyViolationException { + AssignmentPathImpl assignmentPath, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, PolicyViolationException { assertSource(source, assignment); assignmentPathSegment.setTarget(targetType); @@ -636,7 +639,7 @@ private boolean evaluateAssignmentTarget(EvaluatedAssignmentImpl assignment, ItemDeltaItem,PrismContainerDefinition> roleInducementIdi = new ItemDeltaItem<>(); roleInducementIdi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(roleInducement)); roleInducementIdi.recompute(); - AssignmentPathSegment subAssignmentPathSegment = new AssignmentPathSegment(roleInducementIdi, null); + AssignmentPathSegmentImpl subAssignmentPathSegment = new AssignmentPathSegmentImpl(roleInducementIdi, null); subAssignmentPathSegment.setSource(targetType); subAssignmentPathSegment.setEvaluationOrder(evaluationOrder); subAssignmentPathSegment.setOrderOneObject(orderOneObject); @@ -679,7 +682,7 @@ private boolean evaluateAssignmentTarget(EvaluatedAssignmentImpl assignment, ItemDeltaItem,PrismContainerDefinition> roleAssignmentIdi = new ItemDeltaItem<>(); roleAssignmentIdi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(roleAssignment)); roleAssignmentIdi.recompute(); - AssignmentPathSegment subAssignmentPathSegment = new AssignmentPathSegment(roleAssignmentIdi, null); + AssignmentPathSegmentImpl subAssignmentPathSegment = new AssignmentPathSegmentImpl(roleAssignmentIdi, null); subAssignmentPathSegment.setSource(targetType); String subSourceDescription = targetType+" in "+sourceDescription; QName subrelation = null; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPath.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathImpl.java similarity index 75% rename from model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPath.java rename to model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathImpl.java index 3bf25398101..ff181104232 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPath.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathImpl.java @@ -18,41 +18,43 @@ import java.util.ArrayList; import java.util.List; +import com.evolveum.midpoint.model.api.context.AssignmentPath; +import com.evolveum.midpoint.model.api.context.AssignmentPathSegment; +import com.evolveum.midpoint.model.api.context.EvaluationOrder; import com.evolveum.midpoint.model.common.expression.ItemDeltaItem; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; /** * @author semancik * */ -public class AssignmentPath implements DebugDumpable { +public class AssignmentPathImpl implements AssignmentPath { - private List segments; + private List segments; - public AssignmentPath() { + public AssignmentPathImpl() { segments = createNewSegments(); } - AssignmentPath(ItemDeltaItem,PrismContainerDefinition> assignmentIdi) { + AssignmentPathImpl(ItemDeltaItem,PrismContainerDefinition> assignmentIdi) { this.segments = createNewSegments(); - segments.add(new AssignmentPathSegment(assignmentIdi, null)); + segments.add(new AssignmentPathSegmentImpl(assignmentIdi, null)); } - private List createNewSegments() { - return new ArrayList(); + private List createNewSegments() { + return new ArrayList<>(); } - public List getSegments() { + @Override + public List getSegments() { return segments; } - public void add(AssignmentPathSegment segment) { + public void add(AssignmentPathSegmentImpl segment) { segments.add(segment); } @@ -61,24 +63,29 @@ public void remove(AssignmentPathSegment segment) { } - public AssignmentPathSegment getFirstAssignmentSegment() { + @Override + public AssignmentPathSegmentImpl getFirstAssignmentSegment() { return segments.get(0); } + @Override public boolean isEmpty() { return segments.isEmpty(); } + @Override public int size() { return segments.size(); } + @Override public EvaluationOrder getEvaluationOrder() { if (isEmpty()) { - return EvaluationOrder.ZERO; + return EvaluationOrderImpl.ZERO; } else { return segments.get(segments.size()-1).getEvaluationOrder(); } } + @Override public AssignmentPathSegment last() { if (isEmpty()) { return null; @@ -87,6 +94,7 @@ public AssignmentPathSegment last() { } } + @Override public boolean containsTarget(ObjectType target) { if (target == null) { return false; @@ -111,8 +119,8 @@ public boolean containsTarget(ObjectType target) { /** * Shallow clone. */ - public AssignmentPath clone() { - AssignmentPath clone = new AssignmentPath(); + public AssignmentPathImpl clone() { + AssignmentPathImpl clone = new AssignmentPathImpl(); clone.segments.addAll(this.segments); return clone; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegment.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java similarity index 93% rename from model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegment.java rename to model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java index 8eefec2c1cb..6cc129004ec 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegment.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java @@ -15,6 +15,8 @@ */ package com.evolveum.midpoint.model.impl.lens; +import com.evolveum.midpoint.model.api.context.AssignmentPathSegment; +import com.evolveum.midpoint.model.api.context.EvaluationOrder; import com.evolveum.midpoint.model.common.expression.ItemDeltaItem; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; @@ -30,7 +32,7 @@ * @author semancik * */ -public class AssignmentPathSegment implements DebugDumpable { +public class AssignmentPathSegmentImpl implements AssignmentPathSegment { private ItemDeltaItem,PrismContainerDefinition> assignmentIdi; private ObjectType target; @@ -41,7 +43,7 @@ public class AssignmentPathSegment implements DebugDumpable { private Boolean isMatchingOrder = null; private boolean processMembership = false; - AssignmentPathSegment(ItemDeltaItem,PrismContainerDefinition> assignmentIdi, ObjectType target) { + AssignmentPathSegmentImpl(ItemDeltaItem,PrismContainerDefinition> assignmentIdi, ObjectType target) { super(); this.assignmentIdi = assignmentIdi; this.target = target; @@ -51,6 +53,7 @@ public ItemDeltaItem,PrismContainerDefinitio return assignmentIdi; } + @Override public AssignmentType getAssignment() { if (assignmentIdi == null || assignmentIdi.getItemNew() == null || assignmentIdi.getItemNew().isEmpty()) { return null; @@ -62,6 +65,7 @@ public void setAssignmentIdi(ItemDeltaItem,P this.assignmentIdi = assignmentIdi; } + @Override public ObjectType getTarget() { return target; } @@ -70,6 +74,7 @@ public void setTarget(ObjectType target) { this.target = target; } + @Override public ObjectType getSource() { return source; } @@ -86,6 +91,7 @@ public void setValidityOverride(boolean validityOverride) { this.validityOverride = validityOverride; } + @Override public EvaluationOrder getEvaluationOrder() { return evaluationOrder; } @@ -94,6 +100,7 @@ public void setEvaluationOrder(EvaluationOrder evaluationOrder) { this.evaluationOrder = evaluationOrder; } + @Override public ObjectType getOrderOneObject() { return varThisObject; } @@ -171,7 +178,7 @@ public boolean equals(Object obj) { return false; if (getClass() != obj.getClass()) return false; - AssignmentPathSegment other = (AssignmentPathSegment) obj; + AssignmentPathSegmentImpl other = (AssignmentPathSegmentImpl) obj; if (assignmentIdi == null) { if (other.assignmentIdi != null) return false; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java index 65d90803fb8..4f09dc5f197 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java @@ -23,6 +23,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.common.refinery.*; +import com.evolveum.midpoint.model.api.context.AssignmentPath; import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.model.common.expression.ObjectDeltaObject; @@ -92,7 +93,7 @@ */ public class Construction implements DebugDumpable, Serializable { - private AssignmentPath assignmentPath; + private AssignmentPathImpl assignmentPath; private ConstructionType constructionType; private ObjectType source; private ObjectType orderOneObject; @@ -317,7 +318,7 @@ public AssignmentPath getAssignmentPath() { return assignmentPath; } - public void setAssignmentPath(AssignmentPath assignmentPath) { + public void setAssignmentPath(AssignmentPathImpl assignmentPath) { this.assignmentPath = assignmentPath; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java index 96f25d04313..89f4f2bb614 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java @@ -316,7 +316,7 @@ public void addPolicyRule(EvaluatedPolicyRule policyRule) { public void addLegacyPolicyConstraints(PolicyConstraintsType constraints) { PolicyRuleType policyRuleType = new PolicyRuleType(); policyRuleType.setPolicyConstraints(constraints); - EvaluatedPolicyRule policyRule = new EvaluatedPolicyRuleImpl(policyRuleType); + EvaluatedPolicyRule policyRule = new EvaluatedPolicyRuleImpl(policyRuleType, null); policyRules.add(policyRule); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java index db1f088c51d..6618c416293 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.Collection; +import com.evolveum.midpoint.model.api.context.AssignmentPath; import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRule; import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRuleTrigger; import com.evolveum.midpoint.model.api.context.PredefinedPolicySituaion; @@ -36,11 +37,13 @@ public class EvaluatedPolicyRuleImpl implements EvaluatedPolicyRule { private static final long serialVersionUID = 1L; private PolicyRuleType policyRuleType; + private AssignmentPath assignmentPath; private Collection triggers; - public EvaluatedPolicyRuleImpl(PolicyRuleType policyRuleType) { + public EvaluatedPolicyRuleImpl(PolicyRuleType policyRuleType, AssignmentPath assignmentPath) { super(); this.policyRuleType = policyRuleType; + this.assignmentPath = assignmentPath; this.triggers = new ArrayList<>(); } @@ -52,13 +55,16 @@ public String getName() { return policyRuleType.getName(); } - - @Override public PolicyRuleType getPolicyRule() { return policyRuleType; } + @Override + public AssignmentPath getAssignmentPath() { + return assignmentPath; + } + @Override public PolicyConstraintsType getPolicyConstraints() { return policyRuleType.getPolicyConstraints(); @@ -118,6 +124,7 @@ public String debugDump(int indent) { DebugUtil.debugDumpLabelLn(sb, "EvaluatedPolicyRule", indent); DebugUtil.debugDumpWithLabelLn(sb, "name", getName(), indent + 1); DebugUtil.debugDumpWithLabelLn(sb, "policyRuleType", policyRuleType.toString(), indent + 1); + DebugUtil.debugDumpWithLabelLn(sb, "assignmentPath", assignmentPath, indent + 1); DebugUtil.debugDumpWithLabel(sb, "triggers", triggers, indent + 1); return sb.toString(); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrder.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java similarity index 87% rename from model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrder.java rename to model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java index c11b5ffcfcc..a9697b44d02 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrder.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java @@ -20,8 +20,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.model.api.context.EvaluationOrder; import com.evolveum.midpoint.model.api.util.DeputyUtils; -import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.QNameUtil; @@ -29,30 +29,33 @@ * @author semancik * */ -public class EvaluationOrder implements DebugDumpable { - - public static final EvaluationOrder ZERO = EvaluationOrder.createZero(); - public static final EvaluationOrder ONE = ZERO.advance(); - - private int summaryOrder = 0; - private HashMap orderMap = new HashMap<>(); +public class EvaluationOrderImpl implements EvaluationOrder { - public static EvaluationOrder createZero() { - EvaluationOrder eo = new EvaluationOrder(); + public static EvaluationOrder ZERO = createZero(); + public static EvaluationOrder ONE = ZERO.advance(); + + static EvaluationOrderImpl createZero() { + EvaluationOrderImpl eo = new EvaluationOrderImpl(); eo.orderMap.put(null,0); return eo; } - + + private int summaryOrder = 0; + private HashMap orderMap = new HashMap<>(); + + @Override public int getSummaryOrder() { return summaryOrder; } + @Override public EvaluationOrder advance() { return advance(null); } + @Override public EvaluationOrder advance(QName relation) { - EvaluationOrder adeo = new EvaluationOrder(); + EvaluationOrderImpl adeo = new EvaluationOrderImpl(); boolean found = false; for (Entry entry: orderMap.entrySet()) { if (QNameUtil.match(entry.getKey(), relation)) { @@ -73,6 +76,7 @@ public EvaluationOrder advance(QName relation) { return adeo; } + @Override public int getMatchingRelationOrder(QName relation) { for (Entry entry: orderMap.entrySet()) { if (QNameUtil.match(entry.getKey(), relation)) { @@ -111,7 +115,7 @@ public boolean equals(Object obj) { if (getClass() != obj.getClass()) { return false; } - EvaluationOrder other = (EvaluationOrder) obj; + EvaluationOrderImpl other = (EvaluationOrderImpl) obj; if (orderMap == null) { if (other.orderMap != null) { return false; @@ -130,6 +134,7 @@ public String toString() { return "EvaluationOrder(" + shortDump() + ")"; } + @Override public String shortDump() { StringBuilder sb = new StringBuilder(); for (Entry entry: orderMap.entrySet()) { 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 8a9d3c9300d..43193560623 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 @@ -859,12 +859,17 @@ public String debugDump(int indent, boolean showTriples) { DebugUtil.debugDumpWithLabel(sb, "FOCUS", focusContext, indent + 1); sb.append("\n"); - DebugUtil.indentDebugDump(sb, indent + 1); - sb.append("Evaluated assignments:"); if (evaluatedAssignmentTriple != null) { - dumpEvaluatedAssignments(sb, "Zero", (Collection) evaluatedAssignmentTriple.getZeroSet(), indent + 2); - dumpEvaluatedAssignments(sb, "Plus", (Collection) evaluatedAssignmentTriple.getPlusSet(), indent + 2); - dumpEvaluatedAssignments(sb, "Minus", (Collection) evaluatedAssignmentTriple.getMinusSet(), indent + 2); + if (DebugUtil.isDetailedDebugDump()) { + DebugUtil.debugDumpWithLabel(sb, "EvaluatedAssignments", evaluatedAssignmentTriple, indent + 1); + evaluatedAssignmentTriple.debugDump(); + } else { + DebugUtil.indentDebugDump(sb, indent + 1); + sb.append("Evaluated assignments:"); + dumpEvaluatedAssignments(sb, "Zero", (Collection) evaluatedAssignmentTriple.getZeroSet(), indent + 2); + dumpEvaluatedAssignments(sb, "Plus", (Collection) evaluatedAssignmentTriple.getPlusSet(), indent + 2); + dumpEvaluatedAssignments(sb, "Minus", (Collection) evaluatedAssignmentTriple.getMinusSet(), indent + 2); + } } else { sb.append(" (null)"); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 1c6ceadc960..8103f0d16ad 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -22,13 +22,14 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.stream.Collectors; import javax.xml.bind.JAXBElement; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; +import com.evolveum.midpoint.model.api.context.AssignmentPath; +import com.evolveum.midpoint.model.api.context.AssignmentPathSegment; import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRule; import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRuleTrigger; import com.evolveum.midpoint.model.api.util.DeputyUtils; @@ -56,13 +57,11 @@ import com.evolveum.midpoint.model.impl.expr.ModelExpressionThreadLocalHolder; import com.evolveum.midpoint.model.impl.lens.projector.ValueMatcher; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.DeltaSetTriple; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.delta.PropertyDelta; -import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -71,12 +70,10 @@ import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; @@ -1020,15 +1017,15 @@ private static Collection compute } } - public static AssignmentPathVariables computeAssignmentPathVariables(AssignmentPath assignmentPath) throws SchemaException { + public static AssignmentPathVariables computeAssignmentPathVariables(AssignmentPathImpl assignmentPath) throws SchemaException { if (assignmentPath == null || assignmentPath.isEmpty()) { return null; } AssignmentPathVariables vars = new AssignmentPathVariables(); - Iterator iterator = assignmentPath.getSegments().iterator(); + Iterator iterator = assignmentPath.getSegments().iterator(); while (iterator.hasNext()) { - AssignmentPathSegment segment = iterator.next(); + AssignmentPathSegmentImpl segment = iterator.next(); ItemDeltaItem,PrismContainerDefinition> segmentAssignmentIdi = segment.getAssignmentIdi(); ItemDeltaItem,PrismContainerDefinition> magicAssignmentIdi; @@ -1060,7 +1057,7 @@ public static AssignmentPathVariables computeAssignmentPathVariables(AssignmentP } } - AssignmentPathSegment focusAssignmentSegment = assignmentPath.getFirstAssignmentSegment(); + AssignmentPathSegmentImpl focusAssignmentSegment = assignmentPath.getFirstAssignmentSegment(); ItemDeltaItem,PrismContainerDefinition> focusAssignment = focusAssignmentSegment.getAssignmentIdi().clone(); vars.setFocusAssignment(focusAssignment); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java index 16b6ab6843b..216fecbe80a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java @@ -402,7 +402,7 @@ private void triggerGlobalRules(LensContext context) th for (GlobalPolicyRuleType globalPolicyRule: systemConfiguration.asObjectable().getGlobalPolicyRule()) { ObjectSelectorType focusSelector = globalPolicyRule.getFocusSelector(); if (cacheRepositoryService.selectorMatches(focusSelector, focus, LOGGER, "Global policy rule "+globalPolicyRule.getName()+": ")) { - EvaluatedPolicyRule evaluatedRule = new EvaluatedPolicyRuleImpl(globalPolicyRule); + EvaluatedPolicyRule evaluatedRule = new EvaluatedPolicyRuleImpl(globalPolicyRule, null); triggerRule(focusContext, evaluatedRule); } } diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor.java index 87f0ab72c61..98cab7d6208 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor.java @@ -35,6 +35,7 @@ import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.DummyResourceContoller; import com.evolveum.midpoint.test.util.TestUtil; +import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.springframework.beans.factory.annotation.Autowired; @@ -735,6 +736,7 @@ public void test210AssignEngineer() throws Exception { assignmentProcessor.processAssignmentsProjections(context, getNow(), task, result); // THEN + DebugUtil.setDetailedDebugDump(true); display("Output context", context); display("outbound processor result", result); //assertSuccess("Outbound processor failed (result)", result);