Merge "Fixed validation bug of YANG import statement"
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / main / java / org / opendaylight / controller / yang / model / parser / builder / impl / GroupingBuilderImpl.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.yang.model.parser.builder.impl;
9
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashMap;
13 import java.util.HashSet;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Set;
17
18 import org.opendaylight.controller.yang.common.QName;
19 import org.opendaylight.controller.yang.model.api.DataSchemaNode;
20 import org.opendaylight.controller.yang.model.api.GroupingDefinition;
21 import org.opendaylight.controller.yang.model.api.SchemaPath;
22 import org.opendaylight.controller.yang.model.api.Status;
23 import org.opendaylight.controller.yang.model.api.TypeDefinition;
24 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
25 import org.opendaylight.controller.yang.model.api.UsesNode;
26 import org.opendaylight.controller.yang.model.parser.builder.api.DataSchemaNodeBuilder;
27 import org.opendaylight.controller.yang.model.parser.builder.api.GroupingBuilder;
28 import org.opendaylight.controller.yang.model.parser.builder.api.TypeDefinitionBuilder;
29 import org.opendaylight.controller.yang.model.parser.builder.api.UsesNodeBuilder;
30
31 public class GroupingBuilderImpl implements GroupingBuilder {
32
33     private final GroupingDefinitionImpl instance;
34     private SchemaPath schemaPath;
35     private final Set<DataSchemaNodeBuilder> childNodes = new HashSet<DataSchemaNodeBuilder>();
36     private final Set<GroupingBuilder> groupings = new HashSet<GroupingBuilder>();
37     private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
38     private final Set<UsesNodeBuilder> usesNodes = new HashSet<UsesNodeBuilder>();
39     private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
40
41     GroupingBuilderImpl(final QName qname) {
42         this.instance = new GroupingDefinitionImpl(qname);
43     }
44
45     @Override
46     public GroupingDefinition build() {
47         instance.setPath(schemaPath);
48
49         // CHILD NODES
50         final Map<QName, DataSchemaNode> childs = new HashMap<QName, DataSchemaNode>();
51         for (DataSchemaNodeBuilder node : childNodes) {
52             childs.put(node.getQName(), node.build());
53         }
54         instance.setChildNodes(childs);
55
56         // GROUPINGS
57         final Set<GroupingDefinition> groupingDefs = new HashSet<GroupingDefinition>();
58         for (GroupingBuilder builder : groupings) {
59             groupingDefs.add(builder.build());
60         }
61         instance.setGroupings(groupingDefs);
62
63         // TYPEDEFS
64         final Set<TypeDefinition<?>> typedefs = new HashSet<TypeDefinition<?>>();
65         for (TypeDefinitionBuilder entry : addedTypedefs) {
66             typedefs.add(entry.build());
67         }
68         instance.setTypeDefinitions(typedefs);
69
70         // USES
71         final Set<UsesNode> usesNodeDefs = new HashSet<UsesNode>();
72         for (UsesNodeBuilder builder : usesNodes) {
73             usesNodeDefs.add(builder.build());
74         }
75         instance.setUses(usesNodeDefs);
76
77         // UNKNOWN NODES
78         final List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
79         for(UnknownSchemaNodeBuilder b : addedUnknownNodes) {
80             unknownNodes.add(b.build());
81         }
82         instance.setUnknownSchemaNodes(unknownNodes);
83
84         return instance;
85     }
86
87     /**
88      * Always returns null.
89      */
90     @Override
91     public QName getQName() {
92         return null;
93     }
94
95     @Override
96     public void addTypedef(final TypeDefinitionBuilder type) {
97         addedTypedefs.add(type);
98     }
99
100     @Override
101     public SchemaPath getPath() {
102         return schemaPath;
103     }
104
105     @Override
106     public void setPath(SchemaPath schemaPath) {
107         this.schemaPath = schemaPath;
108     }
109
110     @Override
111     public void setDescription(final String description) {
112         instance.setDescription(description);
113     }
114
115     @Override
116     public void setReference(final String reference) {
117         instance.setReference(reference);
118     }
119
120     @Override
121     public void setStatus(final Status status) {
122         instance.setStatus(status);
123     }
124
125     @Override
126     public DataSchemaNodeBuilder getChildNode(String name) {
127         DataSchemaNodeBuilder result = null;
128         for(DataSchemaNodeBuilder node : childNodes) {
129             if(node.getQName().getLocalName().equals(name)) {
130                 result = node;
131                 break;
132             }
133         }
134         return result;
135     }
136
137     @Override
138     public void addChildNode(final DataSchemaNodeBuilder childNode) {
139         childNodes.add(childNode);
140     }
141
142     @Override
143     public void addGrouping(final GroupingBuilder grouping) {
144         groupings.add(grouping);
145     }
146
147     @Override
148     public void addUsesNode(final UsesNodeBuilder usesBuilder) {
149         usesNodes.add(usesBuilder);
150     }
151
152     @Override
153     public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
154         addedUnknownNodes.add(unknownNode);
155     }
156
157     private static class GroupingDefinitionImpl implements GroupingDefinition {
158         private final QName qname;
159         private SchemaPath path;
160         private String description;
161         private String reference;
162         private Status status;
163         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
164         private Set<GroupingDefinition> groupings = Collections.emptySet();
165         private Set<TypeDefinition<?>> typeDefinitions = Collections.emptySet();
166         private Set<UsesNode> uses = Collections.emptySet();
167         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
168
169         private GroupingDefinitionImpl(final QName qname) {
170             this.qname = qname;
171         }
172
173         @Override
174         public QName getQName() {
175             return qname;
176         }
177
178         @Override
179         public SchemaPath getPath() {
180             return path;
181         }
182
183         private void setPath(SchemaPath path) {
184             this.path = path;
185         }
186
187         @Override
188         public String getDescription() {
189             return description;
190         }
191
192         private void setDescription(String description) {
193             this.description = description;
194         }
195
196         @Override
197         public String getReference() {
198             return reference;
199         }
200
201         private void setReference(String reference) {
202             this.reference = reference;
203         }
204
205         @Override
206         public Status getStatus() {
207             return status;
208         }
209
210         private void setStatus(Status status) {
211             this.status = status;
212         }
213
214         @Override
215         public Set<DataSchemaNode> getChildNodes() {
216             return new HashSet<DataSchemaNode>(childNodes.values());
217         }
218
219         private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {
220             this.childNodes = childNodes;
221         }
222
223         @Override
224         public Set<GroupingDefinition> getGroupings() {
225             return groupings;
226         }
227
228         private void setGroupings(Set<GroupingDefinition> groupings) {
229             this.groupings = groupings;
230         }
231
232         @Override
233         public Set<UsesNode> getUses() {
234             return uses;
235         }
236
237         private void setUses(Set<UsesNode> uses) {
238             this.uses = uses;
239         }
240
241         @Override
242         public Set<TypeDefinition<?>> getTypeDefinitions() {
243             return typeDefinitions;
244         }
245
246         private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
247             this.typeDefinitions = typeDefinitions;
248         }
249
250         @Override
251         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
252             return unknownNodes;
253         }
254
255         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
256             if(unknownNodes != null) {
257                 this.unknownNodes = unknownNodes;
258             }
259         }
260
261         @Override
262         public DataSchemaNode getDataChildByName(QName name) {
263             return childNodes.get(name);
264         }
265
266         @Override
267         public DataSchemaNode getDataChildByName(String name) {
268             DataSchemaNode result = null;
269             for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
270                 if (entry.getKey().getLocalName().equals(name)) {
271                     result = entry.getValue();
272                     break;
273                 }
274             }
275             return result;
276         }
277
278         @Override
279         public int hashCode() {
280             final int prime = 31;
281             int result = 1;
282             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
283             result = prime * result + ((path == null) ? 0 : path.hashCode());
284             return result;
285         }
286
287         @Override
288         public boolean equals(Object obj) {
289             if (this == obj) {
290                 return true;
291             }
292             if (obj == null) {
293                 return false;
294             }
295             if (getClass() != obj.getClass()) {
296                 return false;
297             }
298             final GroupingDefinitionImpl other = (GroupingDefinitionImpl) obj;
299             if (qname == null) {
300                 if (other.qname != null) {
301                     return false;
302                 }
303             } else if (!qname.equals(other.qname)) {
304                 return false;
305             }
306             if (path == null) {
307                 if (other.path != null) {
308                     return false;
309                 }
310             } else if (!path.equals(other.path)) {
311                 return false;
312             }
313             return true;
314         }
315
316         @Override
317         public String toString() {
318             StringBuilder sb = new StringBuilder(
319                     GroupingDefinitionImpl.class.getSimpleName());
320             sb.append("[");
321             sb.append("qname=" + qname);
322             sb.append("]");
323             return sb.toString();
324         }
325     }
326
327 }