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