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