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