Skip to content

Commit

Permalink
Fixing several provisioning/prism bugs that affected manual connector…
Browse files Browse the repository at this point in the history
…s (MID-4037)
  • Loading branch information
semancik committed Jun 29, 2017
1 parent 02de2b9 commit 8665554
Show file tree
Hide file tree
Showing 10 changed files with 824 additions and 133 deletions.
Expand Up @@ -397,6 +397,10 @@ public boolean containsRealValue(V value) {
return false;
}

public boolean valuesExactMatch(Collection<V> matchValues, Comparator<V> comparator) {
return MiscUtil.unorderedCollectionCompare(values, matchValues, comparator );
}

public int size() {
return values.size();
}
Expand Down
Expand Up @@ -41,6 +41,8 @@
import com.evolveum.midpoint.util.Processor;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.prism.xml.ns._public.types_3.ItemDeltaType;
import com.evolveum.prism.xml.ns._public.types_3.ModificationTypeType;
import org.apache.commons.collections4.CollectionUtils;
Expand All @@ -51,6 +53,8 @@
*/
public abstract class ItemDelta<V extends PrismValue,D extends ItemDefinition> implements Itemable, DebugDumpable, Visitable, PathVisitable, Foreachable<V>, Serializable {

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

/**
* Name of the property
*/
Expand Down Expand Up @@ -883,14 +887,16 @@ public static <D extends ItemDelta> void removeItemDelta(Collection<? extends It

/**
* Filters out all delta values that are meaningless to apply. E.g. removes all values to add that the property already has,
* removes all values to delete that the property does not have, etc.
* removes all values to delete that the property does not have, etc.
* Returns null if the delta is not needed at all.
*/
public ItemDelta<V,D> narrow(PrismObject<? extends Objectable> object) {
return narrow(object, null);
}
/**
* Filters out all delta values that are meaningless to apply. E.g. removes all values to add that the property already has,
* removes all values to delete that the property does not have, etc.
* removes all values to delete that the property does not have, etc.
* Returns null if the delta is not needed at all.
*/
public ItemDelta<V,D> narrow(PrismObject<? extends Objectable> object, Comparator<V> comparator) {
Item<V,D> currentItem = (Item<V,D>) object.findItem(getPath());
Expand All @@ -904,32 +910,42 @@ public ItemDelta<V,D> narrow(PrismObject<? extends Objectable> object, Comparato
return this;
}
} else {
ItemDelta<V,D> clone = clone();
if (clone.valuesToDelete != null) {
Iterator<V> iterator = clone.valuesToDelete.iterator();
while (iterator.hasNext()) {
V valueToDelete = iterator.next();
if (!currentItem.contains(valueToDelete, true, comparator)) {
iterator.remove();
}
}
if (clone.valuesToDelete.isEmpty()) {
clone.valuesToDelete = null;
}
}
if (clone.valuesToAdd != null) {
Iterator<V> iterator = clone.valuesToAdd.iterator();
while (iterator.hasNext()) {
V valueToDelete = iterator.next();
if (currentItem.contains(valueToDelete, true, comparator)) {
iterator.remove();
}
}
if (clone.valuesToAdd.isEmpty()) {
clone.valuesToAdd = null;
if (isReplace()) {
// We can narrow replace deltas only if the replace set matches
// current item exactly. Otherwise we may lose some values.
if (currentItem.valuesExactMatch(valuesToReplace, comparator)) {
return null;
} else {
return this;
}
} else {
ItemDelta<V,D> clone = clone();
if (clone.valuesToDelete != null) {
Iterator<V> iterator = clone.valuesToDelete.iterator();
while (iterator.hasNext()) {
V valueToDelete = iterator.next();
if (!currentItem.contains(valueToDelete, true, comparator)) {
iterator.remove();
}
}
if (clone.valuesToDelete.isEmpty()) {
clone.valuesToDelete = null;
}
}
if (clone.valuesToAdd != null) {
Iterator<V> iterator = clone.valuesToAdd.iterator();
while (iterator.hasNext()) {
V valueToDelete = iterator.next();
if (currentItem.contains(valueToDelete, true, comparator)) {
iterator.remove();
}
}
if (clone.valuesToAdd.isEmpty()) {
clone.valuesToAdd = null;
}
}
return clone;
}
return clone;
}
}

Expand Down Expand Up @@ -963,7 +979,7 @@ public boolean isRedundant(PrismObject<? extends Objectable> object, Comparator<
return MiscUtil.unorderedCollectionCompare(valuesToReplace, currentItem.getValues(), comparator);
}
ItemDelta<V,D> narrowed = narrow(object, comparator);
boolean narrowedNotEmpty = narrowed.hasAnyValue(narrowed.valuesToAdd) || narrowed.hasAnyValue(narrowed.valuesToDelete);
boolean narrowedNotEmpty = narrowed == null || narrowed.hasAnyValue(narrowed.valuesToAdd) || narrowed.hasAnyValue(narrowed.valuesToDelete);
return narrowedNotEmpty;
}
}
Expand Down

0 comments on commit 8665554

Please sign in to comment.