[Buix-commits] r1274 - in jaxx/trunk: jaxx-example/src/main/java/jaxx/demo jaxx-runtime-validator/src/main/java/jaxx/runtime/validator jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/field jaxx-runtime-validator/src/test/resources/jaxx/runtime/validator jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing maven-jaxx-plugin/src/test/resources/testcases/validator/errors maven-jaxx-plugin/src/test/resources/testcas
Author: tchemit Date: 2009-03-21 08:22:03 +0000 (Sat, 21 Mar 2009) New Revision: 1274 Added: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListModel.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListMouseListener.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageModel.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableModel.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableMouseListener.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableRenderer.java jaxx/trunk/jaxx-runtime-validator/src/test/resources/jaxx/runtime/validator/ValidatorBean-error-validation.xml Removed: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorListModel.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorListMouseListener.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorModel.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableModel.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableMouseListener.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableRenderer.java jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/BeanValidator.java jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorErrorEvent.java jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorErrorListener.java jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorField.java jaxx/trunk/jaxx-runtime-validator/src/test/resources/jaxx/runtime/validator/ValidatorBean-validation.xml Modified: jaxx/trunk/jaxx-example/src/main/java/jaxx/demo/ValidationListDemo.jaxx jaxx/trunk/jaxx-example/src/main/java/jaxx/demo/ValidationTableDemo.jaxx jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/SwingValidationUtil.java jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/BeanValidatorListener.java jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidationUtil.java jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/field/AbstractFieldValidatorTest.java jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/errors/DuplicatedErrorListModel.jaxx jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/errors/DuplicatedErrorTableModel.jaxx jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/ok/Validation.jaxx jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/ok/ValidationBeanClass.jaxx Log: remplacement des classes swingValidatorError* en SwingValidatorMessage* Modified: jaxx/trunk/jaxx-example/src/main/java/jaxx/demo/ValidationListDemo.jaxx =================================================================== --- jaxx/trunk/jaxx-example/src/main/java/jaxx/demo/ValidationListDemo.jaxx 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-example/src/main/java/jaxx/demo/ValidationListDemo.jaxx 2009-03-21 08:22:03 UTC (rev 1274) @@ -17,7 +17,7 @@ <Identity id='identity'/> <!-- errors model --> - <jaxx.runtime.validator.swing.SwingValidatorErrorListModel id='errors' + <jaxx.runtime.validator.swing.SwingValidatorMessageListModel id='errors' onContentsChanged='ok.setEnabled(errors.isEmpty())'/> <!-- validators --> Modified: jaxx/trunk/jaxx-example/src/main/java/jaxx/demo/ValidationTableDemo.jaxx =================================================================== --- jaxx/trunk/jaxx-example/src/main/java/jaxx/demo/ValidationTableDemo.jaxx 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-example/src/main/java/jaxx/demo/ValidationTableDemo.jaxx 2009-03-21 08:22:03 UTC (rev 1274) @@ -7,7 +7,7 @@ <Identity id='identity'/> <!-- errors model --> - <jaxx.runtime.validator.swing.SwingValidatorErrorTableModel id='errors2' + <jaxx.runtime.validator.swing.SwingValidatorMessageTableModel id='errors2' onTableChanged='ok.setEnabled(errors2.getRowCount()==0)'/> <!-- validators --> @@ -31,7 +31,7 @@ import jaxx.runtime.SwingUtil; void $afterCompleteSetup() { - errorTable.setDefaultRenderer(Object.class, new jaxx.runtime.validator.swing.SwingValidatorErrorTableRenderer()); + errorTable.setDefaultRenderer(Object.class, new jaxx.runtime.validator.swing.SwingValidatorMessageTableRenderer()); SwingUtil.setI18nTableHeaderRenderer(errorTable, n_("validator.scope"), n_("validator.scope.tip"), n_("validator.field"), n_("validator.field.tip"), n_("validator.message"), n_("validator.message.tip")); SwingUtil.fixTableColumnWidth(errorTable, 0, 25); Deleted: jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/BeanValidator.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/BeanValidator.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/BeanValidator.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,476 +0,0 @@ -package jaxx.runtime.validator; - -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ValidationAwareSupport; -import com.opensymphony.xwork2.config.Configuration; -import com.opensymphony.xwork2.config.ConfigurationManager; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.util.ValueStackFactory; -import com.opensymphony.xwork2.validator.ActionValidatorManager; -import com.opensymphony.xwork2.validator.DelegatingValidatorContext; -import com.opensymphony.xwork2.validator.FieldValidator; -import com.opensymphony.xwork2.validator.ValidationException; -import com.opensymphony.xwork2.validator.Validator; -import com.opensymphony.xwork2.validator.ValidatorScope; -import java.beans.EventSetDescriptor; -import org.apache.commons.beanutils.ConversionException; -import org.apache.commons.beanutils.Converter; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.util.ConverterUtil; - -import java.beans.Introspector; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.util.ArrayList; -import java.util.Collections; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.TreeMap; - -/** - * - * A customized validator for a given bean. - * - * <b>Note:</b> The bean must be listenable on properyChange events (means - * must have public addPropertychangeListener and removePropertyChangeListener methods). - * - * @param <B> type of the bean to validate. - * - * @author chemit - */ -@Deprecated -public class BeanValidator<B> { - - /** la nom de la propriété bean */ - static public final String BEAN_PROERTY = "bean"; - - /** la nom de la propriété contextName */ - static public final String CONTEXT_NAME_PROPERTY = "contextName"; - - /** la nom de l'état valid */ - static public final String VALID_PROERTY = "valid"; - - /** la nom de l'état changed */ - static public final String CHANGED_PROERTY = "changed"; - - /** to use log facility, just put in your code: log.info(\"...\"); */ - static protected final Log log = LogFactory.getLog(BeanValidator.class); - - /** the type of bean to watch */ - protected final Class<B> beanClass; - - /** the validation named context (can be null) */ - protected String contextName; - - /** to chain to a prent validator */ - protected BeanValidator<?> parentValidator; - - /** state to indicate that validator has changed since the last time bean was setted */ - protected boolean changed = false; - - /** state of the validator (is true if no errors of error scope is found) */ - protected boolean valid = true; - - /** bean to be watched */ - protected B bean = null; - - /** - * map of fields by scope - * TODO use this and remove fields property and xworks patch :) - */ - protected EnumMap<ValidatorScope, List<ValidatorField<B>>> fieldsByScope; - - /** list of fields watched by this validator */ - protected List<ValidatorField<B>> fields; - - /** map of conversion errors detected by this validator */ - protected Map<String, String> conversionErrors; - - /** delgate property change support */ - protected PropertyChangeSupport pcs; - - /** listener that listens on bean modification */ - protected PropertyChangeListener l; - - protected ValidationAwareSupport validationSupport; - protected DelegatingValidatorContext validationContext; - protected transient ActionValidatorManager validator; - protected ActionContext context; - - protected EventSetDescriptor beanEventDescriptor; - - public BeanValidator(Class<B> beanClass, String contextName) { - // check that the bean is listenable, otherwise, can't use the validator on it - beanEventDescriptor = ValidationUtil.getPropertyChangeListenerDescriptor(beanClass); - - this.beanClass = beanClass; - this.contextName = contextName; - pcs = new PropertyChangeSupport(this); - validationSupport = new ValidationAwareSupport(); - validationContext = new DelegatingValidatorContext(validationSupport); - - // init context - ConfigurationManager confManager = new ConfigurationManager(); - Configuration conf = confManager.getConfiguration(); - - ValueStackFactory vsf = conf.getContainer().getInstance( - ValueStackFactory.class); - ValueStack vs = vsf.createValueStack(); - context = new ActionContext(vs.getContext()); - ActionContext.setContext(context); - - // init validator - validator = conf.getContainer().getInstance(ActionValidatorManager.class, "no-annotations"); - initFields(); - - conversionErrors = new TreeMap<String, String>(); - - l = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - validate(); - setValid(!hasErrors()); - setChanged(true); - } - }; - } - - protected void initFields() { - // init fields from detected fieldValidator in XWorks framework - fields = new ArrayList<ValidatorField<B>>(); - for (Validator v : validator.getValidators(beanClass, contextName)) { - // we only work on FieldValidator at the moment - if (v instanceof FieldValidator) { - FieldValidator fieldValidator = (FieldValidator) v; - String fName = fieldValidator.getFieldName(); - ValidatorScope fScope = fieldValidator.getValidatorScope(); - ValidatorField<B> field = new ValidatorField<B>(beanClass, fName, fScope); - if (!fields.contains(field)) { - fields.add(field); - } - } - } - - fields = Collections.unmodifiableList(fields); - } - - public Class<B> getBeanClass() { - return beanClass; - } - - public BeanValidator<?> getParentValidator() { - return parentValidator; - } - - public String getContextName() { - return contextName; - } - - public List<ValidatorField<B>> getFields() { - return fields; - } - - public ValidatorField<B> getField(String fieldName) { - for (ValidatorField<B> field : fields) { - if (fieldName.equals(field.getName())) { - return field; - } - } - return null; - } - - /** - * Retourne vrai si l'objet bean a ete modifie depuis le dernier - * {@link #setBean} - * - * @return <code>true</code> if bean was modify since last {@link #setBean(Object)} invocation - */ - public boolean isChanged() { - return changed; - } - - public boolean isValid() { - return valid; - } - - public B getBean() { - return bean; - } - - /** - * Permet de force la remise a false de l'etat de changement du bean - * - * @param changed flag to force reset of property {@link #changed} - */ - public void setChanged(boolean changed) { - this.changed = changed; - // force the property to be fired (never pass the older value) - pcs.firePropertyChange(CHANGED_PROERTY, null, changed); - } - - public void setValid(boolean valid) { - this.valid = valid; - // force the property to be fired (never pass the older value) - pcs.firePropertyChange(VALID_PROERTY, null, valid); - } - - public void setBean(B bean) { - B oldBean = this.bean; - if (log.isDebugEnabled()) { - log.debug(this + " : " + bean); - } - // clean conversions of previous bean - conversionErrors.clear(); - - if (oldBean != null) { - try { - beanEventDescriptor.getRemoveListenerMethod().invoke(oldBean, l); - //Method method = this.bean.getClass().getMethod("removePropertyChangeListener", PropertyChangeListener.class); - //method.invoke(oldBean, l); - } catch (Exception eee) { - log.info("Can't register as listener for bean "+beanClass+" for reason "+eee.getMessage(), eee); - } - } - this.bean = bean; - - if (bean == null) { - // must remove all errors from this validator on errorListModel - validationSupport.clearErrorsAndMessages(); - - // dispatch in each field the new errors - dispatchErrorsToFields(); - } else { - try { - beanEventDescriptor.getAddListenerMethod().invoke(bean, l); - //Method method = this.bean.getClass().getMethod("addPropertyChangeListener", PropertyChangeListener.class); - //method.invoke(bean, l); - } catch (Exception eee) { - log.info("Can't register as listener for bean "+beanClass+" for reason "+eee.getMessage(), eee); - } - validate(); - } - setChanged(false); - setValid(!hasErrors()); - pcs.firePropertyChange(BEAN_PROERTY, oldBean, bean); - } - - //FIXME At the moment we do not allow to change contextName, but we should be able to do it - public void setContextName(String contextName) { - String oldValidationContextName = this.contextName; - this.contextName = contextName; - // changing contextName could change fields definition - // so dettach bean, must rebuild the fields - setBean(null); - initFields(); - pcs.firePropertyChange(CONTEXT_NAME_PROPERTY, oldValidationContextName, contextName); - } - - public void setParentValidator(BeanValidator<?> parentValidator) { - this.parentValidator = parentValidator; - } - - /** @return <code>true</code> if errors are detected, <code>false</code> otherwise */ - public boolean hasErrors() { - for (ValidatorField<B> field : fields) { - if (field.hasErrors()) { - return true; - } - } - return false; - } - - public boolean hasWarnings() { - for (ValidatorField<B> field : fields) { - if (field.hasWarnings()) { - return true; - } - } - return false; - } - - /** - * Test a the validator contains the field given his name - * - * @param fieldName the name of the searched field - * @return <code>true</code> if validator contaisn this field, <code>false</code> otherwise - */ - public boolean containsField(String fieldName) { - ValidatorField<B> field = getField(fieldName); - return field != null; - } - - public boolean isValid(String fieldName) { - ValidatorField<B> field = getField(fieldName); - if (field == null) { - throw new IllegalArgumentException("could not find a validator field " + fieldName); - } - return field.isValid(); - } - - /** - * Convert a value. - * <p/> - * If an error occurs, then add an error in validator. - * - * @param <T> the type of conversion - * @param fieldName the name of the bean property - * @param value the value to convert - * @param valueClass the type of converted value - * @return the converted value, or null if conversion was not ok - */ - @SuppressWarnings({"unchecked"}) - public <T> T convert(String fieldName, String value, Class<T> valueClass) { - if (fieldName == null) { - throw new IllegalArgumentException("fieldName can not be null"); - } - if (valueClass == null) { - throw new IllegalArgumentException("valueClass can not be null"); - } - - // on ne convertit pas si il y a un bean et que le resultat de la validation - // pourra etre affiche quelque part - if (!canValidate() || value == null) { - return null; - } - - // remove the previous conversion error for the field - conversionErrors.remove(fieldName); - - T result; - try { - Converter converter = ConverterUtil.getConverter(valueClass); - if (converter == null) { - throw new RuntimeException("could not find converter for the type " + valueClass); - } - result = (T) converter.convert(valueClass, value); - /* Why this test ? if (result != null && !value.equals(result.toString())) { - conversionErrors.put(fieldName, "error.convertor." + Introspector.decapitalize(valueClass.getSimpleName())); - result = null; - validate(); - }*/ - } catch (ConversionException e) { - // get - conversionErrors.put(fieldName, "error.convertor." + Introspector.decapitalize(valueClass.getSimpleName())); - result = null; - validate(); - } - return result; - } - - /** - * il faut eviter le code re-intrant (durant une validation, une autre est - * demandee). Pour cela on fait la validation dans un thread, et tant - * que la premiere validation n'est pas fini, on ne repond pas aux - * solicitations. - * Cette method est public pour permettre de force une validation par - * programmation, ce qui est utile par exemple si le bean ne supporte - * pas les {@link PropertyChangeListener} - */ - public void validate() { - // on ne valide que si il y a un bean et que le resultat de la validation - // pourra etre affiche quelque part - if (!canValidate()) { - return; - } - - try { - - validationSupport.clearErrorsAndMessages(); - - //TC - 20081024 : since context is in a ThreadLocal variable, we must do the check - if (ActionContext.getContext() == null) { - ActionContext.setContext(context); - } - - validator.validate(bean, contextName, validationContext); - - // add the registred conversion errors - transfertConversionErrorsToFieldErrors(); - - if (log.isTraceEnabled()) { - log.trace("Action errors: " + validationContext.getActionErrors()); - log.trace("Action messages: " + validationContext.getActionMessages()); - log.trace("Field errors: " + validationContext.getFieldErrors()); - } - - if (log.isDebugEnabled()) { - log.debug(this + " : " + validationContext.getFieldErrors()); - } - - // dispatch in each field the new errors - dispatchErrorsToFields(); - - if (parentValidator != null) { - // chained validation - parentValidator.l.propertyChange(null); - } - } catch (ValidationException eee) { - log.warn("Error during validation", eee); - } - } - - @Override - public String toString() { - return super.toString() + "<beanClass:" + beanClass + ", contextName:" + contextName + ">"; - } - - public void addPropertyChangeListener(PropertyChangeListener listener) { - pcs.addPropertyChangeListener(listener); - } - - public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { - pcs.addPropertyChangeListener(propertyName, listener); - } - - public void removePropertyChangeListener(PropertyChangeListener listener) { - pcs.removePropertyChangeListener(listener); - } - - public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { - pcs.removePropertyChangeListener(propertyName, listener); - } - - /** @return <code>true</code> if validation is enabled, <code>false</code> otherwise. */ - protected boolean canValidate() { - return !(bean == null || fields.isEmpty()); - } - - /** - * Transfer the registred conversion errors to fieldErrors. - * <p/> - * The previously filed errors of a given field where a conversion error occurs will be removed. - */ - @SuppressWarnings({"unchecked"}) - protected void transfertConversionErrorsToFieldErrors() { - Map map = validationContext.getFieldErrors(); - for (Entry<String, String> entry : conversionErrors.entrySet()) { - // remove from validation, errors occurs on this field - List errors = (List) map.get(entry.getKey()); - if (errors != null) { - errors.clear(); - errors.add(entry.getValue()); - } else { - errors = Collections.singletonList(entry.getValue()); - } - // add the concrete conversion error - map.put(entry.getKey(), errors); - } - validationContext.setFieldErrors(map); - } - - /** synchronize the errors found in this validator to each field. */ - protected void dispatchErrorsToFields() { - - Map map = validationContext.getFieldErrors(); - for (ValidatorField<B> field : fields) { - String fieldName = field.getName(); - boolean detectedErrors = map.containsKey(fieldName); - field.addErrors(this, detectedErrors ? (List) map.get(fieldName) : null); - } - } - -} Modified: jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/BeanValidatorListener.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/BeanValidatorListener.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/BeanValidatorListener.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -14,19 +14,4 @@ * @param event the event */ void onFieldChanged(BeanValidatorEvent event); - - /** - * Invoked when a validator detects a new message on a field. - * - * @param event the event - */ - //void onNewMessages(BeanValidatorEvent event); - - /** - * Invoked when a validator detetcs that a previously message is - * no more exisitng. - * - * @param event the event - */ - //void onResolvedMessages(BeanValidatorEvent event); } Modified: jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidationUtil.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidationUtil.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidationUtil.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -95,7 +95,7 @@ * @param value the actual value to convert * @param valueClass the type of the conversion */ - public static void convert(BeanValidator<?> validator, String fieldName, String value, Class<?> valueClass) { + public static void convert(BeanValidator2<?> validator, String fieldName, String value, Class<?> valueClass) { Object result = validator.convert(fieldName, value, valueClass); if (result != null) { Deleted: jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorErrorEvent.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorErrorEvent.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorErrorEvent.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,46 +0,0 @@ -package jaxx.runtime.validator; - -import com.opensymphony.xwork2.validator.ValidatorScope; - -import java.util.Set; - -/** - * The definition of an event on {@link ValidatorErrorListener} - * to be fired by a {@link BeanValidator}. - * - * @author chemit - */ -@Deprecated -public class ValidatorErrorEvent { - - /** the source of the event */ - BeanValidator source; - - /** the field impacted by the validator */ - ValidatorField<?> field; - - public ValidatorErrorEvent(BeanValidator source, ValidatorField<?> field) { - this.source = source; - this.field = field; - } - - public BeanValidator getSource() { - return source; - } - - public String getFieldName() { - return field.getName(); - } - - public Set<String> getErrors() { - return field.getErrors(); - } - - public ValidatorScope getScope() { - return field.getScope(); - } - - public ValidatorField getField() { - return field; - } -} Deleted: jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorErrorListener.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorErrorListener.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorErrorListener.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,25 +0,0 @@ -package jaxx.runtime.validator; - -/** - * The listener contract to be used on {@link BeanValidator] - * - * @author chemit - */ -@Deprecated -public interface ValidatorErrorListener extends java.util.EventListener { - /** - * Invoked when a validator detects a error on a field. - * - * @param event the event - */ - void onNewError(ValidatorErrorEvent event); - - /** - * Invoked when a validator detetcs that a previously error is - * no more exisitng. - * - * @param event the event - */ - void onResolvedError(ValidatorErrorEvent event); - -} Deleted: jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorField.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorField.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/ValidatorField.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,187 +0,0 @@ -package jaxx.runtime.validator; - -import com.opensymphony.xwork2.validator.ValidatorScope; -import static org.codelutin.i18n.I18n._; - -import javax.swing.event.EventListenerList; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; - -/** - * Definition of a field to be handled in a {@link BeanValidator]. - * <p/> - * <p/> - * A such class is only registred in {@link BeanValidator } when the field of the bean - * was found in validator xml configuration file for a {@link com.opensymphony.xwork2.validator.FieldValidator} only. - * <p/> - * This class use properties {@link #beanClass}, {@link #name} to define - * his naturel order. - * - * @author chemit - * @param <B> the type of the bean handled by the validator and this field of validation. - */ -@Deprecated -public class ValidatorField<B> { - - /** the class of bean */ - protected final Class<B> beanClass; - - /** name of field in bean */ - protected String name; - - /** the scope of the field */ - protected ValidatorScope scope; - - /** the list of error for this field */ - protected Set<String> errors; - - /** A list of event listeners for this validators */ - protected EventListenerList listenerList = new EventListenerList(); - - public ValidatorField(Class<B> beanClass, String name, ValidatorScope scope) { - this.beanClass = beanClass; - this.name = name; - this.scope = scope; - this.errors = new HashSet<String>(); - } - - public String getName() { - return name; - } - - public ValidatorScope getScope() { - return scope; - } - - public Class<B> getBeanClass() { - return beanClass; - } - - public Set<String> getErrors() { - return errors; - } - - public void setName(String name) { - this.name = name; - } - - public void setScope(ValidatorScope scope) { - this.scope = scope; - } - - /** - * @return <code>true</code> if this field is valid (says is in error - * scope and has errors), <code>false</code> otherwise. - */ - public boolean isValid() { - return hasErrors(); - } - - public boolean hasErrors() { - return scope == ValidatorScope.ERROR && !errors.isEmpty(); - } - - public boolean hasWarnings() { - return scope == ValidatorScope.WARNING && !errors.isEmpty(); - } - - public void addErrors(BeanValidator<B> validator, List errors) { - boolean hasPreviousError = !this.errors.isEmpty(); - - // reset errors for this field - this.errors.clear(); - - if (errors == null) { - // no error to assign to this field - if (hasPreviousError) { - // there were previously errors, but any longer - // so fire a resolvedErrorEvent for this field - fireResolvedError(validator); - } - return; - } - - for (Object error : errors) { - this.errors.add(error.toString()); - } - // fire a newErrorEvent for this field - fireNewError(validator); - } - - public String getI18nError(String error) { - String text; - if (error.indexOf("##") == -1) { - text = _(error); - } else { - StringTokenizer stk = new StringTokenizer(error, "##"); - String errorName = stk.nextToken(); - List<String> args = new ArrayList<String>(); - while (stk.hasMoreTokens()) { - args.add(stk.nextToken()); - } - text = _(errorName, args.toArray()); - } - return text; - } - - public void addValidatorErrorListener(ValidatorErrorListener listener) { - listenerList.add(ValidatorErrorListener.class, listener); - } - - public void removeValidatorErrorListener(ValidatorErrorListener listener) { - listenerList.remove(ValidatorErrorListener.class, listener); - } - - public ValidatorErrorListener[] getValidatorErrorListeners() { - return listenerList.getListeners(ValidatorErrorListener.class); - } - - protected void fireNewError(BeanValidator<B> validator) { - ValidatorErrorEvent evt = new ValidatorErrorEvent(validator, this); - for (ValidatorErrorListener listener : listenerList.getListeners(ValidatorErrorListener.class)) { - listener.onNewError(evt); - } - } - - protected void fireResolvedError(BeanValidator<B> validator) { - ValidatorErrorEvent evt = new ValidatorErrorEvent(validator, this); - for (ValidatorErrorListener listener : listenerList.getListeners(ValidatorErrorListener.class)) { - listener.onResolvedError(evt); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof ValidatorField)) { - return false; - } - - ValidatorField that = (ValidatorField) o; - return beanClass.equals(that.beanClass) && name.equals(that.name); - } - - @Override - public int hashCode() { - int result = beanClass.hashCode(); - result = 31 * result + name.hashCode(); - return result; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("<").append(super.toString()); - sb.append(" beanClass:").append(beanClass); - sb.append(", name:").append(name); - sb.append(", scope:").append(scope); - sb.append(", errors:").append(errors); - sb.append('>'); - return sb.toString(); - } -} Modified: jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/field/AbstractFieldValidatorTest.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/field/AbstractFieldValidatorTest.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/field/AbstractFieldValidatorTest.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,9 +1,9 @@ package jaxx.runtime.validator.field; import java.io.File; -import jaxx.runtime.validator.BeanValidator; +import jaxx.runtime.validator.BeanValidator2; +import jaxx.runtime.validator.BeanValidatorField; import jaxx.runtime.validator.ValidatorBean; -import jaxx.runtime.validator.ValidatorField; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; @@ -23,7 +23,7 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ static private final Log log = LogFactory.getLog(AbstractFieldValidatorTest.class); - static protected BeanValidator<ValidatorBean> validator; + static protected BeanValidator2<ValidatorBean> validator; static protected File basedir; protected ValidatorBean bean; @@ -53,16 +53,17 @@ b = new File("").getAbsolutePath(); } basedir = new File(b); - validator = new BeanValidator<ValidatorBean>(ValidatorBean.class, null); + validator = new BeanValidator2<ValidatorBean>(ValidatorBean.class, null); } protected void assertFieldInError(String fieldName, String error, boolean required) { - ValidatorField<ValidatorBean> field = validator.getField(fieldName); - - for (String o : field.getErrors()) { - if (o.equals(error)) { - assertTrue(required); - return; + BeanValidatorField<ValidatorBean> field = validator.getField(fieldName); + if (field !=null && field.getErrors() != null) { + for (String o : field.getErrors()) { + if (o.equals(error)) { + assertTrue(required); + return; + } } } // error was not found Copied: jaxx/trunk/jaxx-runtime-validator/src/test/resources/jaxx/runtime/validator/ValidatorBean-error-validation.xml (from rev 1273, jaxx/trunk/jaxx-runtime-validator/src/test/resources/jaxx/runtime/validator/ValidatorBean-validation.xml) =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/test/resources/jaxx/runtime/validator/ValidatorBean-error-validation.xml (rev 0) +++ jaxx/trunk/jaxx-runtime-validator/src/test/resources/jaxx/runtime/validator/ValidatorBean-error-validation.xml 2009-03-21 08:22:03 UTC (rev 1274) @@ -0,0 +1,95 @@ +<!DOCTYPE validators PUBLIC + "-//OpenSymphony Group//XWork Validator 1.0.2//EN" + "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> +<validators> + + <field name="stringValue"> + <field-validator type="requiredstring" short-circuit="true"> + <message>stringValue.required</message> + </field-validator> + </field> + + <field name="existingFile"> + <field-validator type="requiredFile" short-circuit="true"> + <message>existingFile.required</message> + </field-validator> + <field-validator type="existingFile" short-circuit="true"> + <message>existingFile.not.exist</message> + </field-validator> + </field> + + <field name="notExistingFile"> + <field-validator type="requiredFile" short-circuit="true"> + <message>notExistingFile.required</message> + </field-validator> + <field-validator type="notExistingFile" short-circuit="true"> + <message>notExistingFile.exist</message> + </field-validator> + </field> + + <field name="existingDirectory"> + <field-validator type="requiredFile" short-circuit="true"> + <message>existingDirectory.required</message> + </field-validator> + + <field-validator type="existingDirectory" short-circuit="true"> + <message>existingDirectory.not.exist</message> + </field-validator> + </field> + + <field name="notExistingDirectory"> + <field-validator type="requiredFile" short-circuit="true"> + <message>notExistingDirectory.required</message> + </field-validator> + + <field-validator type="notExistingDirectory" short-circuit="true"> + <message>notExistingDirectory.exist</message> + </field-validator> + </field> + + <field name="entries"> + <field-validator type="collectionFieldExpression"> + <param name="mode">AT_LEAST_ONE</param> + <param name="expression"><![CDATA[ intValue == 0 && stringValue == "stringValue" ]]></param> + <message>collectionFieldExpression.atLeastOne</message> + </field-validator> + <field-validator type="collectionFieldExpression"> + <param name="mode">EXACTLY_ONE</param> + <param name="expression"><![CDATA[ intValue == 0 && stringValue == "stringValue" ]]></param> + <message>collectionFieldExpression.exactlyOne</message> + </field-validator> + <field-validator type="collectionFieldExpression"> + <param name="mode">ALL</param> + <param name="expression"><![CDATA[ intValue == 0 && stringValue == "stringValue" ]]></param> + <message>collectionFieldExpression.all</message> + </field-validator> + <field-validator type="collectionFieldExpression"> + <param name="mode">NONE</param> + <param name="expression"><![CDATA[ intValue == 0 && stringValue == "stringValue" ]]></param> + <message>collectionFieldExpression.none</message> + </field-validator> + + <field-validator type="collectionUniqueKey"> + <param name="keys">intValue</param> + <message>collectionUniqueKey.one.failed</message> + </field-validator> + <field-validator type="collectionUniqueKey"> + <param name="keys">stringValue</param> + <message>collectionUniqueKey.two.failed</message> + </field-validator> + <field-validator type="collectionUniqueKey"> + <param name="keys">intValue,stringValue</param> + <message>collectionUniqueKey.three.failed</message> + </field-validator> + <field-validator type="collectionUniqueKey"> + <param name="keys">intValue,stringValue,stringValue2</param> + <message>collectionUniqueKey.four.failed</message> + </field-validator> + <field-validator type="collectionUniqueKey"> + <param name="keys">stringValue</param> + <param name="againstProperty">entry</param> + <message>collectionUniqueKey.five.failed</message> + </field-validator> + </field> + +</validators> \ No newline at end of file Deleted: jaxx/trunk/jaxx-runtime-validator/src/test/resources/jaxx/runtime/validator/ValidatorBean-validation.xml =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/test/resources/jaxx/runtime/validator/ValidatorBean-validation.xml 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator/src/test/resources/jaxx/runtime/validator/ValidatorBean-validation.xml 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,95 +0,0 @@ -<!DOCTYPE validators PUBLIC - "-//OpenSymphony Group//XWork Validator 1.0.2//EN" - "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> -<validators> - - <field name="stringValue"> - <field-validator type="requiredstring" short-circuit="true"> - <message>stringValue.required</message> - </field-validator> - </field> - - <field name="existingFile"> - <field-validator type="requiredFile" short-circuit="true" validatorScope="ERROR"> - <message>existingFile.required</message> - </field-validator> - <field-validator type="existingFile" short-circuit="true"> - <message>existingFile.not.exist</message> - </field-validator> - </field> - - <field name="notExistingFile"> - <field-validator type="requiredFile" short-circuit="true"> - <message>notExistingFile.required</message> - </field-validator> - <field-validator type="notExistingFile" short-circuit="true"> - <message>notExistingFile.exist</message> - </field-validator> - </field> - - <field name="existingDirectory"> - <field-validator type="requiredFile" short-circuit="true"> - <message>existingDirectory.required</message> - </field-validator> - - <field-validator type="existingDirectory" short-circuit="true"> - <message>existingDirectory.not.exist</message> - </field-validator> - </field> - - <field name="notExistingDirectory"> - <field-validator type="requiredFile" short-circuit="true"> - <message>notExistingDirectory.required</message> - </field-validator> - - <field-validator type="notExistingDirectory" short-circuit="true"> - <message>notExistingDirectory.exist</message> - </field-validator> - </field> - - <field name="entries"> - <field-validator type="collectionFieldExpression"> - <param name="mode">AT_LEAST_ONE</param> - <param name="expression"><![CDATA[ intValue == 0 && stringValue == "stringValue" ]]></param> - <message>collectionFieldExpression.atLeastOne</message> - </field-validator> - <field-validator type="collectionFieldExpression"> - <param name="mode">EXACTLY_ONE</param> - <param name="expression"><![CDATA[ intValue == 0 && stringValue == "stringValue" ]]></param> - <message>collectionFieldExpression.exactlyOne</message> - </field-validator> - <field-validator type="collectionFieldExpression"> - <param name="mode">ALL</param> - <param name="expression"><![CDATA[ intValue == 0 && stringValue == "stringValue" ]]></param> - <message>collectionFieldExpression.all</message> - </field-validator> - <field-validator type="collectionFieldExpression"> - <param name="mode">NONE</param> - <param name="expression"><![CDATA[ intValue == 0 && stringValue == "stringValue" ]]></param> - <message>collectionFieldExpression.none</message> - </field-validator> - - <field-validator type="collectionUniqueKey"> - <param name="keys">intValue</param> - <message>collectionUniqueKey.one.failed</message> - </field-validator> - <field-validator type="collectionUniqueKey"> - <param name="keys">stringValue</param> - <message>collectionUniqueKey.two.failed</message> - </field-validator> - <field-validator type="collectionUniqueKey"> - <param name="keys">intValue,stringValue</param> - <message>collectionUniqueKey.three.failed</message> - </field-validator> - <field-validator type="collectionUniqueKey"> - <param name="keys">intValue,stringValue,stringValue2</param> - <message>collectionUniqueKey.four.failed</message> - </field-validator> - <field-validator type="collectionUniqueKey"> - <param name="keys">stringValue</param> - <param name="againstProperty">entry</param> - <message>collectionUniqueKey.five.failed</message> - </field-validator> - </field> - -</validators> \ No newline at end of file Modified: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/SwingValidationUtil.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/SwingValidationUtil.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/SwingValidationUtil.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,13 +1,14 @@ package jaxx.runtime.validator; -import jaxx.runtime.validator.swing.SwingValidatorErrorListMouseListener; -import jaxx.runtime.validator.swing.SwingValidatorErrorTableMouseListener; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.swing.JList; import javax.swing.JTable; import java.awt.event.MouseListener; +import jaxx.runtime.validator.swing.SwingValidatorMessageTableMouseListener; +import jaxx.runtime.validator.swing.SwingValidatorMessageListMouseListener; /** * The helper class for validation module. @@ -28,13 +29,13 @@ return; } for (MouseListener listener : list.getMouseListeners()) { - if (listener instanceof SwingValidatorErrorListMouseListener) { + if (listener instanceof SwingValidatorMessageListMouseListener) { // already have a such listener log.info("already registered a such MouseListener : " + listener); return; } } - list.addMouseListener(new SwingValidatorErrorListMouseListener()); + list.addMouseListener(new SwingValidatorMessageListMouseListener()); } public static void registerErrorTableMouseListener(JTable table) { @@ -42,20 +43,20 @@ return; } for (MouseListener listener : table.getMouseListeners()) { - if (listener instanceof SwingValidatorErrorTableMouseListener) { + if (listener instanceof SwingValidatorMessageTableMouseListener) { // already have a such listener log.info("already registered a such MouseListener : " + listener); return; } } - table.addMouseListener(new SwingValidatorErrorTableMouseListener()); + table.addMouseListener(new SwingValidatorMessageTableMouseListener()); } - public static SwingValidatorErrorTableMouseListener getErrorTableMouseListener(JTable table) { + public SwingValidatorMessageTableMouseListener getErrorTableMouseListener(JTable table) { if (table != null) { for (MouseListener listener : table.getMouseListeners()) { - if (listener instanceof SwingValidatorErrorTableMouseListener) { - return (SwingValidatorErrorTableMouseListener) listener; + if (listener instanceof SwingValidatorMessageTableMouseListener) { + return (SwingValidatorMessageTableMouseListener) listener; } } } Modified: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -107,10 +107,10 @@ protected Map<String, JComponent> fieldRepresentation; /** Object servant a contenir la liste des erreurs */ - protected SwingValidatorErrorListModel errorListModel; + protected SwingValidatorMessageListModel errorListModel; /** Object servant a contenir la liste des erreurs */ - protected SwingValidatorErrorTableModel errorTableModel; + protected SwingValidatorMessageTableModel errorTableModel; /** ui renderer class */ protected Class<? extends AbstractBeanValidatorUI> uiClass; @@ -129,7 +129,7 @@ return uiClass; } - public void setErrorListModel(SwingValidatorErrorListModel errorListModel) { + public void setErrorListModel(SwingValidatorMessageListModel errorListModel) { this.errorListModel = errorListModel; if (errorListModel != null) { // register the validator in the model list @@ -137,7 +137,7 @@ } } - public void setErrorTableModel(SwingValidatorErrorTableModel errorTableModel) { + public void setErrorTableModel(SwingValidatorMessageTableModel errorTableModel) { this.errorTableModel = errorTableModel; if (errorTableModel != null) { // register the validator in the model table @@ -221,7 +221,7 @@ } for (Entry<String, JComponent> entry : fieldRepresentation.entrySet()) { try { - setErrorRepresentation(entry.getKey(), null, entry.getValue(), uiClass); + setMessageRepresentation(entry.getKey(), null, entry.getValue(), uiClass); } catch (Exception e) { throw new RuntimeException(e); } @@ -230,7 +230,7 @@ }); } - protected void setErrorRepresentation(String fieldname, JComponent old, JComponent c, Class<? extends AbstractBeanValidatorUI> uiClass) + protected void setMessageRepresentation(String fieldname, JComponent old, JComponent c, Class<? extends AbstractBeanValidatorUI> uiClass) throws InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException { if (old == c) { // same component, nothing to do @@ -250,7 +250,6 @@ Object ui = jx.getUI(); if (ui != null && ui instanceof AbstractBeanValidatorUI) { removeBeanValidatorListener((AbstractBeanValidatorUI)ui); - //field.removeValidatorErrorListener((AbstractBeanValidatorUI) ui); } jx.setUI(null); @@ -265,7 +264,6 @@ ui.setEnabled(true); JXLayer<JComponent> jx = (JXLayer<JComponent>) container; addBeanValidatorListener(ui); - //field.addValidatorErrorListener(ui); jx.setUI(ui); } } Deleted: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorListModel.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorListModel.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorListModel.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,231 +0,0 @@ -package jaxx.runtime.validator.swing; - -import jaxx.runtime.validator.BeanValidatorEvent; - -import javax.swing.DefaultListModel; -import javax.swing.JComponent; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; -import jaxx.runtime.validator.BeanValidatorField; -import jaxx.runtime.validator.BeanValidatorListener; -import jaxx.runtime.validator.BeanValidatorScope; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * The model of the list of errors - * - * @author chemit - */ -public class SwingValidatorErrorListModel extends DefaultListModel implements BeanValidatorListener { - - /** to use log facility, just put in your code: log.info(\"...\"); */ - private static Log log = LogFactory.getLog(SwingValidatorErrorListModel.class); - private static final long serialVersionUID = 1L; - /** list of registred validators */ - protected transient List<SwingValidator<?>> validators; - - public SwingValidatorErrorListModel() { - validators = new ArrayList<SwingValidator<?>>(); - } - - public void registerValidator(SwingValidator<?> validator) { - if (validators.contains(validator)) { - throw new IllegalArgumentException("the validator " + validator + " is already registred in " + this); - } - validators.add(validator); - validator.addBeanValidatorListener(this); - // the model listen on each field of the validator - /*for (ValidatorField<?> field : validator.getFields()) { - field.addValidatorErrorListener(this); - }*/ - } - - @Override - public void onFieldChanged(BeanValidatorEvent event) { - String[] toDelete = event.getMessagesToDelete(); - String[] toAdd = event.getMessagesToAdd(); - BeanValidatorScope scope = event.getScope(); - SwingValidator validator = (SwingValidator) event.getSource(); - BeanValidatorField field = event.getField(); - - if (log.isTraceEnabled()) { - log.trace("----------------------------------------------------------"); - log.trace(field + " - (" + getSize() + ") toAdd " + (toAdd == null ? null : toAdd.length)); - log.trace(field + " - (" + getSize() + ") toDelete " + (toDelete == null ? null : toDelete.length)); - } - - if ((toAdd == null || toAdd.length == 0) && (toDelete == null || toDelete.length == 0)) { - // no data to add nor remove, so nothing to do - return; - } - - if (toAdd == null || toAdd.length == 0) { - - if (log.isTraceEnabled()) { - log.trace(field + " - toDelete : just delete some datas!"); - } - - // no add, no need to resort the datas, can direclty delete - // messages we do not want any longer - - // delete some messages for the given field and given scope - List<String> ids = new java.util.ArrayList<String>(java.util.Arrays.asList(toDelete)); - List<Integer> indexs = new java.util.ArrayList<Integer>(toDelete.length); - - Enumeration enumeration = elements(); - int index = 0; - while (enumeration.hasMoreElements()) { - SwingValidatorErrorModel error = (SwingValidatorErrorModel) enumeration.nextElement(); - - if (error.getValidator() == validator && error.getField() == field && ids.contains(error.getError())) { - indexs.add(index); - } - index++; - } - - java.util.Collections.reverse(indexs); - - for (Integer i : indexs) { - removeElementAt(i); - } - - return; - } - - if (log.isTraceEnabled()) { - log.trace(field + " - add and delete !"); - } - - List<SwingValidatorErrorModel> newMessages = new ArrayList<SwingValidatorErrorModel>(); - - - - // obtain all messages not to delete - - List<String> ids = new java.util.ArrayList<String>(java.util.Arrays.asList(toDelete)); - - Enumeration enumeration = elements(); - while (enumeration.hasMoreElements()) { - SwingValidatorErrorModel error = (SwingValidatorErrorModel) enumeration.nextElement(); - - if (error.getValidator() != validator || error.getField() != field || !ids.contains(error.getError())) { - // keep this row - newMessages.add(error); - } - } - - if (toAdd != null && toAdd.length > 0) { - JComponent editor = validator.getFieldRepresentation(field.getName()); - // add new messages - for (String error : toAdd) { - newMessages.add(new SwingValidatorErrorModel(validator, field, error, editor)); - } - } - - // sort datas - - java.util.Collections.sort(newMessages); - - // clean model and reinject new errors - removeAllElements(); - - // reinject in list model, all the errors - for (SwingValidatorErrorModel error : newMessages) { - addElement(error); - } - - /* - List<SwingValidatorErrorModel> newErrors = new ArrayList<SwingValidatorErrorModel>(); - - JComponent editor = validator.getFieldRepresentation(field.getName()); - // add new errors - for (String error : toAdd) { - newErrors.add(new SwingValidatorErrorModel(validator, field, error, editor)); - } - - - java.util.Collections.sort(newErrors); - - // clean model and reinject new errors - removeAllElements(); - - // reinject in list model, all the errors - for (SwingValidatorErrorModel error : newErrors) { - addElement(error); - }*/ - } - /** - * Invoked when a validator detects a error on a field. - * - * @param event the event - */ - /*@Override - public void onNewError(ValidatorErrorEvent event) { - ValidatorField field = event.getField(); - SwingValidator validator = (SwingValidator) event.getSource(); - Set<String> errors = event.getErrors(); - - // must remove all previously error for this field and validator - List<SwingValidatorErrorModel> newErrors = new ArrayList<SwingValidatorErrorModel>(); - JComponent editor = validator.getFieldRepresentation(field.getName()); - Enumeration enumeration = elements(); - while (enumeration.hasMoreElements()) { - SwingValidatorErrorModel error = (SwingValidatorErrorModel) enumeration.nextElement(); - if (error.getValidator() == validator && error.getField() == field) { - // this error can be skipped - continue; - } - newErrors.add(error); - } - // add new errors - for (String error : errors) { - newErrors.add(new SwingValidatorErrorModel(validator, field, error, editor)); - } - java.util.Collections.sort(newErrors); - - // clean model and reinject new errors - removeAllElements(); - - // reinject in list model, all the errors - for (SwingValidatorErrorModel error : newErrors) { - addElement(error); - } - //FIXME, this is not performant, prefer use a isValueAdjusting property on SwingValidator - // notify that the model has changed - }*/ - /** - * Invoked when a validator detetcs that a previously error is - * no more exisitng. - * - * @param event the event - */ - /*@Override - public void onResolvedError(ValidatorErrorEvent event) { - SwingValidator validator = (SwingValidator) event.getSource(); - ValidatorField field = event.getField(); - // must remove all previously error for this field - - boolean somethingChange = false; - Enumeration enumeration = elements(); - List<SwingValidatorErrorModel> newList = new ArrayList<SwingValidatorErrorModel>(); - while (enumeration.hasMoreElements()) { - SwingValidatorErrorModel error = (SwingValidatorErrorModel) enumeration.nextElement(); - if (error.getValidator() == validator && error.getField() == field) { - // this error can be skipped - somethingChange = true; - } else { - newList.add(error); - } - } - // clean model and reinject new errors - removeAllElements(); - - if (somethingChange) { - for (SwingValidatorErrorModel errorModel : newList) { - addElement(errorModel); - } - } - }*/ -} Deleted: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorListMouseListener.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorListMouseListener.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorListMouseListener.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,61 +0,0 @@ -package jaxx.runtime.validator.swing; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.swing.JComponent; -import javax.swing.JList; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -/** - * A mouse listener to put on a {@link javax.swing.JList} with a {@link SwingValidatorErrorListModel} as a model. - * <p/> - * When a double click occurs, find the selected error in model and then focus to the associated component of error. - * - * @author chemit - */ -public class SwingValidatorErrorListMouseListener extends MouseAdapter { - - /** to use log facility, just put in your code: log.info(\"...\"); */ - static private Log log = LogFactory.getLog(SwingValidatorErrorListMouseListener.class); - - @Override - public void mouseClicked(MouseEvent e) { - super.mouseClicked(e); - if (e.getClickCount() == 2) { - - SwingValidatorErrorModel entry = getSelectedError(e); - if (entry == null) { - // no entry found - return; - } - JComponent component = entry.getEditor(); - if (component != null) { - component.requestFocus(); - } - } - } - - - protected SwingValidatorErrorModel getSelectedError(MouseEvent e) { - JList list = (JList) e.getSource(); - if (!(list.getModel() instanceof SwingValidatorErrorListModel)) { - log.warn("model must be a " + SwingValidatorErrorListModel.class + ", but was " + list.getModel()); - return null; - } - - SwingValidatorErrorListModel model = (SwingValidatorErrorListModel) list.getModel(); - int index = list.getSelectionModel().getMinSelectionIndex(); - if (index == -1) { - // nothing is selected - return null; - } - SwingValidatorErrorModel entry = (SwingValidatorErrorModel) model.getElementAt(index); - if (log.isDebugEnabled()) { - log.debug("selected index: " + index + " : error: " + entry); - } - return entry; - } - -} \ No newline at end of file Deleted: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorModel.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorModel.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorModel.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,58 +0,0 @@ -package jaxx.runtime.validator.swing; - - -import javax.swing.JComponent; -import jaxx.runtime.validator.BeanValidatorField; - -/** @author chemit */ -public class SwingValidatorErrorModel implements Comparable<SwingValidatorErrorModel> { - protected SwingValidator validator; - protected BeanValidatorField field; - protected String error; - protected JComponent editor; - - public SwingValidatorErrorModel(SwingValidator validator, BeanValidatorField field, String error, JComponent editor) { - this.field = field; - this.validator = validator; - this.error = error; - this.editor = editor; - } - - public JComponent getEditor() { - return editor; - } - - public SwingValidator getValidator() { - return validator; - } - - public BeanValidatorField getField() { - return field; - } - - public String getError() { - return error; - } - - @Override - public int compareTo(SwingValidatorErrorModel o) { - int result = field.getScope().compareTo(o.field.getScope()); - if (result != 0) { - return result; - } - result = field.getName().compareTo(o.field.getName()); - if (result != 0) { - return result; - } - result = error.compareTo(o.error); - return result; - } - - @Override - public String toString() { - if (editor == null) { - return field.getI18nError(error); - } - return editor.getName() + " : " + field.getI18nError(error); - } -} Deleted: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableModel.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableModel.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableModel.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,158 +0,0 @@ -package jaxx.runtime.validator.swing; - -import jaxx.runtime.validator.BeanValidatorEvent; - -import javax.swing.JComponent; -import javax.swing.table.DefaultTableModel; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Enumeration; -import java.util.List; -import java.util.Vector; -import jaxx.runtime.validator.BeanValidatorField; -import jaxx.runtime.validator.BeanValidatorListener; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * The model of the list of errors - * - * @author chemit - */ -public class SwingValidatorErrorTableModel extends DefaultTableModel implements BeanValidatorListener { - - /** to use log facility, just put in your code: log.info(\"...\"); */ - private static Log log = LogFactory.getLog(SwingValidatorErrorTableMouseListener.class); - private static final long serialVersionUID = 1L; - public static final String[] columnNames = {"validator.scope", "validator.field", "validator.message"}; - /** list of registred validators */ - protected transient List<SwingValidator<?>> validators; - /** comporator of errors */ - protected transient Comparator<SwingValidatorErrorModel> comparator; - - public SwingValidatorErrorTableModel() { - super(columnNames, 0); - validators = new ArrayList<SwingValidator<?>>(); - } - - public int getErrorColumn() { - return findColumn(columnNames[2]); - } - - @Override - public boolean isCellEditable(int row, int column) { - // cells are never editable in this model - return false; - } - - public void registerValidator(SwingValidator<?> validator) { - if (validators.contains(validator)) { - throw new IllegalArgumentException("the validator " + validator + " is already registred in " + this); - } - validators.add(validator); - validator.addBeanValidatorListener(this); - } - - @Override - public void onFieldChanged(BeanValidatorEvent event) { - String[] toDelete = event.getMessagesToDelete(); - String[] toAdd = event.getMessagesToAdd(); - BeanValidatorField field = event.getField(); - - if (log.isTraceEnabled()) { - log.trace("----------------------------------------------------------"); - log.trace(field + " - (" + getRowCount() + ") toAdd " + (toAdd == null ? null : toAdd.length)); - log.trace(field + " - (" + getRowCount() + ") toDelete " + (toDelete == null ? null : toDelete.length)); - } - if ((toAdd == null || toAdd.length == 0) && (toDelete == null || toDelete.length == 0)) { - // no data to add nor remove, so nothing to do - return; - } - - SwingValidator validator = (SwingValidator) event.getSource(); - - - int errorColumn = getErrorColumn(); - - if (toAdd == null || toAdd.length == 0) { - - - if (log.isTraceEnabled()) { - log.trace(field + " - toDelete : just delete some datas!"); - } - - // no add, no need to resort the datas, can direclty delete - // messages we do not want any longer - - // delete some messages for the given field and given scope - List<String> ids = new java.util.ArrayList<String>(java.util.Arrays.asList(toDelete)); - List<Integer> indexs = new java.util.ArrayList<Integer>(toDelete.length); - - Enumeration enumeration = getDataVector().elements(); - - int index = 0; - while (enumeration.hasMoreElements()) { - Vector row = (Vector) enumeration.nextElement(); - SwingValidatorErrorModel error = (SwingValidatorErrorModel) row.get(errorColumn); - if (error.getValidator() == validator && error.getField() == field && ids.contains(error.getError())) { - // remo the message - indexs.add(index); - } - index++; - } - java.util.Collections.reverse(indexs); - - for (Integer i : indexs) { - removeRow(i); - } - - return; - } - - if (log.isTraceEnabled()) { - log.trace(field + " - add and delete !"); - } - - // rebuild all the data (since we are some adding data and we ensure - // an order on datas) - - List<SwingValidatorErrorModel> newMessages = new ArrayList<SwingValidatorErrorModel>(); - - // delete some messages for the given field and given scope - List<String> ids = new java.util.ArrayList<String>(java.util.Arrays.asList(toDelete)); - - Enumeration enumeration = getDataVector().elements(); - - while (enumeration.hasMoreElements()) { - Vector row = (Vector) enumeration.nextElement(); - SwingValidatorErrorModel error = (SwingValidatorErrorModel) row.get(errorColumn); - if (error.getValidator() != validator || error.getField() != field || !ids.contains(error.getError())) { - // keep this row - newMessages.add(error); - } - } - - if (toAdd != null && toAdd.length > 0) { - JComponent editor = validator.getFieldRepresentation(field.getName()); - // add new errors - for (String error : toAdd) { - SwingValidatorErrorModel errorModel = new SwingValidatorErrorModel(validator, field, error, editor); - newMessages.add(errorModel); - } - } - - // sort datas - - java.util.Collections.sort(newMessages); - - // clean table model and reinject new messages - getDataVector().clear(); - - // reinject in list model, all the errors - for (SwingValidatorErrorModel error : newMessages) { - addRow(new Object[]{error.getField().getScope(), error.getField().getName(), error}); - } - - fireTableDataChanged(); - } -} \ No newline at end of file Deleted: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableMouseListener.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableMouseListener.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableMouseListener.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,92 +0,0 @@ -package jaxx.runtime.validator.swing; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.swing.JComponent; -import javax.swing.JTable; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; - -/** - * A mouse listener to put on a {@link javax.swing.JList} with a {@link SwingValidatorErrorTableModel} as a model. - * <p/> - * When a double click occurs, find the selected error in model and then focus to the associated component of error. - * - * @author chemit - */ -public class SwingValidatorErrorTableMouseListener extends MouseAdapter { - - /** to use log facility, just put in your code: log.info(\"...\"); */ - private static Log log = LogFactory.getLog(SwingValidatorErrorTableMouseListener.class); - - public static final String HIGHLIGHT_ERROR_PROPERTY = "highlightError"; - - /** delgate property change support */ - protected PropertyChangeSupport pcs; - - public SwingValidatorErrorTableMouseListener() { - pcs = new PropertyChangeSupport(this); - } - - @Override - public void mouseClicked(MouseEvent e) { - super.mouseClicked(e); - if (e.getClickCount() == 2) { - - SwingValidatorErrorModel entry = getSelectedError(e); - if (entry == null) { - // no entry found - return; - } - JComponent component = entry.getEditor(); - if (component != null) { - pcs.firePropertyChange(HIGHLIGHT_ERROR_PROPERTY, null, entry); - if (component.isVisible()) { - component.requestFocus(); - } - } - } - } - - - protected SwingValidatorErrorModel getSelectedError(MouseEvent e) { - JTable table = (JTable) e.getSource(); - if (!(table.getModel() instanceof SwingValidatorErrorTableModel)) { - log.warn("model must be a " + SwingValidatorErrorTableModel.class + ", but was " + table.getModel()); - return null; - } - - SwingValidatorErrorTableModel model = (SwingValidatorErrorTableModel) table.getModel(); - int index = table.getSelectionModel().getMinSelectionIndex(); - if (index == -1) { - // nothing is selected - return null; - } - int col = model.getErrorColumn(); - SwingValidatorErrorModel entry = (SwingValidatorErrorModel) model.getValueAt(index, col); - if (log.isDebugEnabled()) { - log.debug("selected index: " + index + " : error: " + entry); - } - return entry; - } - - public void addPropertyChangeListener(PropertyChangeListener listener) { - pcs.addPropertyChangeListener(listener); - } - - public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { - pcs.addPropertyChangeListener(propertyName, listener); - } - - public void removePropertyChangeListener(PropertyChangeListener listener) { - pcs.removePropertyChangeListener(listener); - } - - public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { - pcs.removePropertyChangeListener(propertyName, listener); - } - -} \ No newline at end of file Deleted: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableRenderer.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableRenderer.java 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableRenderer.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,61 +0,0 @@ -package jaxx.runtime.validator.swing; - -import javax.swing.ImageIcon; -import javax.swing.JLabel; -import javax.swing.JTable; -import javax.swing.table.DefaultTableCellRenderer; -import java.awt.Component; -import jaxx.runtime.validator.BeanValidatorScope; - -/** @author chemit */ -public class SwingValidatorErrorTableRenderer extends DefaultTableCellRenderer { - - private static final long serialVersionUID = 1L; - ImageIcon errorIcon; - ImageIcon warningIcon; - ImageIcon infoIcon; - - public SwingValidatorErrorTableRenderer() { - errorIcon = jaxx.runtime.Util.createImageIcon("error.png"); - warningIcon = jaxx.runtime.Util.createImageIcon("warning.png"); - infoIcon = jaxx.runtime.Util.createImageIcon("info.png"); - } - - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - JLabel rendererComponent = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - - ImageIcon icon = null; - String text = null; - if (value instanceof BeanValidatorScope) { - - BeanValidatorScope scope = (BeanValidatorScope) value; - switch (scope) { - case ERROR: - icon = errorIcon; - break; - case WARNING: - icon = warningIcon; - break; - case INFO: - icon = infoIcon; - break; - } - } else if (value instanceof SwingValidatorErrorModel) { - SwingValidatorErrorModel model = (SwingValidatorErrorModel) value; - String error = model.getError(); - text = model.getField().getI18nError(error); - } else { - // keep text rendered - text = rendererComponent.getText(); - } - rendererComponent.setText(text); - rendererComponent.setIcon(icon); - return rendererComponent; - } - - @Override - protected void setValue(Object value) { - super.setValue(value); - } -} \ No newline at end of file Copied: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListModel.java (from rev 1273, jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorListModel.java) =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListModel.java (rev 0) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListModel.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -0,0 +1,135 @@ +package jaxx.runtime.validator.swing; + +import jaxx.runtime.validator.BeanValidatorEvent; + +import javax.swing.DefaultListModel; +import javax.swing.JComponent; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import jaxx.runtime.validator.BeanValidatorField; +import jaxx.runtime.validator.BeanValidatorListener; +import jaxx.runtime.validator.BeanValidatorScope; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * The model of the list of validation's messages + * + * @author chemit + */ +public class SwingValidatorMessageListModel extends DefaultListModel implements BeanValidatorListener { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + private static Log log = LogFactory.getLog(SwingValidatorMessageListModel.class); + private static final long serialVersionUID = 1L; + /** list of registred validators */ + protected transient List<SwingValidator<?>> validators; + + public SwingValidatorMessageListModel() { + validators = new ArrayList<SwingValidator<?>>(); + } + + public void registerValidator(SwingValidator<?> validator) { + if (validators.contains(validator)) { + throw new IllegalArgumentException("the validator " + validator + " is already registred in " + this); + } + validators.add(validator); + validator.addBeanValidatorListener(this); + } + + @Override + public void onFieldChanged(BeanValidatorEvent event) { + String[] toDelete = event.getMessagesToDelete(); + String[] toAdd = event.getMessagesToAdd(); + BeanValidatorScope scope = event.getScope(); + SwingValidator validator = (SwingValidator) event.getSource(); + BeanValidatorField field = event.getField(); + + if (log.isTraceEnabled()) { + log.trace("----------------------------------------------------------"); + log.trace(field + " - (" + getSize() + ") toAdd " + (toAdd == null ? null : toAdd.length)); + log.trace(field + " - (" + getSize() + ") toDelete " + (toDelete == null ? null : toDelete.length)); + } + + if ((toAdd == null || toAdd.length == 0) && (toDelete == null || toDelete.length == 0)) { + // no data to add nor remove, so nothing to do + return; + } + + if (toAdd == null || toAdd.length == 0) { + + if (log.isTraceEnabled()) { + log.trace(field + " - toDelete : just delete some datas!"); + } + + // no add, no need to resort the datas, can direclty delete + // messages we do not want any longer + + // delete some messages for the given field and given scope + List<String> ids = new java.util.ArrayList<String>(java.util.Arrays.asList(toDelete)); + List<Integer> indexs = new java.util.ArrayList<Integer>(toDelete.length); + + Enumeration enumeration = elements(); + int index = 0; + while (enumeration.hasMoreElements()) { + SwingValidatorMessageModel error = (SwingValidatorMessageModel) enumeration.nextElement(); + + if (error.getValidator() == validator && error.getField() == field && ids.contains(error.getMessage())) { + indexs.add(index); + } + index++; + } + + java.util.Collections.reverse(indexs); + + for (Integer i : indexs) { + removeElementAt(i); + } + + return; + } + + if (log.isTraceEnabled()) { + log.trace(field + " - add and delete !"); + } + + List<SwingValidatorMessageModel> newMessages = new ArrayList<SwingValidatorMessageModel>(); + + + + // obtain all messages not to delete + + List<String> ids = new java.util.ArrayList<String>(java.util.Arrays.asList(toDelete)); + + Enumeration enumeration = elements(); + while (enumeration.hasMoreElements()) { + SwingValidatorMessageModel error = (SwingValidatorMessageModel) enumeration.nextElement(); + + if (error.getValidator() != validator || error.getField() != field || !ids.contains(error.getMessage())) { + // keep this row + newMessages.add(error); + } + } + + if (toAdd != null && toAdd.length > 0) { + JComponent editor = validator.getFieldRepresentation(field.getName()); + // add new messages + for (String error : toAdd) { + newMessages.add(new SwingValidatorMessageModel(validator, field, error, editor)); + } + } + + // sort datas + + java.util.Collections.sort(newMessages); + + // clean model and reinject new errors + removeAllElements(); + + // reinject in list model, all the errors + for (SwingValidatorMessageModel error : newMessages) { + addElement(error); + } + } +} Copied: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListMouseListener.java (from rev 1273, jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorListMouseListener.java) =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListMouseListener.java (rev 0) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListMouseListener.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -0,0 +1,61 @@ +package jaxx.runtime.validator.swing; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.JComponent; +import javax.swing.JList; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * A mouse listener to put on a {@link javax.swing.JList} with a {@link SwingValidatorMessageListModel} as a model. + * <p/> + * When a double click occurs, find the selected error in model and then focus to the associated component of error. + * + * @author chemit + */ +public class SwingValidatorMessageListMouseListener extends MouseAdapter { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(SwingValidatorMessageListMouseListener.class); + + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + if (e.getClickCount() == 2) { + + SwingValidatorMessageModel entry = getSelectedError(e); + if (entry == null) { + // no entry found + return; + } + JComponent component = entry.getEditor(); + if (component != null) { + component.requestFocus(); + } + } + } + + + protected SwingValidatorMessageModel getSelectedError(MouseEvent e) { + JList list = (JList) e.getSource(); + if (!(list.getModel() instanceof SwingValidatorMessageListModel)) { + log.warn("model must be a " + SwingValidatorMessageListModel.class + ", but was " + list.getModel()); + return null; + } + + SwingValidatorMessageListModel model = (SwingValidatorMessageListModel) list.getModel(); + int index = list.getSelectionModel().getMinSelectionIndex(); + if (index == -1) { + // nothing is selected + return null; + } + SwingValidatorMessageModel entry = (SwingValidatorMessageModel) model.getElementAt(index); + if (log.isDebugEnabled()) { + log.debug("selected index: " + index + " : error: " + entry); + } + return entry; + } + +} \ No newline at end of file Property changes on: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListMouseListener.java ___________________________________________________________________ Name: svn:mergeinfo + Copied: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageModel.java (from rev 1273, jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorModel.java) =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageModel.java (rev 0) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageModel.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -0,0 +1,75 @@ +package jaxx.runtime.validator.swing; + +import javax.swing.JComponent; +import jaxx.runtime.validator.BeanValidatorField; + +/** + * The object to box a validation message within an u. + * + * @author chemit + * @since 1.3 + */ +public class SwingValidatorMessageModel implements Comparable<SwingValidatorMessageModel> { + + /** + * the validator that produce the message + */ + protected SwingValidator validator; + /** + * the field thatproduce the message + */ + protected BeanValidatorField field; + /** + * the label of the message (to be displayed somewhere) + */ + protected String message; + /** + * the optional field's editor + */ + protected JComponent editor; + + public SwingValidatorMessageModel(SwingValidator validator, BeanValidatorField field, String message, JComponent editor) { + this.field = field; + this.validator = validator; + this.message = message; + this.editor = editor; + } + + public JComponent getEditor() { + return editor; + } + + public SwingValidator getValidator() { + return validator; + } + + public BeanValidatorField getField() { + return field; + } + + public String getMessage() { + return message; + } + + @Override + public int compareTo(SwingValidatorMessageModel o) { + int result = field.getScope().compareTo(o.field.getScope()); + if (result != 0) { + return result; + } + result = field.getName().compareTo(o.field.getName()); + if (result != 0) { + return result; + } + result = message.compareTo(o.message); + return result; + } + + @Override + public String toString() { + if (editor == null) { + return field.getI18nError(message); + } + return editor.getName() + " : " + field.getI18nError(message); + } +} Property changes on: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageModel.java ___________________________________________________________________ Name: svn:mergeinfo + Copied: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableModel.java (from rev 1273, jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableModel.java) =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableModel.java (rev 0) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableModel.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -0,0 +1,158 @@ +package jaxx.runtime.validator.swing; + +import jaxx.runtime.validator.BeanValidatorEvent; + +import javax.swing.JComponent; +import javax.swing.table.DefaultTableModel; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.List; +import java.util.Vector; +import jaxx.runtime.validator.BeanValidatorField; +import jaxx.runtime.validator.BeanValidatorListener; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * The model of the list of errors + * + * @author chemit + */ +public class SwingValidatorMessageTableModel extends DefaultTableModel implements BeanValidatorListener { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + private static Log log = LogFactory.getLog(SwingValidatorMessageTableMouseListener.class); + private static final long serialVersionUID = 1L; + public static final String[] columnNames = {"validator.scope", "validator.field", "validator.message"}; + /** list of registred validators */ + protected transient List<SwingValidator<?>> validators; + /** comporator of errors */ + protected transient Comparator<SwingValidatorMessageModel> comparator; + + public SwingValidatorMessageTableModel() { + super(columnNames, 0); + validators = new ArrayList<SwingValidator<?>>(); + } + + public int getErrorColumn() { + return findColumn(columnNames[2]); + } + + @Override + public boolean isCellEditable(int row, int column) { + // cells are never editable in this model + return false; + } + + public void registerValidator(SwingValidator<?> validator) { + if (validators.contains(validator)) { + throw new IllegalArgumentException("the validator " + validator + " is already registred in " + this); + } + validators.add(validator); + validator.addBeanValidatorListener(this); + } + + @Override + public void onFieldChanged(BeanValidatorEvent event) { + String[] toDelete = event.getMessagesToDelete(); + String[] toAdd = event.getMessagesToAdd(); + BeanValidatorField field = event.getField(); + + if (log.isTraceEnabled()) { + log.trace("----------------------------------------------------------"); + log.trace(field + " - (" + getRowCount() + ") toAdd " + (toAdd == null ? null : toAdd.length)); + log.trace(field + " - (" + getRowCount() + ") toDelete " + (toDelete == null ? null : toDelete.length)); + } + if ((toAdd == null || toAdd.length == 0) && (toDelete == null || toDelete.length == 0)) { + // no data to add nor remove, so nothing to do + return; + } + + SwingValidator validator = (SwingValidator) event.getSource(); + + + int errorColumn = getErrorColumn(); + + if (toAdd == null || toAdd.length == 0) { + + + if (log.isTraceEnabled()) { + log.trace(field + " - toDelete : just delete some datas!"); + } + + // no add, no need to resort the datas, can direclty delete + // messages we do not want any longer + + // delete some messages for the given field and given scope + List<String> ids = new java.util.ArrayList<String>(java.util.Arrays.asList(toDelete)); + List<Integer> indexs = new java.util.ArrayList<Integer>(toDelete.length); + + Enumeration enumeration = getDataVector().elements(); + + int index = 0; + while (enumeration.hasMoreElements()) { + Vector row = (Vector) enumeration.nextElement(); + SwingValidatorMessageModel error = (SwingValidatorMessageModel) row.get(errorColumn); + if (error.getValidator() == validator && error.getField() == field && ids.contains(error.getMessage())) { + // remo the message + indexs.add(index); + } + index++; + } + java.util.Collections.reverse(indexs); + + for (Integer i : indexs) { + removeRow(i); + } + + return; + } + + if (log.isTraceEnabled()) { + log.trace(field + " - add and delete !"); + } + + // rebuild all the data (since we are some adding data and we ensure + // an order on datas) + + List<SwingValidatorMessageModel> newMessages = new ArrayList<SwingValidatorMessageModel>(); + + // delete some messages for the given field and given scope + List<String> ids = new java.util.ArrayList<String>(java.util.Arrays.asList(toDelete)); + + Enumeration enumeration = getDataVector().elements(); + + while (enumeration.hasMoreElements()) { + Vector row = (Vector) enumeration.nextElement(); + SwingValidatorMessageModel error = (SwingValidatorMessageModel) row.get(errorColumn); + if (error.getValidator() != validator || error.getField() != field || !ids.contains(error.getMessage())) { + // keep this row + newMessages.add(error); + } + } + + if (toAdd != null && toAdd.length > 0) { + JComponent editor = validator.getFieldRepresentation(field.getName()); + // add new errors + for (String error : toAdd) { + SwingValidatorMessageModel errorModel = new SwingValidatorMessageModel(validator, field, error, editor); + newMessages.add(errorModel); + } + } + + // sort datas + + java.util.Collections.sort(newMessages); + + // clean table model and reinject new messages + getDataVector().clear(); + + // reinject in list model, all the errors + for (SwingValidatorMessageModel error : newMessages) { + addRow(new Object[]{error.getField().getScope(), error.getField().getName(), error}); + } + + fireTableDataChanged(); + } +} \ No newline at end of file Copied: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableMouseListener.java (from rev 1273, jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableMouseListener.java) =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableMouseListener.java (rev 0) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableMouseListener.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -0,0 +1,92 @@ +package jaxx.runtime.validator.swing; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.JComponent; +import javax.swing.JTable; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + +/** + * A mouse listener to put on a {@link javax.swing.JList} with a {@link SwingValidatorMessageTableModel} as a model. + * <p/> + * When a double click occurs, find the selected error in model and then focus to the associated component of error. + * + * @author chemit + */ +public class SwingValidatorMessageTableMouseListener extends MouseAdapter { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + private static Log log = LogFactory.getLog(SwingValidatorMessageTableMouseListener.class); + + public static final String HIGHLIGHT_ERROR_PROPERTY = "highlightError"; + + /** delgate property change support */ + protected PropertyChangeSupport pcs; + + public SwingValidatorMessageTableMouseListener() { + pcs = new PropertyChangeSupport(this); + } + + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + if (e.getClickCount() == 2) { + + SwingValidatorMessageModel entry = getSelectedError(e); + if (entry == null) { + // no entry found + return; + } + JComponent component = entry.getEditor(); + if (component != null) { + pcs.firePropertyChange(HIGHLIGHT_ERROR_PROPERTY, null, entry); + if (component.isVisible()) { + component.requestFocus(); + } + } + } + } + + + protected SwingValidatorMessageModel getSelectedError(MouseEvent e) { + JTable table = (JTable) e.getSource(); + if (!(table.getModel() instanceof SwingValidatorMessageTableModel)) { + log.warn("model must be a " + SwingValidatorMessageTableModel.class + ", but was " + table.getModel()); + return null; + } + + SwingValidatorMessageTableModel model = (SwingValidatorMessageTableModel) table.getModel(); + int index = table.getSelectionModel().getMinSelectionIndex(); + if (index == -1) { + // nothing is selected + return null; + } + int col = model.getErrorColumn(); + SwingValidatorMessageModel entry = (SwingValidatorMessageModel) model.getValueAt(index, col); + if (log.isDebugEnabled()) { + log.debug("selected index: " + index + " : error: " + entry); + } + return entry; + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + pcs.addPropertyChangeListener(listener); + } + + public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { + pcs.addPropertyChangeListener(propertyName, listener); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + pcs.removePropertyChangeListener(listener); + } + + public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { + pcs.removePropertyChangeListener(propertyName, listener); + } + +} \ No newline at end of file Property changes on: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableMouseListener.java ___________________________________________________________________ Name: svn:mergeinfo + Copied: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableRenderer.java (from rev 1273, jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorErrorTableRenderer.java) =================================================================== --- jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableRenderer.java (rev 0) +++ jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableRenderer.java 2009-03-21 08:22:03 UTC (rev 1274) @@ -0,0 +1,61 @@ +package jaxx.runtime.validator.swing; + +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.table.DefaultTableCellRenderer; +import java.awt.Component; +import jaxx.runtime.validator.BeanValidatorScope; + +/** @author chemit */ +public class SwingValidatorMessageTableRenderer extends DefaultTableCellRenderer { + + private static final long serialVersionUID = 1L; + ImageIcon errorIcon; + ImageIcon warningIcon; + ImageIcon infoIcon; + + public SwingValidatorMessageTableRenderer() { + errorIcon = jaxx.runtime.Util.createImageIcon("error.png"); + warningIcon = jaxx.runtime.Util.createImageIcon("warning.png"); + infoIcon = jaxx.runtime.Util.createImageIcon("info.png"); + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + JLabel rendererComponent = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + + ImageIcon icon = null; + String text = null; + if (value instanceof BeanValidatorScope) { + + BeanValidatorScope scope = (BeanValidatorScope) value; + switch (scope) { + case ERROR: + icon = errorIcon; + break; + case WARNING: + icon = warningIcon; + break; + case INFO: + icon = infoIcon; + break; + } + } else if (value instanceof SwingValidatorMessageModel) { + SwingValidatorMessageModel model = (SwingValidatorMessageModel) value; + String error = model.getMessage(); + text = model.getField().getI18nError(error); + } else { + // keep text rendered + text = rendererComponent.getText(); + } + rendererComponent.setText(text); + rendererComponent.setIcon(icon); + return rendererComponent; + } + + @Override + protected void setValue(Object value) { + super.setValue(value); + } +} \ No newline at end of file Property changes on: jaxx/trunk/jaxx-runtime-validator-swing/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableRenderer.java ___________________________________________________________________ Name: svn:mergeinfo + Modified: jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/errors/DuplicatedErrorListModel.jaxx =================================================================== --- jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/errors/DuplicatedErrorListModel.jaxx 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/errors/DuplicatedErrorListModel.jaxx 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,4 +1,4 @@ <Application> - <jaxx.runtime.validator.swing.SwingValidatorErrorListModel id='errors'/> + <jaxx.runtime.validator.swing.SwingValidatorMessageListModel id='errors'/> <BeanValidator beanClass='testcases.validator.errors.Model' errorListModel='errors' errorListModel='fake'/> </Application> Modified: jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/errors/DuplicatedErrorTableModel.jaxx =================================================================== --- jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/errors/DuplicatedErrorTableModel.jaxx 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/errors/DuplicatedErrorTableModel.jaxx 2009-03-21 08:22:03 UTC (rev 1274) @@ -1,4 +1,4 @@ <Application> - <jaxx.runtime.validator.swing.SwingValidatorErrorListModel id='errors'/> + <jaxx.runtime.validator.swing.SwingValidatorMessageListModel id='errors'/> <BeanValidator beanClass='testcases.validator.errors.Model' errorTableModel='errors' errorTableModel='fake'/> </Application> Modified: jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/ok/Validation.jaxx =================================================================== --- jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/ok/Validation.jaxx 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/ok/Validation.jaxx 2009-03-21 08:22:03 UTC (rev 1274) @@ -6,7 +6,7 @@ <Identity id='identity'/> <!-- errors model --> - <jaxx.runtime.validator.swing.SwingValidatorErrorListModel id='errors' + <jaxx.runtime.validator.swing.SwingValidatorMessageListModel id='errors' onContentsChanged='ok.setEnabled(errors.size()==0)'/> <!-- validators --> Modified: jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/ok/ValidationBeanClass.jaxx =================================================================== --- jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/ok/ValidationBeanClass.jaxx 2009-03-20 13:02:18 UTC (rev 1273) +++ jaxx/trunk/maven-jaxx-plugin/src/test/resources/testcases/validator/ok/ValidationBeanClass.jaxx 2009-03-21 08:22:03 UTC (rev 1274) @@ -4,7 +4,7 @@ <Identity id='identity'/> <!-- errors model --> - <jaxx.runtime.validator.swing.SwingValidatorErrorListModel id='errors'/> + <jaxx.runtime.validator.swing.SwingValidatorMessageListModel id='errors'/> <!-- validators --> <BeanValidator id='validator3' autoField='true' beanClass='testcases.validator.ok.Identity' errorListModel='errors'>
participants (1)
-
tchemit@users.labs.libre-entreprise.org