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