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