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")