ecbc1c54fd0f9a0edaf0367f8008eaade0da99dd
[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     public List<UnknownSchemaNodeBuilder> getUnknownNodes() {\r
180         return addedUnknownNodes;\r
181     }\r
182 \r
183     @Override\r
184     public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {\r
185         addedUnknownNodes.add(unknownNode);\r
186     }\r
187 \r
188     @Override\r
189     public int hashCode() {\r
190         final int prime = 31;\r
191         int result = 1;\r
192         result = prime * result + ((groupingName == null) ? 0 : groupingName.hashCode());\r
193         return result;\r
194     }\r
195 \r
196     @Override\r
197     public boolean equals(Object obj) {\r
198         if (this == obj)\r
199             return true;\r
200         if (obj == null)\r
201             return false;\r
202         if (getClass() != obj.getClass())\r
203             return false;\r
204         UsesNodeBuilderImpl other = (UsesNodeBuilderImpl) obj;\r
205         if (groupingName == null) {\r
206             if (other.groupingName != null)\r
207                 return false;\r
208         } else if (!groupingName.equals(other.groupingName))\r
209             return false;\r
210 \r
211         if (parent == null) {\r
212             if (other.parent != null)\r
213                 return false;\r
214         } else if (!parent.equals(other.parent))\r
215             return false;\r
216         if (refines == null) {\r
217             if (other.refines != null)\r
218                 return false;\r
219         } else if (!refines.equals(other.refines))\r
220             return false;\r
221         return true;\r
222     }\r
223 \r
224     @Override\r
225     public String toString() {\r
226         return "uses '" + groupingName + "'";\r
227     }\r
228 \r
229     public final class UsesNodeImpl implements UsesNode {\r
230         private final SchemaPath groupingPath;\r
231         private Set<AugmentationSchema> augmentations = Collections.emptySet();\r
232         private boolean augmenting;\r
233         private boolean addedByUses;\r
234         private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();\r
235         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();\r
236 \r
237         private UsesNodeImpl(final SchemaPath groupingPath) {\r
238             this.groupingPath = groupingPath;\r
239         }\r
240 \r
241         @Override\r
242         public SchemaPath getGroupingPath() {\r
243             return groupingPath;\r
244         }\r
245 \r
246         @Override\r
247         public Set<AugmentationSchema> getAugmentations() {\r
248             return augmentations;\r
249         }\r
250 \r
251         private void setAugmentations(final Set<AugmentationSchema> augmentations) {\r
252             if (augmentations != null) {\r
253                 this.augmentations = augmentations;\r
254             }\r
255         }\r
256 \r
257         @Override\r
258         public boolean isAugmenting() {\r
259             return augmenting;\r
260         }\r
261 \r
262         private void setAugmenting(final boolean augmenting) {\r
263             this.augmenting = augmenting;\r
264         }\r
265 \r
266         @Override\r
267         public boolean isAddedByUses() {\r
268             return addedByUses;\r
269         }\r
270 \r
271         private void setAddedByUses(final boolean addedByUses) {\r
272             this.addedByUses = addedByUses;\r
273         }\r
274 \r
275         @Override\r
276         public Map<SchemaPath, SchemaNode> getRefines() {\r
277             return refines;\r
278         }\r
279 \r
280         private void setRefines(Map<SchemaPath, SchemaNode> refines) {\r
281             if (refines != null) {\r
282                 this.refines = refines;\r
283             }\r
284         }\r
285 \r
286         public List<UnknownSchemaNode> getUnknownSchemaNodes() {\r
287             return unknownNodes;\r
288         }\r
289 \r
290         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {\r
291             if (unknownSchemaNodes != null) {\r
292                 this.unknownNodes = unknownSchemaNodes;\r
293             }\r
294         }\r
295 \r
296         public UsesNodeBuilder toBuilder() {\r
297             return UsesNodeBuilderImpl.this;\r
298         }\r
299 \r
300         @Override\r
301         public int hashCode() {\r
302             final int prime = 31;\r
303             int result = 1;\r
304             result = prime * result + ((groupingPath == null) ? 0 : groupingPath.hashCode());\r
305             result = prime * result + ((augmentations == null) ? 0 : augmentations.hashCode());\r
306             result = prime * result + (augmenting ? 1231 : 1237);\r
307             return result;\r
308         }\r
309 \r
310         @Override\r
311         public boolean equals(Object obj) {\r
312             if (this == obj) {\r
313                 return true;\r
314             }\r
315             if (obj == null) {\r
316                 return false;\r
317             }\r
318             if (getClass() != obj.getClass()) {\r
319                 return false;\r
320             }\r
321             final UsesNodeImpl other = (UsesNodeImpl) obj;\r
322             if (groupingPath == null) {\r
323                 if (other.groupingPath != null) {\r
324                     return false;\r
325                 }\r
326             } else if (!groupingPath.equals(other.groupingPath)) {\r
327                 return false;\r
328             }\r
329             if (augmentations == null) {\r
330                 if (other.augmentations != null) {\r
331                     return false;\r
332                 }\r
333             } else if (!augmentations.equals(other.augmentations)) {\r
334                 return false;\r
335             }\r
336             if (augmenting != other.augmenting) {\r
337                 return false;\r
338             }\r
339             return true;\r
340         }\r
341 \r
342         @Override\r
343         public String toString() {\r
344             StringBuilder sb = new StringBuilder(UsesNodeImpl.class.getSimpleName());\r
345             sb.append("[groupingPath=" + groupingPath + "]");\r
346             return sb.toString();\r
347         }\r
348     }\r
349 \r
350 }\r