diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java index 1a767e87bf0..c4a3209f51e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.schema.*; 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.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.CommonException; @@ -518,7 +519,7 @@ private void updateRequestWithMidpointQuery(RepositoryQueryDiagRequest request, request.setType(clazz); ObjectQuery objectQuery = prismContext.getQueryConverter().createObjectQuery(clazz, queryType); ObjectQuery queryWithExprEvaluated = ExpressionUtil.evaluateQueryExpressions(objectQuery, new ExpressionVariables(), - getExpressionFactory(), getPrismContext(), "evaluate query expressions", task, result); + MiscSchemaUtil.getExpressionProfile(), getExpressionFactory(), getPrismContext(), "evaluate query expressions", task, result); request.setQuery(queryWithExprEvaluated); Collection> options = distinct ? createCollection(createDistinct()) : null; diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractSearchExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractSearchExpressionEvaluator.java index 7e78070faea..a168cfb5a59 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractSearchExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractSearchExpressionEvaluator.java @@ -158,7 +158,7 @@ protected List transformSingleValue(ExpressionVariables variables, PlusMinusZ if (populateAssignmentType != null) { if (outputDefinition instanceof PrismContainerDefinition) { additionalAttributeDeltas = PopulatorUtil.computePopulateItemDeltas(populateAssignmentType, - (PrismContainerDefinition)outputDefinition, variables, expressionProfile, context, contextDescription, task, result); + (PrismContainerDefinition)outputDefinition, variables, context, contextDescription, task, result); } else { LOGGER.warn("Search expression {} applied to non-container target, ignoring populate definition", contextDescription); } @@ -389,7 +389,7 @@ private String createOnDemand(Class targetTypeClass, E } else { List> populateDeltas = PopulatorUtil.computePopulateItemDeltas(populateObject, - objectDefinition, variables, expressionProfile, params, contextDescription, task, result); + objectDefinition, variables, params, contextDescription, task, result); ItemDeltaCollectionsUtil.applyTo(populateDeltas, newObject); } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluatorFactory.java index 0d47d31dbb7..7897481b4c2 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluatorFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2017 Evolveum + * Copyright (c) 2014-2019 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import com.evolveum.midpoint.repo.common.expression.AbstractObjectResolvableExpressionEvaluatorFactory; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.SecurityContextManager; import com.evolveum.midpoint.task.api.Task; @@ -71,8 +72,12 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, ExpressionFactory factory, String contextDescription, Task task, OperationResult result) throws SchemaException { + public ExpressionEvaluator createEvaluator( + Collection> evaluatorElements, + D outputDefinition, + ExpressionProfile expressionProfile, + ExpressionFactory factory, + String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for assignmentTargetSearch expression evaluator"); @@ -92,7 +97,7 @@ public ExpressionEvaluator throw new SchemaException("assignment expression evaluator cannot handle elements of type " + evaluatorTypeObject.getClass().getName()+" in "+contextDescription); } AssignmentTargetSearchExpressionEvaluator expressionEvaluator = new AssignmentTargetSearchExpressionEvaluator((AssignmentTargetSearchExpressionEvaluatorType)evaluatorTypeObject, - (PrismContainerDefinition) outputDefinition, protector, getObjectResolver(), modelService, prismContext, securityContextManager, getLocalizationService()); + (PrismContainerDefinition) outputDefinition, expressionProfile, protector, getObjectResolver(), modelService, prismContext, securityContextManager, getLocalizationService()); return (ExpressionEvaluator) expressionEvaluator; } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluator.java index 4e7e05eb3e8..40b138f45df 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluator.java @@ -38,6 +38,7 @@ import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ExpressionConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.expression.TypedValue; import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; @@ -62,10 +63,10 @@ public class AssociationTargetSearchExpressionEvaluator private static final Trace LOGGER = TraceManager.getTrace(AssociationTargetSearchExpressionEvaluator.class); public AssociationTargetSearchExpressionEvaluator(SearchObjectExpressionEvaluatorType expressionEvaluatorType, - PrismContainerDefinition outputDefinition, Protector protector, ObjectResolver objectResolver, + PrismContainerDefinition outputDefinition, ExpressionProfile expressionProfile, Protector protector, ObjectResolver objectResolver, ModelService modelService, PrismContext prismContext, SecurityContextManager securityContextManager, LocalizationService localizationService) { - super(expressionEvaluatorType, outputDefinition, protector, objectResolver, modelService, prismContext, + super(expressionEvaluatorType, outputDefinition, expressionProfile, protector, objectResolver, modelService, prismContext, securityContextManager, localizationService); } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluatorFactory.java index b1af100816d..4809286b22c 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluatorFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2017 Evolveum + * Copyright (c) 2014-2019 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import com.evolveum.midpoint.repo.common.expression.AbstractObjectResolvableExpressionEvaluatorFactory; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.SecurityContextManager; import com.evolveum.midpoint.task.api.Task; @@ -70,8 +71,12 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, ExpressionFactory factory, String contextDescription, Task task, OperationResult result) throws SchemaException { + public ExpressionEvaluator createEvaluator( + Collection> evaluatorElements, + D outputDefinition, + ExpressionProfile expressionProfile, + ExpressionFactory factory, + String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for associationTargetSearch expression evaluator"); @@ -91,7 +96,7 @@ public ExpressionEvaluator throw new SchemaException("Association expression evaluator cannot handle elements of type " + evaluatorTypeObject.getClass().getName()+" in "+contextDescription); } AssociationTargetSearchExpressionEvaluator evaluator = new AssociationTargetSearchExpressionEvaluator((SearchObjectExpressionEvaluatorType)evaluatorTypeObject, - (PrismContainerDefinition) outputDefinition, protector, getObjectResolver(), modelService, prismContext, securityContextManager, getLocalizationService()); + (PrismContainerDefinition) outputDefinition, expressionProfile, protector, getObjectResolver(), modelService, prismContext, securityContextManager, getLocalizationService()); return (ExpressionEvaluator) evaluator; } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ConstExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ConstExpressionEvaluatorFactory.java index 26e64220203..96f3f3ce530 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ConstExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ConstExpressionEvaluatorFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2017 Evolveum + * Copyright (c) 2010-2019 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,7 @@ import com.evolveum.midpoint.repo.common.expression.AbstractAutowiredExpressionEvaluatorFactory; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; @@ -73,8 +74,12 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement, com.evolveum.midpoint.prism.PrismContext) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, ExpressionFactory factory, String contextDescription, Task task, OperationResult result) + public ExpressionEvaluator createEvaluator( + Collection> evaluatorElements, + D outputDefinition, + ExpressionProfile expressionProfile, + ExpressionFactory factory, + String contextDescription, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { Validate.notNull(outputDefinition, "output definition must be specified for 'generate' expression evaluator"); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/FunctionExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/FunctionExpressionEvaluator.java index a6e76c77cab..6667367a988 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/FunctionExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/FunctionExpressionEvaluator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2017 Evolveum + * Copyright (c) 2010-2019 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.task.api.Task; @@ -111,6 +112,8 @@ public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context) throw new ObjectNotFoundException("No functions defined in referenced function library: " + functionLibraryType); } + // TODO: this has to be determined from the library archetype + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); String functionName = functionEvaluatorType.getName(); @@ -154,7 +157,7 @@ public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context) try { variableResult.addArbitraryObjectAsParam("valueExpression", valueExpression); D variableOutputDefinition = determineVariableOutputDefinition(functionToExecute, param.getName(), context); - ExpressionUtil.evaluateExpression(originVariables, variableOutputDefinition, valueExpression, context.getExpressionFactory(), "resolve variable", task, variableResult); + ExpressionUtil.evaluateExpression(originVariables, variableOutputDefinition, valueExpression, expressionProfile, context.getExpressionFactory(), "resolve variable", task, variableResult); variableResult.recordSuccess(); } catch (SchemaException | ExpressionEvaluationException | ObjectNotFoundException | CommunicationException | ConfigurationException | SecurityViolationException e) { diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluatorFactory.java index 3c631f2dd73..e3884e23801 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluatorFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2017 Evolveum + * Copyright (c) 2010-2019 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ import com.evolveum.midpoint.repo.common.expression.AbstractObjectResolvableExpressionEvaluatorFactory; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory; @@ -61,8 +62,12 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement, com.evolveum.midpoint.prism.ItemDefinition, com.evolveum.midpoint.prism.PrismContext) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, ExpressionFactory factory, String contextDescription, Task task, OperationResult result) throws SchemaException { + public ExpressionEvaluator createEvaluator( + Collection> evaluatorElements, + D outputDefinition, + ExpressionProfile expressionProfile, + ExpressionFactory factory, + String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for path expression evaluator"); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluator.java index 8aad7d9d40a..fe4a4302325 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluator.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.repo.common.ObjectResolver; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.security.api.SecurityContextManager; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -42,10 +43,10 @@ public class ReferenceSearchExpressionEvaluator private static final Trace LOGGER = TraceManager.getTrace(ReferenceSearchExpressionEvaluator.class); public ReferenceSearchExpressionEvaluator(ReferenceSearchExpressionEvaluatorType expressionEvaluatorType, - PrismReferenceDefinition outputDefinition, Protector protector, ObjectResolver objectResolver, + PrismReferenceDefinition outputDefinition, ExpressionProfile expressionProfile, Protector protector, ObjectResolver objectResolver, ModelService modelService, PrismContext prismContext, SecurityContextManager securityContextManager, LocalizationService localizationService) { - super(expressionEvaluatorType, outputDefinition, protector, objectResolver, modelService, prismContext, securityContextManager, + super(expressionEvaluatorType, outputDefinition, expressionProfile, protector, objectResolver, modelService, prismContext, securityContextManager, localizationService); } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluatorFactory.java index d7aa2d04394..3b4d218ef02 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluatorFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2017 Evolveum + * Copyright (c) 2014-2019 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import com.evolveum.midpoint.repo.common.expression.AbstractObjectResolvableExpressionEvaluatorFactory; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.SecurityContextManager; import com.evolveum.midpoint.task.api.Task; @@ -69,8 +70,12 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, ExpressionFactory factory, String contextDescription, Task task, OperationResult result) throws SchemaException { + public ExpressionEvaluator createEvaluator( + Collection> evaluatorElements, + D outputDefinition, + ExpressionProfile expressionProfile, + ExpressionFactory factory, + String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for referenceSearch expression evaluator"); @@ -90,7 +95,7 @@ public ExpressionEvaluator throw new SchemaException("reference search expression evaluator cannot handle elements of type " + evaluatorTypeObject.getClass().getName()+" in "+contextDescription); } ReferenceSearchExpressionEvaluator expressionEvaluator = new ReferenceSearchExpressionEvaluator((ReferenceSearchExpressionEvaluatorType)evaluatorTypeObject, - (PrismReferenceDefinition) outputDefinition, protector, getObjectResolver(), modelService, prismContext, securityContextManager, getLocalizationService()); + (PrismReferenceDefinition) outputDefinition, expressionProfile, protector, getObjectResolver(), modelService, prismContext, securityContextManager, getLocalizationService()); return (ExpressionEvaluator) expressionEvaluator; } 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 204b1b2412c..81c7b88c52c 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 @@ -34,6 +34,7 @@ import com.evolveum.midpoint.prism.path.ItemName; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.util.LocalizationUtil; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.util.LocalizableMessageBuilder; import com.evolveum.midpoint.util.LocalizableMessageList; @@ -58,6 +59,7 @@ import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.task.api.Task; @@ -160,7 +162,9 @@ public String generate(ItemPath path, ValuePolicyType pol if (result.isError()) { throw new ExpressionEvaluationException(result.getMessage()); } - if (checkAttempt(generatedValue, policy, originResolver, shortDesc, task, result)) { + // TODO: this needs to be determined from ValuePolicyType archetype + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); + if (checkAttempt(generatedValue, policy, expressionProfile, originResolver, shortDesc, task, result)) { break; } LOGGER.trace("Generator attempt {}: check failed", attempt); @@ -211,7 +215,10 @@ public boolean validateValue(String newValue, ValuePolicy testMinimalUniqueCharacters(newValue, lims, result, messages); testProhibitedValues(newValue, pp.getProhibitedValues(), originResolver, shortDesc, task, result, messages); - testCheckExpression(newValue, lims, originResolver, shortDesc, task, result, messages); + + // TODO: this needs to be determined from ValuePolicyType archetype + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); + testCheckExpression(newValue, lims, expressionProfile, originResolver, shortDesc, task, result, messages); if (!lims.getLimit().isEmpty()) { // check limitation @@ -400,7 +407,7 @@ private void testInvalidCharacters(List valueCharacters, HashSet } private void testCheckExpression(String newPassword, LimitationsType lims, - AbstractValuePolicyOriginResolver originResolver, String shortDesc, Task task, OperationResult result, + ExpressionProfile expressionProfile, AbstractValuePolicyOriginResolver originResolver, String shortDesc, Task task, OperationResult result, List messages) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { for (CheckExpressionType checkExpression: lims.getCheckExpression()) { @@ -408,7 +415,7 @@ private void testCheckExpression(String newPassword, Limi if (expressionType == null) { return; } - if (!checkExpression(newPassword, expressionType, originResolver, shortDesc, task, result)) { + if (!checkExpression(newPassword, expressionType, expressionProfile, originResolver, shortDesc, task, result)) { LocalizableMessage msg; if (checkExpression.getLocalizableFailureMessage() != null) { msg = LocalizationUtil.toLocalizableMessage(checkExpression.getLocalizableFailureMessage()); @@ -737,13 +744,13 @@ private String generateAttempt(ValuePolicyType policy, int defaultLength, boolea return sb.toString(); } - private boolean checkAttempt(String generatedValue, ValuePolicyType policy, AbstractValuePolicyOriginResolver originResolver, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { + private boolean checkAttempt(String generatedValue, ValuePolicyType policy, ExpressionProfile expressionProfile, AbstractValuePolicyOriginResolver originResolver, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { StringPolicyType stringPolicy = policy.getStringPolicy(); if (stringPolicy != null) { LimitationsType limitationsType = stringPolicy.getLimitations(); if (limitationsType != null) { List checkExpressionTypes = limitationsType.getCheckExpression(); - if (!checkExpressions(generatedValue, checkExpressionTypes, originResolver, shortDesc, task, result)) { + if (!checkExpressions(generatedValue, checkExpressionTypes, expressionProfile, originResolver, shortDesc, task, result)) { LOGGER.trace("Check expression returned false for generated value in {}", shortDesc); return false; } @@ -757,10 +764,11 @@ private boolean checkAttempt(String generatedValue, Value return true; } - private boolean checkExpressions(String generatedValue, List checkExpressionTypes, AbstractValuePolicyOriginResolver originResolver, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { + private boolean checkExpressions(String generatedValue, List checkExpressionTypes, + ExpressionProfile expressionProfile, AbstractValuePolicyOriginResolver originResolver, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { for (CheckExpressionType checkExpressionType: checkExpressionTypes) { ExpressionType expression = checkExpressionType.getExpression(); - if (!checkExpression(generatedValue, expression, originResolver, shortDesc, task, result)) { + if (!checkExpression(generatedValue, expression, expressionProfile, originResolver, shortDesc, task, result)) { return false; } } @@ -768,7 +776,7 @@ private boolean checkExpressions(String generatedValue, L } private boolean checkExpression(String generatedValue, ExpressionType checkExpression, - AbstractValuePolicyOriginResolver originResolver, String shortDesc, Task task, OperationResult result) + ExpressionProfile expressionProfile, AbstractValuePolicyOriginResolver originResolver, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { ExpressionVariables variables = new ExpressionVariables(); @@ -790,7 +798,7 @@ private boolean checkExpression(String generatedValue, Ex } variables.addVariableDefinition(ExpressionConstants.VAR_OBJECT, object, objectDef); - PrismPropertyValue output = ExpressionUtil.evaluateCondition(variables, checkExpression, expressionFactory, shortDesc, task, result); + PrismPropertyValue output = ExpressionUtil.evaluateCondition(variables, checkExpression, expressionProfile, expressionFactory, shortDesc, task, result); return ExpressionUtil.getBooleanConditionOutput(output); } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/PopulatorUtil.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/PopulatorUtil.java index 4c3a8261a38..0d0de4929c5 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/PopulatorUtil.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/PopulatorUtil.java @@ -65,7 +65,7 @@ public class PopulatorUtil { public static List> computePopulateItemDeltas(PopulateType fromPopulate, PrismContainerDefinition targetContainerDefinition, ExpressionVariables variables, - ExpressionProfile expressionProfile, ExpressionEvaluationContext params, String contextDescription, Task task, OperationResult result) + ExpressionEvaluationContext params, String contextDescription, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { if (!(targetContainerDefinition instanceof PrismContainerDefinition)) { @@ -76,7 +76,7 @@ List> computePopulateItemDeltas(PopulateType fromPopulate, PrismC for (PopulateItemType populateItem: fromPopulate.getPopulateItem()) { - ItemDelta itemDelta = evaluatePopulateExpression(populateItem, variables, expressionProfile, params, + ItemDelta itemDelta = evaluatePopulateExpression(populateItem, variables, params, targetContainerDefinition, contextDescription, false, task, result); if (itemDelta != null) { deltas.add(itemDelta); @@ -88,7 +88,7 @@ List> computePopulateItemDeltas(PopulateType fromPopulate, PrismC } private static ItemDelta evaluatePopulateExpression(PopulateItemType populateItem, - ExpressionVariables variables, ExpressionProfile expressionProfile, ExpressionEvaluationContext params, PrismContainerDefinition targetContainerDefinition, + ExpressionVariables variables, ExpressionEvaluationContext params, PrismContainerDefinition targetContainerDefinition, String contextDescription, boolean evaluateMinus, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { ExpressionType expressionType = populateItem.getExpression(); if (expressionType == null) { @@ -116,7 +116,7 @@ private static expression = expressionFactory.makeExpression(expressionType, propOutputDefinition, expressionProfile, + Expression expression = expressionFactory.makeExpression(expressionType, propOutputDefinition, params.getExpressionProfile(), expressionDesc, task, result); ExpressionEvaluationContext context = new ExpressionEvaluationContext(null, variables, expressionDesc, task, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java index 7c7de88962f..5d389a29827 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.ObjectTypes; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.task.api.Task; @@ -53,18 +54,10 @@ @Component public class ExpressionHandler { - @Autowired(required = true) - @Qualifier("cacheRepositoryService") - private RepositoryService repositoryService; - - @Autowired(required = true) - private ExpressionFactory expressionFactory; - - @Autowired(required = true) - private ModelObjectResolver modelObjectResolver; - - @Autowired(required = true) - private PrismContext prismContext; + @Autowired @Qualifier("cacheRepositoryService") private RepositoryService repositoryService; + @Autowired private ExpressionFactory expressionFactory; + @Autowired private ModelObjectResolver modelObjectResolver; + @Autowired private PrismContext prismContext; public String evaluateExpression(ShadowType shadow, ExpressionType expressionType, String shortDesc, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException { @@ -110,8 +103,9 @@ public boolean evaluateConfirmationExpression(UserType user, ShadowType shadow, PrismPropertyDefinition outputDefinition = prismContext.definitionFactory().createPropertyDefinition(ExpressionConstants.OUTPUT_ELEMENT_NAME, DOMUtil.XSD_BOOLEAN); + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, - outputDefinition, shortDesc, task, result); + outputDefinition, expressionProfile, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, variables, shortDesc, task, result); PrismValueDeltaSetTriple> outputTriple = ModelExpressionThreadLocalHolder.evaluateExpressionInContext(expression, params, task, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/SequentialValueExpressionEvaluatorFactory.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/SequentialValueExpressionEvaluatorFactory.java index c82bd164872..3143e88472e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/SequentialValueExpressionEvaluatorFactory.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/SequentialValueExpressionEvaluatorFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2017 Evolveum + * Copyright (c) 2015-2019 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; @@ -58,8 +59,12 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement, com.evolveum.midpoint.prism.PrismContext) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, ExpressionFactory factory, String contextDescription, Task task, OperationResult result) + public ExpressionEvaluator createEvaluator( + Collection> evaluatorElements, + D outputDefinition, + ExpressionProfile expressionProfile, + ExpressionFactory factory, + String contextDescription, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { if (evaluatorElements.size() > 1) { 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 d8097e6fe5c..fb453a89137 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 @@ -55,10 +55,12 @@ import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.FocusTypeUtil; import com.evolveum.midpoint.schema.util.LifecycleUtil; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.security.api.Authorization; import com.evolveum.midpoint.task.api.Task; @@ -732,7 +734,9 @@ private List> resolveTargetsFromFilter(Cla } variables.addVariableDefinitions(getAssignmentEvaluationVariables()); ObjectFilter origFilter = prismContext.getQueryConverter().parseFilter(filter, targetClass); - ObjectFilter evaluatedFilter = ExpressionUtil.evaluateFilterExpressions(origFilter, variables, getMappingFactory().getExpressionFactory(), prismContext, " evaluating resource filter expression ", ctx.task, ctx.result); + // TODO: expression profile should be determined from the holding object archetype + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); + ObjectFilter evaluatedFilter = ExpressionUtil.evaluateFilterExpressions(origFilter, variables, expressionProfile, getMappingFactory().getExpressionFactory(), prismContext, " evaluating resource filter expression ", ctx.task, ctx.result); if (evaluatedFilter == null) { throw new SchemaException("The OID is null and filter could not be evaluated in assignment targetRef in "+segment.source); } 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 226bf072ff2..9c55c0a9c61 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 @@ -62,6 +62,7 @@ import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; @@ -1640,9 +1641,10 @@ private OperationProvisioningScript resource.asPrismObject(), context.getSystemConfiguration(), objectContext, prismContext); // Having delta in provisioning scripts may be very useful. E.g. the script can optimize execution of expensive operations. variables.put(ExpressionConstants.VAR_DELTA, projectionCtx.getDelta(), ObjectDelta.class); + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); ModelExpressionThreadLocalHolder.pushExpressionEnvironment(new ExpressionEnvironment<>(context, (LensProjectionContext) objectContext, task, result)); try { - return evaluateScript(resourceScripts, discr, operation, null, variables, context, objectContext, task, result); + return evaluateScript(resourceScripts, discr, operation, null, variables, expressionProfile, context, objectContext, task, result); } finally { ModelExpressionThreadLocalHolder.popExpressionEnvironment(); } @@ -1651,7 +1653,7 @@ private OperationProvisioningScript private OperationProvisioningScriptsType evaluateScript(OperationProvisioningScriptsType resourceScripts, ResourceShadowDiscriminator discr, ProvisioningOperationTypeType operation, BeforeAfterType order, - ExpressionVariables variables, LensContext context, + ExpressionVariables variables, ExpressionProfile expressionProfile, LensContext context, LensElementContext objectContext, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { @@ -1681,7 +1683,7 @@ private OperationProvisioningScriptsType evaluateScript(OperationProvisioningScr } } // Let's do the most expensive evaluation last - if (!evaluateScriptCondition(script, variables, task, result)){ + if (!evaluateScriptCondition(script, variables, expressionProfile, task, result)){ continue; } for (ProvisioningScriptArgumentType argument : script.getArgument()) { @@ -1695,13 +1697,13 @@ private OperationProvisioningScriptsType evaluateScript(OperationProvisioningScr } private boolean evaluateScriptCondition(OperationProvisioningScriptType script, - ExpressionVariables variables, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { + 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, expressionFactory, " condition for provisioning script ", task, result); + PrismPropertyValue conditionOutput = ExpressionUtil.evaluateCondition(variables, condition, expressionProfile, expressionFactory, " condition for provisioning script ", task, result); if (conditionOutput == null) { return true; } @@ -1778,12 +1780,12 @@ private void executeReconciliationS if (resourceScripts == null) { return; } - - executeProvisioningScripts(context, projContext, resourceScripts, ProvisioningOperationTypeType.RECONCILE, order, task, parentResult); + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); + executeProvisioningScripts(context, projContext, resourceScripts, ProvisioningOperationTypeType.RECONCILE, order, expressionProfile, task, parentResult); } private Object executeProvisioningScripts(LensContext context, LensProjectionContext projContext, - OperationProvisioningScriptsType scripts, ProvisioningOperationTypeType operation, BeforeAfterType order, Task task, OperationResult parentResult) + OperationProvisioningScriptsType scripts, ProvisioningOperationTypeType operation, BeforeAfterType order, ExpressionProfile expressionProfile, Task task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException, ObjectAlreadyExistsException { @@ -1828,7 +1830,7 @@ private Object executeProvisioningS try { OperationProvisioningScriptsType evaluatedScript = evaluateScript(scripts, projContext.getResourceShadowDiscriminator(), operation, order, - variables, context, projContext, task, parentResult); + variables, expressionProfile, context, projContext, task, parentResult); for (OperationProvisioningScriptType script : evaluatedScript.getScript()) { ModelImplUtils.setRequestee(task, context); scriptResult = provisioning.executeScript(resource.getOid(), script, task, parentResult); 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 efd1d417a9c..e2fe82a7033 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 @@ -47,8 +47,10 @@ import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.constants.ExpressionConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DebugUtil; @@ -97,6 +99,7 @@ public class Construction extends AbstractConst private ObjectType orderOneObject; private ResourceType resource; + private ExpressionProfile expressionProfile; private MappingFactory mappingFactory; private MappingEvaluator mappingEvaluator; private Collection, ? extends PrismPropertyDefinition>> attributeMappings; @@ -111,6 +114,8 @@ public class Construction extends AbstractConst public Construction(ConstructionType constructionType, ObjectType source) { super(constructionType, source); this.attributeMappings = null; + // TODO: this is wrong. It should be set up during the evaluation process. + this.expressionProfile = MiscSchemaUtil.getExpressionProfile(); } public ObjectType getOrderOneObject() { @@ -247,7 +252,7 @@ private ResourceType resolveTarget(String sourceDescription, Task task, Operatio ResourceType.class); LOGGER.info("Orig filter {}", origFilter); ObjectFilter evaluatedFilter = ExpressionUtil.evaluateFilterExpressions(origFilter, variables, - getMappingFactory().getExpressionFactory(), getPrismContext(), + expressionProfile, getMappingFactory().getExpressionFactory(), getPrismContext(), " evaluating resource filter expression ", task, result); LOGGER.info("evaluatedFilter filter {}", evaluatedFilter); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/FocalMappingSpec.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/FocalMappingSpec.java index 619042017dd..9ab528fe663 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/FocalMappingSpec.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/FocalMappingSpec.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 Evolveum + * Copyright (c) 2017-2019 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java index 79552abf2be..534a4f3e134 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java @@ -28,8 +28,10 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.expression.VariablesMap; 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.exception.CommunicationException; @@ -164,8 +166,9 @@ public ExecutionContext evaluateExpression(ScriptingExpressionType expression, T private ExecutionContext evaluateExpression(@NotNull ExecuteScriptType executeScript, VariablesMap initialVariables, boolean privileged, boolean recordProgressAndIterationStatistics, Task task, OperationResult result) throws ScriptExecutionException { Validate.notNull(executeScript.getScriptingExpression(), "Scripting expression must be present"); + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); try { - VariablesMap frozenVariables = VariablesUtil.initialPreparation(initialVariables, executeScript.getVariables(), expressionFactory, modelObjectResolver, prismContext, task, result); + VariablesMap frozenVariables = VariablesUtil.initialPreparation(initialVariables, executeScript.getVariables(), expressionFactory, modelObjectResolver, prismContext, expressionProfile, task, result); PipelineData pipelineData = PipelineData.parseFrom(executeScript.getInput(), frozenVariables, prismContext); ExecutionContext context = new ExecutionContext(executeScript.getOptions(), task, this, privileged, recordProgressAndIterationStatistics, frozenVariables); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java index acc7d8484ea..886bd543eed 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java @@ -32,7 +32,9 @@ import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; @@ -72,6 +74,8 @@ public PipelineData evaluate(SearchExpressionType searchE ExecutionContext context, OperationResult globalResult) throws ScriptExecutionException { Validate.notNull(searchExpression.getType()); + + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); List data = input.getData(); if (data.isEmpty()) { @@ -114,8 +118,8 @@ public PipelineData evaluate(SearchExpressionType searchE ExpressionVariables variables = new ExpressionVariables(); item.getVariables().forEach((name, value) -> variables.put(name, cloneIfNecessary(name, value))); try { - objectQuery = ExpressionUtil - .evaluateQueryExpressions(unresolvedObjectQuery, variables, expressionFactory, prismContext, + objectQuery = ExpressionUtil + .evaluateQueryExpressions(unresolvedObjectQuery, variables, expressionProfile, expressionFactory, prismContext, "bulk action query", context.getTask(), globalResult); } catch (SchemaException | ObjectNotFoundException | ExpressionEvaluationException | CommunicationException | ConfigurationException | SecurityViolationException e) { // TODO continue on any error? diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java index 576aa50e678..dded1fca8ed 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java @@ -41,6 +41,7 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.constants.ExpressionConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.task.api.Task; @@ -71,21 +72,11 @@ public class CorrelationConfirmationEvaluator { private static transient Trace LOGGER = TraceManager.getTrace(CorrelationConfirmationEvaluator.class); - @Autowired(required = true) - @Qualifier("cacheRepositoryService") - private RepositoryService repositoryService; - - @Autowired(required = true) - private PrismContext prismContext; - - @Autowired - private RelationRegistry relationRegistry; - - @Autowired(required = true) - private ExpressionFactory expressionFactory; - - @Autowired(required = true) - private MatchingRuleRegistry matchingRuleRegistry; + @Autowired @Qualifier("cacheRepositoryService") private RepositoryService repositoryService; + @Autowired private PrismContext prismContext; + @Autowired private RelationRegistry relationRegistry; + @Autowired private ExpressionFactory expressionFactory; + @Autowired private MatchingRuleRegistry matchingRuleRegistry; public List> findFocusesByCorrelationRule(Class focusType, ShadowType currentShadow, List conditionalFilters, ResourceType resourceType, SystemConfigurationType configurationType, Task task, OperationResult result) @@ -96,15 +87,18 @@ public List> findFocusesByCorrelationRule(C + "returning empty list of users.", resourceType); return null; } + + // TODO: determine from the resource + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); List> users = null; for (ConditionalSearchFilterType conditionalFilter : conditionalFilters) { // TODO: better description - if (satisfyCondition(currentShadow, conditionalFilter, resourceType, configurationType, "Condition expression", task, + if (satisfyCondition(currentShadow, conditionalFilter, expressionProfile, resourceType, configurationType, "Condition expression", task, result)) { LOGGER.trace("Condition {} in correlation expression evaluated to true", conditionalFilter.getCondition()); List> foundUsers = findFocusesByCorrelationRule(focusType, currentShadow, conditionalFilter, - resourceType, configurationType, task, result); + expressionProfile, resourceType, configurationType, task, result); if (foundUsers == null && users == null) { continue; } @@ -142,7 +136,7 @@ public List> findFocusesByCorrelationRule(C } private boolean satisfyCondition(ShadowType currentShadow, ConditionalSearchFilterType conditionalFilter, - ResourceType resourceType, SystemConfigurationType configurationType, String shortDesc, Task task, + ExpressionProfile expressionProfile, ResourceType resourceType, SystemConfigurationType configurationType, String shortDesc, Task task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { @@ -155,7 +149,7 @@ private boolean satisfyCondition(ShadowType currentShadow, ConditionalSearchFilt ItemDefinition outputDefinition = prismContext.definitionFactory().createPropertyDefinition( ExpressionConstants.OUTPUT_ELEMENT_NAME, DOMUtil.XSD_BOOLEAN); PrismPropertyValue satisfy = (PrismPropertyValue) ExpressionUtil.evaluateExpression(variables, - outputDefinition, condition, expressionFactory, shortDesc, task, parentResult); + outputDefinition, condition, expressionProfile, expressionFactory, shortDesc, task, parentResult); if (satisfy.getValue() == null) { return false; } @@ -174,7 +168,7 @@ private boolean contains(List> users, Prism private List> findFocusesByCorrelationRule(Class focusType, - ShadowType currentShadow, ConditionalSearchFilterType conditionalFilter, ResourceType resourceType, SystemConfigurationType configurationType, + ShadowType currentShadow, ConditionalSearchFilterType conditionalFilter, ExpressionProfile expressionProfile, ResourceType resourceType, SystemConfigurationType configurationType, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException{ if (!conditionalFilter.containsFilterClause()) { @@ -186,7 +180,7 @@ private List> findFocusesByCorrelationRule( ObjectQuery q; try { q = prismContext.getQueryConverter().createObjectQuery(focusType, conditionalFilter); - q = updateFilterWithAccountValues(currentShadow, resourceType, configurationType, q, "Correlation expression", task, result); + q = updateFilterWithAccountValues(currentShadow, resourceType, configurationType, q, expressionProfile, "Correlation expression", task, result); if (q == null) { // Null is OK here, it means that the value in the filter // evaluated @@ -236,7 +230,7 @@ private List> findFocusesByCorrelationRule( private boolean matchUserCorrelationRule(Class focusType, PrismObject currentShadow, - PrismObject userType, ResourceType resourceType, SystemConfigurationType configurationType, + ExpressionProfile expressionProfile, PrismObject userType, ResourceType resourceType, SystemConfigurationType configurationType, ConditionalSearchFilterType conditionalFilter, Task task, OperationResult result) throws SchemaException { if (conditionalFilter == null) { LOGGER.warn("Correlation rule for resource '{}' doesn't contain query, " @@ -255,7 +249,7 @@ private boolean matchUserCorrelationRule(Class focusTyp ObjectQuery q; try { q = prismContext.getQueryConverter().createObjectQuery(focusType, conditionalFilter); - q = updateFilterWithAccountValues(currentShadow.asObjectable(), resourceType, configurationType, q, "Correlation expression", task, result); + q = updateFilterWithAccountValues(currentShadow.asObjectable(), resourceType, configurationType, q, expressionProfile, "Correlation expression", task, result); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Start matching user {} with correlation expression {}", userType, q != null ? q.debugDump() : "(null)"); } @@ -294,7 +288,7 @@ public boolean matchFocusByCorrelationRule(Synchronization for (ConditionalSearchFilterType conditionalFilter : conditionalFilters) { //TODO: can we expect that systemConfig and resource are always present? - if (matchUserCorrelationRule(syncCtx.getFocusClass(), syncCtx.getApplicableShadow(), focus, syncCtx.getResource().asObjectable(), + if (matchUserCorrelationRule(syncCtx.getFocusClass(), syncCtx.getApplicableShadow(), syncCtx.getExpressionProfile(), focus, syncCtx.getResource().asObjectable(), syncCtx.getSystemConfiguration().asObjectable(), conditionalFilter, syncCtx.getTask(), syncCtx.getResult())) { LOGGER.debug("SYNCHRONIZATION: CORRELATION: expression for {} match user: {}", syncCtx.getApplicableShadow(), focus); return true; @@ -351,20 +345,20 @@ public List> findUserByConfirmationRule(Cla } private ObjectQuery updateFilterWithAccountValues(ShadowType currentShadow, ResourceType resource, SystemConfigurationType configuration, - ObjectQuery origQuery, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { + ObjectQuery origQuery, ExpressionProfile expressionProfile, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { if (origQuery.getFilter() == null) { LOGGER.trace("No filter provided, skipping updating filter"); return origQuery; } - return evaluateQueryExpressions(origQuery, currentShadow, resource, configuration, shortDesc, task, result); + return evaluateQueryExpressions(origQuery, expressionProfile, currentShadow, resource, configuration, shortDesc, task, result); } - private ObjectQuery evaluateQueryExpressions(ObjectQuery query, ShadowType currentShadow, ResourceType resource, SystemConfigurationType configuration, + private ObjectQuery evaluateQueryExpressions(ObjectQuery query, ExpressionProfile expressionProfile, ShadowType currentShadow, ResourceType resource, SystemConfigurationType configuration, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { ExpressionVariables variables = ModelImplUtils.getDefaultExpressionVariables(null, currentShadow, resource, configuration, prismContext); - return ExpressionUtil.evaluateQueryExpressions(query, variables, expressionFactory, prismContext, shortDesc, task, result); + return ExpressionUtil.evaluateQueryExpressions(query, variables, expressionProfile, expressionFactory, prismContext, shortDesc, task, result); } public boolean evaluateConfirmationExpression(Class focusType, F user, ShadowType shadow, ResourceType resource, 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 8095161b7f9..4d949b038bb 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 @@ -32,9 +32,11 @@ import com.evolveum.midpoint.prism.util.PrismMonitor; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceSchema; 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.QNameUtil; import com.evolveum.midpoint.util.exception.ConfigurationException; @@ -63,6 +65,7 @@ public class SynchronizationContext { private PrismObject resource; private PrismObject systemConfiguration; private String chanel; + private ExpressionProfile expressionProfile; private Task task; private OperationResult result; @@ -92,6 +95,7 @@ public SynchronizationContext(PrismObject applicableShadow, PrismObj this.task = task; this.result = result; this.prismContext = prismContext; + this.expressionProfile = MiscSchemaUtil.getExpressionProfile(); } public boolean isSynchronizationEnabled() { @@ -361,6 +365,14 @@ public void setChanel(String chanel) { // return reaction; // } + public ExpressionProfile getExpressionProfile() { + return expressionProfile; + } + + public void setExpressionProfile(ExpressionProfile expressionProfile) { + this.expressionProfile = expressionProfile; + } + public void setReaction(SynchronizationReactionType reaction) { this.reaction = reaction; } 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 e0d990e9794..099a03b8f87 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 @@ -292,7 +292,7 @@ private ObjectSynchronizationDiscriminatorType evaluateSyn PrismPropertyDefinition discriminatorDef = prismContext.getSchemaRegistry() .findPropertyDefinitionByElementName(new QName(SchemaConstants.NS_C, "objectSynchronizationDiscriminator")); PrismPropertyValue evaluateDiscriminator = ExpressionUtil.evaluateExpression(variables, discriminatorDef, - classificationExpression, expressionFactory, desc, task, result); + classificationExpression, syncCtx.getExpressionProfile(), expressionFactory, desc, task, result); if (evaluateDiscriminator == null) { return null; } 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 337253b17bb..530b2493381 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 @@ -114,7 +114,7 @@ private static Boolean evaluateSynchronizationPolicyCondit try { ModelExpressionThreadLocalHolder.pushExpressionEnvironment(new ExpressionEnvironment<>(syncCtx.getTask(), syncCtx.getResult())); PrismPropertyValue evaluateCondition = ExpressionUtil.evaluateCondition(variables, - conditionExpressionType, expressionFactory, desc, syncCtx.getTask(), syncCtx.getResult()); + conditionExpressionType, syncCtx.getExpressionProfile(), expressionFactory, desc, syncCtx.getTask(), syncCtx.getResult()); return evaluateCondition.getValue(); } finally { ModelExpressionThreadLocalHolder.popExpressionEnvironment(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeModelTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeModelTaskHandler.java index 2e63b66e66b..6717c407fbe 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeModelTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeModelTaskHandler.java @@ -38,6 +38,7 @@ import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.enforcer.api.SecurityEnforcer; import com.evolveum.midpoint.task.api.Task; @@ -88,7 +89,7 @@ protected ObjectQuery preProcessQuery(ObjectQuery query, Task coordinatorTask, O try { ExpressionEnvironment env = new ExpressionEnvironment<>(coordinatorTask, opResult); ModelExpressionThreadLocalHolder.pushExpressionEnvironment(env); - query = ExpressionUtil.evaluateQueryExpressions(query, variables, expressionFactory, + query = ExpressionUtil.evaluateQueryExpressions(query, variables, getExpressionProfile(), expressionFactory, prismContext, "evaluate query expressions", coordinatorTask, opResult); } finally { ModelExpressionThreadLocalHolder.popExpressionEnvironment(); @@ -97,7 +98,7 @@ protected ObjectQuery preProcessQuery(ObjectQuery query, Task coordinatorTask, O return query; } - + @Override protected Integer countObjects(Class type, ObjectQuery query, Collection> queryOptions, Task coordinatorTask, OperationResult opResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { return modelObjectResolver.countObjects(type, query, queryOptions, coordinatorTask, opResult); diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestFilterExpression.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestFilterExpression.java index 6564a1ac48c..7248e9a0c73 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestFilterExpression.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestFilterExpression.java @@ -56,6 +56,7 @@ import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.MidPointConstants; 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.test.util.TestUtil; @@ -299,7 +300,8 @@ private ObjectFilter evaluateExpressionAssertFilter(String filename, ExpressionConstants.VAR_INPUT, pval, PrimitiveType.STRING); // WHEN - ObjectFilter evaluatedFilter = ExpressionUtil.evaluateFilterExpressions(filter, variables, expressionFactory, prismContext, + ObjectFilter evaluatedFilter = ExpressionUtil.evaluateFilterExpressions(filter, variables, + MiscSchemaUtil.getExpressionProfile(), expressionFactory, prismContext, "evaluating filter with null value not allowed", task, result); // THEN diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java index 79e26358312..8992b1dbc82 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java @@ -51,6 +51,7 @@ import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalCounters; 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.test.util.TestUtil; @@ -155,7 +156,8 @@ public void testGetManagersOids() throws Exception { ScriptExpressionEvaluatorType scriptType = parseScriptType("expression-" + TEST_NAME + ".xml"); PrismPropertyDefinition outputDefinition = getPrismContext().definitionFactory().createPropertyDefinition(PROPERTY_NAME, DOMUtil.XSD_STRING); - ScriptExpression scriptExpression = scriptExpressionFactory.createScriptExpression(scriptType, outputDefinition, expressionFactory, TEST_NAME, task, result); + ScriptExpression scriptExpression = scriptExpressionFactory.createScriptExpression(scriptType, outputDefinition, + MiscSchemaUtil.getExpressionProfile(), expressionFactory, TEST_NAME, task, result); ExpressionVariables variables = createVariables(ExpressionConstants.VAR_USER, chef, chef.getDefinition()); // WHEN @@ -188,7 +190,8 @@ public void testIsUniquePropertyValue() throws Exception { ScriptExpressionEvaluatorType scriptType = parseScriptType("expression-" + TEST_NAME + ".xml"); PrismPropertyDefinition outputDefinition = getPrismContext().definitionFactory().createPropertyDefinition(PROPERTY_NAME, DOMUtil.XSD_BOOLEAN); - ScriptExpression scriptExpression = scriptExpressionFactory.createScriptExpression(scriptType, outputDefinition, expressionFactory, TEST_NAME, task, result); + ScriptExpression scriptExpression = scriptExpressionFactory.createScriptExpression(scriptType, outputDefinition, + MiscSchemaUtil.getExpressionProfile(), expressionFactory, TEST_NAME, task, result); ExpressionVariables variables = createVariables( ExpressionConstants.VAR_USER, chef, chef.getDefinition(), @@ -320,7 +323,8 @@ private String executeScriptExpressionString(final String TEST_NAME, ExpressionV ScriptExpressionEvaluatorType scriptType = parseScriptType("expression-" + TEST_NAME + ".xml"); ItemDefinition outputDefinition = getPrismContext().definitionFactory().createPropertyDefinition(PROPERTY_NAME, DOMUtil.XSD_STRING); - ScriptExpression scriptExpression = scriptExpressionFactory.createScriptExpression(scriptType, outputDefinition, expressionFactory, TEST_NAME, task, result); + ScriptExpression scriptExpression = scriptExpressionFactory.createScriptExpression(scriptType, outputDefinition, + MiscSchemaUtil.getExpressionProfile(), expressionFactory, TEST_NAME, task, result); if (variables == null) { variables = new ExpressionVariables(); } diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java index 5b428d2880a..7f9004c4f95 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java @@ -58,9 +58,11 @@ import com.evolveum.midpoint.report.api.ReportService; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.expression.TypedValue; import com.evolveum.midpoint.schema.expression.VariablesMap; 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.exception.CommunicationException; @@ -100,6 +102,9 @@ public ObjectQuery parseQuery(String query, VariablesMap parameters) throws Sche return null; } + // TODO TODO TODO TODO TODO + ExpressionProfile expressionProfile = MiscSchemaUtil.getExpressionProfile(); + ObjectQuery parsedQuery; try { Task task = taskManager.createTaskInstance(); @@ -119,7 +124,7 @@ public ObjectQuery parseQuery(String query, VariablesMap parameters) throws Sche ExpressionVariables variables = new ExpressionVariables(); variables.putAll(parameters); - q = ExpressionUtil.evaluateQueryExpressions(q, variables, expressionFactory, prismContext, + q = ExpressionUtil.evaluateQueryExpressions(q, variables, expressionProfile, expressionFactory, prismContext, "parsing expression values for report", task, task.getResult()); ((TypeFilter) f).setFilter(q.getFilter()); parsedQuery = prismContext.queryFactory().createQuery(f); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java index 619de342420..83f0fa24c36 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2017 Evolveum + * Copyright (c) 2010-2019 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,7 +35,9 @@ import com.evolveum.midpoint.schema.ObjectTreeDeltas; import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.SearchResultList; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DebugUtil; @@ -187,7 +189,7 @@ private List r ObjectFilter origFilter = prismContext.getQueryConverter().parseFilter(filter, clazz); ObjectFilter evaluatedFilter = ExpressionUtil - .evaluateFilterExpressions(origFilter, variables, mappingFactory.getExpressionFactory(), prismContext, " evaluating approverRef filter expression ", task, result); + .evaluateFilterExpressions(origFilter, variables, MiscSchemaUtil.getExpressionProfile(), mappingFactory.getExpressionFactory(), prismContext, " evaluating approverRef filter expression ", task, result); if (evaluatedFilter == null) { throw new SchemaException("Filter could not be evaluated in approverRef in "+sourceDescription+"; original filter = "+origFilter); diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/Expression.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/Expression.java index ca65d097fd7..e244f87b283 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/Expression.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/Expression.java @@ -136,6 +136,10 @@ public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context) ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { ExpressionVariables processedVariables = null; + + if (context.getExpressionProfile() == null) { + context.setExpressionProfile(expressionProfile); + } try { diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionEvaluationContext.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionEvaluationContext.java index 2e72e6dba90..9f8d7b1dfa7 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionEvaluationContext.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionEvaluationContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2017 Evolveum + * Copyright (c) 2010-2019 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; @@ -51,6 +52,12 @@ public class ExpressionEvaluationContext { private Function additionalConvertor; private VariableProducer variableProducer; + /** + * Optional. If not specified then it will be added at the star of evaluation. + * Might be used to override the profile. + */ + private ExpressionProfile expressionProfile; + public ExpressionEvaluationContext(Collection> sources, ExpressionVariables variables, String contextDescription, Task task, OperationResult result) { @@ -101,6 +108,14 @@ public boolean isSkipEvaluationMinus() { public void setSkipEvaluationMinus(boolean skipEvaluationMinus) { this.skipEvaluationMinus = skipEvaluationMinus; } + + public ExpressionProfile getExpressionProfile() { + return expressionProfile; + } + + public void setExpressionProfile(ExpressionProfile expressionProfile) { + this.expressionProfile = expressionProfile; + } public ValuePolicyResolver getValuePolicyResolver() { return valuePolicyResolver; @@ -186,6 +201,7 @@ public ExpressionEvaluationContext shallowClone() { ExpressionEvaluationContext clone = new ExpressionEvaluationContext(sources, variables, contextDescription, task, result); clone.skipEvaluationMinus = this.skipEvaluationMinus; clone.skipEvaluationPlus = this.skipEvaluationPlus; + clone.expressionProfile = this.expressionProfile; clone.valuePolicyResolver = this.valuePolicyResolver; clone.expressionFactory = this.expressionFactory; clone.defaultSource = this.defaultSource; diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeResultHandler.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeResultHandler.java index 5f7d6fe8473..b0a9998f118 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeResultHandler.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeResultHandler.java @@ -21,9 +21,11 @@ import com.evolveum.midpoint.repo.cache.RepositoryCache; import com.evolveum.midpoint.repo.common.util.RepoCommonUtils; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.statistics.StatisticsUtil; import com.evolveum.midpoint.schema.util.ExceptionUtil; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.task.api.LightweightTaskHandler; import com.evolveum.midpoint.task.api.RunningTask; import com.evolveum.midpoint.task.api.TaskManager; @@ -569,5 +571,4 @@ protected Integer getWorkerThreadsCount(Task task) { } } - } diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java index 1c89db2a870..ce63a0a1132 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java @@ -43,6 +43,7 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; @@ -651,4 +652,9 @@ public static void logPreviousResultIfNeeded(Task task, TaskWorkBucketProcessing } } } + + protected ExpressionProfile getExpressionProfile() { + // TODO Determine from task object archetype + return MiscSchemaUtil.getExpressionProfile(); + } }