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