You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2005/08/30 00:38:27 UTC

svn commit: r264648 - in /jakarta/tapestry/trunk: ./ examples/Workbench/src/context/ examples/Workbench/src/context/WEB-INF/ examples/Workbench/src/java/org/apache/tapestry/workbench/ examples/Workbench/src/java/org/apache/tapestry/workbench/upload/ fr...

Author: hlship
Date: Mon Aug 29 15:38:14 2005
New Revision: 264648

URL: http://svn.apache.org/viewcvs?rev=264648&view=rev
Log:
TAPESTRY-610: $bean syntax for validators: binding prefix is broken

Added:
    jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Fields.properties
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/AbstractValidatorWrapper.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/BeanValidatorWrapper.java
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/validator/TestValidatorWrapper.java
Modified:
    jakarta/tapestry/trunk/examples/Workbench/src/context/Fields.html
    jakarta/tapestry/trunk/examples/Workbench/src/context/FieldsResults.html
    jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Fields.page
    jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/Visit.java
    jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/upload/Upload.java
    jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.services.xml
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/ValidatorFactoryImpl.java
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/validator/TestValidatorFactory.java
    jakarta/tapestry/trunk/status.xml

Modified: jakarta/tapestry/trunk/examples/Workbench/src/context/Fields.html
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/context/Fields.html?rev=264648&r1=264647&r2=264648&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/context/Fields.html (original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/context/Fields.html Mon Aug 29 15:38:14 2005
@@ -17,7 +17,7 @@
 
 <span jwcid="showError"/>
 
-<form jwcid="form@Form" success="listener:formSubmit" delegate="bean:delegate" clientValidationEnabled="ognl:clientValidationEnabled">
+<form jwcid="form@Form" success="listener:doSubmit" delegate="bean:delegate" clientValidationEnabled="ognl:clientValidationEnabled">
 
 <table class="form">
 	<tr>
@@ -49,6 +49,11 @@
   <tr>
   	<th><label jwcid="@FieldLabel" accesskey="e" field="component:inputEmail"/></th>
   	<td><input jwcid="inputEmail"/></td>
+  </tr>
+  
+  <tr>
+    <th><label jwcid="@FieldLabel" accessKey="z" field="component:zipCode"/></th>
+    <td><input jwcid="zipCode"/></td>
   </tr>
 
   <tr>

Modified: jakarta/tapestry/trunk/examples/Workbench/src/context/FieldsResults.html
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/context/FieldsResults.html?rev=264648&r1=264647&r2=264648&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/context/FieldsResults.html (original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/context/FieldsResults.html Mon Aug 29 15:38:14 2005
@@ -37,6 +37,11 @@
 		<td><span jwcid="@Insert" value="ognl:visit.emailValue"/></td>
 	</tr>
 
+  <tr>
+    <th>Zip Code</th>
+    <td><span jwcid="@Insert" value="ognl:visit.zipCode"/></td>
+  </tr>
+  
 	<tr>
 		<th>Text Value</th>
 		<td><span jwcid="@Insert" value="ognl:visit.textValue"/></td>

Modified: jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Fields.page
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Fields.page?rev=264648&r1=264647&r2=264648&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Fields.page (original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Fields.page Mon Aug 29 15:38:14 2005
@@ -87,6 +87,17 @@
     <binding name="displayName" value="literal:Email Field"/>
   </component>
   
+  <bean name="zipValidator" class="org.apache.tapestry.form.validator.Pattern">
+    <set name="pattern" value="message:zip-code-pattern"/>
+    <set name="message" value="message:zip-code-message"/>
+  </bean>
+  
+  <component id="zipCode" type="TextField">
+    <binding name="value" value="visit.zipCode"/>
+    <binding name="validators" value="validators:required,$zipValidator"/>
+    <binding name="displayName" value="message:zip-code-label"/>
+  </component>
+  
   <component id="textArea" type="TextArea">
     <binding name="value" value="visit.textValue"></binding>
     <binding name="validators" value="validators:required,minLength=20"/>

Added: jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Fields.properties
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Fields.properties?rev=264648&view=auto
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Fields.properties (added)
+++ jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Fields.properties Mon Aug 29 15:38:14 2005
@@ -0,0 +1,3 @@
+zip-code-label=Zip Code
+zip-code-pattern=^\\d{5}(-\\d{4})?$
+zip-code-message=Zip codes are either five or nine digits; 02134 or 90125-1234.
\ No newline at end of file

Modified: jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/Visit.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/Visit.java?rev=264648&r1=264647&r2=264648&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/Visit.java (original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/Visit.java Mon Aug 29 15:38:14 2005
@@ -60,7 +60,9 @@
     private String _emailValue;
 
     private String _textValue;
-    
+
+    private String _zipCode;
+
     public String getActiveTabName()
     {
         return _activeTabName;
@@ -165,9 +167,19 @@
     {
         return _textValue;
     }
-    
+
     public void setTextValue(String value)
     {
         _textValue = value;
+    }
+
+    public String getZipCode()
+    {
+        return _zipCode;
+    }
+
+    public void setZipCode(String zipCode)
+    {
+        _zipCode = zipCode;
     }
 }

Modified: jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/upload/Upload.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/upload/Upload.java?rev=264648&r1=264647&r2=264648&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/upload/Upload.java (original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/upload/Upload.java Mon Aug 29 15:38:14 2005
@@ -14,7 +14,6 @@
 
 package org.apache.tapestry.workbench.upload;
 
-import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.annotations.InjectPage;
 import org.apache.tapestry.form.IPropertySelectionModel;
 import org.apache.tapestry.form.StringPropertySelectionModel;

Modified: jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.services.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.services.xml?rev=264648&r1=264647&r2=264648&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.services.xml (original)
+++ jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.services.xml Mon Aug 29 15:38:14 2005
@@ -2,7 +2,7 @@
 <!-- 
    Copyright 2004, 2005 The Apache Software Foundation
 
-   Licensed under the Apache License, Versions 2.0 (the "License");
+   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
 

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/AbstractValidatorWrapper.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/AbstractValidatorWrapper.java?rev=264648&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/AbstractValidatorWrapper.java (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/AbstractValidatorWrapper.java Mon Aug 29 15:38:14 2005
@@ -0,0 +1,57 @@
+// 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.
+
+package org.apache.tapestry.form.validator;
+
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.form.FormComponentContributorContext;
+import org.apache.tapestry.form.IFormComponent;
+import org.apache.tapestry.form.ValidationMessages;
+import org.apache.tapestry.valid.ValidatorException;
+
+/**
+ * Abstract implementation of {@link org.apache.tapestry.form.validator.Validator} that delegates to
+ * some other object.
+ * 
+ * @author Howard Lewis Ship
+ * @since 4.0
+ */
+public abstract class AbstractValidatorWrapper implements Validator
+{
+    protected abstract Validator getDelegate();
+
+    public void validate(IFormComponent field, ValidationMessages messages, Object object)
+            throws ValidatorException
+    {
+        getDelegate().validate(field, messages, object);
+    }
+
+    public boolean getAcceptsNull()
+    {
+        return getDelegate().getAcceptsNull();
+    }
+
+    public boolean isRequired()
+    {
+        return getDelegate().isRequired();
+    }
+
+    public void renderContribution(IMarkupWriter writer, IRequestCycle cycle,
+            FormComponentContributorContext context, IFormComponent field)
+    {
+        getDelegate().renderContribution(writer, cycle, context, field);
+    }
+
+}

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/BeanValidatorWrapper.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/BeanValidatorWrapper.java?rev=264648&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/BeanValidatorWrapper.java (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/BeanValidatorWrapper.java Mon Aug 29 15:38:14 2005
@@ -0,0 +1,54 @@
+// 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.
+
+package org.apache.tapestry.form.validator;
+
+import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.hivemind.util.Defense;
+import org.apache.tapestry.IComponent;
+
+/**
+ * Implementation of {@link org.apache.tapestry.form.validator.Validator} that delegates to a
+ * managed bean obtained from a component.
+ * 
+ * @author Howard Lewis Ship
+ * @since 4.0
+ */
+public class BeanValidatorWrapper extends AbstractValidatorWrapper
+{
+    private final IComponent _component;
+
+    private final String _name;
+
+    public BeanValidatorWrapper(IComponent component, String name)
+    {
+        Defense.notNull(component, "component");
+        Defense.notNull(name, "name");
+
+        _component = component;
+        _name = name;
+    }
+
+    protected Validator getDelegate()
+    {
+        Object bean = _component.getBeans().getBean(_name);
+
+        if (bean instanceof Validator)
+            return (Validator) bean;
+
+        throw new ApplicationRuntimeException(ValidatorMessages.beanNotValidator(_name), bean,
+                null, null);
+    }
+
+}

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/ValidatorFactoryImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/ValidatorFactoryImpl.java?rev=264648&r1=264647&r2=264648&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/ValidatorFactoryImpl.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/validator/ValidatorFactoryImpl.java Mon Aug 29 15:38:14 2005
@@ -157,13 +157,7 @@
             throw new ApplicationRuntimeException(ValidatorMessages
                     .noValueOrMessageForBean(beanName));
 
-        Object bean = component.getBeans().getBean(beanName);
-
-        if (bean instanceof Validator)
-            return (Validator) bean;
-
-        throw new ApplicationRuntimeException(ValidatorMessages.beanNotValidator(beanName), bean,
-                null, null);
+        return new BeanValidatorWrapper(component, beanName);
     }
 
     public void setValidators(Map validators)

Modified: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/validator/TestValidatorFactory.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/validator/TestValidatorFactory.java?rev=264648&r1=264647&r2=264648&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/validator/TestValidatorFactory.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/validator/TestValidatorFactory.java Mon Aug 29 15:38:14 2005
@@ -22,6 +22,8 @@
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.tapestry.IBeanProvider;
 import org.apache.tapestry.IComponent;
+import org.apache.tapestry.form.IFormComponent;
+import org.apache.tapestry.form.ValidationMessages;
 import org.apache.tapestry.junit.TapestryTestCase;
 import org.easymock.MockControl;
 
@@ -297,12 +299,18 @@
         return component;
     }
 
-    public void testBeanReference()
+    public void testBeanReference() throws Exception
     {
         Validator validator = newValidator();
         IBeanProvider provider = newBeanProvider("fred", validator);
         IComponent component = newComponent(provider);
 
+        IFormComponent field = newField();
+        ValidationMessages messages = newMessages();
+        Object value = new Object();
+
+        validator.validate(field, messages, value);
+
         replayControls();
 
         ValidatorFactoryImpl vf = new ValidatorFactoryImpl();
@@ -311,11 +319,24 @@
         List validators = vf.constructValidatorList(component, "$fred");
 
         assertEquals(1, validators.size());
-        assertSame(validator, validators.get(0));
+
+        Validator wrapper = (Validator) validators.get(0);
+
+        wrapper.validate(field, messages, value);
 
         verifyControls();
     }
 
+    private ValidationMessages newMessages()
+    {
+        return (ValidationMessages) newMock(ValidationMessages.class);
+    }
+
+    private IFormComponent newField()
+    {
+        return (IFormComponent) newMock(IFormComponent.class);
+    }
+
     public void testBeanReferenceNotValidator()
     {
         Object bean = new Object();
@@ -329,7 +350,12 @@
 
         try
         {
-            vf.constructValidatorList(component, "$fred");
+            List l = vf.constructValidatorList(component, "$fred");
+
+            Validator wrapper = (Validator) l.get(0);
+
+            wrapper.getAcceptsNull();
+
             unreachable();
         }
         catch (ApplicationRuntimeException ex)

Added: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/validator/TestValidatorWrapper.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/validator/TestValidatorWrapper.java?rev=264648&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/validator/TestValidatorWrapper.java (added)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/validator/TestValidatorWrapper.java Mon Aug 29 15:38:14 2005
@@ -0,0 +1,138 @@
+// 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.
+
+package org.apache.tapestry.form.validator;
+
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.form.FormComponentContributorContext;
+import org.apache.tapestry.form.IFormComponent;
+import org.apache.tapestry.form.ValidationMessages;
+import org.easymock.MockControl;
+
+/**
+ * Tests for {@link org.apache.tapestry.form.validator.AbstractValidatorWrapper}
+ * 
+ * @author Howard Lewis Ship
+ * @since 4.0
+ */
+public class TestValidatorWrapper extends BaseValidatorTestCase
+{
+    public static class Fixture extends AbstractValidatorWrapper
+    {
+        private final Validator _delegate;
+
+        public Fixture(Validator delegate)
+        {
+            _delegate = delegate;
+        }
+
+        protected Validator getDelegate()
+        {
+            return _delegate;
+        }
+    }
+
+    private Validator newValidator()
+    {
+        return (Validator) newMock(Validator.class);
+    }
+
+    public void testValidate() throws Exception
+    {
+        IFormComponent field = newField();
+        ValidationMessages messages = newMessages();
+        Object value = new Object();
+
+        Validator delegate = newValidator();
+
+        delegate.validate(field, messages, value);
+
+        replayControls();
+
+        new Fixture(delegate).validate(field, messages, value);
+
+        verifyControls();
+    }
+
+    public void testRenderContribution()
+    {
+        IMarkupWriter writer = newWriter();
+        IRequestCycle cycle = newCycle();
+        FormComponentContributorContext context = newContext();
+        IFormComponent field = newField();
+
+        Validator delegate = newValidator();
+
+        delegate.renderContribution(writer, cycle, context, field);
+
+        replayControls();
+
+        new Fixture(delegate).renderContribution(writer, cycle, context, field);
+
+        verifyControls();
+    }
+
+    public void testGetAcceptsNull()
+    {
+        MockControl delegatec = newControl(Validator.class);
+        Validator delegate = (Validator) delegatec.getMock();
+
+        delegate.getAcceptsNull();
+        delegatec.setReturnValue(true);
+
+        replayControls();
+
+        Validator wrapper = new Fixture(delegate);
+
+        assertEquals(true, wrapper.getAcceptsNull());
+
+        verifyControls();
+
+        delegate.getAcceptsNull();
+        delegatec.setReturnValue(false);
+
+        replayControls();
+
+        assertEquals(false, wrapper.getAcceptsNull());
+
+        verifyControls();
+    }
+
+    public void testIsRequired()
+    {
+        MockControl delegatec = newControl(Validator.class);
+        Validator delegate = (Validator) delegatec.getMock();
+
+        delegate.isRequired();
+        delegatec.setReturnValue(true);
+
+        replayControls();
+
+        Validator wrapper = new Fixture(delegate);
+
+        assertEquals(true, wrapper.isRequired());
+
+        verifyControls();
+
+        delegate.isRequired();
+        delegatec.setReturnValue(false);
+
+        replayControls();
+
+        assertEquals(false, wrapper.isRequired());
+
+        verifyControls();
+    }
+}

Modified: jakarta/tapestry/trunk/status.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/status.xml?rev=264648&r1=264647&r2=264648&view=diff
==============================================================================
--- jakarta/tapestry/trunk/status.xml (original)
+++ jakarta/tapestry/trunk/status.xml Mon Aug 29 15:38:14 2005
@@ -53,6 +53,7 @@
     <release version="4.0-beta-6" date="unreleased">
       <action type="update" dev="HLS" due-to="Henri Yandell">Convert Tapestry repository from CVS to SVN</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-611">Pattern validator invokes wrong client-side JavaScript function</action>      
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-610">$bean syntax for validators: binding prefix is broken</action>
     </release>
     <release version="4.0-beta-5" date="Aug 26 2005">
       <action type="fix" dev="MB,HLS" fixes-bug="TAPESTRY-552">Improperly configured SerializableAdaptor (for DataSqueezer) prevents serialized objects from being de-serialized</action>



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