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;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.Date;
14 import java.util.HashSet;
15 import java.util.List;
17 import java.util.TreeSet;
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.model.api.*;
21 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
22 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
23 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
27 import org.opendaylight.yangtools.yang.parser.util.Comparators;
28 import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
29 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
31 public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder implements DataSchemaNodeBuilder,
32 AugmentationTargetBuilder {
33 private boolean isBuilt;
34 private final ChoiceCaseNodeImpl instance;
36 private SchemaPath schemaPath;
37 private final ConstraintsBuilder constraints;
38 // AugmentationTarget args
39 private final List<AugmentationSchema> augmentations = new ArrayList<>();
40 private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
42 public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
43 super(moduleName, line, qname);
44 this.schemaPath = path;
45 instance = new ChoiceCaseNodeImpl(qname, path);
46 constraints = new ConstraintsBuilder(moduleName, line);
49 public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path, final ChoiceCaseNode base) {
50 super(moduleName, line, qname);
51 this.schemaPath = path;
52 instance = new ChoiceCaseNodeImpl(qname, path);
53 constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
55 instance.description = base.getDescription();
56 instance.reference = base.getReference();
57 instance.status = base.getStatus();
58 instance.augmenting = base.isAugmenting();
59 instance.addedByUses = base.isAddedByUses();
60 instance.constraints = base.getConstraints();
61 instance.augmentations.addAll(base.getAvailableAugmentations());
63 URI ns = qname.getNamespace();
64 Date rev = qname.getRevision();
65 String pref = qname.getPrefix();
66 addedChildNodes.addAll(ParserUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref));
67 addedGroupings.addAll(ParserUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref));
69 instance.uses.addAll(base.getUses());
70 instance.unknownNodes.addAll(base.getUnknownSchemaNodes());
74 public ChoiceCaseNode build() {
76 instance.setConstraints(constraints.build());
79 for (DataSchemaNodeBuilder node : addedChildNodes) {
80 childNodes.add(node.build());
82 instance.addChildNodes(childNodes);
85 for (UsesNodeBuilder builder : addedUsesNodes) {
86 usesNodes.add(builder.build());
88 instance.addUses(usesNodes);
91 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
92 unknownNodes.add(b.build());
94 Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
95 instance.addUnknownSchemaNodes(unknownNodes);
98 for (AugmentationSchemaBuilder builder : augmentationBuilders) {
99 augmentations.add(builder.build());
101 instance.addAvailableAugmentations(new HashSet<>(augmentations));
111 public SchemaPath getPath() {
112 return instance.path;
116 public void setPath(SchemaPath path) {
117 instance.path = path;
120 public String getDescription() {
121 return instance.description;
125 public void setDescription(final String description) {
126 instance.description = description;
129 public String getReference() {
130 return instance.reference;
134 public void setReference(String reference) {
135 instance.reference = reference;
138 public Status getStatus() {
139 return instance.status;
143 public void setStatus(Status status) {
144 if (status != null) {
145 instance.status = status;
150 public boolean isAugmenting() {
151 return instance.augmenting;
155 public void setAugmenting(boolean augmenting) {
156 instance.augmenting = augmenting;
160 public boolean isAddedByUses() {
161 return instance.addedByUses;
165 public void setAddedByUses(boolean addedByUses) {
166 instance.addedByUses = addedByUses;
170 public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
171 return Collections.emptySet();
175 public void addTypedef(TypeDefinitionBuilder typedefBuilder) {
176 throw new YangParseException(moduleName, line, "Can not add type definition to choice case.");
180 public Boolean isConfiguration() {
185 public void setConfiguration(final Boolean configuration) {
186 throw new YangParseException(moduleName, line, "Can not add config statement to choice case.");
190 public ConstraintsBuilder getConstraints() {
195 public void addAugmentation(AugmentationSchemaBuilder augment) {
196 augmentationBuilders.add(augment);
200 public int hashCode() {
201 final int prime = 31;
203 result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
208 public boolean equals(Object obj) {
215 if (getClass() != obj.getClass()) {
218 ChoiceCaseBuilder other = (ChoiceCaseBuilder) obj;
219 if (schemaPath == null) {
220 if (other.schemaPath != null) {
223 } else if (!schemaPath.equals(other.schemaPath)) {
226 if (parentBuilder == null) {
227 if (other.parentBuilder != null) {
230 } else if (!parentBuilder.equals(other.parentBuilder)) {
237 public String toString() {
238 return "case " + getQName().getLocalName();
241 public final class ChoiceCaseNodeImpl implements ChoiceCaseNode {
242 private final QName qname;
243 private SchemaPath path;
244 private String description;
245 private String reference;
246 private Status status = Status.CURRENT;
247 private boolean augmenting;
248 private boolean addedByUses;
249 private ConstraintDefinition constraints;
250 private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
251 private final Set<AugmentationSchema> augmentations = new HashSet<>();
252 private final Set<UsesNode> uses = new HashSet<>();
253 private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
255 private ChoiceCaseNodeImpl(QName qname, SchemaPath path) {
261 public QName getQName() {
266 public SchemaPath getPath() {
271 public String getDescription() {
276 public String getReference() {
281 public Status getStatus() {
286 public boolean isConfiguration() {
291 public ConstraintDefinition getConstraints() {
295 private void setConstraints(ConstraintDefinition constraints) {
296 this.constraints = constraints;
300 public boolean isAugmenting() {
305 public boolean isAddedByUses() {
310 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
311 return Collections.unmodifiableList(unknownNodes);
314 private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
315 if (unknownNodes != null) {
316 this.unknownNodes.addAll(unknownNodes);
321 * Always returns an empty set, because case node can not contains type
325 public Set<TypeDefinition<?>> getTypeDefinitions() {
326 return Collections.emptySet();
330 public Set<DataSchemaNode> getChildNodes() {
331 return Collections.unmodifiableSet(childNodes);
334 private void addChildNodes(Set<DataSchemaNode> childNodes) {
335 if (childNodes != null) {
336 this.childNodes.addAll(childNodes);
341 public Set<GroupingDefinition> getGroupings() {
342 return Collections.emptySet();
346 public DataSchemaNode getDataChildByName(QName name) {
347 return getChildNode(childNodes, name);
351 public DataSchemaNode getDataChildByName(String name) {
352 return getChildNode(childNodes, name);
356 public Set<UsesNode> getUses() {
357 return Collections.unmodifiableSet(uses);
360 private void addUses(Set<UsesNode> uses) {
362 this.uses.addAll(uses);
367 public Set<AugmentationSchema> getAvailableAugmentations() {
368 return Collections.unmodifiableSet(augmentations);
371 private void addAvailableAugmentations(Set<AugmentationSchema> augmentations) {
372 if (augmentations != null) {
373 this.augmentations.addAll(augmentations);
378 public int hashCode() {
379 final int prime = 31;
381 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
382 result = prime * result + ((path == null) ? 0 : path.hashCode());
387 public boolean equals(Object obj) {
394 if (getClass() != obj.getClass()) {
397 ChoiceCaseNodeImpl other = (ChoiceCaseNodeImpl) obj;
399 if (other.qname != null) {
402 } else if (!qname.equals(other.qname)) {
406 if (other.path != null) {
409 } else if (!path.equals(other.path)) {
416 public String toString() {
417 StringBuilder sb = new StringBuilder(ChoiceCaseNodeImpl.class.getSimpleName());
422 return sb.toString();