2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.parser.builder.impl;
10 import com.google.common.base.Optional;
11 import com.google.common.base.Preconditions;
12 import java.util.Collections;
13 import java.util.List;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
16 import org.opendaylight.yangtools.yang.model.api.Status;
17 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
18 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
19 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
20 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
21 import org.opendaylight.yangtools.yang.model.util.ExtendedType;
22 import org.opendaylight.yangtools.yang.model.util.UnknownType;
23 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractTypeAwareBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.util.Comparators;
27 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
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;
36 private String description;
37 private String reference;
38 private Status status = Status.CURRENT;
40 private Object defaultValue;
41 private boolean addedByUses;
43 public TypeDefinitionBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path) {
44 super(moduleName, line, qname);
45 this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
48 public TypeDefinitionBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path, final ExtendedType base) {
49 super(moduleName, line, base.getQName());
50 this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
52 this.type = base.getBaseType();
53 this.description = base.getDescription();
54 this.reference = base.getReference();
55 this.status = base.getStatus();
56 this.units = base.getUnits();
57 this.defaultValue = base.getDefaultValue();
59 this.addedByUses = base.isAddedByUses();
60 this.ranges = base.getRangeConstraints();
61 this.lengths = base.getLengthConstraints();
62 this.patterns = base.getPatternConstraints();
63 this.fractionDigits = base.getFractionDigits();
64 this.unknownNodes.addAll(base.getUnknownSchemaNodes());
68 public TypeDefinition<? extends TypeDefinition<?>> build() {
69 TypeDefinition<?> result;
70 ExtendedType.Builder typeBuilder;
71 if ((type == null || type instanceof UnknownType) && typedef == null) {
72 throw new YangParseException("Unresolved type: '" + qname.getLocalName() + "'.");
74 if (type == null || type instanceof UnknownType) {
75 type = typedef.build();
78 typeBuilder = ExtendedType.builder(qname, type, Optional.fromNullable(description),
79 Optional.fromNullable(reference), schemaPath);
80 typeBuilder.status(status);
81 typeBuilder.units(units);
82 typeBuilder.defaultValue(defaultValue);
83 typeBuilder.addedByUses(addedByUses);
84 typeBuilder.ranges(ranges);
85 typeBuilder.lengths(lengths);
86 typeBuilder.patterns(patterns);
87 typeBuilder.fractionDigits(fractionDigits);
90 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
91 unknownNodes.add(b.build());
93 Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
94 typeBuilder.unknownSchemaNodes(unknownNodes);
95 result = typeBuilder.build();
100 public void setQName(final QName qname) {
105 public SchemaPath getPath() {
110 public void setPath(final SchemaPath path) {
111 this.schemaPath = path;
115 public String getDescription() {
120 public void setDescription(final String description) {
121 this.description = description;
125 public String getReference() {
130 public void setReference(final String reference) {
131 this.reference = reference;
135 public Status getStatus() {
140 public void setStatus(final Status status) {
141 if (status != null) {
142 this.status = status;
147 public boolean isAddedByUses() {
152 public void setAddedByUses(final boolean addedByUses) {
153 this.addedByUses = addedByUses;
157 public String getUnits() {
162 public void setUnits(final String units) {
167 public Object getDefaultValue() {
172 public void setDefaultValue(final Object defaultValue) {
173 this.defaultValue = defaultValue;
177 public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
178 return Collections.emptyList();
182 public List<RangeConstraint> getRanges() {
187 public void setRanges(final List<RangeConstraint> ranges) {
188 if (ranges != null) {
189 this.ranges = ranges;
194 public List<LengthConstraint> getLengths() {
199 public void setLengths(final List<LengthConstraint> lengths) {
200 if (lengths != null) {
201 this.lengths = lengths;
206 public List<PatternConstraint> getPatterns() {
211 public void setPatterns(final List<PatternConstraint> patterns) {
212 if (patterns != null) {
213 this.patterns = patterns;
218 public Integer getFractionDigits() {
219 return fractionDigits;
223 public void setFractionDigits(final Integer fractionDigits) {
224 this.fractionDigits = fractionDigits;
228 public String toString() {
229 return "typedef " + qname.getLocalName();
233 public int hashCode() {
234 final int prime = 31;
235 int result = super.hashCode();
236 result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
242 public boolean equals(final Object obj) {
249 if (getClass() != obj.getClass()) {
252 if (!super.equals(obj)) {
255 TypeDefinitionBuilderImpl other = (TypeDefinitionBuilderImpl) obj;
257 if (schemaPath == null) {
258 if (other.schemaPath != null) {
261 } else if (!schemaPath.equals(other.schemaPath)) {