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