Added YANG typedef support in the YANG parser
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / main / java / org / opendaylight / controller / yang / model / parser / builder / impl / NotificationBuilder.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.NotificationDefinition;
22 import org.opendaylight.controller.yang.model.api.SchemaNode;
23 import org.opendaylight.controller.yang.model.api.SchemaPath;
24 import org.opendaylight.controller.yang.model.api.Status;
25 import org.opendaylight.controller.yang.model.api.TypeDefinition;
26 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
27 import org.opendaylight.controller.yang.model.api.UsesNode;
28 import org.opendaylight.controller.yang.model.parser.builder.api.AbstractChildNodeBuilder;
29 import org.opendaylight.controller.yang.model.parser.builder.api.DataSchemaNodeBuilder;
30 import org.opendaylight.controller.yang.model.parser.builder.api.GroupingBuilder;
31 import org.opendaylight.controller.yang.model.parser.builder.api.SchemaNodeBuilder;
32 import org.opendaylight.controller.yang.model.parser.builder.api.TypeDefinitionAwareBuilder;
33 import org.opendaylight.controller.yang.model.parser.builder.api.TypeDefinitionBuilder;
34 import org.opendaylight.controller.yang.model.parser.builder.api.UsesNodeBuilder;
35
36 public class NotificationBuilder extends AbstractChildNodeBuilder implements
37         TypeDefinitionAwareBuilder, SchemaNodeBuilder {
38
39     private final NotificationDefinitionImpl instance;
40     private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
41     private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<UsesNodeBuilder>();
42     private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
43
44     NotificationBuilder(QName qname) {
45         super(qname);
46         instance = new NotificationDefinitionImpl(qname);
47     }
48
49     @Override
50     public SchemaNode build() {
51         // CHILD NODES
52         Map<QName, DataSchemaNode> childs = new HashMap<QName, DataSchemaNode>();
53         for (DataSchemaNodeBuilder node : childNodes) {
54             childs.put(node.getQName(), node.build());
55         }
56         instance.setChildNodes(childs);
57
58         // GROUPINGS
59         Set<GroupingDefinition> groupingDefinitions = new HashSet<GroupingDefinition>();
60         for (GroupingBuilder builder : groupings) {
61             groupingDefinitions.add(builder.build());
62         }
63         instance.setGroupings(groupingDefinitions);
64
65         // TYPEDEFS
66         Set<TypeDefinition<?>> typedefs = new HashSet<TypeDefinition<?>>();
67         for (TypeDefinitionBuilder entry : addedTypedefs) {
68             typedefs.add(entry.build());
69         }
70         instance.setTypeDefinitions(typedefs);
71
72         // USES
73         Set<UsesNode> uses = new HashSet<UsesNode>();
74         for (UsesNodeBuilder builder : addedUsesNodes) {
75             uses.add(builder.build());
76         }
77         instance.setUses(uses);
78
79         // UNKNOWN NODES
80         final List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
81         for(UnknownSchemaNodeBuilder b : addedUnknownNodes) {
82             unknownNodes.add(b.build());
83         }
84         instance.setUnknownSchemaNodes(unknownNodes);
85
86         return instance;
87     }
88
89     @Override
90     public void addTypedef(TypeDefinitionBuilder type) {
91         addedTypedefs.add(type);
92     }
93
94     @Override
95     public void addUsesNode(UsesNodeBuilder usesNodeBuilder) {
96         addedUsesNodes.add(usesNodeBuilder);
97     }
98
99     @Override
100     public void setPath(SchemaPath schemaPath) {
101         instance.setPath(schemaPath);
102     }
103
104     @Override
105     public void setDescription(String description) {
106         instance.setDescription(description);
107     }
108
109     @Override
110     public void setReference(String reference) {
111         instance.setReference(reference);
112     }
113
114     @Override
115     public void setStatus(Status status) {
116         instance.setStatus(status);
117     }
118
119     @Override
120     public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownSchemaNodeBuilder) {
121         addedUnknownNodes.add(unknownSchemaNodeBuilder);
122     }
123
124     private class NotificationDefinitionImpl implements NotificationDefinition {
125
126         private final QName qname;
127         private SchemaPath path;
128         private String description;
129         private String reference;
130         private Status status;
131         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
132         private Set<GroupingDefinition> groupings = Collections.emptySet();
133         private Set<TypeDefinition<?>> typeDefinitions = Collections.emptySet();
134         private Set<UsesNode> uses = Collections.emptySet();
135         private List<UnknownSchemaNode> unknownSchemaNodes = Collections.emptyList();
136
137         private NotificationDefinitionImpl(QName qname) {
138             this.qname = qname;
139         }
140
141         @Override
142         public QName getQName() {
143             return qname;
144         }
145
146         @Override
147         public SchemaPath getPath() {
148             return path;
149         }
150
151         private void setPath(SchemaPath path) {
152             this.path = path;
153         }
154
155         @Override
156         public String getDescription() {
157             return description;
158         }
159
160         private void setDescription(String description) {
161             this.description = description;
162         }
163
164         @Override
165         public String getReference() {
166             return reference;
167         }
168
169         private void setReference(String reference) {
170             this.reference = reference;
171         }
172
173         @Override
174         public Status getStatus() {
175             return status;
176         }
177
178         private void setStatus(Status status) {
179             this.status = status;
180         }
181
182         @Override
183         public Set<DataSchemaNode> getChildNodes() {
184             return new HashSet<DataSchemaNode>(childNodes.values());
185         }
186
187         private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {
188             if(childNodes != null) {
189                 this.childNodes = childNodes;
190             }
191         }
192
193         @Override
194         public Set<GroupingDefinition> getGroupings() {
195             return groupings;
196         }
197
198         private void setGroupings(Set<GroupingDefinition> groupings) {
199             if(groupings != null) {
200                 this.groupings = groupings;
201             }
202         }
203
204         @Override
205         public Set<UsesNode> getUses() {
206             return uses;
207         }
208
209         private void setUses(Set<UsesNode> uses) {
210             if(uses != null) {
211                 this.uses = uses;
212             }
213         }
214
215         @Override
216         public Set<TypeDefinition<?>> getTypeDefinitions() {
217             return typeDefinitions;
218         }
219
220         private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
221             if(typeDefinitions != null) {
222                 this.typeDefinitions = typeDefinitions;
223             }
224         }
225
226         @Override
227         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
228             return unknownSchemaNodes;
229         }
230
231         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
232             if(unknownSchemaNodes != null) {
233                 this.unknownSchemaNodes = unknownSchemaNodes;
234             }
235         }
236
237         @Override
238         public DataSchemaNode getDataChildByName(QName name) {
239             return childNodes.get(name);
240         }
241
242         @Override
243         public DataSchemaNode getDataChildByName(String name) {
244             DataSchemaNode result = null;
245             for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
246                 if (entry.getKey().getLocalName().equals(name)) {
247                     result = entry.getValue();
248                     break;
249                 }
250             }
251             return result;
252         }
253
254         @Override
255         public int hashCode() {
256             final int prime = 31;
257             int result = 1;
258             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
259             result = prime * result + ((path == null) ? 0 : path.hashCode());
260             return result;
261         }
262
263         @Override
264         public boolean equals(Object obj) {
265             if (this == obj) {
266                 return true;
267             }
268             if (obj == null) {
269                 return false;
270             }
271             if (getClass() != obj.getClass()) {
272                 return false;
273             }
274             NotificationDefinitionImpl other = (NotificationDefinitionImpl) obj;
275             if (qname == null) {
276                 if (other.qname != null) {
277                     return false;
278                 }
279             } else if (!qname.equals(other.qname)) {
280                 return false;
281             }
282             if (path == null) {
283                 if (other.path != null) {
284                     return false;
285                 }
286             } else if (!path.equals(other.path)) {
287                 return false;
288             }
289             return true;
290         }
291
292         @Override
293         public String toString() {
294             StringBuilder sb = new StringBuilder(
295                     NotificationDefinitionImpl.class.getSimpleName());
296             sb.append("[qname=" + qname + ", path="+ path +"]");
297             return sb.toString();
298         }
299     }
300
301 }