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