X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=data%2Fyang-data-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fapi%2FYangInstanceIdentifier.java;h=0559b41db352fdc9af77f5c8f11afb7172a5486d;hb=3d2579db1ac441dadf84e0ff7dab904832a87bf2;hp=f0d9627fe8dfbceadbbc41a521ab39525af0c192;hpb=a872c7d8cd93c104430f8065c1aa0b69d03e7f3e;p=yangtools.git diff --git a/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java b/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java index f0d9627fe8..0559b41db3 100644 --- a/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java +++ b/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.data.api; import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Verify.verify; import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; @@ -18,15 +17,12 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; import java.io.Serializable; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; import java.lang.reflect.Array; import java.util.AbstractMap.SimpleImmutableEntry; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Deque; @@ -70,13 +66,13 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; * tree *
  • {@link NodeIdentifierWithPredicates} - Identifier of node (list item), which has cardinality {@code 0..n}
  • *
  • {@link NodeWithValue} - Identifier of instance {@code leaf} node or {@code leaf-list} node
  • - *
  • {@link AugmentationIdentifier} - Identifier of instance of {@code augmentation} node
  • * * * @see RFC6020 */ -// FIXME: sealed once we have JDK17+ -public abstract class YangInstanceIdentifier implements HierarchicalIdentifier { +public abstract sealed class YangInstanceIdentifier implements HierarchicalIdentifier + permits FixedYangInstanceIdentifier, StackedYangInstanceIdentifier { + @java.io.Serial private static final long serialVersionUID = 4L; private static final VarHandle TO_STRING_CACHE; private static final VarHandle HASH; @@ -233,7 +229,7 @@ public abstract class YangInstanceIdentifier implements HierarchicalIdentifier *
  • {@link NodeIdentifier} - Identifier of container or leaf *
  • {@link NodeIdentifierWithPredicates} - Identifier of list entries, which have key defined - *
  • {@link AugmentationIdentifier} - Identifier of augmentation *
  • {@link NodeWithValue} - Identifier of leaf-list entry * */ - public interface PathArgument extends Comparable, Immutable, Serializable { + public sealed interface PathArgument extends Comparable, Immutable, Serializable + permits AbstractPathArgument { /** * Returns unique QName of data node as defined in YANG Schema, if available. * @@ -472,7 +469,7 @@ public abstract class YangInstanceIdentifier implements HierarchicalIdentifier - * Augmentation is uniquely identified by set of all possible child nodes. - * This is possible - * to identify instance of augmentation, - * since RFC6020 states that augment that augment - * statement must not add multiple nodes from same namespace - * / module to the target node. - * - * @see RFC6020 - */ - public static final class AugmentationIdentifier implements PathArgument { - private static final long serialVersionUID = -8122335594681936939L; - - private static final LoadingCache, AugmentationIdentifier> CACHE = CacheBuilder.newBuilder() - .weakValues().build(new CacheLoader, AugmentationIdentifier>() { - @Override - public AugmentationIdentifier load(final ImmutableSet key) { - return new AugmentationIdentifier(key); - } - }); - - private final @NonNull ImmutableSet childNames; - - @Override - public QName getNodeType() { - // This should rather throw exception than return always null - throw new UnsupportedOperationException("Augmentation node has no QName"); - } - - /** - * Construct new augmentation identifier using supplied set of possible - * child nodes. - * - * @param childNames - * Set of possible child nodes. - */ - public AugmentationIdentifier(final ImmutableSet childNames) { - this.childNames = requireNonNull(childNames); - } - - /** - * Construct new augmentation identifier using supplied set of possible - * child nodes. - * - * @param childNames - * Set of possible child nodes. - */ - public AugmentationIdentifier(final Set childNames) { - this.childNames = ImmutableSet.copyOf(childNames); - } - - /** - * Return an AugmentationIdentifier for a particular set of QNames. Unlike the constructor, this factory method - * uses a global instance cache, resulting in object reuse for equal inputs. - * - * @param childNames Set of possible child nodes - * @return An {@link AugmentationIdentifier} - */ - public static @NonNull AugmentationIdentifier create(final ImmutableSet childNames) { - return CACHE.getUnchecked(childNames); - } - - /** - * Return an AugmentationIdentifier for a particular set of QNames. Unlike the constructor, this factory method - * uses a global instance cache, resulting in object reuse for equal inputs. - * - * @param childNames Set of possible child nodes - * @return An {@link AugmentationIdentifier} - */ - public static @NonNull AugmentationIdentifier create(final Set childNames) { - final AugmentationIdentifier existing = CACHE.getIfPresent(childNames); - return existing != null ? existing : create(ImmutableSet.copyOf(childNames)); - } - - /** - * Returns set of all possible child nodes. - * - * @return set of all possible child nodes. - */ - public @NonNull Set getPossibleChildNames() { - return childNames; - } - - @Override - public String toString() { - return "AugmentationIdentifier{" + "childNames=" + childNames + '}'; - } - - @Override - public String toRelativeString(final PathArgument previous) { - return toString(); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof AugmentationIdentifier)) { - return false; - } - - AugmentationIdentifier that = (AugmentationIdentifier) obj; - return childNames.equals(that.childNames); - } - - @Override - public int hashCode() { - return childNames.hashCode(); - } - - @Override - @SuppressWarnings("checkstyle:parameterName") - public int compareTo(final PathArgument o) { - if (!(o instanceof AugmentationIdentifier)) { - return -1; - } - AugmentationIdentifier other = (AugmentationIdentifier) o; - Set otherChildNames = other.getPossibleChildNames(); - int thisSize = childNames.size(); - int otherSize = otherChildNames.size(); - if (thisSize == otherSize) { - // Quick Set-based comparison - if (childNames.equals(otherChildNames)) { - return 0; - } - - // We already know the sets are not equal, but have equal size, hence the sets differ in their elements, - // but potentially share a common set of elements. The most consistent way of comparing them is using - // total ordering defined by QName's compareTo. Hence convert both sets to lists ordered - // by QName.compareTo() and decide on the first differing element. - final List diff = new ArrayList<>(Sets.symmetricDifference(childNames, otherChildNames)); - verify(!diff.isEmpty(), "Augmentation identifiers %s and %s report no difference", this, o); - diff.sort(QName::compareTo); - return childNames.contains(diff.get(0)) ? -1 : 1; - } else if (thisSize < otherSize) { - return 1; - } else { - return -1; - } - } - - private Object writeReplace() { - return new AIv1(this); - } - } - /** * Fluent Builder of Instance Identifier instances. */