X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fapi%2FYangInstanceIdentifier.java;h=82d1ceb260731d0df04df83ecd25b7d71d48e408;hb=ccf32165913628a41a3dc4b27d150a04c9034d42;hp=ce8d0e45bade344b6c6285921bffd5ba34211ea3;hpb=c0c3407dcb5f33b7ec2ebfe9d4ebcf9e4be4135e;p=yangtools.git diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java index ce8d0e45ba..82d1ceb260 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java @@ -6,6 +6,7 @@ */ package org.opendaylight.yangtools.yang.data.api; +import com.google.common.annotations.Beta; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; @@ -64,7 +65,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; * * @see RFC6020 */ -public abstract class YangInstanceIdentifier extends CollectionPathArguments implements Path, Immutable, Serializable { +public abstract class YangInstanceIdentifier extends IterablePathArguments implements Path, Immutable, Serializable { /** * An empty {@link YangInstanceIdentifier}. It corresponds to the path of the conceptual * root of the YANG namespace. @@ -95,6 +96,15 @@ public abstract class YangInstanceIdentifier extends CollectionPathArguments imp */ public abstract boolean isEmpty(); + /** + * Return an optimized version of this identifier, useful when the identifier + * will be used very frequently. + * + * @return A optimized equivalent instance. + */ + @Beta + public abstract YangInstanceIdentifier toOptimized(); + /** * Return the conceptual parent {@link YangInstanceIdentifier}, which has * one item less in {@link #getPathArguments()}. @@ -243,12 +253,61 @@ public abstract class YangInstanceIdentifier extends CollectionPathArguments imp return Optional.of(createRelativeIdentifier(common)); } + @Override + public final boolean contains(final YangInstanceIdentifier other) { + Preconditions.checkArgument(other != null, "other should not be null"); + + final Iterator lit = getPathArguments().iterator(); + final Iterator oit = other.getPathArguments().iterator(); + + while (lit.hasNext()) { + if (!oit.hasNext()) { + return false; + } + + if (!lit.next().equals(oit.next())) { + return false; + } + } + + return true; + } + + @Override + public final String toString() { + /* + * The toStringCache is safe, since the object contract requires + * immutability of the object and all objects referenced from this + * object. + * Used lists, maps are immutable. Path Arguments (elements) are also + * immutable, since the PathArgument contract requires immutability. + * The cache is thread-safe - if multiple computations occurs at the + * same time, cache will be overwritten with same result. + */ + String ret = toStringCache; + if (ret == null) { + final StringBuilder builder = new StringBuilder("/"); + PathArgument prev = null; + for (PathArgument argument : getPathArguments()) { + if (prev != null) { + builder.append('/'); + } + builder.append(argument.toRelativeString(prev)); + prev = argument; + } + + ret = builder.toString(); + TOSTRINGCACHE_UPDATER.lazySet(this, ret); + } + return ret; + } + private static int hashCode(final Object value) { if (value == null) { return 0; } - if (value.getClass().equals(byte[].class)) { + if (byte[].class.equals(value.getClass())) { return Arrays.hashCode((byte[]) value); } @@ -268,7 +327,6 @@ public abstract class YangInstanceIdentifier extends CollectionPathArguments imp // Static factories & helpers /** - * * Returns a new InstanceIdentifier with only one path argument of type {@link NodeIdentifier} with supplied QName * * @param name QName of first node identifier @@ -279,7 +337,6 @@ public abstract class YangInstanceIdentifier extends CollectionPathArguments imp } /** - * * Returns new builder for InstanceIdentifier with empty path arguments. * * @return new builder for InstanceIdentifier with empty path arguments. @@ -292,7 +349,7 @@ public abstract class YangInstanceIdentifier extends CollectionPathArguments imp * * Returns new builder for InstanceIdentifier with path arguments copied from original instance identifier. * - * @param origin Instace Identifier from which path arguments are copied. + * @param origin InstanceIdentifier from which path arguments are copied. * @return new builder for InstanceIdentifier with path arguments copied from original instance identifier. */ public static InstanceIdentifierBuilder builder(final YangInstanceIdentifier origin) { @@ -411,6 +468,14 @@ public abstract class YangInstanceIdentifier extends CollectionPathArguments imp * Fluent Builder of Instance Identifier instances */ public interface InstanceIdentifierBuilder extends Builder { + /** + * Adds a {@link PathArgument} to to path arguments of resulting instance identifier. + * + * @param arg A {@link PathArgument} to be added + * @return this builder + */ + InstanceIdentifierBuilder node(PathArgument arg); + /** * Adds {@link NodeIdentifier} with supplied QName to path arguments of resulting instance identifier. * @@ -507,6 +572,11 @@ public abstract class YangInstanceIdentifier extends CollectionPathArguments imp } final Map otherKeyValues = ((NodeIdentifierWithPredicates) obj).keyValues; + + // TODO: benchmark to see if just calling equals() on the two maps is not faster + if (keyValues == otherKeyValues) { + return true; + } if (keyValues.size() != otherKeyValues.size()) { return false; } @@ -679,53 +749,4 @@ public abstract class YangInstanceIdentifier extends CollectionPathArguments imp } } } - - @Override - public final boolean contains(final YangInstanceIdentifier other) { - Preconditions.checkArgument(other != null, "other should not be null"); - - final Iterator lit = getPathArguments().iterator(); - final Iterator oit = other.getPathArguments().iterator(); - - while (lit.hasNext()) { - if (!oit.hasNext()) { - return false; - } - - if (!lit.next().equals(oit.next())) { - return false; - } - } - - return true; - } - - @Override - public final String toString() { - /* - * The toStringCache is safe, since the object contract requires - * immutability of the object and all objects referenced from this - * object. - * Used lists, maps are immutable. Path Arguments (elements) are also - * immutable, since the PathArgument contract requires immutability. - * The cache is thread-safe - if multiple computations occurs at the - * same time, cache will be overwritten with same result. - */ - String ret = toStringCache; - if (ret == null) { - final StringBuilder builder = new StringBuilder("/"); - PathArgument prev = null; - for (PathArgument argument : getPathArguments()) { - if (prev != null) { - builder.append('/'); - } - builder.append(argument.toRelativeString(prev)); - prev = argument; - } - - ret = builder.toString(); - TOSTRINGCACHE_UPDATER.lazySet(this, ret); - } - return ret; - } }