From 4fff500e42af44953689dbfcca990efc7088f0b2 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 11 Apr 2018 17:32:35 +0200 Subject: [PATCH] Fixup DerivedStringValidator representation checking Validated DerviedStrings need to define compareTo() on the base representation, disable the check for validators. JIRA: YANGTOOLS-418 Change-Id: I8413674d15fc4caf7492402ddfb92e4de05d9c3f Signed-off-by: Robert Varga --- .../AbstractDerivedStringValidator.java | 2 +- .../yangtools/yang/common/DerivedString.java | 31 +++++++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/AbstractDerivedStringValidator.java b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/AbstractDerivedStringValidator.java index 40c98f9797..fcac4cb68e 100644 --- a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/AbstractDerivedStringValidator.java +++ b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/AbstractDerivedStringValidator.java @@ -32,7 +32,7 @@ public abstract class AbstractDerivedStringValidator, protected AbstractDerivedStringValidator(final DerivedStringSupport representationSupport, final Class validatedClass) { this.representationSupport = requireNonNull(representationSupport); - this.validatedClass = DerivedString.validateRepresentationClass(validatedClass); + this.validatedClass = DerivedString.validateValidationClass(validatedClass); } @Override diff --git a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/DerivedString.java b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/DerivedString.java index 3dc1522439..edfcc6046d 100644 --- a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/DerivedString.java +++ b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/DerivedString.java @@ -15,6 +15,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; import java.util.Arrays; import javax.annotation.concurrent.ThreadSafe; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.concepts.Immutable; @@ -80,11 +81,11 @@ import org.slf4j.LoggerFactory; @NonNullByDefault @ThreadSafe public abstract class DerivedString> implements Comparable, Immutable, Serializable { - private static final class Validator extends ClassValue { - private static final Logger LOG = LoggerFactory.getLogger(Validator.class); + private abstract static class AbstractValidator extends ClassValue { + private static final Logger LOG = LoggerFactory.getLogger(AbstractValidator.class); @Override - protected Boolean computeValue(final @Nullable Class type) { + protected final Boolean computeValue(final @Nullable Class type) { // Every DerivedString representation class must: checkArgument(DerivedString.class.isAssignableFrom(type), "%s is not a DerivedString", type); @@ -114,7 +115,6 @@ public abstract class DerivedString> implements Compa checkFinalMethod(type, "support"); checkFinalMethod(type, "hashCode"); checkFinalMethod(type, "equals", Object.class); - checkFinalMethod(type, "compareTo", type); } catch (SecurityException e) { LOG.warn("Cannot completely validate {}", type, e); return Boolean.FALSE; @@ -123,6 +123,8 @@ public abstract class DerivedString> implements Compa return Boolean.TRUE; } + abstract void checkCompareTo(Class type); + private static void checkFinalMethod(final Class type, final String name) { try { checkFinalMethod(type.getMethod(name).getModifiers(), type, name, ""); @@ -131,7 +133,7 @@ public abstract class DerivedString> implements Compa } } - private static void checkFinalMethod(final Class type, final String name, final Class arg) { + static void checkFinalMethod(final Class type, final String name, final Class arg) { final String argName = arg.getSimpleName(); try { checkFinalMethod(type.getMethod(name, arg).getModifiers(), type, name, argName); @@ -146,7 +148,18 @@ public abstract class DerivedString> implements Compa } } - private static final ClassValue VALIDATED_REPRESENTATIONS = new Validator(); + private static final ClassValue VALIDATED_REPRESENTATIONS = new AbstractValidator() { + @Override + void checkCompareTo(@NonNull final Class type) { + checkFinalMethod(type, "compareTo", type); + } + }; + private static final ClassValue VALIDATED_VALIDATIONS = new AbstractValidator() { + @Override + void checkCompareTo(@NonNull final Class type) { + // Intentional no-op, as we'd need a type capture of the representation + } + }; private static final long serialVersionUID = 1L; /** @@ -189,4 +202,10 @@ public abstract class DerivedString> implements Compa VALIDATED_REPRESENTATIONS.get(representationClass); return representationClass; } + + static > Class validateValidationClass(final Class representationClass) { + // Validation is reflective, cache its result + VALIDATED_VALIDATIONS.get(representationClass); + return representationClass; + } } -- 2.36.6