From a420c4153d3804e347c92049ca683d8b6db6d8fe Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Thu, 12 Mar 2020 23:35:50 +0100 Subject: [PATCH] fix for MID-6036 (cherry picked from commit cd64620ab321839c4d53e2a3fa5aa6b0dbd271a0) --- .../web/util/ExpressionValidator.java | 287 +++++++++--------- 1 file changed, 139 insertions(+), 148 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionValidator.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionValidator.java index 679029f1823..55e2f6bbc33 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionValidator.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionValidator.java @@ -1,148 +1,139 @@ -/* - * 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.web.util; - -import java.util.Collection; - -import com.evolveum.midpoint.prism.PrismContext; - -import org.apache.wicket.model.IModel; -import org.apache.wicket.validation.INullAcceptingValidator; -import org.apache.wicket.validation.IValidatable; -import org.apache.wicket.validation.ValidationError; - -import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; -import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; -import com.evolveum.midpoint.repo.common.expression.Expression; -import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; -import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; -import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; -import com.evolveum.midpoint.schema.constants.ExpressionConstants; -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.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.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; - -public class ExpressionValidator implements INullAcceptingValidator { - - private static final long serialVersionUID = 1L; - -// private InputPanel inputPanel; - private IModel expressionTypeModel; - private ModelServiceLocator serviceLocator; -// private T realValue; - - private static final String OPERATION_EVALUATE_EXPRESSION = ExpressionValidator.class.getName() + ".evaluateValidationExpression"; - - public ExpressionValidator(IModel expressionType, ModelServiceLocator serviceLocator) { -// this.inputPanel = inputPanel; - this.expressionTypeModel = expressionType; - this.serviceLocator = serviceLocator; -// this.realValue = realValue; - } - - - - @Override - public void validate(IValidatable validatable) { - ExpressionType expressionType = expressionTypeModel.getObject(); - - if (expressionType == null) { - return; - } - - PrismContext prismContext = serviceLocator.getPrismContext(); - Object valueToValidate = getValueToValidate(validatable); - String contextDesc = " form component expression validation "; - PrismPropertyDefinition outputDefinition = prismContext.definitionFactory().createPropertyDefinition(ExpressionConstants.OUTPUT_ELEMENT_NAME, - OperationResultType.COMPLEX_TYPE); - Task task = serviceLocator.createSimpleTask(OPERATION_EVALUATE_EXPRESSION); - OperationResult result = new OperationResult(OPERATION_EVALUATE_EXPRESSION); - ExpressionFactory expressionFactory = serviceLocator.getExpressionFactory(); - Expression, PrismPropertyDefinition> expression; - try { - - expression = expressionFactory - .makeExpression(expressionType, outputDefinition, MiscSchemaUtil.getExpressionProfile(), contextDesc, task, result); - } catch (SchemaException | ObjectNotFoundException | SecurityViolationException e) { - ValidationError error = new ValidationError(); - error.setMessage("Cannot make expression: " + e.getMessage()); - validatable.error(error); -// form.error("Cannot make expression: " + e.getMessage()); - return; - } - ExpressionVariables variables = new ExpressionVariables(); - if (valueToValidate != null) { - variables.put(ExpressionConstants.VAR_INPUT, valueToValidate, valueToValidate.getClass()); - } - variables.putObject(ExpressionConstants.VAR_OBJECT, (ObjectType)getObjectType(), ObjectType.class); -// addAdditionalExpressionVariables(variables); - ExpressionEvaluationContext context = new ExpressionEvaluationContext(null, variables, contextDesc, task); - PrismValueDeltaSetTriple> outputTriple; - try { - outputTriple = expression.evaluate(context, result); - } catch (SchemaException | ExpressionEvaluationException | ObjectNotFoundException | CommunicationException - | ConfigurationException | SecurityViolationException e) { - ValidationError error = new ValidationError(); - error.setMessage("Cannot evaluate expression: " + e.getMessage()); - validatable.error(error); -// form.error("Cannot evaluate expression: " + e.getMessage()); - return; - } - if (outputTriple == null) { - return; - } - Collection> outputValues = outputTriple.getNonNegativeValues(); - if (outputValues.isEmpty()) { - return; - } - if (outputValues.size() > 1) { - ValidationError error = new ValidationError(); - error.setMessage("Expression "+contextDesc+" produced more than one value"); - validatable.error(error); -// form.error("Expression "+contextDesc+" produced more than one value"); - } - - OperationResultType operationResultType = outputValues.iterator().next().getRealValue(); - - if (operationResultType == null) { - return; - } - - OperationResult returnResult = OperationResult.createOperationResult(operationResultType); - if (!returnResult.isSuccess()) { - ValidationError error = new ValidationError(); - if (returnResult.getUserFriendlyMessage() != null) { - error.setMessage(WebModelServiceUtils.translateMessage(returnResult, serviceLocator)); - } else { - error.setMessage(returnResult.getMessage()); - } - validatable.error(error); - } - - } - - protected O getObjectType() { - return null; - } - - protected Object getValueToValidate(IValidatable validatable) { - return validatable.getValue(); - } - -} +/* + * 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.web.util; + +import java.util.Collection; + +import com.evolveum.midpoint.prism.PrismContext; + +import org.apache.wicket.model.IModel; +import org.apache.wicket.validation.INullAcceptingValidator; +import org.apache.wicket.validation.IValidatable; +import org.apache.wicket.validation.ValidationError; + +import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; +import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; +import com.evolveum.midpoint.repo.common.expression.Expression; +import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; +import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; +import com.evolveum.midpoint.schema.constants.ExpressionConstants; +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.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.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; + +public class ExpressionValidator implements INullAcceptingValidator { + + private static final long serialVersionUID = 1L; + + private IModel expressionTypeModel; + private ModelServiceLocator serviceLocator; + + private static final String OPERATION_EVALUATE_EXPRESSION = ExpressionValidator.class.getName() + ".evaluateValidationExpression"; + + public ExpressionValidator(IModel expressionType, ModelServiceLocator serviceLocator) { + this.expressionTypeModel = expressionType; + this.serviceLocator = serviceLocator; + } + + + + @Override + public void validate(IValidatable validatable) { + ExpressionType expressionType = expressionTypeModel.getObject(); + + if (expressionType == null) { + return; + } + + PrismContext prismContext = serviceLocator.getPrismContext(); + Object valueToValidate = getValueToValidate(validatable); + String contextDesc = " form component expression validation "; + PrismPropertyDefinition outputDefinition = prismContext.definitionFactory().createPropertyDefinition(ExpressionConstants.OUTPUT_ELEMENT_NAME, + OperationResultType.COMPLEX_TYPE); + Task task = serviceLocator.createSimpleTask(OPERATION_EVALUATE_EXPRESSION); + OperationResult result = new OperationResult(OPERATION_EVALUATE_EXPRESSION); + ExpressionFactory expressionFactory = serviceLocator.getExpressionFactory(); + Expression, PrismPropertyDefinition> expression; + try { + + expression = expressionFactory + .makeExpression(expressionType, outputDefinition, MiscSchemaUtil.getExpressionProfile(), contextDesc, task, result); + } catch (SchemaException | ObjectNotFoundException | SecurityViolationException e) { + ValidationError error = new ValidationError(); + error.setMessage("Cannot make expression: " + e.getMessage()); + validatable.error(error); + return; + } + ExpressionVariables variables = new ExpressionVariables(); + Class typeClass = (valueToValidate == null ? String.class : valueToValidate.getClass()); + variables.put(ExpressionConstants.VAR_INPUT, valueToValidate, typeClass); + variables.putObject(ExpressionConstants.VAR_OBJECT, (ObjectType)getObjectType(), ObjectType.class); + ExpressionEvaluationContext context = new ExpressionEvaluationContext(null, variables, contextDesc, task); + PrismValueDeltaSetTriple> outputTriple; + try { + outputTriple = expression.evaluate(context, result); + } catch (SchemaException | ExpressionEvaluationException | ObjectNotFoundException | CommunicationException + | ConfigurationException | SecurityViolationException e) { + ValidationError error = new ValidationError(); + error.setMessage("Cannot evaluate expression: " + e.getMessage()); + validatable.error(error); + return; + } + if (outputTriple == null) { + return; + } + Collection> outputValues = outputTriple.getNonNegativeValues(); + if (outputValues.isEmpty()) { + return; + } + if (outputValues.size() > 1) { + ValidationError error = new ValidationError(); + error.setMessage("Expression "+contextDesc+" produced more than one value"); + validatable.error(error); + } + + OperationResultType operationResultType = outputValues.iterator().next().getRealValue(); + + if (operationResultType == null) { + return; + } + + OperationResult returnResult = OperationResult.createOperationResult(operationResultType); + if (!returnResult.isSuccess()) { + ValidationError error = new ValidationError(); + if (returnResult.getUserFriendlyMessage() != null) { + error.setMessage(WebModelServiceUtils.translateMessage(returnResult, serviceLocator)); + } else { + error.setMessage(returnResult.getMessage()); + } + validatable.error(error); + } + + } + + protected O getObjectType() { + return null; + } + + protected Object getValueToValidate(IValidatable validatable) { + return validatable.getValue(); + } + +}