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