From 3f6c5f7cb130fb78ae61f554ef27d715c8e92f2e Mon Sep 17 00:00:00 2001 From: Ben Alex Date: Wed, 6 Apr 2005 08:28:13 +0000 Subject: [PATCH] Bug fixes. --- .../IntrospectionManagerHibernate.java | 4 +- .../ValidationRegistryManagerImpl.java | 68 +++++++++++++++---- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java b/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java index 6544c991a2..9c027a39ed 100644 --- a/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java +++ b/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java @@ -94,7 +94,9 @@ public class IntrospectionManagerHibernate implements IntrospectionManager, .keySet(); for (Iterator iter = mappedClasses.iterator(); iter.hasNext();) { - this.validationRegistryManager.findValidator((Class) iter.next()); + String className = (String) iter.next(); + this.validationRegistryManager.findValidator(Class.forName( + className)); } } diff --git a/domain/src/main/java/org/acegisecurity/domain/validation/ValidationRegistryManagerImpl.java b/domain/src/main/java/org/acegisecurity/domain/validation/ValidationRegistryManagerImpl.java index a3ca6b415e..be79745ea5 100644 --- a/domain/src/main/java/org/acegisecurity/domain/validation/ValidationRegistryManagerImpl.java +++ b/domain/src/main/java/org/acegisecurity/domain/validation/ValidationRegistryManagerImpl.java @@ -15,6 +15,11 @@ package net.sf.acegisecurity.domain.validation; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; + import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -56,18 +61,27 @@ import java.util.Map; * @author Ben Alex * @version $Id$ */ -public class ValidationRegistryManagerImpl implements ValidationRegistryManager { +public class ValidationRegistryManagerImpl implements ValidationRegistryManager, + BeanFactoryAware { //~ Static fields/initializers ============================================= private static final String VALIDATOR_SUFFIX = "Validator"; //~ Instance fields ======================================================== + private AutowireCapableBeanFactory acbf; private Map validatorMap = new HashMap(); private String[] validatorSearchPath; //~ Methods ================================================================ + public void setBeanFactory(BeanFactory beanFactory) + throws BeansException { + Assert.isInstanceOf(AutowireCapableBeanFactory.class, beanFactory, + "BeanFactory must be AutowireCapableBeanFactory"); + this.acbf = (AutowireCapableBeanFactory) beanFactory; + } + public void setValidatorSearchPath(String[] validatorSearchPath) { this.validatorSearchPath = validatorSearchPath; } @@ -93,24 +107,26 @@ public class ValidationRegistryManagerImpl implements ValidationRegistryManager String suffix = "." + ClassUtils.getShortName(domainClass) + VALIDATOR_SUFFIX; - for (int i = 0; - (i < validatorSearchPath.length) - && (validatorClass == null); i++) { - validatorClass = this.findValidatorClass(validatorSearchPath[i] - + suffix); + if (validatorSearchPath != null) { + for (int i = 0; + (i < validatorSearchPath.length) + && (validatorClass == null); i++) { + validatorClass = this.findValidatorClass(validatorSearchPath[i] + + suffix); + } } } - // register the Validator in our Map, to speed up next retrieval - this.registerValidator(domainClass, validatorClass); + // if we found a Validator, register it so we speed up future retrieval + if (validatorClass != null) { + this.registerValidator(domainClass, validatorClass); + } } // Attempt to create an instance of the Validator - try { - validator = (Validator) validatorClass.newInstance(); - } catch (ClassCastException cce) {} - catch (InstantiationException ie) {} - catch (IllegalAccessException ile) {} + if (validatorClass != null) { + validator = obtainWiredValidator(validatorClass); + } return validator; } @@ -123,6 +139,32 @@ public class ValidationRegistryManagerImpl implements ValidationRegistryManager this.validatorMap.put(domainClass, validatorClass); } + /** + * Builds a new instance of the Validator. + * + *

+ * By default, the AutowireCapableBeanFactory is used to build + * the instance, and autowire its bean properties. Specialised + * applications may wish to customise this behaviour, such as searching + * through the ApplicationContext for an existing singleton + * instance. This method is protected to enable such customisation. + *

+ * + * @param clazz the represents the Validator instance required + * + * @return the requested Validator, fully wired with all + * dependencies, or null if the + * Validator could not be found or created + */ + protected Validator obtainWiredValidator(Class clazz) { + try { + return (Validator) this.acbf.autowire(clazz, + AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false); + } catch (BeansException autowireFailure) { + return null; + } + } + private Class findValidatorClass(String validatorClassName) { Class validatorClass = null;