You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by pf...@apache.org on 2005/06/14 02:30:02 UTC

cvs commit: jakarta-tapestry/framework/src/descriptor/META-INF tapestry.form.xml hivemodule.xml

pferraro    2005/06/13 17:30:02

  Modified:    framework/src/java/org/apache/tapestry/form
                        RequirableField.java
               framework/src/test/org/apache/tapestry/form
                        TestRequirableFieldSupportImpl.java
               framework/src/descriptor/META-INF hivemodule.xml
  Added:       framework/src/java/org/apache/tapestry/form
                        ValidatableFieldSupportImpl.java
                        ValidatableFieldSupport.java ValidatableField.java
               framework/src/test/org/apache/tapestry/form
                        TestValidatableFieldSupportImpl.java
               framework/src/descriptor/META-INF tapestry.form.xml
  Log:
  Added ValidatableFieldSupport service and default implementation
  
  Revision  Changes    Path
  1.2       +6 -4      jakarta-tapestry/framework/src/java/org/apache/tapestry/form/RequirableField.java
  
  Index: RequirableField.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/framework/src/java/org/apache/tapestry/form/RequirableField.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- RequirableField.java	6 Jun 2005 20:44:00 -0000	1.1
  +++ RequirableField.java	14 Jun 2005 00:30:01 -0000	1.2
  @@ -20,7 +20,7 @@
   
   /**
    * Implemented by form components that can be marked as required.  The form rewind
  - * will record validation errors a required field for which a value was not submitted.
  + * will record validation errors for required fields for which a value was not submitted.
    * 
    * @author Paul Ferraro
    * @since 4.0
  @@ -43,11 +43,13 @@
       
       /**
        * Called on the field if the required field check succeeds.
  -     * @param writer
  -     * @param cycle
  -     * @throws ValidatorException
  +     * @throws ValidatorException if required field check fails.
        */
       public void bind(IMarkupWriter writer, IRequestCycle cycle) throws ValidatorException;
       
  +    /**
  +     * Retrieves a simplified view of the value submitted for this component.  Used to during
  +     * required field checking.
  +     */
       public String getSubmittedValue(IRequestCycle cycle);
   }
  
  
  
  1.1                  jakarta-tapestry/framework/src/java/org/apache/tapestry/form/ValidatableFieldSupportImpl.java
  
  Index: ValidatableFieldSupportImpl.java
  ===================================================================
  // Copyright 2004, 2005 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.form;
  
  import java.util.Iterator;
  
  import org.apache.tapestry.IMarkupWriter;
  import org.apache.tapestry.IRequestCycle;
  import org.apache.tapestry.coerce.ValueConverter;
  import org.apache.tapestry.form.validator.Validator;
  import org.apache.tapestry.valid.IValidationDelegate;
  import org.apache.tapestry.valid.ValidatorException;
  
  /**
   * Default {@link VadidatableFieldSupport} implementation.  This implementation generates
   * calls to a static javascript function during render if client-side validation is enabled.
   * 
   * @author Paul Ferraro
   * @since 4.0
   */
  public class ValidatableFieldSupportImpl implements ValidatableFieldSupport
  {
      private ValueConverter _converter;
      
      public ValueConverter getValueConverter()
      {
          return _converter;
      }
      
      public void setValueConverter(ValueConverter converter)
      {
          _converter = converter;
      }
      
      protected Iterator getValidatorsIterator(ValidatableField component)
      {
          return (Iterator) _converter.coerceValue(component.getValidators(), Iterator.class);
      }
      
      /**
       * @see org.apache.tapestry.form.ValidatableFieldSupport#render(org.apache.tapestry.form.ValidatableField, org.apache.tapestry.IMarkupWriter, org.apache.tapestry.IRequestCycle)
       */
      public void render(ValidatableField component, IMarkupWriter writer, IRequestCycle cycle)
      {
          IValidationDelegate delegate = component.getForm().getDelegate();
          
          String value = delegate.isInError() ? delegate.getFieldInputValue() : getTranslatedValue(component);
          
          component.render(writer, cycle, value);
      }
      
      /**
       * @see org.apache.tapestry.form.ValidatableFieldSupport#renderContributions(org.apache.tapestry.form.ValidatableField, org.apache.tapestry.IMarkupWriter, org.apache.tapestry.IRequestCycle)
       */
      public void renderContributions(ValidatableField component, IMarkupWriter writer, IRequestCycle cycle)
      {
          if (component.getForm().isClientValidationEnabled())
          {
              component.getTranslator().renderContribution(writer, cycle, component);
              
              Iterator validators = getValidatorsIterator(component);
              
              while (validators.hasNext())
              {
                  Validator validator = (Validator) validators.next();
                  
                  validator.renderContribution(writer, cycle, component);
              }
          }
      }
  
      protected String getTranslatedValue(ValidatableField component)
      {
          Object value = component.readValue();
          
          return (value != null) ? component.getTranslator().format(component, value) : "";
      }
      
      /**
       * @see org.apache.tapestry.form.ValidatableFieldSupport#bind(org.apache.tapestry.form.ValidatableField, org.apache.tapestry.IMarkupWriter, org.apache.tapestry.IRequestCycle, java.lang.String)
       */
      public void bind(ValidatableField component, IMarkupWriter writer, IRequestCycle cycle, String value) throws ValidatorException
      {
          IValidationDelegate delegate = component.getForm().getDelegate();
          
          delegate.recordFieldInputValue(value);
          
          Object object = component.getTranslator().parse(component, value);
  
          component.writeValue(object);
          
          if (object != null)
          {
              Iterator validators = getValidatorsIterator(component);
              
              while (validators.hasNext())
              {
                  Validator validator = (Validator) validators.next();
                  
                  validator.validate(component, object);
              }
          }
      }
  }
  
  
  
  1.1                  jakarta-tapestry/framework/src/java/org/apache/tapestry/form/ValidatableFieldSupport.java
  
  Index: ValidatableFieldSupport.java
  ===================================================================
  // Copyright 2004, 2005 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.form;
  
  import org.apache.tapestry.IMarkupWriter;
  import org.apache.tapestry.IRequestCycle;
  import org.apache.tapestry.valid.ValidatorException;
  
  /**
   * Implements the logic used by {@link RequiredField}s for required field checking on rewind 
   * and generating client-side logic during render.
   * 
   * @author Paul Ferraro
   * @since 4.0
   */
  public interface ValidatableFieldSupport
  {
      /**
       * Called during render of the specified component. Determines form element value used to render element.
       */
      public void render(ValidatableField component, IMarkupWriter writer, IRequestCycle cycle);
  
      /**
       * Called during render of the specified component. Renders any contributions from translator and validators.
       */
      public void renderContributions(ValidatableField component, IMarkupWriter writer, IRequestCycle cycle);
  
      /**
       * Called during rewind of the specified component. Specified value is translated via the component's translator
       * then validated using the component's validators.
       * @throws ValidatorException if translation or validation fails
       */
      public void bind(ValidatableField component, IMarkupWriter writer, IRequestCycle cycle, String value) throws ValidatorException;
  }
  
  
  1.1                  jakarta-tapestry/framework/src/java/org/apache/tapestry/form/ValidatableField.java
  
  Index: ValidatableField.java
  ===================================================================
  // Copyright 2004, 2005 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.form;
  
  import org.apache.tapestry.IMarkupWriter;
  import org.apache.tapestry.IRequestCycle;
  import org.apache.tapestry.form.translator.Translator;
  
  /**
   * Implemented by form components that can need to be translated and validated.  During render
   * the translator is used to translated the value to a string.  During rewind, the submitted
   * value is translated back into an object by the translator and then validated.
   * 
   * @author Paul Ferraro
   * @since 4.0
   */
  public interface ValidatableField extends IFormComponent
  {
      /**
       * Coerced into an Iterator of Validators
       */
      public Object getValidators();
      
      /**
       * The Translator implementation used by this field.
       */
      public Translator getTranslator();
      
      /**
       * Renders this form component using the specified value.
       */
      public void render(IMarkupWriter writer, IRequestCycle cycle, String value);
      
      /**
       * Called during rewind to bind the successfully translated value to the appropriate component parameter.
       */
      public void writeValue(Object value);
      
      /**
       * Called during render to read the parameter that drives the value of is form component.
       */
      public Object readValue();
  }
  
  
  
  1.2       +5 -10     jakarta-tapestry/framework/src/test/org/apache/tapestry/form/TestRequirableFieldSupportImpl.java
  
  Index: TestRequirableFieldSupportImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/framework/src/test/org/apache/tapestry/form/TestRequirableFieldSupportImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TestRequirableFieldSupportImpl.java	6 Jun 2005 20:43:59 -0000	1.1
  +++ TestRequirableFieldSupportImpl.java	14 Jun 2005 00:30:01 -0000	1.2
  @@ -14,14 +14,11 @@
   
   package org.apache.tapestry.form;
   
  -import java.text.MessageFormat;
  -
   import org.apache.tapestry.IForm;
   import org.apache.tapestry.IMarkupWriter;
   import org.apache.tapestry.IRequestCycle;
   import org.apache.tapestry.junit.TapestryTestCase;
   import org.apache.tapestry.valid.IValidationDelegate;
  -import org.apache.tapestry.valid.ValidationConstraint;
   import org.apache.tapestry.valid.ValidatorException;
   import org.easymock.MockControl;
   
  @@ -47,7 +44,7 @@
       private MockControl _formControl = MockControl.createControl(IForm.class);
       private IForm _form = (IForm) _formControl.getMock();
       
  -    private MockControl _delegateControl = MockControl.createControl(IValidationDelegate.class);
  +    private MockControl _delegateControl = MockControl.createNiceControl(IValidationDelegate.class);
       private IValidationDelegate _delegate = (IValidationDelegate) _delegateControl.getMock();
       
       /**
  @@ -59,6 +56,7 @@
           _writerControl.reset();
           _cycleControl.reset();
           _formControl.reset();
  +        _delegateControl.reset();
           
           super.tearDown();
       }
  @@ -69,6 +67,7 @@
           _writerControl.replay();
           _cycleControl.replay();
           _formControl.replay();
  +        _delegateControl.replay();
       }
   
       private void verify()
  @@ -77,6 +76,7 @@
           _writerControl.verify();
           _cycleControl.verify();
           _formControl.verify();
  +        _delegateControl.verify();
       }
       
       public void testNotRequiredRender()
  @@ -181,25 +181,20 @@
           _componentControl.setReturnValue(true);
   
           String pattern = "You must enter a value for {0}.";
  +        String displayName = "Field Name";
           
           _component.getRequiredMessage();
           _componentControl.setReturnValue(pattern);
           
  -        String displayName = "Field Name";
           _component.getDisplayName();
           _componentControl.setReturnValue(displayName);
   
  -        String message = MessageFormat.format(pattern, new Object[] { displayName });
  -        
           _component.getForm();
           _componentControl.setReturnValue(_form);
           
           _form.getDelegate();
           _formControl.setReturnValue(_delegate);
           
  -        _delegate.record(new ValidatorException(message, ValidationConstraint.REQUIRED));
  -        _delegateControl.setVoidCallable();
  -        
           replay();
           
           _support.rewind(_component, _writer, _cycle);
  
  
  
  1.1                  jakarta-tapestry/framework/src/test/org/apache/tapestry/form/TestValidatableFieldSupportImpl.java
  
  Index: TestValidatableFieldSupportImpl.java
  ===================================================================
  // Copyright 2004, 2005 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.form;
  
  import java.util.Collections;
  import java.util.Iterator;
  
  import org.apache.tapestry.IForm;
  import org.apache.tapestry.IMarkupWriter;
  import org.apache.tapestry.IRequestCycle;
  import org.apache.tapestry.coerce.ValueConverter;
  import org.apache.tapestry.form.translator.Translator;
  import org.apache.tapestry.form.validator.Validator;
  import org.apache.tapestry.junit.TapestryTestCase;
  import org.apache.tapestry.valid.IValidationDelegate;
  import org.apache.tapestry.valid.ValidatorException;
  import org.easymock.MockControl;
  
  /**
   * Test case for {@link ValidatableFieldSupportImpl}.
   * 
   * @author Paul Ferraro
   * @since 4.0
   */
  public class TestValidatableFieldSupportImpl extends TapestryTestCase
  {
      private ValidatableFieldSupportImpl _support = new ValidatableFieldSupportImpl();
      
      private MockControl _componentControl = MockControl.createControl(ValidatableField.class);
      private ValidatableField _component = (ValidatableField) _componentControl.getMock();
      
      private MockControl _writerControl = MockControl.createControl(IMarkupWriter.class);
      private IMarkupWriter _writer = (IMarkupWriter) _writerControl.getMock();
  
      private MockControl _cycleControl = MockControl.createControl(IRequestCycle.class);
      private IRequestCycle _cycle = (IRequestCycle) _cycleControl.getMock();
  
      private MockControl _formControl = MockControl.createControl(IForm.class);
      private IForm _form = (IForm) _formControl.getMock();
      
      private MockControl _delegateControl = MockControl.createControl(IValidationDelegate.class);
      private IValidationDelegate _delegate = (IValidationDelegate) _delegateControl.getMock();
      
      private MockControl _translatorControl = MockControl.createControl(Translator.class);
      private Translator _translator = (Translator) _translatorControl.getMock();
      
      private MockControl _validatorControl = MockControl.createControl(Validator.class);
      private Validator _validator = (Validator) _validatorControl.getMock();
      
      private MockControl _valueConverterControl = MockControl.createControl(ValueConverter.class);
      private ValueConverter _valueConverter = (ValueConverter) _valueConverterControl.getMock();
      
      /**
       * @see junit.framework.TestCase#setUp()
       */
      protected void setUp() throws Exception
      {
          _support.setValueConverter(_valueConverter);
      }
  
      /**
       * @see org.apache.hivemind.test.HiveMindTestCase#tearDown()
       */
      protected void tearDown() throws Exception
      {
          _componentControl.reset();
          _writerControl.reset();
          _cycleControl.reset();
          _formControl.reset();
          _delegateControl.reset();
          _translatorControl.reset();
          _validatorControl.reset();
          _valueConverterControl.reset();
          
          super.tearDown();
      }
  
      private void replay()
      {
          _componentControl.replay();
          _writerControl.replay();
          _cycleControl.replay();
          _formControl.replay();
          _delegateControl.replay();
          _translatorControl.replay();
          _validatorControl.replay();
          _valueConverterControl.replay();
      }
  
      private void verify()
      {
          _componentControl.verify();
          _writerControl.verify();
          _cycleControl.verify();
          _formControl.verify();
          _delegateControl.verify();
          _translatorControl.verify();
          _validatorControl.verify();
          _valueConverterControl.verify();
      }
      
      public void testNullRender()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.getDelegate();
          _formControl.setReturnValue(_delegate);
          
          _delegate.isInError();
          _delegateControl.setReturnValue(false);
          
          _component.readValue();
          _componentControl.setReturnValue(null);
          
          _component.render(_writer, _cycle, "");
          _componentControl.setVoidCallable();
          
          replay();
          
          _support.render(_component, _writer, _cycle);
          
          verify();
      }
      
      public void testNotNullRender()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.getDelegate();
          _formControl.setReturnValue(_delegate);
          
          _delegate.isInError();
          _delegateControl.setReturnValue(false);
          
          Object object = new Object();
          
          _component.readValue();
          _componentControl.setReturnValue(object);
          
          _component.getTranslator();
          _componentControl.setReturnValue(_translator);
  
          String value = "some value";
          
          _translator.format(_component, object);
          _translatorControl.setReturnValue(value);
          
          _component.render(_writer, _cycle, value);
          
          replay();
          
          _support.render(_component, _writer, _cycle);
          
          verify();
      }
      
      public void testNotNullInErrorRender()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.getDelegate();
          _formControl.setReturnValue(_delegate);
          
          _delegate.isInError();
          _delegateControl.setReturnValue(true);
          
          String value = "recorded value";
          
          _delegate.getFieldInputValue();
          _delegateControl.setReturnValue(value);
          
          _component.render(_writer, _cycle, value);
          
          replay();
          
          _support.render(_component, _writer, _cycle);
          
          verify();
      }
      
      public void testClientValidationDisabledRenderContributions()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.isClientValidationEnabled();
          _formControl.setReturnValue(false);
          
          replay();
          
          _support.renderContributions(_component, _writer, _cycle);
          
          verify();
      }
      
      public void testClientValidationEnabledNoValidatorsRenderContributions()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.isClientValidationEnabled();
          _formControl.setReturnValue(true);
          
          _component.getTranslator();
          _componentControl.setReturnValue(_translator);
          
          _translator.renderContribution(_writer, _cycle, _component);
          _translatorControl.setVoidCallable();
          
          _component.getValidators();
          _componentControl.setReturnValue(null);
          
          _valueConverter.coerceValue(null, Iterator.class);
          _valueConverterControl.setReturnValue(Collections.EMPTY_LIST.iterator());
          
          replay();
          
          _support.renderContributions(_component, _writer, _cycle);
          
          verify();
      }
      
      public void testClientValidationEnabledValidatorRenderContributions()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.isClientValidationEnabled();
          _formControl.setReturnValue(true);
          
          _component.getTranslator();
          _componentControl.setReturnValue(_translator);
          
          _translator.renderContribution(_writer, _cycle, _component);
          _translatorControl.setVoidCallable();
          
          _component.getValidators();
          _componentControl.setReturnValue(_validator);
          
          _valueConverter.coerceValue(_validator, Iterator.class);
          _valueConverterControl.setReturnValue(Collections.singletonList(_validator).iterator());
          
          _validator.renderContribution(_writer, _cycle, _component);
          _validatorControl.setVoidCallable();
          
          replay();
          
          _support.renderContributions(_component, _writer, _cycle);
          
          verify();
      }
      
      public void testNullBind()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.getDelegate();
          _formControl.setReturnValue(_delegate);
          
          _delegate.recordFieldInputValue("some value");
          
          _component.getTranslator();
          _componentControl.setReturnValue(_translator);
          
          try
          {
              _translator.parse(_component, "some value");
              _translatorControl.setReturnValue(null);
              
              _component.writeValue(null);
              _componentControl.setVoidCallable();
              
              replay();
              
              _support.bind(_component, _writer, _cycle, "some value");
          }
          catch (ValidatorException e)
          {
              unreachable();
          }
          finally
          {
              verify();
          }
      }
      
      public void testNotNullNoValidatorsBind()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.getDelegate();
          _formControl.setReturnValue(_delegate);
          
          _delegate.recordFieldInputValue("some value");
          
          _component.getTranslator();
          _componentControl.setReturnValue(_translator);
          
          try
          {
              Object object = new Object();
              
              _translator.parse(_component, "some value");
              _translatorControl.setReturnValue(object);
              
              _component.writeValue(object);
              _componentControl.setVoidCallable();
              
              _component.getValidators();
              _componentControl.setReturnValue(null);
              
              _valueConverter.coerceValue(null, Iterator.class);
              _valueConverterControl.setReturnValue(Collections.EMPTY_LIST.iterator());
              
              replay();
              
              _support.bind(_component, _writer, _cycle, "some value");
          }
          catch (ValidatorException e)
          {
              unreachable();
          }
          finally
          {
              verify();
          }
      }
      
      public void testNotNullTranslateFailBind()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.getDelegate();
          _formControl.setReturnValue(_delegate);
          
          _delegate.recordFieldInputValue("some value");
          
          _component.getTranslator();
          _componentControl.setReturnValue(_translator);
          
          try
          {
              _translator.parse(_component, "some value");
              _translatorControl.setThrowable(new ValidatorException(""));
              
              replay();
              
              _support.bind(_component, _writer, _cycle, "some value");
              
              unreachable();
          }
          catch (ValidatorException e)
          {
              verify();
          }
      }
      
      public void testNotNullBind()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.getDelegate();
          _formControl.setReturnValue(_delegate);
          
          _delegate.recordFieldInputValue("some value");
          
          _component.getTranslator();
          _componentControl.setReturnValue(_translator);
          
          try
          {
              Object object = new Object();
              
              _translator.parse(_component, "some value");
              _translatorControl.setReturnValue(object);
              
              _component.writeValue(object);
              _componentControl.setVoidCallable();
              
              _component.getValidators();
              _componentControl.setReturnValue(_validator);
              
              _valueConverter.coerceValue(_validator, Iterator.class);
              _valueConverterControl.setReturnValue(Collections.singletonList(_validator).iterator());
              
              _validator.validate(_component, object);
              _validatorControl.setVoidCallable();
              
              replay();
              
              _support.bind(_component, _writer, _cycle, "some value");
          }
          catch (ValidatorException e)
          {
              unreachable();
          }
          finally
          {
              verify();
          }
      }
      
      public void testNotNullValidateFailBind()
      {
          _component.getForm();
          _componentControl.setReturnValue(_form);
          
          _form.getDelegate();
          _formControl.setReturnValue(_delegate);
          
          _delegate.recordFieldInputValue("some value");
          
          _component.getTranslator();
          _componentControl.setReturnValue(_translator);
          
          try
          {
              Object object = new Object();
              
              _translator.parse(_component, "some value");
              _translatorControl.setReturnValue(object);
              
              _component.writeValue(object);
              _componentControl.setVoidCallable();
              
              _component.getValidators();
              _componentControl.setReturnValue(_validator);
              
              _valueConverter.coerceValue(_validator, Iterator.class);
              _valueConverterControl.setReturnValue(Collections.singletonList(_validator).iterator());
              
              _validator.validate(_component, object);
              _validatorControl.setThrowable(new ValidatorException(""));
              
              replay();
              
              _support.bind(_component, _writer, _cycle, "some value");
              
              unreachable();
          }
          catch (ValidatorException e)
          {
              verify();
          }
      }
  }
  
  
  
  1.43      +2 -1      jakarta-tapestry/framework/src/descriptor/META-INF/hivemodule.xml
  
  Index: hivemodule.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/framework/src/descriptor/META-INF/hivemodule.xml,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- hivemodule.xml	15 May 2005 22:56:36 -0000	1.42
  +++ hivemodule.xml	14 Jun 2005 00:30:01 -0000	1.43
  @@ -46,7 +46,8 @@
     <sub-module descriptor="tapestry.error.xml"/>
     <sub-module descriptor="tapestry.valid.xml"/>
     <sub-module descriptor="tapestry.listener.xml"/>
  -    
  +  <sub-module descriptor="tapestry.form.xml"/>
  +  
     <service-point id="ClasspathResourceFactory">
     
       Constructs new instances of ClasspathResource.
  
  
  
  1.1                  jakarta-tapestry/framework/src/descriptor/META-INF/tapestry.form.xml
  
  Index: tapestry.form.xml
  ===================================================================
  <?xml version="1.0"?>
  <!-- 
     Copyright 2005 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.
  -->
  
  <module id="tapestry.form" version="4.0.0" package="org.apache.tapestry.form">
    
    Support for form components.
  
    <service-point id="RequirableFieldSupport" interface="org.apache.tapestry.form.RequirableFieldSupport">
      <invoke-factory>
        <construct class="RequirableFieldSupportImpl"></construct>
      </invoke-factory>
    </service-point>
  
    <service-point id="ValidatableFieldSupport" interface="org.apache.tapestry.form.ValidatableFieldSupport">
      <invoke-factory>
        <construct class="ValidatableFieldSupportImpl">
          <set-object property="valueConverter" value="infrastructure:valueConverter"/>
        </construct>
      </invoke-factory>
    </service-point>
      
  </module>
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org