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/09/07 21:49:02 UTC

svn commit: r279409 - in /jakarta/tapestry/trunk: ./ framework/src/java/org/apache/tapestry/form/ framework/src/java/org/apache/tapestry/valid/ framework/src/test/org/apache/tapestry/form/ framework/src/test/org/apache/tapestry/valid/

Author: hlship
Date: Wed Sep  7 12:48:54 2005
New Revision: 279409

URL: http://svn.apache.org/viewcvs?rev=279409&view=rev
Log:
TAPESTRY-600: Intermixing FieldLabels and form components can force a StaleLinkException

Modified:
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/valid/FieldLabel.java
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/BaseFormComponentTest.java
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/valid/TestFieldLabel.java
    jakarta/tapestry/trunk/status.xml

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java?rev=279409&r1=279408&r2=279409&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java Wed Sep  7 12:48:54 2005
@@ -669,10 +669,13 @@
     {
         String key = field.getExtendedId();
 
-        String buffer = (String) _prerenderMap.get(key);
+        // During a rewind, if the form is pre-rendered, the buffer will be null,
+        // so do the check based on the key, not a non-null value.
 
-        if (buffer == null)
+        if (!_prerenderMap.containsKey(key))
             return false;
+
+        String buffer = (String) _prerenderMap.get(key);
 
         writer.printRaw(buffer);
 

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/valid/FieldLabel.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/valid/FieldLabel.java?rev=279409&r1=279408&r2=279409&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/valid/FieldLabel.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/valid/FieldLabel.java Wed Sep  7 12:48:54 2005
@@ -41,15 +41,15 @@
 
     protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
     {
-        if (cycle.isRewinding())
-            return;
-
         IForm form = TapestryUtils.getForm(cycle, this);
 
         IFormComponent field = getField();
 
         if (field != null)
             form.prerenderField(writer, field, getLocation());
+
+        if (cycle.isRewinding())
+            return;
 
         String displayName = getDisplayName();
 

Modified: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/BaseFormComponentTest.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/BaseFormComponentTest.java?rev=279409&r1=279408&r2=279409&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/BaseFormComponentTest.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/BaseFormComponentTest.java Wed Sep  7 12:48:54 2005
@@ -100,4 +100,9 @@
     {
         return (IActionListener) newMock(IActionListener.class);
     }
+
+    protected IFormComponent newField()
+    {
+        return (IFormComponent) newMock(IFormComponent.class);
+    }
 }

Modified: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/valid/TestFieldLabel.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/valid/TestFieldLabel.java?rev=279409&r1=279408&r2=279409&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/valid/TestFieldLabel.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/valid/TestFieldLabel.java Wed Sep  7 12:48:54 2005
@@ -74,17 +74,24 @@
 
     public void testRewinding()
     {
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
+        Location l = newLocation();
+        IMarkupWriter writer = newWriter();
+        IRequestCycle cycle = newCycle();
+        IForm form = newForm();
+        IFormComponent field = newField();
 
-        cycle.isRewinding();
-        cyclec.setReturnValue(true);
+        trainGetForm(cycle, form);
+
+        form.prerenderField(writer, field, l);
+
+        trainIsRewinding(cycle, true);
 
         replayControls();
 
-        FieldLabel fl = (FieldLabel) newInstance(FieldLabel.class);
+        FieldLabel fl = (FieldLabel) newInstance(FieldLabel.class, new Object[]
+        { "field", field, "location", l });
 
-        fl.render(null, cycle);
+        fl.render(writer, cycle);
 
         verifyControls();
     }
@@ -97,9 +104,10 @@
         MockControl cyclec = newControl(IRequestCycle.class);
         IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
 
-        trainIsRewinding(cycle, false);
         trainGetForm(cycle, form);
 
+        trainIsRewinding(cycle, false);
+
         replayControls();
 
         FieldLabel fl = (FieldLabel) newInstance(FieldLabel.class, new Object[]
@@ -120,9 +128,10 @@
         MockControl cyclec = newControl(IRequestCycle.class);
         IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
 
-        trainIsRewinding(cycle, false);
         trainGetForm(cycle, form);
 
+        trainIsRewinding(cycle, false);
+
         replayControls();
 
         FieldLabel fl = (FieldLabel) newInstance(FieldLabel.class, new Object[]
@@ -146,9 +155,10 @@
         IBinding binding = newBinding(l);
         IPage page = newFred();
 
-        trainIsRewinding(cycle, false);
         trainGetForm(cycle, form);
 
+        trainIsRewinding(cycle, false);
+
         replayControls();
 
         FieldLabel fl = (FieldLabel) newInstance(FieldLabel.class, new Object[]
@@ -184,12 +194,12 @@
         IFormComponent field = newField("MyLabel", null);
         Location l = newLocation();
 
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
+        IRequestCycle cycle = newCycle();
 
-        trainIsRewinding(cycle, false);
         trainGetForm(cycle, form);
 
+        trainIsRewinding(cycle, false);
+
         FieldLabel fl = (FieldLabel) newInstance(FieldLabel.class, new Object[]
         { "location", l, "field", field });
 
@@ -218,12 +228,12 @@
         IFormComponent field = newField("MyLabel", "clientId");
         Location l = newLocation();
 
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
+        IRequestCycle cycle = newCycle();
 
-        trainIsRewinding(cycle, false);
         trainGetForm(cycle, form);
 
+        trainIsRewinding(cycle, false);
+
         FieldLabel fl = (FieldLabel) newInstance(FieldLabel.class, new Object[]
         { "location", l, "field", field });
 
@@ -251,11 +261,11 @@
         MockControl fieldc = newControl(IFormComponent.class);
         IFormComponent field = (IFormComponent) fieldc.getMock();
 
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
+        IRequestCycle cycle = newCycle();
 
-        trainIsRewinding(cycle, false);
         trainGetForm(cycle, form);
+
+        trainIsRewinding(cycle, false);
 
         Location l = newLocation();
         IPage page = newFred();

Modified: jakarta/tapestry/trunk/status.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/status.xml?rev=279409&r1=279408&r2=279409&view=diff
==============================================================================
--- jakarta/tapestry/trunk/status.xml (original)
+++ jakarta/tapestry/trunk/status.xml Wed Sep  7 12:48:54 2005
@@ -54,7 +54,7 @@
       <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>
-      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-609">Tapestry.set_focus() seems to be passed the form components elementId (i.e. name attribute) not clientId (i.e. id attribute), which keeps
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-609">Tapestry.set_focus() seems to be passed the form components elementId (i.e. name attribute) not clientId (i.e. id attribute), which keeps 
         focus from being set</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-478, TAPESTRY-477, TAPESTRY-463, TAPESTRY-474" due-to="Pierre-Yves Nicolas">Document RadioGroup, Radio, ExternalLink, Option components</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-613">Javascript problem with @LinkSubmit</action>
@@ -70,13 +70,14 @@
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-606">ListEdit components should not attempt to take focus</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-546">Build uploads vlibbeans-xxx.jar to java repository (and thence to the maven repository)</action>
       <action type="fix" dev="DS" fixes-bug="TAPESTRY-461" due-to="Warner Onstine">Document DirectLink component</action>
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-600">Intermixing FieldLabels and form components can force a StaleLinkException</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>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-554">Hook needed on client side to control how validation errors are presented to the user</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-528">Add IComponentSpecification.getReservedParameterNames()</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-557">Remove unused org.apache.tapestry.IResourceLocation (replaced by org.apache.hivemind.Resource)</action>
-      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-553">Rename property-name attribute of configure element to "property" (matching the code in SpecificationParser, as well as other similar
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-553">Rename property-name attribute of configure element to "property" (matching the code in SpecificationParser, as well as other similar 
         elements in the DTD)</action>
       <action type="fix" dev="MB" fixes-bug="TAPESTRY-555">IfBean has a logic error in it</action>
       <action type="fix" dev="MB" fixes-bug="TAPESTRY-290">Incorrect binding type converter for array of int[]</action>
@@ -112,7 +113,7 @@
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-445" due-to="Markus Joschko">ContextAssetFactory assembles wrong filename for assets</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-444">regexp validator(Email) script function name mismatch</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-446">Changes to assets are not picked up, even when caching is disabled</action>
-      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-435,TAPESTRY-325,TAPESTRY-309,TAPESTRY-311,TAPESTRY-252,TAPESTRY-254,TAPESTRY-327,TAPESTRY-333" due-to="Our many international users">Add many
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-435,TAPESTRY-325,TAPESTRY-309,TAPESTRY-311,TAPESTRY-252,TAPESTRY-254,TAPESTRY-327,TAPESTRY-333" due-to="Our many international users">Add many 
         translations of ValidationStrings.properties.</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-441">Poor reporting of duplicate method implementations</action>
       <action type="update" dev="HLS">Remove default-binding attribute from &lt;parameter&gt; element</action>
@@ -131,15 +132,15 @@
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-534">WebRequest interface doesn't expose getRemoteUser(), isUserInRole() or getUserPrincipal()</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-530" due-to="Raphael Jean">Namespace messages are retrieved using page's locale rather than engine's locale</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-354">Components without a .jwc file not visible</action>
-      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-533" due-to="Raphael Jean">Generated client-side javascript is wrong when error message or field display name contains single-quote characters
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-533" due-to="Raphael Jean">Generated client-side javascript is wrong when error message or field display name contains single-quote characters 
         or backslashes</action>
-      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-365">Set the location for a page that has no specification (just a template) to be relative to the application (or library)
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-365">Set the location for a page that has no specification (just a template) to be relative to the application (or library) 
         specification</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-537">Allow listener methods to return ILink, to support redirect-after-post</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-539">Abstract properties (without a &lt;property&gt; element) do not clear out their values</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-351">Add isRequired() to IFieldComponent</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-452">Tapestry 4.0 (excluding annotations) not source compatible with JDK 1.3</action>
-      <action type="fix" dev="PF" fixes-bug="TAPESTRY-350">Replaced RequirableField logic and 'required' parameter in PropertySelection, RadioGroup, Select, Upload, contrib:MultiplePropertySelection,
+      <action type="fix" dev="PF" fixes-bug="TAPESTRY-350">Replaced RequirableField logic and 'required' parameter in PropertySelection, RadioGroup, Select, Upload, contrib:MultiplePropertySelection, 
         and contrib:Palette with more general ValidatableField logic that adds a 'validators' parameter.</action>
       <action type="update" dev="PF">Checkbox component is now validatable.</action>
       <action type="update" dev="PF">Required validator additionally detects empty strings and empty collections.</action>
@@ -208,9 +209,9 @@
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-337">Incorrect link to Spring integration docs in FAQ</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-304">Non thread safe documentation example</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-261">ListEditMap can return null from getDeletedKeys()</action>
-      <action type="fix" dev="HLS">Fix injection problems; InjectScriptWorker injects a DeferredScript, not an IScript. Add super-verbose exception output when there's a failure instantiating a
+      <action type="fix" dev="HLS">Fix injection problems; InjectScriptWorker injects a DeferredScript, not an IScript. Add super-verbose exception output when there's a failure instantiating a 
         component class. </action>
-      <action type="add" dev="PF">Refactored and expanded validation functionality to include DatePicker, PropertySelection, RadioGroup, Select, TextArea, TextField, Upload, contrib:Palette, and
+      <action type="add" dev="PF">Refactored and expanded validation functionality to include DatePicker, PropertySelection, RadioGroup, Select, TextArea, TextField, Upload, contrib:Palette, and 
         contrib:MultiplePropertySelection</action>
       <action type="update" dev="HLS">Rework form event management to be primarily a client-side concern</action>
       <action type="add" dev="HLS">Add translator binding prefix</action>
@@ -287,7 +288,7 @@
       <action type="add" dev="HLS"> Add &lt;inject-state&gt; element to specifications. </action>
       <action type="add" dev="HLS"> Add property attribute to &lt;component&gt;, &lt;bean&gt; and &lt;asset&gt; and add enhancement workers to inject these objects as properties. </action>
       <action type="add" dev="HLS"> Add hivemind: binding prefix. </action>
-      <action type="update" dev="HLS"> Make the Body component output initializations in a script block at the end of the page (just before the close tag), rather than in a window.onload event
+      <action type="update" dev="HLS"> Make the Body component output initializations in a script block at the end of the page (just before the close tag), rather than in a window.onload event 
         handler. </action>
       <action type="update" dev="HLS" fixes-bug="TAPESTRY-262"> Support more boolean values. </action>
       <action type="update" dev="HLS"> Inject Messages into components; this means that all Tapestry page and component classes are abstract. </action>
@@ -309,7 +310,7 @@
       <action type="fix" dev="HLS" due-to="Xi Ping Wang" fixes-bug="TAPESTRY-249"> Provide localized validation messages for Simplified Chinese (zh_CN). </action>
       <action type="fix" dev="HLS" due-to="Niklas Ekman" fixes-bug="TAPESTRY-139"> Provide localized validation messages for Swedish. </action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-230"> Ignored interruptedException prevents Janitorthread termination. </action>
-      <action type="fix" dev="HLS" due-to="Morten Holm" fixes-bug="TAPESTRY-248"> The online Tapestry component reference for 3.0.1 for @Foreach component has an error in the example section.
+      <action type="fix" dev="HLS" due-to="Morten Holm" fixes-bug="TAPESTRY-248"> The online Tapestry component reference for 3.0.1 for @Foreach component has an error in the example section. 
         </action>
       <action type="fix" dev="HLS" due-to="Michael Frericks" fixes-bug="TAPESTRY-218"> Persistent properties can't be set to null. </action>
       <action type="fix" dev="HLS" due-to="Sadanori Ito" fixes-bug="TAPESTRY-200"> ListEdit component reference should list source and value as required. </action>
@@ -338,11 +339,11 @@
     <!-- Use due-to to give acknowledgement for patches. -->
     <release version="3.0-rc-3" date="Apr 7 2004">
       <action type="update" dev="HLS"> Add docs on how to report problems. </action>
-      <action type="fix" dev="HLS" fixes-bug="28202" due-to="Mats Forst&#246;f"> Pass the java.security.ProtectionDomain to the parent class loader when creating an enhanced class, to allow Tapestry
+      <action type="fix" dev="HLS" fixes-bug="28202" due-to="Mats Forst&#246;f"> Pass the java.security.ProtectionDomain to the parent class loader when creating an enhanced class, to allow Tapestry 
         operation inside secure environments such as Tomcat. </action>
       <action type="fix" dev="DS" fixes-bug="28177" due-to="sito@htf.highway.ne.jp"> NPE in org.apache.tapestry.form.LinkSubmit. </action>
       <action type="fix" dev="HLS" fixes-bug="27956"> Make checks for unimplemented abstract methods optional, to work around a bug in IBM JDK 1.3.1 (used with Websphere 4.x). </action>
-      <action type="fix" dev="HLS" fixes-bug="28235"> Allow more primitive types to be used with parameter direction <code>auto</code> (byte, char, short, float and long) in addition to the
+      <action type="fix" dev="HLS" fixes-bug="28235"> Allow more primitive types to be used with parameter direction <code>auto</code> (byte, char, short, float and long) in addition to the 
         previously accepted types (boolean, int, double and objects). </action>
     </release>
     <release version="3.0-rc-2" date="Apr 1 2004">
@@ -368,7 +369,7 @@
       <action type="update" dev="HLS"> Update DatePicker to use a graphic icon to hide and show the calendar. </action>
       <action type="fix" dev="HLS" fixes-bug="20932"> Check for duplication of ids between the HTML template and the specification. </action>
       <action type="fix" dev="HLS" fixes-bug="27082"> Fix some number conversion problems inside NumberValidator. </action>
-      <action type="update" dev="HLS"> Dynamically download OGNL and Javassist libraries (in accordance with ASF directives about non-ASL code). <b>Unfortunately, this means that we no longer can
+      <action type="update" dev="HLS"> Dynamically download OGNL and Javassist libraries (in accordance with ASF directives about non-ASL code). <b>Unfortunately, this means that we no longer can 
         distribute precompiled examples that include those libraries</b> </action>
     </release>
     <release version="3.0-beta-4" date="Feb 5 2004">
@@ -418,7 +419,7 @@
       <action type="fix" dev="MB" fixes-bug="25642"> properties cannot be of complex array types </action>
       <action type="fix" dev="EH" fixes-bug="25766"> fixed broken links in doc\src\common\TapestryLinks.xml </action>
       <action type="fix" dev="MB" fixes-bug="26395"> Inherited parameters do not pick up default values </action>
-      <action type="update" dev="HLS"> Changed code to no longer invoke <code>StringUtils.isEmpty() / isNonEmpty()</code> (this is because the behavior of the method is changing between
+      <action type="update" dev="HLS"> Changed code to no longer invoke <code>StringUtils.isEmpty() / isNonEmpty()</code> (this is because the behavior of the method is changing between 
         jakarta-commons 1.0 and 2.0). </action>
       <action type="update" dev="HLS"> Add an implementation of <code>toString()</code> to <code>RequestCycle</code>. </action>
       <action type="update" dev="HLS"> Update all copyrights for 2004. </action>
@@ -434,7 +435,7 @@
       <action type="update" dev="MB"> Evaluate the string 'false' as Boolean.FALSE. All other non-empty strings continue to be evaluated as Boolean.TRUE. </action>
       <action type="update" dev="MB"> Automatically download external dependencies (such as Forrest and McKoi DB). </action>
       <action type="fix" dev="HK" due-to="Anatol Pomazau"> DatePicker positioning problem fixed. </action>
-      <action type="fix" dev="HK" fixes-bug="24336"> Automatic rendering of the maxlength and size attributes have been removed. DatePicker now allows informal attributes that will be applied to the
+      <action type="fix" dev="HK" fixes-bug="24336"> Automatic rendering of the maxlength and size attributes have been removed. DatePicker now allows informal attributes that will be applied to the 
         field. </action>
       <action type="fix" dev="MB" fixes-bug="25611"> Fixed one more place where the encoding needs to be set </action>
     </release>



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