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 / SimpleNodeWrapper.java
1 package org.opendaylight.controller.sal.restconf.impl;
2
3 import java.net.URI;
4
5 import org.opendaylight.yangtools.yang.common.QName;
6 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
7 import org.opendaylight.yangtools.yang.data.api.ModifyAction;
8 import org.opendaylight.yangtools.yang.data.api.MutableSimpleNode;
9 import org.opendaylight.yangtools.yang.data.api.SimpleNode;
10 import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
11
12 import com.google.common.base.Preconditions;
13
14 public final class SimpleNodeWrapper implements NodeWrapper<SimpleNode<?>>, SimpleNode<String> {
15     
16     private SimpleNode<String> simpleNode;
17     
18     private String localName;
19     private String value;
20     private URI namespace;
21
22     public SimpleNodeWrapper(String localName, String value) {
23         this.localName = Preconditions.checkNotNull(localName);
24         this.value = value;
25     }
26     
27     public SimpleNodeWrapper(URI namespace, String localName, String value) {
28         this(localName, value);
29         this.namespace = namespace;
30     }
31     
32     @Override
33     public String getLocalName() {
34         if (simpleNode != null) {
35             return simpleNode.getNodeType().getLocalName();
36         }
37         return localName;
38     }
39     
40     @Override
41     public URI getNamespace() {
42         if (simpleNode != null) {
43             return simpleNode.getNodeType().getNamespace();
44         }
45         return namespace;
46     }
47
48     @Override
49     public void setNamespace(URI namespace) {
50         Preconditions.checkState(simpleNode == null, "Cannot change the object, due to data inconsistencies.");
51         this.namespace = namespace;
52     }
53
54     @Override
55     public SimpleNode<String> unwrap(CompositeNode parent) {
56         if (simpleNode == null) {
57             Preconditions.checkNotNull(namespace);
58             simpleNode = NodeFactory.createImmutableSimpleNode(new QName(namespace, localName), parent, value);
59             
60             value = null;
61             namespace = null;
62             localName = null;
63         }
64         return simpleNode;
65     }
66
67     @Override
68     public QName getNodeType() {
69         return unwrap(null).getNodeType();
70     }
71
72     @Override
73     public CompositeNode getParent() {
74         return unwrap(null).getParent();
75     }
76
77     @Override
78     public String getValue() {
79         return unwrap(null).getValue();
80     }
81
82     @Override
83     public ModifyAction getModificationAction() {
84         return unwrap(null).getModificationAction();
85     }
86
87     @Override
88     public MutableSimpleNode<String> asMutable() {
89         return unwrap(null).asMutable();
90     }
91
92     @Override
93     public QName getKey() {
94         return unwrap(null).getKey();
95     }
96
97     @Override
98     public String setValue(String value) {
99         return unwrap(null).setValue(value);
100     }
101
102
103 }