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