From 6ec25955ea5d5263b0a8dd49cd66a0f7ab7c0641 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 17 Aug 2017 14:44:12 +0200 Subject: [PATCH] Improve length constraint checks If we have an unrestricted string/binary or the constraint is satisfied by the combination of String/array length return values and integer value domain, we can skip the checks altogether, leading to less generated code. Cuts down size of ietf-inet-types by 1%. Change-Id: Ibd8ea57a4746e1332447dd5454b36407d066ea0a Signed-off-by: Robert Varga --- .../java/api/generator/LengthGenerator.java | 50 +++++++++++-------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/LengthGenerator.java b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/LengthGenerator.java index df7cdd7885..0e11d9c99c 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/LengthGenerator.java +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/LengthGenerator.java @@ -16,8 +16,12 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.opendaylight.mdsal.binding.model.api.Type; import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; final class LengthGenerator { + private static final Logger LOG = LoggerFactory.getLogger(LengthGenerator.class); + private LengthGenerator() { throw new UnsupportedOperationException(); } @@ -30,20 +34,26 @@ final class LengthGenerator { final Collection ret = new ArrayList<>(constraints.size()); for (LengthConstraint l : constraints) { - final StringBuilder sb = new StringBuilder("length >"); - // We have to deal with restrictions being out of integer's range - if (l.getMin().longValue() <= Integer.MAX_VALUE) { - sb.append('='); - } - sb.append(' ').append(l.getMin().intValue()); - - final int max = l.getMax().intValue(); - if (max < Integer.MAX_VALUE) { - sb.append(" && length <= ").append(max); + final long min = l.getMin().longValue(); + final long max = l.getMax().longValue(); + + if (min > 0 || max < Integer.MAX_VALUE) { + final StringBuilder sb = new StringBuilder("length >"); + if (min <= Integer.MAX_VALUE) { + sb.append('='); + } + sb.append(' ').append(min); + + if (max < Integer.MAX_VALUE) { + sb.append(" && length <= ").append(max); + } + + ret.add(sb.toString()); + } else { + // This range is implicitly capped by String/byte[] length returns + LOG.debug("Constraint {} implied by int type value domain, skipping", l); } - - ret.add(sb.toString()); } return ret; @@ -59,7 +69,8 @@ final class LengthGenerator { return ranges.toString(); } - private static String generateArrayLengthChecker(final String member, final Collection constraints) { + private static String generateArrayLengthChecker(final String member, + final Collection constraints) { final StringBuilder sb = new StringBuilder(); final Collection expressions = createExpressions(constraints); @@ -83,7 +94,8 @@ final class LengthGenerator { return sb.toString(); } - private static String generateStringLengthChecker(final String member, final Collection constraints) { + private static String generateStringLengthChecker(final String member, + final Collection constraints) { final StringBuilder sb = new StringBuilder(); final Collection expressions = createExpressions(constraints); @@ -107,12 +119,10 @@ final class LengthGenerator { return sb.toString(); } - static String generateLengthChecker(final String member, final Type type, final Collection constraints) { - if (TypeUtils.getBaseYangType(type).getName().contains("[")) { - return generateArrayLengthChecker(member, constraints); - } else { - return generateStringLengthChecker(member, constraints); - } + static String generateLengthChecker(final String member, final Type type, + final Collection constraints) { + return TypeUtils.getBaseYangType(type).getName().indexOf('[') != -1 + ? generateArrayLengthChecker(member, constraints) : generateStringLengthChecker(member, constraints); } static String generateLengthCheckerCall(@Nullable final String member, @Nonnull final String valueReference) { -- 2.36.6