Fix race conditions between config-manager and persister.
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / sal / restconf / impl / CompositeNodeWrapper.java
1 package org.opendaylight.controller.sal.restconf.impl;
2
3 import java.net.URI;
4 import java.util.ArrayList;
5 import java.util.Collection;
6 import java.util.Collections;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Set;
10
11 import org.opendaylight.yangtools.yang.common.QName;
12 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
13 import org.opendaylight.yangtools.yang.data.api.ModifyAction;
14 import org.opendaylight.yangtools.yang.data.api.MutableCompositeNode;
15 import org.opendaylight.yangtools.yang.data.api.Node;
16 import org.opendaylight.yangtools.yang.data.api.SimpleNode;
17 import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
18
19 import com.google.common.base.Preconditions;
20
21 public final class CompositeNodeWrapper implements NodeWrapper<CompositeNode>, CompositeNode {
22
23     private MutableCompositeNode compositeNode;
24
25     private String localName;
26     private URI namespace;
27     private List<NodeWrapper<?>> values = new ArrayList<>();
28     
29     public CompositeNodeWrapper(String localName) {
30         this.localName = Preconditions.checkNotNull(localName);
31     }
32     
33     public CompositeNodeWrapper(URI namespace, String localName) {
34         this(localName);
35         this.namespace = namespace;
36     }
37
38     @Override
39     public String getLocalName() {
40         if (compositeNode != null) {
41             return compositeNode.getNodeType().getLocalName();
42         }
43         return localName;
44     }
45
46     @Override
47     public URI getNamespace() {
48         if (compositeNode != null) {
49             return compositeNode.getNodeType().getNamespace();
50         }
51         return namespace;
52     }
53
54     @Override
55     public void setNamespace(URI namespace) {
56         Preconditions.checkState(compositeNode == null, "Cannot change the object, due to data inconsistencies.");
57         this.namespace = namespace;
58     }
59
60     public void addValue(NodeWrapper<?> value) {
61         Preconditions.checkState(compositeNode == null, "Cannot change the object, due to data inconsistencies.");
62         values.add(value);
63     }
64
65     public void removeValue(NodeWrapper<CompositeNode> value) {
66         Preconditions.checkState(compositeNode == null, "Cannot change the object, due to data inconsistencies.");
67         values.remove(value);
68     }
69     
70     public List<NodeWrapper<?>> getValues() {
71         Preconditions.checkState(compositeNode == null, "Data can be inconsistent.");
72         return Collections.unmodifiableList(values);
73     }
74
75     @Override
76     public CompositeNode unwrap(CompositeNode parent) {
77         if (compositeNode == null) {
78             Preconditions.checkNotNull(namespace);
79             compositeNode = NodeFactory.createMutableCompositeNode(new QName(namespace, localName), 
80                     parent, new ArrayList<Node<?>>(), ModifyAction.CREATE, null);
81             
82             List<Node<?>> nodeValues = new ArrayList<>();
83             for (NodeWrapper<?> nodeWrapper : values) {
84                 nodeValues.add(nodeWrapper.unwrap(compositeNode));
85             }
86             compositeNode.setValue(nodeValues);
87             
88             values = null;
89             namespace = null;
90             localName = null;
91         }
92         return compositeNode;
93     }
94
95     @Override
96     public QName getNodeType() {
97         return unwrap(null).getNodeType();
98     }
99
100     @Override
101     public CompositeNode getParent() {
102         return unwrap(null).getParent();
103     }
104
105     @Override
106     public List<Node<?>> getValue() {
107         return unwrap(null).getValue();
108     }
109
110     @Override
111     public ModifyAction getModificationAction() {
112         return unwrap(null).getModificationAction();
113     }
114
115     @Override
116     public List<Node<?>> getChildren() {
117         return unwrap(null).getChildren();
118     }
119
120     @Override
121     public List<CompositeNode> getCompositesByName(QName children) {
122         return unwrap(null).getCompositesByName(children);
123     }
124
125     @Override
126     public List<CompositeNode> getCompositesByName(String children) {
127         return unwrap(null).getCompositesByName(children);
128     }
129
130     @Override
131     public List<SimpleNode<?>> getSimpleNodesByName(QName children) {
132         return unwrap(null).getSimpleNodesByName(children);
133     }
134
135     @Override
136     public List<SimpleNode<?>> getSimpleNodesByName(String children) {
137         return unwrap(null).getSimpleNodesByName(children);
138     }
139
140     @Override
141     public CompositeNode getFirstCompositeByName(QName container) {
142         return unwrap(null).getFirstCompositeByName(container);
143     }
144
145     @Override
146     public SimpleNode<?> getFirstSimpleByName(QName leaf) {
147         return unwrap(null).getFirstSimpleByName(leaf);
148     }
149
150     @Override
151     public MutableCompositeNode asMutable() {
152         return unwrap(null).asMutable();
153     }
154
155     @Override
156     public QName getKey() {
157         return unwrap(null).getKey();
158     }
159
160     @Override
161     public List<Node<?>> setValue(List<Node<?>> value) {
162         return unwrap(null).setValue(value);
163     }
164
165     @Override
166     public int size() {
167         return unwrap(null).size();
168     }
169
170     @Override
171     public boolean isEmpty() {
172         return unwrap(null).isEmpty();
173     }
174
175     @Override
176     public boolean containsKey(Object key) {
177         return unwrap(null).containsKey(key);
178     }
179
180     @Override
181     public boolean containsValue(Object value) {
182         return unwrap(null).containsValue(value);
183     }
184
185     @Override
186     public List<Node<?>> get(Object key) {
187         return unwrap(null).get(key);
188     }
189
190     @Override
191     public List<Node<?>> put(QName key, List<Node<?>> value) {
192         return unwrap(null).put(key, value);
193     }
194
195     @Override
196     public List<Node<?>> remove(Object key) {
197         return unwrap(null).remove(key);
198     }
199
200     @Override
201     public void putAll(Map<? extends QName, ? extends List<Node<?>>> m) {
202         unwrap(null).putAll(m);
203     }
204
205     @Override
206     public void clear() {
207         unwrap(null).clear();
208     }
209
210     @Override
211     public Set<QName> keySet() {
212         return unwrap(null).keySet();
213     }
214
215     @Override
216     public Collection<List<Node<?>>> values() {
217         return unwrap(null).values();
218     }
219
220     @Override
221     public Set<java.util.Map.Entry<QName, List<Node<?>>>> entrySet() {
222         return unwrap(null).entrySet();
223     }
224
225 }