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