Enforce decimal64 fraction-digits in derived types
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / type / DecimalTypeEffectiveStatementImpl.java
index 536cdebc8c37b0a774317f8d961a13f856ef9116..30fe521cb06566e72cab6e885a3be158992d6c63 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type;
 
+import javax.annotation.Nonnull;
 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;
@@ -15,16 +16,14 @@ import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
 import org.opendaylight.yangtools.yang.model.util.type.RangeRestrictedTypeBuilder;
 import org.opendaylight.yangtools.yang.model.util.type.RestrictedTypes;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 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;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public final class DecimalTypeEffectiveStatementImpl extends DeclaredEffectiveStatementBase<String, TypeStatement>
         implements TypeEffectiveStatement<TypeStatement> {
-    private static final Logger LOG = LoggerFactory.getLogger(Decimal64SpecificationEffectiveStatementImpl.class);
     private final DecimalTypeDefinition typeDefinition;
 
     public DecimalTypeEffectiveStatementImpl(
@@ -37,28 +36,23 @@ public final class DecimalTypeEffectiveStatementImpl extends DeclaredEffectiveSt
 
         for (EffectiveStatement<?, ?> stmt : effectiveSubstatements()) {
             if (stmt instanceof RangeEffectiveStatementImpl) {
-                builder.setRangeAlternatives(((RangeEffectiveStatementImpl)stmt).argument());
+                final RangeEffectiveStatementImpl range = (RangeEffectiveStatementImpl) stmt;
+                builder.setRangeConstraint(range, range.argument());
             }
             if (stmt instanceof UnknownEffectiveStatementImpl) {
                 builder.addUnknownSchemaNode((UnknownEffectiveStatementImpl)stmt);
             }
             if (stmt instanceof FractionDigitsEffectiveStatementImpl) {
                 final Integer digits = ((FractionDigitsEffectiveStatementImpl)stmt).argument();
-
-                if (!baseType.getFractionDigits().equals(digits)) {
-                    LOG.warn("Ignoring attempt to override fraction-digits to {} at {}, base type is {}", digits,
-                        ctx.getStatementSourceReference(), baseType);
-
-                    // FIXME: promote to a full error once our models are fixed
-                    // throw new SourceException(String.format("Cannot override fraction-digits from base type %s",
-                    // baseType), ctx.getStatementSourceReference());
-                }
+                SourceException.throwIf(!baseType.getFractionDigits().equals(digits), ctx.getStatementSourceReference(),
+                    "Cannot override fraction-digits from base type %s to %s", baseType, digits);
             }
         }
 
         typeDefinition = builder.build();
     }
 
+    @Nonnull
     @Override
     public DecimalTypeDefinition getTypeDefinition() {
         return typeDefinition;