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;
12 import org.opendaylight.yangtools.yang.common.QName;
13 import org.opendaylight.yangtools.yang.model.api.*;
14 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
15 import org.opendaylight.yangtools.yang.parser.util.Comparators;
16 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
18 public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
19 private boolean isBuilt;
20 private final IdentitySchemaNodeImpl instance;
21 private IdentitySchemaNode baseIdentity;
22 private IdentitySchemaNodeBuilder baseIdentityBuilder;
23 private final Set<IdentitySchemaNode> derivedIdentities = new HashSet<>();
24 private String baseIdentityName;
26 IdentitySchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
27 super(moduleName, line, qname);
28 this.schemaPath = path;
29 instance = new IdentitySchemaNodeImpl(qname, path, derivedIdentities);
33 public IdentitySchemaNode build() {
35 if (!(parentBuilder instanceof ModuleBuilder)) {
36 throw new YangParseException(moduleName, line, "Identity can be defined only under module (was" + parentBuilder + ")");
38 if (baseIdentity == null) {
39 if(baseIdentityBuilder != null) {
40 baseIdentityBuilder.addDerivedIdentity(instance);
41 baseIdentity = baseIdentityBuilder.build();
44 if(baseIdentity instanceof IdentitySchemaNodeImpl) {
45 ((IdentitySchemaNodeImpl)baseIdentity).toBuilder().addDerivedIdentity(instance);
48 instance.setBaseIdentity(baseIdentity);
51 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
52 unknownNodes.add(b.build());
54 Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
55 instance.addUnknownSchemaNodes(unknownNodes);
64 public SchemaPath getPath() {
69 public String getDescription() {
70 return instance.description;
74 public void setDescription(final String description) {
75 instance.description = description;
79 public String getReference() {
80 return instance.reference;
84 public void setReference(final String reference) {
85 instance.reference = reference;
89 public Status getStatus() {
90 return instance.status;
94 public void setStatus(Status status) {
96 instance.status = status;
100 public String getBaseIdentityName() {
101 return baseIdentityName;
104 public void setBaseIdentityName(final String baseIdentityName) {
105 this.baseIdentityName = baseIdentityName;
108 public void setBaseIdentity(final IdentitySchemaNodeBuilder baseType) {
109 this.baseIdentityBuilder = baseType;
112 public void setBaseIdentity(final IdentitySchemaNode baseType) {
113 this.baseIdentity = baseType;
116 public void addDerivedIdentity(IdentitySchemaNode derivedIdentity) {
117 if (derivedIdentity != null) {
118 derivedIdentities.add(derivedIdentity);
123 public String toString() {
124 return "identity " + qname.getLocalName();
127 public final class IdentitySchemaNodeImpl implements IdentitySchemaNode {
128 private final QName qname;
129 private final SchemaPath path;
130 private IdentitySchemaNode baseIdentity;
131 private final Set<IdentitySchemaNode> derivedIdentities;
132 private String description;
133 private String reference;
134 private Status status = Status.CURRENT;
135 private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
137 private IdentitySchemaNodeImpl(final QName qname, final SchemaPath path, final Set<IdentitySchemaNode> derivedIdentities) {
140 this.derivedIdentities = derivedIdentities;
144 public QName getQName() {
149 public IdentitySchemaNode getBaseIdentity() {
153 private void setBaseIdentity(final IdentitySchemaNode baseIdentity) {
154 this.baseIdentity = baseIdentity;
158 public Set<IdentitySchemaNode> getDerivedIdentities() {
159 return Collections.unmodifiableSet(derivedIdentities);
163 public String getDescription() {
168 public String getReference() {
173 public Status getStatus() {
178 public SchemaPath getPath() {
183 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
184 return Collections.unmodifiableList(unknownNodes);
187 private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
188 if (unknownSchemaNodes != null) {
189 this.unknownNodes.addAll(unknownSchemaNodes);
193 public IdentitySchemaNodeBuilder toBuilder() {
194 return IdentitySchemaNodeBuilder.this;
198 public int hashCode() {
199 final int prime = 31;
201 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
202 result = prime * result + ((path == null) ? 0 : path.hashCode());
207 public boolean equals(Object obj) {
214 if (getClass() != obj.getClass()) {
217 IdentitySchemaNodeImpl other = (IdentitySchemaNodeImpl) obj;
219 if (other.qname != null) {
222 } else if (!qname.equals(other.qname)) {
226 if (other.path != null) {
229 } else if (!path.equals(other.path)) {
236 public String toString() {
237 StringBuilder sb = new StringBuilder(IdentitySchemaNodeImpl.class.getSimpleName());
239 sb.append("base=" + baseIdentity);
240 sb.append(", qname=" + qname);
242 return sb.toString();