Clean YangStatementParserListenerImpl up
[yangtools.git] / yang / yang-data-operations / src / main / java / org / opendaylight / yangtools / yang / data / operations / OperationStack.java
1 /*
2  * Copyright (c) 2013 Cisco 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.yangtools.yang.data.operations;
9
10 import com.google.common.base.Optional;
11 import com.google.common.base.Preconditions;
12 import java.net.URI;
13 import java.util.Deque;
14 import java.util.LinkedList;
15 import org.opendaylight.yangtools.yang.common.QName;
16 import org.opendaylight.yangtools.yang.data.api.AttributesContainer;
17 import org.opendaylight.yangtools.yang.data.api.ModifyAction;
18 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
21
22 /**
23  * Tracks netconf operations on nested nodes.
24  */
25 final class OperationStack {
26
27     private static final Logger LOG = LoggerFactory.getLogger(OperationStack.class);
28     private static final QName OPERATION_NAME = new QName(URI.create("urn:ietf:params:xml:ns:netconf:base:1.0"), "operation");
29
30     private final Deque<ModifyAction> operations = new LinkedList<>();
31
32     public OperationStack(ModifyAction operation) {
33         operations.add(operation);
34     }
35
36     public void enteringNode(Optional<? extends NormalizedNode<?, ?>> modificationNode) {
37         if (!modificationNode.isPresent()) {
38             return;
39         }
40
41         NormalizedNode<?, ?> modification = modificationNode.get();
42
43         enteringNode(modification);
44     }
45
46     public void enteringNode(NormalizedNode<?, ?> modificationNode) {
47         ModifyAction operation = getOperation(modificationNode);
48         if (operation == null) {
49             return;
50         }
51
52         addOperation(operation);
53     }
54
55     private ModifyAction getOperation(NormalizedNode<?, ?> modificationNode) {
56         if (!(modificationNode instanceof AttributesContainer)) {
57             return null;
58         }
59
60         String operationString = ((AttributesContainer) modificationNode).getAttributes().get(OPERATION_NAME);
61
62         return operationString == null ? null : ModifyAction.fromXmlValue(operationString);
63     }
64
65     private void addOperation(ModifyAction operation) {
66         // Add check for permitted operation
67         operations.add(operation);
68         LOG.trace("Operation added {}, {}", operation, this);
69     }
70
71     public ModifyAction getCurrentOperation() {
72         return operations.getLast();
73     }
74
75     public void exitingNode(Optional<? extends NormalizedNode<?, ?>> modificationNode) {
76         if (!modificationNode.isPresent()) {
77             return;
78         }
79
80         NormalizedNode<?, ?> modification = modificationNode.get();
81
82         exitingNode(modification);
83     }
84
85     public void exitingNode(NormalizedNode<?, ?> modification) {
86         ModifyAction operation = getOperation(modification);
87         if (operation == null) {
88             return;
89         }
90
91         Preconditions.checkState(operations.size() > 1);
92         Preconditions.checkState(operations.peekLast().equals(operation), "Operations mismatch %s, %s",
93                 operations.peekLast(), operation);
94
95         ModifyAction removed = operations.removeLast();
96         LOG.trace("Operation removed {}, {}", removed, this);
97     }
98
99     @Override
100         public String toString() {
101         return operations.toString();
102     }
103
104 }