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;
11 import java.util.ArrayList;
12 import java.util.Date;
13 import java.util.List;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
18 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
19 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
20 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
22 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
23 import org.opendaylight.yangtools.yang.model.api.Status;
24 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
25 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.UsesNode;
27 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
29 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
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 ContainerSchemaNodeBuilder extends AbstractDataNodeContainerBuilder implements
42 AugmentationTargetBuilder, DataSchemaNodeBuilder {
43 private ContainerSchemaNodeImpl instance;
44 private boolean presence;
46 private SchemaPath path;
47 private String description;
48 private String reference;
49 private Status status = Status.CURRENT;
50 // DataSchemaNode args
51 private boolean augmenting;
52 private boolean addedByUses;
53 private boolean configuration;
54 private final ConstraintsBuilder constraints;
55 // AugmentationTarget args
56 private final List<AugmentationSchema> augmentations = new ArrayList<>();
57 private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
59 public ContainerSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
60 super(moduleName, line, qname);
62 this.constraints = new ConstraintsBuilder(moduleName, line);
65 // constructor for uses
66 public ContainerSchemaNodeBuilder(final String moduleName, final int line, final QName qname,
67 final SchemaPath path, final ContainerSchemaNode base) {
68 super(moduleName, line, qname);
70 constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
72 description = base.getDescription();
73 reference = base.getReference();
74 status = base.getStatus();
75 augmenting = base.isAugmenting();
76 addedByUses = base.isAddedByUses();
77 configuration = base.isConfiguration();
78 presence = base.isPresenceContainer();
80 URI ns = qname.getNamespace();
81 Date rev = qname.getRevision();
82 String pref = qname.getPrefix();
83 addedChildNodes.addAll(ParserUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref));
84 addedGroupings.addAll(ParserUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref));
85 addedTypedefs.addAll(ParserUtils.wrapTypedefs(moduleName, line, base, path, ns, rev, pref));
86 addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
89 augmentations.addAll(base.getAvailableAugmentations());
90 usesNodes.addAll(base.getUses());
94 public ContainerSchemaNode build() {
95 if (instance != null) {
99 instance = new ContainerSchemaNodeImpl(qname, path);
101 instance.description = description;
102 instance.reference = reference;
103 instance.status = status;
104 instance.augmenting = augmenting;
105 instance.addedByUses = addedByUses;
106 instance.configuration = configuration;
107 instance.constraints = constraints.build();
108 instance.presence = presence;
111 for (DataSchemaNodeBuilder node : addedChildNodes) {
112 childNodes.put(node.getQName(), node.build());
114 instance.childNodes = ImmutableSet.copyOf(childNodes.values());
117 for (GroupingBuilder builder : addedGroupings) {
118 groupings.add(builder.build());
120 instance.groupings = ImmutableSet.copyOf(groupings);
123 for (TypeDefinitionBuilder entry : addedTypedefs) {
124 typedefs.add(entry.build());
126 instance.typeDefinitions = ImmutableSet.copyOf(typedefs);
129 for (UsesNodeBuilder builder : addedUsesNodes) {
130 usesNodes.add(builder.build());
132 instance.uses = ImmutableSet.copyOf(usesNodes);
135 for (AugmentationSchemaBuilder builder : augmentationBuilders) {
136 augmentations.add(builder.build());
138 instance.augmentations = ImmutableSet.copyOf(augmentations);
141 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
142 unknownNodes.add(b.build());
144 instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
150 public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
151 return addedTypedefs;
155 public void addTypedef(final TypeDefinitionBuilder type) {
156 String typeName = type.getQName().getLocalName();
157 for (TypeDefinitionBuilder addedTypedef : addedTypedefs) {
158 if (addedTypedef.getQName().getLocalName().equals(typeName)) {
159 throw new YangParseException(getModuleName(), type.getLine(), "Can not add typedef '" + typeName
160 + "': typedef with same name already declared at line " + addedTypedef.getLine());
163 addedTypedefs.add(type);
166 public List<AugmentationSchemaBuilder> getAugmentationBuilders() {
167 return augmentationBuilders;
171 public void addAugmentation(final AugmentationSchemaBuilder augment) {
172 augmentationBuilders.add(augment);
176 public SchemaPath getPath() {
181 public void setPath(final SchemaPath path) {
186 public String getDescription() {
191 public void setDescription(final String description) {
192 this.description = description;
196 public String getReference() {
201 public void setReference(final String reference) {
202 this.reference = reference;
206 public Status getStatus() {
211 public void setStatus(final Status status) {
212 this.status = Preconditions.checkNotNull(status, "status cannot be null");
216 public boolean isAugmenting() {
221 public void setAugmenting(final boolean augmenting) {
222 this.augmenting = augmenting;
226 public boolean isAddedByUses() {
231 public void setAddedByUses(final boolean addedByUses) {
232 this.addedByUses = addedByUses;
236 public boolean isConfiguration() {
237 return configuration;
241 public void setConfiguration(final boolean configuration) {
242 this.configuration = configuration;
246 public ConstraintsBuilder getConstraints() {
250 public boolean isPresence() {
254 public void setPresence(final boolean presence) {
255 this.presence = presence;
259 public int hashCode() {
260 final int prime = 31;
262 result = prime * result + ((path == null) ? 0 : path.hashCode());
267 public boolean equals(final Object obj) {
274 if (getClass() != obj.getClass()) {
277 ContainerSchemaNodeBuilder other = (ContainerSchemaNodeBuilder) obj;
279 if (other.path != null) {
282 } else if (!path.equals(other.path)) {
285 // FIXME: Do we really need this? This actually triggers equals
286 // up to the root builder.
287 if (getParent() == null) {
288 if (other.getParent() != null) {
291 } else if (!getParent().equals(other.getParent())) {
298 public String toString() {
299 return "container " + qname.getLocalName();
302 private static final class ContainerSchemaNodeImpl implements ContainerSchemaNode {
303 private final QName qname;
304 private final SchemaPath path;
305 private String description;
306 private String reference;
307 private Status status;
308 private boolean augmenting;
309 private boolean addedByUses;
310 private boolean configuration;
311 private ConstraintDefinition constraints;
313 private ImmutableSet<AugmentationSchema> augmentations;
314 private ImmutableSet<DataSchemaNode> childNodes;
315 private ImmutableSet<GroupingDefinition> groupings;
316 private ImmutableSet<TypeDefinition<?>> typeDefinitions;
317 private ImmutableSet<UsesNode> uses;
318 private ImmutableList<UnknownSchemaNode> unknownNodes;
320 private boolean presence;
322 private ContainerSchemaNodeImpl(final QName qname, final SchemaPath path) {
328 public QName getQName() {
333 public SchemaPath getPath() {
338 public String getDescription() {
343 public String getReference() {
348 public Status getStatus() {
353 public boolean isAugmenting() {
358 public boolean isAddedByUses() {
363 public boolean isConfiguration() {
364 return configuration;
368 public ConstraintDefinition getConstraints() {
373 public Set<AugmentationSchema> getAvailableAugmentations() {
374 return augmentations;
378 public Set<DataSchemaNode> getChildNodes() {
383 public Set<GroupingDefinition> getGroupings() {
388 public DataSchemaNode getDataChildByName(final QName name) {
389 return getChildNode(childNodes, name);
393 public DataSchemaNode getDataChildByName(final String name) {
394 return getChildNode(childNodes, name);
398 public Set<UsesNode> getUses() {
403 public boolean isPresenceContainer() {
408 public Set<TypeDefinition<?>> getTypeDefinitions() {
409 return typeDefinitions;
413 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
418 public int hashCode() {
419 final int prime = 31;
421 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
422 result = prime * result + ((path == null) ? 0 : path.hashCode());
427 public boolean equals(final Object obj) {
434 if (getClass() != obj.getClass()) {
437 ContainerSchemaNodeImpl other = (ContainerSchemaNodeImpl) obj;
439 if (other.qname != null) {
442 } else if (!qname.equals(other.qname)) {
446 if (other.path != null) {
449 } else if (!path.equals(other.path)) {
456 public String toString() {
457 return "container " + qname.getLocalName();