X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-model-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fmodel%2Fapi%2FSchemaPath.java;h=fd4466d0343c7ac21c6634c8e896db72441c70ad;hb=8a524457d78e932a4de301a9cdacf46c1f2531b2;hp=7bae5f0f57daf182827fbcedbc5d045689ef62f7;hpb=115ca470a70429cfb13d6f3503861315032413f2;p=yangtools.git diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/SchemaPath.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/SchemaPath.java index 7bae5f0f57..fd4466d034 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/SchemaPath.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/SchemaPath.java @@ -7,17 +7,20 @@ */ package org.opendaylight.yangtools.yang.model.api; -import com.google.common.base.Objects; -import com.google.common.base.Objects.ToStringHelper; +import com.google.common.base.MoreObjects; +import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; - +import com.google.common.collect.Lists; +import com.google.common.collect.UnmodifiableIterator; +import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; - +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.common.QName; @@ -25,6 +28,7 @@ import org.opendaylight.yangtools.yang.common.QName; * Represents unique path to the every node inside the module. */ public abstract class SchemaPath implements Immutable { + /** * An absolute SchemaPath. */ @@ -40,7 +44,7 @@ public abstract class SchemaPath implements Immutable { @Override protected SchemaPath createInstance(final SchemaPath parent, final QName qname) { - return new AbsoluteSchemaPath(parent, qname); + return new AbsoluteSchemaPath(parent, Preconditions.checkNotNull(qname)); } } @@ -59,10 +63,14 @@ public abstract class SchemaPath implements Immutable { @Override protected SchemaPath createInstance(final SchemaPath parent, final QName qname) { - return new RelativeSchemaPath(parent, qname); + return new RelativeSchemaPath(parent, Preconditions.checkNotNull(qname)); } } + @SuppressWarnings("rawtypes") + private static final AtomicReferenceFieldUpdater LEGACYPATH_UPDATER = + AtomicReferenceFieldUpdater.newUpdater(SchemaPath.class, ImmutableList.class, "legacyPath"); + /** * Shared instance of the conceptual root schema node. */ @@ -92,14 +100,38 @@ public abstract class SchemaPath implements Immutable { * Cached legacy path, filled-in when {@link #getPath()} or {@link #getPathTowardsRoot()} * is invoked. */ - private ImmutableList legacyPath; + private volatile ImmutableList legacyPath; + + /** + * @deprecated This constructor will be hidden in a future release. + * @param parent + * @param qname + */ + @Deprecated + protected SchemaPath(final SchemaPath parent, final QName qname) { + this.parent = parent; + this.qname = qname; + + int h = Objects.hashCode(parent); + if (qname != null) { + h = h * 31 + qname.hashCode(); + } + + hash = h; + } private ImmutableList getLegacyPath() { - if (legacyPath == null) { - legacyPath = ImmutableList.copyOf(getPathTowardsRoot()).reverse(); + ImmutableList ret = legacyPath; + if (ret == null) { + final List tmp = new ArrayList<>(); + for (QName qname : getPathTowardsRoot()) { + tmp.add(qname); + } + ret = ImmutableList.copyOf(Lists.reverse(tmp)); + LEGACYPATH_UPDATER.lazySet(this, ret); } - return legacyPath; + return ret; } /** @@ -115,18 +147,6 @@ public abstract class SchemaPath implements Immutable { return getLegacyPath(); } - protected SchemaPath(final SchemaPath parent, final QName qname) { - this.parent = parent; - this.qname = qname; - - int h = parent == null ? 0 : parent.hashCode(); - if (qname != null) { - h = h * 31 + qname.hashCode(); - } - - hash = h; - } - /** * Constructs new instance of this class with the concrete path. * @@ -163,8 +183,8 @@ public abstract class SchemaPath implements Immutable { /** * Create a new instance. * - * @param path path from root - * @param hash intended hash code + * @param parent Parent SchemaPath + * @param qname next path element * @return A new SchemaPath instance */ protected abstract SchemaPath createInstance(SchemaPath parent, QName qname); @@ -180,12 +200,12 @@ public abstract class SchemaPath implements Immutable { return this; } - SchemaPath parent = this; + SchemaPath parentPath = this; for (QName qname : relative) { - parent = parent.createInstance(parent, qname); + parentPath = parentPath.createInstance(parentPath, qname); } - return parent; + return parentPath; } /** @@ -197,12 +217,12 @@ public abstract class SchemaPath implements Immutable { public SchemaPath createChild(final SchemaPath relative) { Preconditions.checkArgument(!relative.isAbsolute(), "Child creation requires relative path"); - SchemaPath parent = this; + SchemaPath parentPath = this; for (QName qname : relative.getPathFromRoot()) { - parent = parent.createInstance(parent, qname); + parentPath = parentPath.createInstance(parentPath, qname); } - return parent; + return parentPath; } /** @@ -239,7 +259,7 @@ public abstract class SchemaPath implements Immutable { return new Iterable() { @Override public Iterator iterator() { - return new Iterator() { + return new UnmodifiableIterator() { private SchemaPath current = SchemaPath.this; @Override @@ -257,11 +277,6 @@ public abstract class SchemaPath implements Immutable { throw new NoSuchElementException("No more elements available"); } } - - @Override - public void remove() { - throw new UnsupportedOperationException("Component removal not supported"); - } }; } }; @@ -310,26 +325,12 @@ public abstract class SchemaPath implements Immutable { return false; } final SchemaPath other = (SchemaPath) obj; - - if (qname != null) { - if (!qname.equals(other.qname)) { - return false; - } - } else { - if (other.qname != null) { - return false; - } - } - - if (parent == null) { - return other.parent == null; - } - return parent.equals(other.parent); + return Objects.equals(qname, other.qname) && Objects.equals(parent, other.parent); } @Override public final String toString() { - return addToStringAttributes(Objects.toStringHelper(this)).toString(); + return addToStringAttributes(MoreObjects.toStringHelper(this)).toString(); } protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {