BUG-4638: Convert to using new types
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / type / Decimal64SpecificationEffectiveStatementImpl.java
index e9076efdc250262d0a36d541ab9d5a0143873a5d..24f3ba456d6ab119e0f182d9e62f8a4ea54f91f2 100644 (file)
  */
 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type;
 
-import com.google.common.base.Optional;
-import com.google.common.collect.ImmutableList;
-import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.YangConstants;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.Status;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.Decimal64Specification;
 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
-import org.opendaylight.yangtools.yang.model.util.Decimal64;
-import org.opendaylight.yangtools.yang.model.util.ExtendedType;
-import org.opendaylight.yangtools.yang.model.util.ExtendedType.Builder;
+import org.opendaylight.yangtools.yang.model.util.type.BaseTypes;
+import org.opendaylight.yangtools.yang.model.util.type.DecimalTypeBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.TypeUtils;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DeclaredEffectiveStatementBase;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.FractionDigitsEffectiveStatementImpl;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.UnknownEffectiveStatementImpl;
 
-public class Decimal64SpecificationEffectiveStatementImpl extends
+public final class Decimal64SpecificationEffectiveStatementImpl extends
         DeclaredEffectiveStatementBase<String, Decimal64Specification>
-        implements DecimalTypeDefinition, TypeEffectiveStatement<Decimal64Specification> {
+        implements TypeEffectiveStatement<Decimal64Specification> {
 
-    private static final String UNITS = "";
-    private static final BigDecimal DEFAULT_VALUE = null;
-    private static final QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, TypeUtils.DECIMAL64);
-
-    private static final String DESCRIPTION = "The decimal64 type represents a subset of the real numbers, which can "
-            + "be represented by decimal numerals. The value space of decimal64 is the set of numbers that can "
-            + "be obtained by multiplying a 64-bit signed integer by a negative power of ten, i.e., expressible as "
-            + "'i x 10^-n' where i is an integer64 and n is an integer between 1 and 18, inclusively.";
-
-    private static final String REFERENCE = "https://tools.ietf.org/html/rfc6020#section-9.3";
-    private static final BigDecimal MIN_VALUE = new BigDecimal("-922337203685477580.8");
-    private static final BigDecimal MAX_VALUE = new BigDecimal("922337203685477580.7");
-    private static final List<RangeConstraint> DEFAULT_RANGE_STATEMENTS;
-    static {
-        final String rangeDescription = "Integer values between " + MIN_VALUE
-                + " and " + MAX_VALUE + ", inclusively.";
-        final String rangeReference = RangeConstraintEffectiveImpl.DEFAULT_REFERENCE;
-
-        DEFAULT_RANGE_STATEMENTS = ImmutableList.<RangeConstraint>of(
-                new RangeConstraintEffectiveImpl(MIN_VALUE, MAX_VALUE, Optional.of(rangeDescription),
-                Optional.of(rangeReference)));
-    }
-
-    private List<RangeConstraint> rangeConstraints;
-    private Integer fractionDigits;
-    private SchemaPath path;
-    private QName extendedTypeQName;
-
-    private ExtendedType extendedType;
-    private final boolean isExtended;
-    private Decimal64 decimal64Instance = null;
+    private final DecimalTypeDefinition typeDefinition;
 
     public Decimal64SpecificationEffectiveStatementImpl(
             final StmtContext<String, Decimal64Specification, EffectiveStatement<String, Decimal64Specification>> ctx) {
         super(ctx);
 
-        for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
-            if (effectiveStatement instanceof FractionDigitsEffectiveStatementImpl) {
-                fractionDigits = ((FractionDigitsEffectiveStatementImpl) effectiveStatement)
-                        .argument();
-            }
-        }
+        final DecimalTypeBuilder builder = BaseTypes.decimalTypeBuilder(ctx.getSchemaPath().get());
 
-        List<RangeConstraint> initRanges = initRanges();
-
-        if (!initRanges.isEmpty() && validateRanges(initRanges)) {
-            isExtended = true;
-            rangeConstraints = ImmutableList.copyOf(initRanges);
-            SchemaPath parentPath = ctx.getParentContext().getSchemaPath().get();
-            extendedTypeQName = QName.create(parentPath.getLastComponent().getModule(), QNAME.getLocalName());
-            path = parentPath.createChild(extendedTypeQName);
-        } else {
-            isExtended = false;
-            rangeConstraints = DEFAULT_RANGE_STATEMENTS;
-            path = ctx.getParentContext().getSchemaPath().get().createChild(QNAME);
-        }
-    }
-
-    private static boolean validateRanges(final List<RangeConstraint> initRanges) {
-        for (RangeConstraint rangeConstraint : initRanges) {
-
-            String maxValueString = rangeConstraint.getMax().toString();
-            String minValueString = rangeConstraint.getMin().toString();
-
-            if ((!"max".equals(maxValueString) && MAX_VALUE.compareTo(new BigDecimal(maxValueString)) < 0)
-                    || (!"min".equals(minValueString) && MIN_VALUE.compareTo(new BigDecimal(minValueString)) > 0)) {
-                return false;
+        for (final EffectiveStatement<?, ?> stmt : effectiveSubstatements()) {
+            if (stmt instanceof FractionDigitsEffectiveStatementImpl) {
+                builder.setFractionDigits(((FractionDigitsEffectiveStatementImpl) stmt).argument());
             }
-        }
-        return true;
-    }
-
-    private List<RangeConstraint> initRanges() {
-        final RangeEffectiveStatementImpl rangeConstraintsStmt = firstEffective(RangeEffectiveStatementImpl.class);
-        return rangeConstraintsStmt != null ? rangeConstraintsStmt.argument() : Collections.<RangeConstraint> emptyList();
-    }
-
-    public boolean isExtended() {
-        return isExtended;
-    }
-
-    @Override
-    public List<RangeConstraint> getRangeConstraints() {
-        return rangeConstraints;
-    }
-
-    @Override
-    public Integer getFractionDigits() {
-        return fractionDigits;
-    }
-
-    @Override
-    public DecimalTypeDefinition getBaseType() {
-        if (isExtended) {
-            if (decimal64Instance == null) {
-                decimal64Instance = Decimal64.create(path, fractionDigits);
+            if (stmt instanceof RangeEffectiveStatementImpl) {
+                builder.setRangeAlternatives(((RangeEffectiveStatementImpl)stmt).argument());
+            }
+            if (stmt instanceof UnknownEffectiveStatementImpl) {
+                builder.addUnknownSchemaNode((UnknownEffectiveStatementImpl)stmt);
             }
-            return decimal64Instance;
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public String getUnits() {
-        return UNITS;
-    }
-
-    @Override
-    public Object getDefaultValue() {
-        return DEFAULT_VALUE;
-    }
-
-    @Override
-    public QName getQName() {
-        return QNAME;
-    }
-
-    @Override
-    public SchemaPath getPath() {
-        return path;
-    }
-
-    @Override
-    public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public String getDescription() {
-        return DESCRIPTION;
-    }
-
-    @Override
-    public String getReference() {
-        return REFERENCE;
-    }
-
-    @Override
-    public Status getStatus() {
-        return Status.CURRENT;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + Objects.hashCode(QNAME);
-        result = prime * result + Objects.hashCode(path);
-        return result;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
         }
-        Decimal64SpecificationEffectiveStatementImpl other = (Decimal64SpecificationEffectiveStatementImpl) obj;
-        return Objects.equals(path, other.path);
-    }
 
-    @Override
-    public String toString() {
-        return Decimal64SpecificationEffectiveStatementImpl.class.getSimpleName()
-                + "[qName=" + QNAME + ", fractionDigits=" + fractionDigits + "]";
+        typeDefinition = builder.build();
     }
 
     @Override
-    public TypeDefinition<?> getTypeDefinition() {
-
-        if (decimal64Instance == null) {
-            decimal64Instance = Decimal64.create(path, fractionDigits);
-        }
-
-        if (!isExtended) {
-            return decimal64Instance;
-        }
-
-        if (extendedType != null) {
-            return extendedType;
-        }
-
-        Builder extendedTypeBuilder = ExtendedType.builder(path.getLastComponent(), decimal64Instance,
-            Optional.<String>absent(), Optional.<String>absent(), path);
-
-        extendedTypeBuilder.fractionDigits(fractionDigits);
-        extendedTypeBuilder.ranges(rangeConstraints);
-
-        extendedType = extendedTypeBuilder.build();
-
-        return extendedType;
+    public DecimalTypeDefinition getTypeDefinition() {
+        return typeDefinition;
     }
 }