BUG-3263: return a Collection for path arguments
[yangtools.git] / yang / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / StackedPathArguments.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
3  * This program and the accompanying materials are made available under the
4  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
5  * and is available at http://www.eclipse.org/legal/epl-v10.html
6  */
7 package org.opendaylight.yangtools.yang.data.api;
8
9 import com.google.common.base.Preconditions;
10 import com.google.common.collect.UnmodifiableIterator;
11 import java.util.Collection;
12 import java.util.Iterator;
13 import java.util.List;
14 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
15
16 final class StackedPathArguments extends PathArgumentCollection {
17     private final Collection<PathArgument> base;
18     private final List<PathArgument> stack;
19
20     public StackedPathArguments(final YangInstanceIdentifier base, final List<PathArgument> stack) {
21         this.base = base.getPathArguments();
22         this.stack = Preconditions.checkNotNull(stack);
23     }
24
25     @Override
26     public int size() {
27         return stack.size() + base.size();
28     }
29
30     @Override
31     public boolean contains(final Object o) {
32         final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o);
33         return stack.contains(srch) || base.contains(srch);
34     }
35
36     @Override
37     public UnmodifiableIterator<PathArgument> iterator() {
38         return new IteratorImpl(base, stack);
39     }
40
41     private static final class IteratorImpl extends UnmodifiableIterator<PathArgument> {
42         private final Iterator<PathArgument> stack;
43         private final Iterator<PathArgument> base;
44
45         IteratorImpl(final Iterable<PathArgument> base, final Iterable<PathArgument> stack) {
46             this.base = base.iterator();
47             this.stack = stack.iterator();
48         }
49
50         @Override
51         public boolean hasNext() {
52             return stack.hasNext();
53         }
54
55         @Override
56         public PathArgument next() {
57             if (base.hasNext()) {
58                 return base.next();
59             }
60             return stack.next();
61         }
62     }
63 }