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