From 05ab5b0c3b7081f697015fd7c6b80afb3b4cb019 Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Wed, 12 May 2021 12:37:54 +0200 Subject: [PATCH] Fixed early exit on special case [] == null Signed-off-by: Tony Tkacik --- .../com/evolveum/midpoint/prism/impl/ItemImpl.java | 2 +- .../midpoint/prism/impl/PrismContainerValueImpl.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java index 927ed55b9d3..e8a6b7ec1d6 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java @@ -594,7 +594,7 @@ boolean diffInternal(Item other, Collection deltas, b ItemDelta delta = createDelta(); if (other == null) { // Early exit for equals use case - if (exitOnDiff) { + if (exitOnDiff && hasAnyValue()) { return true; } diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismContainerValueImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismContainerValueImpl.java index a796b952d09..59fce528ba3 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismContainerValueImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismContainerValueImpl.java @@ -47,6 +47,7 @@ public class PrismContainerValueImpl extends PrismValue public static final RuntimeException DIFFERENT_ITEMS_EXCEPTION = new ItemDifferentException(); + private static final boolean EARLY_EXIT = true; static { DIFFERENT_ITEMS_EXCEPTION.fillInStackTrace(); @@ -1131,11 +1132,16 @@ private boolean diffItems(PrismContainerValue thisValue, PrismContainerValue< } } - // Other has an item that we don't have, this must be an add + // Other item has no values + if(otherItem.hasNoValues()) { + continue; + } if (exitOnDiff) { return true; } + ItemDelta itemDelta = otherItem.createDelta(); + itemDelta.addValuesToAdd(otherItem.getClonedValues()); if (!itemDelta.isEmpty()) { ((Collection) deltas).add(itemDelta); @@ -1446,7 +1452,7 @@ private boolean equals(@NotNull PrismContainerValue other, ParameterizedEquiv private boolean equalsItems(PrismContainerValue other, ParameterizedEquivalenceStrategy strategy) { Collection> deltas = FailOnAddList.INSTANCE; try { - boolean different = diffItems(this, other, deltas, strategy, true); + boolean different = diffItems(this, other, deltas, strategy, EARLY_EXIT); if (different) { return false; }