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