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.AugmentationSchema;
21 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
22 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
23 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
25 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
26 import org.opendaylight.yangtools.yang.model.api.Status;
27 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
28 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.UsesNode;
30 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
33 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
34 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
35 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
36 import org.opendaylight.yangtools.yang.parser.util.Comparators;
37 import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
38 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
40 public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder implements DataSchemaNodeBuilder,
41 AugmentationTargetBuilder {
42 private boolean isBuilt;
43 private final ChoiceCaseNodeImpl instance;
45 private final SchemaPath schemaPath;
46 private final ConstraintsBuilder constraints;
47 // AugmentationTarget args
48 private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
50 public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
51 super(moduleName, line, qname);
52 this.schemaPath = path;
53 instance = new ChoiceCaseNodeImpl(qname, path);
54 constraints = new ConstraintsBuilder(moduleName, line);
57 public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path, final ChoiceCaseNode base) {
58 super(moduleName, line, qname);
59 this.schemaPath = path;
60 instance = new ChoiceCaseNodeImpl(qname, path);
61 constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
63 instance.description = base.getDescription();
64 instance.reference = base.getReference();
65 instance.status = base.getStatus();
66 instance.augmenting = base.isAugmenting();
67 instance.addedByUses = base.isAddedByUses();
68 instance.constraints = base.getConstraints();
69 instance.augmentations.addAll(base.getAvailableAugmentations());
71 URI ns = qname.getNamespace();
72 Date rev = qname.getRevision();
73 String pref = qname.getPrefix();
74 addedChildNodes.addAll(ParserUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref));
75 addedGroupings.addAll(ParserUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref));
77 instance.uses.addAll(base.getUses());
78 instance.unknownNodes.addAll(base.getUnknownSchemaNodes());
82 public ChoiceCaseNode build() {
84 instance.setConstraints(constraints.build());
87 for (DataSchemaNodeBuilder node : addedChildNodes) {
88 childNodes.add(node.build());
90 instance.addChildNodes(childNodes);
93 for (UsesNodeBuilder builder : addedUsesNodes) {
94 usesNodes.add(builder.build());
96 instance.addUses(usesNodes);
99 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
100 unknownNodes.add(b.build());
102 Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
103 instance.addUnknownSchemaNodes(unknownNodes);
106 final Set<AugmentationSchema> augmentations = new HashSet<>();
107 for (AugmentationSchemaBuilder builder : augmentationBuilders) {
108 augmentations.add(builder.build());
110 instance.addAvailableAugmentations(augmentations);
120 public SchemaPath getPath() {
121 return instance.path;
125 public void setPath(final SchemaPath path) {
126 instance.path = path;
130 public String getDescription() {
131 return instance.description;
135 public void setDescription(final String description) {
136 instance.description = description;
140 public String getReference() {
141 return instance.reference;
145 public void setReference(final String reference) {
146 instance.reference = reference;
150 public Status getStatus() {
151 return instance.status;
155 public void setStatus(final Status status) {
156 if (status != null) {
157 instance.status = status;
162 public boolean isAugmenting() {
163 return instance.augmenting;
167 public void setAugmenting(final boolean augmenting) {
168 instance.augmenting = augmenting;
172 public boolean isAddedByUses() {
173 return instance.addedByUses;
177 public void setAddedByUses(final boolean addedByUses) {
178 instance.addedByUses = addedByUses;
182 public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
183 return Collections.emptySet();
187 public void addTypedef(final TypeDefinitionBuilder typedefBuilder) {
188 throw new YangParseException(moduleName, line, "Can not add type definition to choice case.");
192 public boolean isConfiguration() {
197 public void setConfiguration(final boolean configuration) {
198 throw new YangParseException(moduleName, line, "Can not add config statement to choice case.");
202 public ConstraintsBuilder getConstraints() {
207 public void addAugmentation(final AugmentationSchemaBuilder augment) {
208 augmentationBuilders.add(augment);
212 public int hashCode() {
213 final int prime = 31;
215 result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
220 public boolean equals(final Object obj) {
227 if (getClass() != obj.getClass()) {
230 ChoiceCaseBuilder other = (ChoiceCaseBuilder) obj;
231 if (schemaPath == null) {
232 if (other.schemaPath != null) {
235 } else if (!schemaPath.equals(other.schemaPath)) {
238 if (parentBuilder == null) {
239 if (other.parentBuilder != null) {
242 } else if (!parentBuilder.equals(other.parentBuilder)) {
249 public String toString() {
250 return "case " + getQName().getLocalName();
253 private static final class ChoiceCaseNodeImpl implements ChoiceCaseNode {
254 private final QName qname;
255 private SchemaPath path;
256 private String description;
257 private String reference;
258 private Status status = Status.CURRENT;
259 private boolean augmenting;
260 private boolean addedByUses;
261 private ConstraintDefinition constraints;
262 private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
263 private final Set<AugmentationSchema> augmentations = new HashSet<>();
264 private final Set<UsesNode> uses = new HashSet<>();
265 private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
267 private ChoiceCaseNodeImpl(final QName qname, final SchemaPath path) {
273 public QName getQName() {
278 public SchemaPath getPath() {
283 public String getDescription() {
288 public String getReference() {
293 public Status getStatus() {
298 public boolean isConfiguration() {
303 public ConstraintDefinition getConstraints() {
307 private void setConstraints(final ConstraintDefinition constraints) {
308 this.constraints = constraints;
312 public boolean isAugmenting() {
317 public boolean isAddedByUses() {
322 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
323 return Collections.unmodifiableList(unknownNodes);
326 private void addUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {
327 if (unknownNodes != null) {
328 this.unknownNodes.addAll(unknownNodes);
333 * Always returns an empty set, because case node can not contains type
337 public Set<TypeDefinition<?>> getTypeDefinitions() {
338 return Collections.emptySet();
342 public Set<DataSchemaNode> getChildNodes() {
343 return Collections.unmodifiableSet(childNodes);
346 private void addChildNodes(final Set<DataSchemaNode> childNodes) {
347 if (childNodes != null) {
348 this.childNodes.addAll(childNodes);
353 public Set<GroupingDefinition> getGroupings() {
354 return Collections.emptySet();
358 public DataSchemaNode getDataChildByName(final QName name) {
359 return getChildNode(childNodes, name);
363 public DataSchemaNode getDataChildByName(final String name) {
364 return getChildNode(childNodes, name);
368 public Set<UsesNode> getUses() {
369 return Collections.unmodifiableSet(uses);
372 private void addUses(final Set<UsesNode> uses) {
374 this.uses.addAll(uses);
379 public Set<AugmentationSchema> getAvailableAugmentations() {
380 return Collections.unmodifiableSet(augmentations);
383 private void addAvailableAugmentations(final Set<AugmentationSchema> augmentations) {
384 if (augmentations != null) {
385 this.augmentations.addAll(augmentations);
390 public int hashCode() {
391 final int prime = 31;
393 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
394 result = prime * result + ((path == null) ? 0 : path.hashCode());
399 public boolean equals(final Object obj) {
406 if (getClass() != obj.getClass()) {
409 ChoiceCaseNodeImpl other = (ChoiceCaseNodeImpl) obj;
411 if (other.qname != null) {
414 } else if (!qname.equals(other.qname)) {
418 if (other.path != null) {
421 } else if (!path.equals(other.path)) {
428 public String toString() {
429 StringBuilder sb = new StringBuilder(ChoiceCaseNodeImpl.class.getSimpleName());
434 return sb.toString();