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.List;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
19 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
20 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
21 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
23 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
24 import org.opendaylight.yangtools.yang.model.api.Status;
25 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
26 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.UsesNode;
28 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
29 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
33 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
34 import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
35 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
37 import com.google.common.base.Preconditions;
38 import com.google.common.collect.ImmutableList;
39 import com.google.common.collect.ImmutableSet;
41 public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder implements DataSchemaNodeBuilder,
42 AugmentationTargetBuilder {
43 private ChoiceCaseNodeImpl instance;
45 private SchemaPath schemaPath;
46 private String description;
47 private String reference;
48 private Status status = Status.CURRENT;
49 // DataSchemaNode args
50 private boolean augmenting;
51 private boolean addedByUses;
52 private final ConstraintsBuilder constraints;
53 // AugmentationTarget args
54 private final List<AugmentationSchema> augmentations = new ArrayList<>();
55 private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
57 public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
58 super(moduleName, line, qname);
59 this.schemaPath = path;
60 constraints = new ConstraintsBuilder(moduleName, line);
63 public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
64 final ChoiceCaseNode base) {
65 super(moduleName, line, qname);
66 this.schemaPath = path;
67 constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
69 description = base.getDescription();
70 reference = base.getReference();
71 status = base.getStatus();
72 augmenting = base.isAugmenting();
73 addedByUses = base.isAddedByUses();
75 URI ns = qname.getNamespace();
76 Date rev = qname.getRevision();
77 String pref = qname.getPrefix();
78 addedChildNodes.addAll(ParserUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref));
79 addedGroupings.addAll(ParserUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref));
80 addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
83 augmentations.addAll(base.getAvailableAugmentations());
84 usesNodes.addAll(base.getUses());
88 public ChoiceCaseNode build() {
89 if (instance != null) {
93 instance = new ChoiceCaseNodeImpl(qname, schemaPath);
95 instance.description = description;
96 instance.reference = reference;
97 instance.status = status;
98 instance.augmenting = augmenting;
99 instance.addedByUses = addedByUses;
101 instance.constraints = constraints.build();
104 for (DataSchemaNodeBuilder node : addedChildNodes) {
105 childNodes.put(node.getQName(), node.build());
107 instance.childNodes = ImmutableSet.copyOf(childNodes.values());
110 for (UsesNodeBuilder builder : addedUsesNodes) {
111 usesNodes.add(builder.build());
113 instance.uses = ImmutableSet.copyOf(usesNodes);
116 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
117 unknownNodes.add(b.build());
119 instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
122 for (AugmentationSchemaBuilder builder : augmentationBuilders) {
123 augmentations.add(builder.build());
125 instance.augmentations = ImmutableSet.copyOf(augmentations);
131 public SchemaPath getPath() {
136 public void setPath(final SchemaPath path) {
137 this.schemaPath = path;
141 public String getDescription() {
146 public void setDescription(final String description) {
147 this.description = description;
151 public String getReference() {
156 public void setReference(final String reference) {
157 this.reference = reference;
161 public Status getStatus() {
166 public void setStatus(final Status status) {
167 this.status = Preconditions.checkNotNull(status, "status cannot be null");
171 public boolean isAugmenting() {
176 public void setAugmenting(final boolean augmenting) {
177 this.augmenting = augmenting;
181 public boolean isAddedByUses() {
186 public void setAddedByUses(final boolean addedByUses) {
187 this.addedByUses = addedByUses;
191 public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
192 return Collections.emptySet();
196 public void addTypedef(final TypeDefinitionBuilder typedefBuilder) {
197 throw new YangParseException(getModuleName(), typedefBuilder.getLine(), "Can not add type definition to choice case.");
201 public boolean isConfiguration() {
206 public void setConfiguration(final boolean configuration) {
207 throw new YangParseException(getModuleName(), getLine(), "Can not add config statement to choice case.");
211 public ConstraintsBuilder getConstraints() {
216 public void addAugmentation(final AugmentationSchemaBuilder augment) {
217 augmentationBuilders.add(augment);
221 public int hashCode() {
222 final int prime = 31;
224 result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
229 public boolean equals(final Object obj) {
236 if (getClass() != obj.getClass()) {
239 ChoiceCaseBuilder other = (ChoiceCaseBuilder) obj;
240 if (schemaPath == null) {
241 if (other.schemaPath != null) {
244 } else if (!schemaPath.equals(other.schemaPath)) {
247 if (getParent() == null) {
248 if (other.getParent() != null) {
251 } else if (!getParent().equals(other.getParent())) {
258 public String toString() {
259 return "case " + getQName().getLocalName();
262 private static final class ChoiceCaseNodeImpl implements ChoiceCaseNode {
263 private final QName qname;
264 private final SchemaPath path;
265 private String description;
266 private String reference;
267 private Status status = Status.CURRENT;
268 private boolean augmenting;
269 private boolean addedByUses;
270 private ConstraintDefinition constraints;
271 private ImmutableSet<DataSchemaNode> childNodes;
272 private ImmutableSet<AugmentationSchema> augmentations;
273 private ImmutableSet<UsesNode> uses;
274 private ImmutableList<UnknownSchemaNode> unknownNodes;
276 private ChoiceCaseNodeImpl(final QName qname, final SchemaPath path) {
282 public QName getQName() {
287 public SchemaPath getPath() {
292 public String getDescription() {
297 public String getReference() {
302 public Status getStatus() {
307 public boolean isConfiguration() {
312 public ConstraintDefinition getConstraints() {
317 public boolean isAugmenting() {
322 public boolean isAddedByUses() {
327 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
332 * Always returns an empty set, because case node can not contains type
336 public Set<TypeDefinition<?>> getTypeDefinitions() {
337 return Collections.emptySet();
341 public Set<DataSchemaNode> getChildNodes() {
346 public Set<GroupingDefinition> getGroupings() {
347 return Collections.emptySet();
351 public DataSchemaNode getDataChildByName(final QName name) {
352 return getChildNode(childNodes, name);
356 public DataSchemaNode getDataChildByName(final String name) {
357 return getChildNode(childNodes, name);
361 public Set<UsesNode> getUses() {
366 public Set<AugmentationSchema> getAvailableAugmentations() {
367 return augmentations;
371 public int hashCode() {
372 final int prime = 31;
374 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
375 result = prime * result + ((path == null) ? 0 : path.hashCode());
380 public boolean equals(final Object obj) {
387 if (getClass() != obj.getClass()) {
390 ChoiceCaseNodeImpl other = (ChoiceCaseNodeImpl) obj;
392 if (other.qname != null) {
395 } else if (!qname.equals(other.qname)) {
399 if (other.path != null) {
402 } else if (!path.equals(other.path)) {
409 public String toString() {
410 StringBuilder sb = new StringBuilder(ChoiceCaseNodeImpl.class.getSimpleName());
415 return sb.toString();