BUG-3263: return a List of PathArguments 86/20686/11
authorRobert Varga <rovarga@cisco.com>
Mon, 18 May 2015 23:05:42 +0000 (01:05 +0200)
committerRobert Varga <rovarga@cisco.com>
Tue, 19 May 2015 08:53:22 +0000 (10:53 +0200)
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 <rovarga@cisco.com>
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/CollectionPathArguments.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/FixedYangInstanceIdentifier.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/PathArgumentList.java [moved from yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/PathArgumentCollection.java with 83% similarity]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedPathArguments.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedReversePathArguments.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/StackedYangInstanceIdentifier.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java

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 (file)
index 0000000..af7895c
--- /dev/null
@@ -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<PathArgument> getPathArguments();
+    @Override
+    public abstract Collection<PathArgument> getReversePathArguments();
+}
index 20045cf43ca3a61d0e287a930fb2fe9ae7065195..bc60c5a5819c5a6e6126bb8e86d1e0da4cd48721 100644 (file)
@@ -47,11 +47,6 @@ final class FixedYangInstanceIdentifier extends YangInstanceIdentifier {
         return ret;
     }
 
-    @Override
-    public List<PathArgument> getPath() {
-        return path;
-    }
-
     @Override
     public List<PathArgument> getPathArguments() {
         return path;
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 5ed5e256a0a06b6f4dbf5b299e69e351de6318bf..0453b05a02fe0877d7358b5c90964106ba8bbd3e 100644 (file)
@@ -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<PathArgument> {
+abstract class PathArgumentList extends AbstractList<PathArgument> {
     @Override
     public abstract UnmodifiableIterator<PathArgument> iterator();
 
@@ -44,4 +44,9 @@ abstract class PathArgumentCollection extends AbstractCollection<PathArgument> {
     public final void clear() {
         throw new UnsupportedOperationException();
     }
+
+    @Override
+    public final boolean addAll(final int index, final Collection<? extends PathArgument> c) {
+        throw new UnsupportedOperationException();
+    }
 }
index ed9d65b8ba2f80a1c2e7c5be68f9bee50d39a761..93dde99d1ed97999de70feb6cb332677cb54cfd7 100644 (file)
@@ -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<PathArgument> base;
+final class StackedPathArguments extends PathArgumentList {
+    private final List<PathArgument> base;
     private final List<PathArgument> stack;
 
     public StackedPathArguments(final YangInstanceIdentifier base, final List<PathArgument> 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<PathArgument> iterator() {
         return new IteratorImpl(base, stack);
index 5e71817b2fa51a29e9202ffcc7e00a8f4f81d609..002de6b6926fd8288d5ddab0d253a6f0ec764b14 100644 (file)
@@ -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<PathArgument> it = iterator();
+        for (int i = 0; it.hasNext(); ++i) {
+            if (srch.equals(it.next())) {
+                ret = i;
+            }
+        }
+
+        return ret;
+    }
+
     @Override
     public UnmodifiableIterator<PathArgument> iterator() {
         return new IteratorImpl(identifier);
index d204bf09cbed3c9079c932b35a8decc739499953..ac1d8606ac7be91f23ebaca5225638398164b88d 100644 (file)
@@ -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<StackedYangInstanceIdentifier, ImmutableList> LEGACYPATH_UPDATER =
-            AtomicReferenceFieldUpdater.newUpdater(StackedYangInstanceIdentifier.class, ImmutableList.class, "legacyPath");
-
     private final YangInstanceIdentifier parent;
     private final PathArgument pathArgument;
 
-    private transient volatile ImmutableList<PathArgument> legacyPath;
     private transient volatile StackedPathArguments pathArguments;
     private transient volatile StackedReversePathArguments reversePathArguments;
 
@@ -64,21 +56,7 @@ final class StackedYangInstanceIdentifier extends YangInstanceIdentifier {
     }
 
     @Override
-    public List<PathArgument> getPath() {
-        // Temporary variable saves a volatile read
-        ImmutableList<PathArgument> 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<PathArgument> getPathArguments() {
+    public List<PathArgument> getPathArguments() {
         StackedPathArguments ret = tryPathArguments();
         if (ret == null) {
             List<PathArgument> stack = new ArrayList<>();
@@ -99,7 +77,7 @@ final class StackedYangInstanceIdentifier extends YangInstanceIdentifier {
     }
 
     @Override
-    public Collection<PathArgument> getReversePathArguments() {
+    public List<PathArgument> getReversePathArguments() {
         StackedReversePathArguments ret = tryReversePathArguments();
         if (ret == null) {
             ret = new StackedReversePathArguments(this);
index a582e5c32a3e1f0855bfbaad0a9685172ff42464..ce8d0e45bade344b6c6285921bffd5ba34211ea3 100644 (file)
@@ -64,7 +64,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
  *
  * @see <a href="http://tools.ietf.org/html/rfc6020#section-9.13">RFC6020</a>
  */
-public abstract class YangInstanceIdentifier extends IterablePathArguments implements Path<YangInstanceIdentifier>, Immutable, Serializable {
+public abstract class YangInstanceIdentifier extends CollectionPathArguments implements Path<YangInstanceIdentifier>, 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<PathArgument> getPath();
+    public final List<PathArgument> 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<PathArgument> getPathArguments();
+    public abstract List<PathArgument> 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<PathArgument> getReversePathArguments();
+    public abstract List<PathArgument> getReversePathArguments();
 
     /**
      * Returns the last PathArgument. This is equivalent of iterating