a20cfb2dad317e4b0f5acd19173cfed90d2bff53
[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.Objects;
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.TypeDefinition;
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 public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder {
30     private RpcDefinitionImpl instance;
31     private ContainerSchemaNodeBuilder inputBuilder;
32     private ContainerSchemaNodeBuilder outputBuilder;
33     private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<>();
34     private final Set<GroupingBuilder> addedGroupings = new HashSet<>();
35
36     RpcDefinitionBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
37         super(moduleName, line, qname);
38         this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
39     }
40
41     public ContainerSchemaNodeBuilder getInput() {
42         return inputBuilder;
43     }
44
45     public ContainerSchemaNodeBuilder getOutput() {
46         return outputBuilder;
47     }
48
49     @Override
50     public RpcDefinition build() {
51         if (instance != null) {
52             return instance;
53         }
54
55         instance = new RpcDefinitionImpl(qname, schemaPath);
56
57         final ContainerSchemaNode input = inputBuilder == null ? null : inputBuilder.build();
58         final ContainerSchemaNode output = outputBuilder == null ? null : outputBuilder.build();
59         instance.setInput(input);
60         instance.setOutput(output);
61
62         instance.description = description;
63         instance.reference = reference;
64         instance.status = status;
65
66         // TYPEDEFS
67         final Set<TypeDefinition<?>> typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
68         for (TypeDefinitionBuilder entry : addedTypedefs) {
69             typedefs.add(entry.build());
70         }
71         instance.typeDefinitions = ImmutableSet.copyOf(typedefs);
72
73         // GROUPINGS
74         final Set<GroupingDefinition> groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
75         for (GroupingBuilder builder : addedGroupings) {
76             groupings.add(builder.build());
77         }
78         instance.groupings = ImmutableSet.copyOf(groupings);
79
80         // UNKNOWN NODES
81         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
82             unknownNodes.add(b.build());
83         }
84         instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
85
86         return instance;
87     }
88
89     void setInput(final ContainerSchemaNodeBuilder inputBuilder) {
90         this.inputBuilder = inputBuilder;
91     }
92
93     void setOutput(final ContainerSchemaNodeBuilder outputBuilder) {
94         this.outputBuilder = outputBuilder;
95     }
96
97     public Set<TypeDefinitionBuilder> getTypeDefinitions() {
98         return addedTypedefs;
99     }
100
101     public void addTypedef(final TypeDefinitionBuilder type) {
102         addedTypedefs.add(type);
103     }
104
105     public Set<GroupingBuilder> getGroupings() {
106         return addedGroupings;
107     }
108
109     public void addGrouping(final GroupingBuilder grouping) {
110         addedGroupings.add(grouping);
111     }
112
113     @Override
114     public int hashCode() {
115         final int prime = 31;
116         int result = 1;
117         result = prime * result + Objects.hashCode(qname);
118         result = prime * result + Objects.hashCode(schemaPath);
119         return result;
120     }
121
122     @Override
123     public boolean equals(final Object obj) {
124         if (obj == null) {
125             return false;
126         }
127         if (!(obj instanceof RpcDefinitionBuilder)) {
128             return false;
129         }
130         final RpcDefinitionBuilder other = (RpcDefinitionBuilder) obj;
131         if (other.qname == null) {
132             if (this.qname != null) {
133                 return false;
134             }
135         } else if (!other.qname.equals(this.qname)) {
136             return false;
137         }
138         if (other.schemaPath == null) {
139             if (this.schemaPath != null) {
140                 return false;
141             }
142         } else if (!other.schemaPath.equals(this.schemaPath)) {
143             return false;
144         }
145         return true;
146     }
147
148     @Override
149     public String toString() {
150         return "rpc " + qname.getLocalName();
151     }
152
153 }