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