Add UniqueValidation
[yangtools.git] / yang / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / StackedReversePathArguments.java
index 54f6498bc247d4f165ca77c9241f749fa42ca327..9250515342c986f80992f3115891e0fe30eac273 100644 (file)
@@ -1,25 +1,92 @@
 /*
  * 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 com.google.common.base.Preconditions;
+import static com.google.common.base.Verify.verify;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.Iterators;
 import com.google.common.collect.UnmodifiableIterator;
+import java.util.Collection;
 import java.util.Iterator;
+import org.eclipse.jdt.annotation.NonNull;
 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 volatile int size;
+
     StackedReversePathArguments(final StackedYangInstanceIdentifier identifier) {
-        this.identifier = Preconditions.checkNotNull(identifier);
+        this.identifier = requireNonNull(identifier);
+    }
+
+    private static int calculateSize(final @NonNull YangInstanceIdentifier parent) {
+        YangInstanceIdentifier current = parent;
+        for (int i = 1;; ++i) {
+            final Collection<PathArgument> args = current.tryReversePathArguments();
+            if (args != null) {
+                return i + args.size();
+            }
+
+            verify(current instanceof StackedYangInstanceIdentifier);
+            current = ((StackedYangInstanceIdentifier) current).getParent();
+        }
+    }
+
+    @Override
+    public int size() {
+        int ret = size;
+        if (ret == 0) {
+            ret = calculateSize(identifier.getParent());
+            size = ret;
+        }
+
+        return ret;
+    }
+
+    @Override
+    @SuppressWarnings("checkstyle:parameterName")
+    public boolean contains(final Object o) {
+        final PathArgument srch = (PathArgument) requireNonNull(o);
+        return Iterators.contains(iterator(), srch);
+    }
+
+    @Override
+    public PathArgument get(final int index) {
+        return Iterators.get(iterator(), index);
+    }
+
+    @Override
+    @SuppressWarnings("checkstyle:parameterName")
+    public int indexOf(final Object o) {
+        final PathArgument srch = (PathArgument) requireNonNull(o);
+        return super.indexOf(srch);
+    }
+
+    @Override
+    @SuppressWarnings("checkstyle:parameterName")
+    public int lastIndexOf(final Object o) {
+        final PathArgument srch = (PathArgument) requireNonNull(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);
     }
 
@@ -28,7 +95,7 @@ final class StackedReversePathArguments implements Iterable<PathArgument> {
         private Iterator<PathArgument> tail;
 
         IteratorImpl(final StackedYangInstanceIdentifier identifier) {
-            this.identifier = Preconditions.checkNotNull(identifier);
+            this.identifier = requireNonNull(identifier);
         }
 
         @Override
@@ -44,10 +111,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(next instanceof StackedYangInstanceIdentifier);
                 identifier = (StackedYangInstanceIdentifier) next;
             }