Fixed bug in augment parsing.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / UsesNodeBuilderImpl.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.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.yangtools.yang.model.api.AugmentationSchema;
19 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
20 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
22 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.UsesNode;
24 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
29 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
33 import org.opendaylight.yangtools.yang.parser.util.RefineHolder;
34 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
35
36 public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNodeBuilder {
37     private boolean isBuilt;
38     private UsesNodeImpl instance;
39     private DataNodeContainerBuilder parent;
40     private final String groupingName;
41     private SchemaPath groupingPath;
42     private GroupingDefinition groupingDefinition;
43     private GroupingBuilder groupingBuilder;
44     private boolean addedByUses;
45     private boolean augmenting;
46     private AugmentationSchemaBuilder parentAugment;
47     private final Set<AugmentationSchemaBuilder> addedAugments = new HashSet<>();
48     private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<>();
49     private final List<RefineHolder> refines = new ArrayList<>();
50
51     /**
52      * Copies of target grouping child nodes.
53      */
54     private final Set<DataSchemaNodeBuilder> targetChildren = new HashSet<>();
55
56     /**
57      * Copies of target grouping groupings.
58      */
59     private final Set<GroupingBuilder> targetGroupings = new HashSet<>();
60
61     /**
62      * Copies of target grouping typedefs.
63      */
64     private final Set<TypeDefinitionBuilder> targetTypedefs = new HashSet<>();
65
66     /**
67      * Copies of target grouping unknown nodes.
68      */
69     private final List<UnknownSchemaNodeBuilder> targetUnknownNodes = new ArrayList<>();
70
71     private final boolean isCopy;
72     private boolean dataCollected;
73
74     @Override
75     public boolean isCopy() {
76         return isCopy;
77     }
78
79     @Override
80     public boolean isDataCollected() {
81         return dataCollected;
82     }
83
84     @Override
85     public void setDataCollected(boolean dataCollected) {
86         this.dataCollected = dataCollected;
87     }
88
89     public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) {
90         super(moduleName, line);
91         this.groupingName = groupingName;
92         isCopy = false;
93     }
94
95     public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName, final boolean isCopy) {
96         super(moduleName, line);
97         this.groupingName = groupingName;
98         this.isCopy = isCopy;
99     }
100
101     @Override
102     public UsesNode build() {
103         if (!isBuilt) {
104             instance = new UsesNodeImpl(groupingPath);
105             instance.setAddedByUses(addedByUses);
106
107             // AUGMENTATIONS
108             final Set<AugmentationSchema> augments = new HashSet<>();
109             for (AugmentationSchemaBuilder builder : addedAugments) {
110                 augments.add(builder.build());
111             }
112             instance.setAugmentations(augments);
113
114             // REFINES
115             final Map<SchemaPath, SchemaNode> refineNodes = new HashMap<>();
116             for (SchemaNodeBuilder refineBuilder : refineBuilders) {
117                 SchemaNode refineNode = refineBuilder.build();
118                 refineNodes.put(refineNode.getPath(), refineNode);
119             }
120             instance.setRefines(refineNodes);
121
122             // UNKNOWN NODES
123             List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
124             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
125                 unknownNodes.add(b.build());
126             }
127             instance.setUnknownSchemaNodes(unknownNodes);
128
129             isBuilt = true;
130         }
131
132         return instance;
133     }
134
135     @Override
136     public DataNodeContainerBuilder getParent() {
137         return parent;
138     }
139
140     @Override
141     public void setParent(Builder parent) {
142         if (!(parent instanceof DataNodeContainerBuilder)) {
143             throw new YangParseException(moduleName, line,
144                     "Parent of 'uses' has to be instance of DataNodeContainerBuilder, but was: '" + parent + "'.");
145         }
146         this.parent = (DataNodeContainerBuilder) parent;
147     }
148
149     @Override
150     public SchemaPath getGroupingPath() {
151         return groupingPath;
152     }
153
154     @Override
155     public GroupingDefinition getGroupingDefinition() {
156         return groupingDefinition;
157     }
158
159     @Override
160     public void setGroupingDefinition(GroupingDefinition groupingDefinition) {
161         this.groupingDefinition = groupingDefinition;
162         if (groupingDefinition != null) {
163             this.groupingPath = groupingDefinition.getPath();
164         }
165     }
166
167     @Override
168     public GroupingBuilder getGroupingBuilder() {
169         return groupingBuilder;
170     }
171
172     @Override
173     public void setGrouping(GroupingBuilder grouping) {
174         this.groupingBuilder = grouping;
175         if (groupingBuilder != null) {
176             this.groupingPath = groupingBuilder.getPath();
177         }
178     }
179
180     @Override
181     public String getGroupingPathAsString() {
182         return groupingName;
183     }
184
185     @Override
186     public Set<AugmentationSchemaBuilder> getAugmentations() {
187         return addedAugments;
188     }
189
190     @Override
191     public void addAugment(final AugmentationSchemaBuilder augmentBuilder) {
192         addedAugments.add(augmentBuilder);
193     }
194
195     @Override
196     public boolean isAddedByUses() {
197         return addedByUses;
198     }
199
200     @Override
201     public void setAddedByUses(final boolean addedByUses) {
202         this.addedByUses = addedByUses;
203     }
204
205     @Override
206     public boolean isAugmenting() {
207         return augmenting;
208     }
209
210     @Override
211     public void setAugmenting(boolean augmenting) {
212         this.augmenting = augmenting;
213     }
214
215     @Override
216     public AugmentationSchemaBuilder getParentAugment() {
217         return parentAugment;
218     }
219
220     @Override
221     public void setParentAugment(AugmentationSchemaBuilder augment) {
222         this.parentAugment = augment;
223     }
224
225     @Override
226     public List<SchemaNodeBuilder> getRefineNodes() {
227         return refineBuilders;
228     }
229
230     @Override
231     public void addRefineNode(DataSchemaNodeBuilder refineNode) {
232         refineBuilders.add(refineNode);
233     }
234
235     @Override
236     public List<RefineHolder> getRefines() {
237         return refines;
238     }
239
240     @Override
241     public void addRefine(RefineHolder refine) {
242         refines.add(refine);
243     }
244
245     @Override
246     public Set<DataSchemaNodeBuilder> getTargetChildren() {
247         return targetChildren;
248     }
249
250     @Override
251     public Set<GroupingBuilder> getTargetGroupings() {
252         return targetGroupings;
253     }
254
255     @Override
256     public Set<TypeDefinitionBuilder> getTargetTypedefs() {
257         return targetTypedefs;
258     }
259
260     @Override
261     public List<UnknownSchemaNodeBuilder> getTargetUnknownNodes() {
262         return targetUnknownNodes;
263     }
264
265     @Override
266     public int hashCode() {
267         final int prime = 31;
268         int result = 1;
269         result = prime * result + ((groupingName == null) ? 0 : groupingName.hashCode());
270         result = prime * result + ((parent == null) ? 0 : parent.hashCode());
271         return result;
272     }
273
274     @Override
275     public boolean equals(Object obj) {
276         if (this == obj) {
277             return true;
278         }
279         if (obj == null) {
280             return false;
281         }
282         if (getClass() != obj.getClass()) {
283             return false;
284         }
285         UsesNodeBuilderImpl other = (UsesNodeBuilderImpl) obj;
286         if (groupingName == null) {
287             if (other.groupingName != null) {
288                 return false;
289             }
290         } else if (!groupingName.equals(other.groupingName)) {
291             return false;
292         }
293         if (parent == null) {
294             if (other.parent != null) {
295                 return false;
296             }
297         } else if (!parent.equals(other.parent)) {
298             return false;
299         }
300         return true;
301     }
302
303     @Override
304     public String toString() {
305         return "uses '" + groupingName + "'";
306     }
307
308     public final class UsesNodeImpl implements UsesNode {
309         private final SchemaPath groupingPath;
310         private Set<AugmentationSchema> augmentations = Collections.emptySet();
311         private boolean addedByUses;
312         private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();
313         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
314
315         private UsesNodeImpl(final SchemaPath groupingPath) {
316             this.groupingPath = groupingPath;
317         }
318
319         @Override
320         public SchemaPath getGroupingPath() {
321             return groupingPath;
322         }
323
324         @Override
325         public Set<AugmentationSchema> getAugmentations() {
326             return augmentations;
327         }
328
329         private void setAugmentations(final Set<AugmentationSchema> augmentations) {
330             if (augmentations != null) {
331                 this.augmentations = augmentations;
332             }
333         }
334
335         @Override
336         public boolean isAugmenting() {
337             return false;
338         }
339
340         @Override
341         public boolean isAddedByUses() {
342             return addedByUses;
343         }
344
345         private void setAddedByUses(final boolean addedByUses) {
346             this.addedByUses = addedByUses;
347         }
348
349         @Override
350         public Map<SchemaPath, SchemaNode> getRefines() {
351             return refines;
352         }
353
354         private void setRefines(Map<SchemaPath, SchemaNode> refines) {
355             if (refines != null) {
356                 this.refines = refines;
357             }
358         }
359
360         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
361             return unknownNodes;
362         }
363
364         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
365             if (unknownSchemaNodes != null) {
366                 this.unknownNodes = unknownSchemaNodes;
367             }
368         }
369
370         public UsesNodeBuilder toBuilder() {
371             return UsesNodeBuilderImpl.this;
372         }
373
374         @Override
375         public int hashCode() {
376             final int prime = 31;
377             int result = 1;
378             result = prime * result + ((groupingPath == null) ? 0 : groupingPath.hashCode());
379             result = prime * result + ((augmentations == null) ? 0 : augmentations.hashCode());
380             return result;
381         }
382
383         @Override
384         public boolean equals(Object obj) {
385             if (this == obj) {
386                 return true;
387             }
388             if (obj == null) {
389                 return false;
390             }
391             if (getClass() != obj.getClass()) {
392                 return false;
393             }
394             final UsesNodeImpl other = (UsesNodeImpl) obj;
395             if (groupingPath == null) {
396                 if (other.groupingPath != null) {
397                     return false;
398                 }
399             } else if (!groupingPath.equals(other.groupingPath)) {
400                 return false;
401             }
402             if (augmentations == null) {
403                 if (other.augmentations != null) {
404                     return false;
405                 }
406             } else if (!augmentations.equals(other.augmentations)) {
407                 return false;
408             }
409             return true;
410         }
411
412         @Override
413         public String toString() {
414             StringBuilder sb = new StringBuilder(UsesNodeImpl.class.getSimpleName());
415             sb.append("[groupingPath=");
416             sb.append(groupingPath);
417             sb.append("]");
418             return sb.toString();
419         }
420     }
421
422 }