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