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