X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-java-api-generator%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fjava%2Fapi%2Fgenerator%2FDecimal64RangeGenerator.java;h=93342e7096e65431dcf63992bc1de3e8f0444dee;hb=879a082d90ce368b344c6e9bb48cbf2f1b2a9e3b;hp=dcb6497a1e72f39f8c302049ef537b3e9a72ff4e;hpb=d9e4421ac02e510b7cef6ab73cfe569dc3c1f89c;p=mdsal.git diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/Decimal64RangeGenerator.java b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/Decimal64RangeGenerator.java index dcb6497a1e..93342e7096 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/Decimal64RangeGenerator.java +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/Decimal64RangeGenerator.java @@ -7,18 +7,41 @@ */ package org.opendaylight.mdsal.binding.java.api.generator; +import com.google.common.collect.Range; +import java.lang.reflect.Array; +import java.util.Locale; +import java.util.Set; +import java.util.function.Function; +import org.opendaylight.yangtools.yang.binding.CodeHelpers; import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.Uint16; import org.opendaylight.yangtools.yang.common.Uint8; +import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; -final class Decimal64RangeGenerator extends AbstractBigRangeGenerator { +/** + * Decimal64 boundary check generator. It requires instantiation of boundary values -- these are implemented by + * generating an array constant within the class, which contains {@link Range} instances, which hold pre-instantiated + * boundary values. + */ +final class Decimal64RangeGenerator extends AbstractRangeGenerator { Decimal64RangeGenerator() { super(Decimal64.class); } - @Override - protected String format(final Decimal64 value) { - return "org.opendaylight.yangtools.yang.common.Decimal64.valueOf(\"" + value + "\")"; + private static String range(final Function, String> classImporter) { + return classImporter.apply(Range.class); + } + + private static String itemType(final Function, String> classImporter) { + return range(classImporter) + '<' + classImporter.apply(Decimal64.class) + '>'; + } + + private static String arrayType(final Function, String> classImporter) { + return itemType(classImporter) + "[]"; + } + + private static String format(final Function, String> classImporter, final Decimal64 value) { + return classImporter.apply(Decimal64.class) + ".of(" + value.scale() + ", " + value.unscaledValue() + "L)"; } @Override @@ -33,4 +56,49 @@ final class Decimal64RangeGenerator extends AbstractBigRangeGenerator return Decimal64.valueOf(1, value.longValue()); } } + + @Override + protected String generateRangeCheckerImplementation(final String checkerName, + final RangeConstraint constraint, final Function, String> classImporter) { + final Set> constraints = constraint.getAllowedRanges().asRanges(); + final String fieldName = checkerName.toUpperCase(Locale.ENGLISH) + "_RANGES"; + final StringBuilder sb = new StringBuilder(); + + // Field to hold the Range objects in an array + sb.append("private static final ").append(arrayType(classImporter)).append(' ').append(fieldName).append(";\n"); + + // Static initializer block for the array + sb.append("static {\n"); + sb.append(" @SuppressWarnings(\"unchecked\")\n"); + sb.append(" final ").append(arrayType(classImporter)).append(" a = (").append(arrayType(classImporter)) + .append(") ").append(classImporter.apply(Array.class)).append(".newInstance(").append(range(classImporter)) + .append(".class, ").append(constraints.size()).append(");\n"); + + int offset = 0; + for (Range r : constraints) { + final String min = format(classImporter, getValue(r.lowerEndpoint())); + final String max = format(classImporter, getValue(r.upperEndpoint())); + + sb.append(" a[").append(offset++).append("] = ").append(range(classImporter)).append(".closed(") + .append(min).append(", ").append(max).append(");\n"); + } + + sb.append(" ").append(fieldName).append(" = a;\n"); + sb.append("}\n"); + + // Static enforcement method + sb.append("private static void ").append(checkerName).append("(final ").append(getTypeName()) + .append(" value) {\n"); + sb.append(" for (").append(itemType(classImporter)).append(" r : ").append(fieldName).append(") {\n"); + sb.append(" if (r.contains(value)) {\n"); + sb.append(" return;\n"); + sb.append(" }\n"); + sb.append(" }\n"); + + sb.append(" ").append(classImporter.apply(CodeHelpers.class)).append(".throwInvalidRange(").append(fieldName) + .append(", value);\n"); + sb.append("}\n"); + + return sb.toString(); + } }