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