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