Skip to content

Commit

Permalink
Refactoring to introduce ExpressionProfile all the way down to script…
Browse files Browse the repository at this point in the history
…ing expression evaluators (work in progress)
  • Loading branch information
semancik committed Mar 20, 2019
1 parent 366299c commit 2173ab2
Show file tree
Hide file tree
Showing 63 changed files with 574 additions and 335 deletions.
Expand Up @@ -59,6 +59,7 @@
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.result.OperationConstants;
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.security.api.MidPointPrincipal;
import com.evolveum.midpoint.security.api.OwnerResolver;
Expand Down Expand Up @@ -1347,7 +1348,7 @@ private OperationResult executeResultScriptHook(OperationResult result) {
ExpressionFactory factory = getExpressionFactory();
PrismPropertyDefinition<OperationResultType> outputDefinition = getPrismContext().definitionFactory().createPropertyDefinition(
ExpressionConstants.OUTPUT_ELEMENT_NAME, OperationResultType.COMPLEX_TYPE);
Expression<PrismPropertyValue<OperationResultType>, PrismPropertyDefinition<OperationResultType>> expression = factory.makeExpression(expressionType, outputDefinition, contextDesc, task, topResult);
Expression<PrismPropertyValue<OperationResultType>, PrismPropertyDefinition<OperationResultType>> expression = factory.makeExpression(expressionType, outputDefinition, MiscSchemaUtil.getExpressionProfile(), contextDesc, task, topResult);

ExpressionVariables variables = new ExpressionVariables();

Expand Down
Expand Up @@ -28,6 +28,7 @@
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.CommunicationException;
Expand Down Expand Up @@ -131,7 +132,7 @@ private String getExpressionValue(ExpressionType expressionType, String contextD
PrismContext prismContext = object.asPrismContainerValue().getPrismContext();
PrismPropertyDefinition<String> outputDefinition = prismContext.definitionFactory().createPropertyDefinition(ExpressionConstants.OUTPUT_ELEMENT_NAME,
DOMUtil.XSD_STRING);
Expression<PrismPropertyValue<String>,PrismPropertyDefinition<String>> expression = expressionFactory.makeExpression(expressionType, outputDefinition, contextDesc, task, result);
Expression<PrismPropertyValue<String>,PrismPropertyDefinition<String>> expression = expressionFactory.makeExpression(expressionType, outputDefinition, MiscSchemaUtil.getExpressionProfile(), contextDesc, task, result);
ExpressionVariables variables = new ExpressionVariables();
variables.put(ExpressionConstants.VAR_OBJECT, object, object.asPrismContainerValue().getDefinition());
addAdditionalExpressionVariables(variables);
Expand Down
Expand Up @@ -33,6 +33,7 @@
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;
Expand Down Expand Up @@ -145,7 +146,7 @@ public void validate(IValidatable<T> validatable) {
Expression<PrismPropertyValue<OperationResultType>, PrismPropertyDefinition<OperationResultType>> expression;
try {
expression = expressionFactory
.makeExpression(expressionType, outputDefinition, contextDesc, task, result);
.makeExpression(expressionType, outputDefinition, MiscSchemaUtil.getExpressionProfile(), contextDesc, task, result);
} catch (SchemaException | ObjectNotFoundException e) {
ValidationError error = new ValidationError();
error.setMessage("Cannot make expression: " + e.getMessage());
Expand Down
@@ -0,0 +1,24 @@
/**
* Copyright (c) 2019 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.schema.expression;

/**
* @author semancik
*
*/
public class ExpressionProfile {

}
Expand Up @@ -24,6 +24,7 @@
import com.evolveum.midpoint.schema.*;
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.util.MiscUtil;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down Expand Up @@ -488,5 +489,13 @@ public static <O extends ObjectType> boolean canBeAssignedFrom(QName requiredTyp
Class<? extends ObjectType> requiredTypeClass = ObjectTypes.getObjectTypeFromTypeQName(requiredTypeQName).getClassDefinition();
return requiredTypeClass.isAssignableFrom(providedTypeClass);
}

/**
* This is NOT A REAL METHOD. It just returns null. It is here to mark all the places
* where proper handling of expression profiles should be later added.
*/
public static ExpressionProfile getExpressionProfile() {
return null;
}

}
Expand Up @@ -27,6 +27,7 @@
import com.evolveum.midpoint.repo.common.expression.ExpressionVariables;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.util.logging.LoggingUtils;
Expand Down Expand Up @@ -74,7 +75,7 @@ private <T> List<T> evaluateExpression(Class<T> resultClass, ExpressionType expr
QName resultName = new QName(SchemaConstants.NS_C, "result");
PrismPropertyDefinition<T> resultDef = prismContext.definitionFactory().createPropertyDefinition(resultName, xsdType);

Expression<PrismPropertyValue<T>,PrismPropertyDefinition<T>> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result);
Expression<PrismPropertyValue<T>,PrismPropertyDefinition<T>> expression = expressionFactory.makeExpression(expressionType, resultDef, MiscSchemaUtil.getExpressionProfile(), shortDesc, task, result);
ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result);

PrismValueDeltaSetTriple<PrismPropertyValue<T>> exprResult = ModelExpressionThreadLocalHolder.evaluateExpressionInContext(expression, params, task, result);
Expand Down Expand Up @@ -104,7 +105,7 @@ private List<ObjectReferenceType> evaluateRefExpression(ExpressionType expressio
QName resultName = new QName(SchemaConstants.NS_C, "result");
PrismReferenceDefinition resultDef = prismContext.definitionFactory().createReferenceDefinition(resultName, ObjectReferenceType.COMPLEX_TYPE);

Expression<PrismReferenceValue,PrismReferenceDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result);
Expression<PrismReferenceValue,PrismReferenceDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, MiscSchemaUtil.getExpressionProfile(), shortDesc, task, result);
ExpressionEvaluationContext context = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result);
context.setAdditionalConvertor(ExpressionUtil.createRefConvertor(UserType.COMPLEX_TYPE));
PrismValueDeltaSetTriple<PrismReferenceValue> exprResult =
Expand Down
Expand Up @@ -48,6 +48,7 @@
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.security.api.SecurityContextManager;
Expand Down Expand Up @@ -91,10 +92,10 @@ public abstract class AbstractSearchExpressionEvaluator<V extends PrismValue,D e
private ModelService modelService;

protected AbstractSearchExpressionEvaluator(SearchObjectExpressionEvaluatorType expressionEvaluatorType,
D outputDefinition, Protector protector, ObjectResolver objectResolver,
D outputDefinition, ExpressionProfile expressionProfile, Protector protector, ObjectResolver objectResolver,
ModelService modelService, PrismContext prismContext, SecurityContextManager securityContextManager,
LocalizationService localizationService) {
super(expressionEvaluatorType, securityContextManager, localizationService, prismContext);
super(expressionEvaluatorType, expressionProfile, securityContextManager, localizationService, prismContext);
this.outputDefinition = outputDefinition;
this.prismContext = prismContext;
this.protector = protector;
Expand Down Expand Up @@ -157,7 +158,7 @@ protected List<V> transformSingleValue(ExpressionVariables variables, PlusMinusZ
if (populateAssignmentType != null) {
if (outputDefinition instanceof PrismContainerDefinition) {
additionalAttributeDeltas = PopulatorUtil.computePopulateItemDeltas(populateAssignmentType,
(PrismContainerDefinition<?>)outputDefinition, variables, context, contextDescription, task, result);
(PrismContainerDefinition<?>)outputDefinition, variables, expressionProfile, context, contextDescription, task, result);
} else {
LOGGER.warn("Search expression {} applied to non-container target, ignoring populate definition", contextDescription);
}
Expand All @@ -177,7 +178,7 @@ protected List<V> transformSingleValue(ExpressionVariables variables, PlusMinusZ
if (LOGGER.isTraceEnabled()){
LOGGER.trace("XML query converted to: {}", query.debugDump());
}
query = ExpressionUtil.evaluateQueryExpressions(query, variables, context.getExpressionFactory(),
query = ExpressionUtil.evaluateQueryExpressions(query, variables, expressionProfile, context.getExpressionFactory(),
prismContext, context.getContextDescription(), task, result);
if (LOGGER.isTraceEnabled()){
LOGGER.trace("Expression in query evaluated to: {}", query.debugDump());
Expand Down Expand Up @@ -388,7 +389,7 @@ private <O extends ObjectType> String createOnDemand(Class<O> targetTypeClass, E
} else {

List<ItemDelta<V, D>> populateDeltas = PopulatorUtil.computePopulateItemDeltas(populateObject,
objectDefinition, variables, params, contextDescription, task, result);
objectDefinition, variables, expressionProfile, params, contextDescription, task, result);
ItemDeltaCollectionsUtil.applyTo(populateDeltas, newObject);

}
Expand Down
Expand Up @@ -29,6 +29,7 @@
import com.evolveum.midpoint.prism.util.ObjectDeltaObject;
import com.evolveum.midpoint.repo.common.expression.*;
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.result.OperationResult;
import com.evolveum.midpoint.schema.util.ExceptionUtil;
Expand All @@ -55,18 +56,20 @@
public abstract class AbstractValueTransformationExpressionEvaluator<V extends PrismValue, D extends ItemDefinition, E extends TransformExpressionEvaluatorType>
implements ExpressionEvaluator<V,D> {

protected SecurityContextManager securityContextManager;
protected LocalizationService localizationService;
protected PrismContext prismContext;
protected final ExpressionProfile expressionProfile;
protected final SecurityContextManager securityContextManager;
protected final LocalizationService localizationService;
protected final PrismContext prismContext;

private E expressionEvaluatorType;

private static final Trace LOGGER = TraceManager.getTrace(AbstractValueTransformationExpressionEvaluator.class);

protected AbstractValueTransformationExpressionEvaluator(E expressionEvaluatorType,
protected AbstractValueTransformationExpressionEvaluator(E expressionEvaluatorType, ExpressionProfile expressionProfile,
SecurityContextManager securityContextManager, LocalizationService localizationService,
PrismContext prismContext) {
this.expressionEvaluatorType = expressionEvaluatorType;
this.expressionProfile = expressionProfile;
this.securityContextManager = securityContextManager;
this.localizationService = localizationService;
this.prismContext = prismContext;
Expand Down Expand Up @@ -351,7 +354,7 @@ private PrismValueDeltaSetTriple<V> evaluateRelativeExpression(final List<Source

Expression<PrismPropertyValue<Boolean>, PrismPropertyDefinition<Boolean>> conditionExpression;
if (expressionEvaluatorType.getCondition() != null) {
conditionExpression = ExpressionUtil.createCondition(expressionEvaluatorType.getCondition(),
conditionExpression = ExpressionUtil.createCondition(expressionEvaluatorType.getCondition(), expressionProfile,
evaluationContext.getExpressionFactory(), "condition in " + contextDescription, task, result);
} else {
conditionExpression = null;
Expand Down
@@ -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.
Expand Down Expand Up @@ -29,6 +29,7 @@
import com.evolveum.midpoint.prism.delta.ItemDeltaCollectionsUtil;
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.schema.internals.InternalsConfig;
import com.evolveum.midpoint.security.api.SecurityContextManager;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand All @@ -49,10 +50,10 @@ public class AssignmentTargetSearchExpressionEvaluator
private static final Trace LOGGER = TraceManager.getTrace(AssignmentTargetSearchExpressionEvaluator.class);

public AssignmentTargetSearchExpressionEvaluator(AssignmentTargetSearchExpressionEvaluatorType expressionEvaluatorType,
PrismContainerDefinition<AssignmentType> outputDefinition, Protector protector, ObjectResolver objectResolver,
PrismContainerDefinition<AssignmentType> outputDefinition, ExpressionProfile expressionProfile, Protector protector, ObjectResolver objectResolver,
ModelService modelService, PrismContext prismContext, SecurityContextManager securityContextManager,
LocalizationService localizationService) {
super(expressionEvaluatorType, outputDefinition, protector, objectResolver, modelService, prismContext, securityContextManager, localizationService);
super(expressionEvaluatorType, outputDefinition, expressionProfile, protector, objectResolver, modelService, prismContext, securityContextManager, localizationService);
}

protected PrismContainerValue<AssignmentType> createPrismValue(String oid, QName targetTypeQName, List<ItemDelta<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>>> additionalAttributeDeltas, ExpressionEvaluationContext params) {
Expand Down
@@ -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.
Expand Down Expand Up @@ -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.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down Expand Up @@ -67,8 +68,12 @@ public QName getElementName() {
* @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement)
*/
@Override
public <V extends PrismValue,D extends ItemDefinition> ExpressionEvaluator<V,D> createEvaluator(Collection<JAXBElement<?>> evaluatorElements,
D outputDefinition, ExpressionFactory factory, String contextDescription, Task task, OperationResult result) throws SchemaException {
public <V extends PrismValue,D extends ItemDefinition> ExpressionEvaluator<V,D> createEvaluator(
Collection<JAXBElement<?>> evaluatorElements,
D outputDefinition,
ExpressionProfile expressionProfile,
ExpressionFactory factory,
String contextDescription, Task task, OperationResult result) throws SchemaException {

Validate.notNull(outputDefinition, "output definition must be specified for associationFromLink expression evaluator");

Expand Down
Expand Up @@ -37,6 +37,7 @@
import com.evolveum.midpoint.repo.common.expression.ExpressionVariables;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
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;
Expand Down Expand Up @@ -132,9 +133,10 @@ public PrismValueDeltaSetTriple<V> evaluate(ExpressionEvaluationContext context)
OperationResult functionExpressionResult = result.createMinorSubresult(FunctionExpressionEvaluator.class.getSimpleName() + ".makeExpression");
ExpressionFactory factory = context.getExpressionFactory();

// TODO: expression profile should be determined from the function library archetype
Expression<V, D> expression;
try {
expression = factory.makeExpression(functionToExecute, outputDefinition, "function execution", task, functionExpressionResult);
expression = factory.makeExpression(functionToExecute, outputDefinition, MiscSchemaUtil.getExpressionProfile(), "function execution", task, functionExpressionResult);
functionExpressionResult.recordSuccess();
} catch (SchemaException | ObjectNotFoundException e) {
functionExpressionResult.recordFatalError("Cannot make expression for " + functionToExecute + ". Reason: " + e.getMessage(), e);
Expand Down

0 comments on commit 2173ab2

Please sign in to comment.