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