Skip to content

Commit

Permalink
HV-1767 Optimize how optional features are detected
Browse files Browse the repository at this point in the history
  • Loading branch information
gsmet committed Apr 17, 2020
1 parent 301f87a commit 95a1810
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 15 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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() ) ) );
}
Expand Down Expand Up @@ -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();
}

/**
Expand Down Expand Up @@ -1133,13 +1147,7 @@ private <A extends Annotation> List<ConstraintValidatorDescriptor<A>> 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();
}

/**
Expand Down
@@ -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 <http://www.apache.org/licenses/LICENSE-2.0>.
*/
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<Boolean> {

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;
}
}
}

0 comments on commit 95a1810

Please sign in to comment.