Skip to content

Commit

Permalink
Setting policySituation in FocusType (but no triggers there yet).
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Sep 1, 2017
1 parent e6bc452 commit 6110431
Show file tree
Hide file tree
Showing 10 changed files with 185 additions and 15 deletions.
Expand Up @@ -312,6 +312,10 @@ public abstract class SchemaConstants {
QNameUtil.qNameToUri(new QName(NS_MODEL_POLICY_SITUATION, "modified"));
public static final String MODEL_POLICY_SITUATION_ASSIGNED =
QNameUtil.qNameToUri(new QName(NS_MODEL_POLICY_SITUATION, "assigned"));
public static final String MODEL_POLICY_SITUATION_HAS_ASSIGNMENT =
QNameUtil.qNameToUri(new QName(NS_MODEL_POLICY_SITUATION, "hasAssignment")); // TODO
public static final String MODEL_POLICY_SITUATION_HAS_NO_ASSIGNMENT =
QNameUtil.qNameToUri(new QName(NS_MODEL_POLICY_SITUATION, "hasNoAssignment")); // TODO
public static final String MODEL_POLICY_SITUATION_FOCUS_STATE =
QNameUtil.qNameToUri(new QName(NS_MODEL_POLICY_SITUATION, "focusState")); // TODO
public static final String MODEL_POLICY_SITUATION_ASSIGNMENT_STATE =
Expand Down
Expand Up @@ -366,7 +366,7 @@
<xsd:element name="relation" type="xsd:QName" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation>
This policy only applies to relations of the specified type. The value
This constraint only applies to relations of the specified type. The value
of this element is compared to the relation of the targetRef relation
in the assignment/inducement. If not specified then this policy only
applies to the null (default) relation. If all relations need to be
Expand Down
Expand Up @@ -34,6 +34,10 @@ public enum PredefinedPolicySituation {

ASSIGNED(SchemaConstants.MODEL_POLICY_SITUATION_ASSIGNED, PolicyConstraintKindType.ASSIGNMENT),

HAS_ASSIGNMENT(SchemaConstants.MODEL_POLICY_SITUATION_HAS_ASSIGNMENT, PolicyConstraintKindType.HAS_ASSIGNMENT),

HAS_NO_ASSIGNMENT(SchemaConstants.MODEL_POLICY_SITUATION_HAS_NO_ASSIGNMENT, PolicyConstraintKindType.HAS_NO_ASSIGNMENT),

FOCUS_STATE(SchemaConstants.MODEL_POLICY_SITUATION_FOCUS_STATE, PolicyConstraintKindType.FOCUS_STATE),

ASSIGNMENT_STATE(SchemaConstants.MODEL_POLICY_SITUATION_ASSIGNMENT_STATE, PolicyConstraintKindType.ASSIGNMENT_STATE),
Expand Down
Expand Up @@ -38,7 +38,6 @@
import com.evolveum.midpoint.model.impl.expr.ExpressionEnvironment;
import com.evolveum.midpoint.model.impl.expr.ModelExpressionThreadLocalHolder;
import com.evolveum.midpoint.model.impl.lens.projector.FocusConstraintsChecker;
import com.evolveum.midpoint.model.impl.lens.projector.policy.PolicyRuleProcessor;
import com.evolveum.midpoint.model.impl.lens.projector.credentials.CredentialsProcessor;
import com.evolveum.midpoint.model.impl.util.Utils;
import com.evolveum.midpoint.prism.*;
Expand Down Expand Up @@ -174,6 +173,7 @@ public <O extends ObjectType> boolean executeChanges(LensContext<O> context, Tas
ObjectDelta<O> focusDelta = focusContext.getWaveExecutableDelta(context.getExecutionWave());

focusDelta = policySituationUpdater.applyAssignmentSituation(context, focusDelta);
policySituationUpdater.storeFocusPolicySituation(context);

if (focusDelta != null) {

Expand Down
Expand Up @@ -168,12 +168,16 @@ private String getSituationFromConstraints(PolicyConstraintsType policyConstrain
return PredefinedPolicySituation.MODIFIED.getUrl();
} else if (policyConstraints.getAssignment() != null) {
return PredefinedPolicySituation.ASSIGNED.getUrl();
} else if (policyConstraints.getTimeValidity() != null) {
return PredefinedPolicySituation.TIME_VALIDITY.getUrl();
} else if (policyConstraints.getHasAssignment() != null) {
return PredefinedPolicySituation.HAS_ASSIGNMENT.getUrl();
} else if (policyConstraints.getHasNoAssignment() != null) {
return PredefinedPolicySituation.HAS_NO_ASSIGNMENT.getUrl();
} else if (policyConstraints.getFocusState() != null) {
return PredefinedPolicySituation.FOCUS_STATE.getUrl();
} else if (policyConstraints.getAssignmentState() != null) {
return PredefinedPolicySituation.ASSIGNMENT_STATE.getUrl();
} else if (policyConstraints.getTimeValidity() != null) {
return PredefinedPolicySituation.TIME_VALIDITY.getUrl();
}
for (PolicyConstraintsType subconstraints : policyConstraints.getAnd()) {
String s = getSituationFromConstraints(subconstraints);
Expand Down
Expand Up @@ -25,9 +25,7 @@
import com.evolveum.midpoint.prism.delta.*;
import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.PolicyRuleTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
Expand Down Expand Up @@ -230,13 +228,13 @@ private <F extends FocusType> boolean shouldSituationBeUpdated(EvaluatedAssignme
return false;
}

// TODO call this from somewhere!!!
public <F extends FocusType> void storeFocusPolicySituation(LensContext<F> context, Task task, OperationResult result)
public <O extends ObjectType, F extends FocusType> void storeFocusPolicySituation(LensContext<O> context)
throws SchemaException {
LensFocusContext<F> focusContext = context.getFocusContext();
if (focusContext == null) {
if (context.getFocusContext() == null || context.getFocusClass() == null || !FocusType.class.isAssignableFrom(context.getFocusClass())) {
return;
}
@SuppressWarnings({"raw", "unchecked"})
LensFocusContext<F> focusContext = (LensFocusContext<F>) context.getFocusContext();
Set<String> currentSituations = focusContext.getObjectCurrent() != null ?
new HashSet<>(focusContext.getObjectCurrent().asObjectable().getPolicySituation()) : Collections.emptySet();
Set<String> newSituations = new HashSet<>(focusContext.getPolicySituations());
Expand Down
Expand Up @@ -29,13 +29,11 @@
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.delta.DeltaSetTriple;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyConstraintKindType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
Expand Down Expand Up @@ -303,6 +301,19 @@ protected void dumpPolicyRules(LensContext<UserType> context) {
display("Policy rules", context.dumpPolicyRules(3));
}

protected void dumpPolicySituations(LensContext<? extends FocusType> context) {
LensFocusContext<? extends FocusType> focusContext = context.getFocusContext();
if (focusContext != null && focusContext.getObjectNew() != null) {
FocusType focus = focusContext.getObjectNew().asObjectable();
display("focus policy situation", focus.getPolicySituation());
for (AssignmentType assignment : focus.getAssignment()) {
display("assignment policy situation", assignment.getPolicySituation());
}
} else {
display("no focus context or object");
}
}

protected void assertAssignmentPath(AssignmentPath path, String... targetOids) {
assertEquals("Wrong path size", targetOids.length, path.size());
for (int i = 0; i < targetOids.length; i++) {
Expand All @@ -316,4 +327,12 @@ protected void assertAssignmentPath(AssignmentPath path, String... targetOids) {
}
}

protected void assertAssignmentPolicySituation(LensContext<? extends FocusType> context, String roleOid, String... uris) {
AssignmentType assignment = findAssignmentByTargetRequired(context.getFocusContext().getObjectNew(), roleOid);
PrismAsserts.assertEqualsCollectionUnordered("Wrong assignment policy situation", assignment.getPolicySituation(), uris);
}

protected void assertFocusPolicySituation(LensContext<? extends FocusType> context, String... uris) {
PrismAsserts.assertEqualsCollectionUnordered("Wrong focus policy situation", context.getFocusContext().getObjectNew().asObjectable().getPolicySituation(), uris);
}
}
Expand Up @@ -106,6 +106,7 @@ public void test005JackAttemptAssignRoleJudge() throws Exception {
TestUtil.assertSuccess(result);

dumpPolicyRules(context);
//dumpPolicySituations(context);

assertEvaluatedTargetPolicyRules(context, 7);
assertTargetTriggers(context, PolicyConstraintKindType.FOCUS_STATE, 2);
Expand Down Expand Up @@ -143,6 +144,7 @@ public void test007JackAttemptAssignRoleJudgeAsOwner() throws Exception {
TestUtil.assertSuccess(result);

dumpPolicyRules(context);
//dumpPolicySituations(context);

assertEvaluatedTargetPolicyRules(context, 4);
assertTargetTriggers(context, PolicyConstraintKindType.ASSIGNMENT, 0);
Expand Down Expand Up @@ -206,6 +208,7 @@ public void test020JackUnassignRoleJudge() throws Exception {
TestUtil.assertSuccess(result);

dumpPolicyRules(context);
dumpPolicySituations(context);

assertEvaluatedTargetPolicyRules(context, 7);
assertTargetTriggers(context, PolicyConstraintKindType.ASSIGNMENT, 2);
Expand Down Expand Up @@ -250,6 +253,7 @@ public void test100AssignRoleMutinierToJack() throws Exception {
// display("Output evaluatedAssignmentTriple", evaluatedAssignmentTriple);

dumpPolicyRules(context);
dumpPolicySituations(context);

assertEvaluatedTargetPolicyRules(context, 7);
assertTargetTriggers(context, null, 0);
Expand Down Expand Up @@ -289,6 +293,7 @@ public void test110AssignRolePirateToJack() throws Exception {
// display("Output evaluatedAssignmentTriple", evaluatedAssignmentTriple);

dumpPolicyRules(context);
dumpPolicySituations(context);

assertEvaluatedTargetPolicyRules(context, 7);
EvaluatedExclusionTrigger trigger = (EvaluatedExclusionTrigger) assertTriggeredTargetPolicyRule(context, null, PolicyConstraintKindType.EXCLUSION, 1, true);
Expand Down Expand Up @@ -338,6 +343,7 @@ public void test112AssignRolePirateWithExceptionToJack() throws Exception {
// display("Output evaluatedAssignmentTriple", evaluatedAssignmentTriple);

dumpPolicyRules(context);
dumpPolicySituations(context);

List<EvaluatedPolicyRule> evaluatedRules = assertEvaluatedTargetPolicyRules(context, 7);
assertTargetTriggers(context, null, 0);
Expand Down Expand Up @@ -383,6 +389,7 @@ public void test120AssignRoleConstableToJack() throws Exception {
// display("Output evaluatedAssignmentTriple", evaluatedAssignmentTriple);

dumpPolicyRules(context);
dumpPolicySituations(context);

assertEvaluatedTargetPolicyRules(context, 8);
// conflicting assignment was pruned, so the exclusion is no longer present here
Expand Down Expand Up @@ -442,6 +449,7 @@ public void test150AssignRoleThiefToJack() throws Exception {
display("Output evaluatedAssignmentTriple", evaluatedAssignmentTriple);

dumpPolicyRules(context);
dumpPolicySituations(context);

assertEvaluatedTargetPolicyRules(context, 9);
assertTargetTriggers(context, PolicyConstraintKindType.EXCLUSION, 1);
Expand Down Expand Up @@ -520,6 +528,7 @@ public void test210AssignRoleEmployeeToJack() throws Exception {
//display("Output evaluatedAssignmentTriple", evaluatedAssignmentTriple);

dumpPolicyRules(context);
dumpPolicySituations(context);

// Judge: criminal-exclusion, unassignment, all-assignment-operations, all-assignment-operations-on-jack, all-assignment-operations-on-elaine, all-assignment-operations-on-jack-via-script, global-assignment-notification-for-judge
// Employee: approve-any-corp-role, notify-exclusion-violations, employee-excludes-contractor
Expand Down Expand Up @@ -566,6 +575,7 @@ public void test220AssignRoleEngineerToJack() throws Exception {
//display("Output evaluatedAssignmentTriple", evaluatedAssignmentTriple);

dumpPolicyRules(context);
dumpPolicySituations(context);

// Judge: L:criminal-exclusion, L:unassignment, L:all-assignment-operations
// Contractor: L:approve-any-corp-role, L:notify-exclusion-violations, L:contractor-excludes-employee
Expand Down

0 comments on commit 6110431

Please sign in to comment.