Merge "Bug 2561: Parser incorrectly allows usage of union in list"
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / LeafListSchemaNodeBuilder.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 org.opendaylight.yangtools.yang.common.QName;
11 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
12 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
13 import org.opendaylight.yangtools.yang.model.api.Status;
14 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
15 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
16 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
17 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
18 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractTypeAwareBuilder;
19 import com.google.common.base.Preconditions;
20 import com.google.common.collect.ImmutableList;
21
22 public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder {
23     private LeafListSchemaNodeImpl instance;
24     private boolean userOrdered;
25     // SchemaNode args
26     private SchemaPath schemaPath;
27     private String description;
28     private String reference;
29     private Status status = Status.CURRENT;
30     // DataSchemaNode args
31     private boolean augmenting;
32     private boolean addedByUses;
33     private LeafListSchemaNode originalNode;
34     private LeafListSchemaNodeBuilder originalBuilder;
35     private boolean configuration;
36     private final ConstraintsBuilder constraints;
37
38     public LeafListSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
39         super(moduleName, line, qname);
40         this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
41         constraints = new ConstraintsBuilderImpl(moduleName, line);
42     }
43
44     public LeafListSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
45             final LeafListSchemaNode base) {
46         super(moduleName, line, qname);
47         this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
48         constraints = new ConstraintsBuilderImpl(moduleName, line, base.getConstraints());
49
50         description = base.getDescription();
51         reference = base.getReference();
52         status = base.getStatus();
53         augmenting = base.isAugmenting();
54         addedByUses = base.isAddedByUses();
55         originalNode = base;
56         configuration = base.isConfiguration();
57         this.type = base.getType();
58         userOrdered = base.isUserOrdered();
59         unknownNodes.addAll(base.getUnknownSchemaNodes());
60     }
61
62     @Override
63     public LeafListSchemaNode build() {
64         if (instance != null) {
65             return instance;
66         }
67
68         instance = new LeafListSchemaNodeImpl(qname, schemaPath);
69
70         instance.description = description;
71         instance.reference = reference;
72         instance.status = status;
73         instance.augmenting = augmenting;
74         instance.addedByUses = addedByUses;
75         instance.configuration = configuration;
76         instance.constraintsDef = constraints.toInstance();
77         instance.userOrdered = userOrdered;
78
79         if (type == null) {
80             instance.type = typedef.build();
81         } else {
82             instance.type = type;
83         }
84
85         // ORIGINAL NODE
86         if (originalNode == null && originalBuilder != null) {
87             originalNode = originalBuilder.build();
88         }
89         instance.original = originalNode;
90
91         // UNKNOWN NODES
92         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
93             unknownNodes.add(b.build());
94         }
95         instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
96
97         return instance;
98     }
99
100     @Override
101     public SchemaPath getPath() {
102         return schemaPath;
103     }
104
105     @Override
106     public void setPath(final SchemaPath path) {
107         this.schemaPath = path;
108     }
109
110     @Override
111     public String getDescription() {
112         return description;
113     }
114
115     @Override
116     public void setDescription(final String description) {
117         this.description = description;
118     }
119
120     @Override
121     public String getReference() {
122         return reference;
123     }
124
125     @Override
126     public void setReference(final String reference) {
127         this.reference = reference;
128     }
129
130     @Override
131     public Status getStatus() {
132         return status;
133     }
134
135     @Override
136     public void setStatus(final Status status) {
137         this.status = Preconditions.checkNotNull(status, "status cannot be null");
138     }
139
140     @Override
141     public boolean isAugmenting() {
142         return augmenting;
143     }
144
145     @Override
146     public void setAugmenting(final boolean augmenting) {
147         this.augmenting = augmenting;
148     }
149
150     @Override
151     public boolean isAddedByUses() {
152         return addedByUses;
153     }
154
155     @Override
156     public void setAddedByUses(final boolean addedByUses) {
157         this.addedByUses = addedByUses;
158     }
159
160     @Override
161     public LeafListSchemaNodeBuilder getOriginal() {
162         return originalBuilder;
163     }
164
165     @Override
166     public void setOriginal(final SchemaNodeBuilder builder) {
167         Preconditions.checkArgument(builder instanceof LeafListSchemaNodeBuilder, "Original of leaf-list cannot be "
168                 + builder);
169         this.originalBuilder = (LeafListSchemaNodeBuilder) builder;
170     }
171
172     @Override
173     public boolean isConfiguration() {
174         return configuration;
175     }
176
177     @Override
178     public void setConfiguration(final boolean configuration) {
179         this.configuration = configuration;
180     }
181
182     @Override
183     public ConstraintsBuilder getConstraints() {
184         return constraints;
185     }
186
187     public boolean isUserOrdered() {
188         return userOrdered;
189     }
190
191     public void setUserOrdered(final boolean userOrdered) {
192         this.userOrdered = userOrdered;
193     }
194
195     @Override
196     public int hashCode() {
197         final int prime = 31;
198         int result = 1;
199         result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
200         return result;
201     }
202
203     @Override
204     public boolean equals(final Object obj) {
205         if (this == obj) {
206             return true;
207         }
208         if (obj == null) {
209             return false;
210         }
211         if (getClass() != obj.getClass()) {
212             return false;
213         }
214         LeafListSchemaNodeBuilder other = (LeafListSchemaNodeBuilder) obj;
215         if (schemaPath == null) {
216             if (other.schemaPath != null) {
217                 return false;
218             }
219         } else if (!schemaPath.equals(other.schemaPath)) {
220             return false;
221         }
222         if (getParent() == null) {
223             if (other.getParent() != null) {
224                 return false;
225             }
226         } else if (!getParent().equals(other.getParent())) {
227             return false;
228         }
229         return true;
230     }
231
232     @Override
233     public String toString() {
234         return "leaf-list " + qname.getLocalName();
235     }
236
237 }