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