bffa7e381e9ff2ebecec083b2458f02f99d89908
[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 Set<DataSchemaNodeBuilder> getChildNodes() {
144         return childNodes;
145     }
146
147     @Override
148     public void addGrouping(final GroupingBuilder grouping) {
149         groupings.add(grouping);
150     }
151
152     @Override
153     public void addUsesNode(final UsesNodeBuilder usesBuilder) {
154         usesNodes.add(usesBuilder);
155     }
156
157     @Override
158     public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
159         addedUnknownNodes.add(unknownNode);
160     }
161
162     private static class GroupingDefinitionImpl implements GroupingDefinition {
163         private final QName qname;
164         private SchemaPath path;
165         private String description;
166         private String reference;
167         private Status status;
168         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
169         private Set<GroupingDefinition> groupings = Collections.emptySet();
170         private Set<TypeDefinition<?>> typeDefinitions = Collections.emptySet();
171         private Set<UsesNode> uses = Collections.emptySet();
172         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
173
174         private GroupingDefinitionImpl(final QName qname) {
175             this.qname = qname;
176         }
177
178         @Override
179         public QName getQName() {
180             return qname;
181         }
182
183         @Override
184         public SchemaPath getPath() {
185             return path;
186         }
187
188         private void setPath(SchemaPath path) {
189             this.path = path;
190         }
191
192         @Override
193         public String getDescription() {
194             return description;
195         }
196
197         private void setDescription(String description) {
198             this.description = description;
199         }
200
201         @Override
202         public String getReference() {
203             return reference;
204         }
205
206         private void setReference(String reference) {
207             this.reference = reference;
208         }
209
210         @Override
211         public Status getStatus() {
212             return status;
213         }
214
215         private void setStatus(Status status) {
216             this.status = status;
217         }
218
219         @Override
220         public Set<DataSchemaNode> getChildNodes() {
221             return new HashSet<DataSchemaNode>(childNodes.values());
222         }
223
224         private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {
225             this.childNodes = childNodes;
226         }
227
228         @Override
229         public Set<GroupingDefinition> getGroupings() {
230             return groupings;
231         }
232
233         private void setGroupings(Set<GroupingDefinition> groupings) {
234             this.groupings = groupings;
235         }
236
237         @Override
238         public Set<UsesNode> getUses() {
239             return uses;
240         }
241
242         private void setUses(Set<UsesNode> uses) {
243             this.uses = uses;
244         }
245
246         @Override
247         public Set<TypeDefinition<?>> getTypeDefinitions() {
248             return typeDefinitions;
249         }
250
251         private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
252             this.typeDefinitions = typeDefinitions;
253         }
254
255         @Override
256         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
257             return unknownNodes;
258         }
259
260         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
261             if(unknownNodes != null) {
262                 this.unknownNodes = unknownNodes;
263             }
264         }
265
266         @Override
267         public DataSchemaNode getDataChildByName(QName name) {
268             return childNodes.get(name);
269         }
270
271         @Override
272         public DataSchemaNode getDataChildByName(String name) {
273             DataSchemaNode result = null;
274             for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
275                 if (entry.getKey().getLocalName().equals(name)) {
276                     result = entry.getValue();
277                     break;
278                 }
279             }
280             return result;
281         }
282
283         @Override
284         public int hashCode() {
285             final int prime = 31;
286             int result = 1;
287             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
288             result = prime * result + ((path == null) ? 0 : path.hashCode());
289             return result;
290         }
291
292         @Override
293         public boolean equals(Object obj) {
294             if (this == obj) {
295                 return true;
296             }
297             if (obj == null) {
298                 return false;
299             }
300             if (getClass() != obj.getClass()) {
301                 return false;
302             }
303             final GroupingDefinitionImpl other = (GroupingDefinitionImpl) obj;
304             if (qname == null) {
305                 if (other.qname != null) {
306                     return false;
307                 }
308             } else if (!qname.equals(other.qname)) {
309                 return false;
310             }
311             if (path == null) {
312                 if (other.path != null) {
313                     return false;
314                 }
315             } else if (!path.equals(other.path)) {
316                 return false;
317             }
318             return true;
319         }
320
321         @Override
322         public String toString() {
323             StringBuilder sb = new StringBuilder(
324                     GroupingDefinitionImpl.class.getSimpleName());
325             sb.append("[");
326             sb.append("qname=" + qname);
327             sb.append("]");
328             return sb.toString();
329         }
330     }
331
332 }