From 4cf1abaf27f887d580ee3e5a263a263f055f63d0 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 28 Nov 2023 23:36:32 +0100 Subject: [PATCH] Improve OffsetMapTemplate error reporting Include a human-readable message when we throw an IAE. JIRA: YANGTOOLS-1550 Change-Id: I7acb3e9b23ed20a00551435ce68c68d138a052e6 Signed-off-by: Robert Varga --- .../yangtools/util/ImmutableMapTemplate.java | 6 ++++ .../util/ImmutableOffsetMapTemplate.java | 36 ++++++++++--------- .../util/SharedSingletonMapTemplate.java | 30 ++++++++-------- 3 files changed, 42 insertions(+), 30 deletions(-) diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/ImmutableMapTemplate.java b/common/util/src/main/java/org/opendaylight/yangtools/util/ImmutableMapTemplate.java index fb74c31244..089b601145 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/ImmutableMapTemplate.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/ImmutableMapTemplate.java @@ -113,4 +113,10 @@ public abstract sealed class ImmutableMapTemplate implements Immutable checkArgument(value != null, "Transformer returned null for input %s at key %s", input, key); return value; } + + static void checkSize(final int expected, final int encountered) { + if (expected != encountered) { + throw new IllegalArgumentException("Expected " + expected + " items, " + encountered + " encountered"); + } + } } diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/ImmutableOffsetMapTemplate.java b/common/util/src/main/java/org/opendaylight/yangtools/util/ImmutableOffsetMapTemplate.java index 438c38aaa6..553641eef5 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/ImmutableOffsetMapTemplate.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/ImmutableOffsetMapTemplate.java @@ -7,16 +7,13 @@ */ package org.opendaylight.yangtools.util; -import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableMap; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Arrays; import java.util.Collection; import java.util.Map; -import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.function.BiFunction; @@ -71,7 +68,7 @@ public abstract sealed class ImmutableOffsetMapTemplate extends ImmutableMapT * @throws IllegalArgumentException if {@code keys} is does not have at least two keys */ public static @NonNull ImmutableOffsetMapTemplate ordered(final Collection keys) { - checkArgument(keys.size() > 1); + checkTwoKeys(keys); return new Ordered<>(keys); } @@ -87,7 +84,7 @@ public abstract sealed class ImmutableOffsetMapTemplate extends ImmutableMapT * @throws IllegalArgumentException if {@code keys} is does not have at least two keys */ public static @NonNull ImmutableOffsetMapTemplate unordered(final Collection keys) { - checkArgument(keys.size() > 1); + checkTwoKeys(keys); return new Unordered<>(keys); } @@ -100,31 +97,31 @@ public abstract sealed class ImmutableOffsetMapTemplate extends ImmutableMapT public final @NonNull ImmutableOffsetMap instantiateTransformed(final Map fromMap, final BiFunction valueTransformer) { final int size = offsets.size(); - checkArgument(fromMap.size() == size); + checkSize(size, fromMap.size()); @SuppressWarnings("unchecked") - final V[] objects = (V[]) new Object[size]; - for (Entry entry : fromMap.entrySet()) { - final K key = requireNonNull(entry.getKey()); + final var objects = (V[]) new Object[size]; + for (var entry : fromMap.entrySet()) { + final var key = requireNonNull(entry.getKey()); objects[offsetOf(key)] = transformValue(key, entry.getValue(), valueTransformer); } return createMap(offsets, objects); } - @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE", - justification = "SpotBugs does not grok checkArgument()") private int offsetOf(final K key) { - final Integer offset = offsets.get(key); - checkArgument(offset != null, "Key %s present in input, but not in offsets %s", key, offsets); + final var offset = offsets.get(key); + if (offset == null) { + throw new IllegalArgumentException("Key " + key + " present in input, but not in offsets " + offsets); + } return offset; } @Override @SafeVarargs - public final @NonNull ImmutableOffsetMap instantiateWithValues(final V... values) { - checkArgument(values.length == offsets.size()); - final V[] copy = values.clone(); + public final ImmutableOffsetMap instantiateWithValues(final V... values) { + checkSize(offsets.size(), values.length); + final var copy = values.clone(); Arrays.stream(copy).forEach(Objects::requireNonNull); return createMap(offsets, values); } @@ -135,4 +132,11 @@ public abstract sealed class ImmutableOffsetMapTemplate extends ImmutableMapT } abstract @NonNull ImmutableOffsetMap createMap(ImmutableMap offsets, V[] objects); + + private static void checkTwoKeys(final Collection keys) { + final var size = keys.size(); + if (size < 2) { + throw new IllegalArgumentException("Expected at least 2 keys, " + size + " supplied"); + } + } } \ No newline at end of file diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/SharedSingletonMapTemplate.java b/common/util/src/main/java/org/opendaylight/yangtools/util/SharedSingletonMapTemplate.java index dd12b65264..b3f97539f0 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/SharedSingletonMapTemplate.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/SharedSingletonMapTemplate.java @@ -7,12 +7,8 @@ */ package org.opendaylight.yangtools.util; -import static com.google.common.base.Preconditions.checkArgument; - import com.google.common.base.MoreObjects; -import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; import java.util.function.BiFunction; import org.eclipse.jdt.annotation.NonNull; @@ -49,7 +45,7 @@ public abstract sealed class SharedSingletonMapTemplate extends ImmutableMapT private final @NonNull SingletonSet keySet; private SharedSingletonMapTemplate(final K key) { - this.keySet = SharedSingletonMap.cachedSet(key); + keySet = SharedSingletonMap.cachedSet(key); } /** @@ -86,23 +82,29 @@ public abstract sealed class SharedSingletonMapTemplate extends ImmutableMapT @Override public final @NonNull SharedSingletonMap instantiateTransformed(final Map fromMap, final BiFunction valueTransformer) { - final Iterator> it = fromMap.entrySet().iterator(); - checkArgument(it.hasNext(), "Input is empty while expecting 1 item"); + final var it = fromMap.entrySet().iterator(); + if (!it.hasNext()) { + throw new IllegalArgumentException("Input is empty while expecting 1 item"); + } - final Entry entry = it.next(); - final K expected = keySet.getElement(); - final K actual = entry.getKey(); - checkArgument(expected.equals(actual), "Unexpected key %s, expecting %s", actual, expected); + final var entry = it.next(); + final var expected = keySet.getElement(); + final var actual = entry.getKey(); + if (!expected.equals(actual)) { + throw new IllegalArgumentException("Unexpected key " + actual + ", expecting " + expected); + } - final V value = transformValue(actual, entry.getValue(), valueTransformer); - checkArgument(!it.hasNext(), "Input has more than one item"); + final var value = transformValue(actual, entry.getValue(), valueTransformer); + if (it.hasNext()) { + throw new IllegalArgumentException("Input has more than one item"); + } return instantiateWithValue(value); } @Override @SafeVarargs public final @NonNull SharedSingletonMap instantiateWithValues(final V... values) { - checkArgument(values.length == 1); + checkSize(1, values.length); return instantiateWithValue(values[0]); } -- 2.36.6