1 package org.opendaylight.yangtools.yang.parser.builder.impl;
4 import java.util.ArrayList;
5 import java.util.Collections;
7 import java.util.HashMap;
8 import java.util.HashSet;
13 import org.opendaylight.yangtools.yang.common.QName;
14 import org.opendaylight.yangtools.yang.model.api.*;
15 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
16 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
17 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
18 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
19 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
20 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
21 import org.opendaylight.yangtools.yang.parser.util.Comparators;
22 import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
23 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
25 public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder implements DataSchemaNodeBuilder,
26 AugmentationTargetBuilder {
27 private boolean isBuilt;
28 private final ChoiceCaseNodeImpl instance;
30 private SchemaPath schemaPath;
31 private final ConstraintsBuilder constraints;
32 // AugmentationTarget args
33 private final List<AugmentationSchema> augmentations = new ArrayList<>();
34 private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
36 public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
37 super(moduleName, line, qname);
38 this.schemaPath = path;
39 instance = new ChoiceCaseNodeImpl(qname, path);
40 constraints = new ConstraintsBuilder(moduleName, line);
43 public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path, final ChoiceCaseNode base) {
44 super(moduleName, line, qname);
45 this.schemaPath = path;
46 instance = new ChoiceCaseNodeImpl(qname, path);
47 constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
49 instance.description = base.getDescription();
50 instance.reference = base.getReference();
51 instance.status = base.getStatus();
52 instance.augmenting = base.isAugmenting();
53 instance.addedByUses = base.isAddedByUses();
54 instance.constraints = base.getConstraints();
55 instance.augmentations.addAll(base.getAvailableAugmentations());
57 URI ns = qname.getNamespace();
58 Date rev = qname.getRevision();
59 String pref = qname.getPrefix();
60 addedChildNodes.addAll(ParserUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref));
61 addedGroupings.addAll(ParserUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref));
63 instance.uses.addAll(base.getUses());
64 instance.unknownNodes.addAll(base.getUnknownSchemaNodes());
68 public ChoiceCaseNode build() {
70 instance.setConstraints(constraints.build());
73 for (DataSchemaNodeBuilder node : addedChildNodes) {
74 DataSchemaNode child = node.build();
75 childNodes.put(child.getQName(), child);
77 instance.addChildNodes(childNodes);
80 for (UsesNodeBuilder builder : addedUsesNodes) {
81 usesNodes.add(builder.build());
83 instance.addUses(usesNodes);
86 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
87 unknownNodes.add(b.build());
89 Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
90 instance.addUnknownSchemaNodes(unknownNodes);
93 for (AugmentationSchemaBuilder builder : augmentationBuilders) {
94 augmentations.add(builder.build());
96 instance.addAvailableAugmentations(new HashSet<>(augmentations));
106 public SchemaPath getPath() {
107 return instance.path;
111 public void setPath(SchemaPath path) {
112 instance.path = path;
115 public String getDescription() {
116 return instance.description;
120 public void setDescription(final String description) {
121 instance.description = description;
124 public String getReference() {
125 return instance.reference;
129 public void setReference(String reference) {
130 instance.reference = reference;
133 public Status getStatus() {
134 return instance.status;
138 public void setStatus(Status status) {
139 if (status != null) {
140 instance.status = status;
145 public boolean isAugmenting() {
146 return instance.augmenting;
150 public void setAugmenting(boolean augmenting) {
151 instance.augmenting = augmenting;
155 public boolean isAddedByUses() {
156 return instance.addedByUses;
160 public void setAddedByUses(boolean addedByUses) {
161 instance.addedByUses = addedByUses;
165 public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
166 return Collections.emptySet();
170 public void addTypedef(TypeDefinitionBuilder typedefBuilder) {
171 throw new YangParseException(moduleName, line, "Can not add type definition to choice case.");
175 public Boolean isConfiguration() {
180 public void setConfiguration(final Boolean configuration) {
181 throw new YangParseException(moduleName, line, "Can not add config statement to choice case.");
185 public ConstraintsBuilder getConstraints() {
190 public void addAugmentation(AugmentationSchemaBuilder augment) {
191 augmentationBuilders.add(augment);
195 public int hashCode() {
196 final int prime = 31;
198 result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
203 public boolean equals(Object obj) {
210 if (getClass() != obj.getClass()) {
213 ChoiceCaseBuilder other = (ChoiceCaseBuilder) obj;
214 if (schemaPath == null) {
215 if (other.schemaPath != null) {
218 } else if (!schemaPath.equals(other.schemaPath)) {
221 if (parentBuilder == null) {
222 if (other.parentBuilder != null) {
225 } else if (!parentBuilder.equals(other.parentBuilder)) {
232 public String toString() {
233 return "case " + getQName().getLocalName();
236 public final class ChoiceCaseNodeImpl implements ChoiceCaseNode {
237 private final QName qname;
238 private SchemaPath path;
239 private String description;
240 private String reference;
241 private Status status = Status.CURRENT;
242 private boolean augmenting;
243 private boolean addedByUses;
244 private ConstraintDefinition constraints;
245 private final Map<QName, DataSchemaNode> childNodes = new HashMap<>();
246 private final Set<AugmentationSchema> augmentations = new HashSet<>();
247 private final Set<UsesNode> uses = new HashSet<>();
248 private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
250 private ChoiceCaseNodeImpl(QName qname, SchemaPath path) {
256 public QName getQName() {
261 public SchemaPath getPath() {
266 public String getDescription() {
271 public String getReference() {
276 public Status getStatus() {
281 public boolean isConfiguration() {
286 public ConstraintDefinition getConstraints() {
290 private void setConstraints(ConstraintDefinition constraints) {
291 this.constraints = constraints;
295 public boolean isAugmenting() {
300 public boolean isAddedByUses() {
305 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
306 return Collections.unmodifiableList(unknownNodes);
309 private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
310 if (unknownNodes != null) {
311 this.unknownNodes.addAll(unknownNodes);
316 * Always returns an empty set, because case node can not contains type
320 public Set<TypeDefinition<?>> getTypeDefinitions() {
321 return Collections.emptySet();
325 public Set<DataSchemaNode> getChildNodes() {
326 return Collections.unmodifiableSet(new HashSet<>(childNodes.values()));
329 private void addChildNodes(Map<QName, DataSchemaNode> childNodes) {
330 if (childNodes != null) {
331 this.childNodes.putAll(childNodes);
336 public Set<GroupingDefinition> getGroupings() {
337 return Collections.emptySet();
341 public DataSchemaNode getDataChildByName(QName name) {
342 return childNodes.get(name);
346 public DataSchemaNode getDataChildByName(String name) {
347 DataSchemaNode result = null;
348 for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
349 if (entry.getKey().getLocalName().equals(name)) {
350 result = entry.getValue();
358 public Set<UsesNode> getUses() {
359 return Collections.unmodifiableSet(uses);
362 private void addUses(Set<UsesNode> uses) {
364 this.uses.addAll(uses);
369 public Set<AugmentationSchema> getAvailableAugmentations() {
370 return Collections.unmodifiableSet(augmentations);
373 private void addAvailableAugmentations(Set<AugmentationSchema> augmentations) {
374 if (augmentations != null) {
375 this.augmentations.addAll(augmentations);
380 public int hashCode() {
381 final int prime = 31;
383 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
384 result = prime * result + ((path == null) ? 0 : path.hashCode());
389 public boolean equals(Object obj) {
396 if (getClass() != obj.getClass()) {
399 ChoiceCaseNodeImpl other = (ChoiceCaseNodeImpl) obj;
401 if (other.qname != null) {
404 } else if (!qname.equals(other.qname)) {
408 if (other.path != null) {
411 } else if (!path.equals(other.path)) {
418 public String toString() {
419 StringBuilder sb = new StringBuilder(ChoiceCaseNodeImpl.class.getSimpleName());
424 return sb.toString();