From: Robert Varga Date: Mon, 18 May 2015 23:05:42 +0000 (+0200) Subject: BUG-3263: return a List of PathArguments X-Git-Tag: release/lithium~81 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=607cac45417bc76143d56d230f60a0293f99276f;p=yangtools.git BUG-3263: return a List of PathArguments This is a further improvement to the interface, we return a List of path arguments for both getPathArguments() and getReversePathArguments(). This makes it possible for StackedYangInstanceIdentifier to not retain a legacy list of path arguments. Change-Id: I98ebc2bec139a0e02b4a428bc783ea23981e3658 Signed-off-by: Robert Varga --- diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/CollectionPathArguments.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/CollectionPathArguments.java new file mode 100644 index 0000000000..af7895c86a --- /dev/null +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/CollectionPathArguments.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.data.api; + +import java.util.Collection; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; + +/** + * This class provides backwards compatibility with the previous switch to + * Collections. + * + * @deprecated Remove before Lithium ships + */ +@Deprecated +abstract class CollectionPathArguments extends IterablePathArguments { + @Override + public abstract Collection getPathArguments(); + @Override + public abstract Collection getReversePathArguments(); +} diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/FixedYangInstanceIdentifier.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/FixedYangInstanceIdentifier.java index 20045cf43c..bc60c5a581 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/FixedYangInstanceIdentifier.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/FixedYangInstanceIdentifier.java @@ -47,11 +47,6 @@ final class FixedYangInstanceIdentifier extends YangInstanceIdentifier { return ret; } - @Override - public List getPath() { - return path; - } - @Override public List getPathArguments() { return path; diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/PathArgumentCollection.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/PathArgumentList.java similarity index 83% rename from yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/PathArgumentCollection.java rename to yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/PathArgumentList.java index 5ed5e256a0..0453b05a02 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/PathArgumentCollection.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/PathArgumentList.java @@ -7,11 +7,11 @@ package org.opendaylight.yangtools.yang.data.api; import com.google.common.collect.UnmodifiableIterator; -import java.util.AbstractCollection; +import java.util.AbstractList; import java.util.Collection; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -abstract class PathArgumentCollection extends AbstractCollection { +abstract class PathArgumentList extends AbstractList { @Override public abstract UnmodifiableIterator iterator(); @@ -44,4 +44,9 @@ abstract class PathArgumentCollection extends AbstractCollection { public final void clear() { throw new UnsupportedOperationException(); } + + @Override + public final boolean addAll(final int index, final Collection c) { + throw new UnsupportedOperationException(); + } } diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedPathArguments.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedPathArguments.java index ed9d65b8ba..93dde99d1e 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedPathArguments.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedPathArguments.java @@ -8,13 +8,12 @@ package org.opendaylight.yangtools.yang.data.api; import com.google.common.base.Preconditions; import com.google.common.collect.UnmodifiableIterator; -import java.util.Collection; import java.util.Iterator; import java.util.List; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -final class StackedPathArguments extends PathArgumentCollection { - private final Collection base; +final class StackedPathArguments extends PathArgumentList { + private final List base; private final List stack; public StackedPathArguments(final YangInstanceIdentifier base, final List stack) { @@ -33,6 +32,41 @@ final class StackedPathArguments extends PathArgumentCollection { return stack.contains(srch) || base.contains(srch); } + @Override + public final PathArgument get(final int index) { + if (index < base.size()) { + return base.get(index); + } else { + return stack.get(index - base.size()); + } + } + + @Override + public final int indexOf(final Object o) { + final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o); + + int ret = base.indexOf(srch); + if (ret == -1) { + ret = stack.indexOf(srch); + if (ret != -1) { + return base.size() + ret; + } + } + return ret; + } + + @Override + public final int lastIndexOf(final Object o) { + final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o); + + final int ret = stack.lastIndexOf(srch); + if (ret != -1) { + return base.size() + ret; + } + + return base.lastIndexOf(srch); + } + @Override public UnmodifiableIterator iterator() { return new IteratorImpl(base, stack); diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedReversePathArguments.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedReversePathArguments.java index 5e71817b2f..002de6b692 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedReversePathArguments.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedReversePathArguments.java @@ -14,7 +14,7 @@ import java.util.Collection; import java.util.Iterator; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -final class StackedReversePathArguments extends PathArgumentCollection { +final class StackedReversePathArguments extends PathArgumentList { private final StackedYangInstanceIdentifier identifier; private int size; private volatile boolean haveSize; @@ -55,6 +55,32 @@ final class StackedReversePathArguments extends PathArgumentCollection { return Iterators.contains(iterator(), srch); } + @Override + public PathArgument get(final int index) { + return Iterators.get(iterator(), index); + } + + @Override + public int indexOf(final Object o) { + final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o); + return super.indexOf(srch); + } + + @Override + public int lastIndexOf(final Object o) { + final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o); + + int ret = -1; + final Iterator it = iterator(); + for (int i = 0; it.hasNext(); ++i) { + if (srch.equals(it.next())) { + ret = i; + } + } + + return ret; + } + @Override public UnmodifiableIterator iterator() { return new IteratorImpl(identifier); diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedYangInstanceIdentifier.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedYangInstanceIdentifier.java index d204bf09cb..ac1d8606ac 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedYangInstanceIdentifier.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedYangInstanceIdentifier.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.data.api; import com.google.common.base.Preconditions; import com.google.common.base.Verify; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import java.io.IOException; @@ -16,9 +15,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; final class StackedYangInstanceIdentifier extends YangInstanceIdentifier { private static final long serialVersionUID = 1L; @@ -36,14 +33,9 @@ final class StackedYangInstanceIdentifier extends YangInstanceIdentifier { PARENT_FIELD = f; } - @SuppressWarnings("rawtypes") - private static final AtomicReferenceFieldUpdater LEGACYPATH_UPDATER = - AtomicReferenceFieldUpdater.newUpdater(StackedYangInstanceIdentifier.class, ImmutableList.class, "legacyPath"); - private final YangInstanceIdentifier parent; private final PathArgument pathArgument; - private transient volatile ImmutableList legacyPath; private transient volatile StackedPathArguments pathArguments; private transient volatile StackedReversePathArguments reversePathArguments; @@ -64,21 +56,7 @@ final class StackedYangInstanceIdentifier extends YangInstanceIdentifier { } @Override - public List getPath() { - // Temporary variable saves a volatile read - ImmutableList ret = legacyPath; - if (ret == null) { - // We could have used a synchronized block, but the window is quite - // small and worst that can happen is duplicate object construction. - ret = ImmutableList.copyOf(getPathArguments()); - LEGACYPATH_UPDATER.lazySet(this, ret); - } - - return ret; - } - - @Override - public Collection getPathArguments() { + public List getPathArguments() { StackedPathArguments ret = tryPathArguments(); if (ret == null) { List stack = new ArrayList<>(); @@ -99,7 +77,7 @@ final class StackedYangInstanceIdentifier extends YangInstanceIdentifier { } @Override - public Collection getReversePathArguments() { + public List getReversePathArguments() { StackedReversePathArguments ret = tryReversePathArguments(); if (ret == null) { ret = new StackedReversePathArguments(this); 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 a582e5c32a..ce8d0e45ba 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 @@ -64,7 +64,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; * * @see RFC6020 */ -public abstract class YangInstanceIdentifier extends IterablePathArguments implements Path, Immutable, Serializable { +public abstract class YangInstanceIdentifier extends CollectionPathArguments implements Path, Immutable, Serializable { /** * An empty {@link YangInstanceIdentifier}. It corresponds to the path of the conceptual * root of the YANG namespace. @@ -110,7 +110,9 @@ public abstract class YangInstanceIdentifier extends IterablePathArguments imple * @return Immutable list of path arguments. */ @Deprecated - public abstract List getPath(); + public final List getPath() { + return getPathArguments(); + } /** * Returns an ordered iteration of path arguments. @@ -118,7 +120,7 @@ public abstract class YangInstanceIdentifier extends IterablePathArguments imple * @return Immutable iteration of path arguments. */ @Override - public abstract Collection getPathArguments(); + public abstract List getPathArguments(); /** * Returns an iterable of path arguments in reverse order. This is useful @@ -127,7 +129,7 @@ public abstract class YangInstanceIdentifier extends IterablePathArguments imple * @return Immutable iterable of path arguments in reverse order. */ @Override - public abstract Collection getReversePathArguments(); + public abstract List getReversePathArguments(); /** * Returns the last PathArgument. This is equivalent of iterating