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