2 * Copyright (c) 2013 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 com.google.common.base.Preconditions;
11 import com.google.common.collect.ImmutableList;
12 import com.google.common.collect.ImmutableSet;
13 import java.util.ArrayList;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Objects;
18 import java.util.TreeSet;
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
21 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
22 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
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.SchemaNodeBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractSchemaNodeBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.util.Comparators;
33 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
36 * @deprecated Pre-Beryllium implementation, scheduled for removal.
39 public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder, AugmentationTargetBuilder {
40 private ChoiceSchemaNodeImpl instance;
42 // DataSchemaNode args
43 private boolean augmenting;
44 private boolean addedByUses;
45 private boolean configuration;
46 private ChoiceSchemaNode originalNode;
47 private ChoiceBuilder originalBuilder;
48 private final ConstraintsBuilder constraints;
49 // AugmentationTarget args
50 private final Set<AugmentationSchema> augmentations = new HashSet<>();
51 private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
53 private final Set<ChoiceCaseBuilder> caseBuilders = new HashSet<>();
54 private String defaultCase;
56 public ChoiceBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
57 super(moduleName, line, qname);
58 this.schemaPath = path;
59 constraints = new ConstraintsBuilderImpl(moduleName, line);
62 public ChoiceBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
63 final ChoiceSchemaNode base) {
64 super(moduleName, line, qname);
65 this.schemaPath = path;
66 constraints = new ConstraintsBuilderImpl(moduleName, line, base.getConstraints());
68 description = base.getDescription();
69 reference = base.getReference();
70 status = base.getStatus();
71 augmenting = base.isAugmenting();
72 addedByUses = base.isAddedByUses();
74 configuration = base.isConfiguration();
75 augmentations.addAll(base.getAvailableAugmentations());
77 Set<DataSchemaNodeBuilder> wrapped = BuilderUtils.wrapChildNodes(moduleName, line, new HashSet<>(
78 base.getCases()), path, qname);
79 for (DataSchemaNodeBuilder wrap : wrapped) {
80 if (wrap instanceof ChoiceCaseBuilder) {
81 caseBuilders.add((ChoiceCaseBuilder) wrap);
85 addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path,
90 public ChoiceSchemaNode build() {
91 if (instance != null) {
95 instance = new ChoiceSchemaNodeImpl(qname, schemaPath);
97 instance.description = description;
98 instance.reference = reference;
99 instance.status = status;
100 instance.augmenting = augmenting;
101 instance.addedByUses = addedByUses;
102 instance.configuration = configuration;
104 instance.constraints = constraints.build();
105 instance.defaultCase = defaultCase;
108 if (originalNode == null && originalBuilder != null) {
109 originalNode = originalBuilder.build();
111 instance.original = originalNode;
114 final Set<ChoiceCaseNode> cases = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
115 for (ChoiceCaseBuilder caseBuilder : caseBuilders) {
116 cases.add(caseBuilder.build());
118 instance.cases = ImmutableSet.copyOf(cases);
121 for (AugmentationSchemaBuilder builder : augmentationBuilders) {
122 augmentations.add(builder.build());
124 instance.augmentations = ImmutableSet.copyOf(augmentations);
127 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
128 unknownNodes.add(b.build());
130 instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
135 public Set<ChoiceCaseBuilder> getCases() {
143 * name of case to search
144 * @return case with given name if present, null otherwise
146 public ChoiceCaseBuilder getCaseNodeByName(final String caseName) {
147 for (ChoiceCaseBuilder addedCase : caseBuilders) {
148 if (addedCase.getQName().getLocalName().equals(caseName)) {
156 * Add case node to this choice.
158 * If node is not declared with 'case' keyword, create new case builder and
159 * make this node child of newly created case.
164 public void addCase(final DataSchemaNodeBuilder caseNode) {
165 QName caseQName = caseNode.getQName();
166 String caseName = caseQName.getLocalName();
168 for (ChoiceCaseBuilder existingCase : caseBuilders) {
169 if (existingCase.getQName().getLocalName().equals(caseName)) {
170 throw new YangParseException(caseNode.getModuleName(), caseNode.getLine(), "Can not add '" + caseNode
171 + "' to node '" + qname.getLocalName() + "' in module '" + getModuleName()
172 + "': case with same name already declared at line " + existingCase.getLine());
176 if (caseNode instanceof ChoiceCaseBuilder) {
177 caseBuilders.add((ChoiceCaseBuilder) caseNode);
179 ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder(caseNode.getModuleName(), caseNode.getLine(),
180 caseQName, caseNode.getPath());
181 if (caseNode.isAugmenting()) {
182 // if node is added by augmentation, set case builder augmenting
183 // as true and node augmenting as false
184 caseBuilder.setAugmenting(true);
185 caseNode.setAugmenting(false);
187 SchemaPath newPath = caseNode.getPath().createChild(caseQName);
188 caseNode.setPath(newPath);
189 caseBuilder.addChildNode(caseNode);
190 caseBuilders.add(caseBuilder);
195 public boolean isAugmenting() {
200 public void setAugmenting(final boolean augmenting) {
201 this.augmenting = augmenting;
205 public boolean isAddedByUses() {
210 public void setAddedByUses(final boolean addedByUses) {
211 this.addedByUses = addedByUses;
215 public ChoiceBuilder getOriginal() {
216 return originalBuilder;
220 public void setOriginal(final SchemaNodeBuilder builder) {
221 Preconditions.checkArgument(builder instanceof ChoiceBuilder, "Original of choice cannot be " + builder);
222 this.originalBuilder = (ChoiceBuilder) builder;
226 public boolean isConfiguration() {
227 return configuration;
231 public void setConfiguration(final boolean configuration) {
232 this.configuration = configuration;
236 public ConstraintsBuilder getConstraints() {
241 public void addAugmentation(final AugmentationSchemaBuilder augment) {
242 augmentationBuilders.add(augment);
245 public List<AugmentationSchemaBuilder> getAugmentationBuilders() {
246 return augmentationBuilders;
249 public String getDefaultCase() {
253 public void setDefaultCase(final String defaultCase) {
254 this.defaultCase = defaultCase;
258 public int hashCode() {
259 final int prime = 31;
261 result = prime * result + Objects.hashCode(schemaPath);
266 public boolean equals(final Object obj) {
273 if (getClass() != obj.getClass()) {
276 ChoiceBuilder other = (ChoiceBuilder) obj;
277 if (schemaPath == null) {
278 if (other.schemaPath != null) {
281 } else if (!schemaPath.equals(other.schemaPath)) {
284 if (getParent() == null) {
285 if (other.getParent() != null) {
288 } else if (!getParent().equals(other.getParent())) {
295 public String toString() {
296 return "choice " + qname.getLocalName();