Added YANG typedef support in the YANG parser
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / main / java / org / opendaylight / controller / yang / model / 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.model.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.model.parser.builder.api.AbstractChildNodeBuilder;
30 import org.opendaylight.controller.yang.model.parser.builder.api.AugmentationTargetBuilder;
31 import org.opendaylight.controller.yang.model.parser.builder.api.DataSchemaNodeBuilder;
32 import org.opendaylight.controller.yang.model.parser.builder.api.GroupingBuilder;
33 import org.opendaylight.controller.yang.model.parser.builder.api.SchemaNodeBuilder;
34 import org.opendaylight.controller.yang.model.parser.builder.api.TypeDefinitionAwareBuilder;
35 import org.opendaylight.controller.yang.model.parser.builder.api.TypeDefinitionBuilder;
36 import org.opendaylight.controller.yang.model.parser.builder.api.UsesNodeBuilder;
37
38 public class ListSchemaNodeBuilder extends AbstractChildNodeBuilder implements
39         DataSchemaNodeBuilder, SchemaNodeBuilder, AugmentationTargetBuilder,
40         TypeDefinitionAwareBuilder {
41
42     private final ListSchemaNodeImpl instance;
43     private final ConstraintsBuilder constraintsBuilder;
44
45     private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
46     private final Set<AugmentationSchema> augmentations = new HashSet<AugmentationSchema>();
47     private final Set<UsesNodeBuilder> usesNodes = new HashSet<UsesNodeBuilder>();
48     private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
49
50     ListSchemaNodeBuilder(QName qname) {
51         super(qname);
52         instance = new ListSchemaNodeImpl(qname);
53         constraintsBuilder = new ConstraintsBuilder();
54     }
55
56     @Override
57     public ListSchemaNode build() {
58         // CHILD NODES
59         Map<QName, DataSchemaNode> childs = new HashMap<QName, DataSchemaNode>();
60         for (DataSchemaNodeBuilder node : childNodes) {
61             childs.put(node.getQName(), node.build());
62         }
63         instance.setChildNodes(childs);
64
65         // TYPEDEFS
66         Set<TypeDefinition<?>> typedefs = new HashSet<TypeDefinition<?>>();
67         for (TypeDefinitionBuilder entry : addedTypedefs) {
68             typedefs.add(entry.build());
69         }
70         instance.setTypeDefinitions(typedefs);
71
72         // USES
73         Set<UsesNode> usesNodeDefinitions = new HashSet<UsesNode>();
74         for (UsesNodeBuilder builder : usesNodes) {
75             usesNodeDefinitions.add(builder.build());
76         }
77         instance.setUses(usesNodeDefinitions);
78
79         // GROUPINGS
80         Set<GroupingDefinition> groupingDefinitions = new HashSet<GroupingDefinition>();
81         for (GroupingBuilder builder : groupings) {
82             groupingDefinitions.add(builder.build());
83         }
84         instance.setGroupings(groupingDefinitions);
85
86         // UNKNOWN NODES
87         final List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
88         for(UnknownSchemaNodeBuilder b : addedUnknownNodes) {
89             unknownNodes.add(b.build());
90         }
91         instance.setUnknownSchemaNodes(unknownNodes);
92
93         instance.setConstraints(constraintsBuilder.build());
94         instance.setAvailableAugmentations(augmentations);
95
96         return instance;
97     }
98
99     @Override
100     public void addTypedef(TypeDefinitionBuilder type) {
101         addedTypedefs.add(type);
102     }
103
104     @Override
105     public void setPath(SchemaPath path) {
106         instance.setPath(path);
107     }
108
109     @Override
110     public void setDescription(String description) {
111         instance.setDescription(description);
112     }
113
114     @Override
115     public void setReference(String reference) {
116         instance.setReference(reference);
117     }
118
119     @Override
120     public void setStatus(Status status) {
121         if(status != null) {
122             instance.setStatus(status);
123         }
124     }
125
126     @Override
127     public void addUsesNode(UsesNodeBuilder usesBuilder) {
128         usesNodes.add(usesBuilder);
129     }
130
131     @Override
132     public void addAugmentation(AugmentationSchema augmentationSchema) {
133         augmentations.add(augmentationSchema);
134     }
135
136     public void setKeyDefinition(List<QName> keyDefinition) {
137         instance.setKeyDefinition(keyDefinition);
138     }
139
140     @Override
141     public void setAugmenting(boolean augmenting) {
142         instance.setAugmenting(augmenting);
143     }
144
145     @Override
146     public void setConfiguration(boolean configuration) {
147         instance.setConfiguration(configuration);
148     }
149
150     @Override
151     public ConstraintsBuilder getConstraintsBuilder() {
152         return constraintsBuilder;
153     }
154
155     public void setUserOrdered(boolean userOrdered) {
156         instance.setUserOrdered(userOrdered);
157     }
158
159     @Override
160     public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownSchemaNodeBuilder) {
161         addedUnknownNodes.add(unknownSchemaNodeBuilder);
162     }
163
164     private class ListSchemaNodeImpl implements ListSchemaNode {
165         private final QName qname;
166         private SchemaPath path;
167         private String description;
168         private String reference;
169         private Status status = Status.CURRENT;
170         private List<QName> keyDefinition = Collections.emptyList();
171         private boolean augmenting;
172         private boolean configuration;
173         private ConstraintDefinition constraints;
174         private Set<AugmentationSchema> augmentations = Collections.emptySet();
175         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
176         private Set<TypeDefinition<?>> typeDefinitions = Collections.emptySet();
177         private Set<GroupingDefinition> groupings = Collections.emptySet();
178         private Set<UsesNode> uses = Collections.emptySet();
179         private boolean userOrdered;
180         private List<UnknownSchemaNode> unknownSchemaNodes = Collections.emptyList();
181
182         private ListSchemaNodeImpl(QName qname) {
183             this.qname = qname;
184         }
185
186         @Override
187         public QName getQName() {
188             return qname;
189         }
190
191         @Override
192         public SchemaPath getPath() {
193             return path;
194         }
195
196         private void setPath(SchemaPath path) {
197             this.path = path;
198         }
199
200         @Override
201         public String getDescription() {
202             return description;
203         }
204
205         private void setDescription(String description) {
206             this.description = description;
207         }
208
209         @Override
210         public String getReference() {
211             return reference;
212         }
213
214         private void setReference(String reference) {
215             this.reference = reference;
216         }
217
218         @Override
219         public Status getStatus() {
220             return status;
221         }
222
223         private void setStatus(Status status) {
224             this.status = status;
225         }
226
227         @Override
228         public List<QName> getKeyDefinition() {
229             if(keyDefinition == null) {
230                 return Collections.emptyList();
231             } else {
232                 return keyDefinition;
233             }
234         }
235
236         private void setKeyDefinition(List<QName> keyDefinition) {
237             if(keyDefinition != null) {
238                 this.keyDefinition = keyDefinition;
239             }
240         }
241
242         @Override
243         public boolean isAugmenting() {
244             return augmenting;
245         }
246
247         private void setAugmenting(boolean augmenting) {
248             this.augmenting = augmenting;
249         }
250
251         @Override
252         public boolean isConfiguration() {
253             return configuration;
254         }
255
256         private void setConfiguration(boolean configuration) {
257             this.configuration = configuration;
258         }
259
260         @Override
261         public ConstraintDefinition getConstraints() {
262             return constraints;
263         }
264
265         private void setConstraints(ConstraintDefinition constraints) {
266             this.constraints = constraints;
267         }
268
269         @Override
270         public Set<AugmentationSchema> getAvailableAugmentations() {
271             return augmentations;
272         }
273
274         private void setAvailableAugmentations(
275                 Set<AugmentationSchema> augmentations) {
276             if(augmentations != null) {
277                 this.augmentations = augmentations;
278             }
279         }
280
281         @Override
282         public Set<DataSchemaNode> getChildNodes() {
283             return new HashSet<DataSchemaNode>(childNodes.values());
284         }
285
286         private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {
287             if(childNodes != null) {
288                 this.childNodes = childNodes;
289             }
290         }
291
292         @Override
293         public Set<GroupingDefinition> getGroupings() {
294             return groupings;
295         }
296
297         private void setGroupings(Set<GroupingDefinition> groupings) {
298             if(groupings != null) {
299                 this.groupings = groupings;
300             }
301         }
302
303         @Override
304         public Set<TypeDefinition<?>> getTypeDefinitions() {
305             return typeDefinitions;
306         }
307
308         private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
309             if(typeDefinitions != null) {
310                 this.typeDefinitions = typeDefinitions;
311             }
312         }
313
314         @Override
315         public Set<UsesNode> getUses() {
316             return uses;
317         }
318
319         private void setUses(Set<UsesNode> uses) {
320             if(uses != null) {
321                 this.uses = uses;
322             }
323         }
324
325         @Override
326         public DataSchemaNode getDataChildByName(QName name) {
327             return childNodes.get(name);
328         }
329
330         @Override
331         public DataSchemaNode getDataChildByName(String name) {
332             DataSchemaNode result = null;
333             for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
334                 if (entry.getKey().getLocalName().equals(name)) {
335                     result = entry.getValue();
336                     break;
337                 }
338             }
339             return result;
340         }
341
342         @Override
343         public boolean isUserOrdered() {
344             return userOrdered;
345         }
346
347         private void setUserOrdered(boolean userOrdered) {
348             this.userOrdered = userOrdered;
349         }
350
351         @Override
352         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
353             return unknownSchemaNodes;
354         }
355
356         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
357             if(unknownSchemaNodes != null) {
358                 this.unknownSchemaNodes = unknownSchemaNodes;
359             }
360         }
361
362         @Override
363         public int hashCode() {
364             final int prime = 31;
365             int result = 1;
366             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
367             result = prime * result + ((path == null) ? 0 : path.hashCode());
368             return result;
369         }
370
371         @Override
372         public boolean equals(Object obj) {
373             if (this == obj) {
374                 return true;
375             }
376             if (obj == null) {
377                 return false;
378             }
379             if (getClass() != obj.getClass()) {
380                 return false;
381             }
382             ListSchemaNodeImpl other = (ListSchemaNodeImpl) obj;
383             if (qname == null) {
384                 if (other.qname != null) {
385                     return false;
386                 }
387             } else if (!qname.equals(other.qname)) {
388                 return false;
389             }
390             if (path == null) {
391                 if (other.path != null) {
392                     return false;
393                 }
394             } else if (!path.equals(other.path)) {
395                 return false;
396             }
397             return true;
398         }
399
400         @Override
401         public String toString() {
402             StringBuilder sb = new StringBuilder(
403                     ListSchemaNodeImpl.class.getSimpleName());
404             sb.append("[");
405             sb.append("qname=" + qname);
406             sb.append(", path=" + path);
407             sb.append(", description=" + description);
408             sb.append(", reference=" + reference);
409             sb.append(", status=" + status);
410             sb.append(", keyDefinition=" + keyDefinition);
411             sb.append(", augmenting=" + augmenting);
412             sb.append(", configuration=" + configuration);
413             sb.append(", constraints=" + constraints);
414             sb.append(", augmentations=" + augmentations);
415             sb.append(", childNodes=" + childNodes.values());
416             sb.append(", typedefinitions=" + typeDefinitions);
417             sb.append(", groupings=" + groupings);
418             sb.append(", uses=" + uses);
419             sb.append(", userOrdered=" + userOrdered);
420             sb.append("]");
421             return sb.toString();
422         }
423     }
424
425 }