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