From 1822af164113f689192af26b307dbbd01a0ba40b Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 9 Mar 2017 14:37:24 +0100 Subject: [PATCH] AssignmentEvaluator cleanup: minor change before changing multiple-targets behavios --- .../model/impl/lens/AssignmentEvaluator.java | 35 ++++++++++--------- .../lens/projector/AssignmentProcessor.java | 4 +-- 2 files changed, 21 insertions(+), 18 deletions(-) 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 f67236e0a42..f8fbfeb1728 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 @@ -267,43 +267,46 @@ private void evaluateFromSegmentWithTarget(AssignmentPath } ctx.assignmentPath.add(segment); - + + boolean evaluateContent = true; MappingType assignmentCondition = assignmentType.getCondition(); if (assignmentCondition != null) { - AssignmentPathVariables assignmentPathVariables = LensUtil.computeAssignmentPathVariables(ctx.assignmentPath); + AssignmentPathVariables assignmentPathVariables = LensUtil.computeAssignmentPathVariables(ctx.assignmentPath); PrismValueDeltaSetTriple> conditionTriple = evaluateCondition(assignmentCondition, assignmentType, segment.source, assignmentPathVariables, ctx); boolean condOld = ExpressionUtil.computeConditionResult(conditionTriple.getNonPositiveValues()); boolean condNew = ExpressionUtil.computeConditionResult(conditionTriple.getNonNegativeValues()); PlusMinusZero modeFromCondition = ExpressionUtil.computeConditionResultMode(condOld, condNew); - if (modeFromCondition == null) { // removed "|| (condMode == PlusMinusZero.ZERO && !condNew)" as it was always false + if (modeFromCondition == null) { // removed "|| (condMode == PlusMinusZero.ZERO && !condNew)" as it was always false if (LOGGER.isTraceEnabled()) { LOGGER.trace("Skipping evaluation of {} because of condition result ({} -> {}: {})", FocusTypeUtil.dumpAssignment(assignmentType), condOld, condNew, null); } - // This should apply perhaps only when path size is 1. - // But, hopefully, the last write to setValid will "win", and overwrite all the previous ones. - ctx.evalAssignment.setValid(false); - ctx.assignmentPath.removeLast(segment); - return; + evaluateContent = false; + } else { + PlusMinusZero origMode = mode; + mode = PlusMinusZero.compute(mode, modeFromCondition); + LOGGER.trace("Evaluated condition in assignment {} -> {}: {} + {} = {}", condOld, condNew, origMode, + modeFromCondition, mode); } - PlusMinusZero origMode = mode; - mode = PlusMinusZero.compute(mode, modeFromCondition); - LOGGER.trace("Evaluated condition in assignment {} -> {}: {} + {} = {}", condOld, condNew, origMode, modeFromCondition, mode); } - boolean isValid = evaluateSegmentContent(segment, target, mode, isParentValid, ctx); - ctx.evalAssignment.setValid(isValid); // See the above comment on calling setValid. + boolean isValid = evaluateContent && evaluateSegmentContent(segment, target, mode, isParentValid, ctx); + ctx.assignmentPath.removeLast(segment); + if (ctx.assignmentPath.isEmpty()) { + ctx.evalAssignment.setValid(isValid); // TODO this may be called multiple times (for more targets) - deal with it + } } - // now the segment is already at the path end (appended by the caller) private boolean evaluateSegmentContent(AssignmentPathSegmentImpl segment, @Nullable PrismObject target, PlusMinusZero mode, boolean isParentValid, EvaluationContext ctx) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, PolicyViolationException { + + assert ctx.assignmentPath.last() == segment; + AssignmentType assignmentType = getAssignmentType(segment, ctx); - boolean isValid = LensUtil - .isAssignmentValid(focusOdo.getNewObject().asObjectable(), assignmentType, now, activationComputer); + boolean isValid = LensUtil.isAssignmentValid(focusOdo.getNewObject().asObjectable(), assignmentType, now, activationComputer); if (isValid || segment.isValidityOverride()) { boolean empty = true; boolean reallyValid = isParentValid && isValid; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java index 8ff2cf2cc65..8e77cb78681 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java @@ -898,10 +898,10 @@ public void processOrgAssignments(LensContext context, } } // for zero and minus sets we check isForceRecon for all non-construction-related assignments (MID-2242) + // TODO why "non-construction-related" ones only? if (!forceRecon) { for (EvaluatedAssignmentImpl assignment: evaluatedAssignmentTriple.getNonPositiveValues()) { - if (assignment.isForceRecon() && - (assignment.getConstructions() == null || assignment.getConstructions().isEmpty())) { + if (assignment.isForceRecon() && assignment.getConstructions().isEmpty()) { forceRecon = true; break; }