/*
* 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.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ServiceConfigurationError;
import java.util.ServiceLoader;
import javax.validation.ConstraintValidator;
/**
* @author Hardy Ferentschik
*/
public class GetConstraintValidatorList implements PrivilegedAction<List<ConstraintValidator<?, ?>>> {
public static List<ConstraintValidator<?, ?>> getConstraintValidatorList() {
final GetConstraintValidatorList action = new GetConstraintValidatorList();
if ( System.getSecurityManager() != null ) {
return AccessController.doPrivileged( action );
}
else {
return action.run();
}
}
@Override
public List<ConstraintValidator<?, ?>> run() {
// Option #1: try first context class loader
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
List<ConstraintValidator<?, ?>> constraintValidatorList = loadConstraintValidators( classloader );
// Option #2: if we cannot find any service files with the context class loader use the current class loader
if ( constraintValidatorList.isEmpty() ) {
classloader = GetConstraintValidatorList.class.getClassLoader();
constraintValidatorList = loadConstraintValidators( classloader );
}
return constraintValidatorList;
}
private List<ConstraintValidator<?, ?>> loadConstraintValidators(ClassLoader classloader) {
ServiceLoader<ConstraintValidator> loader = ServiceLoader.load( ConstraintValidator.class, classloader );
Iterator<ConstraintValidator> constraintValidatorIterator = loader.iterator();
List<ConstraintValidator<?, ?>> constraintValidators = new ArrayList<ConstraintValidator<?, ?>>();
while ( constraintValidatorIterator.hasNext() ) {
try {
constraintValidators.add( constraintValidatorIterator.next() );
}
catch (ServiceConfigurationError e) {
// ignore, because it can happen when multiple
// services are present and some of them are not class loader
// compatible with our API.
}
}
return constraintValidators;
}
}