You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by fr...@apache.org on 2007/02/05 18:15:44 UTC

svn commit: r503777 [2/4] - in /tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support: ./ .settings/ src/main/java/org/apache/tapestry/ src/main/java/org/apache/tapestry/annotations/ src/main/java/org/apache/tapestry/beaneditor/ src/main/ja...

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/PasswordField.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/PasswordField.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/PasswordField.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/PasswordField.java Mon Feb  5 09:15:39 2007
@@ -21,7 +21,7 @@
  * A version of {@link TextField}, but written out as a <input type="password">. Further, the
  * output value for a PasswordField is always blank.
  */
-public class PasswordField extends AbstractTextField
+public class PasswordField<T> extends AbstractTextField<T>
 {
 
     @Override

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/Select.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/Select.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/Select.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/Select.java Mon Feb  5 09:15:39 2007
@@ -15,11 +15,11 @@
 package org.apache.tapestry.corelib.components;
 
 import java.util.List;
-import java.util.Locale;
 import java.util.Map;
 
-import org.apache.tapestry.Binding;
+import org.apache.tapestry.BindingExprValueConduit;
 import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.DefaultValueEncoder;
 import org.apache.tapestry.EnumSelectModel;
 import org.apache.tapestry.EnumValueEncoder;
 import org.apache.tapestry.FieldValidator;
@@ -29,57 +29,45 @@
 import org.apache.tapestry.SelectModel;
 import org.apache.tapestry.ValidationException;
 import org.apache.tapestry.ValidationTracker;
+import org.apache.tapestry.Validator;
+import org.apache.tapestry.ValueConduit;
 import org.apache.tapestry.ValueEncoder;
 import org.apache.tapestry.annotations.AfterRender;
 import org.apache.tapestry.annotations.BeforeRenderTemplate;
+import org.apache.tapestry.annotations.BeginRender;
 import org.apache.tapestry.annotations.Environmental;
+import org.apache.tapestry.annotations.FormPersist;
 import org.apache.tapestry.annotations.Inject;
-import org.apache.tapestry.annotations.Parameter;
 import org.apache.tapestry.corelib.base.AbstractField;
+import org.apache.tapestry.internal.services.FieldValidatorImpl;
+import org.apache.tapestry.internal.services.FieldValidatorMessages;
 import org.apache.tapestry.internal.services.FormParameterLookup;
-import org.apache.tapestry.services.FieldValidatorDefaultSource;
+import org.apache.tapestry.ioc.internal.util.Defense;
 
 /**
  * Select an item from a list of values, using an [X]HTML &lt;select&gt; element on the client side.
  * An validation decorations will go around the entire &lt;select&gt; element.
  */
-public final class Select extends AbstractField
+public final class Select<T> extends AbstractField
 {
-    @Parameter(required = true, principal = true)
-    private Object _value;
+    @FormPersist
+    private ValueConduit<T> _valueConduit;
 
     /**
      * The default encoder encodes strings, passing them to the client and back unchanged.
      */
-    @Parameter
-    private ValueEncoder _encoder = new ValueEncoder<String>()
-    {
-        public String toClient(String value)
-        {
-            return value;
-        }
-
-        public String toValue(String primaryKey)
-        {
-            // We don't do a conversion here, so it stays a String. When that String is assigned to
-            // _value, it will be coerced to the appropriate type (if possible) or an exception
-            // will be thrown.
-
-            return primaryKey;
-        }
-    };
+    @FormPersist
+    private ValueEncoder<T> _encoder;
 
     // Maybe this should default to property "<componentId>Model"?
 
-    @Parameter(required = true)
-    private SelectModel _model;
+    private SelectModel<T> _model;
 
-    @Parameter(defaultPrefix = "validate")
-    @SuppressWarnings("unchecked")
-    private FieldValidator<Object> _validate = NOOP_VALIDATOR;
+    @Inject("infrastructure:FieldValidatorMessages")
+    private FieldValidatorMessages _fieldValidatorMessages;
 
-    @Inject("infrastructure:FieldValidatorDefaultSource")
-    private FieldValidatorDefaultSource _fieldValidatorDefaultSource;
+    @FormPersist
+    private Validator<? super T>[] _validators;
 
     @Environmental
     private ValidationTracker _tracker;
@@ -87,64 +75,75 @@
     @Inject
     private ComponentResources _resources;
 
-    @Inject
-    private Locale _locale;
-
-    Binding defaultValue()
+    @SuppressWarnings("unchecked")
+    private ValueEncoder<T> getDefaultEncoder()
     {
-        return createDefaultParameterBinding("value");
+        T value = _valueConduit.get(this);
+        return value == null ? null : getDefaultEncoder((Class<T>) value.getClass());
     }
 
-    /**
-     * Computes a default value for the "validate" parameter using
-     * {@link FieldValidatorDefaultSource}.
-     */
-    FieldValidator defaultValidate()
+    @SuppressWarnings("unchecked")
+    private ValueEncoder<T> getDefaultEncoder(Class<T> valueType)
     {
-        Class type = _resources.getBoundType("value");
+        Defense.notNull(valueType, "valueType");
+        if (Enum.class.isAssignableFrom(valueType))
+            return (ValueEncoder<T>) new EnumValueEncoder(valueType);
+        ValueEncoder<T> defaultEncoder = (ValueEncoder<T>) new DefaultValueEncoder();
+        return defaultEncoder;
+    }
 
-        if (type == null)
-            return null;
+    public void useDefaultEncoder(Class<T> valueType)
+    {
+        _encoder = getDefaultEncoder(valueType);
+    }
 
-        return _fieldValidatorDefaultSource.createDefaultValidator(
-                this,
-                _resources.getId(),
-                _resources.getContainerMessages(),
-                _locale,
-                type,
-                _resources.getAnnotationProvider("value"));
+    private void useDefaultEncoder()
+    {
+        _encoder = getDefaultEncoder();
     }
 
     @SuppressWarnings("unchecked")
-    ValueEncoder defaultEncoder()
+    private SelectModel<T> getDefaultModel(Class<T> valueType)
     {
-        Class valueType = _resources.getBoundType("value");
-
-        if (valueType == null)
-            return null;
-
+        Defense.notNull(valueType, "valueType");
         if (Enum.class.isAssignableFrom(valueType))
-            return new EnumValueEncoder(valueType);
+            return new EnumSelectModel(valueType, _resources.getContainerMessages());
 
         return null;
     }
 
     @SuppressWarnings("unchecked")
-    SelectModel defaultModel()
+    private SelectModel<T> getDefaultModel()
     {
-        Class valueType = _resources.getBoundType("value");
-
-        if (valueType == null)
-            return null;
+        T value = _valueConduit.get(this);
+        return value == null ? null : getDefaultModel((Class<T>) value.getClass());
+    }
 
-        if (Enum.class.isAssignableFrom(valueType))
-            return new EnumSelectModel(valueType, _resources.getContainerMessages());
+    public void useDefaultModel(Class<T> valueType)
+    {
+        _model = getDefaultModel(valueType);
+    }
 
-        return null;
+    private void useDefaultModel()
+    {
+        _model = getDefaultModel();
     }
 
+    @BeginRender
     void beginRender(MarkupWriter writer)
     {
+        if (_valueConduit == null)
+        {
+            setValueBindingExpr(getIdBasedBindingExpression());
+        }
+        if (_encoder == null)
+        {
+            useDefaultEncoder();
+        }
+        if (_model == null)
+        {
+            useDefaultModel();
+        }
         writer.element("select", "name", getElementName(), "id", getClientId());
 
         // Disabled, informals via mixins
@@ -155,7 +154,7 @@
     {
         if (_model.getOptionGroups() != null)
         {
-            for (OptionGroupModel group : _model.getOptionGroups())
+            for (OptionGroupModel<T> group : _model.getOptionGroups())
             {
                 writeOptionGroup(writer, group);
             }
@@ -164,7 +163,7 @@
         writeOptions(writer, _model.getOptions());
     }
 
-    private void writeOptionGroup(MarkupWriter writer, OptionGroupModel model)
+    private void writeOptionGroup(MarkupWriter writer, OptionGroupModel<T> model)
     {
         writer.element("optgroup", "label", model.getLabel());
 
@@ -177,16 +176,16 @@
     }
 
     @SuppressWarnings("unchecked")
-    private void writeOptions(MarkupWriter writer, List<OptionModel> optionModels)
+    private void writeOptions(MarkupWriter writer, List<OptionModel<T>> optionModels)
     {
         if (optionModels == null)
             return;
 
-        for (OptionModel model : optionModels)
+        for (OptionModel<T> model : optionModels)
         {
-            Object optionValue = model.getValue();
+            T optionValue = model.getValue();
 
-            String clientValue = _encoder.toClient(optionValue);
+            String clientValue = _encoder.toClient(_resources, optionValue);
 
             writer.element("option", "value", clientValue);
 
@@ -204,7 +203,8 @@
 
     boolean isOptionValueSelected(Object optionValue)
     {
-        return _value == optionValue || (_value != null && _value.equals(optionValue));
+        Object value = _valueConduit.get(this);
+        return value == optionValue || (value != null && value.equals(optionValue));
     }
 
     private void writeDisabled(MarkupWriter writer, boolean disabled)
@@ -233,13 +233,16 @@
     {
         String primaryKey = paramLookup.getParameter(elementName);
 
-        Object selectedValue = _encoder.toValue(primaryKey);
+        T selectedValue = _encoder.toValue(_resources, primaryKey);
 
         try
         {
-            _validate.validate(selectedValue);
+            FieldValidator<T> fieldValidator = new FieldValidatorImpl<T>(this,
+                    _fieldValidatorMessages, _validators);
 
-            _value = selectedValue;
+            fieldValidator.validate(selectedValue);
+
+            _valueConduit.set(this, selectedValue);
         }
         catch (ValidationException ex)
         {
@@ -248,15 +251,55 @@
         }
     }
 
-    // For testing.
+    public void setModel(SelectModel<T> model)
+    {
+        _model = model;
+    }
+
+    public ValueConduit<T> getValueConduit()
+    {
+        return _valueConduit;
+    }
+
+    public void setValueConduit(ValueConduit<T> valueConduit)
+    {
+        _valueConduit = valueConduit;
+    }
 
-    void setValue(Object value)
+    @SuppressWarnings("unchecked")
+    public void setValueBindingExpr(String valueBindingExpr)
     {
-        _value = value;
+        _valueConduit = new BindingExprValueConduit(valueBindingExpr);
     }
 
-    void setModel(SelectModel model)
+    public ValueEncoder<T> getEncoder()
     {
-        _model = model;
+        return _encoder;
+    }
+
+    public void setEncoder(ValueEncoder<T> encoder)
+    {
+        _encoder = encoder;
+    }
+
+    public Validator<? super T>[] getValidators()
+    {
+        return _validators;
+    }
+
+    public void setValidators(Validator<? super T>... validators)
+    {
+        _validators = validators;
+    }
+
+    public SelectModel<T> getModel()
+    {
+        return _model;
+    }
+
+    public void useDefaultsFor(Class<T> valueType)
+    {
+        useDefaultEncoder(valueType);
+        useDefaultModel(valueType);
     }
 }

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/TextArea.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/TextArea.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/TextArea.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/TextArea.java Mon Feb  5 09:15:39 2007
@@ -22,7 +22,7 @@
  * TextArea component corresponds to a &lt;textarea&gt;. The value parameter is almost always bound
  * to a string, but this is not an absolute requirement.
  */
-public final class TextArea extends AbstractTextField
+public final class TextArea<T> extends AbstractTextField<T>
 {
     private String _value;
 

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/TextField.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/TextField.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/TextField.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/corelib/components/TextField.java Mon Feb  5 09:15:39 2007
@@ -22,7 +22,7 @@
  * editted. TextField is generally used with string values, but other values are acceptible, as long
  * as they can be freely converted back and forth to strings.
  */
-public final class TextField extends AbstractTextField
+public final class TextField<T> extends AbstractTextField<T>
 {
     @Override
     protected final void writeFieldTag(MarkupWriter writer, String value)

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/OptionGroupModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/OptionGroupModelImpl.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/OptionGroupModelImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/OptionGroupModelImpl.java Mon Feb  5 09:15:39 2007
@@ -14,30 +14,33 @@
 
 package org.apache.tapestry.internal;
 
+import java.io.Serializable;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.tapestry.OptionGroupModel;
 import org.apache.tapestry.OptionModel;
 
-public final class OptionGroupModelImpl implements OptionGroupModel
+public final class OptionGroupModelImpl<T> implements OptionGroupModel<T>, Serializable
 {
+    private static final long serialVersionUID = 1L;
+    
     private final String _label;
 
     private final boolean _disabled;
 
-    private final List<OptionModel> _options;
+    private final List<OptionModel<T>> _options;
 
     private final Map<String, String> _attributes;
 
-    public OptionGroupModelImpl(String label, boolean disabled, List<OptionModel> options,
+    public OptionGroupModelImpl(String label, boolean disabled, List<OptionModel<T>> options,
             String... attributeKeysAndValues)
     {
         this(label, disabled, options, attributeKeysAndValues.length == 0 ? null : TapestryUtils
                 .mapFromKeysAndValues(attributeKeysAndValues));
     }
 
-    public OptionGroupModelImpl(String label, boolean disabled, List<OptionModel> options,
+    public OptionGroupModelImpl(String label, boolean disabled, List<OptionModel<T>> options,
             Map<String, String> attributes)
     {
         _label = label;
@@ -56,7 +59,7 @@
         return _label;
     }
 
-    public List<OptionModel> getOptions()
+    public List<OptionModel<T>> getOptions()
     {
         return _options;
     }

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/OptionModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/OptionModelImpl.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/OptionModelImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/OptionModelImpl.java Mon Feb  5 09:15:39 2007
@@ -14,27 +14,30 @@
 
 package org.apache.tapestry.internal;
 
+import java.io.Serializable;
 import java.util.Map;
 
 import org.apache.tapestry.OptionModel;
 
-public final class OptionModelImpl implements OptionModel
+public final class OptionModelImpl<T> implements OptionModel<T>, Serializable
 {
+    private static final long serialVersionUID = 1L;
+
     private final String _label;
 
     private final boolean _disabled;
 
-    private final Object _value;
+    private final T _value;
 
     private final Map<String, String> _attributes;
 
-    public OptionModelImpl(String label, boolean disabled, Object value, String... keysAndValues)
+    public OptionModelImpl(String label, boolean disabled, T value, String... keysAndValues)
     {
         this(label, disabled, value, keysAndValues.length > 0 ? TapestryUtils
                 .mapFromKeysAndValues(keysAndValues) : null);
     }
 
-    public OptionModelImpl(String label, boolean disabled, Object value,
+    public OptionModelImpl(String label, boolean disabled, T value,
             Map<String, String> attributes)
     {
         _label = label;
@@ -53,7 +56,7 @@
         return _label;
     }
 
-    public Object getValue()
+    public T getValue()
     {
         return _value;
     }

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/SelectModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/SelectModelImpl.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/SelectModelImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/SelectModelImpl.java Mon Feb  5 09:15:39 2007
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.internal;
 
+import java.io.Serializable;
 import java.util.Arrays;
 import java.util.List;
 
@@ -21,35 +22,37 @@
 import org.apache.tapestry.OptionModel;
 import org.apache.tapestry.SelectModel;
 
-public final class SelectModelImpl implements SelectModel
+public final class SelectModelImpl<T> implements SelectModel<T>, Serializable
 {
-    private final List<OptionGroupModel> _optionGroups;
+    private static final long serialVersionUID = 1L;
+    
+    private final List<OptionGroupModel<T>> _optionGroups;
 
-    private final List<OptionModel> _optionModels;
+    private final List<OptionModel<T>> _optionModels;
 
-    public SelectModelImpl(final List<OptionGroupModel> optionGroups,
-            final List<OptionModel> optionModels)
+    public SelectModelImpl(final List<OptionGroupModel<T>> optionGroups,
+            final List<OptionModel<T>> optionModels)
     {
         _optionGroups = optionGroups;
         _optionModels = optionModels;
     }
 
-    public SelectModelImpl(OptionModel... optionModels)
+    public SelectModelImpl(OptionModel<T>... optionModels)
     {
         this(null, Arrays.asList(optionModels));
     }
 
-    public SelectModelImpl(OptionGroupModel... groupModels)
+    public SelectModelImpl(OptionGroupModel<T>... groupModels)
     {
         this(Arrays.asList(groupModels), null);
     }
 
-    public List<OptionGroupModel> getOptionGroups()
+    public List<OptionGroupModel<T>> getOptionGroups()
     {
         return _optionGroups;
     }
 
-    public List<OptionModel> getOptions()
+    public List<OptionModel<T>> getOptions()
     {
         return _optionModels;
     }

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/TapestryUtils.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/TapestryUtils.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/TapestryUtils.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/TapestryUtils.java Mon Feb  5 09:15:39 2007
@@ -126,19 +126,19 @@
      * @param input
      * @return
      */
-    public static OptionModel toOptionModel(String input)
+    public static OptionModel<String> toOptionModel(String input)
     {
         Defense.notNull(input, "input");
 
         int equalsx = input.indexOf('=');
 
         if (equalsx < 0)
-            return new OptionModelImpl(input, false, input);
+            return new OptionModelImpl<String>(input, false, input);
 
         String value = input.substring(0, equalsx);
         String label = input.substring(equalsx + 1);
 
-        return new OptionModelImpl(label, false, value);
+        return new OptionModelImpl<String>(label, false, value);
     }
 
     /**
@@ -149,11 +149,11 @@
      *            comma seperated list of terms
      * @return list of option models
      */
-    public static List<OptionModel> toOptionModels(String input)
+    public static List<OptionModel<String>> toOptionModels(String input)
     {
         Defense.notNull(input, "input");
 
-        List<OptionModel> result = newList();
+        List<OptionModel<String>> result = newList();
 
         for (String term : input.split(","))
             result.add(toOptionModel(term.trim()));
@@ -168,11 +168,11 @@
      * @param input
      * @return
      */
-    public static SelectModel toSelectModel(String input)
+    public static SelectModel<String> toSelectModel(String input)
     {
-        List<OptionModel> options = toOptionModels(input);
+        List<OptionModel<String>> options = toOptionModels(input);
 
-        return new SelectModelImpl(null, options);
+        return new SelectModelImpl<String>(null, options);
     }
 
     /**

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/AnnotationValidatorGenerator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/AnnotationValidatorGenerator.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/AnnotationValidatorGenerator.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/AnnotationValidatorGenerator.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,61 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.beaneditor;
+
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+import org.apache.tapestry.AnnotationProvider;
+import org.apache.tapestry.Validator;
+import org.apache.tapestry.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry.services.ValidatorGenerator;
+
+/**
+ * Checks for the various validate annotations, and use the data in the annotations to create
+ * {@link org.apache.tapestry.Validator}s.
+ */
+public class AnnotationValidatorGenerator implements ValidatorGenerator
+{
+    /**
+     * It will delegate this chain of commands.
+     */
+    private List<ValidateAnnotationWorker> _annotationWorkers;
+
+    public AnnotationValidatorGenerator(List<ValidateAnnotationWorker> annotationWorkers)
+    {
+        this._annotationWorkers = annotationWorkers;
+    }
+
+    /**
+     * For each {@link ValidateAnnotationWorker}, see if the {@link AnnotationProvider} contains
+     * the annotation the worker handles. If so, let the worker inspect the data in that annotation
+     * to create {@link Validator}s.
+     * 
+     * @return the list of validators. If none, it will return null.
+     */
+    public List<? extends Validator> buildValidators(Class propertyType,
+            AnnotationProvider annotationProvider)
+    {
+        List<Validator> result = CollectionFactory.newList();
+        for (ValidateAnnotationWorker worker : _annotationWorkers)
+        {
+            Annotation annotation = annotationProvider.getAnnotation(worker.getAnnotationClass());
+            if (annotation != null)
+                worker.addValidators(annotation, result);
+        }
+        return result;
+    }
+
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/AnnotationValidatorGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/LengthRangeValidateAnnotationWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/LengthRangeValidateAnnotationWorker.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/LengthRangeValidateAnnotationWorker.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/LengthRangeValidateAnnotationWorker.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,44 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.beaneditor;
+
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+import org.apache.tapestry.Validator;
+import org.apache.tapestry.beaneditor.LengthRange;
+import org.apache.tapestry.validator.MaxLength;
+import org.apache.tapestry.validator.MinLength;
+
+/**
+ * An {@link org.apache.tapestry.internal.beaneditor.ValidateAnnotationWorker} that handles the
+ * {@link org.apache.tapestry.beaneditor.LengthRange} annotation.
+ */
+public class LengthRangeValidateAnnotationWorker implements ValidateAnnotationWorker
+{
+
+    public Class<? extends Annotation> getAnnotationClass()
+    {
+        return LengthRange.class;
+    }
+
+    public void addValidators(Annotation annotation, List<? super Validator> result)
+    {
+        LengthRange lengthRange = (LengthRange) annotation;
+        result.add(new MinLength(lengthRange.minLength()));
+        result.add(new MaxLength(lengthRange.maxLength()));
+    }
+
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/LengthRangeValidateAnnotationWorker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/MaxValidateAnnotationWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/MaxValidateAnnotationWorker.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/MaxValidateAnnotationWorker.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/MaxValidateAnnotationWorker.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,42 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.beaneditor;
+
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+import org.apache.tapestry.Validator;
+import org.apache.tapestry.beaneditor.Max;
+
+/**
+ * An {@link org.apache.tapestry.internal.beaneditor.ValidateAnnotationWorker} that handles the
+ * {@link org.apache.tapestry.beaneditor.Max} annotation.
+ */
+public class MaxValidateAnnotationWorker implements ValidateAnnotationWorker
+{
+
+    public Class<? extends Annotation> getAnnotationClass()
+    {
+        return Max.class;
+    }
+
+    public void addValidators(Annotation annotation, List<? super Validator> result)
+    {
+        Max max = (Max) annotation;
+        result.add(new org.apache.tapestry.validator.Max(max.value()));
+
+    }
+
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/MaxValidateAnnotationWorker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/MinValidateAnnotationWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/MinValidateAnnotationWorker.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/MinValidateAnnotationWorker.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/MinValidateAnnotationWorker.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,42 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.beaneditor;
+
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+import org.apache.tapestry.Validator;
+import org.apache.tapestry.beaneditor.Min;
+
+/**
+ * An {@link org.apache.tapestry.internal.beaneditor.ValidateAnnotationWorker} that handles the
+ * {@link org.apache.tapestry.beaneditor.Min} annotation.
+ */
+public class MinValidateAnnotationWorker implements ValidateAnnotationWorker
+{
+
+    public Class<? extends Annotation> getAnnotationClass()
+    {
+        return Min.class;
+    }
+
+    public void addValidators(Annotation annotation, List<? super Validator> result)
+    {
+        Min min = (Min) annotation;
+        result.add(new org.apache.tapestry.validator.Min(min.value()));
+
+    }
+
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/MinValidateAnnotationWorker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/PrimitiveFieldValidatorGenerator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/PrimitiveFieldValidatorGenerator.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/PrimitiveFieldValidatorGenerator.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/PrimitiveFieldValidatorGenerator.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,40 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.beaneditor;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.tapestry.AnnotationProvider;
+import org.apache.tapestry.Validator;
+import org.apache.tapestry.services.ValidatorGenerator;
+import org.apache.tapestry.validator.Required;
+
+/**
+ * A {@link org.apache.tapestry.services.ValidatorGenerator} that creates a
+ * {@link org.apache.tapestry.validator.Required} validator for the property if its type is a
+ * primitive (not a wrapper or reference) type.
+ */
+public class PrimitiveFieldValidatorGenerator implements ValidatorGenerator
+{
+    private final List<? extends Validator> REQUIRED = Arrays.asList(new Required());
+
+    public List<? extends Validator> buildValidators(Class propertyType,
+            AnnotationProvider annotationProvider)
+    {
+        return propertyType.isPrimitive() ? REQUIRED : null;
+    }
+
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/PrimitiveFieldValidatorGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/RequiredValidateAnnotationWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/RequiredValidateAnnotationWorker.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/RequiredValidateAnnotationWorker.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/RequiredValidateAnnotationWorker.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,41 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.beaneditor;
+
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+import org.apache.tapestry.Validator;
+import org.apache.tapestry.beaneditor.Required;
+
+/**
+ * An {@link org.apache.tapestry.internal.beaneditor.ValidateAnnotationWorker} that handles the
+ * {@link org.apache.tapestry.beaneditor.Required} annotation.
+ */
+public class RequiredValidateAnnotationWorker implements ValidateAnnotationWorker
+{
+
+    public Class<? extends Annotation> getAnnotationClass()
+    {
+        return Required.class;
+    }
+
+    public void addValidators(Annotation annotation, List<? super Validator> result)
+    {
+        result.add(new org.apache.tapestry.validator.Required());
+        
+    }
+
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/RequiredValidateAnnotationWorker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/ValidateAnnotationWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/ValidateAnnotationWorker.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/ValidateAnnotationWorker.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/ValidateAnnotationWorker.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,42 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.beaneditor;
+
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+import org.apache.tapestry.Validator;
+
+/**
+ * It handles a particular validate annotation and can create {@link org.apache.tapestry.Validator}'s
+ * according to the annotation instance.
+ */
+public interface ValidateAnnotationWorker
+{
+    /**
+     * @return the annotation class that it can handle
+     */
+    Class<? extends Annotation> getAnnotationClass();
+
+    /**
+     * Creates validators from the data in the given annotation instance and store them into the
+     * list.
+     * 
+     * @param annotation
+     * @param validators
+     */
+    void addValidators(Annotation annotation, List<? super Validator> validators);
+
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/beaneditor/ValidateAnnotationWorker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/CompoundalidatorGenerator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/CompoundalidatorGenerator.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/CompoundalidatorGenerator.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/CompoundalidatorGenerator.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,62 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.services;
+
+import static org.apache.tapestry.ioc.internal.util.Defense.notNull;
+
+import java.util.List;
+
+import org.apache.tapestry.AnnotationProvider;
+import org.apache.tapestry.Validator;
+import org.apache.tapestry.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry.services.ValidatorGenerator;
+
+/**
+ * A {@link org.apache.tapestry.services.ValidatorGenerator} that combines the results from on other
+ * {@link org.apache.tapestry.services.ValidatorGenerator}'s.
+ */
+public class CompoundalidatorGenerator implements ValidatorGenerator
+{
+    private final List<ValidatorGenerator> _configuration;
+
+    public CompoundalidatorGenerator(final List<ValidatorGenerator> configuration)
+    {
+        _configuration = configuration;
+    }
+
+    public List<? extends Validator> buildValidators(Class propertyType,
+            AnnotationProvider annotationProvider)
+    {
+        notNull(propertyType, "propertyType");
+        notNull(annotationProvider, "annotationProvider");
+
+        List<Validator> result = CollectionFactory.newList();
+
+        for (ValidatorGenerator g : _configuration)
+        {
+            List<? extends Validator> validators = g.buildValidators(
+                    propertyType,
+                    annotationProvider);
+
+            if (validators != null)
+                result.addAll(validators);
+        }
+
+        // TODO: How to handle duplicate or conflicting constraints from different generators?
+
+        return result.isEmpty() ? null : result;
+    }
+
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/CompoundalidatorGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorImpl.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorImpl.java Mon Feb  5 09:15:39 2007
@@ -20,35 +20,33 @@
 import org.apache.tapestry.Validator;
 import org.apache.tapestry.ioc.MessageFormatter;
 
-public class FieldValidatorImpl implements FieldValidator
+public class FieldValidatorImpl<T> implements FieldValidator<T>
 {
     private final Field _field;
 
-    private final Object _constraintValue;
+    private final Validator<? super T>[] _validators;
 
-    private final MessageFormatter _messageFormatter;
+    private FieldValidatorMessages _fieldValidatorMessages;
 
-    private final Validator _validator;
-
-    public FieldValidatorImpl(Field field, Object constraintValue,
-            MessageFormatter messageFormatter, Validator validator)
+    public FieldValidatorImpl(Field field, FieldValidatorMessages fieldValidatorMessages,
+            Validator<? super T>... validators)
     {
         _field = field;
-        _constraintValue = constraintValue;
-        _messageFormatter = messageFormatter;
-        _validator = validator;
+        _fieldValidatorMessages = fieldValidatorMessages;
+        _validators = validators;
     }
 
-    @SuppressWarnings("unchecked")
-    public void validate(Object value) throws ValidationException
+    public void validate(T value) throws ValidationException
     {
-        if (! _validator.invokeIfBlank() && isBlank(value))
-            return;
-
-        if (value != null && !_validator.getValueType().isInstance(value))
+        if (_validators == null)
             return;
-
-        _validator.validate(_field, _constraintValue, _messageFormatter, value);
+        for (Validator<? super T> validator : _validators)
+        {
+            if (!validator.invokeIfBlank() && isBlank(value))
+                return;
+            MessageFormatter messageFormatter = _fieldValidatorMessages.get(_field, validator);
+            validator.validate(_field, messageFormatter, value);
+        }
     }
 
     private boolean isBlank(Object value)

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorMessages.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorMessages.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorMessages.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorMessages.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,29 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.services;
+
+import org.apache.tapestry.Field;
+import org.apache.tapestry.Validator;
+import org.apache.tapestry.ioc.MessageFormatter;
+
+/**
+ * Given a {@link org.apache.tapestry.Field} and a {@link org.apache.tapestry.Validator}, return a
+ * {@link org.apache.tapestry.ioc.MessageFormatter} to be used by the Validator to output error
+ * messages.
+ */
+public interface FieldValidatorMessages
+{
+    MessageFormatter get(Field field, Validator validator);
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorMessages.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorMessagesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorMessagesImpl.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorMessagesImpl.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorMessagesImpl.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,62 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.services;
+
+import static org.apache.tapestry.ioc.internal.util.Defense.cast;
+
+import java.util.Locale;
+
+import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.Field;
+import org.apache.tapestry.Validator;
+import org.apache.tapestry.ioc.MessageFormatter;
+import org.apache.tapestry.ioc.Messages;
+import org.apache.tapestry.runtime.Component;
+import org.apache.tapestry.services.ValidationMessagesSource;
+
+/**
+ * A {@link org.apache.tapestry.internal.services.FieldValidatorMessages} that uses the message key
+ * of the {@link org.apache.tapestry.Validator} to look up a global
+ * {@link org.apache.tapestry.services.ValidationMessagesSource}. It will also uses
+ * <em>componentId</em>-<em>messageKey</em> to look up the messages of the container of the
+ * given field.
+ */
+public class FieldValidatorMessagesImpl implements FieldValidatorMessages
+{
+    private ValidationMessagesSource _messagesSource;
+
+    public FieldValidatorMessagesImpl(ValidationMessagesSource messagesSource)
+    {
+        _messagesSource = messagesSource;
+    }
+
+    public MessageFormatter get(Field field, Validator validator)
+    {
+        Component component = cast(field, Component.class, "field");
+        ComponentResources componentResources = component.getComponentResources();
+        String overrideId = componentResources.getId();
+        Locale locale = componentResources.getLocale();
+        Messages overrideMessages = componentResources.getContainerMessages();
+        String key = validator.getMessageKey();
+        String overrideKey = overrideId + "-" + key;
+
+        if (overrideMessages.contains(overrideKey))
+            return overrideMessages.getFormatter(overrideKey);
+
+        Messages messages = _messagesSource.getValidationMessages(locale);
+        return messages.getFormatter(key);
+    }
+
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FieldValidatorMessagesImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FormPersistWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FormPersistWorker.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FormPersistWorker.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FormPersistWorker.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,55 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.services;
+
+import java.lang.reflect.Modifier;
+import java.util.List;
+
+import org.apache.tapestry.annotations.FormPersist;
+import org.apache.tapestry.ioc.internal.util.InternalUtils;
+import org.apache.tapestry.model.MutableComponentModel;
+import org.apache.tapestry.services.ClassTransformation;
+import org.apache.tapestry.services.ComponentClassTransformWorker;
+import org.apache.tapestry.services.MethodSignature;
+
+/**
+ * Identifies fields with the {@link org.apache.tapestry.annotations.FormPersist} annotation, and
+ * implements the
+ * {@link org.apache.tapestry.corelib.base.AbstractField#collectFormPersistPropNames()} method
+ * to add the names of such fields.
+ */
+public final class FormPersistWorker implements ComponentClassTransformWorker
+{
+    /**
+     * Identifies fields with the {@link org.apache.tapestry.annotations.FormPersist} annotation,
+     * and implements the
+     * {@link org.apache.tapestry.corelib.base.AbstractField#collectFormPersistPropNames()}
+     * method to add the names of such fields.
+     */
+    public void transform(ClassTransformation transformation, MutableComponentModel model)
+    {
+        List<String> fieldNames = transformation.findFieldsWithAnnotation(FormPersist.class);
+        if (fieldNames.isEmpty())
+            return;
+        String body = "";
+        for (String fieldName : fieldNames)
+        {
+            body += String.format("$1.add(\"%s\");", InternalUtils.stripMemberPrefix(fieldName));
+        }
+        transformation.extendMethod(new MethodSignature(Modifier.PROTECTED, "void",
+                "collectFormPersistPropNames", new String[]
+                { List.class.getName() }, null), body);
+    }
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/FormPersistWorker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java Mon Feb  5 09:15:39 2007
@@ -786,6 +786,12 @@
 
     public List<String> findFieldsWithAnnotation(final Class<? extends Annotation> annotationClass)
     {
+        return findFieldsWithAnnotation(annotationClass, false);
+    }
+
+    public List<String> findFieldsWithAnnotation(final Class<? extends Annotation> annotationClass,
+            boolean searchAncestors)
+    {
         FieldFilter filter = new FieldFilter()
         {
             public boolean accept(String fieldName, String fieldType)
@@ -824,7 +830,6 @@
         {
             throw new RuntimeException(ex);
         }
-
         Collections.sort(result);
 
         return result;

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java Mon Feb  5 09:15:39 2007
@@ -18,6 +18,7 @@
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
 import static org.apache.tapestry.ioc.internal.util.Defense.notBlank;
 
+import java.lang.reflect.Method;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
@@ -981,7 +982,35 @@
 
         _page.incrementDirtyCount();
 
+        configure();
+
         queue.push(_setupRender);
+    }
+
+    /**
+     * Call the configure&lt;component-id&gt;() method in the container (if any) to configure this
+     * component.
+     */
+    private void configure()
+    {
+        if (_container == null)
+            return;
+        Object container = _container.getComponent();
+        try
+        {
+            Method method = container.getClass().getMethod(
+                    "configure" + InternalUtils.capitalize(_id));
+            method.invoke(container);
+        }
+        catch (NoSuchMethodException ex)
+        {
+
+        }
+        catch (Exception ex)
+        {
+            throw new RuntimeException(ex);
+        }
+
     }
 
     @Override

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/services/TapestryModule.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/services/TapestryModule.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/services/TapestryModule.java Mon Feb  5 09:15:39 2007
@@ -30,7 +30,6 @@
 import org.apache.tapestry.MarkupWriter;
 import org.apache.tapestry.SelectModel;
 import org.apache.tapestry.Translator;
-import org.apache.tapestry.Validator;
 import org.apache.tapestry.annotations.AfterRender;
 import org.apache.tapestry.annotations.AfterRenderBody;
 import org.apache.tapestry.annotations.AfterRenderTemplate;
@@ -40,18 +39,21 @@
 import org.apache.tapestry.annotations.CleanupRender;
 import org.apache.tapestry.annotations.InjectPage;
 import org.apache.tapestry.annotations.SetupRender;
-import org.apache.tapestry.beaneditor.Validate;
 import org.apache.tapestry.dom.DefaultMarkupModel;
 import org.apache.tapestry.dom.Document;
 import org.apache.tapestry.internal.InternalConstants;
 import org.apache.tapestry.internal.TapestryUtils;
-import org.apache.tapestry.internal.beaneditor.PrimitiveFieldConstraintGenerator;
-import org.apache.tapestry.internal.beaneditor.ValidateAnnotationConstraintGenerator;
+import org.apache.tapestry.internal.beaneditor.AnnotationValidatorGenerator;
+import org.apache.tapestry.internal.beaneditor.LengthRangeValidateAnnotationWorker;
+import org.apache.tapestry.internal.beaneditor.MaxValidateAnnotationWorker;
+import org.apache.tapestry.internal.beaneditor.MinValidateAnnotationWorker;
+import org.apache.tapestry.internal.beaneditor.PrimitiveFieldValidatorGenerator;
+import org.apache.tapestry.internal.beaneditor.RequiredValidateAnnotationWorker;
+import org.apache.tapestry.internal.beaneditor.ValidateAnnotationWorker;
 import org.apache.tapestry.internal.bindings.ComponentBindingFactory;
 import org.apache.tapestry.internal.bindings.LiteralBindingFactory;
 import org.apache.tapestry.internal.bindings.MessageBindingFactory;
 import org.apache.tapestry.internal.bindings.TranslateBindingFactory;
-import org.apache.tapestry.internal.bindings.ValidateBindingFactory;
 import org.apache.tapestry.internal.services.ActionLinkHandler;
 import org.apache.tapestry.internal.services.ActionLinkHandlerImpl;
 import org.apache.tapestry.internal.services.ApplicationGlobalsImpl;
@@ -80,13 +82,14 @@
 import org.apache.tapestry.internal.services.CookieSink;
 import org.apache.tapestry.internal.services.CookieSource;
 import org.apache.tapestry.internal.services.CookiesImpl;
-import org.apache.tapestry.internal.services.FieldValidatorDefaultSourceImpl;
 import org.apache.tapestry.internal.services.DefaultInjectionProvider;
 import org.apache.tapestry.internal.services.DefaultValidationDelegateCommand;
 import org.apache.tapestry.internal.services.EnvironmentImpl;
 import org.apache.tapestry.internal.services.EnvironmentalWorker;
-import org.apache.tapestry.internal.services.FieldValidatorSourceImpl;
+import org.apache.tapestry.internal.services.FieldValidatorMessages;
+import org.apache.tapestry.internal.services.FieldValidatorMessagesImpl;
 import org.apache.tapestry.internal.services.FlashPersistentFieldStrategy;
+import org.apache.tapestry.internal.services.FormPersistWorker;
 import org.apache.tapestry.internal.services.HeartbeatImpl;
 import org.apache.tapestry.internal.services.InfrastructureImpl;
 import org.apache.tapestry.internal.services.InfrastructureManagerImpl;
@@ -133,8 +136,8 @@
 import org.apache.tapestry.internal.services.TranslatorSourceImpl;
 import org.apache.tapestry.internal.services.UnclaimedFieldWorker;
 import org.apache.tapestry.internal.services.UpdateListenerHub;
-import org.apache.tapestry.internal.services.ValidationConstraintGeneratorImpl;
 import org.apache.tapestry.internal.services.ValidationMessagesSourceImpl;
+import org.apache.tapestry.internal.services.CompoundalidatorGenerator;
 import org.apache.tapestry.ioc.Configuration;
 import org.apache.tapestry.ioc.IOCUtilities;
 import org.apache.tapestry.ioc.MappedConfiguration;
@@ -166,11 +169,6 @@
 import org.apache.tapestry.translator.IntegerTranslator;
 import org.apache.tapestry.translator.LongTranslator;
 import org.apache.tapestry.translator.StringTranslator;
-import org.apache.tapestry.validator.Max;
-import org.apache.tapestry.validator.MaxLength;
-import org.apache.tapestry.validator.Min;
-import org.apache.tapestry.validator.MinLength;
-import org.apache.tapestry.validator.Required;
 
 /**
  * The root module for Tapestry.
@@ -471,7 +469,8 @@
      */
     public static void contributeInfrastructure(
             Configuration<InfrastructureContribution> configuration, ServiceLocator locator,
-            @InjectService("tapestry.ioc.TypeCoercer")
+            @InjectService("ValidatorGenerator")
+            ValidatorGenerator validatorGenerator, @InjectService("tapestry.ioc.TypeCoercer")
             TypeCoercer typeCoercer, @InjectService("tapestry.ioc.PropertyAccess")
             PropertyAccess propertyAccess)
 
@@ -491,8 +490,6 @@
                 ComponentMessagesSource.class,
                 ComponentSource.class,
                 Environment.class,
-                FieldValidatorDefaultSource.class,
-                FieldValidatorSource.class,
                 MarkupWriterFactory.class,
                 PersistentFieldManager.class,
                 Request.class,
@@ -501,9 +498,10 @@
                 Response.class,
                 TranslatorDefaultSource.class,
                 TranslatorSource.class,
-                ValidationConstraintGenerator.class,
-                ValidationMessagesSource.class);
+                ValidationMessagesSource.class,
+                FieldValidatorMessages.class);
 
+        configuration.add(new InfrastructureContribution("ValidatorGenerator", validatorGenerator));
         configuration.add(new InfrastructureContribution("TypeCoercer", typeCoercer));
         configuration.add(new InfrastructureContribution("PropertyAccess", propertyAccess));
     }
@@ -590,15 +588,13 @@
     public static void contributeBindingSource(
             MappedConfiguration<String, BindingFactory> configuration,
             @InjectService("tapestry.internal.PropBindingFactory")
-            BindingFactory propBindingFactory, @Inject("infrastructure:FieldValidatorSource")
-            FieldValidatorSource fieldValidatorSource, @Inject("infrastructure:TranslatorSource")
+            BindingFactory propBindingFactory, @Inject("infrastructure:TranslatorSource")
             TranslatorSource translatorSource)
     {
         configuration.add(InternalConstants.LITERAL_BINDING_PREFIX, new LiteralBindingFactory());
         configuration.add(InternalConstants.PROP_BINDING_PREFIX, propBindingFactory);
         configuration.add("component", new ComponentBindingFactory());
         configuration.add("message", new MessageBindingFactory());
-        configuration.add("validate", new ValidateBindingFactory(fieldValidatorSource));
         configuration.add("translate", new TranslateBindingFactory(translatorSource));
     }
 
@@ -741,6 +737,7 @@
 
         configuration.add("Retain", new RetainWorker());
         configuration.add("Persist", new PersistWorker());
+        configuration.add("RestoreOnSubmit", new FormPersistWorker());
         configuration.add("UnclaimedField", new UnclaimedFieldWorker(), "after:*.*");
     }
 
@@ -927,32 +924,11 @@
         configuration.add("tapestry/", "org/apache/tapestry/");
     }
 
-    public static FieldValidatorSource buildFieldValidatorSource(
+    public static FieldValidatorMessages buildFieldValidatorMessages(
             @Inject("infrastructure:ValidationMessagesSource")
-            ValidationMessagesSource messagesSource, @Inject("infrastructure:TypeCoercer")
-            TypeCoercer typeCoercer, Map<String, Validator> configuration)
+            ValidationMessagesSource messagesSource)
     {
-        return new FieldValidatorSourceImpl(messagesSource, typeCoercer, configuration);
-    }
-
-    /**
-     * Contributes the basic set of validators:
-     * <ul>
-     * <li>required</li>
-     * <li>minlength</li>
-     * <li>maxlength</li>
-     * <li>min</li>
-     * <li>max</li>
-     * </ul>
-     */
-    public static void contributeFieldValidatorSource(
-            MappedConfiguration<String, Validator> configuration)
-    {
-        configuration.add("required", new Required());
-        configuration.add("minlength", new MinLength());
-        configuration.add("maxlength", new MaxLength());
-        configuration.add("min", new Min());
-        configuration.add("max", new Max());
+        return new FieldValidatorMessagesImpl(messagesSource);
     }
 
     public static TranslatorSource buildTranslatorSource(Map<String, Translator> configuration)
@@ -1171,33 +1147,40 @@
         configuration.add(Boolean.class, "checkbox");
     }
 
-    public static ValidationConstraintGenerator buildValidationConstraintGenerator(
-            List<ValidationConstraintGenerator> configuration)
+    public static ValidatorGenerator buildValidatorGenerator(List<ValidatorGenerator> configuration)
     {
-        return new ValidationConstraintGeneratorImpl(configuration);
+        return new CompoundalidatorGenerator(configuration);
     }
 
     /**
-     * Adds built-in constraint generators:
+     * Adds built-in validator generators:
      * <ul>
      * <li>PrimtiveField -- primitive fields are always required
-     * <li>ValidateAnnotation -- adds constraints from a {@link Validate} annotation
+     * <li>Annotation -- adds constraints from a various annotations
      * </ul>
      */
-    public static void contributeValidationConstraintGenerator(
-            OrderedConfiguration<ValidationConstraintGenerator> configuration)
+    public static void contributeValidatorGenerator(
+            OrderedConfiguration<ValidatorGenerator> configuration,
+            @InjectService("AnnotationValidatorGenerator")
+            ValidatorGenerator annotationValidatorGenerator)
     {
-        configuration.add("PrimitiveField", new PrimitiveFieldConstraintGenerator());
-        configuration.add("ValidateAnnotation", new ValidateAnnotationConstraintGenerator());
+        configuration.add("PrimitiveField", new PrimitiveFieldValidatorGenerator());
+        configuration.add("Annotation", annotationValidatorGenerator);
     }
 
-    public static FieldValidatorDefaultSource buildFieldValidatorDefaultSource(
-            @Inject("infrastructure:ValidationConstraintGenerator")
-            ValidationConstraintGenerator validationConstraintGenerator,
-            @Inject("infrastructure:FieldValidatorSource")
-            FieldValidatorSource fieldValidatorSource)
+    public static ValidatorGenerator buildAnnotationValidatorGenerator(
+            List<ValidateAnnotationWorker> configuration)
     {
-        return new FieldValidatorDefaultSourceImpl(validationConstraintGenerator,
-                fieldValidatorSource);
+        return new AnnotationValidatorGenerator(configuration);
     }
+
+    public static void contributeAnnotationValidatorGenerator(
+            OrderedConfiguration<ValidateAnnotationWorker> configuration)
+    {
+        configuration.add("required", new RequiredValidateAnnotationWorker());
+        configuration.add("min", new MinValidateAnnotationWorker());
+        configuration.add("max", new MaxValidateAnnotationWorker());
+        configuration.add("lengthRange", new LengthRangeValidateAnnotationWorker());
+    }
+
 }

Added: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/services/ValidatorGenerator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/services/ValidatorGenerator.java?view=auto&rev=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/services/ValidatorGenerator.java (added)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/services/ValidatorGenerator.java Mon Feb  5 09:15:39 2007
@@ -0,0 +1,41 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.services;
+
+import java.util.List;
+
+import org.apache.tapestry.AnnotationProvider;
+import org.apache.tapestry.Validator;
+
+/**
+ * Invoked to generate a list of {@link org.apache.tapestry.Validator} for a property. This
+ * typically involves scanning the property for annotations or naming conventions that confer the
+ * desired validation.
+ */
+public interface ValidatorGenerator
+{
+    /**
+     * For a given property, identify all the approprite validators. Each returned value is a
+     * {@link Validator} (i.e., {@link org.apache.tapestry.validator.Required}).
+     * 
+     * @param propertyType
+     *            the type of the property for which validators are needed
+     * @param annotationProvider
+     *            provides access to any annotations conceerning the property
+     * @return a list of validators
+     */
+    List<? extends Validator> buildValidators(Class propertyType,
+            AnnotationProvider annotationProvider);
+}

Propchange: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/services/ValidatorGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/test/TapestryTestCase.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/test/TapestryTestCase.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/test/TapestryTestCase.java Mon Feb  5 09:15:39 2007
@@ -72,7 +72,6 @@
 import org.apache.tapestry.services.ComponentClassResolver;
 import org.apache.tapestry.services.Context;
 import org.apache.tapestry.services.Environment;
-import org.apache.tapestry.services.FieldValidatorSource;
 import org.apache.tapestry.services.Heartbeat;
 import org.apache.tapestry.services.InjectionProvider;
 import org.apache.tapestry.services.MethodFilter;
@@ -82,7 +81,6 @@
 import org.apache.tapestry.services.ResourceDigestGenerator;
 import org.apache.tapestry.services.Response;
 import org.apache.tapestry.services.Session;
-import org.apache.tapestry.services.ValidationConstraintGenerator;
 import org.apache.tapestry.services.ValidationMessagesSource;
 import org.easymock.EasyMock;
 import org.easymock.IAnswer;
@@ -532,11 +530,6 @@
         expect(resources.getLocale()).andReturn(locale).atLeastOnce();
     }
 
-    protected <C, T> void train_getConstraintType(Validator<C, T> validator, Class<C> constraintType)
-    {
-        expect(validator.getConstraintType()).andReturn(constraintType);
-    }
-
     protected final Validator newValidator()
     {
         return newMock(Validator.class);
@@ -552,11 +545,6 @@
         return newMock(FieldValidator.class);
     }
 
-    protected FieldValidatorSource newFieldValidatorSource()
-    {
-        return newMock(FieldValidatorSource.class);
-    }
-
     protected final Component newComponent()
     {
         return newMock(Component.class);
@@ -717,11 +705,6 @@
         expect(resources.getMessages()).andReturn(messages).atLeastOnce();
     }
 
-    protected final void train_getValueType(Validator validator, Class valueType)
-    {
-        expect(validator.getValueType()).andReturn(valueType).atLeastOnce();
-    }
-
     protected final void train_invokeIfBlank(Validator validator, boolean invokeIfBlank)
     {
         expect(validator.invokeIfBlank()).andReturn(invokeIfBlank).atLeastOnce();
@@ -801,26 +784,4 @@
         return newMock(AnnotationProvider.class);
     }
 
-    protected final void train_createValidator(FieldValidatorSource source, Field field, String validatorType, String constraintValue, String overrideId, Messages overrideMessages, Locale locale, FieldValidator result)
-    {
-        expect(
-                source.createValidator(
-                        field,
-                        validatorType,
-                        constraintValue,
-                        overrideId,
-                        overrideMessages,
-                        locale)).andReturn(result);
-    }
-
-    protected final void train_buildConstraints(ValidationConstraintGenerator generator, Class propertyType, AnnotationProvider provider, String... constraints)
-    {
-        expect(generator.buildConstraints(propertyType, provider)).andReturn(
-                Arrays.asList(constraints));
-    }
-
-    protected final ValidationConstraintGenerator newValidationConstraintGenerator()
-    {
-        return newMock(ValidationConstraintGenerator.class);
-    }
 }

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/DoubleTranslator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/DoubleTranslator.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/DoubleTranslator.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/DoubleTranslator.java Mon Feb  5 09:15:39 2007
@@ -14,13 +14,17 @@
 
 package org.apache.tapestry.translator;
 
+import java.io.Serializable;
+
 import org.apache.tapestry.Translator;
 import org.apache.tapestry.ValidationException;
 import org.apache.tapestry.ioc.Messages;
 import org.apache.tapestry.ioc.internal.util.InternalUtils;
 
-public class DoubleTranslator implements Translator<Double>
+public class DoubleTranslator implements Translator<Double>, Serializable
 {
+    private static final long serialVersionUID = 1L;
+
     /**
      * Parses blank values to null, otherwise parses the client value to a long
      * 

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/IntegerTranslator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/IntegerTranslator.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/IntegerTranslator.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/IntegerTranslator.java Mon Feb  5 09:15:39 2007
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.translator;
 
+import java.io.Serializable;
+
 import org.apache.tapestry.Translator;
 import org.apache.tapestry.ValidationException;
 import org.apache.tapestry.ioc.Messages;
@@ -22,8 +24,10 @@
 /**
  * A translator for type integer.
  */
-public final class IntegerTranslator implements Translator<Integer>
+public final class IntegerTranslator implements Translator<Integer>, Serializable
 {
+    private static final long serialVersionUID = 1L;
+
     /**
      * Parses blank values to null, otherwise parses the client value to an integer.
      * 

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/LongTranslator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/LongTranslator.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/LongTranslator.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/LongTranslator.java Mon Feb  5 09:15:39 2007
@@ -14,14 +14,18 @@
 
 package org.apache.tapestry.translator;
 
+import java.io.Serializable;
+
 import org.apache.tapestry.Translator;
 import org.apache.tapestry.ValidationException;
 import org.apache.tapestry.ioc.Messages;
 import org.apache.tapestry.ioc.internal.util.InternalUtils;
 
 /** A translator for type long. */
-public class LongTranslator implements Translator<Long>
+public class LongTranslator implements Translator<Long>, Serializable
 {
+    private static final long serialVersionUID = 1L;
+
     /**
      * Parses blank values to null, otherwise parses the client value to a long
      * 

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/StringTranslator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/StringTranslator.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/StringTranslator.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/translator/StringTranslator.java Mon Feb  5 09:15:39 2007
@@ -14,12 +14,16 @@
 
 package org.apache.tapestry.translator;
 
+import java.io.Serializable;
+
 import org.apache.tapestry.Translator;
 import org.apache.tapestry.ValidationException;
 import org.apache.tapestry.ioc.Messages;
 
-public class StringTranslator implements Translator<String>
+public class StringTranslator implements Translator<String>, Serializable
 {
+    private static final long serialVersionUID = 1L;
+
     /** Returns the client value (or the empty string, if the client value is null). */
     public String parseClient(String clientValue, Messages messages) throws ValidationException
     {

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/validator/Max.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/validator/Max.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/validator/Max.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/validator/Max.java Mon Feb  5 09:15:39 2007
@@ -14,17 +14,23 @@
 
 package org.apache.tapestry.validator;
 
+import java.io.Serializable;
+
 import org.apache.tapestry.Field;
 import org.apache.tapestry.ValidationException;
 import org.apache.tapestry.Validator;
 import org.apache.tapestry.ioc.MessageFormatter;
 
 /** Enforces a maximum integer value. */
-public class Max implements Validator<Long, Number>
+public class Max implements Validator<Number>, Serializable
 {
-    public Class<Long> getConstraintType()
+    private static final long serialVersionUID = 1L;
+
+    private long _max;
+    
+    public Max(long max)
     {
-        return Long.class;
+        _max = max;
     }
 
     public String getMessageKey()
@@ -32,20 +38,15 @@
         return "max-integer";
     }
 
-    public Class<Number> getValueType()
-    {
-        return Number.class;
-    }
-
     public boolean invokeIfBlank()
     {
         return false;
     }
 
-    public void validate(Field field, Long constraintValue, MessageFormatter formatter, Number value)
+    public void validate(Field field, MessageFormatter formatter, Number value)
             throws ValidationException
     {
-        if (value.longValue() > constraintValue)
-            throw new ValidationException(formatter.format(constraintValue, field.getLabel()));
+        if (value.longValue() > _max)
+            throw new ValidationException(formatter.format(_max, field.getLabel()));
     }
 }

Modified: tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/validator/MaxLength.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/validator/MaxLength.java?view=diff&rev=503777&r1=503776&r2=503777
==============================================================================
--- tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/validator/MaxLength.java (original)
+++ tapestry/tapestry5/tapestry-core/branches/kt-20070205-IDE-support/src/main/java/org/apache/tapestry/validator/MaxLength.java Mon Feb  5 09:15:39 2007
@@ -14,16 +14,22 @@
 
 package org.apache.tapestry.validator;
 
+import java.io.Serializable;
+
 import org.apache.tapestry.Field;
 import org.apache.tapestry.ValidationException;
 import org.apache.tapestry.Validator;
 import org.apache.tapestry.ioc.MessageFormatter;
 
-public final class MaxLength implements Validator<Integer, String>
+public final class MaxLength implements Validator<String>, Serializable
 {
-    public Class<Integer> getConstraintType()
+    private static final long serialVersionUID = 1L;
+
+    private int _maxLength;
+
+    public MaxLength(int maxLength)
     {
-        return Integer.class;
+        _maxLength = maxLength;
     }
 
     public String getMessageKey()
@@ -31,20 +37,15 @@
         return "maximum-string-length";
     }
 
-    public Class<String> getValueType()
-    {
-        return String.class;
-    }
-
     public boolean invokeIfBlank()
     {
         return false;
     }
 
-    public void validate(Field field, Integer constraintValue, MessageFormatter formatter, String value)
+    public void validate(Field field, MessageFormatter formatter, String value)
             throws ValidationException
     {
-        if (value.length() > constraintValue)
-            throw new ValidationException(formatter.format(constraintValue, field.getLabel()));
+        if (value.length() > _maxLength)
+            throw new ValidationException(formatter.format(_maxLength, field.getLabel()));
     }
 }