diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/traces/operations/ValueTupleTransformationOpNode.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/traces/operations/ValueTupleTransformationOpNode.java index 0f5c14ba084..10b539f0227 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/traces/operations/ValueTupleTransformationOpNode.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/traces/operations/ValueTupleTransformationOpNode.java @@ -38,16 +38,10 @@ public String getValueTupleTransformationDescription() { sb.append("for ").append(trace.getLocalContextDescription()).append(" "); } sb.append("("); - if (Boolean.TRUE.equals(trace.isHasPlus())) { - sb.append("+"); + if (trace.getInputOrigin() != null) { + sb.append(trace.getInputOrigin()).append(" → "); } - if (Boolean.TRUE.equals(trace.isHasMinus())) { - sb.append("-"); - } - if (Boolean.TRUE.equals(trace.isHasZero())) { - sb.append("0"); - } - sb.append(" → ").append(trace.getDestination()); + sb.append(trace.getDestination()); sb.append(")"); if (Boolean.FALSE.equals(trace.isConditionResult())) { sb.append(" [cond: false]"); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 2eb5297c3d9..ed25f1b143a 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -22885,6 +22885,19 @@ + + + + "Pushes" changes even if they are phantom. For example, when disabling already disabled user with this + option, all related administrativeStatus-sourced mappings are evaluated even if they would be normally + skipped. This restores behavior of midPoint before 4.2. + + + 4.2 + true + + + diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-model-context-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-model-context-3.xsd index 4c0b4c8c159..e75e76c3658 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-model-context-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-model-context-3.xsd @@ -1428,6 +1428,13 @@ + + + + 4.2 + + + @@ -1454,6 +1461,13 @@ + + + + 4.2 + + + @@ -1757,33 +1771,13 @@ - - - - Does this tuple contain a value that is present in plus set of its source? - (This is an internal implementation information. So this item can change in later versions.) - - - 4.2 - - - - - - - Does this tuple contain a value that is present in minus set of its source? - (This is an internal implementation information. So this item can change in later versions.) - - - 4.2 - - - - + - Does this tuple contain a value that is present in zero set of its source? - (This is an internal implementation information. So this item can change in later versions.) + String representation of the input origin. + P means plus, M means minus, Z means zero for each input in question. + (This awkward form was chosen because multivalued properties in containers + have no guaranteed value ordering.) 4.2 diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java index 438a90ac54b..da0676d6183 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java @@ -128,6 +128,23 @@ public static boolean isForce(ModelExecuteOptions options) { return is(options, ModelExecuteOptionsType.F_FORCE); } + public Boolean getPushChanges() { + return content.isPushChanges(); + } + + public static boolean isPushChanges(ModelExecuteOptions options) { + return is(options, F_PUSH_CHANGES); + } + + public ModelExecuteOptions pushChanges(Boolean value) { + content.setPushChanges(value); + return this; + } + + public ModelExecuteOptions pushChanges() { + return pushChanges(true); + } + public Boolean getRaw() { return content.isRaw(); } @@ -414,6 +431,9 @@ public static ModelExecuteOptions fromRestOptions(List options, PrismCon if (ModelExecuteOptionsType.F_FORCE.getLocalPart().equals(option)) { retVal.force(true); } + if (F_PUSH_CHANGES.getLocalPart().equals(option)) { + retVal.pushChanges(true); + } if (F_NO_CRYPT.getLocalPart().equals(option)) { retVal.noCrypt(true); } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/transformation/CombinatorialEvaluation.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/transformation/CombinatorialEvaluation.java index f81d0889419..ce9209f0a6c 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/transformation/CombinatorialEvaluation.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/transformation/CombinatorialEvaluation.java @@ -145,7 +145,8 @@ private void transform(List sets, PlusMinusZero outputSet) { List> domains = createDomainsForSets(sets); logDomainsForSets(domains, sets, outputSet); MiscUtil.carthesian(domains, valuesTuple -> { - try (ValueTupleTransformation valueTupleTransformation = new ValueTupleTransformation<>(valuesTuple, outputSet, this, parentResult)) { + try (ValueTupleTransformation valueTupleTransformation = + new ValueTupleTransformation<>(sets, valuesTuple, outputSet, this, parentResult)) { valueTupleTransformation.evaluate(); } }); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/transformation/ValueTupleTransformation.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/transformation/ValueTupleTransformation.java index 073705d7c78..79d07a93e20 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/transformation/ValueTupleTransformation.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/transformation/ValueTupleTransformation.java @@ -12,6 +12,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; import com.evolveum.midpoint.prism.ValueMetadata; @@ -64,6 +65,11 @@ class ValueTupleTransformation implements AutoCloseable { */ @NotNull private final List> sourceTripleList; + /** + * Sets (plus/minus/zero) from which individual values were selected. + */ + @NotNull private final List sets; + /** * Currently transformed value tuple - one value from every source. */ @@ -89,21 +95,6 @@ class ValueTupleTransformation implements AutoCloseable { */ private final int numberOfSources; -// /** -// * Does this tuple contain a value that is present in plus set of its source? -// */ -// private boolean hasPlus; -// -// /** -// * Does this tuple contain a value that is present in minus set of its source? -// */ -// private boolean hasMinus; -// -// /** -// * Does this tuple contain a value that is present in zero set of its source? -// */ -// private boolean hasZero; - /** * What state (old, new) should be input variables taken from? */ @@ -125,11 +116,12 @@ class ValueTupleTransformation implements AutoCloseable { */ private Collection transformationResult; - ValueTupleTransformation(List valuesTuple, PlusMinusZero outputSet, CombinatorialEvaluation combinatorialEvaluation, - OperationResult parentResult) { + ValueTupleTransformation(@NotNull List sets, List valuesTuple, PlusMinusZero outputSet, + CombinatorialEvaluation combinatorialEvaluation, OperationResult parentResult) { this.combinatorialEvaluation = combinatorialEvaluation; this.context = combinatorialEvaluation.context; this.sourceTripleList = combinatorialEvaluation.sourceTripleList; + this.sets = sets; this.valuesTuple = valuesTuple; this.outputSet = outputSet; this.inputVariableState = InputVariableState.forOutputSet(outputSet); @@ -387,6 +379,23 @@ private void dumpValueCombinationToTrace() { SourceTriple sourceTriple = sourceTriplesIterator.next(); trace.getInput().add(TraceUtil.toNamedValueType(pval, sourceTriple.getName(), combinatorialEvaluation.prismContext)); } + trace.setInputOrigin( + sets.stream() + .map(this::toChar) + .collect(Collectors.joining())); + } + + private String toChar(PlusMinusZero set) { + switch (set) { + case PLUS: + return "P"; + case MINUS: + return "M"; + case ZERO: + return "Z"; + default: + throw new AssertionError(set); + } } private void recordBeforeTransformation() { @@ -395,9 +404,6 @@ private void recordBeforeTransformation() { context.isSkipEvaluationPlus(), context.isSkipEvaluationMinus(), outputSet, inputVariableState); if (trace != null) { -// trace.setHasPlus(hasPlus); -// trace.setHasMinus(hasMinus); -// trace.setHasZero(hasZero); trace.setLocalContextDescription(context.getLocalContextDescription()); } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/AbstractMappingImpl.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/AbstractMappingImpl.java index b37935ada0b..06f8fbf0695 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/AbstractMappingImpl.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/AbstractMappingImpl.java @@ -284,6 +284,23 @@ public abstract class AbstractMappingImpl outputTriple; + /** + * Whether we were requested to "push" (phantom) changes: source items that have a delta but their + * real value has not changed. + * + * TODO move to "configuration" options and provide via builder. + * (Current way of determining via lens context is more a hack than real solution.) + */ + @Experimental + private boolean pushChangesRequested; + + /** + * Whether the conditions for pushing the changes at output were fulfilled, + * so we instruct the consolidator (or analogous component) to do that. + */ + @Experimental + private boolean pushChanges; + /** * Result of the condition evaluation in old vs. new state. */ @@ -758,8 +775,12 @@ private void recordSources() throws SchemaException { } private void recordOutput() { - if (trace != null && outputTriple != null) { - trace.setOutput(DeltaSetTripleType.fromDeltaSetTriple(outputTriple, beans.prismContext)); + if (trace != null) { + if (outputTriple != null) { + trace.setOutput(DeltaSetTripleType.fromDeltaSetTriple(outputTriple, beans.prismContext)); + } + trace.setPushChangesRequested(pushChangesRequested); + trace.setPushChanges(pushChanges); } } @@ -1269,6 +1290,9 @@ private void evaluateExpression(OperationResult result) outputTriple = expression.evaluate(context, result); + pushChangesRequested = determinePushChangesRequested(); + pushChanges = pushChangesRequested && sourcesChanged(); + if (outputTriple == null) { if (conditionResultNew) { @@ -1307,6 +1331,8 @@ protected abstract TransformationValueMetadataComputer createValueMetadataComput ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException; + protected abstract boolean determinePushChangesRequested(); + @Override public PrismValueDeltaSetTriple getOutputTriple() { if (outputTriple != null && InternalsConfig.consistencyChecks) { @@ -1488,12 +1514,6 @@ void recordTimeTo(XMLGregorianCalendar timeTo) { } } -// // TEMPORARY -// List getMetadataMappings() { -// return mappingBean instanceof MappingType ? -// ((MappingType) mappingBean).getMetadataMapping() : null; -// } -// @NotNull public ModelCommonBeans getBeans() { return beans; @@ -1508,4 +1528,10 @@ public List getSourceNames() { .map(Source::getName) .collect(Collectors.toList()); } + + @Experimental + @Override + public boolean isPushChanges() { + return pushChanges; + } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/MappingImpl.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/MappingImpl.java index 2cc9c4fa417..159d38a4e7b 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/MappingImpl.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/MappingImpl.java @@ -7,6 +7,9 @@ package com.evolveum.midpoint.model.common.mapping; +import com.evolveum.midpoint.model.api.ModelExecuteOptions; +import com.evolveum.midpoint.model.api.context.ModelContext; +import com.evolveum.midpoint.model.common.expression.ModelExpressionThreadLocalHolder; import com.evolveum.midpoint.model.common.mapping.metadata.TransformationalMetadataComputation; import com.evolveum.midpoint.model.common.mapping.metadata.ItemValueMetadataProcessingSpec; import com.evolveum.midpoint.prism.ItemDefinition; @@ -15,6 +18,7 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ValueMetadataType; import org.jetbrains.annotations.NotNull; @@ -85,4 +89,11 @@ private ItemValueMetadataProcessingSpec createProcessingSpec(OperationResult res public MappingImpl clone() { return new MappingImpl<>(this); } + + @Override + protected boolean determinePushChangesRequested() { + ModelContext lensContext = ModelExpressionThreadLocalHolder.getLensContext(); + ModelExecuteOptions options = lensContext != null ? lensContext.getOptions() : null; + return ModelExecuteOptions.isPushChanges(options); + } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/PrismValueDeltaSetTripleProducer.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/PrismValueDeltaSetTripleProducer.java index e4af76d39b3..11fb74d389d 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/PrismValueDeltaSetTripleProducer.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/PrismValueDeltaSetTripleProducer.java @@ -56,4 +56,6 @@ default boolean isNormal() { default boolean isWeak() { return getStrength() == MappingStrengthType.WEAK; } + + boolean isPushChanges(); } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/metadata/MetadataMappingImpl.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/metadata/MetadataMappingImpl.java index eae25c04d62..1132e3eae94 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/metadata/MetadataMappingImpl.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/metadata/MetadataMappingImpl.java @@ -33,6 +33,11 @@ protected TransformationValueMetadataComputer createValueMetadataComputer(Operat return null; } + @Override + protected boolean determinePushChangesRequested() { + return false; + } + @Override public MetadataMappingImpl clone() { return new MetadataMappingImpl<>(this); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ItemValueWithOrigin.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ItemValueWithOrigin.java index 61aa9040dac..d8c4cf939bc 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ItemValueWithOrigin.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ItemValueWithOrigin.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.annotation.Experimental; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.jetbrains.annotations.NotNull; @@ -142,4 +143,9 @@ public boolean isWeak() { boolean isSourceless() { return mapping != null && mapping.isSourceless(); } + + @Experimental + public boolean isPushChanges() { + return mapping != null && mapping.isPushChanges(); + } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/IvwoConsolidator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/IvwoConsolidator.java index 2360d5cc5ba..b6ed2fd374d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/IvwoConsolidator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/IvwoConsolidator.java @@ -398,7 +398,7 @@ private Collection findAddingOrigins() { addingOrigins.addAll(equivalenceClass.zeroOrigins); } else if (addUnchangedValuesExceptForNormalMappings) { for (I zeroIvwo : equivalenceClass.zeroOrigins) { - if (zeroIvwo.isStrong() || zeroIvwo.isNormal() && zeroIvwo.isSourceless() || zeroIvwo.isWeak()) { + if (zeroIvwo.isStrong() || zeroIvwo.isNormal() && (zeroIvwo.isSourceless() || zeroIvwo.isPushChanges()) || zeroIvwo.isWeak()) { addingOrigins.add(zeroIvwo); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java index 31436f29a07..098f1ed360c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java @@ -660,7 +660,6 @@ private void evaluateActivationMapping(final LensContex evaluateOutboundMapping(context, projCtx, bidirectionalMappingType, focusPropertyPath, projectionPropertyPath, initializer, now, current, desc + " outbound activation mapping", task, result); - } private void evaluateOutboundMapping(final LensContext context, @@ -723,7 +722,6 @@ private void evaluateOutboundMapping(final LensContext< if (projCtx.isDoReconciliation()) { reconcileOutboundValue(context, projCtx, outputTripleMap, desc); } - } /** @@ -770,10 +768,8 @@ private void reconcileOutboundValue(LensContext cont Collection> shouldHaveValues = outputTriple.getNonNegativeValues(); - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("Reconciliation of {}:\n hasValues:\n{}\n shouldHaveValues\n{}", - mappingOutputPath, DebugUtil.debugDump(hasValues, 2), DebugUtil.debugDump(shouldHaveValues, 2)); - } + LOGGER.trace("Reconciliation of {}:\n hasValues:\n{}\n shouldHaveValues\n{}", + mappingOutputPath, DebugUtil.debugDumpLazily(hasValues, 2), DebugUtil.debugDumpLazily(shouldHaveValues, 2)); for (PrismPropertyValue shouldHaveValue: shouldHaveValues) { if (!PrismValueCollectionsUtil.containsRealValue(hasValues, shouldHaveValue)) { @@ -802,11 +798,8 @@ private void reconcileOutboundValue(LensContext cont projCtx.swallowToSecondaryDelta(targetItemDelta); } } - } - - private ItemDeltaItem,PrismPropertyDefinition> getLegalIdi(LensProjectionContext accCtx) throws SchemaException { Boolean legal = accCtx.isLegal(); Boolean legalOld = accCtx.isLegalOld(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java index e1683ed2fae..b6f2faee3bf 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java @@ -751,6 +751,10 @@ public String getIdentifier() { return null; } @Override + public boolean isPushChanges() { + return false; + } + @Override public String toHumanReadableDescription() { return "auxiliary object class construction " + evaluatedConstruction; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/mappings/MappingEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/mappings/MappingEvaluator.java index 6d5fa818573..db3edbdec7f 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/mappings/MappingEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/mappings/MappingEvaluator.java @@ -13,7 +13,6 @@ import javax.xml.datatype.DatatypeConstants; import javax.xml.datatype.XMLGregorianCalendar; -import com.evolveum.midpoint.model.impl.lens.assignments.AssignmentPathImpl; import com.evolveum.midpoint.model.impl.lens.assignments.AssignmentPathSegmentImpl; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -248,10 +247,8 @@ public mappingOutputTriple = mapping.getOutputTriple(); - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("Output triple of mapping {}\n{}", mapping.getContextDescription(), - mappingOutputTriple == null ? null : mappingOutputTriple.debugDump(1)); - } + LOGGER.trace("Output triple of mapping {}\n{}", mapping.getContextDescription(), + mappingOutputTriple == null ? null : mappingOutputTriple.debugDumpLazily(1)); if (isMeaningful(mappingOutputTriple)) { @@ -273,6 +270,21 @@ public outputTriple = mappingOutputStruct.getOutputTriple(); if (outputTriple == null) { mappingOutputStruct.setOutputTriple(mappingOutputTriple); @@ -428,14 +440,15 @@ public valuesToReplace; - if (hasFullTargetObject && mappingOutputStruct.isStrongMappingWasUsed()) { + if (hasFullTargetObject && (mappingOutputStruct.isStrongMappingWasUsed() || mappingOutputStruct.isPushChanges())) { valuesToReplace = outputTriple.getNonNegativeValues(); } else { valuesToReplace = outputTriple.getPlusSet(); } - LOGGER.trace("{}: hasFullTargetObject={}, isStrongMappingWasUsed={}, valuesToReplace={}", - mappingDesc, hasFullTargetObject, mappingOutputStruct.isStrongMappingWasUsed(), valuesToReplace); + LOGGER.trace("{}: hasFullTargetObject={}, isStrongMappingWasUsed={}, pushingChange={}, valuesToReplace={}", + mappingDesc, hasFullTargetObject, mappingOutputStruct.isStrongMappingWasUsed(), + mappingOutputStruct.isPushChanges(), valuesToReplace); if (!valuesToReplace.isEmpty()) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/mappings/MappingOutputStruct.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/mappings/MappingOutputStruct.java index c983b333e92..7fc343aa807 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/mappings/MappingOutputStruct.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/mappings/MappingOutputStruct.java @@ -20,6 +20,7 @@ public class MappingOutputStruct implements DebugDumpable private PrismValueDeltaSetTriple outputTriple = null; private boolean strongMappingWasUsed = false; private boolean weakMappingWasUsed = false; + private boolean pushChanges = false; public PrismValueDeltaSetTriple getOutputTriple() { return outputTriple; @@ -37,6 +38,14 @@ public void setStrongMappingWasUsed(boolean strongMappingWasUsed) { this.strongMappingWasUsed = strongMappingWasUsed; } + public boolean isPushChanges() { + return pushChanges; + } + + public void setPushChanges(boolean pushChanges) { + this.pushChanges = pushChanges; + } + public boolean isWeakMappingWasUsed() { return weakMappingWasUsed; } @@ -50,7 +59,8 @@ public String debugDump(int indent) { StringBuilder sb = DebugUtil.createTitleStringBuilderLn(MappingOutputStruct.class, indent); DebugUtil.debugDumpWithLabelLn(sb, "outputTriple", outputTriple, indent + 1); DebugUtil.debugDumpWithLabelLn(sb, "strongMappingWasUsed", strongMappingWasUsed, indent + 1); - DebugUtil.debugDumpWithLabel(sb, "weakMappingWasUsed", weakMappingWasUsed, indent + 1); + DebugUtil.debugDumpWithLabelLn(sb, "weakMappingWasUsed", weakMappingWasUsed, indent + 1); + DebugUtil.debugDumpWithLabel(sb, "pushChanges", pushChanges, indent + 1); return sb.toString(); } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java index 1358b7e7c9d..2002f8e8107 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java @@ -623,16 +623,17 @@ public void test112UserJackRecompute() throws Exception { * * TODO Sure? Enabling already enabled user is a phantom change. As such, it is now filtered out. */ - @Test(enabled = false) // MID-6420 + @Test public void test114ModifyUserJackEnable() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL); XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); + ModelExecuteOptions options = ModelExecuteOptions.create(prismContext).pushChanges(); // MID-6420 // WHEN - modifyUserReplace(USER_JACK_OID, ACTIVATION_ADMINISTRATIVE_STATUS_PATH, task, result, ActivationStatusType.ENABLED); + modifyUserReplace(USER_JACK_OID, ACTIVATION_ADMINISTRATIVE_STATUS_PATH, options, task, result, ActivationStatusType.ENABLED); // THEN result.computeStatus(); @@ -658,15 +659,16 @@ public void test114ModifyUserJackEnable() throws Exception { /** * Re-enabling the user should enable the account as well. Even if the user is already enabled. */ - @Test(enabled = false) // MID-6420, see above + @Test public void test115ModifyUserJackAdministrativeStatusNull() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL); + ModelExecuteOptions options = ModelExecuteOptions.create(prismContext).pushChanges(); // MID-6420 // WHEN - modifyUserReplace(USER_JACK_OID, ACTIVATION_ADMINISTRATIVE_STATUS_PATH, task, result); + modifyUserReplace(USER_JACK_OID, ACTIVATION_ADMINISTRATIVE_STATUS_PATH, options, task, result); // THEN result.computeStatus(); diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/consistency/TestConsistencyMechanism.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/consistency/TestConsistencyMechanism.java index 9338a0c8525..dd0adcaba61 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/consistency/TestConsistencyMechanism.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/consistency/TestConsistencyMechanism.java @@ -22,6 +22,8 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.model.api.ModelExecuteOptions; + import org.apache.commons.lang3.StringUtils; import org.opends.server.types.Entry; import org.opends.server.util.EmbeddedUtils; @@ -1387,7 +1389,7 @@ public void test250ModifyFocusCommunicationProblem() throws Exception { Task task = taskManager.createTaskInstance(); XMLGregorianCalendar lastRequestStartTs = clock.currentTimeXMLGregorianCalendar(); - executeChanges(objectDelta, null, task, parentResult); + executeChanges(objectDelta, ModelExecuteOptions.create(prismContext).pushChanges(), task, parentResult); XMLGregorianCalendar lastRequestEndTs = clock.currentTimeXMLGregorianCalendar(); parentResult.computeStatus(); @@ -1428,7 +1430,7 @@ public void test250ModifyFocusCommunicationProblem() throws Exception { .assertKind(ShadowKindType.ACCOUNT) .assertNotDead() .assertNoLegacyConsistency() - //.assertAdministrativeStatus(ActivationStatusType.ENABLED) // MID-6420 + .assertAdministrativeStatus(ActivationStatusType.ENABLED) // MID-6420 .attributes() .assertValue(LDAP_ATTRIBUTE_CN, "jackNew2") .end() @@ -1469,7 +1471,7 @@ public void test251ModifyFocusCommunicationProblemSecondTime() throws Exception .createModifyDelta(USER_JACKIE_OID, modifications, UserType.class); Task task = taskManager.createTaskInstance(); - executeChanges(objectDelta, null, task, parentResult); + executeChanges(objectDelta, ModelExecuteOptions.create(prismContext).pushChanges(), task, parentResult); XMLGregorianCalendar lastRequestEndTs = clock.currentTimeXMLGregorianCalendar(); parentResult.computeStatus(); @@ -1531,7 +1533,7 @@ public void test251ModifyFocusCommunicationProblemSecondTime() throws Exception .assertKind(ShadowKindType.ACCOUNT) .assertNotDead() .assertNoLegacyConsistency() - //.assertAdministrativeStatus(ActivationStatusType.ENABLED) // MID-6420 + .assertAdministrativeStatus(ActivationStatusType.ENABLED) // MID-6420 .attributes() .assertValue(LDAP_ATTRIBUTE_CN, "jackNew2a") .assertValue(LDAP_ATTRIBUTE_GIVENNAME, "jackNew2a")