Merge "BUG-868: do not use InstanceIdentifier constructor"
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / TypeDefinitionBuilderImpl.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.Collections;
12 import java.util.List;
13 import org.opendaylight.yangtools.yang.common.QName;
14 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
15 import org.opendaylight.yangtools.yang.model.api.Status;
16 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
17 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
18 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
19 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
20 import org.opendaylight.yangtools.yang.model.util.ExtendedType;
21 import org.opendaylight.yangtools.yang.model.util.UnknownType;
22 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
23 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractTypeAwareBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.util.Comparators;
26 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
27
28 public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder implements TypeDefinitionBuilder {
29     private SchemaPath schemaPath;
30     private List<RangeConstraint> ranges = Collections.emptyList();
31     private List<LengthConstraint> lengths = Collections.emptyList();
32     private List<PatternConstraint> patterns = Collections.emptyList();
33     private Integer fractionDigits = null;
34
35     private String description;
36     private String reference;
37     private Status status = Status.CURRENT;
38     private String units;
39     private Object defaultValue;
40     private boolean addedByUses;
41
42     public TypeDefinitionBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path) {
43         super(moduleName, line, qname);
44         this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
45     }
46
47     public TypeDefinitionBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path, final ExtendedType base) {
48         super(moduleName, line, base.getQName());
49         this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
50
51         this.type = base.getBaseType();
52         this.description = base.getDescription();
53         this.reference = base.getReference();
54         this.status = base.getStatus();
55         this.units = base.getUnits();
56         this.defaultValue = base.getDefaultValue();
57
58         this.addedByUses = base.isAddedByUses();
59         this.ranges = base.getRangeConstraints();
60         this.lengths = base.getLengthConstraints();
61         this.patterns = base.getPatternConstraints();
62         this.fractionDigits = base.getFractionDigits();
63         this.unknownNodes.addAll(base.getUnknownSchemaNodes());
64     }
65
66     @Override
67     public TypeDefinition<? extends TypeDefinition<?>> build() {
68         TypeDefinition<?> result;
69         ExtendedType.Builder typeBuilder;
70         if ((type == null || type instanceof UnknownType) && typedef == null) {
71             throw new YangParseException("Unresolved type: '" + qname.getLocalName() + "'.");
72         }
73         if (type == null || type instanceof UnknownType) {
74             type = typedef.build();
75         }
76
77         typeBuilder = new ExtendedType.Builder(qname, type, description, reference, schemaPath);
78         typeBuilder.status(status);
79         typeBuilder.units(units);
80         typeBuilder.defaultValue(defaultValue);
81         typeBuilder.addedByUses(addedByUses);
82         typeBuilder.ranges(ranges);
83         typeBuilder.lengths(lengths);
84         typeBuilder.patterns(patterns);
85         typeBuilder.fractionDigits(fractionDigits);
86
87         // UNKNOWN NODES
88         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
89             unknownNodes.add(b.build());
90         }
91         Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
92         typeBuilder.unknownSchemaNodes(unknownNodes);
93         result = typeBuilder.build();
94         return result;
95     }
96
97     @Override
98     public void setQName(final QName qname) {
99         this.qname = qname;
100     }
101
102     @Override
103     public SchemaPath getPath() {
104         return schemaPath;
105     }
106
107     @Override
108     public void setPath(final SchemaPath path) {
109         this.schemaPath = path;
110     }
111
112     @Override
113     public String getDescription() {
114         return description;
115     }
116
117     @Override
118     public void setDescription(final String description) {
119         this.description = description;
120     }
121
122     @Override
123     public String getReference() {
124         return reference;
125     }
126
127     @Override
128     public void setReference(final String reference) {
129         this.reference = reference;
130     }
131
132     @Override
133     public Status getStatus() {
134         return status;
135     }
136
137     @Override
138     public void setStatus(final Status status) {
139         if (status != null) {
140             this.status = status;
141         }
142     }
143
144     @Override
145     public boolean isAddedByUses() {
146         return addedByUses;
147     }
148
149     @Override
150     public void setAddedByUses(final boolean addedByUses) {
151         this.addedByUses = addedByUses;
152     }
153
154     @Override
155     public String getUnits() {
156         return units;
157     }
158
159     @Override
160     public void setUnits(final String units) {
161         this.units = units;
162     }
163
164     @Override
165     public Object getDefaultValue() {
166         return defaultValue;
167     }
168
169     @Override
170     public void setDefaultValue(final Object defaultValue) {
171         this.defaultValue = defaultValue;
172     }
173
174     @Override
175     public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
176         return Collections.emptyList();
177     }
178
179     @Override
180     public List<RangeConstraint> getRanges() {
181         return ranges;
182     }
183
184     @Override
185     public void setRanges(final List<RangeConstraint> ranges) {
186         if (ranges != null) {
187             this.ranges = ranges;
188         }
189     }
190
191     @Override
192     public List<LengthConstraint> getLengths() {
193         return lengths;
194     }
195
196     @Override
197     public void setLengths(final List<LengthConstraint> lengths) {
198         if (lengths != null) {
199             this.lengths = lengths;
200         }
201     }
202
203     @Override
204     public List<PatternConstraint> getPatterns() {
205         return patterns;
206     }
207
208     @Override
209     public void setPatterns(final List<PatternConstraint> patterns) {
210         if (patterns != null) {
211             this.patterns = patterns;
212         }
213     }
214
215     @Override
216     public Integer getFractionDigits() {
217         return fractionDigits;
218     }
219
220     @Override
221     public void setFractionDigits(final Integer fractionDigits) {
222         this.fractionDigits = fractionDigits;
223     }
224
225     @Override
226     public String toString() {
227         return "typedef " + qname.getLocalName();
228     }
229
230     @Override
231     public int hashCode() {
232         final int prime = 31;
233         int result = super.hashCode();
234         result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
235
236         return result;
237     }
238
239     @Override
240     public boolean equals(final Object obj) {
241         if (this == obj) {
242             return true;
243         }
244         if (obj == null) {
245             return false;
246         }
247         if (getClass() != obj.getClass()) {
248             return false;
249         }
250         if (!super.equals(obj)) {
251             return false;
252         }
253         TypeDefinitionBuilderImpl other = (TypeDefinitionBuilderImpl) obj;
254
255         if (schemaPath == null) {
256             if (other.schemaPath != null) {
257                 return false;
258             }
259         } else if (!schemaPath.equals(other.schemaPath)) {
260             return false;
261         }
262
263         return true;
264     }
265
266 }