8c81d60819126bbe16e6a04e817ae66af101d3bf
[controller.git] / opendaylight / md-sal / sal-clustering-commons / src / main / java / org / opendaylight / controller / cluster / datastore / util / AbstractDataTreeModificationCursor.java
1 /*
2  * Copyright (c) 2016 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.cluster.datastore.util;
9
10 import com.google.common.annotations.Beta;
11 import com.google.common.base.Preconditions;
12 import com.google.common.base.Verify;
13 import java.util.Optional;
14 import javax.annotation.Nonnull;
15 import javax.annotation.concurrent.NotThreadSafe;
16 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
18 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
19 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModificationCursor;
20
21 /**
22  * Abstract {@link DataTreeModificationCursor} which tracks the current path. Subclasses can get the current path
23  * via {@link #current()}.
24  *
25  * @author Thomas Pantelis
26  */
27 @Beta
28 @NotThreadSafe
29 public abstract class AbstractDataTreeModificationCursor implements DataTreeModificationCursor {
30     private YangInstanceIdentifier current = YangInstanceIdentifier.EMPTY;
31
32     protected final YangInstanceIdentifier current() {
33         return current;
34     }
35
36     @Override
37     public final void enter(@Nonnull final PathArgument child) {
38         current = current.node(child);
39     }
40
41     @Override
42     public final void enter(@Nonnull final PathArgument... path) {
43         for (PathArgument arg : path) {
44             enter(arg);
45         }
46     }
47
48     @Override
49     public final void enter(@Nonnull final Iterable<PathArgument> path) {
50         for (PathArgument arg : path) {
51             enter(arg);
52         }
53     }
54
55     @Override
56     public final void exit() {
57         Preconditions.checkState(!current.isEmpty());
58         current = Verify.verifyNotNull(current.getParent());
59     }
60
61     @Override
62     public final void exit(final int depth) {
63         Preconditions.checkArgument(depth >= 0);
64
65         YangInstanceIdentifier next = current;
66         for (int i = 0; i < depth; ++i) {
67             next = next.getParent();
68             Preconditions.checkState(next != null);
69         }
70
71         current = next;
72     }
73
74     @Override
75     public final Optional<NormalizedNode<?, ?>> readNode(@Nonnull final PathArgument child) {
76         throw new UnsupportedOperationException("Not implemented");
77     }
78
79     @Override
80     public void close() {
81         // No-op
82     }
83 }