Merge "Add copyright header"
[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 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
17
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;
25
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);
30     }
31
32     @Override
33     public IdentitySchemaNode build() {
34         if (!isBuilt) {
35             if (!(parentBuilder instanceof ModuleBuilder)) {
36                 throw new YangParseException(moduleName, line, "Identity can be defined only under module (was" + parentBuilder + ")");
37             }
38             if (baseIdentity == null) {
39                 if(baseIdentityBuilder != null) {
40                     baseIdentityBuilder.addDerivedIdentity(instance);
41                     baseIdentity = baseIdentityBuilder.build();
42                 }
43             } else {
44                 if(baseIdentity instanceof IdentitySchemaNodeImpl) {
45                     ((IdentitySchemaNodeImpl)baseIdentity).toBuilder().addDerivedIdentity(instance);
46                 }
47             }
48             instance.setBaseIdentity(baseIdentity);
49
50             // UNKNOWN NODES
51             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
52                 unknownNodes.add(b.build());
53             }
54             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
55             instance.addUnknownSchemaNodes(unknownNodes);
56
57             isBuilt = true;
58         }
59
60         return instance;
61     }
62
63     @Override
64     public SchemaPath getPath() {
65         return instance.path;
66     }
67
68     @Override
69     public String getDescription() {
70         return instance.description;
71     }
72
73     @Override
74     public void setDescription(final String description) {
75         instance.description = description;
76     }
77
78     @Override
79     public String getReference() {
80         return instance.reference;
81     }
82
83     @Override
84     public void setReference(final String reference) {
85         instance.reference = reference;
86     }
87
88     @Override
89     public Status getStatus() {
90         return instance.status;
91     }
92
93     @Override
94     public void setStatus(Status status) {
95         if (status != null) {
96             instance.status = status;
97         }
98     }
99
100     public String getBaseIdentityName() {
101         return baseIdentityName;
102     }
103
104     public void setBaseIdentityName(final String baseIdentityName) {
105         this.baseIdentityName = baseIdentityName;
106     }
107
108     public void setBaseIdentity(final IdentitySchemaNodeBuilder baseType) {
109         this.baseIdentityBuilder = baseType;
110     }
111
112     public void setBaseIdentity(final IdentitySchemaNode baseType) {
113         this.baseIdentity = baseType;
114     }
115
116     public void addDerivedIdentity(IdentitySchemaNode derivedIdentity) {
117         if (derivedIdentity != null) {
118             derivedIdentities.add(derivedIdentity);
119         }
120     }
121
122     @Override
123     public String toString() {
124         return "identity " + qname.getLocalName();
125     }
126
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<>();
136
137         private IdentitySchemaNodeImpl(final QName qname, final SchemaPath path, final Set<IdentitySchemaNode> derivedIdentities) {
138             this.qname = qname;
139             this.path = path;
140             this.derivedIdentities = derivedIdentities;
141         }
142
143         @Override
144         public QName getQName() {
145             return qname;
146         }
147
148         @Override
149         public IdentitySchemaNode getBaseIdentity() {
150             return baseIdentity;
151         }
152
153         private void setBaseIdentity(final IdentitySchemaNode baseIdentity) {
154             this.baseIdentity = baseIdentity;
155         }
156
157         @Override
158         public Set<IdentitySchemaNode> getDerivedIdentities() {
159             return Collections.unmodifiableSet(derivedIdentities);
160         }
161
162         @Override
163         public String getDescription() {
164             return description;
165         }
166
167         @Override
168         public String getReference() {
169             return reference;
170         }
171
172         @Override
173         public Status getStatus() {
174             return status;
175         }
176
177         @Override
178         public SchemaPath getPath() {
179             return path;
180         }
181
182         @Override
183         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
184             return Collections.unmodifiableList(unknownNodes);
185         }
186
187         private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
188             if (unknownSchemaNodes != null) {
189                 this.unknownNodes.addAll(unknownSchemaNodes);
190             }
191         }
192
193         public IdentitySchemaNodeBuilder toBuilder() {
194             return IdentitySchemaNodeBuilder.this;
195         }
196
197         @Override
198         public int hashCode() {
199             final int prime = 31;
200             int result = 1;
201             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
202             result = prime * result + ((path == null) ? 0 : path.hashCode());
203             return result;
204         }
205
206         @Override
207         public boolean equals(Object obj) {
208             if (this == obj) {
209                 return true;
210             }
211             if (obj == null) {
212                 return false;
213             }
214             if (getClass() != obj.getClass()) {
215                 return false;
216             }
217             IdentitySchemaNodeImpl other = (IdentitySchemaNodeImpl) obj;
218             if (qname == null) {
219                 if (other.qname != null) {
220                     return false;
221                 }
222             } else if (!qname.equals(other.qname)) {
223                 return false;
224             }
225             if (path == null) {
226                 if (other.path != null) {
227                     return false;
228                 }
229             } else if (!path.equals(other.path)) {
230                 return false;
231             }
232             return true;
233         }
234
235         @Override
236         public String toString() {
237             StringBuilder sb = new StringBuilder(IdentitySchemaNodeImpl.class.getSimpleName());
238             sb.append("[");
239             sb.append("base=" + baseIdentity);
240             sb.append(", qname=" + qname);
241             sb.append("]");
242             return sb.toString();
243         }
244     }
245
246 }