6943b661564302f337e2a525a51678f60c6819e2
[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.common.QName;\r
19 import org.opendaylight.controller.yang.model.api.AugmentationSchema;\r
20 import org.opendaylight.controller.yang.model.api.SchemaNode;\r
21 import org.opendaylight.controller.yang.model.api.SchemaPath;\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.SchemaNodeBuilder;\r
25 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;\r
26 import org.opendaylight.controller.yang.parser.util.RefineHolder;\r
27 \r
28 public final class UsesNodeBuilderImpl implements UsesNodeBuilder {\r
29     private boolean built;\r
30     private final UsesNodeImpl instance;\r
31     private final int line;\r
32     private final String groupingPathStr;\r
33     private final SchemaPath groupingPath;\r
34     private boolean augmenting;\r
35     private final Set<AugmentationSchemaBuilder> addedAugments = new HashSet<AugmentationSchemaBuilder>();\r
36     private List<SchemaNodeBuilder> refineBuilders = new ArrayList<SchemaNodeBuilder>();\r
37     private List<RefineHolder> refines = new ArrayList<RefineHolder>();\r
38 \r
39     public UsesNodeBuilderImpl(final String groupingPathStr, final int line) {\r
40         this.groupingPathStr = groupingPathStr;\r
41         this.groupingPath = parseUsesPath(groupingPathStr);\r
42         this.line = line;\r
43         instance = new UsesNodeImpl(groupingPath);\r
44     }\r
45 \r
46     @Override\r
47     public UsesNode build() {\r
48         if (!built) {\r
49             instance.setAugmenting(augmenting);\r
50 \r
51             // AUGMENTATIONS\r
52             final Set<AugmentationSchema> augments = new HashSet<AugmentationSchema>();\r
53             for (AugmentationSchemaBuilder builder : addedAugments) {\r
54                 augments.add(builder.build());\r
55             }\r
56             instance.setAugmentations(augments);\r
57 \r
58             // REFINES\r
59             final Map<SchemaPath, SchemaNode> refineNodes = new HashMap<SchemaPath, SchemaNode>();\r
60             for (SchemaNodeBuilder refineBuilder : refineBuilders) {\r
61                 SchemaNode refineNode = refineBuilder.build();\r
62                 refineNodes.put(refineNode.getPath(), refineNode);\r
63             }\r
64             instance.setRefines(refineNodes);\r
65 \r
66             built = true;\r
67         }\r
68         return instance;\r
69     }\r
70 \r
71     @Override\r
72     public int getLine() {\r
73         return line;\r
74     }\r
75 \r
76     @Override\r
77     public String getGroupingPathString() {\r
78         return groupingPathStr;\r
79     }\r
80 \r
81     @Override\r
82     public SchemaPath getGroupingPath() {\r
83         return groupingPath;\r
84     }\r
85 \r
86     @Override\r
87     public Set<AugmentationSchemaBuilder> getAugmentations() {\r
88         return addedAugments;\r
89     }\r
90 \r
91     @Override\r
92     public void addAugment(final AugmentationSchemaBuilder augmentBuilder) {\r
93         addedAugments.add(augmentBuilder);\r
94     }\r
95 \r
96     @Override\r
97     public boolean isAugmenting() {\r
98         return augmenting;\r
99     }\r
100 \r
101     @Override\r
102     public void setAugmenting(final boolean augmenting) {\r
103         this.augmenting = augmenting;\r
104     }\r
105 \r
106     @Override\r
107     public List<SchemaNodeBuilder> getRefineNodes() {\r
108         return refineBuilders;\r
109     }\r
110 \r
111     @Override\r
112     public void addRefineNode(SchemaNodeBuilder refineNode) {\r
113         refineBuilders.add(refineNode);\r
114     }\r
115 \r
116     @Override\r
117     public List<RefineHolder> getRefines() {\r
118         return refines;\r
119     }\r
120 \r
121     @Override\r
122     public void addRefine(RefineHolder refine) {\r
123         refines.add(refine);\r
124     }\r
125 \r
126     private SchemaPath parseUsesPath(final String groupingPathStr) {\r
127         final String[] splittedPath = groupingPathStr.split("/");\r
128         final List<QName> path = new ArrayList<QName>();\r
129         QName name;\r
130         for (String pathElement : splittedPath) {\r
131             final String[] splittedElement = pathElement.split(":");\r
132             if (splittedElement.length == 1) {\r
133                 name = new QName(null, null, null, splittedElement[0]);\r
134             } else {\r
135                 name = new QName(null, null, splittedElement[0],\r
136                         splittedElement[1]);\r
137             }\r
138             path.add(name);\r
139         }\r
140         final boolean absolute = groupingPathStr.startsWith("/");\r
141         return new SchemaPath(path, absolute);\r
142     }\r
143 \r
144     private final class UsesNodeImpl implements UsesNode {\r
145         private final SchemaPath groupingPath;\r
146         private Set<AugmentationSchema> augmentations = Collections.emptySet();\r
147         private boolean augmenting;\r
148         private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();\r
149 \r
150         private UsesNodeImpl(final SchemaPath groupingPath) {\r
151             this.groupingPath = groupingPath;\r
152         }\r
153 \r
154         @Override\r
155         public SchemaPath getGroupingPath() {\r
156             return groupingPath;\r
157         }\r
158 \r
159         @Override\r
160         public Set<AugmentationSchema> getAugmentations() {\r
161             return augmentations;\r
162         }\r
163 \r
164         private void setAugmentations(\r
165                 final Set<AugmentationSchema> augmentations) {\r
166             if (augmentations != null) {\r
167                 this.augmentations = augmentations;\r
168             }\r
169         }\r
170 \r
171         @Override\r
172         public boolean isAugmenting() {\r
173             return augmenting;\r
174         }\r
175 \r
176         private void setAugmenting(final boolean augmenting) {\r
177             this.augmenting = augmenting;\r
178         }\r
179 \r
180         @Override\r
181         public Map<SchemaPath, SchemaNode> getRefines() {\r
182             return refines;\r
183         }\r
184 \r
185         private void setRefines(Map<SchemaPath, SchemaNode> refines) {\r
186             if (refines != null) {\r
187                 this.refines = refines;\r
188             }\r
189         }\r
190 \r
191         @Override\r
192         public int hashCode() {\r
193             final int prime = 31;\r
194             int result = 1;\r
195             result = prime * result\r
196                     + ((groupingPath == null) ? 0 : groupingPath.hashCode());\r
197             result = prime * result\r
198                     + ((augmentations == null) ? 0 : augmentations.hashCode());\r
199             result = prime * result + (augmenting ? 1231 : 1237);\r
200             return result;\r
201         }\r
202 \r
203         @Override\r
204         public boolean equals(Object obj) {\r
205             if (this == obj) {\r
206                 return true;\r
207             }\r
208             if (obj == null) {\r
209                 return false;\r
210             }\r
211             if (getClass() != obj.getClass()) {\r
212                 return false;\r
213             }\r
214             final UsesNodeImpl other = (UsesNodeImpl) obj;\r
215             if (groupingPath == null) {\r
216                 if (other.groupingPath != null) {\r
217                     return false;\r
218                 }\r
219             } else if (!groupingPath.equals(other.groupingPath)) {\r
220                 return false;\r
221             }\r
222             if (augmentations == null) {\r
223                 if (other.augmentations != null) {\r
224                     return false;\r
225                 }\r
226             } else if (!augmentations.equals(other.augmentations)) {\r
227                 return false;\r
228             }\r
229             if (augmenting != other.augmenting) {\r
230                 return false;\r
231             }\r
232             return true;\r
233         }\r
234 \r
235         @Override\r
236         public String toString() {\r
237             StringBuilder sb = new StringBuilder(\r
238                     UsesNodeImpl.class.getSimpleName());\r
239             sb.append("[groupingPath=" + groupingPath + "]");\r
240             return sb.toString();\r
241         }\r
242     }\r
243 }\r