BUG-1276: fixed generated union constructor
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / ChoiceCaseBuilder.java
1 /*
2  * Copyright (c) 2014 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
14 import java.util.ArrayList;
15 import java.util.List;
16 import java.util.Set;
17
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
20 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
21 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
22 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
23 import org.opendaylight.yangtools.yang.model.api.Status;
24 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
25 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
29 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainer;
32 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainerBuilder;
33 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
34
35 public final class ChoiceCaseBuilder extends AbstractDocumentedDataNodeContainerBuilder implements DataSchemaNodeBuilder,
36 AugmentationTargetBuilder {
37     private ChoiceCaseNodeImpl instance;
38     // SchemaNode args
39     private SchemaPath schemaPath;
40     private String description;
41     private String reference;
42     private Status status = Status.CURRENT;
43     // DataSchemaNode args
44     private boolean augmenting;
45     private boolean addedByUses;
46     private final ConstraintsBuilder constraints;
47     // AugmentationTarget args
48     private final List<AugmentationSchema> augmentations = new ArrayList<>();
49     private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
50
51     public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
52         super(moduleName, line, qname);
53         this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
54         constraints = new ConstraintsBuilderImpl(moduleName, line);
55     }
56
57     public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
58             final ChoiceCaseNode base) {
59
60         super(moduleName, line, qname);
61         this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
62         constraints = new ConstraintsBuilderImpl(moduleName, line, base.getConstraints());
63
64         description = base.getDescription();
65         reference = base.getReference();
66         status = base.getStatus();
67         augmenting = base.isAugmenting();
68         addedByUses = base.isAddedByUses();
69
70         addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path,
71                 qname));
72         augmentations.addAll(base.getAvailableAugmentations());
73     }
74
75     @Override
76     public ChoiceCaseNode build() {
77         if (instance != null) {
78             return instance;
79         }
80         buildChildren();
81         instance = new ChoiceCaseNodeImpl(qname, schemaPath,this);
82
83         instance.augmenting = augmenting;
84         instance.addedByUses = addedByUses;
85
86         instance.constraints = constraints.toInstance();
87
88         // UNKNOWN NODES
89         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
90             unknownNodes.add(b.build());
91         }
92         instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
93
94         // AUGMENTATIONS
95         for (AugmentationSchemaBuilder builder : augmentationBuilders) {
96             augmentations.add(builder.build());
97         }
98         instance.augmentations = ImmutableSet.copyOf(augmentations);
99
100         return instance;
101     }
102
103     @Override
104     public SchemaPath getPath() {
105         return schemaPath;
106     }
107
108     @Override
109     public void setPath(final SchemaPath path) {
110         this.schemaPath = path;
111     }
112     @Override
113     public boolean isAugmenting() {
114         return augmenting;
115     }
116
117     @Override
118     public void setAugmenting(final boolean augmenting) {
119         this.augmenting = augmenting;
120     }
121
122     @Override
123     public boolean isAddedByUses() {
124         return addedByUses;
125     }
126
127     @Override
128     public void setAddedByUses(final boolean addedByUses) {
129         this.addedByUses = addedByUses;
130     }
131
132     @Override
133     public void addTypedef(final TypeDefinitionBuilder typedefBuilder) {
134         throw new YangParseException(getModuleName(), typedefBuilder.getLine(), "Can not add type definition to choice case.");
135     }
136
137     @Override
138     public boolean isConfiguration() {
139         return false;
140     }
141
142     @Override
143     public void setConfiguration(final boolean configuration) {
144         throw new YangParseException(getModuleName(), getLine(), "Can not add config statement to choice case.");
145     }
146
147     @Override
148     public ConstraintsBuilder getConstraints() {
149         return constraints;
150     }
151
152     @Override
153     public void addAugmentation(final AugmentationSchemaBuilder augment) {
154         augmentationBuilders.add(augment);
155     }
156
157     @Override
158     public int hashCode() {
159         final int prime = 31;
160         int result = 1;
161         result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
162         return result;
163     }
164
165     @Override
166     public boolean equals(final Object obj) {
167         if (this == obj) {
168             return true;
169         }
170         if (obj == null) {
171             return false;
172         }
173         if (getClass() != obj.getClass()) {
174             return false;
175         }
176         ChoiceCaseBuilder other = (ChoiceCaseBuilder) obj;
177         if (schemaPath == null) {
178             if (other.schemaPath != null) {
179                 return false;
180             }
181         } else if (!schemaPath.equals(other.schemaPath)) {
182             return false;
183         }
184         if (getParent() == null) {
185             if (other.getParent() != null) {
186                 return false;
187             }
188         } else if (!getParent().equals(other.getParent())) {
189             return false;
190         }
191         return true;
192     }
193
194     @Override
195     public String toString() {
196         return "case " + getQName().getLocalName();
197     }
198
199     @Override
200     protected String getStatementName() {
201         return "choice";
202     }
203
204     private static final class ChoiceCaseNodeImpl extends AbstractDocumentedDataNodeContainer implements ChoiceCaseNode {
205         private final QName qname;
206         private final SchemaPath path;
207         private boolean augmenting;
208         private boolean addedByUses;
209         private ConstraintDefinition constraints;
210         private ImmutableSet<AugmentationSchema> augmentations;
211         private ImmutableList<UnknownSchemaNode> unknownNodes;
212
213         private ChoiceCaseNodeImpl(final QName qname, final SchemaPath path,final ChoiceCaseBuilder builder) {
214             super(builder);
215             this.qname = qname;
216             this.path = path;
217         }
218
219         @Override
220         public QName getQName() {
221             return qname;
222         }
223
224         @Override
225         public SchemaPath getPath() {
226             return path;
227         }
228
229         @Override
230         public boolean isConfiguration() {
231             return false;
232         }
233
234         @Override
235         public ConstraintDefinition getConstraints() {
236             return constraints;
237         }
238
239         @Override
240         public boolean isAugmenting() {
241             return augmenting;
242         }
243
244         @Override
245         public boolean isAddedByUses() {
246             return addedByUses;
247         }
248
249         @Override
250         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
251             return unknownNodes;
252         }
253
254         @Override
255         public Set<AugmentationSchema> getAvailableAugmentations() {
256             return augmentations;
257         }
258
259         @Override
260         public int hashCode() {
261             final int prime = 31;
262             int result = 1;
263             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
264             result = prime * result + ((path == null) ? 0 : path.hashCode());
265             return result;
266         }
267
268         @Override
269         public boolean equals(final Object obj) {
270             if (this == obj) {
271                 return true;
272             }
273             if (obj == null) {
274                 return false;
275             }
276             if (getClass() != obj.getClass()) {
277                 return false;
278             }
279             ChoiceCaseNodeImpl other = (ChoiceCaseNodeImpl) obj;
280             if (qname == null) {
281                 if (other.qname != null) {
282                     return false;
283                 }
284             } else if (!qname.equals(other.qname)) {
285                 return false;
286             }
287             if (path == null) {
288                 if (other.path != null) {
289                     return false;
290                 }
291             } else if (!path.equals(other.path)) {
292                 return false;
293             }
294             return true;
295         }
296
297         @Override
298         public String toString() {
299             StringBuilder sb = new StringBuilder(ChoiceCaseNodeImpl.class.getSimpleName());
300             sb.append("[");
301             sb.append("qname=");
302             sb.append(qname);
303             sb.append("]");
304             return sb.toString();
305         }
306     }
307
308 }