2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.parser.builder.impl;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashSet;
13 import java.util.List;
15 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.AbstractSchemaNodeBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
28 import org.opendaylight.yangtools.yang.parser.util.Comparators;
30 public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder {
31 private boolean isBuilt;
32 private final RpcDefinitionImpl instance;
33 private ContainerSchemaNodeBuilder inputBuilder;
34 private ContainerSchemaNodeBuilder outputBuilder;
35 private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
36 private final Set<GroupingBuilder> addedGroupings = new HashSet<GroupingBuilder>();
38 public ContainerSchemaNodeBuilder getInput() {
42 public ContainerSchemaNodeBuilder getOutput() {
46 RpcDefinitionBuilder(final String moduleName, final int line, final QName qname) {
47 super(moduleName, line, qname);
48 this.instance = new RpcDefinitionImpl(qname);
52 public RpcDefinition build() {
54 instance.setDescription(description);
55 instance.setReference(reference);
56 instance.setStatus(status);
58 final ContainerSchemaNode input = inputBuilder == null ? null : inputBuilder.build();
59 final ContainerSchemaNode output = outputBuilder == null ? null : outputBuilder.build();
60 instance.setInput(input);
61 instance.setOutput(output);
63 instance.setPath(schemaPath);
66 final Set<TypeDefinition<?>> typedefs = new TreeSet<TypeDefinition<?>>(Comparators.SCHEMA_NODE_COMP);
67 for (TypeDefinitionBuilder entry : addedTypedefs) {
68 typedefs.add(entry.build());
70 instance.setTypeDefinitions(typedefs);
73 final Set<GroupingDefinition> groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);
74 for (GroupingBuilder entry : addedGroupings) {
75 groupings.add(entry.build());
77 instance.setGroupings(groupings);
80 if (unknownNodes == null) {
81 unknownNodes = new ArrayList<UnknownSchemaNode>();
82 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
83 unknownNodes.add(b.build());
85 Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
87 instance.setUnknownSchemaNodes(unknownNodes);
94 void setInput(final ContainerSchemaNodeBuilder inputBuilder) {
95 this.inputBuilder = inputBuilder;
98 void setOutput(final ContainerSchemaNodeBuilder outputBuilder) {
99 this.outputBuilder = outputBuilder;
102 public Set<TypeDefinitionBuilder> getTypeDefinitions() {
103 return addedTypedefs;
106 public void addTypedef(final TypeDefinitionBuilder type) {
107 addedTypedefs.add(type);
110 public Set<GroupingBuilder> getGroupings() {
111 return addedGroupings;
114 public void addGrouping(GroupingBuilder grouping) {
115 addedGroupings.add(grouping);
119 public int hashCode() {
120 final int prime = 31;
122 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
123 result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
128 public boolean equals(Object obj) {
132 if (!(obj instanceof RpcDefinitionBuilder)) {
135 final RpcDefinitionBuilder other = (RpcDefinitionBuilder) obj;
136 if (other.qname == null) {
137 if (this.qname != null) {
140 } else if (!other.qname.equals(this.qname)) {
143 if (other.schemaPath == null) {
144 if (this.schemaPath != null) {
147 } else if (!other.schemaPath.equals(this.schemaPath)) {
154 public String toString() {
155 return "rpc " + qname.getLocalName();
158 private final class RpcDefinitionImpl implements RpcDefinition {
159 private final QName qname;
160 private SchemaPath path;
161 private String description;
162 private String reference;
163 private Status status;
164 private ContainerSchemaNode input;
165 private ContainerSchemaNode output;
166 private Set<TypeDefinition<?>> typeDefinitions;
167 private Set<GroupingDefinition> groupings;
168 private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
170 private RpcDefinitionImpl(final QName qname) {
175 public QName getQName() {
180 public SchemaPath getPath() {
184 private void setPath(SchemaPath path) {
189 public String getDescription() {
193 private void setDescription(String description) {
194 this.description = description;
198 public String getReference() {
202 private void setReference(String reference) {
203 this.reference = reference;
207 public Status getStatus() {
211 private void setStatus(Status status) {
212 this.status = status;
216 public ContainerSchemaNode getInput() {
220 private void setInput(ContainerSchemaNode input) {
225 public ContainerSchemaNode getOutput() {
229 private void setOutput(ContainerSchemaNode output) {
230 this.output = output;
234 public Set<TypeDefinition<?>> getTypeDefinitions() {
235 return typeDefinitions;
238 private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
239 this.typeDefinitions = typeDefinitions;
243 public Set<GroupingDefinition> getGroupings() {
247 private void setGroupings(Set<GroupingDefinition> groupings) {
248 this.groupings = groupings;
252 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
256 private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
257 if (unknownNodes != null) {
258 this.unknownNodes = unknownNodes;
263 public int hashCode() {
264 final int prime = 31;
266 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
267 result = prime * result + ((path == null) ? 0 : path.hashCode());
272 public boolean equals(Object obj) {
279 if (getClass() != obj.getClass()) {
282 final RpcDefinitionImpl other = (RpcDefinitionImpl) obj;
284 if (other.qname != null) {
287 } else if (!qname.equals(other.qname)) {
291 if (other.path != null) {
294 } else if (!path.equals(other.path)) {
301 public String toString() {
302 StringBuilder sb = new StringBuilder(RpcDefinitionImpl.class.getSimpleName());
306 sb.append(", path=");
308 sb.append(", input=");
310 sb.append(", output=");
313 return sb.toString();