blob: 44319c8e62e04527de3ec2f1666e6b3763ac1135 [file] [log] [blame]
Sithara Punnassery9306e6b2017-02-06 15:38:19 -08001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.config.model;
18
19import static org.onosproject.config.model.ModelConstants.NON_KEY_LEAF;
20
21/**
22 * Abstraction of an entity which represents leaf data tree node.
23 */
24public final class LeafNode extends DataNode {
25
26 /**
27 * Leaf node value.
28 */
29 private Object value;
30
31 /**
32 * Returns value contained in leaf node.
33 *
34 * @return value contained in leaf node
35 */
36 public Object value() {
37 return value;
38 }
39
40 /**
41 * Returns value as string, for usage in serializers.
42 *
43 * @return string representation of value
44 */
45 public String asString() {
46 return String.valueOf(value);
47 }
48
49 /**
50 * Creates an instance of leaf node.
51 *
52 * @param builder leaf node builder
53 */
54 public LeafNode(Builder builder) {
55 super(builder);
56 value = builder.value;
57 }
58
59 /**
60 * Returns data node builder instance.
61 *
62 * @param name name of node
63 * @param nameSpace namespace of node
64 * @return data node builder instance
65 */
66 public static Builder builder(String name, String nameSpace) {
67 return new Builder(name, nameSpace);
68 }
69
70 /**
71 * Returns data node copy builder.
72 *
73 * @return data node copy builder
74 */
75 @Override
76 public Builder copyBuilder() {
77 return new Builder(this);
78 }
79
80 /**
81 * Builder with get and set functions to build leaf node,
82 * builder will be used both to create leaf node from scratch or from a
83 * given leaf node.
84 */
85 public static final class Builder extends DataNode.Builder<Builder> {
86
87 /**
88 * Leaf node value.
89 */
90 private Object value;
91
92 public Builder() {
93 }
94
95 /**
96 * Creates an instance of data node builder.
97 *
98 * @param name name of node
99 * @param namespace namespace of node
100 */
101 public Builder(String name, String namespace) {
102 keyBuilder = NodeKey.builder().schemaId(name, namespace);
103 }
104
105 /**
106 * Creates an instance of leaf node copy builder.
107 *
108 * @param node old leaf node
109 */
110 public Builder(LeafNode node) {
111 super(node);
112 value = node.value;
113 }
114
115 /**
116 * Sets value of leaf node builder.
117 *
118 * @param value value
119 * @return leaf node builder
120 */
121 public Builder value(Object value) {
122 this.value = value;
123 return this;
124 }
125
126 @Override
127 public InnerNode.Builder createChildBuilder(String name, String nameSpace) {
128 throw new IllegalStateException("leaf node can't have a child " +
129 "node");
130 }
131
132 @Override
133 public LeafNode.Builder createChildBuilder(String name, String nameSpace,
134 Object value) {
135 throw new IllegalStateException("leaf node can't have a child " +
136 "node");
137 }
138
139 @Override
140 public InnerNode.Builder deleteChild(NodeKey key) {
141 throw new IllegalStateException("leaf node can't have a child " +
142 "node");
143 }
144
145 @Override
146 public InnerNode.Builder getChildBuilder(NodeKey key) {
147 throw new IllegalStateException("leaf node can't have a child " +
148 "node");
149 }
150
151
152 @Override
153 public InnerNode.Builder addKeyLeaf(String name, String nameSpace, Object val) {
154 throw new IllegalStateException("leaf node can't have a key " +
155 "leaves node");
156 }
157
158 @Override
159 public Builder addLeafListValue(Object val) {
160 LeafListKey.LeafListKeyBuilder leafListKeyBuilder;
161 if (!(keyBuilder instanceof LeafListKey.LeafListKeyBuilder)) {
162 if (keyBuilder instanceof ListKey.ListKeyBuilder) {
163 throw new ModelException(NON_KEY_LEAF);
164 }
165
166 leafListKeyBuilder = new LeafListKey.LeafListKeyBuilder();
167 NodeKey key = keyBuilder.build();
168 leafListKeyBuilder.schemaId(key.schemaId());
169 } else {
170 leafListKeyBuilder = (LeafListKey.LeafListKeyBuilder) keyBuilder;
171 }
172
173 leafListKeyBuilder.value(val);
174 keyBuilder = leafListKeyBuilder;
175 return this;
176 }
177
178 /**
179 * Builds a leaf node object.
180 *
181 * @return leaf node
182 */
183 @Override
184 public LeafNode build() {
185 if (type == null) {
186 throw new IllegalStateException("node should have a type.");
187 }
188 if (key == null) {
189 key = keyBuilder.build();
190 }
191 return new LeafNode(this);
192 }
193 }
194}