X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=data%2Fyang-data-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fapi%2FYangInstanceIdentifier.java;h=f0d9627fe8dfbceadbbc41a521ab39525af0c192;hb=a872c7d8cd93c104430f8065c1aa0b69d03e7f3e;hp=31ea97a0279cd82d1fe737eb7f5915f1be12390c;hpb=ce393b58bbeebe85e7725f357f9eb73c8cfafe13;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 31ea97a027..f0d9627fe8 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
@@ -21,8 +21,9 @@ 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 edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
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;
@@ -36,14 +37,12 @@ import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.function.Function;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.concepts.Builder;
import org.opendaylight.yangtools.concepts.HierarchicalIdentifier;
import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.util.HashCodeBuilder;
+import org.opendaylight.yangtools.concepts.Mutable;
import org.opendaylight.yangtools.util.ImmutableOffsetMap;
import org.opendaylight.yangtools.util.SingletonSet;
import org.opendaylight.yangtools.yang.common.QName;
@@ -76,20 +75,29 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
*
* @see RFC6020
*/
-// FIXME: 7.0.0: this concept needs to be moved to yang-common, as parser components need the ability to refer
-// to data nodes -- most notably XPath expressions and {@code default} statement arguments need to be able
-// to represent these.
+// FIXME: sealed once we have JDK17+
public abstract class YangInstanceIdentifier implements HierarchicalIdentifier {
- private static final AtomicReferenceFieldUpdater TOSTRINGCACHE_UPDATER =
- AtomicReferenceFieldUpdater.newUpdater(YangInstanceIdentifier.class, String.class, "toStringCache");
private static final long serialVersionUID = 4L;
+ private static final VarHandle TO_STRING_CACHE;
+ private static final VarHandle HASH;
- private final int hash;
- private transient volatile String toStringCache = null;
+ static {
+ final var lookup = MethodHandles.lookup();
+ try {
+ HASH = lookup.findVarHandle(YangInstanceIdentifier.class, "hash", int.class);
+ TO_STRING_CACHE = lookup.findVarHandle(YangInstanceIdentifier.class, "toStringCache", String.class);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new ExceptionInInitializerError(e);
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private int hash;
+ @SuppressWarnings("unused")
+ private transient String toStringCache = null;
- // Package-private to prevent outside subclassing
- YangInstanceIdentifier(final int hash) {
- this.hash = hash;
+ YangInstanceIdentifier() {
+ // Package-private to prevent outside subclassing
}
/**
@@ -104,9 +112,9 @@ public abstract class YangInstanceIdentifier implements HierarchicalIdentifier tryPathArguments();
+ abstract @Nullable List tryPathArguments();
- abstract @Nullable Collection tryReversePathArguments();
+ abstract @Nullable List tryReversePathArguments();
/**
* Check if this instance identifier has empty path arguments, e.g. it is
@@ -174,21 +182,11 @@ public abstract class YangInstanceIdentifier implements HierarchicalIdentifier path) {
- if (Iterables.isEmpty(path)) {
- return empty();
- }
-
- final HashCodeBuilder hash = new HashCodeBuilder<>();
- for (PathArgument a : path) {
- hash.addArgument(a);
- }
-
- return FixedYangInstanceIdentifier.create(path, hash.build());
+ return Iterables.isEmpty(path) ? empty() : new FixedYangInstanceIdentifier(ImmutableList.copyOf(path));
}
public static @NonNull YangInstanceIdentifier create(final PathArgument pathArgument) {
- return new FixedYangInstanceIdentifier(ImmutableList.of(pathArgument),
- HashCodeBuilder.nextHashCode(1, pathArgument));
+ return new FixedYangInstanceIdentifier(ImmutableList.of(pathArgument));
}
public static @NonNull YangInstanceIdentifier create(final PathArgument... path) {
@@ -230,23 +228,12 @@ public abstract class YangInstanceIdentifier implements HierarchicalIdentifier {
+ public interface InstanceIdentifierBuilder extends Mutable {
/**
* Adds a {@link PathArgument} to path arguments of resulting instance identifier.
*
@@ -1098,7 +1094,6 @@ public abstract class YangInstanceIdentifier implements HierarchicalIdentifier