Fixed path correction process of nodes defined by uses statement.
[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 \r
60     @Override\r
61     public boolean isCopy() {\r
62         return isCopy;\r
63     }\r
64 \r
65     @Override\r
66     public boolean isDataCollected() {\r
67         return dataCollected;\r
68     }\r
69 \r
70     @Override\r
71     public void setDataCollected(boolean dataCollected) {\r
72         this.dataCollected = dataCollected;\r
73     }\r
74 \r
75     @Override\r
76     public boolean isParentUpdated() {\r
77         return parentUpdated;\r
78     }\r
79 \r
80     @Override\r
81     public void setParentUpdated(boolean parentUpdated) {\r
82         this.parentUpdated = parentUpdated;\r
83     }\r
84 \r
85     public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) {\r
86         super(moduleName, line);\r
87         this.groupingName = groupingName;\r
88         isCopy = false;\r
89     }\r
90 \r
91     public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName, final boolean isCopy) {\r
92         super(moduleName, line);\r
93         this.groupingName = groupingName;\r
94         this.isCopy = isCopy;\r
95     }\r
96 \r
97     @Override\r
98     public UsesNode build() {\r
99         if (!isBuilt) {\r
100             instance = new UsesNodeImpl(groupingPath);\r
101             instance.setAugmenting(augmenting);\r
102             instance.setAddedByUses(addedByUses);\r
103 \r
104             // AUGMENTATIONS\r
105             final Set<AugmentationSchema> augments = new HashSet<AugmentationSchema>();\r
106             for (AugmentationSchemaBuilder builder : addedAugments) {\r
107                 augments.add(builder.build());\r
108             }\r
109             instance.setAugmentations(augments);\r
110 \r
111             // REFINES\r
112             final Map<SchemaPath, SchemaNode> refineNodes = new HashMap<SchemaPath, SchemaNode>();\r
113             for (SchemaNodeBuilder refineBuilder : refineBuilders) {\r
114                 SchemaNode refineNode = refineBuilder.build();\r
115                 refineNodes.put(refineNode.getPath(), refineNode);\r
116             }\r
117             instance.setRefines(refineNodes);\r
118 \r
119             // UNKNOWN NODES\r
120             List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();\r
121             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {\r
122                 unknownNodes.add(b.build());\r
123             }\r
124             instance.setUnknownSchemaNodes(unknownNodes);\r
125 \r
126             isBuilt = true;\r
127         }\r
128 \r
129         return instance;\r
130     }\r
131 \r
132     @Override\r
133     public DataNodeContainerBuilder getParent() {\r
134         return parent;\r
135     }\r
136 \r
137     @Override\r
138     public void setParent(Builder parent) {\r
139         if (!(parent instanceof DataNodeContainerBuilder)) {\r
140             throw new YangParseException(moduleName, line, "Unresolved parent of uses '" + groupingName + "'.");\r
141         }\r
142         this.parent = (DataNodeContainerBuilder) parent;\r
143     }\r
144 \r
145     @Override\r
146     public SchemaPath getGroupingPath() {\r
147         return groupingPath;\r
148     }\r
149 \r
150     @Override\r
151     public void setGroupingPath(SchemaPath groupingPath) {\r
152         this.groupingPath = groupingPath;\r
153     }\r
154 \r
155     @Override\r
156     public GroupingDefinition getGroupingDefinition() {\r
157         return groupingDefinition;\r
158     }\r
159 \r
160     @Override\r
161     public void setGroupingDefinition(GroupingDefinition groupingDefinition) {\r
162         this.groupingDefinition = groupingDefinition;\r
163     }\r
164 \r
165     @Override\r
166     public GroupingBuilder getGroupingBuilder() {\r
167         return groupingBuilder;\r
168     }\r
169 \r
170     @Override\r
171     public void setGrouping(GroupingBuilder grouping) {\r
172         this.groupingBuilder = grouping;\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