ff20c0f631706adf444e68757d63e1b4d5cfb8e8
[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 static com.google.common.base.Preconditions.checkArgument;
11 import static com.google.common.base.Preconditions.checkState;
12 import static com.google.common.base.Verify.verifyNotNull;
13
14 import com.google.common.annotations.Beta;
15 import java.util.Optional;
16 import javax.annotation.concurrent.NotThreadSafe;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
19 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
20 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModificationCursor;
21
22 /**
23  * Abstract {@link DataTreeModificationCursor} which tracks the current path. Subclasses can get the current path
24  * via {@link #current()}.
25  *
26  * @author Thomas Pantelis
27  */
28 @Beta
29 @NotThreadSafe
30 public abstract class AbstractDataTreeModificationCursor implements DataTreeModificationCursor {
31     private YangInstanceIdentifier current = YangInstanceIdentifier.EMPTY;
32
33     protected final YangInstanceIdentifier current() {
34         return current;
35     }
36
37     @Override
38     public final void enter(final PathArgument child) {
39         current = current.node(child);
40     }
41
42     @Override
43     public final void enter(final PathArgument... path) {
44         for (PathArgument arg : path) {
45             enter(arg);
46         }
47     }
48
49     @Override
50     public final void enter(final Iterable<PathArgument> path) {
51         for (PathArgument arg : path) {
52             enter(arg);
53         }
54     }
55
56     @Override
57     public final void exit() {
58         checkState(!current.isEmpty());
59         current = verifyNotNull(current.getParent());
60     }
61
62     @Override
63     public final void exit(final int depth) {
64         checkArgument(depth >= 0);
65
66         YangInstanceIdentifier next = current;
67         for (int i = 0; i < depth; ++i) {
68             next = next.getParent();
69             checkState(next != null);
70         }
71
72         current = next;
73     }
74
75     @Override
76     public final Optional<NormalizedNode<?, ?>> readNode(final PathArgument child) {
77         throw new UnsupportedOperationException("Not implemented");
78     }
79
80     @Override
81     public void close() {
82         // No-op
83     }
84 }