Moved parsing of unknown nodes from implementation to abstract classes.
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / main / java / org / opendaylight / controller / 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.controller.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.controller.yang.model.api.AugmentationSchema;\r
19 import org.opendaylight.controller.yang.model.api.SchemaNode;\r
20 import org.opendaylight.controller.yang.model.api.SchemaPath;\r
21 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;\r
22 import org.opendaylight.controller.yang.model.api.UsesNode;\r
23 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;\r
24 import org.opendaylight.controller.yang.parser.builder.api.Builder;\r
25 import org.opendaylight.controller.yang.parser.builder.api.DataNodeContainerBuilder;\r
26 import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;\r
27 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;\r
28 import org.opendaylight.controller.yang.parser.util.RefineHolder;\r
29 import org.opendaylight.controller.yang.parser.util.YangParseException;\r
30 \r
31 public final class UsesNodeBuilderImpl implements UsesNodeBuilder {\r
32     private boolean isBuilt;\r
33     private UsesNodeImpl instance;\r
34     private final int line;\r
35     private DataNodeContainerBuilder parent;\r
36     private final String groupingName;\r
37     private SchemaPath groupingPath;\r
38     private boolean augmenting;\r
39     private boolean addedByUses;\r
40     private final Set<AugmentationSchemaBuilder> addedAugments = new HashSet<AugmentationSchemaBuilder>();\r
41     private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<SchemaNodeBuilder>();\r
42     private final List<RefineHolder> refines = new ArrayList<RefineHolder>();\r
43     private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();\r
44 \r
45     public UsesNodeBuilderImpl(final int line, final String groupingName) {\r
46         this.groupingName = groupingName;\r
47         this.line = line;\r
48     }\r
49 \r
50     public UsesNodeBuilderImpl(UsesNodeBuilder b) {\r
51         groupingName = b.getGroupingName();\r
52         line = b.getLine();\r
53         parent = b.getParent();\r
54         groupingPath = b.getGroupingPath();\r
55         augmenting = b.isAugmenting();\r
56         addedByUses = b.isAddedByUses();\r
57         addedAugments.addAll(b.getAugmentations());\r
58         refineBuilders.addAll(b.getRefineNodes());\r
59         refines.addAll(b.getRefines());\r
60     }\r
61 \r
62     @Override\r
63     public UsesNode build() {\r
64         if (!isBuilt) {\r
65             instance = new UsesNodeImpl(groupingPath);\r
66             instance.setAugmenting(augmenting);\r
67             instance.setAddedByUses(addedByUses);\r
68 \r
69             // AUGMENTATIONS\r
70             final Set<AugmentationSchema> augments = new HashSet<AugmentationSchema>();\r
71             for (AugmentationSchemaBuilder builder : addedAugments) {\r
72                 augments.add(builder.build());\r
73             }\r
74             instance.setAugmentations(augments);\r
75 \r
76             // REFINES\r
77             final Map<SchemaPath, SchemaNode> refineNodes = new HashMap<SchemaPath, SchemaNode>();\r
78             for (SchemaNodeBuilder refineBuilder : refineBuilders) {\r
79                 SchemaNode refineNode = refineBuilder.build();\r
80                 refineNodes.put(refineNode.getPath(), refineNode);\r
81             }\r
82             instance.setRefines(refineNodes);\r
83 \r
84             // UNKNOWN NODES\r
85             List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();\r
86             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {\r
87                 unknownNodes.add(b.build());\r
88             }\r
89             instance.setUnknownSchemaNodes(unknownNodes);\r
90 \r
91             isBuilt = true;\r
92         }\r
93         return instance;\r
94     }\r
95 \r
96     @Override\r
97     public int getLine() {\r
98         return line;\r
99     }\r
100 \r
101     @Override\r
102     public DataNodeContainerBuilder getParent() {\r
103         return parent;\r
104     }\r
105 \r
106     @Override\r
107     public void setParent(Builder parent) {\r
108         if (!(parent instanceof DataNodeContainerBuilder)) {\r
109             throw new YangParseException(line, "Unresolved parent of uses '" + groupingName + "'.");\r
110         }\r
111         this.parent = (DataNodeContainerBuilder) parent;\r
112     }\r
113 \r
114     @Override\r
115     public SchemaPath getGroupingPath() {\r
116         return groupingPath;\r
117     }\r
118 \r
119     @Override\r
120     public void setGroupingPath(SchemaPath groupingPath) {\r
121         this.groupingPath = groupingPath;\r
122     }\r
123 \r
124     @Override\r
125     public String getGroupingName() {\r
126         return groupingName;\r
127     }\r
128 \r
129     @Override\r
130     public Set<AugmentationSchemaBuilder> getAugmentations() {\r
131         return addedAugments;\r
132     }\r
133 \r
134     @Override\r
135     public void addAugment(final AugmentationSchemaBuilder augmentBuilder) {\r
136         addedAugments.add(augmentBuilder);\r
137     }\r
138 \r
139     @Override\r
140     public boolean isAugmenting() {\r
141         return augmenting;\r
142     }\r
143 \r
144     @Override\r
145     public void setAugmenting(final boolean augmenting) {\r
146         this.augmenting = augmenting;\r
147     }\r
148 \r
149     @Override\r
150     public boolean isAddedByUses() {\r
151         return addedByUses;\r
152     }\r
153 \r
154     @Override\r
155     public void setAddedByUses(final boolean addedByUses) {\r
156         this.addedByUses = addedByUses;\r
157     }\r
158 \r
159     @Override\r
160     public List<SchemaNodeBuilder> getRefineNodes() {\r
161         return refineBuilders;\r
162     }\r
163 \r
164     @Override\r
165     public void addRefineNode(SchemaNodeBuilder refineNode) {\r
166         refineBuilders.add(refineNode);\r
167     }\r
168 \r
169     @Override\r
170     public List<RefineHolder> getRefines() {\r
171         return refines;\r
172     }\r
173 \r
174     @Override\r
175     public void addRefine(RefineHolder refine) {\r
176         refines.add(refine);\r
177     }\r
178 \r
179     @Override\r
180     public List<UnknownSchemaNodeBuilder> getUnknownNodeBuilders() {\r
181         return addedUnknownNodes;\r
182     }\r
183 \r
184     @Override\r
185     public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) {\r
186         addedUnknownNodes.add(unknownNode);\r
187     }\r
188 \r
189     @Override\r
190     public int hashCode() {\r
191         final int prime = 31;\r
192         int result = 1;\r
193         result = prime * result + ((groupingName == null) ? 0 : groupingName.hashCode());\r
194         return result;\r
195     }\r
196 \r
197     @Override\r
198     public boolean equals(Object obj) {\r
199         if (this == obj)\r
200             return true;\r
201         if (obj == null)\r
202             return false;\r
203         if (getClass() != obj.getClass())\r
204             return false;\r
205         UsesNodeBuilderImpl other = (UsesNodeBuilderImpl) obj;\r
206         if (groupingName == null) {\r
207             if (other.groupingName != null)\r
208                 return false;\r
209         } else if (!groupingName.equals(other.groupingName))\r
210             return false;\r
211 \r
212         if (parent == null) {\r
213             if (other.parent != null)\r
214                 return false;\r
215         } else if (!parent.equals(other.parent))\r
216             return false;\r
217         if (refines == null) {\r
218             if (other.refines != null)\r
219                 return false;\r
220         } else if (!refines.equals(other.refines))\r
221             return false;\r
222         return true;\r
223     }\r
224 \r
225     @Override\r
226     public String toString() {\r
227         return "uses '" + groupingName + "'";\r
228     }\r
229 \r
230     public final class UsesNodeImpl implements UsesNode {\r
231         private final SchemaPath groupingPath;\r
232         private Set<AugmentationSchema> augmentations = Collections.emptySet();\r
233         private boolean augmenting;\r
234         private boolean addedByUses;\r
235         private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();\r
236         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();\r
237 \r
238         private UsesNodeImpl(final SchemaPath groupingPath) {\r
239             this.groupingPath = groupingPath;\r
240         }\r
241 \r
242         @Override\r
243         public SchemaPath getGroupingPath() {\r
244             return groupingPath;\r
245         }\r
246 \r
247         @Override\r
248         public Set<AugmentationSchema> getAugmentations() {\r
249             return augmentations;\r
250         }\r
251 \r
252         private void setAugmentations(final Set<AugmentationSchema> augmentations) {\r
253             if (augmentations != null) {\r
254                 this.augmentations = augmentations;\r
255             }\r
256         }\r
257 \r
258         @Override\r
259         public boolean isAugmenting() {\r
260             return augmenting;\r
261         }\r
262 \r
263         private void setAugmenting(final boolean augmenting) {\r
264             this.augmenting = augmenting;\r
265         }\r
266 \r
267         @Override\r
268         public boolean isAddedByUses() {\r
269             return addedByUses;\r
270         }\r
271 \r
272         private void setAddedByUses(final boolean addedByUses) {\r
273             this.addedByUses = addedByUses;\r
274         }\r
275 \r
276         @Override\r
277         public Map<SchemaPath, SchemaNode> getRefines() {\r
278             return refines;\r
279         }\r
280 \r
281         private void setRefines(Map<SchemaPath, SchemaNode> refines) {\r
282             if (refines != null) {\r
283                 this.refines = refines;\r
284             }\r
285         }\r
286 \r
287         public List<UnknownSchemaNode> getUnknownSchemaNodes() {\r
288             return unknownNodes;\r
289         }\r
290 \r
291         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {\r
292             if (unknownSchemaNodes != null) {\r
293                 this.unknownNodes = unknownSchemaNodes;\r
294             }\r
295         }\r
296 \r
297         public UsesNodeBuilder toBuilder() {\r
298             return UsesNodeBuilderImpl.this;\r
299         }\r
300 \r
301         @Override\r
302         public int hashCode() {\r
303             final int prime = 31;\r
304             int result = 1;\r
305             result = prime * result + ((groupingPath == null) ? 0 : groupingPath.hashCode());\r
306             result = prime * result + ((augmentations == null) ? 0 : augmentations.hashCode());\r
307             result = prime * result + (augmenting ? 1231 : 1237);\r
308             return result;\r
309         }\r
310 \r
311         @Override\r
312         public boolean equals(Object obj) {\r
313             if (this == obj) {\r
314                 return true;\r
315             }\r
316             if (obj == null) {\r
317                 return false;\r
318             }\r
319             if (getClass() != obj.getClass()) {\r
320                 return false;\r
321             }\r
322             final UsesNodeImpl other = (UsesNodeImpl) obj;\r
323             if (groupingPath == null) {\r
324                 if (other.groupingPath != null) {\r
325                     return false;\r
326                 }\r
327             } else if (!groupingPath.equals(other.groupingPath)) {\r
328                 return false;\r
329             }\r
330             if (augmentations == null) {\r
331                 if (other.augmentations != null) {\r
332                     return false;\r
333                 }\r
334             } else if (!augmentations.equals(other.augmentations)) {\r
335                 return false;\r
336             }\r
337             if (augmenting != other.augmenting) {\r
338                 return false;\r
339             }\r
340             return true;\r
341         }\r
342 \r
343         @Override\r
344         public String toString() {\r
345             StringBuilder sb = new StringBuilder(UsesNodeImpl.class.getSimpleName());\r
346             sb.append("[groupingPath=" + groupingPath + "]");\r
347             return sb.toString();\r
348         }\r
349     }\r
350 \r
351 }\r