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