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