d54cd22ec8615e5fa2652656e614e4305cd5557b
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / main / java / org / opendaylight / controller / yang / parser / builder / impl / ChoiceCaseBuilder.java
1 package org.opendaylight.controller.yang.parser.builder.impl;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.HashSet;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Set;
10
11 import org.opendaylight.controller.yang.common.QName;
12 import org.opendaylight.controller.yang.model.api.AugmentationSchema;
13 import org.opendaylight.controller.yang.model.api.ChoiceCaseNode;
14 import org.opendaylight.controller.yang.model.api.ConstraintDefinition;
15 import org.opendaylight.controller.yang.model.api.DataSchemaNode;
16 import org.opendaylight.controller.yang.model.api.GroupingDefinition;
17 import org.opendaylight.controller.yang.model.api.SchemaPath;
18 import org.opendaylight.controller.yang.model.api.Status;
19 import org.opendaylight.controller.yang.model.api.TypeDefinition;
20 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
21 import org.opendaylight.controller.yang.model.api.UsesNode;
22 import org.opendaylight.controller.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
23 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
24 import org.opendaylight.controller.yang.parser.builder.api.AugmentationTargetBuilder;
25 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
26 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
27 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
28 import org.opendaylight.controller.yang.parser.util.YangParseException;
29
30 public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder implements
31         DataSchemaNodeBuilder, AugmentationTargetBuilder {
32     private boolean isBuilt;
33     private final ChoiceCaseNodeImpl instance;
34     private final int line;
35     private SchemaPath schemaPath;
36     private String description;
37     private String reference;
38     private Status status = Status.CURRENT;
39     private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
40     private boolean augmenting;
41     private final ConstraintsBuilder constraints;
42     private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<UsesNodeBuilder>();
43     private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<AugmentationSchemaBuilder>();
44
45     ChoiceCaseBuilder(final QName qname, final int line) {
46         super(qname);
47         this.line = line;
48         instance = new ChoiceCaseNodeImpl(qname);
49         constraints = new ConstraintsBuilder(line);
50     }
51
52     @Override
53     public ChoiceCaseNode build() {
54         if(!isBuilt) {
55             instance.setConstraints(constraints.build());
56             instance.setPath(schemaPath);
57             instance.setDescription(description);
58             instance.setReference(reference);
59             instance.setStatus(status);
60             instance.setAugmenting(augmenting);
61
62             // CHILD NODES
63             final Map<QName, DataSchemaNode> childs = new HashMap<QName, DataSchemaNode>();
64             for (DataSchemaNodeBuilder node : addedChildNodes) {
65                 childs.put(node.getQName(), node.build());
66             }
67             instance.setChildNodes(childs);
68
69             // USES
70             final Set<UsesNode> uses = new HashSet<UsesNode>();
71             for (UsesNodeBuilder builder : addedUsesNodes) {
72                 uses.add(builder.build());
73             }
74             instance.setUses(uses);
75
76             // UNKNOWN NODES
77             final List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
78             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
79                 unknownNodes.add(b.build());
80             }
81             instance.setUnknownSchemaNodes(unknownNodes);
82
83             // AUGMENTATIONS
84             final Set<AugmentationSchema> augmentations = new HashSet<AugmentationSchema>();
85             for (AugmentationSchemaBuilder builder : addedAugmentations) {
86                 augmentations.add(builder.build());
87             }
88             instance.setAvailableAugmentations(augmentations);
89
90             isBuilt = true;
91         }
92
93         return instance;
94     }
95
96     @Override
97     public void rebuild() {
98         isBuilt = false;
99         build();
100     }
101
102     @Override
103     public int getLine() {
104         return line;
105     }
106
107     public SchemaPath getPath() {
108         return schemaPath;
109     }
110
111     @Override
112     public void setPath(final SchemaPath schemaPath) {
113         this.schemaPath = schemaPath;
114     }
115
116     public String getDescription() {
117         return description;
118     }
119
120     @Override
121     public void setDescription(final String description) {
122         this.description = description;
123     }
124
125     public String getReference() {
126         return reference;
127     }
128
129     @Override
130     public void setReference(String reference) {
131         this.reference = reference;
132     }
133
134     public Status getStatus() {
135         return status;
136     }
137
138     @Override
139     public void setStatus(Status status) {
140         if (status != null) {
141             this.status = status;
142         }
143     }
144
145     public boolean isAugmenting() {
146         return augmenting;
147     }
148
149     @Override
150     public void setAugmenting(boolean augmenting) {
151         this.augmenting = augmenting;
152     }
153
154     public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
155         return addedUnknownNodes;
156     }
157
158     @Override
159     public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {
160         addedUnknownNodes.add(unknownNode);
161     }
162
163     public Set<UsesNodeBuilder> getUsesNodes() {
164         return addedUsesNodes;
165     }
166
167     @Override
168     public void addUsesNode(UsesNodeBuilder usesNodeBuilder) {
169         addedUsesNodes.add(usesNodeBuilder);
170     }
171
172     @Override
173     public Set<TypeDefinitionBuilder> getTypeDefinitions() {
174         return Collections.emptySet();
175     }
176
177     @Override
178     public void addTypedef(TypeDefinitionBuilder typedefBuilder) {
179         throw new YangParseException(line,
180                 "Can not add type definition to choice case.");
181     }
182
183     @Override
184     public boolean isConfiguration() {
185         return false;
186     }
187
188     @Override
189     public void setConfiguration(boolean configuration) {
190         throw new YangParseException(line,
191                 "Can not add config definition to choice case.");
192     }
193
194     @Override
195     public ConstraintsBuilder getConstraints() {
196         return constraints;
197     }
198
199     @Override
200     public void addAugmentation(AugmentationSchemaBuilder augment) {
201         addedAugmentations.add(augment);
202     }
203
204     public final class ChoiceCaseNodeImpl implements ChoiceCaseNode {
205         private final QName qname;
206         private SchemaPath path;
207         private String description;
208         private String reference;
209         private Status status = Status.CURRENT;
210         private boolean augmenting;
211         private ConstraintDefinition constraints;
212         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
213         private Set<AugmentationSchema> augmentations = Collections.emptySet();
214         private Set<UsesNode> uses = Collections.emptySet();
215         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
216
217         private ChoiceCaseNodeImpl(QName qname) {
218             this.qname = qname;
219         }
220
221         @Override
222         public QName getQName() {
223             return qname;
224         }
225
226         @Override
227         public SchemaPath getPath() {
228             return path;
229         }
230
231         private void setPath(SchemaPath path) {
232             this.path = path;
233         }
234
235         @Override
236         public String getDescription() {
237             return description;
238         }
239
240         private void setDescription(String description) {
241             this.description = description;
242         }
243
244         @Override
245         public String getReference() {
246             return reference;
247         }
248
249         private void setReference(String reference) {
250             this.reference = reference;
251         }
252
253         @Override
254         public Status getStatus() {
255             return status;
256         }
257
258         private void setStatus(Status status) {
259             if (status != null) {
260                 this.status = status;
261             }
262         }
263
264         @Override
265         public boolean isConfiguration() {
266             return false;
267         }
268
269         @Override
270         public ConstraintDefinition getConstraints() {
271             return constraints;
272         }
273
274         private void setConstraints(ConstraintDefinition constraints) {
275             this.constraints = constraints;
276         }
277
278         @Override
279         public boolean isAugmenting() {
280             return augmenting;
281         }
282
283         private void setAugmenting(boolean augmenting) {
284             this.augmenting = augmenting;
285         }
286
287         @Override
288         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
289             return unknownNodes;
290         }
291
292         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
293             if (unknownNodes != null) {
294                 this.unknownNodes = unknownNodes;
295             }
296         }
297
298         /**
299          * Always returns an empty set, because case node can not contains type
300          * definitions.
301          */
302         @Override
303         public Set<TypeDefinition<?>> getTypeDefinitions() {
304             return Collections.emptySet();
305         }
306
307         @Override
308         public Set<DataSchemaNode> getChildNodes() {
309             return new HashSet<DataSchemaNode>(childNodes.values());
310         }
311
312         private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {
313             if (childNodes != null) {
314                 this.childNodes = childNodes;
315             }
316         }
317
318         @Override
319         public Set<GroupingDefinition> getGroupings() {
320             return Collections.emptySet();
321         }
322
323         @Override
324         public DataSchemaNode getDataChildByName(QName name) {
325             return childNodes.get(name);
326         }
327
328         @Override
329         public DataSchemaNode getDataChildByName(String name) {
330             DataSchemaNode result = null;
331             for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
332                 if (entry.getKey().getLocalName().equals(name)) {
333                     result = entry.getValue();
334                     break;
335                 }
336             }
337             return result;
338         }
339
340         @Override
341         public Set<UsesNode> getUses() {
342             return uses;
343         }
344
345         private void setUses(Set<UsesNode> uses) {
346             if (uses != null) {
347                 this.uses = uses;
348             }
349         }
350
351         @Override
352         public Set<AugmentationSchema> getAvailableAugmentations() {
353             return augmentations;
354         }
355
356         private void setAvailableAugmentations(
357                 Set<AugmentationSchema> augmentations) {
358             if (augmentations != null) {
359                 this.augmentations = augmentations;
360             }
361         }
362
363         public ChoiceCaseBuilder toBuilder() {
364             return ChoiceCaseBuilder.this;
365         }
366
367         @Override
368         public int hashCode() {
369             final int prime = 31;
370             int result = 1;
371             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
372             result = prime * result + ((path == null) ? 0 : path.hashCode());
373             return result;
374         }
375
376         @Override
377         public boolean equals(Object obj) {
378             if (this == obj) {
379                 return true;
380             }
381             if (obj == null) {
382                 return false;
383             }
384             if (getClass() != obj.getClass()) {
385                 return false;
386             }
387             ChoiceCaseNodeImpl other = (ChoiceCaseNodeImpl) obj;
388             if (qname == null) {
389                 if (other.qname != null) {
390                     return false;
391                 }
392             } else if (!qname.equals(other.qname)) {
393                 return false;
394             }
395             if (path == null) {
396                 if (other.path != null) {
397                     return false;
398                 }
399             } else if (!path.equals(other.path)) {
400                 return false;
401             }
402             return true;
403         }
404
405         @Override
406         public String toString() {
407             StringBuilder sb = new StringBuilder(
408                     ChoiceCaseNodeImpl.class.getSimpleName());
409             sb.append("[");
410             sb.append("qname=" + qname);
411             sb.append("]");
412             return sb.toString();
413         }
414     }
415
416 }