Skip to content

Commit

Permalink
Add constraint-related expression variables
Browse files Browse the repository at this point in the history
Two new variables for various policy constraint related expressions:
constraint and constraintElement (meaning JAXBElement wrapping the
constraint).

Plus rollback of last expression vs. messageExpression change.
  • Loading branch information
mederly committed Mar 6, 2018
1 parent 465c9e5 commit 81aa440
Show file tree
Hide file tree
Showing 11 changed files with 115 additions and 98 deletions.
Expand Up @@ -74,7 +74,7 @@ public <F extends FocusType> EvaluatedPolicyRuleTrigger evaluate(JAXBElement<Ass
!operationMatches(constraint, ctx.inPlus, ctx.inZero, ctx.inMinus) ||
!relationMatches(constraint, ctx) ||
!pathsMatch(constraint, ctx) ||
!expressionPasses(constraint, ctx, result)) {
!expressionPasses(constraintElement, ctx, result)) {
return null;
}
// TODO check modifications
Expand All @@ -92,7 +92,7 @@ private <F extends FocusType> LocalizableMessage createMessage(JAXBElement<Assig
.arg(ObjectTypeUtil.createDisplayInformation(ctx.evaluatedAssignment.getTarget(), false))
.arg(ctx.evaluatedAssignment.getRelation() != null ? ctx.evaluatedAssignment.getRelation().getLocalPart() : null)
.build();
return evaluatorHelper.createLocalizableMessage(constraint.getValue(), ctx, builtInMessage, result);
return evaluatorHelper.createLocalizableMessage(constraint, ctx, builtInMessage, result);
}

@NotNull
Expand All @@ -115,7 +115,7 @@ private <F extends FocusType> LocalizableMessage createShortMessage(JAXBElement<
.arg(ObjectTypeUtil.createDisplayInformation(ctx.evaluatedAssignment.getTarget(), false))
.arg(ObjectTypeUtil.createDisplayInformation(ctx.getObject(), false))
.build();
return evaluatorHelper.createLocalizableShortMessage(constraint.getValue(), ctx, builtInMessage, result);
return evaluatorHelper.createLocalizableShortMessage(constraint, ctx, builtInMessage, result);
}

private <F extends FocusType> boolean relationMatches(AssignmentModificationPolicyConstraintType constraint,
Expand Down
Expand Up @@ -63,42 +63,42 @@ public <F extends FocusType> EvaluatedCompositeTrigger evaluate(JAXBElement<Poli
.evaluateConstraints(constraint.getValue(), !isOr, rctx, result);
if (isNot) {
if (triggers.isEmpty()) {
return createTrigger(NOT, constraint.getValue(), triggers, rctx, result);
return createTrigger(NOT, constraint, triggers, rctx, result);
}
} else {
if (!triggers.isEmpty()) {
return createTrigger(isAnd ? AND : OR, constraint.getValue(), triggers, rctx, result);
return createTrigger(isAnd ? AND : OR, constraint, triggers, rctx, result);
}
}
return null;
}

@NotNull
private EvaluatedCompositeTrigger createTrigger(PolicyConstraintKindType kind, PolicyConstraintsType value,
private EvaluatedCompositeTrigger createTrigger(PolicyConstraintKindType kind, JAXBElement<PolicyConstraintsType> constraintElement,
List<EvaluatedPolicyRuleTrigger<?>> triggers,
PolicyRuleEvaluationContext<?> rctx, OperationResult result)
throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {
return new EvaluatedCompositeTrigger(kind, value,
createMessage(kind, value, rctx, result),
createShortMessage(kind, value, rctx, result),
return new EvaluatedCompositeTrigger(kind, constraintElement.getValue(),
createMessage(kind, constraintElement, rctx, result),
createShortMessage(kind, constraintElement, rctx, result),
triggers);
}

private LocalizableMessage createMessage(PolicyConstraintKindType kind,
AbstractPolicyConstraintType constraint, PolicyRuleEvaluationContext<?> ctx, OperationResult result)
JAXBElement<PolicyConstraintsType> constraintElement, PolicyRuleEvaluationContext<?> ctx, OperationResult result)
throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {
LocalizableMessage builtInMessage = new LocalizableMessageBuilder()
.key(SchemaConstants.DEFAULT_POLICY_CONSTRAINT_KEY_PREFIX + kind.value())
.build();
return evaluatorHelper.createLocalizableMessage(constraint, ctx, builtInMessage, result);
return evaluatorHelper.createLocalizableMessage(constraintElement, ctx, builtInMessage, result);
}

private LocalizableMessage createShortMessage(PolicyConstraintKindType kind,
AbstractPolicyConstraintType constraint, PolicyRuleEvaluationContext<?> ctx, OperationResult result)
JAXBElement<PolicyConstraintsType> constraintElement, PolicyRuleEvaluationContext<?> ctx, OperationResult result)
throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {
LocalizableMessage builtInMessage = new LocalizableMessageBuilder()
.key(SchemaConstants.DEFAULT_POLICY_CONSTRAINT_SHORT_MESSAGE_KEY_PREFIX + kind.value())
.build();
return evaluatorHelper.createLocalizableShortMessage(constraint, ctx, builtInMessage, result);
return evaluatorHelper.createLocalizableShortMessage(constraintElement, ctx, builtInMessage, result);
}
}
Expand Up @@ -40,6 +40,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

import static com.evolveum.midpoint.schema.constants.ExpressionConstants.VAR_RULE_EVALUATION_CONTEXT;
Expand All @@ -52,12 +53,15 @@
public class ConstraintEvaluatorHelper {

public static final QName VAR_EVALUATOR_HELPER = new QName(SchemaConstants.NS_C, "evaluatorHelper");
public static final QName VAR_CONSTRAINT_ELEMENT = new QName(SchemaConstants.NS_C, "constraintElement");
public static final QName VAR_CONSTRAINT = new QName(SchemaConstants.NS_C, "constraint");

@Autowired private PrismContext prismContext;
@Autowired protected ExpressionFactory expressionFactory;

// corresponds with PolicyRuleBasedAspect.processNameFromApprovalActions
public <F extends FocusType> ExpressionVariables createExpressionVariables(PolicyRuleEvaluationContext<F> rctx) {
public <F extends FocusType> ExpressionVariables createExpressionVariables(PolicyRuleEvaluationContext<F> rctx,
JAXBElement<? extends AbstractPolicyConstraintType> constraintElement) {
ExpressionVariables var = new ExpressionVariables();
PrismObject<F> object = rctx.getObject();
var.addVariableDefinition(ExpressionConstants.VAR_USER, object);
Expand All @@ -79,6 +83,8 @@ public <F extends FocusType> ExpressionVariables createExpressionVariables(Polic
}
var.addVariableDefinition(VAR_RULE_EVALUATION_CONTEXT, rctx);
var.addVariableDefinition(VAR_EVALUATOR_HELPER, this);
var.addVariableDefinition(VAR_CONSTRAINT, constraintElement != null ? constraintElement.getValue() : null);
var.addVariableDefinition(VAR_CONSTRAINT_ELEMENT, constraintElement);
return var;
}

Expand All @@ -104,18 +110,19 @@ public String evaluateString(ExpressionType expressionBean, ExpressionVariables
}

public <F extends FocusType> SingleLocalizableMessageType interpretLocalizableMessageTemplate(LocalizableMessageTemplateType template,
PolicyRuleEvaluationContext<F> rctx, OperationResult result)
PolicyRuleEvaluationContext<F> rctx, JAXBElement<? extends AbstractPolicyConstraintType> constraintElement, OperationResult result)
throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {
return LensUtil.interpretLocalizableMessageTemplate(template, createExpressionVariables(rctx), expressionFactory, prismContext, rctx.task, result);
return LensUtil.interpretLocalizableMessageTemplate(template, createExpressionVariables(rctx, constraintElement), expressionFactory, prismContext, rctx.task, result);
}

public <F extends FocusType> LocalizableMessage createLocalizableMessage(
AbstractPolicyConstraintType constraint, PolicyRuleEvaluationContext<F> rctx,
JAXBElement<? extends AbstractPolicyConstraintType> constraintElement, PolicyRuleEvaluationContext<F> rctx,
LocalizableMessage builtInMessage, OperationResult result) throws ExpressionEvaluationException,
ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {
AbstractPolicyConstraintType constraint = constraintElement.getValue();
if (constraint.getPresentation() != null && constraint.getPresentation().getMessage() != null) {
SingleLocalizableMessageType messageType =
interpretLocalizableMessageTemplate(constraint.getPresentation().getMessage(), rctx, result);
interpretLocalizableMessageTemplate(constraint.getPresentation().getMessage(), rctx, constraintElement, result);
return LocalizationUtil.toLocalizableMessage(messageType);
} else if (constraint.getName() != null) {
return new LocalizableMessageBuilder()
Expand All @@ -128,12 +135,13 @@ public <F extends FocusType> LocalizableMessage createLocalizableMessage(
}

public <F extends FocusType> LocalizableMessage createLocalizableShortMessage(
AbstractPolicyConstraintType constraint, PolicyRuleEvaluationContext<F> rctx,
JAXBElement<? extends AbstractPolicyConstraintType> constraintElement, PolicyRuleEvaluationContext<F> rctx,
LocalizableMessage builtInMessage, OperationResult result) throws ExpressionEvaluationException,
ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {
AbstractPolicyConstraintType constraint = constraintElement.getValue();
if (constraint.getPresentation() != null && constraint.getPresentation().getShortMessage() != null) {
SingleLocalizableMessageType messageType =
interpretLocalizableMessageTemplate(constraint.getPresentation().getShortMessage(), rctx, result);
interpretLocalizableMessageTemplate(constraint.getPresentation().getShortMessage(), rctx, constraintElement, result);
return LocalizationUtil.toLocalizableMessage(messageType);
} else if (constraint.getName() != null) {
return new LocalizableMessageBuilder()
Expand Down
Expand Up @@ -136,7 +136,7 @@ public <F extends FocusType> EvaluatedPolicyRuleTrigger evaluate(JAXBElement<Exc
continue targetB;
}
}
return createTrigger(ctx.evaluatedAssignment, assignmentB, targetB, constraint.getValue(), ctx.policyRule, ctx, result);
return createTrigger(ctx.evaluatedAssignment, assignmentB, targetB, constraint, ctx.policyRule, ctx, result);
}
}
return null;
Expand Down Expand Up @@ -191,7 +191,7 @@ static boolean oidMatches(ObjectReferenceType targetRef, EvaluatedAssignmentTarg

private <F extends FocusType> EvaluatedExclusionTrigger createTrigger(EvaluatedAssignmentImpl<F> assignmentA,
@NotNull EvaluatedAssignmentImpl<F> assignmentB, EvaluatedAssignmentTargetImpl targetB,
ExclusionPolicyConstraintType constraint, EvaluatedPolicyRule policyRule,
JAXBElement<ExclusionPolicyConstraintType> constraintElement, EvaluatedPolicyRule policyRule,
AssignmentPolicyRuleEvaluationContext<F> ctx, OperationResult result)
throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {

Expand All @@ -202,31 +202,31 @@ private <F extends FocusType> EvaluatedExclusionTrigger createTrigger(EvaluatedA
ObjectType objectA = getConflictingObject(pathA, assignmentA.getTarget());
ObjectType objectB = getConflictingObject(pathB, targetB.getTarget());

LocalizableMessage message = createMessage(infoA, infoB, constraint, ctx, result);
LocalizableMessage shortMessage = createShortMessage(infoA, infoB, constraint, ctx, result);
return new EvaluatedExclusionTrigger(constraint, message, shortMessage, assignmentB, objectA, objectB, pathA, pathB);
LocalizableMessage message = createMessage(infoA, infoB, constraintElement, ctx, result);
LocalizableMessage shortMessage = createShortMessage(infoA, infoB, constraintElement, ctx, result);
return new EvaluatedExclusionTrigger(constraintElement.getValue(), message, shortMessage, assignmentB, objectA, objectB, pathA, pathB);
}

@NotNull
private <F extends FocusType> LocalizableMessage createMessage(LocalizableMessage infoA, LocalizableMessage infoB,
ExclusionPolicyConstraintType constraint, PolicyRuleEvaluationContext<F> ctx, OperationResult result)
JAXBElement<ExclusionPolicyConstraintType> constraintElement, PolicyRuleEvaluationContext<F> ctx, OperationResult result)
throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {
LocalizableMessage builtInMessage = new LocalizableMessageBuilder()
.key(SchemaConstants.DEFAULT_POLICY_CONSTRAINT_KEY_PREFIX + CONSTRAINT_KEY)
.args(infoA, infoB)
.build();
return evaluatorHelper.createLocalizableMessage(constraint, ctx, builtInMessage, result);
return evaluatorHelper.createLocalizableMessage(constraintElement, ctx, builtInMessage, result);
}

@NotNull
private <F extends FocusType> LocalizableMessage createShortMessage(LocalizableMessage infoA, LocalizableMessage infoB,
ExclusionPolicyConstraintType constraint, PolicyRuleEvaluationContext<F> ctx, OperationResult result)
JAXBElement<ExclusionPolicyConstraintType> constraintElement, PolicyRuleEvaluationContext<F> ctx, OperationResult result)
throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {
LocalizableMessage builtInMessage = new LocalizableMessageBuilder()
.key(SchemaConstants.DEFAULT_POLICY_CONSTRAINT_SHORT_MESSAGE_KEY_PREFIX + CONSTRAINT_KEY)
.args(infoA, infoB)
.build();
return evaluatorHelper.createLocalizableShortMessage(constraint, ctx, builtInMessage, result);
return evaluatorHelper.createLocalizableShortMessage(constraintElement, ctx, builtInMessage, result);
}

private ObjectType getConflictingObject(AssignmentPath path, PrismObject<?> defaultObject) {
Expand Down

0 comments on commit 81aa440

Please sign in to comment.