diff --git a/engine/src/main/java/org/hibernate/validator/internal/metadata/core/ConstraintHelper.java b/engine/src/main/java/org/hibernate/validator/internal/metadata/core/ConstraintHelper.java index ce4f07622f..0ad4ee8fa7 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/metadata/core/ConstraintHelper.java +++ b/engine/src/main/java/org/hibernate/validator/internal/metadata/core/ConstraintHelper.java @@ -79,7 +79,6 @@ import javax.validation.Constraint; import javax.validation.ConstraintTarget; import javax.validation.ConstraintValidator; -import javax.validation.ValidationException; import javax.validation.constraints.AssertFalse; import javax.validation.constraints.AssertTrue; import javax.validation.constraints.DecimalMax; @@ -348,7 +347,7 @@ import org.hibernate.validator.internal.util.privilegedactions.GetAnnotationAttribute; import org.hibernate.validator.internal.util.privilegedactions.GetDeclaredMethods; import org.hibernate.validator.internal.util.privilegedactions.GetMethod; -import org.hibernate.validator.internal.util.privilegedactions.LoadClass; +import org.hibernate.validator.internal.util.privilegedactions.IsClassPresent; import org.hibernate.validator.internal.util.stereotypes.Immutable; /** @@ -382,6 +381,12 @@ public class ConstraintHelper { private final ValidatorDescriptorMap validatorDescriptors = new ValidatorDescriptorMap(); + private Boolean javaMoneyInClasspath; + + private Boolean jodaTimeInClassPath; + + private Boolean jsoupInClasspath; + public static ConstraintHelper forAllBuiltinConstraints() { return new ConstraintHelper( new HashSet<>( Arrays.asList( BuiltinConstraint.values() ) ) ); } @@ -1092,16 +1097,25 @@ public void clear() { multiValueConstraints.clear(); } - private static boolean isJodaTimeInClasspath() { - return isClassPresent( JODA_TIME_CLASS_NAME ); + private boolean isJodaTimeInClasspath() { + if ( jodaTimeInClassPath == null ) { + jodaTimeInClassPath = isClassPresent( JODA_TIME_CLASS_NAME ); + } + return jodaTimeInClassPath.booleanValue(); } - private static boolean isJavaMoneyInClasspath() { - return isClassPresent( JAVA_MONEY_CLASS_NAME ); + private boolean isJavaMoneyInClasspath() { + if ( javaMoneyInClasspath == null ) { + javaMoneyInClasspath = isClassPresent( JAVA_MONEY_CLASS_NAME ); + } + return javaMoneyInClasspath.booleanValue(); } - private static boolean isJsoupInClasspath() { - return isClassPresent( JSOUP_CLASS_NAME ); + private boolean isJsoupInClasspath() { + if ( jsoupInClasspath == null ) { + jsoupInClasspath = isClassPresent( JSOUP_CLASS_NAME ); + } + return jsoupInClasspath.booleanValue(); } /** @@ -1133,13 +1147,7 @@ private List> getDefault } private static boolean isClassPresent(String className) { - try { - run( LoadClass.action( className, ConstraintHelper.class.getClassLoader(), false ) ); - return true; - } - catch (ValidationException e) { - return false; - } + return run( IsClassPresent.action( className, ConstraintHelper.class.getClassLoader() ) ).booleanValue(); } /** diff --git a/engine/src/main/java/org/hibernate/validator/internal/util/privilegedactions/IsClassPresent.java b/engine/src/main/java/org/hibernate/validator/internal/util/privilegedactions/IsClassPresent.java new file mode 100644 index 0000000000..dffd319ae1 --- /dev/null +++ b/engine/src/main/java/org/hibernate/validator/internal/util/privilegedactions/IsClassPresent.java @@ -0,0 +1,39 @@ +/* + * Hibernate Validator, declare and validate application constraints + * + * License: Apache License, Version 2.0 + * See the license.txt file in the root directory or . + */ +package org.hibernate.validator.internal.util.privilegedactions; + +import java.security.PrivilegedAction; + +/** + * Checks if an external class is present in the provided class loader. + */ +public final class IsClassPresent implements PrivilegedAction { + + private final String className; + + private final ClassLoader classLoader; + + public static IsClassPresent action(String className, ClassLoader classLoader) { + return new IsClassPresent( className, classLoader ); + } + + private IsClassPresent(String className, ClassLoader classLoader) { + this.className = className; + this.classLoader = classLoader; + } + + @Override + public Boolean run() { + try { + Class.forName( className, false, classLoader ); + return Boolean.TRUE; + } + catch (ClassNotFoundException e) { + return Boolean.FALSE; + } + } +}