Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Remove SecurityManager related code from API #243

Merged
merged 2 commits into from
Feb 20, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 12 additions & 54 deletions src/main/java/jakarta/validation/Validation.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
package jakarta.validation;

import java.lang.ref.SoftReference;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
Expand Down Expand Up @@ -163,7 +161,7 @@ ProviderSpecificBootstrap<T> byProvider(Class<U> providerType) {
*/
@SuppressWarnings("unused")
private static void clearDefaultValidationProviderResolverCache() {
GetValidationProviderListAction.INSTANCE.clearCache();
DefaultValidationProviderResolver.clearCache();
}

//private class, not exposed
Expand Down Expand Up @@ -210,8 +208,14 @@ public T configure() {

// if no resolver is given, simply instantiate the given provider
if ( resolver == null ) {
U provider = run( NewProviderInstance.action( validationProviderClass ) );
return provider.createSpecializedConfiguration( state );

try {
U provider = validationProviderClass.newInstance();
return provider.createSpecializedConfiguration( state );
}
catch (InstantiationException | IllegalAccessException | RuntimeException e) {
throw new ValidationException( "Cannot instantiate provider type: " + validationProviderClass, e );
}
}
else {
//stay null if no resolver is defined
Expand All @@ -235,10 +239,6 @@ public T configure() {
}
throw new ValidationException( "Unable to find provider: " + validationProviderClass );
}

private <P> P run(PrivilegedAction<P> action) {
return System.getSecurityManager() != null ? AccessController.doPrivileged( action ) : action.run();
}
}

//private class, not exposed
Expand Down Expand Up @@ -314,37 +314,18 @@ public Configuration<?> configure() {
* @author Hardy Ferentschik
*/
private static class DefaultValidationProviderResolver implements ValidationProviderResolver {
@Override
public List<ValidationProvider<?>> getValidationProviders() {
// class loading and ServiceLoader methods should happen in a PrivilegedAction
return GetValidationProviderListAction.getValidationProviderList();
}
}

private static class GetValidationProviderListAction implements PrivilegedAction<List<ValidationProvider<?>>> {

private final static GetValidationProviderListAction INSTANCE = new GetValidationProviderListAction();

//cache per classloader for an appropriate discovery
//keep them in a weak hash map to avoid memory leaks and allow proper hot redeployment
private final WeakHashMap<ClassLoader, SoftReference<List<ValidationProvider<?>>>> providersPerClassloader =
private static final WeakHashMap<ClassLoader, SoftReference<List<ValidationProvider<?>>>> providersPerClassloader =
new WeakHashMap<>();

public static synchronized List<ValidationProvider<?>> getValidationProviderList() {
if ( System.getSecurityManager() != null ) {
return AccessController.doPrivileged( INSTANCE );
}
else {
return INSTANCE.run();
}
}

public synchronized void clearCache() {
public static synchronized void clearCache() {
providersPerClassloader.clear();
}

@Override
public List<ValidationProvider<?>> run() {
public List<ValidationProvider<?>> getValidationProviders() {
// Option #1: try first context class loader
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
List<ValidationProvider<?>> cachedContextClassLoaderProviderList = getCachedValidationProviders( classloader );
Expand Down Expand Up @@ -400,27 +381,4 @@ private synchronized void cacheValidationProviders(ClassLoader classLoader, List
providersPerClassloader.put( classLoader, new SoftReference<>( providers ) );
}
}

private static class NewProviderInstance<T extends ValidationProvider<?>> implements PrivilegedAction<T> {

private final Class<T> clazz;

public static <T extends ValidationProvider<?>> NewProviderInstance<T> action(Class<T> clazz) {
return new NewProviderInstance<>( clazz );
}

private NewProviderInstance(Class<T> clazz) {
this.clazz = clazz;
}

@Override
public T run() {
try {
return clazz.newInstance();
}
catch (InstantiationException | IllegalAccessException | RuntimeException e) {
throw new ValidationException( "Cannot instantiate provider type: " + clazz, e );
}
}
}
}
Loading