BUG-3263: return a List of PathArguments
[yangtools.git] / yang / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / StackedReversePathArguments.java
index 54f6498bc247d4f165ca77c9241f749fa42ca327..002de6b6926fd8288d5ddab0d253a6f0ec764b14 100644 (file)
@@ -7,19 +7,82 @@
 package org.opendaylight.yangtools.yang.data.api;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Verify;
+import com.google.common.collect.Iterators;
 import com.google.common.collect.UnmodifiableIterator;
+import java.util.Collection;
 import java.util.Iterator;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 
-final class StackedReversePathArguments implements Iterable<PathArgument> {
+final class StackedReversePathArguments extends PathArgumentList {
     private final StackedYangInstanceIdentifier identifier;
+    private int size;
+    private volatile boolean haveSize;
 
     StackedReversePathArguments(final StackedYangInstanceIdentifier identifier) {
         this.identifier = Preconditions.checkNotNull(identifier);
     }
 
+    private static int calculateSize(final YangInstanceIdentifier parent) {
+        YangInstanceIdentifier current = parent;
+        for (int i = 1;; ++i) {
+            final Collection<PathArgument> args = current.tryReversePathArguments();
+            if (args != null) {
+                return i + args.size();
+            }
+
+            Verify.verify(current instanceof StackedYangInstanceIdentifier);
+            current = ((StackedYangInstanceIdentifier)current).getParent();
+        }
+    }
+
+    @Override
+    public int size() {
+        int ret = size;
+        if (!haveSize) {
+            ret = calculateSize(identifier.getParent());
+            size = ret;
+            haveSize = true;
+        }
+
+        return ret;
+    }
+
+
+    @Override
+    public boolean contains(final Object o) {
+        final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o);
+        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 Iterator<PathArgument> iterator() {
+    public UnmodifiableIterator<PathArgument> iterator() {
         return new IteratorImpl(identifier);
     }
 
@@ -44,10 +107,12 @@ final class StackedReversePathArguments implements Iterable<PathArgument> {
 
             final PathArgument ret = identifier.getLastPathArgument();
             final YangInstanceIdentifier next = identifier.getParent();
-            if (!(next instanceof StackedYangInstanceIdentifier)) {
-                tail = next.getReversePathArguments().iterator();
+            final Iterable<PathArgument> args = next.tryReversePathArguments();
+            if (args != null) {
+                tail = args.iterator();
                 identifier = null;
             } else {
+                Verify.verify(next instanceof StackedYangInstanceIdentifier);
                 identifier = (StackedYangInstanceIdentifier) next;
             }