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.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.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.Builder;
29 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
33 import org.opendaylight.yangtools.yang.parser.util.Comparators;
34 import org.opendaylight.yangtools.yang.parser.util.CopyUtils;
35 import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
36 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
38 public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder implements GroupingBuilder {
39 private boolean isBuilt;
40 private final GroupingDefinitionImpl instance;
41 private SchemaPath schemaPath;
43 public GroupingBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path) {
44 super(moduleName, line, qname);
46 instance = new GroupingDefinitionImpl(qname, path);
49 public GroupingBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path, final GroupingDefinition base) {
50 super(moduleName, line, base.getQName());
52 instance = new GroupingDefinitionImpl(qname, path);
54 instance.description = base.getDescription();
55 instance.reference = base.getReference();
56 instance.status = base.getStatus();
57 instance.addedByUses = base.isAddedByUses();
59 URI ns = qname.getNamespace();
60 Date rev = qname.getRevision();
61 String pref = qname.getPrefix();
62 addedChildNodes.addAll(ParserUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref));
63 addedGroupings.addAll(ParserUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref));
64 addedTypedefs.addAll(ParserUtils.wrapTypedefs(moduleName, line, base, path, ns, rev, pref));
65 addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
68 instance.uses.addAll(base.getUses());
72 public GroupingDefinition build() {
75 for (DataSchemaNodeBuilder node : addedChildNodes) {
76 childNodes.add(node.build());
78 instance.addChildNodes(childNodes);
81 for (GroupingBuilder builder : addedGroupings) {
82 groupings.add(builder.build());
84 instance.addGroupings(groupings);
87 for (TypeDefinitionBuilder entry : addedTypedefs) {
88 typedefs.add(entry.build());
90 instance.addTypeDefinitions(typedefs);
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);
112 public Set<DataSchemaNodeBuilder> instantiateChildNodes(Builder newParent) {
113 final Set<DataSchemaNodeBuilder> nodes = new HashSet<>();
114 for (DataSchemaNodeBuilder node : addedChildNodes) {
115 DataSchemaNodeBuilder copy = CopyUtils.copy(node, newParent, true);
116 ParserUtils.setNodeAddedByUses(copy);
123 public Set<TypeDefinitionBuilder> instantiateTypedefs(Builder newParent) {
124 final Set<TypeDefinitionBuilder> nodes = new HashSet<>();
125 for (TypeDefinitionBuilder node : addedTypedefs) {
126 TypeDefinitionBuilder copy = CopyUtils.copy(node, newParent, true);
133 public Set<GroupingBuilder> instantiateGroupings(Builder newParent) {
134 final Set<GroupingBuilder> nodes = new HashSet<>();
135 for (GroupingBuilder node : addedGroupings) {
136 GroupingBuilder copy = CopyUtils.copy(node, newParent, true);
137 copy.setAddedByUses(true);
138 for (DataSchemaNodeBuilder childNode : copy.getChildNodeBuilders()) {
139 ParserUtils.setNodeAddedByUses(childNode);
147 public Set<UnknownSchemaNodeBuilder> instantiateUnknownNodes(Builder newParent) {
148 final Set<UnknownSchemaNodeBuilder> nodes = new HashSet<>();
149 for (UnknownSchemaNodeBuilder node : addedUnknownNodes) {
150 UnknownSchemaNodeBuilder copy = CopyUtils.copy(node, newParent, true);
151 copy.setAddedByUses(true);
158 public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
159 return addedTypedefs;
163 public void addTypedef(final TypeDefinitionBuilder type) {
164 String typeName = type.getQName().getLocalName();
165 for (TypeDefinitionBuilder addedTypedef : addedTypedefs) {
166 throw new YangParseException(moduleName, type.getLine(), "Can not add typedef '" + typeName
167 + "': typedef with same name already declared at line " + addedTypedef.getLine());
169 addedTypedefs.add(type);
173 public SchemaPath getPath() {
178 public String getDescription() {
179 return instance.description;
183 public void setDescription(final String description) {
184 instance.description = description;
188 public String getReference() {
189 return instance.reference;
193 public void setReference(final String reference) {
194 instance.reference = reference;
198 public Status getStatus() {
199 return instance.status;
203 public void setStatus(Status status) {
204 if (status != null) {
205 instance.status = status;
210 public boolean isAddedByUses() {
211 return instance.addedByUses;
215 public void setAddedByUses(final boolean addedByUses) {
216 instance.addedByUses = addedByUses;
220 public String toString() {
221 return "grouping " + qname.getLocalName();
225 public int hashCode() {
226 final int prime = 31;
228 result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode());
229 result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
234 public boolean equals(Object obj) {
241 if (getClass() != obj.getClass()) {
244 if (!super.equals(obj)) {
247 final GroupingBuilderImpl other = (GroupingBuilderImpl) obj;
248 if (parentBuilder == null) {
249 if (other.parentBuilder != null) {
252 } else if (!parentBuilder.equals(other.parentBuilder)) {
255 if (schemaPath == null) {
256 if (other.schemaPath != null) {
259 } else if (!schemaPath.equals(other.schemaPath)) {
266 private final class GroupingDefinitionImpl implements GroupingDefinition {
267 private final QName qname;
268 private final SchemaPath path;
269 private String description;
270 private String reference;
271 private Status status;
272 private boolean addedByUses;
273 private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
274 private final Set<GroupingDefinition> groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
275 private final Set<TypeDefinition<?>> typeDefinitions = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
276 private final Set<UsesNode> uses = new HashSet<>();
277 private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
279 private GroupingDefinitionImpl(final QName qname, final SchemaPath path) {
285 public QName getQName() {
290 public SchemaPath getPath() {
295 public String getDescription() {
300 public String getReference() {
305 public Status getStatus() {
310 public boolean isAddedByUses() {
315 public Set<DataSchemaNode> getChildNodes() {
316 return Collections.unmodifiableSet(childNodes);
319 private void addChildNodes(Set<DataSchemaNode> childNodes) {
320 if (childNodes != null) {
321 this.childNodes.addAll(childNodes);
326 public Set<GroupingDefinition> getGroupings() {
327 return Collections.unmodifiableSet(groupings);
330 private void addGroupings(Set<GroupingDefinition> groupings) {
331 if (groupings != null) {
332 this.groupings.addAll(groupings);
337 public Set<UsesNode> getUses() {
338 return Collections.unmodifiableSet(uses);
341 private void addUses(Set<UsesNode> uses) {
343 this.uses.addAll(uses);
348 public Set<TypeDefinition<?>> getTypeDefinitions() {
349 return Collections.unmodifiableSet(typeDefinitions);
352 private void addTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
353 if (typeDefinitions != null) {
354 this.typeDefinitions.addAll(typeDefinitions);
359 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
360 return Collections.unmodifiableList(unknownNodes);
363 private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
364 if (unknownNodes != null) {
365 this.unknownNodes.addAll(unknownNodes);
370 public DataSchemaNode getDataChildByName(QName name) {
371 return getChildNode(childNodes, name);
375 public DataSchemaNode getDataChildByName(String name) {
376 return getChildNode(childNodes, name);
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 final GroupingDefinitionImpl other = (GroupingDefinitionImpl) 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(GroupingDefinitionImpl.class.getSimpleName());
421 sb.append("qname=" + qname);
423 return sb.toString();