57ffe80f79754450a2609941f0907227d3e23e53
[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 import java.net.URI;
14 import java.util.ArrayList;
15 import java.util.Date;
16 import java.util.List;
17 import java.util.Set;
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         URI ns = qname.getNamespace();
71         Date rev = qname.getRevision();
72         String pref = qname.getPrefix();
73         addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
74                 rev, pref));
75         augmentations.addAll(base.getAvailableAugmentations());
76     }
77
78     @Override
79     public ChoiceCaseNode build() {
80         if (instance != null) {
81             return instance;
82         }
83         buildChildren();
84         instance = new ChoiceCaseNodeImpl(qname, schemaPath,this);
85
86         instance.augmenting = augmenting;
87         instance.addedByUses = addedByUses;
88
89         instance.constraints = constraints.toInstance();
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 void addTypedef(final TypeDefinitionBuilder typedefBuilder) {
137         throw new YangParseException(getModuleName(), typedefBuilder.getLine(), "Can not add type definition to choice case.");
138     }
139
140     @Override
141     public boolean isConfiguration() {
142         return false;
143     }
144
145     @Override
146     public void setConfiguration(final boolean configuration) {
147         throw new YangParseException(getModuleName(), getLine(), "Can not add config statement to choice case.");
148     }
149
150     @Override
151     public ConstraintsBuilder getConstraints() {
152         return constraints;
153     }
154
155     @Override
156     public void addAugmentation(final AugmentationSchemaBuilder augment) {
157         augmentationBuilders.add(augment);
158     }
159
160     @Override
161     public int hashCode() {
162         final int prime = 31;
163         int result = 1;
164         result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
165         return result;
166     }
167
168     @Override
169     public boolean equals(final Object obj) {
170         if (this == obj) {
171             return true;
172         }
173         if (obj == null) {
174             return false;
175         }
176         if (getClass() != obj.getClass()) {
177             return false;
178         }
179         ChoiceCaseBuilder other = (ChoiceCaseBuilder) obj;
180         if (schemaPath == null) {
181             if (other.schemaPath != null) {
182                 return false;
183             }
184         } else if (!schemaPath.equals(other.schemaPath)) {
185             return false;
186         }
187         if (getParent() == null) {
188             if (other.getParent() != null) {
189                 return false;
190             }
191         } else if (!getParent().equals(other.getParent())) {
192             return false;
193         }
194         return true;
195     }
196
197     @Override
198     public String toString() {
199         return "case " + getQName().getLocalName();
200     }
201
202     @Override
203     protected String getStatementName() {
204         return "choice";
205     }
206
207     private static final class ChoiceCaseNodeImpl extends AbstractDocumentedDataNodeContainer implements ChoiceCaseNode {
208         private final QName qname;
209         private final SchemaPath path;
210         private boolean augmenting;
211         private boolean addedByUses;
212         private ConstraintDefinition constraints;
213         private ImmutableSet<AugmentationSchema> augmentations;
214         private ImmutableList<UnknownSchemaNode> unknownNodes;
215
216         private ChoiceCaseNodeImpl(final QName qname, final SchemaPath path,final ChoiceCaseBuilder builder) {
217             super(builder);
218             this.qname = qname;
219             this.path = path;
220         }
221
222         @Override
223         public QName getQName() {
224             return qname;
225         }
226
227         @Override
228         public SchemaPath getPath() {
229             return path;
230         }
231
232         @Override
233         public boolean isConfiguration() {
234             return false;
235         }
236
237         @Override
238         public ConstraintDefinition getConstraints() {
239             return constraints;
240         }
241
242         @Override
243         public boolean isAugmenting() {
244             return augmenting;
245         }
246
247         @Override
248         public boolean isAddedByUses() {
249             return addedByUses;
250         }
251
252         @Override
253         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
254             return unknownNodes;
255         }
256
257         @Override
258         public Set<AugmentationSchema> getAvailableAugmentations() {
259             return augmentations;
260         }
261
262         @Override
263         public int hashCode() {
264             final int prime = 31;
265             int result = 1;
266             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
267             result = prime * result + ((path == null) ? 0 : path.hashCode());
268             return result;
269         }
270
271         @Override
272         public boolean equals(final Object obj) {
273             if (this == obj) {
274                 return true;
275             }
276             if (obj == null) {
277                 return false;
278             }
279             if (getClass() != obj.getClass()) {
280                 return false;
281             }
282             ChoiceCaseNodeImpl other = (ChoiceCaseNodeImpl) obj;
283             if (qname == null) {
284                 if (other.qname != null) {
285                     return false;
286                 }
287             } else if (!qname.equals(other.qname)) {
288                 return false;
289             }
290             if (path == null) {
291                 if (other.path != null) {
292                     return false;
293                 }
294             } else if (!path.equals(other.path)) {
295                 return false;
296             }
297             return true;
298         }
299
300         @Override
301         public String toString() {
302             StringBuilder sb = new StringBuilder(ChoiceCaseNodeImpl.class.getSimpleName());
303             sb.append("[");
304             sb.append("qname=");
305             sb.append(qname);
306             sb.append("]");
307             return sb.toString();
308         }
309     }
310
311 }