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;
35 public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder,
36 AugmentationTargetBuilder {
37 private ChoiceSchemaNodeImpl instance;
39 // DataSchemaNode args
40 private boolean augmenting;
41 private boolean addedByUses;
42 private boolean configuration;
43 private ChoiceSchemaNode originalNode;
44 private ChoiceBuilder originalBuilder;
45 private final ConstraintsBuilder constraints;
46 // AugmentationTarget args
47 private final Set<AugmentationSchema> augmentations = new HashSet<>();
48 private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
50 private final Set<ChoiceCaseBuilder> caseBuilders = new HashSet<>();
51 private String defaultCase;
53 public ChoiceBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
54 super(moduleName, line, qname);
55 this.schemaPath = path;
56 constraints = new ConstraintsBuilderImpl(moduleName, line);
59 public ChoiceBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
60 final ChoiceSchemaNode base) {
61 super(moduleName, line, qname);
62 this.schemaPath = path;
63 constraints = new ConstraintsBuilderImpl(moduleName, line, base.getConstraints());
65 description = base.getDescription();
66 reference = base.getReference();
67 status = base.getStatus();
68 augmenting = base.isAugmenting();
69 addedByUses = base.isAddedByUses();
71 configuration = base.isConfiguration();
72 augmentations.addAll(base.getAvailableAugmentations());
74 Set<DataSchemaNodeBuilder> wrapped = BuilderUtils.wrapChildNodes(moduleName, line, new HashSet<DataSchemaNode>(
75 base.getCases()), path, qname);
76 for (DataSchemaNodeBuilder wrap : wrapped) {
77 if (wrap instanceof ChoiceCaseBuilder) {
78 caseBuilders.add((ChoiceCaseBuilder) wrap);
82 addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path,
87 public ChoiceSchemaNode build() {
88 if (instance != null) {
92 instance = new ChoiceSchemaNodeImpl(qname, schemaPath);
94 instance.description = description;
95 instance.reference = reference;
96 instance.status = status;
97 instance.augmenting = augmenting;
98 instance.addedByUses = addedByUses;
99 instance.configuration = configuration;
101 instance.constraints = constraints.build();
102 instance.defaultCase = defaultCase;
105 if (originalNode == null && originalBuilder != null) {
106 originalNode = originalBuilder.build();
108 instance.original = originalNode;
111 final Set<ChoiceCaseNode> cases = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
112 for (ChoiceCaseBuilder caseBuilder : caseBuilders) {
113 cases.add(caseBuilder.build());
115 instance.cases = ImmutableSet.copyOf(cases);
118 for (AugmentationSchemaBuilder builder : augmentationBuilders) {
119 augmentations.add(builder.build());
121 instance.augmentations = ImmutableSet.copyOf(augmentations);
124 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
125 unknownNodes.add(b.build());
127 instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
132 public Set<ChoiceCaseBuilder> getCases() {
140 * name of case to search
141 * @return case with given name if present, null otherwise
143 public ChoiceCaseBuilder getCaseNodeByName(final String caseName) {
144 for (ChoiceCaseBuilder addedCase : caseBuilders) {
145 if (addedCase.getQName().getLocalName().equals(caseName)) {
153 * Add case node to this choice.
155 * If node is not declared with 'case' keyword, create new case builder and
156 * make this node child of newly created case.
161 public void addCase(final DataSchemaNodeBuilder caseNode) {
162 QName caseQName = caseNode.getQName();
163 String caseName = caseQName.getLocalName();
165 for (ChoiceCaseBuilder existingCase : caseBuilders) {
166 if (existingCase.getQName().getLocalName().equals(caseName)) {
167 throw new YangParseException(caseNode.getModuleName(), caseNode.getLine(), "Can not add '" + caseNode
168 + "' to node '" + qname.getLocalName() + "' in module '" + getModuleName()
169 + "': case with same name already declared at line " + existingCase.getLine());
173 if (caseNode instanceof ChoiceCaseBuilder) {
174 caseBuilders.add((ChoiceCaseBuilder) caseNode);
176 ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder(caseNode.getModuleName(), caseNode.getLine(),
177 caseQName, caseNode.getPath());
178 if (caseNode.isAugmenting()) {
179 // if node is added by augmentation, set case builder augmenting
180 // as true and node augmenting as false
181 caseBuilder.setAugmenting(true);
182 caseNode.setAugmenting(false);
184 SchemaPath newPath = caseNode.getPath().createChild(caseQName);
185 caseNode.setPath(newPath);
186 caseBuilder.addChildNode(caseNode);
187 caseBuilders.add(caseBuilder);
192 public boolean isAugmenting() {
197 public void setAugmenting(final boolean augmenting) {
198 this.augmenting = augmenting;
202 public boolean isAddedByUses() {
207 public void setAddedByUses(final boolean addedByUses) {
208 this.addedByUses = addedByUses;
212 public ChoiceBuilder getOriginal() {
213 return originalBuilder;
217 public void setOriginal(final SchemaNodeBuilder builder) {
218 Preconditions.checkArgument(builder instanceof ChoiceBuilder, "Original of choice cannot be " + builder);
219 this.originalBuilder = (ChoiceBuilder) builder;
223 public boolean isConfiguration() {
224 return configuration;
228 public void setConfiguration(final boolean configuration) {
229 this.configuration = configuration;
233 public ConstraintsBuilder getConstraints() {
238 public void addAugmentation(final AugmentationSchemaBuilder augment) {
239 augmentationBuilders.add(augment);
242 public List<AugmentationSchemaBuilder> getAugmentationBuilders() {
243 return augmentationBuilders;
246 public String getDefaultCase() {
250 public void setDefaultCase(final String defaultCase) {
251 this.defaultCase = defaultCase;
255 public int hashCode() {
256 final int prime = 31;
258 result = prime * result + Objects.hashCode(schemaPath);
263 public boolean equals(final Object obj) {
270 if (getClass() != obj.getClass()) {
273 ChoiceBuilder other = (ChoiceBuilder) obj;
274 if (schemaPath == null) {
275 if (other.schemaPath != null) {
278 } else if (!schemaPath.equals(other.schemaPath)) {
281 if (getParent() == null) {
282 if (other.getParent() != null) {
285 } else if (!getParent().equals(other.getParent())) {
292 public String toString() {
293 return "choice " + qname.getLocalName();