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