From 91856a7ee02d1e23398e1d24d7abbd76c86fa937 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 10 Jun 2020 12:32:13 +0200 Subject: [PATCH] Do minor code cleanups Introduced helper methods - ExpressionUtil.evaluateConditionDefaultTrue/False - static PPV.getRealValue, isNotFalse, isTrue --- .../midpoint/prism/PrismPropertyValue.java | 14 +- .../stringpolicy/ValuePolicyProcessor.java | 4 +- .../impl/controller/DashboardServiceImpl.java | 21 +- .../model/impl/lens/ChangeExecutor.java | 20 +- .../impl/sync/SynchronizationContext.java | 3 +- .../SynchronizationExpressionsEvaluator.java | 38 +-- .../impl/sync/SynchronizationServiceImpl.java | 6 +- .../sync/SynchronizationServiceUtils.java | 213 ++++++++------- .../impl/api/transports/TransportUtil.java | 20 +- .../common/ExpressionEvaluationHelper.java | 244 +++++++++--------- .../util/PerformerCommentsFormatterImpl.java | 3 - .../util/UcfExpressionEvaluatorImpl.java | 4 +- .../ucf/api/UcfExpressionEvaluator.java | 2 +- .../common/expression/ExpressionUtil.java | 44 +++- 14 files changed, 323 insertions(+), 313 deletions(-) diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index 22b8cdc741c..7d6e2554791 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -12,7 +12,8 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.exception.SchemaException; + +import org.apache.commons.lang.BooleanUtils; import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBElement; @@ -69,4 +70,15 @@ public interface PrismPropertyValue extends DebugDumpable, Serializable, Pris @Override T getRealValue(); + static T getRealValue(PrismPropertyValue propertyValue) { + return propertyValue != null ? propertyValue.getRealValue() : null; + } + + static boolean isNotFalse(PrismPropertyValue booleanPropertyValue) { + return booleanPropertyValue == null || BooleanUtils.isNotFalse(booleanPropertyValue.getRealValue()); + } + + static boolean isTrue(PrismPropertyValue booleanPropertyValue) { + return booleanPropertyValue != null && BooleanUtils.isTrue(booleanPropertyValue.getRealValue()); + } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/stringpolicy/ValuePolicyProcessor.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/stringpolicy/ValuePolicyProcessor.java index b4cd56b09fe..64abafd6f51 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/stringpolicy/ValuePolicyProcessor.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/stringpolicy/ValuePolicyProcessor.java @@ -781,8 +781,8 @@ private boolean checkExpression(String generatedValue, Ex } variables.addVariableDefinition(ExpressionConstants.VAR_OBJECT, object, objectDef); - PrismPropertyValue output = ExpressionUtil.evaluateCondition(variables, checkExpression, expressionProfile, expressionFactory, shortDesc, task, result); - return ExpressionUtil.getBooleanConditionOutput(output); + return ExpressionUtil.evaluateConditionDefaultFalse(variables, checkExpression, + expressionProfile, expressionFactory, shortDesc, task, result); } /** diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java index 0958f3ca2a3..497a1243912 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java @@ -10,11 +10,12 @@ import java.util.*; -import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; + import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.springframework.beans.factory.annotation.Autowired; @@ -32,7 +33,6 @@ import com.evolveum.midpoint.model.impl.ModelObjectResolver; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; @@ -349,19 +349,14 @@ private String generateNumberMessage(DashboardWidgetType widget, ExpressionVaria } private void evaluateVariation(DashboardWidgetType widget, ExpressionVariables variables, DashboardWidget data) { - - if(widget.getPresentation() != null) { - if(widget.getPresentation().getVariation() != null) { - for(DashboardWidgetVariationType variation : widget.getPresentation().getVariation()) { + if (widget.getPresentation() != null) { + if (widget.getPresentation().getVariation() != null) { + for (DashboardWidgetVariationType variation : widget.getPresentation().getVariation()) { Task task = taskManager.createTaskInstance("Evaluate variation"); - PrismPropertyValue usingVariation; try { - usingVariation = ExpressionUtil.evaluateCondition(variables, variation.getCondition(), null, - expressionFactory, - "Variation", task, task.getResult()); - - if(usingVariation != null && usingVariation.getRealValue() != null - && usingVariation.getRealValue().equals(Boolean.TRUE)) { + boolean usingVariation = ExpressionUtil.evaluateConditionDefaultFalse(variables, variation.getCondition(), + MiscSchemaUtil.getExpressionProfile(), expressionFactory, "Variation", task, task.getResult()); + if (usingVariation) { data.setDisplay(combineDisplay(widget.getDisplay(), variation.getDisplay())); } else { data.setDisplay(widget.getDisplay()); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java index ee9c5eb3a70..e0de939f7f8 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java @@ -1744,21 +1744,11 @@ private OperationProvisioningScriptsType evaluateScript(OperationProvisioningScr } private boolean evaluateScriptCondition(OperationProvisioningScriptType script, - ExpressionVariables variables, ExpressionProfile expressionProfile, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { - ExpressionType condition = script.getCondition(); - if (condition == null) { - return true; - } - - PrismPropertyValue conditionOutput = ExpressionUtil.evaluateCondition(variables, condition, expressionProfile, expressionFactory, " condition for provisioning script ", task, result); - if (conditionOutput == null) { - return true; - } - - Boolean conditionOutputValue = conditionOutput.getValue(); - - return BooleanUtils.isNotFalse(conditionOutputValue); - + ExpressionVariables variables, ExpressionProfile expressionProfile, Task task, OperationResult result) + throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, + ConfigurationException, SecurityViolationException { + return ExpressionUtil.evaluateConditionDefaultTrue(variables, script.getCondition(), expressionProfile, + expressionFactory, " condition for provisioning script ", task, result); } private void evaluateScriptArgument(ProvisioningScriptArgumentType argument, diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationContext.java index 6d05c2a2cbb..f0df0918e48 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationContext.java @@ -236,9 +236,8 @@ private boolean conditionMatches(SynchronizationReactionType reaction, Operation variables.put(ExpressionConstants.VAR_RESOURCE_OBJECT_DELTA, resourceObjectDelta, ObjectDelta.class); try { ModelExpressionThreadLocalHolder.pushExpressionEnvironment(new ExpressionEnvironment<>(task, result)); - PrismPropertyValue evaluateCondition = ExpressionUtil.evaluateCondition(variables, expression, + boolean value = ExpressionUtil.evaluateConditionDefaultFalse(variables, expression, expressionProfile, expressionFactory, desc, task, result); - boolean value = Boolean.TRUE.equals(evaluateCondition.getValue()); if (!value) { LOGGER.trace("Skipping reaction {} because the condition was evaluated to false", reaction); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationExpressionsEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationExpressionsEvaluator.java index 72d3640c4ec..96f0dd380f4 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationExpressionsEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationExpressionsEvaluator.java @@ -60,6 +60,8 @@ import java.util.HashSet; import java.util.Set; +import static com.evolveum.midpoint.prism.PrismPropertyValue.getRealValue; + @Component public class SynchronizationExpressionsEvaluator { @@ -129,25 +131,17 @@ public List> findFocusesByCorrelationRule(C } private boolean satisfyCondition(ShadowType currentShadow, ConditionalSearchFilterType conditionalFilter, - ExpressionProfile expressionProfile, ResourceType resourceType, SystemConfigurationType configurationType, String shortDesc, Task task, - OperationResult parentResult) throws SchemaException, + ExpressionProfile expressionProfile, ResourceType resource, SystemConfigurationType configuration, + String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { - - if (conditionalFilter.getCondition() == null){ + if (conditionalFilter.getCondition() == null) { return true; + } else { + ExpressionVariables variables = ModelImplUtils.getDefaultExpressionVariables(null, currentShadow, + resource, configuration, prismContext); + return ExpressionUtil.evaluateConditionDefaultFalse(variables, + conditionalFilter.getCondition(), expressionProfile, expressionFactory, shortDesc, task, result); } - - ExpressionType condition = conditionalFilter.getCondition(); - ExpressionVariables variables = ModelImplUtils.getDefaultExpressionVariables(null,currentShadow, resourceType, configurationType, prismContext); - ItemDefinition outputDefinition = prismContext.definitionFactory().createPropertyDefinition( - ExpressionConstants.OUTPUT_ELEMENT_NAME, PrimitiveType.BOOLEAN.getQname()); - PrismPropertyValue satisfy = (PrismPropertyValue) ExpressionUtil.evaluateExpression(variables, - outputDefinition, condition, expressionProfile, expressionFactory, shortDesc, task, parentResult); - if (satisfy.getValue() == null) { - return false; - } - - return satisfy.getValue(); } private boolean contains(List> users, PrismObject foundUser){ @@ -159,7 +153,6 @@ private boolean contains(List> users, Prism return false; } - private List> findFocusesByCorrelationRule(Class focusType, ShadowType currentShadow, ConditionalSearchFilterType conditionalFilter, ExpressionProfile expressionProfile, ResourceType resourceType, SystemConfigurationType configurationType, Task task, OperationResult result) @@ -357,7 +350,7 @@ private ObjectQuery evaluateQueryExpressions(ObjectQuery query, ExpressionProfil return ExpressionUtil.evaluateQueryExpressions(query, variables, expressionProfile, expressionFactory, prismContext, shortDesc, task, result); } - public boolean evaluateConfirmationExpression(Class focusType, F user, ShadowType shadow, ResourceType resource, + private boolean evaluateConfirmationExpression(Class focusType, F user, ShadowType shadow, ResourceType resource, SystemConfigurationType configuration, ExpressionType expressionType, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException { Validate.notNull(user, "User must not be null."); @@ -395,6 +388,7 @@ public boolean evaluateConfirmationExpression(Class foc } // For now only used in sync service. but later can be used in outbound/assignments + @SuppressWarnings("WeakerAccess") public String generateTag(ResourceObjectMultiplicityType multiplicity, PrismObject shadow, PrismObject resource, PrismObject configuration, String shortDesc, Task task, OperationResult parentResult) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { if (multiplicity == null) { return null; @@ -411,12 +405,8 @@ public String generateTag(ResourceObjectMultiplicityType multiplicity, PrismObje ExpressionVariables variables = ModelImplUtils.getDefaultExpressionVariables(null, shadow, null, resource, configuration, null, prismContext); ItemDefinition outputDefinition = prismContext.definitionFactory().createPropertyDefinition( ExpressionConstants.OUTPUT_ELEMENT_NAME, PrimitiveType.STRING.getQname()); - PrismPropertyValue tagProp = (PrismPropertyValue) ExpressionUtil.evaluateExpression(variables, + PrismPropertyValue tagProp = ExpressionUtil.evaluateExpression(variables, outputDefinition, expressionType, MiscSchemaUtil.getExpressionProfile(), expressionFactory, shortDesc, task, parentResult); - if (tagProp == null) { - return null; - } - return tagProp.getRealValue(); + return getRealValue(tagProp); } - } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java index c14fabd2c42..8fa9d80349b 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java @@ -59,6 +59,7 @@ import javax.xml.namespace.QName; import java.util.*; +import static com.evolveum.midpoint.prism.PrismPropertyValue.getRealValue; import static com.evolveum.midpoint.schema.internals.InternalsConfig.consistencyChecks; /** @@ -321,10 +322,7 @@ private ObjectSynchronizationDiscriminatorType evaluateSyn .findPropertyDefinitionByElementName(new QName(SchemaConstants.NS_C, "objectSynchronizationDiscriminator")); PrismPropertyValue evaluateDiscriminator = ExpressionUtil.evaluateExpression(variables, discriminatorDef, classificationExpression, syncCtx.getExpressionProfile(), expressionFactory, desc, task, result); - if (evaluateDiscriminator == null) { - return null; - } - return evaluateDiscriminator.getValue(); + return getRealValue(evaluateDiscriminator); } finally { ModelExpressionThreadLocalHolder.popExpressionEnvironment(); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceUtils.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceUtils.java index 467672755f9..4c86b48aeb1 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceUtils.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceUtils.java @@ -1,109 +1,104 @@ -/* - * Copyright (c) 2010-2019 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.model.impl.sync; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.schema.result.OperationResult; -import org.apache.commons.lang.Validate; - -import com.evolveum.midpoint.common.SynchronizationUtils; -import com.evolveum.midpoint.model.common.expression.ExpressionEnvironment; -import com.evolveum.midpoint.model.common.expression.ModelExpressionThreadLocalHolder; -import com.evolveum.midpoint.model.impl.util.ModelImplUtils; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; -import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; -import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSynchronizationDiscriminatorType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSynchronizationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; - -public class SynchronizationServiceUtils { - - private static final Trace LOGGER = TraceManager.getTrace(SynchronizationServiceUtils.class); - - public static boolean isPolicyApplicable(ObjectSynchronizationType synchronizationPolicy, - ObjectSynchronizationDiscriminatorType discriminator, ExpressionFactory expressionFactory, - SynchronizationContext syncCtx, OperationResult result) throws SchemaException, ExpressionEvaluationException, - ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { - - boolean isApplicablePolicy; - if (discriminator != null) { - isApplicablePolicy = isPolicyApplicable(discriminator, synchronizationPolicy, syncCtx.getResource()); - } else { - isApplicablePolicy = isPolicyApplicable(synchronizationPolicy, syncCtx); - } - - if (isApplicablePolicy) { - Boolean conditionResult = evaluateSynchronizationPolicyCondition(synchronizationPolicy, syncCtx, expressionFactory, result); - return conditionResult != null ? conditionResult : true; - } else { - return false; - } - } - - private static boolean isPolicyApplicable(ObjectSynchronizationType synchronizationPolicy, SynchronizationContext syncCtx) - throws SchemaException { - ShadowType currentShadowType = syncCtx.getApplicableShadow().asObjectable(); - - // objectClass - QName shadowObjectClass = currentShadowType.getObjectClass(); - Validate.notNull(shadowObjectClass, "No objectClass in currentShadow"); - - return SynchronizationUtils.isPolicyApplicable(shadowObjectClass, currentShadowType.getKind(), currentShadowType.getIntent(), synchronizationPolicy, syncCtx.getResource()); - - } - - private static boolean isPolicyApplicable(ObjectSynchronizationDiscriminatorType synchronizationDiscriminator, - ObjectSynchronizationType synchronizationPolicy, PrismObject resource) - throws SchemaException { - ShadowKindType kind = synchronizationDiscriminator.getKind(); - String intent = synchronizationDiscriminator.getIntent(); - if (kind == null && intent == null) { - throw new SchemaException( - "Illegal state, object synchronization discriminator type must have kind/intent specified. Current values are: kind=" - + kind + ", intent=" + intent); - } - return SynchronizationUtils.isPolicyApplicable(null, kind, intent, synchronizationPolicy, resource); - } - - private static Boolean evaluateSynchronizationPolicyCondition( - ObjectSynchronizationType synchronizationPolicy, SynchronizationContext syncCtx, - ExpressionFactory expressionFactory, OperationResult result) - throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, - ConfigurationException, SecurityViolationException { - if (synchronizationPolicy.getCondition() == null) { - return null; - } - ExpressionType conditionExpressionType = synchronizationPolicy.getCondition(); - String desc = "condition in object synchronization " + synchronizationPolicy.getName(); - ExpressionVariables variables = ModelImplUtils.getDefaultExpressionVariables(null, syncCtx.getApplicableShadow(), null, - syncCtx.getResource(), syncCtx.getSystemConfiguration(), null, syncCtx.getPrismContext()); - try { - ModelExpressionThreadLocalHolder.pushExpressionEnvironment(new ExpressionEnvironment<>(syncCtx.getTask(), result)); - PrismPropertyValue evaluateCondition = ExpressionUtil.evaluateCondition(variables, - conditionExpressionType, syncCtx.getExpressionProfile(), expressionFactory, desc, syncCtx.getTask(), result); - return evaluateCondition.getValue(); - } finally { - ModelExpressionThreadLocalHolder.popExpressionEnvironment(); - } - } -} +/* + * Copyright (c) 2010-2019 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.model.impl.sync; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.schema.result.OperationResult; +import org.apache.commons.lang.Validate; + +import com.evolveum.midpoint.common.SynchronizationUtils; +import com.evolveum.midpoint.model.common.expression.ExpressionEnvironment; +import com.evolveum.midpoint.model.common.expression.ModelExpressionThreadLocalHolder; +import com.evolveum.midpoint.model.impl.util.ModelImplUtils; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; +import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; +import com.evolveum.midpoint.util.exception.CommunicationException; +import com.evolveum.midpoint.util.exception.ConfigurationException; +import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSynchronizationDiscriminatorType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSynchronizationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; + +public class SynchronizationServiceUtils { + + private static final Trace LOGGER = TraceManager.getTrace(SynchronizationServiceUtils.class); + + public static boolean isPolicyApplicable(ObjectSynchronizationType synchronizationPolicy, + ObjectSynchronizationDiscriminatorType discriminator, ExpressionFactory expressionFactory, + SynchronizationContext syncCtx, OperationResult result) throws SchemaException, ExpressionEvaluationException, + ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { + + boolean isApplicablePolicy; + if (discriminator != null) { + isApplicablePolicy = isPolicyApplicable(discriminator, synchronizationPolicy, syncCtx.getResource()); + } else { + isApplicablePolicy = isPolicyApplicable(synchronizationPolicy, syncCtx); + } + + return isApplicablePolicy && + evaluateSynchronizationPolicyCondition(synchronizationPolicy, syncCtx, expressionFactory, result); + } + + private static boolean isPolicyApplicable(ObjectSynchronizationType synchronizationPolicy, SynchronizationContext syncCtx) + throws SchemaException { + ShadowType currentShadowType = syncCtx.getApplicableShadow().asObjectable(); + + // objectClass + QName shadowObjectClass = currentShadowType.getObjectClass(); + Validate.notNull(shadowObjectClass, "No objectClass in currentShadow"); + + return SynchronizationUtils.isPolicyApplicable(shadowObjectClass, currentShadowType.getKind(), currentShadowType.getIntent(), synchronizationPolicy, syncCtx.getResource()); + + } + + private static boolean isPolicyApplicable(ObjectSynchronizationDiscriminatorType synchronizationDiscriminator, + ObjectSynchronizationType synchronizationPolicy, PrismObject resource) + throws SchemaException { + ShadowKindType kind = synchronizationDiscriminator.getKind(); + String intent = synchronizationDiscriminator.getIntent(); + if (kind == null && intent == null) { + throw new SchemaException( + "Illegal state, object synchronization discriminator type must have kind/intent specified. Current values are: kind=" + + kind + ", intent=" + intent); + } + return SynchronizationUtils.isPolicyApplicable(null, kind, intent, synchronizationPolicy, resource); + } + + private static boolean evaluateSynchronizationPolicyCondition( + ObjectSynchronizationType synchronizationPolicy, SynchronizationContext syncCtx, + ExpressionFactory expressionFactory, OperationResult result) + throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, + ConfigurationException, SecurityViolationException { + if (synchronizationPolicy.getCondition() == null) { + return true; + } + ExpressionType conditionExpressionBean = synchronizationPolicy.getCondition(); + String desc = "condition in object synchronization " + synchronizationPolicy.getName(); + ExpressionVariables variables = ModelImplUtils.getDefaultExpressionVariables(null, syncCtx.getApplicableShadow(), null, + syncCtx.getResource(), syncCtx.getSystemConfiguration(), null, syncCtx.getPrismContext()); + try { + ModelExpressionThreadLocalHolder.pushExpressionEnvironment(new ExpressionEnvironment<>(syncCtx.getTask(), result)); + return ExpressionUtil.evaluateConditionDefaultTrue(variables, + conditionExpressionBean, syncCtx.getExpressionProfile(), expressionFactory, desc, syncCtx.getTask(), result); + } finally { + ModelExpressionThreadLocalHolder.popExpressionEnvironment(); + } + } +} diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/TransportUtil.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/TransportUtil.java index c26cafdb0cd..1a604a223ab 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/TransportUtil.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/TransportUtil.java @@ -87,14 +87,14 @@ public static String formatToFileOld(Message message) { return "============================================ " + "\n" +new Date() + "\n" + message.toString() + "\n\n"; } - public static String formatToFileNew(Message message, String transport) { + static String formatToFileNew(Message message, String transport) { return "================ " + new Date() + " ======= [" + transport + "]\n" + message.debugDump() + "\n\n"; } - public static boolean isRecipientAllowed(String recipient, NotificationTransportConfigurationType transportConfigurationType, + private static boolean isRecipientAllowed(String recipient, NotificationTransportConfigurationType transportConfigurationType, Task task, OperationResult result, ExpressionFactory expressionFactory, ExpressionProfile expressionProfile, Trace logger) { if (optionsForFilteringRecipient(transportConfigurationType) > 1) { - throw new IllegalArgumentException("Couln't use more as one choise from 'blackList', 'whiteList' and 'recipientFilterExpression'"); + throw new IllegalArgumentException("Couldn't use more than one choice from 'blackList', 'whiteList' and 'recipientFilterExpression'"); } ExpressionType filter = transportConfigurationType.getRecipientFilterExpression(); if (filter != null) { @@ -103,7 +103,7 @@ public static boolean isRecipientAllowed(String recipient, NotificationTransport try { PrismPropertyValue allowedRecipient = ExpressionUtil.evaluateCondition(variables, filter, expressionProfile, expressionFactory, "Recipient filter", task, result); - if(allowedRecipient == null) { + if (allowedRecipient == null || allowedRecipient.getValue() == null) { throw new IllegalArgumentException("Return value from expresion for filtering recipient is null"); } return allowedRecipient.getValue(); @@ -134,19 +134,19 @@ public static boolean isRecipientAllowed(String recipient, NotificationTransport return true; } - public static int optionsForFilteringRecipient( + static int optionsForFilteringRecipient( NotificationTransportConfigurationType transportConfigurationType) { - int choises = 0; + int choices = 0; if (transportConfigurationType.getRecipientFilterExpression() != null) { - choises++; + choices++; } if (!transportConfigurationType.getBlackList().isEmpty()) { - choises++; + choices++; } if (!transportConfigurationType.getWhiteList().isEmpty()) { - choises++; + choices++; } - return choises; + return choices; } public static void validateRecipient(List allowedRecipient, List forbiddenRecipient, List recipients, diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ExpressionEvaluationHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ExpressionEvaluationHelper.java index 36b60539dfb..a20cb9a067e 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ExpressionEvaluationHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ExpressionEvaluationHelper.java @@ -1,122 +1,122 @@ -/* - * Copyright (c) 2010-2017 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ - -package com.evolveum.midpoint.wf.impl.processes.common; - -import com.evolveum.midpoint.model.common.expression.ModelExpressionThreadLocalHolder; -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; -import com.evolveum.midpoint.prism.path.ItemName; -import com.evolveum.midpoint.repo.common.expression.*; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -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.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; -import org.jetbrains.annotations.NotNull; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.xml.namespace.QName; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.function.Function; - -/** - * @author mederly - */ -@Component -public class ExpressionEvaluationHelper { - - @Autowired private ExpressionFactory expressionFactory; - @Autowired private PrismContext prismContext; - - public List evaluateRefExpressions(List expressions, - ExpressionVariables variables, String contextDescription, - Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException { - List retval = new ArrayList<>(); - for (ExpressionType expression : expressions) { - retval.addAll(evaluateRefExpression(expression, variables, contextDescription, task, result)); - } - return retval; - } - - public List evaluateRefExpression(ExpressionType expressionType, ExpressionVariables variables, - String contextDescription, Task task, OperationResult result) - throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { - return evaluateExpression(expressionType, variables, contextDescription, ObjectReferenceType.class, - ObjectReferenceType.COMPLEX_TYPE, false, ExpressionUtil.createRefConvertor(UserType.COMPLEX_TYPE), task, result); - } - - @SuppressWarnings("unchecked") - @NotNull - public List evaluateExpression(ExpressionType expressionType, ExpressionVariables variables, - String contextDescription, Class clazz, QName typeName, - boolean multiValued, Function additionalConvertor, Task task, - OperationResult result) - throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { - MutableItemDefinition resultDef; - ItemName resultName = new ItemName(SchemaConstants.NS_C, "result"); - if (QNameUtil.match(typeName, ObjectReferenceType.COMPLEX_TYPE)) { - resultDef = prismContext.definitionFactory().createReferenceDefinition(resultName, typeName); - } else { - resultDef = prismContext.definitionFactory().createPropertyDefinition(resultName, typeName); - } - if (multiValued) { - resultDef.setMaxOccurs(-1); - } - Expression expression = expressionFactory.makeExpression(expressionType, resultDef, MiscSchemaUtil.getExpressionProfile(), contextDescription, task, result); - ExpressionEvaluationContext context = new ExpressionEvaluationContext(null, variables, contextDescription, task); - context.setAdditionalConvertor(additionalConvertor); - PrismValueDeltaSetTriple exprResultTriple = ModelExpressionThreadLocalHolder - .evaluateAnyExpressionInContext(expression, context, task, result); - List list = new ArrayList<>(); - for (PrismValue pv : exprResultTriple.getZeroSet()) { - T realValue; - if (pv instanceof PrismReferenceValue) { - // pv.getRealValue sometimes returns synthesized Referencable, not ObjectReferenceType - // If we would stay with that we would need to make many changes throughout workflow module. - // So it is safer to stay with ObjectReferenceType. - ObjectReferenceType ort = new ObjectReferenceType(); - ort.setupReferenceValue((PrismReferenceValue) pv); - realValue = (T) ort; - } else { - realValue = pv.getRealValue(); - } - list.add(realValue); - } - return list; - } - - public boolean evaluateBooleanExpression(ExpressionType expressionType, ExpressionVariables expressionVariables, - String contextDescription, Task task, OperationResult result) - throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { - Collection values = evaluateExpression(expressionType, expressionVariables, contextDescription, - Boolean.class, DOMUtil.XSD_BOOLEAN, false, null, task, result); - return MiscUtil.getSingleValue(values, false, contextDescription); - } - - public String evaluateStringExpression(ExpressionType expressionType, ExpressionVariables expressionVariables, - String contextDescription, Task task, OperationResult result) - throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { - Collection values = evaluateExpression(expressionType, expressionVariables, contextDescription, - String.class, DOMUtil.XSD_STRING, false, null, task, result); - return MiscUtil.getSingleValue(values, null, contextDescription); - } -} +/* + * Copyright (c) 2010-2017 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.wf.impl.processes.common; + +import com.evolveum.midpoint.model.common.expression.ModelExpressionThreadLocalHolder; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; +import com.evolveum.midpoint.prism.path.ItemName; +import com.evolveum.midpoint.repo.common.expression.*; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; +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.exception.CommunicationException; +import com.evolveum.midpoint.util.exception.ConfigurationException; +import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; + +/** + * @author mederly + */ +@Component +public class ExpressionEvaluationHelper { + + @Autowired private ExpressionFactory expressionFactory; + @Autowired private PrismContext prismContext; + + List evaluateRefExpressions(List expressions, + ExpressionVariables variables, String contextDescription, + Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException { + List retval = new ArrayList<>(); + for (ExpressionType expression : expressions) { + retval.addAll(evaluateRefExpression(expression, variables, contextDescription, task, result)); + } + return retval; + } + + private List evaluateRefExpression(ExpressionType expressionType, ExpressionVariables variables, + String contextDescription, Task task, OperationResult result) + throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { + return evaluateExpression(expressionType, variables, contextDescription, ObjectReferenceType.class, + ObjectReferenceType.COMPLEX_TYPE, false, ExpressionUtil.createRefConvertor(UserType.COMPLEX_TYPE), task, result); + } + + @SuppressWarnings("unchecked") + @NotNull + public List evaluateExpression(ExpressionType expressionType, ExpressionVariables variables, + String contextDescription, Class clazz, QName typeName, + boolean multiValued, Function additionalConvertor, Task task, + OperationResult result) + throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { + MutableItemDefinition resultDef; + ItemName resultName = new ItemName(SchemaConstants.NS_C, "result"); + if (QNameUtil.match(typeName, ObjectReferenceType.COMPLEX_TYPE)) { + resultDef = prismContext.definitionFactory().createReferenceDefinition(resultName, typeName); + } else { + resultDef = prismContext.definitionFactory().createPropertyDefinition(resultName, typeName); + } + if (multiValued) { + resultDef.setMaxOccurs(-1); + } + Expression expression = expressionFactory.makeExpression(expressionType, resultDef, MiscSchemaUtil.getExpressionProfile(), contextDescription, task, result); + ExpressionEvaluationContext context = new ExpressionEvaluationContext(null, variables, contextDescription, task); + context.setAdditionalConvertor(additionalConvertor); + PrismValueDeltaSetTriple exprResultTriple = ModelExpressionThreadLocalHolder + .evaluateAnyExpressionInContext(expression, context, task, result); + List list = new ArrayList<>(); + for (PrismValue pv : exprResultTriple.getZeroSet()) { + T realValue; + if (pv instanceof PrismReferenceValue) { + // pv.getRealValue sometimes returns synthesized Referencable, not ObjectReferenceType + // If we would stay with that we would need to make many changes throughout workflow module. + // So it is safer to stay with ObjectReferenceType. + ObjectReferenceType ort = new ObjectReferenceType(); + ort.setupReferenceValue((PrismReferenceValue) pv); + realValue = (T) ort; + } else { + realValue = pv.getRealValue(); + } + list.add(realValue); + } + return list; + } + + public boolean evaluateBooleanExpression(ExpressionType expressionType, ExpressionVariables expressionVariables, + String contextDescription, Task task, OperationResult result) + throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { + Collection values = evaluateExpression(expressionType, expressionVariables, contextDescription, + Boolean.class, DOMUtil.XSD_BOOLEAN, false, null, task, result); + return MiscUtil.getSingleValue(values, false, contextDescription); + } + + public String evaluateStringExpression(ExpressionType expressionType, ExpressionVariables expressionVariables, + String contextDescription, Task task, OperationResult result) + throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { + Collection values = evaluateExpression(expressionType, expressionVariables, contextDescription, + String.class, DOMUtil.XSD_STRING, false, null, task, result); + return MiscUtil.getSingleValue(values, null, contextDescription); + } +} diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/PerformerCommentsFormatterImpl.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/PerformerCommentsFormatterImpl.java index a9675b20318..28105e56346 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/PerformerCommentsFormatterImpl.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/PerformerCommentsFormatterImpl.java @@ -26,9 +26,6 @@ import java.util.HashMap; import java.util.Map; -/** - * @author mederly - */ public class PerformerCommentsFormatterImpl implements PerformerCommentsFormatter { private static final Trace LOGGER = TraceManager.getTrace(PerformerCommentsFormatterImpl.class); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/UcfExpressionEvaluatorImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/UcfExpressionEvaluatorImpl.java index 81bca28e091..4037f9f6aba 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/UcfExpressionEvaluatorImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/UcfExpressionEvaluatorImpl.java @@ -19,7 +19,6 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.task.api.TaskManager; import com.evolveum.midpoint.util.annotation.Experimental; import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; @@ -32,7 +31,7 @@ import java.util.List; /** - * + * Expression evaluator that is provided to lower-level components in UCF layer. */ @Component @Experimental @@ -41,7 +40,6 @@ public class UcfExpressionEvaluatorImpl implements UcfExpressionEvaluator { private static final String OP_EVALUATE = UcfExpressionEvaluatorImpl.class.getName() + ".evaluate"; @Autowired private ExpressionFactory expressionFactory; - @Autowired private TaskManager taskManager; @NotNull @Override diff --git a/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/UcfExpressionEvaluator.java b/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/UcfExpressionEvaluator.java index baf9c0908ed..833e43c153c 100644 --- a/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/UcfExpressionEvaluator.java +++ b/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/UcfExpressionEvaluator.java @@ -18,7 +18,7 @@ import java.util.List; /** - * + * Expression evaluator that is provided to lower-level components in UCF layer. */ @Experimental public interface UcfExpressionEvaluator { diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionUtil.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionUtil.java index df33a4b1059..c3239346135 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionUtil.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionUtil.java @@ -711,12 +711,9 @@ private static V evaluateExpression(ExpressionVariables v DOMUtil.XSD_STRING); } + //noinspection unchecked return (V) evaluateExpression(variables, outputDefinition, expressionType, expressionProfile, expressionFactory, shortDesc, task, parentResult); - - // String expressionResult = - // expressionHandler.evaluateExpression(currentShadow, valueExpression, - // shortDesc, result); } public static V evaluateExpression(Collection> sources, @@ -795,10 +792,49 @@ public static PrismPropertyValue evaluateCondition(ExpressionVariables throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { ItemDefinition outputDefinition = expressionFactory.getPrismContext().definitionFactory().createPropertyDefinition( ExpressionConstants.OUTPUT_ELEMENT_NAME, DOMUtil.XSD_BOOLEAN); + //noinspection unchecked return (PrismPropertyValue) evaluateExpression(variables, outputDefinition, expressionType, expressionProfile, expressionFactory, shortDesc, task, parentResult); } + public static boolean evaluateConditionDefaultTrue(ExpressionVariables variables, + ExpressionType expressionBean, ExpressionProfile expressionProfile, ExpressionFactory expressionFactory, + String shortDesc, Task task, OperationResult parentResult) + throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, + ConfigurationException, SecurityViolationException { + return evaluateConditionWithDefault(variables, expressionBean, expressionProfile, expressionFactory, shortDesc, + true, task, parentResult); + } + + public static boolean evaluateConditionDefaultFalse(ExpressionVariables variables, + ExpressionType expressionBean, ExpressionProfile expressionProfile, ExpressionFactory expressionFactory, + String shortDesc, Task task, OperationResult parentResult) + throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, + ConfigurationException, SecurityViolationException { + return evaluateConditionWithDefault(variables, expressionBean, expressionProfile, expressionFactory, shortDesc, + false, task, parentResult); + } + + private static boolean evaluateConditionWithDefault(ExpressionVariables variables, + ExpressionType expressionBean, ExpressionProfile expressionProfile, ExpressionFactory expressionFactory, String shortDesc, + boolean defaultValue, Task task, OperationResult parentResult) + throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { + if (expressionBean == null) { + return defaultValue; + } + PrismPropertyValue booleanPropertyValue = evaluateCondition(variables, expressionBean, expressionProfile, + expressionFactory, shortDesc, task, parentResult); + if (booleanPropertyValue == null) { + return defaultValue; + } + Boolean realValue = booleanPropertyValue.getRealValue(); + if (realValue == null) { + return defaultValue; + } else { + return realValue; + } + } + public static boolean getBooleanConditionOutput(PrismPropertyValue conditionOutput) { if (conditionOutput == null) { return false;