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