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