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