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