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;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashSet;
13 import java.util.List;
16 import java.util.TreeMap;
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.ConstraintDefinition;
22 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
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.GroupingBuilder;
35 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingMember;
36 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
37 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
38 import org.opendaylight.yangtools.yang.parser.util.Comparators;
39 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
41 public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerBuilder implements
42 AugmentationTargetBuilder, DataSchemaNodeBuilder, GroupingMember {
43 private boolean isBuilt;
44 private final ContainerSchemaNodeImpl instance;
47 private SchemaPath schemaPath;
48 private String description;
49 private String reference;
50 private Status status = Status.CURRENT;
51 // DataSchemaNode args
52 private boolean augmenting;
53 private boolean addedByUses;
54 private Boolean configuration;
55 private final ConstraintsBuilder constraints;
56 // DataNodeContainer args
57 private Set<TypeDefinition<?>> typedefs;
58 private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
59 private Set<UsesNode> usesNodes;
60 private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<UsesNodeBuilder>();
61 // AugmentationTarget args
62 private Set<AugmentationSchema> augmentations;
63 private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<AugmentationSchemaBuilder>();
64 // ContainerSchemaNode args
65 private boolean presence;
67 public ContainerSchemaNodeBuilder(final String moduleName, final int line, final QName qname,
68 final SchemaPath schemaPath) {
69 super(moduleName, line, qname);
70 this.schemaPath = schemaPath;
71 instance = new ContainerSchemaNodeImpl(qname);
72 constraints = new ConstraintsBuilder(moduleName, line);
76 public ContainerSchemaNode build() {
78 instance.setPath(schemaPath);
79 instance.setDescription(description);
80 instance.setReference(reference);
81 instance.setStatus(status);
82 instance.setPresenceContainer(presence);
83 instance.setAugmenting(augmenting);
84 instance.setAddedByUses(addedByUses);
86 // if this builder represents rpc input or output, it can has
87 // configuration value set to null
88 if (configuration == null) {
89 configuration = false;
91 instance.setConfiguration(configuration);
94 if (usesNodes == null) {
95 usesNodes = new HashSet<UsesNode>();
96 for (UsesNodeBuilder builder : addedUsesNodes) {
97 usesNodes.add(builder.build());
100 instance.setUses(usesNodes);
103 final Map<QName, DataSchemaNode> childs = new TreeMap<QName, DataSchemaNode>(Comparators.QNAME_COMP);
104 if (childNodes == null || childNodes.isEmpty()) {
105 for (DataSchemaNodeBuilder node : addedChildNodes) {
106 childs.put(node.getQName(), node.build());
109 for (DataSchemaNode node : childNodes) {
110 childs.put(node.getQName(), node);
113 instance.setChildNodes(childs);
116 if (groupings == null) {
117 groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);
118 for (GroupingBuilder builder : addedGroupings) {
119 groupings.add(builder.build());
122 instance.setGroupings(groupings);
125 if (typedefs == null) {
126 typedefs = new TreeSet<TypeDefinition<?>>(Comparators.SCHEMA_NODE_COMP);
127 for (TypeDefinitionBuilder entry : addedTypedefs) {
128 typedefs.add(entry.build());
131 instance.setTypeDefinitions(typedefs);
134 if (augmentations == null) {
135 augmentations = new HashSet<AugmentationSchema>();
136 for (AugmentationSchemaBuilder builder : addedAugmentations) {
137 augmentations.add(builder.build());
140 instance.setAvailableAugmentations(augmentations);
143 if (unknownNodes == null) {
144 unknownNodes = new ArrayList<UnknownSchemaNode>();
145 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
146 unknownNodes.add(b.build());
148 Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
150 instance.setUnknownSchemaNodes(unknownNodes);
152 instance.setConstraints(constraints.build());
153 instance.setAvailableAugmentations(augmentations);
161 public void rebuild() {
167 public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
168 return addedTypedefs;
172 public void addTypedef(final TypeDefinitionBuilder type) {
173 String typeName = type.getQName().getLocalName();
174 for (TypeDefinitionBuilder addedTypedef : addedTypedefs) {
175 throw new YangParseException(moduleName, type.getLine(), "Can not add typedef '" + typeName
176 + "': typedef with same name already declared at line " + addedTypedef.getLine());
178 addedTypedefs.add(type);
181 public void setTypedefs(final Set<TypeDefinition<?>> typedefs) {
182 this.typedefs = typedefs;
185 public Set<AugmentationSchemaBuilder> getAugmentations() {
186 return addedAugmentations;
190 public void addAugmentation(AugmentationSchemaBuilder augment) {
191 addedAugmentations.add(augment);
194 public void setAugmentations(final Set<AugmentationSchema> augmentations) {
195 this.augmentations = augmentations;
198 public SchemaPath getPath() {
203 public void setPath(final SchemaPath schemaPath) {
204 this.schemaPath = schemaPath;
208 public String getDescription() {
213 public void setDescription(final String description) {
214 this.description = description;
218 public String getReference() {
223 public void setReference(String reference) {
224 this.reference = reference;
228 public Status getStatus() {
233 public void setStatus(Status status) {
234 if (status != null) {
235 this.status = status;
240 public boolean isAugmenting() {
245 public void setAugmenting(boolean augmenting) {
246 this.augmenting = augmenting;
250 public boolean isAddedByUses() {
255 public void setAddedByUses(final boolean addedByUses) {
256 this.addedByUses = addedByUses;
260 public Boolean isConfiguration() {
261 return configuration;
265 public void setConfiguration(Boolean configuration) {
266 this.configuration = configuration;
270 public ConstraintsBuilder getConstraints() {
275 public Set<UsesNodeBuilder> getUsesNodes() {
276 return addedUsesNodes;
280 public void addUsesNode(UsesNodeBuilder usesNodeBuilder) {
281 addedUsesNodes.add(usesNodeBuilder);
284 public void setUsesnodes(final Set<UsesNode> usesNodes) {
285 this.usesNodes = usesNodes;
288 public boolean isPresence() {
292 public void setPresence(boolean presence) {
293 this.presence = presence;
297 public int hashCode() {
298 final int prime = 31;
300 result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
305 public boolean equals(Object obj) {
312 if (getClass() != obj.getClass()) {
315 ContainerSchemaNodeBuilder other = (ContainerSchemaNodeBuilder) obj;
316 if (schemaPath == null) {
317 if (other.schemaPath != null) {
320 } else if (!schemaPath.equals(other.schemaPath)) {
323 if (parent == null) {
324 if (other.parent != null) {
327 } else if (!parent.equals(other.parent)) {
334 public String toString() {
335 return "container " + qname.getLocalName();
338 public final class ContainerSchemaNodeImpl implements ContainerSchemaNode {
339 private final QName qname;
340 private SchemaPath path;
341 private String description;
342 private String reference;
343 private Status status = Status.CURRENT;
344 private boolean augmenting;
345 private boolean addedByUses;
346 private boolean configuration;
347 private ConstraintDefinition constraints;
348 private Set<AugmentationSchema> augmentations = Collections.emptySet();
349 private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
350 private Set<GroupingDefinition> groupings = Collections.emptySet();
351 private Set<TypeDefinition<?>> typeDefinitions = Collections.emptySet();
352 private Set<UsesNode> uses = Collections.emptySet();
353 private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
354 private boolean presence;
356 private ContainerSchemaNodeImpl(QName qname) {
361 public QName getQName() {
366 public SchemaPath getPath() {
370 private void setPath(SchemaPath path) {
375 public String getDescription() {
379 private void setDescription(String description) {
380 this.description = description;
384 public String getReference() {
388 private void setReference(String reference) {
389 this.reference = reference;
393 public Status getStatus() {
397 private void setStatus(Status status) {
398 if (status != null) {
399 this.status = status;
404 public boolean isAugmenting() {
408 private void setAugmenting(boolean augmenting) {
409 this.augmenting = augmenting;
413 public boolean isAddedByUses() {
417 private void setAddedByUses(boolean addedByUses) {
418 this.addedByUses = addedByUses;
422 public boolean isConfiguration() {
423 return configuration;
426 private void setConfiguration(boolean configuration) {
427 this.configuration = configuration;
431 public ConstraintDefinition getConstraints() {
435 private void setConstraints(ConstraintDefinition constraints) {
436 this.constraints = constraints;
440 public Set<AugmentationSchema> getAvailableAugmentations() {
441 return augmentations;
444 private void setAvailableAugmentations(Set<AugmentationSchema> augmentations) {
445 if (augmentations != null) {
446 this.augmentations = augmentations;
451 public Set<DataSchemaNode> getChildNodes() {
452 return new HashSet<DataSchemaNode>(childNodes.values());
455 private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {
456 if (childNodes != null) {
457 this.childNodes = childNodes;
462 public Set<GroupingDefinition> getGroupings() {
466 private void setGroupings(Set<GroupingDefinition> groupings) {
467 if (groupings != null) {
468 this.groupings = groupings;
473 public DataSchemaNode getDataChildByName(QName name) {
474 return childNodes.get(name);
478 public DataSchemaNode getDataChildByName(String name) {
479 DataSchemaNode result = null;
480 for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
481 if (entry.getKey().getLocalName().equals(name)) {
482 result = entry.getValue();
490 public Set<UsesNode> getUses() {
494 private void setUses(Set<UsesNode> uses) {
501 public boolean isPresenceContainer() {
505 private void setPresenceContainer(boolean presence) {
506 this.presence = presence;
510 public Set<TypeDefinition<?>> getTypeDefinitions() {
511 return typeDefinitions;
514 private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
515 if (typeDefinitions != null) {
516 this.typeDefinitions = typeDefinitions;
521 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
525 private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
526 if (unknownSchemaNodes != null) {
527 this.unknownNodes = unknownSchemaNodes;
531 public ContainerSchemaNodeBuilder toBuilder() {
532 return ContainerSchemaNodeBuilder.this;
536 public int hashCode() {
537 final int prime = 31;
539 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
540 result = prime * result + ((path == null) ? 0 : path.hashCode());
545 public boolean equals(Object obj) {
552 if (getClass() != obj.getClass()) {
555 ContainerSchemaNodeImpl other = (ContainerSchemaNodeImpl) obj;
557 if (other.qname != null) {
560 } else if (!qname.equals(other.qname)) {
564 if (other.path != null) {
567 } else if (!path.equals(other.path)) {
574 public String toString() {
575 StringBuilder sb = new StringBuilder(ContainerSchemaNodeImpl.class.getSimpleName());
577 sb.append("qname=" + qname);
579 return sb.toString();