You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by rm...@apache.org on 2014/07/27 23:12:50 UTC
svn commit: r1613845 - in
/bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval:
cdi/BValExtension.java jsr/ApacheValidatorFactory.java
jsr/ConfigurationImpl.java jsr/xml/ValidationParser.java
Author: rmannibucau
Date: Sun Jul 27 21:12:50 2014
New Revision: 1613845
URL: http://svn.apache.org/r1613845
Log:
use an internal factory to know if we need to wrap cdi bean with BvalInterceptor or not
Modified:
bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java
bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/ConfigurationImpl.java
bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java
Modified: bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
URL: http://svn.apache.org/viewvc/bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java?rev=1613845&r1=1613844&r2=1613845&view=diff
==============================================================================
--- bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java (original)
+++ bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java Sun Jul 27 21:12:50 2014
@@ -18,10 +18,13 @@
*/
package org.apache.bval.cdi;
+import org.apache.bval.jsr.parameter.DefaultParameterNameProvider;
+
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.AfterDeploymentValidation;
+import javax.enterprise.inject.spi.AnnotatedCallable;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
@@ -36,11 +39,16 @@ import javax.naming.NamingException;
import javax.validation.BootstrapConfiguration;
import javax.validation.Configuration;
import javax.validation.Validation;
+import javax.validation.ValidationException;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.executable.ExecutableType;
+import javax.validation.executable.ValidateOnExecution;
+import javax.validation.metadata.BeanDescriptor;
+import javax.validation.metadata.MethodType;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
+import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
@@ -61,7 +69,14 @@ public class BValExtension implements Ex
private boolean validatorFound = Boolean.getBoolean("bval.in-container");
private boolean validatorFactoryFound = Boolean.getBoolean("bval.in-container");
+ private boolean validBean;
+ private boolean validConstructors;
+ private boolean validBusinessMethods;
+ private boolean validGetterMethods;
+
private final Configuration<?> config;
+ private ValidatorFactory factory;
+ private Validator validator;
private Set<ExecutableType> globalExecutableTypes;
private boolean isExecutableValidationEnabled;
@@ -72,6 +87,11 @@ public class BValExtension implements Ex
final BootstrapConfiguration bootstrap = config.getBootstrapConfiguration();
globalExecutableTypes = convertToRuntimeTypes(bootstrap.getDefaultValidatedExecutableTypes());
isExecutableValidationEnabled = bootstrap.isExecutableValidationEnabled();
+
+ validBean = globalExecutableTypes.contains(ExecutableType.IMPLICIT) || globalExecutableTypes.contains(ExecutableType.ALL);
+ validConstructors =validBean || globalExecutableTypes.contains(ExecutableType.CONSTRUCTORS);
+ validBusinessMethods = validBean || globalExecutableTypes.contains(ExecutableType.NON_GETTER_METHODS);
+ validGetterMethods = globalExecutableTypes.contains(ExecutableType.ALL) || globalExecutableTypes.contains(ExecutableType.GETTER_METHODS);
} catch (final Exception e) { // custom providers can throw an exception
LOGGER.log(Level.SEVERE, e.getMessage(), e);
@@ -80,6 +100,16 @@ public class BValExtension implements Ex
}
}
+ // lazily to get a small luck to have CDI in place
+ private void ensureFactoryValidator() {
+ if (validator != null) {
+ return;
+ }
+ config.addProperty("bval.before.cdi", "true"); // ignore parts of the config relying on CDI since we didn't start yet
+ factory = factory != null ? factory : config.buildValidatorFactory();
+ validator = factory.getValidator();
+ }
+
private static Set<ExecutableType> convertToRuntimeTypes(final Set<ExecutableType> defaultValidatedExecutableTypes) {
final Set<ExecutableType> types = new CopyOnWriteArraySet<ExecutableType>();
for (final ExecutableType type : defaultValidatedExecutableTypes) {
@@ -107,10 +137,6 @@ public class BValExtension implements Ex
}
public void addBvalBinding(final @Observes BeforeBeanDiscovery beforeBeanDiscovery, final BeanManager beanManager) {
- if (!isExecutableValidationEnabled) {
- return;
- }
-
beforeBeanDiscovery.addInterceptorBinding(BValBinding.class);
beforeBeanDiscovery.addAnnotatedType(beanManager.createAnnotatedType(BValInterceptor.class));
}
@@ -120,14 +146,42 @@ public class BValExtension implements Ex
return;
}
- final Class<A> javaClass = pat.getAnnotatedType().getJavaClass();
+ final AnnotatedType<A> annotatedType = pat.getAnnotatedType();
+ final Class<A> javaClass = annotatedType.getJavaClass();
final int modifiers = javaClass.getModifiers();
if (!javaClass.getName().startsWith("javax.") && !javaClass.getName().startsWith("org.apache.bval")
&& !javaClass.isInterface() && !Modifier.isFinal(modifiers) && !Modifier.isAbstract(modifiers)) {
- pat.setAnnotatedType(new BValAnnotatedType<A>(pat.getAnnotatedType()));
+ ensureFactoryValidator();
+ try {
+ final BeanDescriptor classConstraints = validator.getConstraintsForClass(javaClass);
+ if (annotatedType.isAnnotationPresent(ValidateOnExecution.class)
+ || hasValidationAnnotation(annotatedType.getMethods())
+ || hasValidationAnnotation(annotatedType.getConstructors())
+ || (validBean && classConstraints.isBeanConstrained())
+ || (validConstructors && !classConstraints.getConstrainedConstructors().isEmpty())
+ || (validBusinessMethods && !classConstraints.getConstrainedMethods(MethodType.NON_GETTER).isEmpty())
+ || (validGetterMethods && !classConstraints.getConstrainedMethods(MethodType.GETTER).isEmpty())) {
+ // TODO: keep track of bValAnnotatedType and remove @BValBinding in
+ // ProcessBean event if needed cause here we can't really add @ValidateOnExecution
+ // through an extension
+ final BValAnnotatedType<A> bValAnnotatedType = new BValAnnotatedType<A>(annotatedType);
+ pat.setAnnotatedType(bValAnnotatedType);
+ }
+ } catch (final ValidationException ve) {
+ LOGGER.log(Level.SEVERE, ve.getMessage(), ve);
+ }
}
}
+ private static <A> boolean hasValidationAnnotation(final Collection<? extends AnnotatedCallable<? super A>> methods) {
+ for (final AnnotatedCallable<? super A> m : methods) {
+ if (m.isAnnotationPresent(ValidateOnExecution.class)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public <A> void processBean(final @Observes ProcessBean<A> processBeanEvent) {
if (validatorFound && validatorFactoryFound) {
return;
@@ -148,35 +202,47 @@ public class BValExtension implements Ex
}
public void addBValBeans(final @Observes AfterBeanDiscovery afterBeanDiscovery, final BeanManager beanManager) {
- captureBeanManager(beanManager);
+ if (factory != null) { // cleanup cache used to discover ValidateOnException before factory is recreated
+ factory.close();
+ }
+
+ captureBeanManager(beanManager); // next method will need it
cdiIntegration(afterBeanDiscovery, beanManager);
}
private void captureBeanManager(final BeanManager beanManager) {
// bean manager holder
if (bmpSingleton == null) {
- bmpSingleton = this;
+ synchronized (LOGGER) { // a static instance
+ if (bmpSingleton == null) {
+ bmpSingleton = this;
+ }
+ }
}
+
final BeanManagerInfo bmi = getBeanManagerInfo(loader());
bmi.loadTimeBm = beanManager;
}
private void cdiIntegration(final AfterBeanDiscovery afterBeanDiscovery, final BeanManager beanManager) {
- // add validator and validatorFactory if needed
- ValidatorFactory factory = null;
+ try {
+ config.addProperty("bval.before.cdi", "false"); // now take into account all the config
+ } catch (final Exception e) {
+ // no-op: sadly tck does it
+ }
+
if (!validatorFactoryFound) {
- try {
- factory = config.buildValidatorFactory();
- afterBeanDiscovery.addBean(new ValidatorFactoryBean(factory));
+ try { // recreate the factory
+ afterBeanDiscovery.addBean(new ValidatorFactoryBean(factory = config.buildValidatorFactory()));
} catch (final Exception e) { // can throw an exception with custom providers
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
}
if (!validatorFound) {
try {
- if (factory == null) {
+ if (validatorFactoryFound) {
factory = config.buildValidatorFactory();
- }
+ } // else fresh factory already created in previous if
afterBeanDiscovery.addBean(new ValidatorBean(factory.getValidator()));
validatorFound = true;
} catch (final Exception e) { // getValidator can throw an exception with custom providers
@@ -216,14 +282,14 @@ public class BValExtension implements Ex
return result;
}
- public void cleanupFinalBeanManagers(final @Observes AfterDeploymentValidation adv) {
+ public void cleanupFinalBeanManagers(final @Observes AfterDeploymentValidation ignored) {
for (final BeanManagerInfo bmi : bmpSingleton.bmInfos.values()) {
bmi.finalBm = null;
}
}
- public void cleanupStoredBeanManagerOnShutdown(final @Observes BeforeShutdown beforeShutdown) {
- if (bmpSingleton.bmInfos != null) {
+ public void cleanupStoredBeanManagerOnShutdown(final @Observes BeforeShutdown ignored) {
+ if (bmpSingleton != null && bmpSingleton.bmInfos != null) {
bmpSingleton.bmInfos.remove(loader());
}
}
Modified: bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java
URL: http://svn.apache.org/viewvc/bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java?rev=1613845&r1=1613844&r2=1613845&view=diff
==============================================================================
--- bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java (original)
+++ bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java Sun Jul 27 21:12:50 2014
@@ -54,7 +54,7 @@ import java.util.concurrent.ConcurrentMa
*/
public class ApacheValidatorFactory implements ValidatorFactory, Cloneable {
private static volatile ApacheValidatorFactory DEFAULT_FACTORY;
- private static final ConstraintDefaults defaultConstraints = new ConstraintDefaults();
+ private static final ConstraintDefaults DEFAULT_CONSTRAINTS = new ConstraintDefaults();
private MessageInterpolator messageResolver;
private TraversableResolver traversableResolver;
@@ -76,6 +76,7 @@ public class ApacheValidatorFactory impl
private final ConcurrentMap<Class<?>, List<MetaConstraint<?, ? extends Annotation>>> constraintMap;
private final Collection<Closeable> toClose = new ArrayList<Closeable>();
+ private volatile boolean init;
/**
* Convenience method to retrieve a default global ApacheValidatorFactory
@@ -122,10 +123,11 @@ public class ApacheValidatorFactory impl
*/
protected void configure(final ConfigurationState configuration) {
getProperties().putAll(configuration.getProperties());
- setParameterNameProvider(configuration.getParameterNameProvider());
- setMessageInterpolator(configuration.getMessageInterpolator());
- setTraversableResolver(configuration.getTraversableResolver());
- setConstraintValidatorFactory(configuration.getConstraintValidatorFactory());
+
+ parameterNameProvider = configuration.getParameterNameProvider();
+ messageResolver = configuration.getMessageInterpolator();
+ traversableResolver = configuration.getTraversableResolver();
+ constraintValidatorFactory = configuration.getConstraintValidatorFactory();
if (ConfigurationImpl.class.isInstance(configuration)) {
final ConfigurationImpl impl = ConfigurationImpl.class.cast(configuration);
@@ -305,7 +307,7 @@ public class ApacheValidatorFactory impl
* @return ConstraintDefaults
*/
public ConstraintDefaults getDefaultConstraints() {
- return defaultConstraints;
+ return DEFAULT_CONSTRAINTS;
}
/**
Modified: bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/ConfigurationImpl.java
URL: http://svn.apache.org/viewvc/bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/ConfigurationImpl.java?rev=1613845&r1=1613844&r2=1613845&view=diff
==============================================================================
--- bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/ConfigurationImpl.java (original)
+++ bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/ConfigurationImpl.java Sun Jul 27 21:12:50 2014
@@ -18,7 +18,7 @@
*/
package org.apache.bval.jsr;
-
+import org.apache.bval.cdi.BValExtension;
import org.apache.bval.jsr.parameter.DefaultParameterNameProvider;
import org.apache.bval.jsr.resolver.DefaultTraversableResolver;
import org.apache.bval.jsr.util.IOs;
@@ -37,6 +37,7 @@ import javax.validation.spi.BootstrapSta
import javax.validation.spi.ConfigurationState;
import javax.validation.spi.ValidationProvider;
import java.io.Closeable;
+import java.io.IOException;
import java.io.InputStream;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -46,7 +47,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.logging.Logger;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* Description: used to configure apache-validation for jsr.
@@ -55,8 +56,6 @@ import java.util.logging.Logger;
* <br/>
*/
public class ConfigurationImpl implements ApacheValidatorConfiguration, ConfigurationState {
- private static final Logger log = Logger.getLogger(ConfigurationImpl.class.getName());
-
/**
* Configured {@link ValidationProvider}
*/
@@ -78,23 +77,31 @@ public class ConfigurationImpl implement
*/
protected MessageInterpolator defaultMessageInterpolator = new DefaultMessageInterpolator();
protected MessageInterpolator messageInterpolator = defaultMessageInterpolator;
+ protected Class<? extends MessageInterpolator> messageInterpolatorClass = null;
/**
* Configured {@link ConstraintValidatorFactory}
*/
protected ConstraintValidatorFactory defaultConstraintValidatorFactory = new DefaultConstraintValidatorFactory();
protected ConstraintValidatorFactory constraintValidatorFactory = defaultConstraintValidatorFactory;
+ protected Class<? extends ConstraintValidatorFactory> constraintValidatorFactoryClass = null;
- private TraversableResolver defaultTraversableResolver = new DefaultTraversableResolver();
- private TraversableResolver traversableResolver = defaultTraversableResolver;
+ protected TraversableResolver defaultTraversableResolver = new DefaultTraversableResolver();
+ protected TraversableResolver traversableResolver = defaultTraversableResolver;
+ protected Class<? extends TraversableResolver> traversableResolverClass = null;
protected ParameterNameProvider defaultParameterNameProvider = new DefaultParameterNameProvider();
protected ParameterNameProvider parameterNameProvider = defaultParameterNameProvider;
+ protected Class<? extends ParameterNameProvider> parameterNameProviderClass = null;
protected BootstrapConfiguration bootstrapConfiguration;
protected Collection<ExecutableType> executableValidation;
+ private Collection<BValExtension.Releasable> releasables = new CopyOnWriteArrayList<BValExtension.Releasable>();
+
+ private boolean beforeCdi = false;
+
// BEGIN DEFAULTS
/**
* false = dirty flag (to prevent from multiple parsing validation.xml)
@@ -110,8 +117,8 @@ public class ConfigurationImpl implement
/**
* Create a new ConfigurationImpl instance.
- * @param aState
- * @param aProvider
+ * @param aState bootstrap state
+ * @param aProvider provider
*/
public ConfigurationImpl(BootstrapState aState, ValidationProvider<?> aProvider) {
if (aProvider != null) {
@@ -136,7 +143,9 @@ public class ConfigurationImpl implement
if (resolver == null) {
return this;
}
- traversableResolver = resolver;
+
+ this.traversableResolverClass = null;
+ this.traversableResolver = resolver;
this.prepared = false;
return this;
}
@@ -160,6 +169,8 @@ public class ConfigurationImpl implement
if (resolver == null) {
return this;
}
+
+ this.messageInterpolatorClass = null;
this.messageInterpolator = resolver;
this.prepared = false;
return this;
@@ -174,6 +185,7 @@ public class ConfigurationImpl implement
return this;
}
+ this.constraintValidatorFactoryClass = null;
this.constraintValidatorFactory = constraintFactory;
this.prepared = false;
return this;
@@ -183,6 +195,7 @@ public class ConfigurationImpl implement
if (parameterNameProvider == null) {
return this;
}
+ this.parameterNameProviderClass = null;
this.parameterNameProvider = parameterNameProvider;
return this;
}
@@ -211,7 +224,11 @@ public class ConfigurationImpl implement
* @return this
*/
public ApacheValidatorConfiguration addProperty(String name, String value) {
- properties.put(name, value);
+ if ("bval.before.cdi".equals(name)) {
+ beforeCdi = Boolean.parseBoolean(value);
+ } else {
+ properties.put(name, value);
+ }
return this;
}
@@ -263,6 +280,17 @@ public class ConfigurationImpl implement
* {@inheritDoc}
*/
public MessageInterpolator getMessageInterpolator() {
+ if (beforeCdi) {
+ return defaultMessageInterpolator;
+ }
+
+ if (messageInterpolator == defaultMessageInterpolator && messageInterpolatorClass != null) {
+ synchronized (this) {
+ if (messageInterpolator == defaultMessageInterpolator && messageInterpolatorClass != null) {
+ messageInterpolator = newInstance(messageInterpolatorClass);
+ }
+ }
+ }
return messageInterpolator;
}
@@ -332,6 +360,17 @@ public class ConfigurationImpl implement
* @return the constraint validator factory of this configuration.
*/
public ConstraintValidatorFactory getConstraintValidatorFactory() {
+ if (beforeCdi) {
+ return constraintValidatorFactory;
+ }
+
+ if (constraintValidatorFactory == defaultConstraintValidatorFactory && constraintValidatorFactoryClass != null) {
+ synchronized (this) {
+ if (constraintValidatorFactory == defaultConstraintValidatorFactory && constraintValidatorFactoryClass != null) {
+ constraintValidatorFactory = newInstance(constraintValidatorFactoryClass);
+ }
+ }
+ }
return constraintValidatorFactory;
}
@@ -339,10 +378,32 @@ public class ConfigurationImpl implement
* {@inheritDoc}
*/
public TraversableResolver getTraversableResolver() {
+ if (beforeCdi) {
+ return defaultTraversableResolver;
+ }
+
+ if (traversableResolver == defaultTraversableResolver && traversableResolverClass != null) {
+ synchronized (this) {
+ if (traversableResolver == defaultTraversableResolver && traversableResolverClass != null) {
+ traversableResolver = newInstance(traversableResolverClass);
+ }
+ }
+ }
return traversableResolver;
}
public ParameterNameProvider getParameterNameProvider() {
+ if (beforeCdi) {
+ return defaultParameterNameProvider;
+ }
+
+ if (parameterNameProvider == defaultParameterNameProvider && parameterNameProviderClass != null) {
+ synchronized (this) {
+ if (parameterNameProvider == defaultParameterNameProvider && parameterNameProviderClass != null) {
+ parameterNameProvider = newInstance(parameterNameProviderClass);
+ }
+ }
+ }
return parameterNameProvider;
}
@@ -372,7 +433,7 @@ public class ConfigurationImpl implement
/**
* Set {@link ValidationProvider} class.
- * @param providerClass
+ * @param providerClass the provider type
*/
public void setProviderClass(Class<? extends ValidationProvider<?>> providerClass) {
this.providerClass = providerClass;
@@ -400,14 +461,64 @@ public class ConfigurationImpl implement
}
public Closeable getClosable() {
- return parser;
+ return new Closeable() {
+ public void close() throws IOException {
+ for (final BValExtension.Releasable<?> releasable : releasables) {
+ releasable.release();
+ }
+ releasables.clear();
+ }
+ };
+ }
+
+ private <T> T newInstance(final Class<T> cls) {
+ if (System.getSecurityManager() == null) {
+ return createInstance(cls);
+ }
+ return AccessController.doPrivileged(new PrivilegedAction<T>() {
+ public T run() {
+ return createInstance(cls);
+ }
+ });
+ }
+
+ private <T> T createInstance(final Class<T> cls) {
+ try {
+ final BValExtension.Releasable<T> releasable = BValExtension.inject(cls);
+ releasables.add(releasable);
+ return releasable.getInstance();
+ } catch (final Exception e) {
+ try {
+ return cls.newInstance();
+ } catch (final InstantiationException e1) {
+ throw new ValidationException(e1.getMessage(), e1);
+ } catch (final IllegalAccessException e1) {
+ throw new ValidationException(e1.getMessage(), e1);
+ }
+ } catch (final NoClassDefFoundError error) {
+ try {
+ return cls.newInstance();
+ } catch (final InstantiationException e1) {
+ throw new ValidationException(e1.getMessage(), e1);
+ } catch (final IllegalAccessException e1) {
+ throw new ValidationException(e1.getMessage(), e1);
+ }
+ }
+ }
+
+ public void traversableResolverClass(final Class<TraversableResolver> clazz) {
+ traversableResolverClass = clazz;
+ }
+
+ public void constraintValidatorFactoryClass(final Class<ConstraintValidatorFactory> clazz) {
+ constraintValidatorFactoryClass = clazz;
}
- public ValidationParser getParser() {
- return parser;
+ public void messageInterpolatorClass(final Class<MessageInterpolator> clazz) {
+ messageInterpolatorClass = clazz;
}
- public void setParser(ValidationParser parser) {
- this.parser = parser;
+ public void parameterNameProviderClass(final Class<? extends ParameterNameProvider> clazz) {
+ parameterNameProviderClass = clazz;
}
}
Modified: bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java
URL: http://svn.apache.org/viewvc/bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java?rev=1613845&r1=1613844&r2=1613845&view=diff
==============================================================================
--- bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java (original)
+++ bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java Sun Jul 27 21:12:50 2014
@@ -18,8 +18,6 @@
*/
package org.apache.bval.jsr.xml;
-
-import org.apache.bval.cdi.BValExtension;
import org.apache.bval.jsr.BootstrapConfigurationImpl;
import org.apache.bval.jsr.ConfigurationImpl;
import org.apache.bval.jsr.util.IOs;
@@ -41,7 +39,6 @@ import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
-import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
@@ -63,7 +60,7 @@ import java.util.logging.Logger;
* Description: uses jaxb to parse validation.xml<br/>
*/
@SuppressWarnings("restriction")
-public class ValidationParser implements Closeable {
+public class ValidationParser {
private static final String DEFAULT_VALIDATION_XML_FILE = "META-INF/validation.xml";
private static final String VALIDATION_CONFIGURATION_XSD = "META-INF/validation-configuration-1.1.xsd";
private static final Logger log = Logger.getLogger(ValidationParser.class.getName());
@@ -72,7 +69,6 @@ public class ValidationParser implements
private ValidationConfigType xmlConfig;
private BootstrapConfigurationImpl bootstrap;
private Collection<ValidationException> exceptions = new CopyOnWriteArrayList<ValidationException>();
- private Collection<BValExtension.Releasable> releasables = new CopyOnWriteArrayList<BValExtension.Releasable>();
private ValidationParser() {
// no-op
@@ -273,7 +269,7 @@ public class ValidationParser implements
if (targetConfig.getParameterNameProvider() == targetConfig.getDefaultParameterNameProvider()) { // ref ==
if (parameterNameProvider != null) {
final Class<? extends ParameterNameProvider> clazz = Class.class.cast(loadClass(parameterNameProvider));
- targetConfig.parameterNameProvider(newInstance(clazz));
+ targetConfig.parameterNameProviderClass(clazz);
log.log(Level.INFO, String.format("Using %s as validation provider.", parameterNameProvider));
}
}
@@ -298,7 +294,7 @@ public class ValidationParser implements
if (messageInterpolatorClass != null) {
Class<MessageInterpolator> clazz = (Class<MessageInterpolator>)
loadClass(messageInterpolatorClass);
- target.messageInterpolator(newInstance(clazz));
+ target.messageInterpolatorClass(clazz);
log.log(Level.INFO, String.format("Using %s as message interpolator.", messageInterpolatorClass));
}
}
@@ -312,40 +308,12 @@ public class ValidationParser implements
if (traversableResolverClass != null) {
Class<TraversableResolver> clazz = (Class<TraversableResolver>)
loadClass(traversableResolverClass);
- target.traversableResolver(newInstance(clazz));
+ target.traversableResolverClass(clazz);
log.log(Level.INFO, String.format("Using %s as traversable resolver.", traversableResolverClass));
}
}
}
- private <T> T newInstance(final Class<T> cls) {
- if (System.getSecurityManager() == null) {
- return doNewInstance(cls);
- }
- return AccessController.doPrivileged(new PrivilegedAction<T>() {
- public T run() {
- return doNewInstance(cls);
- }
- });
- }
-
- private <T> T doNewInstance(final Class<T> cls) {
- try {
- try {
- final BValExtension.Releasable<T> releasable = BValExtension.inject(cls);
- releasables.add(releasable);
- return releasable.getInstance();
- } catch (final Exception e) {
- return cls.newInstance();
- } catch (final NoClassDefFoundError error) {
- return cls.newInstance();
- }
- } catch (final Exception ex) {
- exceptions.add(new ValidationException("Cannot instantiate : " + cls, ex));
- return null; // ensure BootstrapConfiguration can be read even if class can't be instantiated
- }
- }
-
@SuppressWarnings("unchecked")
private void applyConstraintFactory(ValidationConfigType xmlConfig,
ConfigurationImpl target) {
@@ -354,7 +322,7 @@ public class ValidationParser implements
if (constraintFactoryClass != null) {
Class<ConstraintValidatorFactory> clazz = (Class<ConstraintValidatorFactory>)
loadClass(constraintFactoryClass);
- target.constraintValidatorFactory(newInstance(clazz));
+ target.constraintValidatorFactoryClass(clazz);
log.log(Level.INFO, String.format("Using %s as constraint factory.", constraintFactoryClass));
}
}
@@ -402,11 +370,4 @@ public class ValidationParser implements
throw exceptions.iterator().next();
}
}
-
- public void close() throws IOException {
- for (final BValExtension.Releasable<?> releasable : releasables) {
- releasable.release();
- }
- releasables.clear();
- }
}