r1793 - in trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator: . swing
Author: tchemit Date: 2010-03-18 20:40:22 +0100 (Thu, 18 Mar 2010) New Revision: 1793 Log: add filterscopes in SwingValidator Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/BeanValidator.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/BeanValidatorDetector.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/BeanValidator.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/BeanValidator.java 2010-03-18 09:52:42 UTC (rev 1792) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/BeanValidator.java 2010-03-18 19:40:22 UTC (rev 1793) @@ -58,6 +58,9 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ static protected final Log log = LogFactory.getLog(BeanValidator.class); + protected static final BeanValidatorScope[] FILTER_SCOPES_EMPTY = + new BeanValidatorScope[0]; + /** the type of bean to watch */ protected final Class<B> beanClass; @@ -91,6 +94,9 @@ /** xworks scope validator * */ protected EnumMap<BeanValidatorScope, XWorkBeanValidator<B>> validators; + /** filter scopes (if {@code null}, no filter on scopes) */ + protected BeanValidatorScope[] filterScopes; + /** listener that listens on bean modification */ protected PropertyChangeListener l; @@ -100,8 +106,21 @@ /** A list of event listeners for this validators */ protected EventListenerList listenerList = new EventListenerList(); - public BeanValidator(Class<B> beanClass, String contextName) { + public BeanValidator(Class<B> beanClass, + String contextName) { + this(beanClass, + contextName, + BeanValidatorScope.values() + ); + } + + public BeanValidator(Class<B> beanClass, + String contextName, + BeanValidatorScope... filterScopes) { this.beanClass = beanClass; + if (filterScopes != null && filterScopes.length > 0) { + this.filterScopes = filterScopes; + } pcs = new PropertyChangeSupport(this); conversionErrors = new TreeMap<String, String>(); validators = new EnumMap<BeanValidatorScope, XWorkBeanValidator<B>>( @@ -277,7 +296,7 @@ } public void setContextName(String contextName) { - String oldValidationContextName = this.contextName; + String oldContextName = this.contextName; this.contextName = contextName; // changing contextName could change fields definition // so dettach bean, must rebuild the fields @@ -287,11 +306,27 @@ // rebuild the fields initFields(); pcs.firePropertyChange(CONTEXT_NAME_PROPERTY, - oldValidationContextName, + oldContextName, contextName ); } + /** + * Sets the filter scopes. + * + * @param filterScopes the scopes to used + */ + public void setFilterScopes(BeanValidatorScope... filterScopes) { + this.filterScopes = filterScopes; + // changing contextName could change fields definition + // so dettach bean, must rebuild the fields + if (bean != null) { + setBean(null); + } + // rebuild the fields + initFields(); + } + public void setParentValidator(BeanValidator<?> parentValidator) { this.parentValidator = parentValidator; } @@ -508,7 +543,16 @@ validators.clear(); - for (BeanValidatorScope scope : BeanValidatorScope.values()) { + BeanValidatorScope[] scopeUniverse; + if (filterScopes == null) { + // use all scopes + scopeUniverse = BeanValidatorScope.values(); + } else { + // use customized scopes + scopeUniverse = filterScopes; + } + + for (BeanValidatorScope scope : scopeUniverse) { String scopeContext = (contextName == null ? "" : contextName + "-") + scope.name().toLowerCase(); @@ -532,7 +576,7 @@ for (String fieldName : detectedFieldNames) { scopes.clear(); // detect scopes for the field - for (BeanValidatorScope scope : BeanValidatorScope.values()) { + for (BeanValidatorScope scope : scopeUniverse) { if (tmp.containsKey(scope) && tmp.get(scope).contains(fieldName)) { scopes.add(scope); Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/BeanValidatorDetector.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/BeanValidatorDetector.java 2010-03-18 09:52:42 UTC (rev 1792) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/BeanValidatorDetector.java 2010-03-18 19:40:22 UTC (rev 1793) @@ -20,26 +20,22 @@ */ package jaxx.runtime.validator; +import org.apache.commons.beanutils.ConstructorUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import java.io.File; import java.io.FilenameFilter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; +import java.lang.reflect.Constructor; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; /** - * Un detecteur de validateurs pour un liste de classes données et un - * répertoire où chercher les fichiers de validation. - * + * Un detecteur de validateurs pour un liste de classes données et un répertoire + * où chercher les fichiers de validation. + * * @author tchemit <chemit@codelutin.com> - * * @since 1.6.0 */ public class BeanValidatorDetector { @@ -59,7 +55,20 @@ File sourceRoot, Pattern contextFilter, Class<?>... types) { + SortedSet<BeanValidator<?>> result = detect(validatorClass, + sourceRoot, + contextFilter, + null, + types); + return result; + } + public SortedSet<BeanValidator<?>> detect(Class<?> validatorClass, + File sourceRoot, + Pattern contextFilter, + BeanValidatorScope[] scopes, + Class<?>... types) { + SortedSet<BeanValidator<?>> result = new TreeSet<BeanValidator<?>>(new BeanValidatorComparator()); @@ -100,7 +109,8 @@ BeanValidator<?> validator = getValidator( validatorClass, c, - context.isEmpty() ? null : context + context.isEmpty() ? null : context, + scopes ); if (validator != null) { // on enregistre le validateur @@ -113,36 +123,31 @@ } /** - * Pour un context et un type d'entité donné, instancie un validateur - * et test si ce validateur est utilisable (i.e qu'il admet des champs - * à valider). - * + * Pour un context et un type d'entité donné, instancie un validateur et + * test si ce validateur est utilisable (i.e qu'il admet des champs à + * valider). + * <p/> * Si aucun champ n'est trouvé dans le validateur, alors on retourne null. * - * @param <B> le type du bean + * @param <B> le type du bean * @param validatorClass le type de validateur a instancie - * @param klass le type du bean - * @param context le context du validateur + * @param klass le type du bean + * @param context le context du validateur + * @param scopes les scopes a utiliser (si {@code null} alors pas de + * filtre sur les scopes) * @return le validateur initialisé, ou <code>null</code> si aucun scope * détecté dans le validateur. */ protected <B> BeanValidator<B> getValidator(Class<?> validatorClass, Class<B> klass, - String context) { + String context, + BeanValidatorScope... scopes) { -// BeanValidator<B> valitator = new BeanValidator<B>(klass, context); BeanValidator<B> valitator; - try { - valitator = (BeanValidator<B>) validatorClass.getConstructor( - Class.class, String.class).newInstance(klass, context); - } catch (Exception ex) { - throw new RuntimeException( - "could not instanciate validator " + validatorClass + - " for reason " + ex.getMessage(), ex); - } + valitator = createValidator(validatorClass, klass, context, scopes); - Set<BeanValidatorScope> scopes = valitator.getScopes(); - if (scopes.isEmpty()) { + Set<BeanValidatorScope> resultScopes = valitator.getScopes(); + if (resultScopes.isEmpty()) { valitator = null; if (log.isDebugEnabled()) { log.debug(klass + " : validator skip (no scopes detected)"); @@ -155,6 +160,63 @@ return valitator; } + protected <B> BeanValidator<B> createValidator( + Class<?> validatorClass, + Class<B> klass, + String context, + BeanValidatorScope[] scopes) { + BeanValidator<B> valitator; + Constructor<?> con; + try { + con = ConstructorUtils.getAccessibleConstructor( + validatorClass, + new Class<?>[]{ + Class.class, + String.class, + BeanValidatorScope[].class + } + ); + if (con != null) { + + valitator = (BeanValidator<B>) con.newInstance( + klass, + context, scopes + ); + + } else { + con = ConstructorUtils.getAccessibleConstructor( + validatorClass, + new Class<?>[]{ + Class.class, + String.class, + BeanValidatorScope[].class + } + ); + + if (con == null) { + throw new IllegalStateException( + "could not find a constructor with " + + "(Class.class, String) or " + + "(Class,String BeanValidatorScope[])"); + } + + valitator = (BeanValidator<B>) con.newInstance( + klass, + context + ); + if (scopes != null && scopes.length > 0) { + valitator.setFilterScopes(scopes); + } + } + + } catch (Exception ex) { + throw new RuntimeException( + "could not instanciate validator " + validatorClass + + " for reason " + ex.getMessage(), ex); + } + return valitator; + } + protected File getClassDir(File sourceRoot, Class<?> clazz) { String path = clazz.getPackage().getName(); path = path.replaceAll("\\.", File.separator); @@ -230,7 +292,9 @@ protected static class ValidatorFilenameFilter implements FilenameFilter { protected static final String SUFFIX = "-validation.xml"; + protected Class<?> clazz; + protected String prefix; public ValidatorFilenameFilter(Class<?> clazz) { Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java 2010-03-18 09:52:42 UTC (rev 1792) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java 2010-03-18 19:40:22 UTC (rev 1793) @@ -22,6 +22,7 @@ import jaxx.runtime.validator.BeanValidator; import jaxx.runtime.validator.BeanValidatorField; +import jaxx.runtime.validator.BeanValidatorScope; import jaxx.runtime.validator.swing.ui.AbstractBeanValidatorUI; import jaxx.runtime.validator.swing.ui.IconValidationUI; import org.apache.commons.logging.Log; @@ -140,11 +141,19 @@ /** ui renderer class */ protected Class<? extends AbstractBeanValidatorUI> uiClass; - public SwingValidator(Class<B> beanClass, String contextName) { - super(beanClass, contextName); + + + public SwingValidator(Class<B> beanClass, + String contextName, + BeanValidatorScope... filterScopes) { + super(beanClass, contextName, filterScopes); fieldRepresentation = new HashMap<String, JComponent>(); } + public SwingValidator(Class<B> beanClass, String contextName) { + this(beanClass, contextName, FILTER_SCOPES_EMPTY); + } + /** * To reload a bean in the validator. * <p/>
participants (1)
-
tchemit@users.nuiton.org