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.Date;
12 import java.util.HashSet;
13 import java.util.List;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
18 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
19 import org.opendaylight.yangtools.yang.model.api.Status;
20 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
21 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
22 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
23 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainer;
27 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainerBuilder;
29 import com.google.common.base.Preconditions;
30 import com.google.common.collect.ImmutableList;
32 public final class GroupingBuilderImpl extends AbstractDocumentedDataNodeContainerBuilder implements GroupingBuilder {
33 private GroupingDefinitionImpl instance;
35 private SchemaPath schemaPath;
36 private String description;
37 private String reference;
38 private Status status = Status.CURRENT;
39 // DataSchemaNode args
40 private boolean addedByUses;
42 public GroupingBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path) {
43 super(moduleName, line, qname);
44 this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
47 public GroupingBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path,
48 final GroupingDefinition base) {
49 super(moduleName, line, base.getQName(), path, base);
52 description = base.getDescription();
53 reference = base.getReference();
54 status = base.getStatus();
55 addedByUses = base.isAddedByUses();
57 URI ns = qname.getNamespace();
58 Date rev = qname.getRevision();
59 String pref = qname.getPrefix();
60 addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path,
65 public GroupingDefinition build() {
66 if (instance != null) {
70 instance = new GroupingDefinitionImpl(qname, schemaPath, this);
71 instance.addedByUses = addedByUses;
74 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
75 unknownNodes.add(b.build());
77 instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
83 public Set<DataSchemaNodeBuilder> instantiateChildNodes(final Builder newParent) {
84 final Set<DataSchemaNodeBuilder> nodes = new HashSet<>();
85 for (DataSchemaNodeBuilder node : getChildNodeBuilders()) {
86 DataSchemaNodeBuilder copy = CopyUtils.copy(node, newParent, true);
87 BuilderUtils.setNodeAddedByUses(copy);
94 public Set<TypeDefinitionBuilder> instantiateTypedefs(final Builder newParent) {
95 final Set<TypeDefinitionBuilder> nodes = new HashSet<>();
96 for (TypeDefinitionBuilder node : getTypeDefinitionBuilders()) {
97 TypeDefinitionBuilder copy = CopyUtils.copy(node, newParent, true);
104 public Set<GroupingBuilder> instantiateGroupings(final Builder newParent) {
105 final Set<GroupingBuilder> nodes = new HashSet<>();
106 for (GroupingBuilder node : getGroupingBuilders()) {
107 GroupingBuilder copy = CopyUtils.copy(node, newParent, true);
108 copy.setAddedByUses(true);
109 for (DataSchemaNodeBuilder childNode : copy.getChildNodeBuilders()) {
110 BuilderUtils.setNodeAddedByUses(childNode);
118 public Set<UnknownSchemaNodeBuilder> instantiateUnknownNodes(final Builder newParent) {
119 final Set<UnknownSchemaNodeBuilder> nodes = new HashSet<>();
120 for (UnknownSchemaNodeBuilder node : addedUnknownNodes) {
121 UnknownSchemaNodeBuilderImpl copy = CopyUtils.copy(node, newParent, true);
122 copy.setAddedByUses(true);
129 public SchemaPath getPath() {
134 public void setPath(final SchemaPath path) {
135 this.schemaPath = path;
139 public boolean isAddedByUses() {
144 public void setAddedByUses(final boolean addedByUses) {
145 this.addedByUses = addedByUses;
149 public String toString() {
150 return "grouping " + qname.getLocalName();
154 public int hashCode() {
155 final int prime = 31;
157 result = prime * result + ((getParent() == null) ? 0 : getParent().hashCode());
158 result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
163 public boolean equals(final Object obj) {
170 if (getClass() != obj.getClass()) {
173 if (!super.equals(obj)) {
176 final GroupingBuilderImpl other = (GroupingBuilderImpl) obj;
177 if (getParent() == null) {
178 if (other.getParent() != null) {
181 } else if (!getParent().equals(other.getParent())) {
184 if (schemaPath == null) {
185 if (other.schemaPath != null) {
188 } else if (!schemaPath.equals(other.schemaPath)) {
195 protected String getStatementName() {
199 private static final class GroupingDefinitionImpl extends AbstractDocumentedDataNodeContainer implements
201 private final QName qname;
202 private final SchemaPath path;
204 private boolean addedByUses;
205 private ImmutableList<UnknownSchemaNode> unknownNodes;
207 private GroupingDefinitionImpl(final QName qname, final SchemaPath path, final GroupingBuilderImpl builder) {
214 public QName getQName() {
219 public SchemaPath getPath() {
224 public boolean isAddedByUses() {
229 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
234 public int hashCode() {
235 final int prime = 31;
237 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
238 result = prime * result + ((path == null) ? 0 : path.hashCode());
243 public boolean equals(final Object obj) {
250 if (getClass() != obj.getClass()) {
253 final GroupingDefinitionImpl other = (GroupingDefinitionImpl) obj;
255 if (other.qname != null) {
258 } else if (!qname.equals(other.qname)) {
262 if (other.path != null) {
265 } else if (!path.equals(other.path)) {
272 public String toString() {
273 StringBuilder sb = new StringBuilder(GroupingDefinitionImpl.class.getSimpleName());
275 sb.append("qname=" + qname);
277 return sb.toString();