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