Merge "Renamed getLength() method to length() in classes generated from typedefs."
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / 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.yangtools.yang.parser.builder.impl;
9
10 import java.net.URI;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.Date;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Set;
17 import java.util.TreeSet;
18
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.model.api.*;
21 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
22 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
23 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
28 import org.opendaylight.yangtools.yang.parser.util.Comparators;
29 import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
30 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
31
32 public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerBuilder implements
33         AugmentationTargetBuilder, DataSchemaNodeBuilder {
34     private boolean isBuilt;
35     private final ContainerSchemaNodeImpl instance;
36
37     private final SchemaPath path;
38     // DataSchemaNode args
39     private Boolean configuration;
40     private final ConstraintsBuilder constraints;
41     // AugmentationTarget args
42     private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
43
44     public ContainerSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
45         super(moduleName, line, qname);
46         this.path = path;
47         this.instance = new ContainerSchemaNodeImpl(qname, path);
48         this.constraints = new ConstraintsBuilder(moduleName, line);
49     }
50
51     // constructor for uses
52     public ContainerSchemaNodeBuilder(final String moduleName, final int line, final QName qname,
53             final SchemaPath path, final ContainerSchemaNode base) {
54         super(moduleName, line, qname);
55         this.path = path;
56         instance = new ContainerSchemaNodeImpl(qname, path);
57         constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
58
59         instance.description = base.getDescription();
60         instance.reference = base.getReference();
61         instance.status = base.getStatus();
62         instance.augmenting = base.isAugmenting();
63         instance.addedByUses = base.isAddedByUses();
64         instance.configuration = base.isConfiguration();
65         instance.constraints = base.getConstraints();
66         instance.augmentations.addAll(base.getAvailableAugmentations());
67
68         URI ns = qname.getNamespace();
69         Date rev = qname.getRevision();
70         String pref = qname.getPrefix();
71         addedChildNodes.addAll(ParserUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref));
72         addedGroupings.addAll(ParserUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref));
73         addedTypedefs.addAll(ParserUtils.wrapTypedefs(moduleName, line, base, path, ns, rev, pref));
74         addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
75                 rev, pref));
76
77         instance.uses.addAll(base.getUses());
78         instance.presence = base.isPresenceContainer();
79         instance.configuration = base.isConfiguration();
80         this.configuration = base.isConfiguration();
81     }
82
83     @Override
84     public ContainerSchemaNode build() {
85         if (!isBuilt) {
86
87             // if this builder represents rpc input or output, it can has
88             // configuration value set to null
89             if (configuration == null) {
90                 configuration = false;
91             }
92             instance.setConfiguration(configuration);
93
94             // USES
95             for (UsesNodeBuilder builder : addedUsesNodes) {
96                 usesNodes.add(builder.build());
97             }
98             instance.addUses(usesNodes);
99
100             // CHILD NODES
101             for (DataSchemaNodeBuilder node : addedChildNodes) {
102                 childNodes.add(node.build());
103             }
104             instance.addChildNodes(childNodes);
105
106             // GROUPINGS
107             for (GroupingBuilder builder : addedGroupings) {
108                 groupings.add(builder.build());
109             }
110             instance.addGroupings(groupings);
111
112             // TYPEDEFS
113             for (TypeDefinitionBuilder entry : addedTypedefs) {
114                 typedefs.add(entry.build());
115             }
116             instance.addTypeDefinitions(typedefs);
117
118             // AUGMENTATIONS
119             final List<AugmentationSchema> augmentations = new ArrayList<>();
120             for (AugmentationSchemaBuilder builder : augmentationBuilders) {
121                 augmentations.add(builder.build());
122             }
123             instance.addAvailableAugmentations(new HashSet<>(augmentations));
124
125             // UNKNOWN NODES
126             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
127                 unknownNodes.add(b.build());
128             }
129             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
130             instance.addUnknownSchemaNodes(unknownNodes);
131
132             if (constraints != null) {
133                 instance.setConstraints(constraints.build());
134             }
135
136             isBuilt = true;
137         }
138         return instance;
139     }
140
141     @Override
142     public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
143         return addedTypedefs;
144     }
145
146     @Override
147     public void addTypedef(final TypeDefinitionBuilder type) {
148         String typeName = type.getQName().getLocalName();
149         for (TypeDefinitionBuilder addedTypedef : addedTypedefs) {
150             if (addedTypedef.getQName().getLocalName().equals(typeName)) {
151                 throw new YangParseException(moduleName, type.getLine(), "Can not add typedef '" + typeName
152                         + "': typedef with same name already declared at line " + addedTypedef.getLine());
153             }
154         }
155         addedTypedefs.add(type);
156     }
157
158     public List<AugmentationSchemaBuilder> getAugmentationBuilders() {
159         return augmentationBuilders;
160     }
161
162     @Override
163     public void addAugmentation(AugmentationSchemaBuilder augment) {
164         augmentationBuilders.add(augment);
165     }
166
167     @Override
168     public SchemaPath getPath() {
169         return instance.path;
170     }
171
172     @Override
173     public void setPath(SchemaPath path) {
174         instance.path = path;
175     }
176
177     @Override
178     public String getDescription() {
179         return instance.description;
180     }
181
182     @Override
183     public void setDescription(final String description) {
184         instance.description = description;
185     }
186
187     @Override
188     public String getReference() {
189         return instance.reference;
190     }
191
192     @Override
193     public void setReference(final String reference) {
194         instance.reference = reference;
195     }
196
197     @Override
198     public Status getStatus() {
199         return instance.status;
200     }
201
202     @Override
203     public void setStatus(Status status) {
204         if (status != null) {
205             instance.status = status;
206         }
207     }
208
209     @Override
210     public boolean isAugmenting() {
211         return instance.augmenting;
212     }
213
214     @Override
215     public void setAugmenting(boolean augmenting) {
216         instance.augmenting = augmenting;
217     }
218
219     @Override
220     public boolean isAddedByUses() {
221         return instance.addedByUses;
222     }
223
224     @Override
225     public void setAddedByUses(final boolean addedByUses) {
226         instance.addedByUses = addedByUses;
227     }
228
229     @Override
230     public Boolean isConfiguration() {
231         return instance.configuration;
232     }
233
234     @Override
235     public void setConfiguration(Boolean configuration) {
236         instance.configuration = configuration;
237     }
238
239     @Override
240     public ConstraintsBuilder getConstraints() {
241         return constraints;
242     }
243
244     public boolean isPresence() {
245         return instance.presence;
246     }
247
248     public void setPresence(boolean presence) {
249         instance.presence = presence;
250     }
251
252     @Override
253     public int hashCode() {
254         final int prime = 31;
255         int result = 1;
256         result = prime * result + ((path == null) ? 0 : path.hashCode());
257         return result;
258     }
259
260     @Override
261     public boolean equals(Object obj) {
262         if (this == obj) {
263             return true;
264         }
265         if (obj == null) {
266             return false;
267         }
268         if (getClass() != obj.getClass()) {
269             return false;
270         }
271         ContainerSchemaNodeBuilder other = (ContainerSchemaNodeBuilder) obj;
272         if (path == null) {
273             if (other.path != null) {
274                 return false;
275             }
276         } else if (!path.equals(other.path)) {
277             return false;
278         }
279         if (parentBuilder == null) {
280             if (other.parentBuilder != null) {
281                 return false;
282             }
283         } else if (!parentBuilder.equals(other.parentBuilder)) {
284             return false;
285         }
286         return true;
287     }
288
289     @Override
290     public String toString() {
291         return "container " + qname.getLocalName();
292     }
293
294     private static final class ContainerSchemaNodeImpl implements ContainerSchemaNode {
295         private final QName qname;
296         private SchemaPath path;
297         private String description;
298         private String reference;
299         private Status status = Status.CURRENT;
300         private boolean augmenting;
301         private boolean addedByUses;
302         private boolean configuration;
303         private ConstraintDefinition constraints;
304         private final Set<AugmentationSchema> augmentations = new HashSet<>();
305         private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
306         private final Set<GroupingDefinition> groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
307         private final Set<TypeDefinition<?>> typeDefinitions = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
308         private final Set<UsesNode> uses = new HashSet<>();
309         private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
310         private boolean presence;
311
312         private ContainerSchemaNodeImpl(QName qname, SchemaPath path) {
313             this.qname = qname;
314             this.path = path;
315         }
316
317         @Override
318         public QName getQName() {
319             return qname;
320         }
321
322         @Override
323         public SchemaPath getPath() {
324             return path;
325         }
326
327         @Override
328         public String getDescription() {
329             return description;
330         }
331
332         @Override
333         public String getReference() {
334             return reference;
335         }
336
337         @Override
338         public Status getStatus() {
339             return status;
340         }
341
342         @Override
343         public boolean isAugmenting() {
344             return augmenting;
345         }
346
347         @Override
348         public boolean isAddedByUses() {
349             return addedByUses;
350         }
351
352         @Override
353         public boolean isConfiguration() {
354             return configuration;
355         }
356
357         private void setConfiguration(boolean configuration) {
358             this.configuration = configuration;
359         }
360
361         @Override
362         public ConstraintDefinition getConstraints() {
363             return constraints;
364         }
365
366         private void setConstraints(ConstraintDefinition constraints) {
367             this.constraints = constraints;
368         }
369
370         @Override
371         public Set<AugmentationSchema> getAvailableAugmentations() {
372             return Collections.unmodifiableSet(augmentations);
373         }
374
375         private void addAvailableAugmentations(Set<AugmentationSchema> augmentations) {
376             if (augmentations != null) {
377                 this.augmentations.addAll(augmentations);
378             }
379         }
380
381         @Override
382         public Set<DataSchemaNode> getChildNodes() {
383             return Collections.unmodifiableSet(childNodes);
384         }
385
386         private void addChildNodes(Set<DataSchemaNode> childNodes) {
387             if (childNodes != null) {
388                 this.childNodes.addAll(childNodes);
389             }
390         }
391
392         @Override
393         public Set<GroupingDefinition> getGroupings() {
394             return Collections.unmodifiableSet(groupings);
395         }
396
397         private void addGroupings(Set<GroupingDefinition> groupings) {
398             if (groupings != null) {
399                 this.groupings.addAll(groupings);
400             }
401         }
402
403         @Override
404         public DataSchemaNode getDataChildByName(QName name) {
405             return getChildNode(childNodes, name);
406         }
407
408         @Override
409         public DataSchemaNode getDataChildByName(String name) {
410             return getChildNode(childNodes, name);
411         }
412
413         @Override
414         public Set<UsesNode> getUses() {
415             return Collections.unmodifiableSet(uses);
416         }
417
418         private void addUses(Set<UsesNode> uses) {
419             if (uses != null) {
420                 this.uses.addAll(uses);
421             }
422         }
423
424         @Override
425         public boolean isPresenceContainer() {
426             return presence;
427         }
428
429         @Override
430         public Set<TypeDefinition<?>> getTypeDefinitions() {
431             return Collections.unmodifiableSet(typeDefinitions);
432         }
433
434         private void addTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
435             if (typeDefinitions != null) {
436                 this.typeDefinitions.addAll(typeDefinitions);
437             }
438         }
439
440         @Override
441         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
442             return Collections.unmodifiableList(unknownNodes);
443         }
444
445         private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
446             if (unknownSchemaNodes != null) {
447                 this.unknownNodes.addAll(unknownSchemaNodes);
448             }
449         }
450
451         @Override
452         public int hashCode() {
453             final int prime = 31;
454             int result = 1;
455             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
456             result = prime * result + ((path == null) ? 0 : path.hashCode());
457             return result;
458         }
459
460         @Override
461         public boolean equals(Object obj) {
462             if (this == obj) {
463                 return true;
464             }
465             if (obj == null) {
466                 return false;
467             }
468             if (getClass() != obj.getClass()) {
469                 return false;
470             }
471             ContainerSchemaNodeImpl other = (ContainerSchemaNodeImpl) obj;
472             if (qname == null) {
473                 if (other.qname != null) {
474                     return false;
475                 }
476             } else if (!qname.equals(other.qname)) {
477                 return false;
478             }
479             if (path == null) {
480                 if (other.path != null) {
481                     return false;
482                 }
483             } else if (!path.equals(other.path)) {
484                 return false;
485             }
486             return true;
487         }
488
489         @Override
490         public String toString() {
491             return "container " + qname.getLocalName();
492         }
493     }
494
495 }