BUG-987: Fixed parsing of identity nodes.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / IdentitySchemaNodeBuilder.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.parser.builder.impl;
9
10 import java.util.*;
11
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
17 public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
18     private boolean isBuilt;
19     private final IdentitySchemaNodeImpl instance;
20     private IdentitySchemaNode baseIdentity;
21     private IdentitySchemaNodeBuilder baseIdentityBuilder;
22     private final Set<IdentitySchemaNode> derivedIdentities = new HashSet<>();
23     private String baseIdentityName;
24
25     IdentitySchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
26         super(moduleName, line, qname);
27         this.schemaPath = path;
28         instance = new IdentitySchemaNodeImpl(qname, path, derivedIdentities);
29     }
30
31     IdentitySchemaNodeBuilder(final String moduleName, IdentitySchemaNode base) {
32         super(moduleName, 0, base.getQName());
33         schemaPath = base.getPath();
34         derivedIdentities.addAll(base.getDerivedIdentities());
35         unknownNodes.addAll(base.getUnknownSchemaNodes());
36         instance = new IdentitySchemaNodeImpl(qname, schemaPath, derivedIdentities);
37     }
38
39     @Override
40     public IdentitySchemaNode build() {
41         if (!isBuilt) {
42             if(baseIdentityBuilder != null) {
43                 baseIdentityBuilder.addDerivedIdentity(instance);
44                 baseIdentity = baseIdentityBuilder.build();
45             }
46             instance.setBaseIdentity(baseIdentity);
47
48             // UNKNOWN NODES
49             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
50                 unknownNodes.add(b.build());
51             }
52             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
53             instance.addUnknownSchemaNodes(unknownNodes);
54
55             isBuilt = true;
56         }
57
58         return instance;
59     }
60
61     @Override
62     public SchemaPath getPath() {
63         return instance.path;
64     }
65
66     @Override
67     public String getDescription() {
68         return instance.description;
69     }
70
71     @Override
72     public void setDescription(final String description) {
73         instance.description = description;
74     }
75
76     @Override
77     public String getReference() {
78         return instance.reference;
79     }
80
81     @Override
82     public void setReference(final String reference) {
83         instance.reference = reference;
84     }
85
86     @Override
87     public Status getStatus() {
88         return instance.status;
89     }
90
91     @Override
92     public void setStatus(Status status) {
93         if (status != null) {
94             instance.status = status;
95         }
96     }
97
98     public String getBaseIdentityName() {
99         return baseIdentityName;
100     }
101
102     public void setBaseIdentityName(final String baseIdentityName) {
103         this.baseIdentityName = baseIdentityName;
104     }
105
106     public void setBaseIdentity(final IdentitySchemaNodeBuilder baseType) {
107         this.baseIdentityBuilder = baseType;
108     }
109
110     public void addDerivedIdentity(IdentitySchemaNode derivedIdentity) {
111         if (derivedIdentity != null) {
112             derivedIdentities.add(derivedIdentity);
113         }
114     }
115
116     @Override
117     public String toString() {
118         return "identity " + qname.getLocalName();
119     }
120
121     private static final class IdentitySchemaNodeImpl implements IdentitySchemaNode {
122         private final QName qname;
123         private final SchemaPath path;
124         private IdentitySchemaNode baseIdentity;
125         private final Set<IdentitySchemaNode> derivedIdentities;
126         private String description;
127         private String reference;
128         private Status status = Status.CURRENT;
129         private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
130
131         private IdentitySchemaNodeImpl(final QName qname, final SchemaPath path, final Set<IdentitySchemaNode> derivedIdentities) {
132             this.qname = qname;
133             this.path = path;
134             this.derivedIdentities = derivedIdentities;
135         }
136
137         @Override
138         public QName getQName() {
139             return qname;
140         }
141
142         @Override
143         public IdentitySchemaNode getBaseIdentity() {
144             return baseIdentity;
145         }
146
147         private void setBaseIdentity(final IdentitySchemaNode baseIdentity) {
148             this.baseIdentity = baseIdentity;
149         }
150
151         @Override
152         public Set<IdentitySchemaNode> getDerivedIdentities() {
153             return Collections.unmodifiableSet(derivedIdentities);
154         }
155
156         @Override
157         public String getDescription() {
158             return description;
159         }
160
161         @Override
162         public String getReference() {
163             return reference;
164         }
165
166         @Override
167         public Status getStatus() {
168             return status;
169         }
170
171         @Override
172         public SchemaPath getPath() {
173             return path;
174         }
175
176         @Override
177         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
178             return Collections.unmodifiableList(unknownNodes);
179         }
180
181         private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
182             if (unknownSchemaNodes != null) {
183                 this.unknownNodes.addAll(unknownSchemaNodes);
184             }
185         }
186
187         @Override
188         public int hashCode() {
189             final int prime = 31;
190             int result = 1;
191             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
192             result = prime * result + ((path == null) ? 0 : path.hashCode());
193             return result;
194         }
195
196         @Override
197         public boolean equals(Object obj) {
198             if (this == obj) {
199                 return true;
200             }
201             if (obj == null) {
202                 return false;
203             }
204             if (getClass() != obj.getClass()) {
205                 return false;
206             }
207             IdentitySchemaNodeImpl other = (IdentitySchemaNodeImpl) obj;
208             if (qname == null) {
209                 if (other.qname != null) {
210                     return false;
211                 }
212             } else if (!qname.equals(other.qname)) {
213                 return false;
214             }
215             if (path == null) {
216                 if (other.path != null) {
217                     return false;
218                 }
219             } else if (!path.equals(other.path)) {
220                 return false;
221             }
222             return true;
223         }
224
225         @Override
226         public String toString() {
227             StringBuilder sb = new StringBuilder(IdentitySchemaNodeImpl.class.getSimpleName());
228             sb.append("[");
229             sb.append("base=" + baseIdentity);
230             sb.append(", qname=" + qname);
231             sb.append("]");
232             return sb.toString();
233         }
234     }
235
236 }