Refactored parsing of uses and augment statements.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / AnyXmlBuilder.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.AnyXmlSchemaNode;
16 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
17 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
18 import org.opendaylight.yangtools.yang.model.api.Status;
19 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
20 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
21 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
22 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingMember;
23 import org.opendaylight.yangtools.yang.parser.util.Comparators;
24
25 public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder, GroupingMember {
26     private boolean built;
27     private final AnyXmlSchemaNodeImpl instance;
28     private final ConstraintsBuilder constraints;
29
30     private Boolean configuration;
31     private boolean augmenting;
32     private boolean addedByUses;
33
34     public AnyXmlBuilder(final String moduleName, final int line, final QName qname, final SchemaPath schemaPath) {
35         super(moduleName, line, qname);
36         this.schemaPath = schemaPath;
37         instance = new AnyXmlSchemaNodeImpl(qname);
38         constraints = new ConstraintsBuilder(moduleName, line);
39     }
40
41     @Override
42     public AnyXmlSchemaNode build() {
43         if (!built) {
44             instance.setPath(schemaPath);
45             instance.setConstraints(constraints.build());
46             instance.setDescription(description);
47             instance.setReference(reference);
48             instance.setStatus(status);
49             instance.setConfiguration(configuration);
50             instance.setAugmenting(augmenting);
51             instance.setAddedByUses(addedByUses);
52
53             // UNKNOWN NODES
54             if (unknownNodes == null) {
55                 unknownNodes = new ArrayList<UnknownSchemaNode>();
56                 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
57                     unknownNodes.add(b.build());
58                 }
59             }
60             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
61             instance.setUnknownSchemaNodes(unknownNodes);
62
63             built = true;
64         }
65         return instance;
66     }
67
68     @Override
69     public ConstraintsBuilder getConstraints() {
70         return constraints;
71     }
72
73     public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
74         return addedUnknownNodes;
75     }
76
77     @Override
78     public boolean isAugmenting() {
79         return augmenting;
80     }
81
82     @Override
83     public void setAugmenting(final boolean augmenting) {
84         this.augmenting = augmenting;
85     }
86
87     @Override
88     public boolean isAddedByUses() {
89         return addedByUses;
90     }
91
92     @Override
93     public void setAddedByUses(final boolean addedByUses) {
94         this.addedByUses = addedByUses;
95     }
96
97     @Override
98     public Boolean isConfiguration() {
99         return configuration;
100     }
101
102     @Override
103     public void setConfiguration(final Boolean configuration) {
104         this.configuration = configuration;
105     }
106
107     @Override
108     public int hashCode() {
109         final int prime = 31;
110         int result = 1;
111         result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
112         return result;
113     }
114
115     @Override
116     public boolean equals(Object obj) {
117         if (this == obj) {
118             return true;
119         }
120         if (obj == null) {
121             return false;
122         }
123         if (getClass() != obj.getClass()) {
124             return false;
125         }
126         AnyXmlBuilder other = (AnyXmlBuilder) obj;
127         if (schemaPath == null) {
128             if (other.schemaPath != null) {
129                 return false;
130             }
131         } else if (!schemaPath.equals(other.schemaPath)) {
132             return false;
133         }
134         if (parent == null) {
135             if (other.parent != null) {
136                 return false;
137             }
138         } else if (!parent.equals(other.parent)) {
139             return false;
140         }
141         return true;
142     }
143
144     @Override
145     public String toString() {
146         return "anyxml " + qname.getLocalName();
147     }
148
149     private final class AnyXmlSchemaNodeImpl implements AnyXmlSchemaNode {
150         private final QName qname;
151         private SchemaPath path;
152         private String description;
153         private String reference;
154         private Status status = Status.CURRENT;
155         private boolean configuration;
156         private ConstraintDefinition constraintsDef;
157         private boolean augmenting;
158         private boolean addedByUses;
159         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
160
161         private AnyXmlSchemaNodeImpl(final QName qname) {
162             this.qname = qname;
163         }
164
165         @Override
166         public QName getQName() {
167             return qname;
168         }
169
170         @Override
171         public SchemaPath getPath() {
172             return path;
173         }
174
175         private void setPath(final SchemaPath path) {
176             this.path = path;
177         }
178
179         @Override
180         public String getDescription() {
181             return description;
182         }
183
184         private void setDescription(String description) {
185             this.description = description;
186         }
187
188         @Override
189         public String getReference() {
190             return reference;
191         }
192
193         private void setReference(String reference) {
194             this.reference = reference;
195         }
196
197         @Override
198         public Status getStatus() {
199             return status;
200         }
201
202         private void setStatus(Status status) {
203             if (status != null) {
204                 this.status = status;
205             }
206         }
207
208         @Override
209         public boolean isAugmenting() {
210             return augmenting;
211         }
212
213         private void setAugmenting(boolean augmenting) {
214             this.augmenting = augmenting;
215         }
216
217         @Override
218         public boolean isAddedByUses() {
219             return addedByUses;
220         }
221
222         private void setAddedByUses(boolean addedByUses) {
223             this.addedByUses = addedByUses;
224         }
225
226         @Override
227         public boolean isConfiguration() {
228             return configuration;
229         }
230
231         private void setConfiguration(boolean configuration) {
232             this.configuration = configuration;
233         }
234
235         @Override
236         public ConstraintDefinition getConstraints() {
237             return constraintsDef;
238         }
239
240         private void setConstraints(ConstraintDefinition constraintsDef) {
241             this.constraintsDef = constraintsDef;
242         }
243
244         @Override
245         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
246             return unknownNodes;
247         }
248
249         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
250             if (unknownNodes != null) {
251                 this.unknownNodes = unknownNodes;
252             }
253         }
254
255         @Override
256         public int hashCode() {
257             final int prime = 31;
258             int result = 1;
259             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
260             result = prime * result + ((path == null) ? 0 : path.hashCode());
261             return result;
262         }
263
264         @Override
265         public boolean equals(Object obj) {
266             if (this == obj) {
267                 return true;
268             }
269             if (obj == null) {
270                 return false;
271             }
272             if (getClass() != obj.getClass()) {
273                 return false;
274             }
275             AnyXmlSchemaNodeImpl other = (AnyXmlSchemaNodeImpl) obj;
276             if (qname == null) {
277                 if (other.qname != null) {
278                     return false;
279                 }
280             } else if (!qname.equals(other.qname)) {
281                 return false;
282             }
283             if (path == null) {
284                 if (other.path != null) {
285                     return false;
286                 }
287             } else if (!path.equals(other.path)) {
288                 return false;
289             }
290             return true;
291         }
292
293         @Override
294         public String toString() {
295             StringBuilder sb = new StringBuilder(AnyXmlSchemaNodeImpl.class.getSimpleName());
296             sb.append("[");
297             sb.append("qname=" + qname);
298             sb.append(", path=" + path);
299             sb.append("]");
300             return sb.toString();
301         }
302     }
303
304 }