use of com.evolveum.midpoint.repo.common.expression.ExpressionVariables in project midpoint by Evolveum.
the class Mapping method isInRange.
private boolean isInRange(V value, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException {
@NotNull ValueSetSpecificationType range = mappingType.getRange();
if (range.getIsInSetExpression() == null) {
return false;
}
ExpressionVariables variables = new ExpressionVariables();
// TODO is this ok?
variables.addVariableDefinitions(this.variables);
if (value instanceof PrismContainerValue) {
// artifically create parent for PCV in order to pass it to expression
PrismContainer.createParentIfNeeded((PrismContainerValue) value, outputDefinition);
}
variables.addVariableDefinition(ExpressionConstants.VAR_VALUE, value);
PrismPropertyDefinition<Boolean> outputDef = new PrismPropertyDefinitionImpl<Boolean>(SchemaConstantsGenerated.C_VALUE, DOMUtil.XSD_BOOLEAN, getPrismContext(), null, false);
PrismPropertyValue<Boolean> rv = ExpressionUtil.evaluateExpression(variables, outputDef, range.getIsInSetExpression(), expressionFactory, "isInSet expression in " + contextDescription, task, result);
// but now remove the parent!
if (value.getParent() != null) {
value.setParent(null);
}
return rv != null && rv.getValue() != null ? rv.getValue() : Boolean.FALSE;
}
use of com.evolveum.midpoint.repo.common.expression.ExpressionVariables in project midpoint by Evolveum.
the class PrimaryChangeAspectHelper method evaluateApplicabilityCondition.
//endregion
//region ========================================================================== Expression evaluation
public boolean evaluateApplicabilityCondition(PcpAspectConfigurationType config, ModelContext modelContext, Serializable itemToApprove, ExpressionVariables additionalVariables, PrimaryChangeAspect aspect, Task task, OperationResult result) {
if (config == null || config.getApplicabilityCondition() == null) {
return true;
}
ExpressionType expressionType = config.getApplicabilityCondition();
QName resultName = new QName(SchemaConstants.NS_C, "result");
PrismPropertyDefinition<Boolean> resultDef = new PrismPropertyDefinitionImpl(resultName, DOMUtil.XSD_BOOLEAN, prismContext);
ExpressionVariables expressionVariables = new ExpressionVariables();
expressionVariables.addVariableDefinition(SchemaConstants.C_MODEL_CONTEXT, modelContext);
expressionVariables.addVariableDefinition(SchemaConstants.C_ITEM_TO_APPROVE, itemToApprove);
if (additionalVariables != null) {
expressionVariables.addVariableDefinitions(additionalVariables);
}
PrismValueDeltaSetTriple<PrismPropertyValue<Boolean>> exprResultTriple;
try {
Expression<PrismPropertyValue<Boolean>, PrismPropertyDefinition<Boolean>> expression = expressionFactory.makeExpression(expressionType, resultDef, "applicability condition expression", task, result);
ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, "applicability condition expression", task, result);
exprResultTriple = ModelExpressionThreadLocalHolder.evaluateExpressionInContext(expression, params, task, result);
} catch (SchemaException | ExpressionEvaluationException | ObjectNotFoundException | RuntimeException e) {
// TODO report as a specific exception?
throw new SystemException("Couldn't evaluate applicability condition in aspect " + aspect.getClass().getSimpleName() + ": " + e.getMessage(), e);
}
Collection<PrismPropertyValue<Boolean>> exprResult = exprResultTriple.getZeroSet();
if (exprResult.size() == 0) {
return false;
} else if (exprResult.size() > 1) {
throw new IllegalStateException("Applicability condition expression should return exactly one boolean value; it returned " + exprResult.size() + " ones");
}
Boolean boolResult = exprResult.iterator().next().getValue();
return boolResult != null ? boolResult : false;
}
use of com.evolveum.midpoint.repo.common.expression.ExpressionVariables in project midpoint by Evolveum.
the class WfExpressionEvaluationHelper method evaluateExpression.
@SuppressWarnings("unchecked")
@NotNull
public <T> List<T> evaluateExpression(ExpressionType expressionType, ExpressionVariables variables, String contextDescription, Class<T> clazz, QName typeName, Function<Object, Object> additionalConvertor, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException {
ExpressionFactory expressionFactory = getExpressionFactory();
PrismContext prismContext = expressionFactory.getPrismContext();
PrismPropertyDefinition<String> resultDef = new PrismPropertyDefinitionImpl<>(new QName(SchemaConstants.NS_C, "result"), typeName, prismContext);
Expression<PrismPropertyValue<String>, PrismPropertyDefinition<String>> expression = expressionFactory.makeExpression(expressionType, resultDef, contextDescription, task, result);
ExpressionEvaluationContext context = new ExpressionEvaluationContext(null, variables, contextDescription, task, result);
context.setAdditionalConvertor(additionalConvertor);
PrismValueDeltaSetTriple<PrismPropertyValue<String>> exprResultTriple = ModelExpressionThreadLocalHolder.evaluateExpressionInContext(expression, context, task, result);
return exprResultTriple.getZeroSet().stream().map(ppv -> (T) ppv.getRealValue()).collect(Collectors.toList());
}
use of com.evolveum.midpoint.repo.common.expression.ExpressionVariables in project midpoint by Evolveum.
the class WfExpressionEvaluationHelper method getDefaultVariables.
public ExpressionVariables getDefaultVariables(@Nullable DelegateExecution execution, Task wfTask, OperationResult result) throws SchemaException, ObjectNotFoundException {
MiscDataUtil miscDataUtil = getMiscDataUtil();
ExpressionVariables variables = new ExpressionVariables();
variables.addVariableDefinition(C_REQUESTER, miscDataUtil.resolveObjectReference(wfTask.getWorkflowContext().getRequesterRef(), result));
variables.addVariableDefinition(C_OBJECT, miscDataUtil.resolveObjectReference(wfTask.getWorkflowContext().getObjectRef(), result));
// might be null
variables.addVariableDefinition(C_TARGET, miscDataUtil.resolveObjectReference(wfTask.getWorkflowContext().getTargetRef(), result));
ObjectDelta objectDelta;
try {
objectDelta = miscDataUtil.getFocusPrimaryDelta(wfTask.getWorkflowContext(), true);
} catch (JAXBException e) {
throw new SchemaException("Couldn't get object delta: " + e.getMessage(), e);
}
variables.addVariableDefinition(SchemaConstants.T_OBJECT_DELTA, objectDelta);
// Activiti process instance variables (use with care)
if (execution != null) {
execution.getVariables().entrySet().forEach(e -> variables.addVariableDefinition(new QName("_" + e.getKey()), e.getValue()));
}
return variables;
}
use of com.evolveum.midpoint.repo.common.expression.ExpressionVariables in project midpoint by Evolveum.
the class WfTimedActionTriggerHandler method computeDelegateTo.
private List<ObjectReferenceType> computeDelegateTo(DelegateWorkItemActionType delegateAction, WorkItemType workItem, Task wfTask, Task triggerScannerTask, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException {
List<ObjectReferenceType> rv = new ArrayList<>();
rv.addAll(CloneUtil.cloneCollectionMembers(delegateAction.getApproverRef()));
if (!delegateAction.getApproverExpression().isEmpty()) {
ExpressionVariables variables = evaluationHelper.getDefaultVariables(null, wfTask, result);
variables.addVariableDefinition(SchemaConstants.C_WORK_ITEM, workItem);
rv.addAll(evaluationHelper.evaluateRefExpressions(delegateAction.getApproverExpression(), variables, "computing delegates", triggerScannerTask, result));
}
// }
return rv;
}
Aggregations