Skip to content

Commit

Permalink
Fixed storing policy state, including situation triggers.
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Sep 26, 2017
1 parent 3241d5d commit 1dbcc03
Show file tree
Hide file tree
Showing 17 changed files with 205 additions and 107 deletions.
Expand Up @@ -412,10 +412,10 @@
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="PolicyTriggerStorageStrategyType">
<xsd:simpleType name="TriggeredPolicyRulesStorageStrategyType">
<xsd:annotation>
<xsd:documentation>
If triggers are to be stored, what level of details should be preserved?
How much information about triggered policy rules should be stored?
EXPERIMENTAL
</xsd:documentation>
<xsd:appinfo>
Expand All @@ -427,7 +427,7 @@
<xsd:enumeration value="none">
<xsd:annotation>
<xsd:documentation>
Triggers will not be stored.
Triggered policy rules will not be stored.
</xsd:documentation>
<xsd:appinfo>
<jaxb:typesafeEnumMember name="NONE"/>
Expand All @@ -447,7 +447,8 @@
<xsd:enumeration value="full">
<xsd:annotation>
<xsd:documentation>
The triggers for the rule will be stored (including subtriggers). Hidden and final presentation settings are respected.
The triggers and other information for the rule will be stored (including subtriggers).
Hidden and final presentation settings are respected.
</xsd:documentation>
<xsd:appinfo>
<jaxb:typesafeEnumMember name="FULL"/>
Expand All @@ -457,6 +458,41 @@
</xsd:restriction>
</xsd:simpleType>

<!--<xsd:simpleType name="SituationConstraintsStorageStrategyType">-->
<!--<xsd:annotation>-->
<!--<xsd:documentation>-->
<!--Should triggers for situation constraints be stored "as is" or should referenced rules be unwrapped?-->
<!--EXPERIMENTAL-->
<!--</xsd:documentation>-->
<!--<xsd:appinfo>-->
<!--<jaxb:typesafeEnumClass/>-->
<!--<a:deprecated>true</a:deprecated>-->
<!--</xsd:appinfo>-->
<!--</xsd:annotation>-->
<!--<xsd:restriction base="xsd:string">-->
<!--<xsd:enumeration value="asIs">-->
<!--<xsd:annotation>-->
<!--<xsd:documentation>-->
<!--Triggers for situation constraints should be stored "as is".-->
<!--</xsd:documentation>-->
<!--<xsd:appinfo>-->
<!--<jaxb:typesafeEnumMember name="AS_IS"/>-->
<!--</xsd:appinfo>-->
<!--</xsd:annotation>-->
<!--</xsd:enumeration>-->
<!--<xsd:enumeration value="unwrapped">-->
<!--<xsd:annotation>-->
<!--<xsd:documentation>-->
<!--Rules referenced from situation constraints should be unwrapped.-->
<!--</xsd:documentation>-->
<!--<xsd:appinfo>-->
<!--<jaxb:typesafeEnumMember name="UNWRAPPED"/>-->
<!--</xsd:appinfo>-->
<!--</xsd:annotation>-->
<!--</xsd:enumeration>-->
<!--</xsd:restriction>-->
<!--</xsd:simpleType>-->

<xsd:complexType name="ExclusionPolicyConstraintType">
<xsd:annotation>
<xsd:documentation>
Expand Down Expand Up @@ -1389,18 +1425,22 @@
<xsd:complexContent>
<xsd:extension base="tns:PolicyActionType">
<xsd:sequence>
<xsd:element name="triggerStorageStrategy" type="tns:PolicyTriggerStorageStrategyType" minOccurs="0">
<xsd:element name="policyRules" type="tns:TriggeredPolicyRulesStorageStrategyType" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
How should be triggers stored?
How much information about triggered policy rules should be stored?
EXPERIMENTAL
</xsd:documentation>
<xsd:appinfo>
<a:since>3.7</a:since>
<a:experimental>true</a:experimental>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<!--<xsd:element name="situationConstraints" type="tns:SituationConstraintsStorageStrategyType" minOccurs="0">-->
<!--<xsd:annotation>-->
<!--<xsd:documentation>-->
<!--Should triggers for situation constraints be stored "as is" or should referenced rules be unwrapped?-->
<!--EXPERIMENTAL-->
<!--</xsd:documentation>-->
<!--</xsd:annotation>-->
<!--</xsd:element>-->

</xsd:sequence>
</xsd:extension>
Expand Down
Expand Up @@ -395,7 +395,7 @@
<policySituation>http://sample.org/situations#incomplete-role-c1-to-c4</policySituation>
<policyActions>
<record>
<triggerStorageStrategy>full</triggerStorageStrategy>
<policyRules>full</policyRules>
</record>
</policyActions>
<focusSelector>
Expand All @@ -413,7 +413,7 @@
<policySituation>http://sample.org/situations#active-role-with-no-identifier</policySituation>
<policyActions>
<record>
<triggerStorageStrategy>none</triggerStorageStrategy>
<policyRules>none</policyRules>
</record>
</policyActions>
<focusSelector>
Expand Down
Expand Up @@ -24,7 +24,7 @@

import java.util.Objects;

import static com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyTriggerStorageStrategyType.FULL;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.TriggeredPolicyRulesStorageStrategyType.FULL;

/**
* @author mederly
Expand Down Expand Up @@ -82,7 +82,7 @@ protected void debugDumpSpecific(StringBuilder sb, int indent) {
public EvaluatedExclusionTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) {
EvaluatedExclusionTriggerType rv = new EvaluatedExclusionTriggerType();
fillCommonContent(rv);
if (options.getTriggerStorageStrategy() == FULL) {
if (options.getTriggeredRulesStorageStrategy() == FULL) {
rv.setConflictingObjectRef(ObjectTypeUtil.createObjectRef(conflictingTarget));
rv.setConflictingObjectDisplayName(ObjectTypeUtil.getDisplayName(conflictingTarget));
if (conflictingPath != null) {
Expand Down
Expand Up @@ -66,7 +66,7 @@ default boolean isTriggered() {

Collection<PolicyExceptionType> getPolicyExceptions();

EvaluatedPolicyRuleType toEvaluatedPolicyRuleType(PolicyRuleExternalizationOptions options);
void addToEvaluatedPolicyRuleTypes(Collection<EvaluatedPolicyRuleType> rules, PolicyRuleExternalizationOptions options);

boolean isGlobal();

Expand Down
Expand Up @@ -107,7 +107,7 @@ public EvaluatedSituationTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRule
EvaluatedSituationTriggerType rv = new EvaluatedSituationTriggerType();
fillCommonContent(rv);
if (!options.isRespectFinalFlag() || !isFinal()) {
sourceRules.forEach(r -> rv.getSourceRule().add(r.toEvaluatedPolicyRuleType(options)));
sourceRules.forEach(r -> r.addToEvaluatedPolicyRuleTypes(rv.getSourceRule(), options));
}
return rv;
}
Expand Down
Expand Up @@ -16,36 +16,36 @@

package com.evolveum.midpoint.model.api.context;

import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyTriggerStorageStrategyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggeredPolicyRulesStorageStrategyType;
import org.jetbrains.annotations.NotNull;

import java.io.Serializable;

import static com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyTriggerStorageStrategyType.FULL;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.TriggeredPolicyRulesStorageStrategyType.FULL;

/**
* @author mederly
*/
public class PolicyRuleExternalizationOptions implements Serializable {

@NotNull private PolicyTriggerStorageStrategyType triggerStorageStrategy;
@NotNull private TriggeredPolicyRulesStorageStrategyType triggeredRulesStorageStrategy;
private boolean includeAssignmentsContent;
private boolean respectFinalFlag;

public PolicyRuleExternalizationOptions() {
this(FULL, false, true);
}

public PolicyRuleExternalizationOptions(PolicyTriggerStorageStrategyType triggerStorageStrategy,
public PolicyRuleExternalizationOptions(TriggeredPolicyRulesStorageStrategyType triggeredRulesStorageStrategy,
boolean includeAssignmentsContent, boolean respectFinalFlag) {
this.triggerStorageStrategy = triggerStorageStrategy != null ? triggerStorageStrategy : FULL;
this.triggeredRulesStorageStrategy = triggeredRulesStorageStrategy != null ? triggeredRulesStorageStrategy : FULL;
this.includeAssignmentsContent = includeAssignmentsContent;
this.respectFinalFlag = respectFinalFlag;
}

@NotNull
public PolicyTriggerStorageStrategyType getTriggerStorageStrategy() {
return triggerStorageStrategy;
public TriggeredPolicyRulesStorageStrategyType getTriggeredRulesStorageStrategy() {
return triggeredRulesStorageStrategy;
}

public boolean isIncludeAssignmentsContent() {
Expand Down
Expand Up @@ -40,7 +40,7 @@
import java.util.Collections;
import java.util.List;

import static com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyTriggerStorageStrategyType.FULL;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.TriggeredPolicyRulesStorageStrategyType.FULL;

/**
* Hook used to enforce the policy rules that have the enforce action.
Expand Down Expand Up @@ -138,7 +138,7 @@ private <F extends FocusType> void enforceTriggeredRules(EvaluationContext evalC
}

// TODO really include assignments content?
evalCtx.rules.add(policyRule.toEvaluatedPolicyRuleType(new PolicyRuleExternalizationOptions(FULL, true, true)));
policyRule.addToEvaluatedPolicyRuleTypes(evalCtx.rules, new PolicyRuleExternalizationOptions(FULL, true, true));

for (EvaluatedPolicyRuleTrigger trigger: triggers) {
if (trigger.getMessage() != null) {
Expand Down
Expand Up @@ -24,7 +24,7 @@

import com.evolveum.midpoint.common.Clock;
import com.evolveum.midpoint.common.SynchronizationUtils;
import com.evolveum.midpoint.model.impl.lens.projector.policy.PolicyStateUpdater;
import com.evolveum.midpoint.model.impl.lens.projector.policy.PolicyStateRecorder;
import com.evolveum.midpoint.prism.delta.*;
import com.evolveum.midpoint.repo.api.ConflictWatcher;
import com.evolveum.midpoint.repo.common.expression.Expression;
Expand Down Expand Up @@ -116,7 +116,6 @@ public class ChangeExecutor {
@Autowired private Clock clock;
@Autowired private ModelObjectResolver objectResolver;
@Autowired private OperationalDataManager metadataManager;
@Autowired private PolicyStateUpdater policyStateUpdater;
@Autowired private CredentialsProcessor credentialsProcessor;

private PrismObjectDefinition<UserType> userDefinition = null;
Expand Down
Expand Up @@ -15,10 +15,6 @@
*/
package com.evolveum.midpoint.model.impl.lens;

import java.util.*;
import java.util.Objects;
import java.util.stream.Collectors;

import com.evolveum.midpoint.model.api.context.*;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.util.PrismPrettyPrinter;
Expand All @@ -31,7 +27,13 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import static com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyTriggerStorageStrategyType.FULL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import static com.evolveum.midpoint.xml.ns._public.common.common_3.TriggeredPolicyRulesStorageStrategyType.FULL;

/**
* @author semancik
Expand Down Expand Up @@ -315,19 +317,30 @@ private void createMessageTreeNode(TreeNode<LocalizableMessage> root, EvaluatedP
*/

@Override
public EvaluatedPolicyRuleType toEvaluatedPolicyRuleType(PolicyRuleExternalizationOptions options) {
public void addToEvaluatedPolicyRuleTypes(Collection<EvaluatedPolicyRuleType> rules, PolicyRuleExternalizationOptions options) {
EvaluatedPolicyRuleType rv = new EvaluatedPolicyRuleType();
rv.setRuleName(getName());
boolean isFull = options.getTriggerStorageStrategy() == FULL;
boolean isFull = options.getTriggeredRulesStorageStrategy() == FULL;
if (isFull && assignmentPath != null) {
rv.setAssignmentPath(assignmentPath.toAssignmentPathType(options.isIncludeAssignmentsContent()));
}
if (isFull && directOwner != null) {
rv.setDirectOwnerRef(ObjectTypeUtil.createObjectRef(directOwner));
rv.setDirectOwnerDisplayName(ObjectTypeUtil.getDisplayName(directOwner));
}
triggers.forEach(t -> rv.getTrigger().add(t.toEvaluatedPolicyRuleTriggerType(options)));
return rv;
for (EvaluatedPolicyRuleTrigger<?> trigger : triggers) {
if (trigger instanceof EvaluatedSituationTrigger && trigger.isHidden()) {
for (EvaluatedPolicyRule sourceRule : ((EvaluatedSituationTrigger) trigger).getSourceRules()) {
sourceRule.addToEvaluatedPolicyRuleTypes(rules, options);
}
} else {
rv.getTrigger().add(trigger.toEvaluatedPolicyRuleTriggerType(options));
}
}
if (rv.getTrigger().isEmpty()) {
// skip empty situation rule
} else {
rules.add(rv);
}
}

}
Expand Up @@ -69,7 +69,7 @@ public class PolicyRuleProcessor {
@Autowired @Qualifier("cacheRepositoryService") private RepositoryService repositoryService;
@Autowired private MappingFactory mappingFactory;
@Autowired private MappingEvaluator mappingEvaluator;
@Autowired private PolicyStateUpdater policyStateUpdater;
@Autowired private PolicyStateRecorder policyStateRecorder;

@Autowired private AssignmentConstraintEvaluator assignmentConstraintEvaluator;
@Autowired private HasAssignmentConstraintEvaluator hasAssignmentConstraintEvaluator;
Expand Down Expand Up @@ -149,7 +149,7 @@ public <F extends FocusType> void evaluateAssignmentPolicyRules(LensContext<F> c
}
}
}
policyStateUpdater.applyAssignmentState(context, evaluatedAssignment, globalCtx.rulesToRecord);
policyStateRecorder.applyAssignmentState(context, evaluatedAssignment, globalCtx.rulesToRecord);
}

exclusionConstraintEvaluator.checkExclusionsLegacy(context, evaluatedAssignmentTriple.getPlusSet(),
Expand Down Expand Up @@ -214,7 +214,7 @@ public <F extends FocusType> void evaluateObjectPolicyRules(LensContext<F> conte
for (EvaluatedPolicyRule rule : situationRules) {
evaluateFocusRule(rule, context, globalCtx, task, result);
}
policyStateUpdater.applyObjectState(context, globalCtx.rulesToRecord);
policyStateRecorder.applyObjectState(context, globalCtx.rulesToRecord);
}

private <F extends FocusType> Collection<? extends PolicyRuleType> getAllGlobalRules(LensContext<F> context) {
Expand Down
Expand Up @@ -43,9 +43,9 @@
* @author mederly
*/
@Component
public class PolicyStateUpdater {
public class PolicyStateRecorder {

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

@Autowired private PrismContext prismContext;

Expand Down Expand Up @@ -110,14 +110,16 @@ private ComputationResult compute(@NotNull List<EvaluatedPolicyRule> rulesToReco
for (EvaluatedPolicyRule rule : rulesToRecord) {
cr.newPolicySituations.add(rule.getPolicySituation());
RecordPolicyActionType recordAction = rule.getActions().getRecord();
if (recordAction.getTriggerStorageStrategy() != PolicyTriggerStorageStrategyType.NONE) {
cr.newTriggeredRules.add(rule.toEvaluatedPolicyRuleType(new PolicyRuleExternalizationOptions(recordAction.getTriggerStorageStrategy(), false, true)));
if (recordAction.getPolicyRules() != TriggeredPolicyRulesStorageStrategyType.NONE) {
PolicyRuleExternalizationOptions externalizationOptions = new PolicyRuleExternalizationOptions(
recordAction.getPolicyRules(), false, true);
rule.addToEvaluatedPolicyRuleTypes(cr.newTriggeredRules, externalizationOptions);
}
}
cr.oldPolicySituations.addAll(existingPolicySituation);
cr.oldTriggeredRules.addAll(existingTriggeredPolicyRule);
cr.situationsNeedUpdate = !Objects.equals(cr.oldPolicySituations, cr.newPolicySituations);
// we do not use this, because it uses hashCode, that is (for some reason) wrongly computed
// we do not use Objects.equal, because it uses hashCode, that is (for some reason) wrongly computed
//cr.rulesNeedUpdate = !Objects.equals(cr.oldTriggeredRules, cr.newTriggeredRules);
cr.rulesNeedUpdate = !MiscUtil.unorderedCollectionEquals(cr.oldTriggeredRules, cr.newTriggeredRules);
return cr;
Expand Down

0 comments on commit 1dbcc03

Please sign in to comment.