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