Skip to content

Commit

Permalink
Improve assignmentState constraint msg (MID-4432)
Browse files Browse the repository at this point in the history
The improved default message for assignmentState constraint
now contains the target name as well, e.g. 'Assignment state
after operation matches constraint (role "Superuser")'.
  • Loading branch information
mederly committed Mar 1, 2018
1 parent 27214db commit 8a87f29
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 14 deletions.
10 changes: 6 additions & 4 deletions infra/schema/src/main/resources/localization/schema.properties
Expand Up @@ -478,8 +478,9 @@ PolicyConstraints.before=before operation
PolicyConstraints.after=after operation
DefaultPolicyConstraint.objectState.unnamed=Object state {0} matches constraint
DefaultPolicyConstraint.objectState.named=Object state {0} matches constraint "{1}"
DefaultPolicyConstraint.assignmentState.unnamed=Assignment state {0} matches constraint
DefaultPolicyConstraint.assignmentState.named=Assignment state {0} matches constraint "{1}"
# {0} = before/after, {1} target/path, {2} rule name
DefaultPolicyConstraint.assignmentState.unnamed=Assignment state {0} matches constraint ({1})
DefaultPolicyConstraint.assignmentState.named=Assignment state {0} matches constraint "{1}" ({2})
DefaultPolicyConstraint.exclusion=Violation of SoD policy: {0} excludes {1}, they cannot be assigned at the same time
DefaultPolicyConstraint.hasAssignment=Assignment exists for {0} ({1})
# {0} = type name, {1} = OID, {2} = before/after. TODO do something with the OID
Expand Down Expand Up @@ -636,8 +637,9 @@ DefaultPolicyConstraint.Short.objectModification.toBeModified=Modifying {0}
DefaultPolicyConstraint.Short.objectModification.wasModified=Modified {0}
DefaultPolicyConstraint.Short.objectState.unnamed=Matching state: {0}
DefaultPolicyConstraint.Short.objectState.named=Matching state: {0} ("{1}")
DefaultPolicyConstraint.Short.assignmentState.unnamed=Matching state: assignment of {0}
DefaultPolicyConstraint.Short.assignmentState.named=Matching state: assignment of {0} ("{1}")
# {0} = before/after, {1} target/path, {2} rule name
DefaultPolicyConstraint.Short.assignmentState.unnamed=Matching state: assignment of {1} ({0})
DefaultPolicyConstraint.Short.assignmentState.named=Matching state: assignment of {1} ({0}) ("{2}")
DefaultPolicyConstraint.Short.exclusion={0} excludes {1}
DefaultPolicyConstraint.Short.hasAssignment=Assignment exists for {0} ({1})
DefaultPolicyConstraint.Short.hasNoAssignment=No assignment exists for {0} {1} ({2})
Expand Down
Expand Up @@ -478,8 +478,9 @@ PolicyConstraints.before=before operation
PolicyConstraints.after=after operation
DefaultPolicyConstraint.objectState.unnamed=Object state {0} matches constraint
DefaultPolicyConstraint.objectState.named=Object state {0} matches constraint "{1}"
DefaultPolicyConstraint.assignmentState.unnamed=Assignment state {0} matches constraint
DefaultPolicyConstraint.assignmentState.named=Assignment state {0} matches constraint "{1}"
# {0} = before/after, {1} target/path, {2} rule name
DefaultPolicyConstraint.assignmentState.unnamed=Assignment state {0} matches constraint ({1})
DefaultPolicyConstraint.assignmentState.named=Assignment state {0} matches constraint "{1}" ({2})
DefaultPolicyConstraint.exclusion=Violation of SoD policy: {0} excludes {1}, they cannot be assigned at the same time
DefaultPolicyConstraint.hasAssignment=Assignment exists for {0} ({1})
# {0} = type name, {1} = OID, {2} = before/after. TODO do something with the OID
Expand Down Expand Up @@ -636,8 +637,9 @@ DefaultPolicyConstraint.Short.objectModification.toBeModified=Modifying {0}
DefaultPolicyConstraint.Short.objectModification.wasModified=Modified {0}
DefaultPolicyConstraint.Short.objectState.unnamed=Matching state: {0}
DefaultPolicyConstraint.Short.objectState.named=Matching state: {0} ("{1}")
DefaultPolicyConstraint.Short.assignmentState.unnamed=Matching state: assignment of {0}
DefaultPolicyConstraint.Short.assignmentState.named=Matching state: assignment of {0} ("{1}")
# {0} = before/after, {1} target/path, {2} rule name
DefaultPolicyConstraint.Short.assignmentState.unnamed=Matching state: assignment of {1} ({0})
DefaultPolicyConstraint.Short.assignmentState.named=Matching state: assignment of {1} ({0}) ("{2}")
DefaultPolicyConstraint.Short.exclusion={0} excludes {1}
DefaultPolicyConstraint.Short.hasAssignment=Assignment exists for {0} ({1})
DefaultPolicyConstraint.Short.hasNoAssignment=No assignment exists for {0} {1} ({2})
Expand Down
Expand Up @@ -32,6 +32,7 @@
import com.evolveum.midpoint.repo.common.expression.ExpressionFactory;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.util.LocalizableMessage;
import com.evolveum.midpoint.util.LocalizableMessageBuilder;
import com.evolveum.midpoint.util.QNameUtil;
Expand Down Expand Up @@ -150,8 +151,8 @@ private <F extends FocusType> EvaluatedPolicyRuleTrigger<?> evaluateForObject(St
}

return new EvaluatedStateTrigger(OBJECT_STATE, constraint,
createMessage(OBJECT_CONSTRAINT_KEY_PREFIX, constraint, ctx, result),
createShortMessage(OBJECT_CONSTRAINT_KEY_PREFIX, constraint, ctx, result));
createMessage(OBJECT_CONSTRAINT_KEY_PREFIX, constraint, ctx, false, result),
createShortMessage(OBJECT_CONSTRAINT_KEY_PREFIX, constraint, ctx, false, result));
}

private <F extends FocusType> EvaluatedPolicyRuleTrigger<?> evaluateForAssignment(StatePolicyConstraintType constraint,
Expand All @@ -170,18 +171,21 @@ private <F extends FocusType> EvaluatedPolicyRuleTrigger<?> evaluateForAssignmen
"expression in assignment state constraint " + constraint.getName() + " (" + ctx.state + ")", ctx.task, result);
if (match) {
return new EvaluatedStateTrigger(ASSIGNMENT_STATE, constraint,
createMessage(ASSIGNMENT_CONSTRAINT_KEY_PREFIX, constraint, ctx, result),
createShortMessage(ASSIGNMENT_CONSTRAINT_KEY_PREFIX, constraint, ctx, result));
createMessage(ASSIGNMENT_CONSTRAINT_KEY_PREFIX, constraint, ctx, true, result),
createShortMessage(ASSIGNMENT_CONSTRAINT_KEY_PREFIX, constraint, ctx, true, result));
}
return null;
}

@NotNull
private <F extends FocusType> LocalizableMessage createMessage(String constraintKeyPrefix,
StatePolicyConstraintType constraint, PolicyRuleEvaluationContext<F> ctx, OperationResult result)
StatePolicyConstraintType constraint, PolicyRuleEvaluationContext<F> ctx, boolean assignmentTarget, OperationResult result)
throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {
List<Object> args = new ArrayList<>();
args.add(evaluatorHelper.createBeforeAfterMessage(ctx));
if (assignmentTarget) {
addAssignmentTargetArgument(args, ctx);
}
String keySuffix;
if (constraint.getName() != null) {
args.add(constraint.getName());
Expand All @@ -196,12 +200,24 @@ private <F extends FocusType> LocalizableMessage createMessage(String constraint
return evaluatorHelper.createLocalizableMessage(constraint, ctx, builtInMessage, result);
}

private <F extends FocusType> void addAssignmentTargetArgument(List<Object> args, PolicyRuleEvaluationContext<F> ctx) {
if (!(ctx instanceof AssignmentPolicyRuleEvaluationContext)) {
args.add("");
} else {
AssignmentPolicyRuleEvaluationContext<F> actx = (AssignmentPolicyRuleEvaluationContext<F>) ctx;
args.add(ObjectTypeUtil.createDisplayInformation(actx.evaluatedAssignment.getTarget(), false));
}
}

@NotNull
private <F extends FocusType> LocalizableMessage createShortMessage(String constraintKeyPrefix,
StatePolicyConstraintType constraint, PolicyRuleEvaluationContext<F> ctx, OperationResult result)
StatePolicyConstraintType constraint, PolicyRuleEvaluationContext<F> ctx, boolean assignmentTarget, OperationResult result)
throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException {
List<Object> args = new ArrayList<>();
args.add(evaluatorHelper.createBeforeAfterMessage(ctx));
if (assignmentTarget) {
addAssignmentTargetArgument(args, ctx);
}
String keySuffix;
if (constraint.getName() != null) {
args.add(constraint.getName());
Expand Down

0 comments on commit 8a87f29

Please sign in to comment.