a99e6a7406e45bfbe6d7ded27f33c3a2ab2912f9
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / main / java / org / opendaylight / controller / yang / parser / builder / impl / ListSchemaNodeBuilder.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.yang.parser.builder.impl;
9
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.Set;
16 import java.util.TreeMap;
17 import java.util.TreeSet;
18
19 import org.opendaylight.controller.yang.common.QName;
20 import org.opendaylight.controller.yang.model.api.AugmentationSchema;
21 import org.opendaylight.controller.yang.model.api.ConstraintDefinition;
22 import org.opendaylight.controller.yang.model.api.DataSchemaNode;
23 import org.opendaylight.controller.yang.model.api.GroupingDefinition;
24 import org.opendaylight.controller.yang.model.api.ListSchemaNode;
25 import org.opendaylight.controller.yang.model.api.SchemaPath;
26 import org.opendaylight.controller.yang.model.api.Status;
27 import org.opendaylight.controller.yang.model.api.TypeDefinition;
28 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
29 import org.opendaylight.controller.yang.model.api.UsesNode;
30 import org.opendaylight.controller.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
31 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
32 import org.opendaylight.controller.yang.parser.builder.api.AugmentationTargetBuilder;
33 import org.opendaylight.controller.yang.parser.builder.api.ConfigNode;
34 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
35 import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder;
36 import org.opendaylight.controller.yang.parser.builder.api.GroupingMember;
37 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
38 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
39 import org.opendaylight.controller.yang.parser.util.Comparators;
40
41 public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilder implements DataSchemaNodeBuilder,
42         AugmentationTargetBuilder, GroupingMember, ConfigNode {
43     private boolean isBuilt;
44     private final ListSchemaNodeImpl instance;
45     // SchemaNode args
46     private SchemaPath schemaPath;
47     private String description;
48     private String reference;
49     private Status status = Status.CURRENT;
50     private List<UnknownSchemaNode> unknownNodes;
51     private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
52     // DataSchemaNode args
53     private boolean augmenting;
54     private boolean addedByUses;
55     private Boolean configuration;
56     private final ConstraintsBuilder constraints;
57     // DataNodeContainer args
58     private Set<TypeDefinition<?>> typedefs;
59     private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
60     private Set<UsesNode> usesNodes;
61     private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<UsesNodeBuilder>();
62     // AugmentationTarget args
63     private Set<AugmentationSchema> augmentations;
64     private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<AugmentationSchemaBuilder>();
65     // ListSchemaNode args
66     private List<QName> keyDefinition = Collections.emptyList();
67     private boolean userOrdered;
68
69     public ListSchemaNodeBuilder(final int line, final QName qname, final SchemaPath schemaPath) {
70         super(line, qname);
71         this.schemaPath = schemaPath;
72         instance = new ListSchemaNodeImpl(qname);
73         constraints = new ConstraintsBuilder(line);
74     }
75
76     public ListSchemaNodeBuilder(final ListSchemaNodeBuilder b) {
77         super(b.getLine(), b.getQName());
78         instance = new ListSchemaNodeImpl(b.getQName());
79         constraints = b.getConstraints();
80         schemaPath = b.getPath();
81         description = b.getDescription();
82         reference = b.getReference();
83         status = b.getStatus();
84         augmenting = b.isAugmenting();
85         addedByUses = b.isAddedByUses();
86         configuration = b.isConfiguration();
87         keyDefinition = b.getKeyDefinition();
88         userOrdered = b.isUserOrdered();
89         childNodes = b.getChildNodes();
90         addedChildNodes.addAll(b.getChildNodeBuilders());
91         groupings = b.getGroupings();
92         addedGroupings.addAll(b.getGroupingBuilders());
93         typedefs = b.typedefs;
94         addedTypedefs.addAll(b.getTypeDefinitionBuilders());
95         usesNodes = b.usesNodes;
96         addedUsesNodes.addAll(b.getUsesNodes());
97         augmentations = b.augmentations;
98         addedAugmentations.addAll(b.getAugmentations());
99         unknownNodes = b.unknownNodes;
100         addedUnknownNodes.addAll(b.getUnknownNodes());
101     }
102
103     @Override
104     public ListSchemaNode build() {
105         if (!isBuilt) {
106             instance.setKeyDefinition(keyDefinition);
107             instance.setPath(schemaPath);
108             instance.setDescription(description);
109             instance.setReference(reference);
110             instance.setStatus(status);
111             instance.setAugmenting(augmenting);
112             instance.setAddedByUses(addedByUses);
113             instance.setConfiguration(configuration);
114             instance.setUserOrdered(userOrdered);
115
116             // CHILD NODES
117             final Map<QName, DataSchemaNode> childs = new TreeMap<QName, DataSchemaNode>(Comparators.QNAME_COMP);
118             if (childNodes == null) {
119                 for (DataSchemaNodeBuilder node : addedChildNodes) {
120                     childs.put(node.getQName(), node.build());
121                 }
122             } else {
123                 for (DataSchemaNode node : childNodes) {
124                     childs.put(node.getQName(), node);
125                 }
126             }
127             instance.setChildNodes(childs);
128
129             // TYPEDEFS
130             if (typedefs == null) {
131                 typedefs = new TreeSet<TypeDefinition<?>>(Comparators.SCHEMA_NODE_COMP);
132                 for (TypeDefinitionBuilder entry : addedTypedefs) {
133                     typedefs.add(entry.build());
134                 }
135             }
136             instance.setTypeDefinitions(typedefs);
137
138             // USES
139             if (usesNodes == null) {
140                 usesNodes = new HashSet<UsesNode>();
141                 for (UsesNodeBuilder builder : addedUsesNodes) {
142                     usesNodes.add(builder.build());
143                 }
144             }
145             instance.setUses(usesNodes);
146
147             // GROUPINGS
148             if (groupings == null) {
149                 groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);
150                 for (GroupingBuilder builder : addedGroupings) {
151                     groupings.add(builder.build());
152                 }
153             }
154             instance.setGroupings(groupings);
155
156             // AUGMENTATIONS
157             if (augmentations == null) {
158                 augmentations = new HashSet<AugmentationSchema>();
159                 for (AugmentationSchemaBuilder builder : addedAugmentations) {
160                     augmentations.add(builder.build());
161                 }
162             }
163             instance.setAvailableAugmentations(augmentations);
164
165             // UNKNOWN NODES
166             if (unknownNodes == null) {
167                 unknownNodes = new ArrayList<UnknownSchemaNode>();
168                 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
169                     unknownNodes.add(b.build());
170                 }
171                 Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
172             }
173             instance.setUnknownSchemaNodes(unknownNodes);
174
175             instance.setConstraints(constraints.build());
176             instance.setAvailableAugmentations(augmentations);
177
178             isBuilt = true;
179         }
180         return instance;
181     }
182
183     @Override
184     public void rebuild() {
185         isBuilt = false;
186         build();
187     }
188
189     @Override
190     public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
191         return addedTypedefs;
192     }
193
194     @Override
195     public void addTypedef(final TypeDefinitionBuilder type) {
196         addedTypedefs.add(type);
197     }
198
199     public void setTypedefs(final Set<TypeDefinition<?>> typedefs) {
200         this.typedefs = typedefs;
201     }
202
203     public SchemaPath getPath() {
204         return schemaPath;
205     }
206
207     @Override
208     public void setPath(final SchemaPath schemaPath) {
209         this.schemaPath = schemaPath;
210     }
211
212     public String getDescription() {
213         return description;
214     }
215
216     @Override
217     public void setDescription(final String description) {
218         this.description = description;
219     }
220
221     public String getReference() {
222         return reference;
223     }
224
225     @Override
226     public void setReference(String reference) {
227         this.reference = reference;
228     }
229
230     public Status getStatus() {
231         return status;
232     }
233
234     @Override
235     public void setStatus(Status status) {
236         if (status != null) {
237             this.status = status;
238         }
239     }
240
241     public Set<UsesNodeBuilder> getUsesNodes() {
242         return addedUsesNodes;
243     }
244
245     @Override
246     public void addUsesNode(final UsesNodeBuilder usesBuilder) {
247         addedUsesNodes.add(usesBuilder);
248     }
249
250     public void setUsesnodes(final Set<UsesNode> usesNodes) {
251         this.usesNodes = usesNodes;
252     }
253
254     public Set<AugmentationSchemaBuilder> getAugmentations() {
255         return addedAugmentations;
256     }
257
258     @Override
259     public void addAugmentation(AugmentationSchemaBuilder augment) {
260         addedAugmentations.add(augment);
261     }
262
263     public void setAugmentations(final Set<AugmentationSchema> augmentations) {
264         this.augmentations = augmentations;
265     }
266
267     public List<QName> getKeyDefinition() {
268         return keyDefinition;
269     }
270
271     public void setKeyDefinition(final List<QName> keyDefinition) {
272         if (keyDefinition != null) {
273             this.keyDefinition = keyDefinition;
274         }
275     }
276
277     public boolean isAugmenting() {
278         return augmenting;
279     }
280
281     @Override
282     public void setAugmenting(boolean augmenting) {
283         this.augmenting = augmenting;
284     }
285
286     @Override
287     public boolean isAddedByUses() {
288         return addedByUses;
289     }
290
291     @Override
292     public void setAddedByUses(final boolean addedByUses) {
293         this.addedByUses = addedByUses;
294     }
295
296     public Boolean isConfiguration() {
297         return configuration;
298     }
299
300     @Override
301     public void setConfiguration(Boolean configuration) {
302         this.configuration = configuration;
303     }
304
305     @Override
306     public ConstraintsBuilder getConstraints() {
307         return constraints;
308     }
309
310     public boolean isUserOrdered() {
311         return userOrdered;
312     }
313
314     public void setUserOrdered(final boolean userOrdered) {
315         this.userOrdered = userOrdered;
316     }
317
318     public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
319         return addedUnknownNodes;
320     }
321
322     @Override
323     public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
324         addedUnknownNodes.add(unknownNode);
325     }
326
327     public void setUnknownNodes(List<UnknownSchemaNode> unknownNodes) {
328         this.unknownNodes = unknownNodes;
329     }
330
331     @Override
332     public int hashCode() {
333         final int prime = 31;
334         int result = 1;
335         result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
336         return result;
337     }
338
339     @Override
340     public boolean equals(Object obj) {
341         if (this == obj) {
342             return true;
343         }
344         if (obj == null) {
345             return false;
346         }
347         if (getClass() != obj.getClass()) {
348             return false;
349         }
350         ListSchemaNodeBuilder other = (ListSchemaNodeBuilder) obj;
351         if (schemaPath == null) {
352             if (other.schemaPath != null) {
353                 return false;
354             }
355         } else if (!schemaPath.equals(other.schemaPath)) {
356             return false;
357         }
358         if (parent == null) {
359             if (other.parent != null) {
360                 return false;
361             }
362         } else if (!parent.equals(other.parent)) {
363             return false;
364         }
365         return true;
366     }
367
368     @Override
369     public String toString() {
370         return "list " + qname.getLocalName();
371     }
372
373     public final class ListSchemaNodeImpl implements ListSchemaNode {
374         private final QName qname;
375         private SchemaPath path;
376         private String description;
377         private String reference;
378         private Status status = Status.CURRENT;
379         private List<QName> keyDefinition = Collections.emptyList();
380         private boolean augmenting;
381         private boolean addedByUses;
382         private boolean configuration;
383         private ConstraintDefinition constraints;
384         private Set<AugmentationSchema> augmentations = Collections.emptySet();
385         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
386         private Set<TypeDefinition<?>> typeDefinitions = Collections.emptySet();
387         private Set<GroupingDefinition> groupings = Collections.emptySet();
388         private Set<UsesNode> uses = Collections.emptySet();
389         private boolean userOrdered;
390         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
391
392         private ListSchemaNodeImpl(final QName qname) {
393             this.qname = qname;
394         }
395
396         @Override
397         public QName getQName() {
398             return qname;
399         }
400
401         @Override
402         public SchemaPath getPath() {
403             return path;
404         }
405
406         private void setPath(final SchemaPath path) {
407             this.path = path;
408         }
409
410         @Override
411         public String getDescription() {
412             return description;
413         }
414
415         private void setDescription(final String description) {
416             this.description = description;
417         }
418
419         @Override
420         public String getReference() {
421             return reference;
422         }
423
424         private void setReference(final String reference) {
425             this.reference = reference;
426         }
427
428         @Override
429         public Status getStatus() {
430             return status;
431         }
432
433         private void setStatus(Status status) {
434             this.status = status;
435         }
436
437         @Override
438         public List<QName> getKeyDefinition() {
439             return keyDefinition;
440         }
441
442         private void setKeyDefinition(List<QName> keyDefinition) {
443             if (keyDefinition != null) {
444                 this.keyDefinition = keyDefinition;
445             }
446         }
447
448         @Override
449         public boolean isAugmenting() {
450             return augmenting;
451         }
452
453         private void setAugmenting(boolean augmenting) {
454             this.augmenting = augmenting;
455         }
456
457         @Override
458         public boolean isAddedByUses() {
459             return addedByUses;
460         }
461
462         private void setAddedByUses(final boolean addedByUses) {
463             this.addedByUses = addedByUses;
464         }
465
466         @Override
467         public boolean isConfiguration() {
468             return configuration;
469         }
470
471         private void setConfiguration(boolean configuration) {
472             this.configuration = configuration;
473         }
474
475         @Override
476         public ConstraintDefinition getConstraints() {
477             return constraints;
478         }
479
480         private void setConstraints(ConstraintDefinition constraints) {
481             this.constraints = constraints;
482         }
483
484         @Override
485         public Set<AugmentationSchema> getAvailableAugmentations() {
486             return augmentations;
487         }
488
489         private void setAvailableAugmentations(Set<AugmentationSchema> augmentations) {
490             if (augmentations != null) {
491                 this.augmentations = augmentations;
492             }
493         }
494
495         @Override
496         public Set<DataSchemaNode> getChildNodes() {
497             return new HashSet<DataSchemaNode>(childNodes.values());
498         }
499
500         private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {
501             if (childNodes != null) {
502                 this.childNodes = childNodes;
503             }
504         }
505
506         @Override
507         public Set<GroupingDefinition> getGroupings() {
508             return groupings;
509         }
510
511         private void setGroupings(Set<GroupingDefinition> groupings) {
512             if (groupings != null) {
513                 this.groupings = groupings;
514             }
515         }
516
517         @Override
518         public Set<TypeDefinition<?>> getTypeDefinitions() {
519             return typeDefinitions;
520         }
521
522         private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
523             if (typeDefinitions != null) {
524                 this.typeDefinitions = typeDefinitions;
525             }
526         }
527
528         @Override
529         public Set<UsesNode> getUses() {
530             return uses;
531         }
532
533         private void setUses(Set<UsesNode> uses) {
534             if (uses != null) {
535                 this.uses = uses;
536             }
537         }
538
539         @Override
540         public DataSchemaNode getDataChildByName(QName name) {
541             return childNodes.get(name);
542         }
543
544         @Override
545         public DataSchemaNode getDataChildByName(String name) {
546             DataSchemaNode result = null;
547             for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
548                 if (entry.getKey().getLocalName().equals(name)) {
549                     result = entry.getValue();
550                     break;
551                 }
552             }
553             return result;
554         }
555
556         @Override
557         public boolean isUserOrdered() {
558             return userOrdered;
559         }
560
561         private void setUserOrdered(boolean userOrdered) {
562             this.userOrdered = userOrdered;
563         }
564
565         @Override
566         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
567             return unknownNodes;
568         }
569
570         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
571             if (unknownNodes != null) {
572                 this.unknownNodes = unknownNodes;
573             }
574         }
575
576         public ListSchemaNodeBuilder toBuilder() {
577             return ListSchemaNodeBuilder.this;
578         }
579
580         @Override
581         public int hashCode() {
582             final int prime = 31;
583             int result = 1;
584             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
585             result = prime * result + ((path == null) ? 0 : path.hashCode());
586             return result;
587         }
588
589         @Override
590         public boolean equals(Object obj) {
591             if (this == obj) {
592                 return true;
593             }
594             if (obj == null) {
595                 return false;
596             }
597             if (getClass() != obj.getClass()) {
598                 return false;
599             }
600             final ListSchemaNodeImpl other = (ListSchemaNodeImpl) obj;
601             if (qname == null) {
602                 if (other.qname != null) {
603                     return false;
604                 }
605             } else if (!qname.equals(other.qname)) {
606                 return false;
607             }
608             if (path == null) {
609                 if (other.path != null) {
610                     return false;
611                 }
612             } else if (!path.equals(other.path)) {
613                 return false;
614             }
615             return true;
616         }
617
618         @Override
619         public String toString() {
620             StringBuilder sb = new StringBuilder(ListSchemaNodeImpl.class.getSimpleName());
621             sb.append("[");
622             sb.append("qname=" + qname);
623             sb.append(", path=" + path);
624             sb.append(", keyDefinition=" + keyDefinition);
625             sb.append("]");
626             return sb.toString();
627         }
628     }
629
630 }