From 616570a790282b96d5246edfd24a6ac1b590644a Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 4 Sep 2018 06:35:59 +0200 Subject: [PATCH] Add transform expression condition (MID-4862) This is an EXPERIMENTAL implementation of condition that would cause specified combinations of input values for an expression to be skipped from evaluation. --- .../xml/ns/public/common/common-core-3.xsd | 11 +++++ ...alueTransformationExpressionEvaluator.java | 47 +++++++++++-------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index d91d2a6d332..d9a3b6ee857 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -9223,6 +9223,17 @@ + + + + Condition driving whether this expression is evaluated at all (for given inputs). + + + true + 3.9 + + + diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractValueTransformationExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractValueTransformationExpressionEvaluator.java index 47180eb62ab..478f8b1a660 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractValueTransformationExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractValueTransformationExpressionEvaluator.java @@ -15,35 +15,20 @@ */ package com.evolveum.midpoint.model.common.expression.evaluator; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; import javax.xml.namespace.QName; import com.evolveum.midpoint.common.LocalizationService; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.DeltaSetTriple; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.PlusMinusZero; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; -import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; -import com.evolveum.midpoint.repo.common.expression.ExpressionSyntaxException; -import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; -import com.evolveum.midpoint.repo.common.expression.ItemDeltaItem; -import com.evolveum.midpoint.repo.common.expression.ObjectDeltaObject; -import com.evolveum.midpoint.repo.common.expression.Source; -import com.evolveum.midpoint.repo.common.expression.SourceTriple; +import com.evolveum.midpoint.repo.common.expression.*; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ExceptionUtil; @@ -350,6 +335,14 @@ private PrismValueDeltaSetTriple evaluateRelativeExpression(final List outputTriple = new PrismValueDeltaSetTriple<>(); + Expression, PrismPropertyDefinition> conditionExpression; + if (expressionEvaluatorType.getCondition() != null) { + conditionExpression = ExpressionUtil.createCondition(expressionEvaluatorType.getCondition(), + evaluationContext.getExpressionFactory(), "condition in " + contextDescription, task, result); + } else { + conditionExpression = null; + } + Processor> processor = pvalues -> { if (includeNulls != null && !includeNulls && MiscUtil.isAllNull(pvalues)) { // The case that all the sources are null. There is no point executing the expression. @@ -426,8 +419,22 @@ private PrismValueDeltaSetTriple evaluateRelativeExpression(final List scriptResults; try { - scriptResults = transformSingleValue(scriptVariables, valueDestination, useNew, evaluationContext, - contextDescription, task, result); + boolean conditionResult; + if (conditionExpression != null) { + ExpressionEvaluationContext ctx = new ExpressionEvaluationContext(null, scriptVariables, + "condition in " + contextDescription, task, result); + PrismValueDeltaSetTriple> triple = conditionExpression.evaluate(ctx); + conditionResult = ExpressionUtil.computeConditionResult(triple.getNonNegativeValues()); + } else { + conditionResult = true; + } + if (conditionResult) { + scriptResults = transformSingleValue(scriptVariables, valueDestination, useNew, evaluationContext, + contextDescription, task, result); + } else { + LOGGER.trace("Skipping value transformation because condition evaluated to false in {}", contextDescription); + scriptResults = Collections.emptyList(); + } } catch (ExpressionEvaluationException e) { throw new TunnelException( localizationService.translate(