2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.parser.builder.impl;
10 import java.util.ArrayList;
11 import java.util.List;
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;
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;
37 public final class ChoiceCaseBuilder extends AbstractDocumentedDataNodeContainerBuilder implements DataSchemaNodeBuilder,
38 AugmentationTargetBuilder {
39 private ChoiceCaseNodeImpl instance;
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<>();
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);
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());
64 augmenting = base.isAugmenting();
65 addedByUses = base.isAddedByUses();
67 addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path,
69 augmentations.addAll(base.getAvailableAugmentations());
73 public ChoiceCaseNode build() {
74 if (instance != null) {
78 instance = new ChoiceCaseNodeImpl(qname, schemaPath,this);
80 instance.augmenting = augmenting;
81 instance.addedByUses = addedByUses;
83 instance.constraints = constraints.toInstance();
86 if (originalNode == null && originalBuilder != null) {
87 originalNode = originalBuilder.build();
89 instance.original = originalNode;
92 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
93 unknownNodes.add(b.build());
95 instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
98 for (AugmentationSchemaBuilder builder : augmentationBuilders) {
99 augmentations.add(builder.build());
101 instance.augmentations = ImmutableSet.copyOf(augmentations);
107 public SchemaPath getPath() {
112 public void setPath(final SchemaPath path) {
113 this.schemaPath = path;
116 public boolean isAugmenting() {
121 public void setAugmenting(final boolean augmenting) {
122 this.augmenting = augmenting;
126 public boolean isAddedByUses() {
131 public void setAddedByUses(final boolean addedByUses) {
132 this.addedByUses = addedByUses;
136 public ChoiceCaseBuilder getOriginal() {
137 return originalBuilder;
141 public void setOriginal(final SchemaNodeBuilder builder) {
142 Preconditions.checkArgument(builder instanceof ChoiceCaseBuilder, "Original of case cannot be " + builder);
143 this.originalBuilder = (ChoiceCaseBuilder) builder;
147 public void addTypedef(final TypeDefinitionBuilder typedefBuilder) {
148 throw new YangParseException(getModuleName(), typedefBuilder.getLine(), "Can not add type definition to choice case.");
152 public boolean isConfiguration() {
157 public void setConfiguration(final boolean configuration) {
158 throw new YangParseException(getModuleName(), getLine(), "Can not add config statement to choice case.");
162 public ConstraintsBuilder getConstraints() {
167 public void addAugmentation(final AugmentationSchemaBuilder augment) {
168 augmentationBuilders.add(augment);
172 public int hashCode() {
173 final int prime = 31;
175 result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
180 public boolean equals(final Object obj) {
187 if (getClass() != obj.getClass()) {
190 ChoiceCaseBuilder other = (ChoiceCaseBuilder) obj;
191 if (schemaPath == null) {
192 if (other.schemaPath != null) {
195 } else if (!schemaPath.equals(other.schemaPath)) {
198 if (getParent() == null) {
199 if (other.getParent() != null) {
202 } else if (!getParent().equals(other.getParent())) {
209 public String toString() {
210 return "case " + getQName().getLocalName();
214 protected String getStatementName() {
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;
228 private ChoiceCaseNodeImpl(final QName qname, final SchemaPath path,final ChoiceCaseBuilder builder) {
235 public QName getQName() {
240 public SchemaPath getPath() {
245 public boolean isConfiguration() {
250 public ConstraintDefinition getConstraints() {
255 public boolean isAugmenting() {
260 public boolean isAddedByUses() {
265 public Optional<ChoiceCaseNode> getOriginal() {
266 return Optional.fromNullable(original);
270 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
275 public Set<AugmentationSchema> getAvailableAugmentations() {
276 return augmentations;
280 public int hashCode() {
281 final int prime = 31;
283 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
284 result = prime * result + ((path == null) ? 0 : path.hashCode());
289 public boolean equals(final Object obj) {
296 if (getClass() != obj.getClass()) {
299 ChoiceCaseNodeImpl other = (ChoiceCaseNodeImpl) obj;
301 if (other.qname != null) {
304 } else if (!qname.equals(other.qname)) {
308 if (other.path != null) {
311 } else if (!path.equals(other.path)) {
318 public String toString() {
319 StringBuilder sb = new StringBuilder(ChoiceCaseNodeImpl.class.getSimpleName());
324 return sb.toString();