Bug fix for ForwardingRulesManager:
[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 = new ArrayList<RefineHolder>();\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     @Override\r
83     public List<RefineHolder> getRefines() {\r
84         return refines;\r
85     }\r
86 \r
87     @Override\r
88     public void addRefine(RefineHolder refine) {\r
89         refines.add(refine);\r
90     }\r
91 \r
92     private SchemaPath parseUsesPath(final String augmentPath) {\r
93         final String[] splittedPath = augmentPath.split("/");\r
94         final List<QName> path = new ArrayList<QName>();\r
95         QName name;\r
96         for (String pathElement : splittedPath) {\r
97             final String[] splittedElement = pathElement.split(":");\r
98             if (splittedElement.length == 1) {\r
99                 name = new QName(null, null, null, splittedElement[0]);\r
100             } else {\r
101                 name = new QName(null, null, splittedElement[0],\r
102                         splittedElement[1]);\r
103             }\r
104             path.add(name);\r
105         }\r
106         final boolean absolute = augmentPath.startsWith("/");\r
107         return new SchemaPath(path, absolute);\r
108     }\r
109 \r
110     private static class UsesNodeImpl implements UsesNode {\r
111         private final SchemaPath groupingPath;\r
112         private Set<AugmentationSchema> augmentations = Collections.emptySet();\r
113         private boolean augmenting;\r
114         private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();\r
115 \r
116         private UsesNodeImpl(final SchemaPath groupingPath) {\r
117             this.groupingPath = groupingPath;\r
118         }\r
119 \r
120         @Override\r
121         public SchemaPath getGroupingPath() {\r
122             return groupingPath;\r
123         }\r
124 \r
125         @Override\r
126         public Set<AugmentationSchema> getAugmentations() {\r
127             return augmentations;\r
128         }\r
129 \r
130         private void setAugmentations(final Set<AugmentationSchema> augmentations) {\r
131             if (augmentations != null) {\r
132                 this.augmentations = augmentations;\r
133             }\r
134         }\r
135 \r
136         @Override\r
137         public boolean isAugmenting() {\r
138             return augmenting;\r
139         }\r
140 \r
141         private void setAugmenting(final boolean augmenting) {\r
142             this.augmenting = augmenting;\r
143         }\r
144 \r
145         @Override\r
146         public Map<SchemaPath, SchemaNode> getRefines() {\r
147             return refines;\r
148         }\r
149 \r
150         private void setRefines(Map<SchemaPath, SchemaNode> refines) {\r
151             if(refines != null) {\r
152                 this.refines = refines;\r
153             }\r
154         }\r
155 \r
156         @Override\r
157         public int hashCode() {\r
158             final int prime = 31;\r
159             int result = 1;\r
160             result = prime * result\r
161                     + ((groupingPath == null) ? 0 : groupingPath.hashCode());\r
162             result = prime * result\r
163                     + ((augmentations == null) ? 0 : augmentations.hashCode());\r
164             result = prime * result + (augmenting ? 1231 : 1237);\r
165             return result;\r
166         }\r
167 \r
168         @Override\r
169         public boolean equals(Object obj) {\r
170             if (this == obj) {\r
171                 return true;\r
172             }\r
173             if (obj == null) {\r
174                 return false;\r
175             }\r
176             if (getClass() != obj.getClass()) {\r
177                 return false;\r
178             }\r
179             final UsesNodeImpl other = (UsesNodeImpl) obj;\r
180             if (groupingPath == null) {\r
181                 if (other.groupingPath != null) {\r
182                     return false;\r
183                 }\r
184             } else if (!groupingPath.equals(other.groupingPath)) {\r
185                 return false;\r
186             }\r
187             if (augmentations == null) {\r
188                 if (other.augmentations != null) {\r
189                     return false;\r
190                 }\r
191             } else if (!augmentations.equals(other.augmentations)) {\r
192                 return false;\r
193             }\r
194             if (augmenting != other.augmenting) {\r
195                 return false;\r
196             }\r
197             return true;\r
198         }\r
199 \r
200         @Override\r
201         public String toString() {\r
202             StringBuilder sb = new StringBuilder(\r
203                     UsesNodeImpl.class.getSimpleName());\r
204             sb.append("[groupingPath=" + groupingPath + "]");\r
205             return sb.toString();\r
206         }\r
207     }\r
208 }\r