From d6b125e5945d92cb478195ba5f2f4762cc437ff9 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 27 Jun 2024 20:46:32 +0200 Subject: [PATCH] Expose DataObjectReference.lastStep() Each reference needs to have a target type, carried in its last step. Expose this fact via a lastStep() method. JIRA: YANGTOOLS-1577 Change-Id: I7562383089127aeb7796c81e0b28f686b1d70d8e Signed-off-by: Robert Varga --- .../binding/DataObjectIdentifier.java | 3 ++ .../binding/DataObjectReference.java | 15 ++++++++ .../impl/AbstractDataObjectReference.java | 15 ++++++++ .../impl/DataObjectIdentifierWithKey.java | 14 ++------ .../impl/DataObjectReferenceWithKey.java | 14 ++------ .../yang/binding/InstanceIdentifier.java | 35 ++++++------------- .../yang/binding/KeyedInstanceIdentifier.java | 17 +++------ .../yang/binding/InstanceIdentifierTest.java | 4 +-- .../binding/KeyedInstanceIdentifierTest.java | 5 ++- 9 files changed, 57 insertions(+), 65 deletions(-) diff --git a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/DataObjectIdentifier.java b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/DataObjectIdentifier.java index 822e8f7ef8..373650b355 100644 --- a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/DataObjectIdentifier.java +++ b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/DataObjectIdentifier.java @@ -32,6 +32,9 @@ public sealed interface DataObjectIdentifier sealed interface WithKey & DataObject, K extends Key> extends DataObjectIdentifier, DataObjectReference.WithKey permits DataObjectIdentifierWithKey { + @Override + KeyStep lastStep(); + @Override KeyedBuilder toBuilder(); } diff --git a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/DataObjectReference.java b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/DataObjectReference.java index ba3ca60bf1..2b5a539c48 100644 --- a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/DataObjectReference.java +++ b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/DataObjectReference.java @@ -53,9 +53,17 @@ public sealed interface DataObjectReference extends Immuta sealed interface WithKey & DataObject, K extends Key> extends DataObjectReference, KeyAware permits DataObjectIdentifier.WithKey, DataObjectReferenceWithKey, KeyedInstanceIdentifier { + @Override + KeyStep lastStep(); + @Override KeyedBuilder toBuilder(); + @Override + default K key() { + return lastStep().key(); + } + /** * Return the key attached to this identifier. This method is equivalent to calling * {@link InstanceIdentifier#keyOf(InstanceIdentifier)}. @@ -90,6 +98,13 @@ public sealed interface DataObjectReference extends Immuta */ @NonNull Iterable> steps(); + /** + * Return the last step of this reference. + * + * @return the last step + */ + @NonNull DataObjectStep lastStep(); + /** * Create a new {@link Builder} initialized to produce a reference equal to this one. * diff --git a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/AbstractDataObjectReference.java b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/AbstractDataObjectReference.java index 784a52d345..622050c383 100644 --- a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/AbstractDataObjectReference.java +++ b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/AbstractDataObjectReference.java @@ -15,6 +15,7 @@ import java.io.NotSerializableException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamException; +import java.util.List; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.binding.DataObject; @@ -35,6 +36,11 @@ public abstract sealed class AbstractDataObjectReference steps(); + @Override + public DataObjectStep lastStep() { + return getLast(steps()); + } + @Override public final int hashCode() { int hash = 1; @@ -60,6 +66,15 @@ public abstract sealed class AbstractDataObjectReference @NonNull T getLast(final Iterable steps) { + return (@NonNull T) switch (steps) { + case AppendIterable append -> append.last(); + case List list -> list.getLast(); + default -> Iterables.getLast(steps); + }; + } + /** * Add class-specific toString attributes. * diff --git a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/DataObjectIdentifierWithKey.java b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/DataObjectIdentifierWithKey.java index fc80f73ea3..67f15c823b 100644 --- a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/DataObjectIdentifierWithKey.java +++ b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/DataObjectIdentifierWithKey.java @@ -7,17 +7,15 @@ */ package org.opendaylight.yangtools.binding.impl; -import static java.util.Objects.requireNonNull; - import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamException; -import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.binding.DataObject; import org.opendaylight.yangtools.binding.DataObjectIdentifier.WithKey; import org.opendaylight.yangtools.binding.Key; import org.opendaylight.yangtools.binding.KeyAware; +import org.opendaylight.yangtools.binding.KeyStep; // FIXME: YANGTOOLS-1577: final public abstract non-sealed class DataObjectIdentifierWithKey & DataObject, K extends Key> @@ -25,15 +23,9 @@ public abstract non-sealed class DataObjectIdentifierWithKey lastStep() { + return getLast(steps()); } @java.io.Serial diff --git a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/DataObjectReferenceWithKey.java b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/DataObjectReferenceWithKey.java index 7e5ef2b8bf..18208a323c 100644 --- a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/DataObjectReferenceWithKey.java +++ b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/binding/impl/DataObjectReferenceWithKey.java @@ -7,17 +7,15 @@ */ package org.opendaylight.yangtools.binding.impl; -import static java.util.Objects.requireNonNull; - import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamException; -import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.binding.DataObject; import org.opendaylight.yangtools.binding.DataObjectReference.WithKey; import org.opendaylight.yangtools.binding.Key; import org.opendaylight.yangtools.binding.KeyAware; +import org.opendaylight.yangtools.binding.KeyStep; // FIXME: YANGTOOLS-1577: final public abstract non-sealed class DataObjectReferenceWithKey & DataObject, K extends Key> @@ -25,15 +23,9 @@ public abstract non-sealed class DataObjectReferenceWithKey lastStep() { + return getLast(steps()); } @java.io.Serial diff --git a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java index d26a8f4767..d410fa7e04 100644 --- a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java +++ b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java @@ -83,13 +83,10 @@ public sealed class InstanceIdentifier extends AbstractDat */ final Iterable> pathArguments; - private final @NonNull Class targetType; private final boolean wildcarded; - InstanceIdentifier(final Class type, final Iterable> pathArguments, - final boolean wildcarded) { + InstanceIdentifier(final Iterable> pathArguments, final boolean wildcarded) { this.pathArguments = requireNonNull(pathArguments); - targetType = requireNonNull(type); this.wildcarded = wildcarded; } @@ -99,7 +96,7 @@ public sealed class InstanceIdentifier extends AbstractDat * @return Target type */ public final @NonNull Class getTargetType() { - return targetType; + return lastStep().type(); } /** @@ -112,7 +109,7 @@ public sealed class InstanceIdentifier extends AbstractDat */ @SuppressWarnings("unchecked") public final @NonNull InstanceIdentifier verifyTarget(final Class<@NonNull N> target) { - verify(target.equals(targetType), "Cannot adapt %s to %s", this, target); + verify(target.equals(getTargetType()), "Cannot adapt %s to %s", this, target); return (InstanceIdentifier) this; } @@ -139,7 +136,7 @@ public sealed class InstanceIdentifier extends AbstractDat @Override protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { - return toStringHelper.add("targetType", targetType).add("path", Iterables.toString(pathArguments)); + return toStringHelper.add("targetType", getTargetType()).add("path", Iterables.toString(pathArguments)); } /** @@ -585,9 +582,9 @@ public sealed class InstanceIdentifier extends AbstractDat static @NonNull InstanceIdentifier trustedCreate(final DataObjectStep lastStep, final Iterable> pathArguments, final boolean wildcarded) { return switch (lastStep) { - case NodeStep cast -> new InstanceIdentifier(cast.type(), pathArguments, wildcarded); - case KeyStep cast -> new KeyedInstanceIdentifier(cast, pathArguments, wildcarded); - case KeylessStep cast -> new InstanceIdentifier(cast.type(), pathArguments, true); + case NodeStep cast -> new InstanceIdentifier(pathArguments, wildcarded); + case KeyStep cast -> new KeyedInstanceIdentifier(pathArguments, wildcarded); + case KeylessStep cast -> new InstanceIdentifier(pathArguments, true); }; } @@ -949,21 +946,16 @@ public sealed class InstanceIdentifier extends AbstractDat public static final class KeyedBuilder, K extends Key> extends Builder { - private @NonNull KeyStep lastStep; - KeyedBuilder(final KeyStep firstStep) { super(firstStep, false); - lastStep = requireNonNull(firstStep); } KeyedBuilder(final KeyedInstanceIdentifier identifier) { super(identifier); - lastStep = identifier.lastStep(); } private KeyedBuilder(final RegularBuilder prev, final KeyStep lastStep) { super(prev, lastStep); - this.lastStep = requireNonNull(lastStep); } /** @@ -973,7 +965,7 @@ public sealed class InstanceIdentifier extends AbstractDat */ @Override public @NonNull KeyedInstanceIdentifier build() { - return new KeyedInstanceIdentifier<>(lastStep, buildSteps(), wildcard()); + return new KeyedInstanceIdentifier<>(buildSteps(), wildcard()); } @Override @@ -985,39 +977,32 @@ public sealed class InstanceIdentifier extends AbstractDat @SuppressWarnings("unchecked") , Y extends Key> KeyedBuilder append(final KeyStep step) { appendItem(step); - lastStep = (KeyStep) requireNonNull(step); return (KeyedBuilder) this; } } private static final class RegularBuilder extends Builder { - private @NonNull Class type; - RegularBuilder(final DataObjectStep item) { super(item, !(item instanceof ExactDataObjectStep)); - type = item.type(); } RegularBuilder(final InstanceIdentifier identifier) { super(identifier); - type = identifier.getTargetType(); } private RegularBuilder(final KeyedBuilder prev, final DataObjectStep item) { super(prev, item); - type = item.type(); } @Override public InstanceIdentifier build() { - return new InstanceIdentifier<>(type, buildSteps(), wildcard()); + return new InstanceIdentifier<>(buildSteps(), wildcard()); } @Override - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings("unchecked") RegularBuilder append(final DataObjectStep step) { appendItem(step); - type = (Class) step.type(); return (RegularBuilder) this; } diff --git a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifier.java b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifier.java index 4ffbbc34e0..ee513ac1eb 100644 --- a/binding/binding-spec/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifier.java +++ b/binding/binding-spec/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifier.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.binding; -import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.binding.DataObject; import org.opendaylight.yangtools.binding.DataObjectReference.WithKey; import org.opendaylight.yangtools.binding.DataObjectStep; @@ -26,21 +25,13 @@ public final class KeyedInstanceIdentifier & DataObject, K @java.io.Serial private static final long serialVersionUID = 2L; - private final @NonNull KeyStep lastStep; - - KeyedInstanceIdentifier(final KeyStep lastStep, final Iterable> pathArguments, - final boolean wildcarded) { - super(lastStep.type(), pathArguments, wildcarded); - this.lastStep = lastStep; - } - - @NonNull KeyStep lastStep() { - return lastStep; + KeyedInstanceIdentifier(final Iterable> pathArguments, final boolean wildcarded) { + super(pathArguments, wildcarded); } @Override - public K key() { - return lastStep.key(); + public KeyStep lastStep() { + return getLast(steps()); } @Override diff --git a/binding/binding-spec/src/test/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierTest.java b/binding/binding-spec/src/test/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierTest.java index f75bdc8250..435941643f 100644 --- a/binding/binding-spec/src/test/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierTest.java +++ b/binding/binding-spec/src/test/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierTest.java @@ -183,8 +183,8 @@ public class InstanceIdentifierTest { @Test public void keyOfTest() { final var key = new NodeKey(42); - assertEquals(key, InstanceIdentifier.keyOf( - new KeyedInstanceIdentifier<>(new KeyStep<>(Node.class, key), ImmutableList.of(), false))); + assertEquals(key, InstanceIdentifier.keyOf( + new KeyedInstanceIdentifier<>(ImmutableList.of(new KeyStep<>(Node.class, key)), false))); } @Test diff --git a/binding/binding-spec/src/test/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifierTest.java b/binding/binding-spec/src/test/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifierTest.java index ed0eb16ec6..7de73fd1f2 100644 --- a/binding/binding-spec/src/test/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifierTest.java +++ b/binding/binding-spec/src/test/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifierTest.java @@ -21,10 +21,9 @@ class KeyedInstanceIdentifierTest { @Test void basicTest() { final var key = new NodeKey(0); - final var keyStep = new KeyStep<>(Node.class, key); - final var keyed = new KeyedInstanceIdentifier<>(keyStep, List.of(), false); + final var keyed = new KeyedInstanceIdentifier<>(List.of(new KeyStep<>(Node.class, key)), false); assertEquals(key, keyed.key()); - assertNotEquals(keyed, new InstanceIdentifier<>(Node.class, List.of(new KeylessStep<>(Node.class)), true)); + assertNotEquals(keyed, new InstanceIdentifier<>(List.of(new KeylessStep<>(Node.class)), true)); } } \ No newline at end of file -- 2.36.6