Yang parser refactoring.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / UnknownSchemaNodeBuilder.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.List;
13
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
16 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
17 import org.opendaylight.yangtools.yang.model.api.Status;
18 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
19 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
20 import org.opendaylight.yangtools.yang.parser.util.Comparators;
21
22 public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder {
23     private boolean isBuilt;
24     private final UnknownSchemaNodeImpl instance;
25     private QName nodeType;
26     private String nodeParameter;
27
28     private ExtensionDefinition extensionDefinition;
29     private ExtensionBuilder extensionBuilder;
30
31     public UnknownSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
32         super(moduleName, line, qname);
33         this.schemaPath = path;
34         instance = new UnknownSchemaNodeImpl(qname, path);
35     }
36
37     public UnknownSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path, final UnknownSchemaNode base) {
38         super(moduleName, line, base.getQName());
39         this.schemaPath = path;
40         instance = new UnknownSchemaNodeImpl(qname, path);
41
42         instance.nodeType = base.getNodeType();
43         instance.nodeParameter = base.getNodeParameter();
44         instance.description = base.getDescription();
45         instance.reference = base.getReference();
46         instance.status = base.getStatus();
47         instance.addedByUses = base.isAddedByUses();
48         instance.extension = base.getExtensionDefinition();
49         instance.unknownNodes.addAll(base.getUnknownSchemaNodes());
50     }
51
52     @Override
53     public SchemaPath getPath() {
54         return instance.path;
55     }
56
57     @Override
58     public int hashCode() {
59         final int prime = 31;
60         int result = 1;
61         result = prime * result + ((qname == null) ? 0 : qname.hashCode());
62         result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
63         result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());
64         result = prime * result + ((nodeParameter == null) ? 0 : nodeParameter.hashCode());
65         return result;
66     }
67
68     @Override
69     public boolean equals(Object obj) {
70         if (this == obj) {
71             return true;
72         }
73         if (obj == null) {
74             return false;
75         }
76         if (getClass() != obj.getClass()) {
77             return false;
78         }
79         UnknownSchemaNodeBuilder other = (UnknownSchemaNodeBuilder) obj;
80         if (qname == null) {
81             if (other.qname != null) {
82                 return false;
83             }
84         } else if (!qname.equals(other.qname)) {
85             return false;
86         }
87         if (schemaPath == null) {
88             if (other.schemaPath != null) {
89                 return false;
90             }
91         } else if (!schemaPath.equals(other.schemaPath)) {
92             return false;
93         }
94         if (nodeType == null) {
95             if (other.nodeType != null) {
96                 return false;
97             }
98         } else if (!nodeType.equals(other.nodeType)) {
99             return false;
100         }
101         if (nodeParameter == null) {
102             if (other.nodeParameter != null) {
103                 return false;
104             }
105         } else if (!nodeParameter.equals(other.nodeParameter)) {
106             return false;
107         }
108         return true;
109     }
110
111     @Override
112     public UnknownSchemaNode build() {
113         if (!isBuilt) {
114             instance.setNodeType(nodeType);
115             instance.setNodeParameter(nodeParameter);
116
117             // EXTENSION
118             if (extensionDefinition != null) {
119                 instance.setExtensionDefinition(extensionDefinition);
120             } else {
121                 if (extensionBuilder != null) {
122                     instance.setExtensionDefinition(extensionBuilder.build());
123                 }
124             }
125
126             // UNKNOWN NODES
127             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
128                 unknownNodes.add(b.build());
129             }
130             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
131             instance.setUnknownSchemaNodes(unknownNodes);
132
133             isBuilt = true;
134         }
135
136         return instance;
137     }
138
139     @Override
140     public String getDescription() {
141         return instance.description;
142     }
143
144     @Override
145     public void setDescription(final String description) {
146         instance.description = description;
147     }
148
149     @Override
150     public String getReference() {
151         return instance.reference;
152     }
153
154     @Override
155     public void setReference(final String reference) {
156         instance.reference = reference;
157     }
158
159     @Override
160     public Status getStatus() {
161         return instance.status;
162     }
163
164     @Override
165     public void setStatus(Status status) {
166         if (status != null) {
167             instance.status = status;
168         }
169     }
170
171     public boolean isAddedByUses() {
172         return instance.addedByUses;
173     }
174
175     public void setAddedByUses(final boolean addedByUses) {
176         instance.addedByUses = addedByUses;
177     }
178
179     public QName getNodeType() {
180         return nodeType;
181     }
182
183     public void setNodeType(final QName nodeType) {
184         this.nodeType = nodeType;
185     }
186
187     public String getNodeParameter() {
188         return nodeParameter;
189     }
190
191     public void setNodeParameter(final String nodeParameter) {
192         this.nodeParameter = nodeParameter;
193     }
194
195     public ExtensionDefinition getExtensionDefinition() {
196         return extensionDefinition;
197     }
198
199     public void setExtensionDefinition(final ExtensionDefinition extensionDefinition) {
200         this.extensionDefinition = extensionDefinition;
201     }
202
203     public ExtensionBuilder getExtensionBuilder() {
204         return extensionBuilder;
205     }
206
207     public void setExtensionBuilder(final ExtensionBuilder extension) {
208         this.extensionBuilder = extension;
209     }
210
211     @Override
212     public String toString() {
213         StringBuilder sb = new StringBuilder();
214         sb.append(nodeType.getPrefix());
215         sb.append(":");
216         sb.append(nodeType.getLocalName());
217         sb.append(" ");
218         sb.append(nodeParameter);
219         return sb.toString();
220     }
221
222     private final class UnknownSchemaNodeImpl implements UnknownSchemaNode {
223         private final QName qname;
224         private final SchemaPath path;
225         private ExtensionDefinition extension;
226         private String description;
227         private String reference;
228         private Status status = Status.CURRENT;
229         private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
230         private QName nodeType;
231         private String nodeParameter;
232         private boolean addedByUses;
233
234         private UnknownSchemaNodeImpl(final QName qname, final SchemaPath path) {
235             this.qname = qname;
236             this.path = path;
237         }
238
239         @Override
240         public QName getQName() {
241             return qname;
242         }
243
244         @Override
245         public SchemaPath getPath() {
246             return path;
247         }
248
249         @Override
250         public ExtensionDefinition getExtensionDefinition() {
251             return extension;
252         }
253
254         private void setExtensionDefinition(final ExtensionDefinition extension) {
255             this.extension = extension;
256         }
257
258         @Override
259         public String getDescription() {
260             return description;
261         }
262
263         @Override
264         public String getReference() {
265             return reference;
266         }
267
268         @Override
269         public Status getStatus() {
270             return status;
271         }
272
273         @Override
274         public boolean isAddedByUses() {
275             return addedByUses;
276         }
277
278         @Override
279         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
280             return unknownNodes;
281         }
282
283         private void setUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {
284             if (unknownNodes != null) {
285                 this.unknownNodes.addAll(unknownNodes);
286             }
287         }
288
289         @Override
290         public QName getNodeType() {
291             return nodeType;
292         }
293
294         private void setNodeType(final QName nodeType) {
295             this.nodeType = nodeType;
296         }
297
298         @Override
299         public String getNodeParameter() {
300             return nodeParameter;
301         }
302
303         private void setNodeParameter(final String nodeParameter) {
304             this.nodeParameter = nodeParameter;
305         }
306
307         @Override
308         public String toString() {
309             StringBuilder sb = new StringBuilder();
310             sb.append(nodeType.getPrefix());
311             sb.append(":");
312             sb.append(nodeType.getLocalName());
313             sb.append(" ");
314             sb.append(nodeParameter);
315             return sb.toString();
316         }
317
318         @Override
319         public int hashCode() {
320             final int prime = 31;
321             int result = 1;
322             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
323             result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
324             result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());
325             result = prime * result + ((nodeParameter == null) ? 0 : nodeParameter.hashCode());
326             return result;
327         }
328
329         @Override
330         public boolean equals(Object obj) {
331             if (this == obj) {
332                 return true;
333             }
334             if (obj == null) {
335                 return false;
336             }
337             if (getClass() != obj.getClass()) {
338                 return false;
339             }
340             UnknownSchemaNodeImpl other = (UnknownSchemaNodeImpl) obj;
341             if (qname == null) {
342                 if (other.qname != null) {
343                     return false;
344                 }
345             } else if (!qname.equals(other.qname)) {
346                 return false;
347             }
348             if (path == null) {
349                 if (other.path != null) {
350                     return false;
351                 }
352             } else if (!path.equals(other.path)) {
353                 return false;
354             }
355             if (nodeType == null) {
356                 if (other.nodeType != null) {
357                     return false;
358                 }
359             } else if (!nodeType.equals(other.nodeType)) {
360                 return false;
361             }
362             if (nodeParameter == null) {
363                 if (other.nodeParameter != null) {
364                     return false;
365                 }
366             } else if (!nodeParameter.equals(other.nodeParameter)) {
367                 return false;
368             }
369             return true;
370         }
371
372     }
373
374 }