Author: hlship
Date: Sat Oct  8 08:59:15 2005
New Revision: 307306

URL: http://svn.apache.org/viewcvs?rev=307306&view=rev
Log:
TAPESTRY-696: Race condition during page loading can cause anomoylous 
exceptions related to annotations

TAPESTRY-685: Asset service sends a 200 response even when the provided md5 
checksum is invalid

TAPESTRY-564: Automatically create an IPropertySelection model from a string

Added:
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringConvertedPropertySelectionModel.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringToPropertySelectionModelConverter.java
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/coerce/StringToPropertySelectionModelConverterTest.java
Modified:
    
jakarta/tapestry/trunk/contrib/src/java/org/apache/tapestry/contrib/palette/Palette.java
    jakarta/tapestry/trunk/examples/Workbench/src/context/Palette.html
    jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Palette.page
    
jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/palette/Palette.java
    jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.coerce.xml
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetService.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/BooleanArrayToIteratorConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/BooleanArrayToListConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CharArrayToIteratorConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CharArrayToListConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToBooleanConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToIteratorConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToListConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IntArrayToIteratorConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IntArrayToListConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IteratorToListConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/MapToBooleanConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToBooleanConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToIteratorConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToListConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NumberToBooleanConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectArrayToListConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToBooleanConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToIteratorConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToListConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToStringConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringToBooleanConverter.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/TypeConverterContribution.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/TypeConverterWrapper.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ComponentConstructorFactoryImpl.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/ServletWebResponse.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/WebResponse.java
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/TestServletWebResponse.java
    
jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletWebResponse.java
    
jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/TestPortletWebResponse.java
    jakarta/tapestry/trunk/status.xml

Modified: 
jakarta/tapestry/trunk/contrib/src/java/org/apache/tapestry/contrib/palette/Palette.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/contrib/src/java/org/apache/tapestry/contrib/palette/Palette.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/contrib/src/java/org/apache/tapestry/contrib/palette/Palette.java
 (original)
+++ 
jakarta/tapestry/trunk/contrib/src/java/org/apache/tapestry/contrib/palette/Palette.java
 Sat Oct  8 08:59:15 2005
@@ -156,49 +156,49 @@
  * use to format the palette component:
  * 
  * <pre>
- *     
  *      
  *       
  *        
  *         
  *          
  *           
- *                            TABLE.tapestry-palette TH
- *                            {
- *                              font-size: 9pt;
- *                              font-weight: bold;
- *                              color: white;
- *                              background-color: #330066;
- *                              text-align: center;
- *                            }
- *                           
- *                            TD.available-cell SELECT
- *                            {
- *                              font-weight: normal;
- *                              background-color: #FFFFFF;
- *                              width: 200px;
- *                            }
- *                            
- *                            TD.selected-cell SELECT
- *                            {
- *                              font-weight: normal;
- *                              background-color: #FFFFFF;
- *                              width: 200px;
- *                            }
+ *            
+ *                             TABLE.tapestry-palette TH
+ *                             {
+ *                               font-size: 9pt;
+ *                               font-weight: bold;
+ *                               color: white;
+ *                               background-color: #330066;
+ *                               text-align: center;
+ *                             }
  *                            
- *                            TABLE.tapestry-palette TD.controls
- *                            {
- *                              text-align: center;
- *                              vertical-align: middle;
- *                              width: 60px;
- *                            }
+ *                             TD.available-cell SELECT
+ *                             {
+ *                               font-weight: normal;
+ *                               background-color: #FFFFFF;
+ *                               width: 200px;
+ *                             }
+ *                             
+ *                             TD.selected-cell SELECT
+ *                             {
+ *                               font-weight: normal;
+ *                               background-color: #FFFFFF;
+ *                               width: 200px;
+ *                             }
+ *                             
+ *                             TABLE.tapestry-palette TD.controls
+ *                             {
+ *                               text-align: center;
+ *                               vertical-align: middle;
+ *                               width: 60px;
+ *                             }
+ *             
  *            
  *           
  *          
  *         
  *        
  *       
- *      
  * </pre>
  * 
  * <p>
@@ -459,7 +459,7 @@
 
     public boolean isSortUser()
     {
-        return getSort() == SortMode.USER;
+        return getSort().equals(SortMode.USER);
     }
 
     public abstract Block getAvailableTitleBlock();

Modified: jakarta/tapestry/trunk/examples/Workbench/src/context/Palette.html
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/context/Palette.html?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/context/Palette.html 
(original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/context/Palette.html Sat Oct  
8 08:59:15 2005
@@ -12,7 +12,7 @@
 
 <span jwcid="@ShowError" delegate="bean:delegate"/>
 
-<form jwcid="[EMAIL PROTECTED]" delegate="bean:delegate" 
clientValidationEnabled="ognl:clientValidationEnabled">
+<form jwcid="form">
 
 <table class="form">
        <tr>

Modified: 
jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Palette.page
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Palette.page?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Palette.page 
(original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/Palette.page 
Sat Oct  8 08:59:15 2005
@@ -22,10 +22,16 @@
 <page-specification class="org.apache.tapestry.workbench.palette.Palette">
   
   <property name="clientValidationEnabled" persist="client" 
initial-value="true"/>
-  <property name="sort" persist="client" initial-value="@[EMAIL PROTECTED]"/>
-
+ 
   <bean name="delegate" 
class="org.apache.tapestry.workbench.WorkbenchValidationDelegate" 
property="delegate"/>
   
+  <component id="form" type="Form">
+    <binding name="delegate" value="bean:delegate"/>
+    <binding name="clientValidationEnabled" value="clientValidationEnabled"/>
+    <binding name="refresh" value="listener:doRefresh"/>
+    <binding name="success" value="listener:doAdvance"/>    
+  </component>
+  
   <component id="inputEnabled" type="Checkbox">
     <binding name="value" value="clientValidationEnabled"/> 
     <binding name="onchange" 
value="literal:javascript:this.form.events.submit();"/>
@@ -33,7 +39,10 @@
 
   <component id="inputColorSort" type="PropertySelection">
        <binding name="value" value="sort"/>
-       <binding name="model" value="sortModel"/>
+       <binding name="model" 
value="literal:None=NONE,Label=LABEL,Value=VALUE,Manual=USER"/>
+    <binding name="onchange">
+      literal:javascript:this.form.events.refresh();
+    </binding>
   </component>
   
   <component id="inputColor" type="contrib:Palette">
@@ -51,7 +60,6 @@
   
   <component id="continue" type="ImageSubmit">
        <binding name="image" value="asset:continue"/>
-       <binding name="listener" value="listener:advance"/>
   </component>
  
   <asset name="continue" path="images/Continue.gif"/>

Modified: 
jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/palette/Palette.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/palette/Palette.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/palette/Palette.java
 (original)
+++ 
jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/palette/Palette.java
 Sat Oct  8 08:59:15 2005
@@ -17,7 +17,9 @@
 import java.util.List;
 
 import org.apache.tapestry.IPage;
+import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.annotations.InjectPage;
+import org.apache.tapestry.annotations.Persist;
 import org.apache.tapestry.contrib.palette.SortMode;
 import org.apache.tapestry.form.IPropertySelectionModel;
 import org.apache.tapestry.form.StringPropertySelectionModel;
@@ -32,23 +34,28 @@
 {
     public abstract List getSelectedColors();
 
+    @Persist("client:app")
     public abstract String getSort();
 
-    public abstract IValidationDelegate getDelegate();
-    
-    private IPropertySelectionModel _sortModel;
+    public abstract void setSort(String sort);
 
-    /**
-     * Invoked before [EMAIL PROTECTED] #formSubmit(IRequestCycle)} if the 
user clicks the "advance" button.
-     */
+    public abstract IValidationDelegate getDelegate();
 
     @InjectPage("PaletteResults")
     public abstract PaletteResults getResultsPage();
 
-    public IPage advance()
+    protected void finishLoad()
+    {
+        setSort(SortMode.USER);
+    }
+
+    public void doRefresh()
+    {
+        getDelegate().clearErrors();
+    }
+
+    public IPage doAdvance()
     {
-        if (getDelegate().getHasErrors()) return null;
-        
         // Since Palette and palette.Results come from
         // a library now, we need to make sure
         // the namespace id is part of the name.
@@ -71,18 +78,5 @@
             colorModel = new StringPropertySelectionModel(colors);
 
         return colorModel;
-    }
-
-    public IPropertySelectionModel getSortModel()
-    {
-        if (_sortModel == null)
-        {
-            String[] options = new String[]
-            { SortMode.NONE, SortMode.LABEL, SortMode.VALUE, SortMode.USER };
-
-            _sortModel = new StringPropertySelectionModel(options);
-        }
-
-        return _sortModel;
     }
 }

Modified: 
jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.coerce.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.coerce.xml?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.coerce.xml 
(original)
+++ 
jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.coerce.xml 
Sat Oct  8 08:59:15 2005
@@ -112,12 +112,27 @@
     
   </configuration-point>
   
+  <configuration-point id="PropertySelectionModelConverters" 
schema-id="Converters"/>
+  
+  <contribution configuration-id="PropertySelectionModelConverters">
+    <converter class="java.lang.String" 
object="instance:StringToPropertySelectionModelConverter"/>
+  </contribution>
+    
+  <service-point id="PropertySelectionModelConverter" 
interface="TypeConverter">
+    <invoke-factory>
+      <construct class="TypeConverterWrapper">
+        <set-configuration property="contributions" 
configuration-id="PropertySelectionModelConverters"/>
+      </construct>
+    </invoke-factory>   
+  </service-point>
+    
   <contribution configuration-id="TypeConverters">
     <converter class="java.lang.Boolean" object="service:BooleanConverter"/>
     <converter class="java.util.Iterator" object="service:IteratorConverter"/>
     <converter class="java.util.List" object="service:ListConverter"/>
     <converter class="java.lang.String" 
object="instance:ObjectToStringConverter"/>
-  </contribution>
+    <converter class="org.apache.tapestry.form.IPropertySelectionModel" 
object="service:PropertySelectionModelConverter"/>
+  </contribution>  
   
   <service-point id="ValueConverter" interface="ValueConverter">
     

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetService.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetService.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetService.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetService.java
 Sat Oct  8 08:59:15 2005
@@ -185,28 +185,30 @@
     /**
      * Retrieves a resource from the classpath and returns it to the client in 
a binary output
      * stream.
-     * <p>
-     * TBD: Security issues. Hackers can download .class files.
      */
 
     public void service(IRequestCycle cycle) throws IOException
     {
-        // If they were vended an asset in the past then it must be up-to date.
-        // Asset URIs change if the underlying file is modified.
-
-        if (_request.getHeader("If-Modified-Since") != null)
-        {
-            _response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
-            return;
-        }
-
         String path = cycle.getParameter(PATH);
-        String md5 = cycle.getParameter(DIGEST);
+        String md5Digest = cycle.getParameter(DIGEST);
 
         try
         {
-            if (!_digestSource.getDigestForResource(path).equals(md5))
-                throw new 
ApplicationRuntimeException(AssetMessages.md5Mismatch(path));
+            if (!_digestSource.getDigestForResource(path).equals(md5Digest))
+            {
+                _response.sendError(HttpServletResponse.SC_FORBIDDEN, 
AssetMessages
+                        .md5Mismatch(path));
+                return;
+            }
+
+            // If they were vended an asset in the past then it must be up-to 
date.
+            // Asset URIs change if the underlying file is modified.
+
+            if (_request.getHeader("If-Modified-Since") != null)
+            {
+                _response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+                return;
+            }
 
             URL resourceURL = _classResolver.getResource(path);
 

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/BooleanArrayToIteratorConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/BooleanArrayToIteratorConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/BooleanArrayToIteratorConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/BooleanArrayToIteratorConverter.java
 Sat Oct  8 08:59:15 2005
@@ -23,7 +23,7 @@
  * @author Laurent ETIEMBLE, Howard M. Lewis Ship
  * @since 4.0
  */
-public class BooleanArrayToIteratorConverter implements TypeConverter
+public final class BooleanArrayToIteratorConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/BooleanArrayToListConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/BooleanArrayToListConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/BooleanArrayToListConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/BooleanArrayToListConverter.java
 Sat Oct  8 08:59:15 2005
@@ -23,7 +23,7 @@
  * @author Laurent ETIEMBLE, Howard M. Lewis Ship
  * @since 4.0
  */
-public class BooleanArrayToListConverter implements TypeConverter
+public final class BooleanArrayToListConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CharArrayToIteratorConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CharArrayToIteratorConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CharArrayToIteratorConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CharArrayToIteratorConverter.java
 Sat Oct  8 08:59:15 2005
@@ -21,7 +21,7 @@
  * @author Laurent ETIEMBLE, Howard M. Lewis Ship
  * @since 4.0
  */
-public class CharArrayToIteratorConverter implements TypeConverter
+public final class CharArrayToIteratorConverter implements TypeConverter
 {
     public Object convertValue(Object value)
     {

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CharArrayToListConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CharArrayToListConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CharArrayToListConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CharArrayToListConverter.java
 Sat Oct  8 08:59:15 2005
@@ -21,7 +21,7 @@
  * @author Laurent ETIEMBLE, Howard M. Lewis Ship
  * @since 4.0
  */
-public class CharArrayToListConverter implements TypeConverter
+public final class CharArrayToListConverter implements TypeConverter
 {
     public Object convertValue(Object value)
     {

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToBooleanConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToBooleanConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToBooleanConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToBooleanConverter.java
 Sat Oct  8 08:59:15 2005
@@ -21,7 +21,7 @@
  * 
  * @author Howard M. Lewis Ship
  */
-public class CollectionToBooleanConverter implements TypeConverter
+public final class CollectionToBooleanConverter implements TypeConverter
 {
     public Object convertValue(Object value)
     {

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToIteratorConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToIteratorConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToIteratorConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToIteratorConverter.java
 Sat Oct  8 08:59:15 2005
@@ -20,7 +20,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class CollectionToIteratorConverter implements TypeConverter
+public final class CollectionToIteratorConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToListConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToListConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToListConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/CollectionToListConverter.java
 Sat Oct  8 08:59:15 2005
@@ -21,7 +21,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class CollectionToListConverter implements TypeConverter
+public final class CollectionToListConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IntArrayToIteratorConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IntArrayToIteratorConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IntArrayToIteratorConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IntArrayToIteratorConverter.java
 Sat Oct  8 08:59:15 2005
@@ -21,7 +21,7 @@
  * @author Laurent ETIEMBLE, Howard M. Lewis Ship
  * @since 4.0
  */
-public class IntArrayToIteratorConverter implements TypeConverter
+public final class IntArrayToIteratorConverter implements TypeConverter
 {
     public Object convertValue(Object value)
     {

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IntArrayToListConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IntArrayToListConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IntArrayToListConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IntArrayToListConverter.java
 Sat Oct  8 08:59:15 2005
@@ -21,7 +21,7 @@
  * @author Laurent ETIEMBLE, Howard M. Lewis Ship
  * @since 4.0
  */
-public class IntArrayToListConverter implements TypeConverter
+public final class IntArrayToListConverter implements TypeConverter
 {
     public Object convertValue(Object value)
     {

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IteratorToListConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IteratorToListConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IteratorToListConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/IteratorToListConverter.java
 Sat Oct  8 08:59:15 2005
@@ -22,7 +22,7 @@
  * @author Mindbridge
  * @since 4.0
  */
-public class IteratorToListConverter implements TypeConverter
+public final class IteratorToListConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/MapToBooleanConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/MapToBooleanConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/MapToBooleanConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/MapToBooleanConverter.java
 Sat Oct  8 08:59:15 2005
@@ -22,7 +22,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class MapToBooleanConverter implements TypeConverter
+public final class MapToBooleanConverter implements TypeConverter
 {
     public Object convertValue(Object value)
     {

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToBooleanConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToBooleanConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToBooleanConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToBooleanConverter.java
 Sat Oct  8 08:59:15 2005
@@ -20,7 +20,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class NullToBooleanConverter implements TypeConverter
+public  final class NullToBooleanConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToIteratorConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToIteratorConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToIteratorConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToIteratorConverter.java
 Sat Oct  8 08:59:15 2005
@@ -20,7 +20,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class NullToIteratorConverter implements TypeConverter
+public final class NullToIteratorConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToListConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToListConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToListConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NullToListConverter.java
 Sat Oct  8 08:59:15 2005
@@ -20,7 +20,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class NullToListConverter implements TypeConverter
+public final class NullToListConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NumberToBooleanConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NumberToBooleanConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NumberToBooleanConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/NumberToBooleanConverter.java
 Sat Oct  8 08:59:15 2005
@@ -21,7 +21,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class NumberToBooleanConverter implements TypeConverter
+public final class NumberToBooleanConverter implements TypeConverter
 {
     public Object convertValue(Object value)
     {

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectArrayToListConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectArrayToListConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectArrayToListConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectArrayToListConverter.java
 Sat Oct  8 08:59:15 2005
@@ -21,7 +21,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class ObjectArrayToListConverter implements TypeConverter
+public final class ObjectArrayToListConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToBooleanConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToBooleanConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToBooleanConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToBooleanConverter.java
 Sat Oct  8 08:59:15 2005
@@ -21,7 +21,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class ObjectToBooleanConverter implements TypeConverter
+public final class ObjectToBooleanConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToIteratorConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToIteratorConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToIteratorConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToIteratorConverter.java
 Sat Oct  8 08:59:15 2005
@@ -22,7 +22,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class ObjectToIteratorConverter implements TypeConverter
+public final class ObjectToIteratorConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToListConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToListConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToListConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToListConverter.java
 Sat Oct  8 08:59:15 2005
@@ -22,7 +22,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class ObjectToListConverter implements TypeConverter
+public final class ObjectToListConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToStringConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToStringConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToStringConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/ObjectToStringConverter.java
 Sat Oct  8 08:59:15 2005
@@ -18,7 +18,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class ObjectToStringConverter implements TypeConverter
+public final class ObjectToStringConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Added: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringConvertedPropertySelectionModel.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringConvertedPropertySelectionModel.java?rev=307306&view=auto
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringConvertedPropertySelectionModel.java
 (added)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringConvertedPropertySelectionModel.java
 Sat Oct  8 08:59:15 2005
@@ -0,0 +1,103 @@
+// 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.coerce;

+

+import java.util.ArrayList;

+import java.util.List;

+

+import org.apache.hivemind.util.Defense;

+import org.apache.tapestry.form.IPropertySelectionModel;

+

+/**

+ * [EMAIL PROTECTED] org.apache.tapestry.form.IPropertySelectionModel} created 
from a comma-seperated string by

+ * [EMAIL PROTECTED] 
org.apache.tapestry.coerce.StringToPropertySelectionModelConverter}.

+ * 

+ * @author Howard M. Lewis Ship

+ * @since 4.0

+ */

+public final class StringConvertedPropertySelectionModel implements 
IPropertySelectionModel

+{

+    private static class Entry

+    {

+        String _label;

+

+        String _value;

+

+        Entry(String term)

+        {

+            Defense.notNull(term, "term");

+

+            int equalx = term.indexOf('=');

+

+            if (equalx < 0)

+            {

+                _label = term.trim();

+                _value = _label;

+            }

+            else

+            {

+                _label = term.substring(0, equalx).trim();

+                _value = term.substring(equalx + 1).trim();

+            }

+        }

+    }

+

+    private final List _entries;

+

+    public StringConvertedPropertySelectionModel(String[] terms)

+    {

+        Defense.notNull(terms, "terms");

+

+        _entries = new ArrayList(terms.length);

+

+        for (int i = 0; i < terms.length; i++)

+        {

+            _entries.add(new Entry(terms[i]));

+        }

+    }

+

+    public int getOptionCount()

+    {

+        return _entries.size();

+    }

+

+    private Entry getEntry(int index)

+    {

+        return (Entry) _entries.get(index);

+    }

+

+    public Object getOption(int index)

+    {

+        return getValue(index);

+    }

+

+    public String getLabel(int index)

+    {

+        // TODO Auto-generated method stub

+        return getEntry(index)._label;

+    }

+

+    public String getValue(int index)

+    {

+        return getEntry(index)._value;

+    }

+

+    public Object translateValue(String value)

+    {

+        // Values are the same on the client and the server, so no translation 
needed.

+        return value;

+    }

+

+}


Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringToBooleanConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringToBooleanConverter.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringToBooleanConverter.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringToBooleanConverter.java
 Sat Oct  8 08:59:15 2005
@@ -24,7 +24,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class StringToBooleanConverter implements TypeConverter
+public final class StringToBooleanConverter implements TypeConverter
 {
 
     public Object convertValue(Object value)

Added: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringToPropertySelectionModelConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringToPropertySelectionModelConverter.java?rev=307306&view=auto
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringToPropertySelectionModelConverter.java
 (added)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/StringToPropertySelectionModelConverter.java
 Sat Oct  8 08:59:15 2005
@@ -0,0 +1,39 @@
+// 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.coerce;

+

+import org.apache.tapestry.TapestryUtils;

+

+/**

+ * Converts a string to a [EMAIL PROTECTED] 
org.apache.tapestry.form.IPropertySelectionModel}. The string is

+ * broken apart at commas into terms. Each term consists of a label (displayed 
to the user) and a

+ * value (used as a client-side value and as the server-side property) 
seperated by an equals sign;

+ * if the equals sign is omitted, then the value is the same as the label.

+ * 

+ * @author Howard M. Lewis Ship

+ * @since 4.0

+ */

+public final class StringToPropertySelectionModelConverter implements 
TypeConverter

+{

+    public Object convertValue(Object value)

+    {

+        String input = (String) value;

+

+        String[] terms = TapestryUtils.split(input);

+

+        return new StringConvertedPropertySelectionModel(terms);

+    }

+

+}


Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/TypeConverterContribution.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/TypeConverterContribution.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/TypeConverterContribution.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/TypeConverterContribution.java
 Sat Oct  8 08:59:15 2005
@@ -21,7 +21,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class TypeConverterContribution
+public final class TypeConverterContribution
 {
     private TypeConverter _converter;
 

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/TypeConverterWrapper.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/TypeConverterWrapper.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/TypeConverterWrapper.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/coerce/TypeConverterWrapper.java
 Sat Oct  8 08:59:15 2005
@@ -30,7 +30,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class TypeConverterWrapper implements TypeConverter
+public final class TypeConverterWrapper implements TypeConverter
 {
     private StrategyRegistry _registry = new StrategyRegistryImpl();
 

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ComponentConstructorFactoryImpl.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ComponentConstructorFactoryImpl.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ComponentConstructorFactoryImpl.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ComponentConstructorFactoryImpl.java
 Sat Oct  8 08:59:15 2005
@@ -21,6 +21,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.hivemind.ClassResolver;
 import org.apache.hivemind.service.ClassFactory;
+import org.apache.hivemind.util.Defense;
 import org.apache.tapestry.enhance.EnhancedClassValidator;
 import org.apache.tapestry.enhance.EnhancementOperationImpl;
 import org.apache.tapestry.enhance.EnhancementWorker;
@@ -40,7 +41,7 @@
         ResetEventListener
 {
     private Log _log;
-    
+
     private ClassFactory _classFactory;
 
     private ClassResolver _classResolver;
@@ -64,33 +65,36 @@
     public ComponentConstructor 
getComponentConstructor(IComponentSpecification specification,
             String className)
     {
-        ComponentConstructor result = (ComponentConstructor) 
_cachedConstructors.get(specification);
+        Defense.notNull(specification, "specification");
 
-        if (result == null)
+        synchronized (specification)
         {
-            Class baseClass = _classResolver.findClass(className);
+            ComponentConstructor result = (ComponentConstructor) 
_cachedConstructors
+                    .get(specification);
 
-            EnhancementOperationImpl eo = new 
EnhancementOperationImpl(_classResolver,
-                    specification, baseClass, _classFactory, _log);
+            if (result == null)
+            {
+                Class baseClass = _classResolver.findClass(className);
 
-            // Invoking on the chain is the same as invoking on every
-            // object in the chain (because method performEnhancement() is 
type void).
+                EnhancementOperationImpl eo = new 
EnhancementOperationImpl(_classResolver,
+                        specification, baseClass, _classFactory, _log);
 
-            _chain.performEnhancement(eo, specification);
+                // Invoking on the chain is the same as invoking on every
+                // object in the chain (because method performEnhancement() is 
type void).
 
-            result = eo.getConstructor();
+                _chain.performEnhancement(eo, specification);
 
-            // TODO: This should be optional to work around that IBM JVM bug.
-            // Also, to some degree, it should be passed into 
EnhancementOperationImpl,
-            // as it generally only needs to be done if a enhanced class
-            // is fabricated.
+                result = eo.getConstructor();
 
-            _validator.validate(baseClass, result.getComponentClass(), 
specification);
+                // TODO: This should be optional to work around that IBM JVM 
bug.
 
-            _cachedConstructors.put(specification, result);
-        }
+                _validator.validate(baseClass, result.getComponentClass(), 
specification);
 
-        return result;
+                _cachedConstructors.put(specification, result);
+            }
+
+            return result;
+        }
     }
 
     public void setClassFactory(ClassFactory classFactory)

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/ServletWebResponse.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/ServletWebResponse.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/ServletWebResponse.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/ServletWebResponse.java
 Sat Oct  8 08:59:15 2005
@@ -134,4 +134,9 @@
         _servletResponse.setIntHeader(name, value);
     }
 
+    public void sendError(int statusCode, String message) throws IOException
+    {
+        _servletResponse.sendError(statusCode, message);
+    }
+
 }

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/WebResponse.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/WebResponse.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/WebResponse.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/WebResponse.java
 Sat Oct  8 08:59:15 2005
@@ -109,4 +109,10 @@
      * Sets the status code for this response.
      */
     public void setStatus(int status);
+
+    /**
+     * Sends an error response.
+     */
+
+    public void sendError(int statusCode, String message) throws IOException;
 }

Added: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/coerce/StringToPropertySelectionModelConverterTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/coerce/StringToPropertySelectionModelConverterTest.java?rev=307306&view=auto
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/coerce/StringToPropertySelectionModelConverterTest.java
 (added)
+++ 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/coerce/StringToPropertySelectionModelConverterTest.java
 Sat Oct  8 08:59:15 2005
@@ -0,0 +1,85 @@
+// 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.coerce;

+

+import org.apache.hivemind.test.HiveMindTestCase;

+import org.apache.tapestry.form.IPropertySelectionModel;

+

+/**

+ * Tests for [EMAIL PROTECTED] 
org.apache.tapestry.coerce.StringToPropertySelectionModelConverter} and

+ * [EMAIL PROTECTED] 
org.apache.tapestry.coerce.StringConvertedPropertySelectionModel}.

+ * 

+ * @author Howard M. Lewis Ship

+ * @since 4.0

+ */

+public class StringToPropertySelectionModelConverterTest extends 
HiveMindTestCase

+{

+    private IPropertySelectionModel newModel(String value)

+    {

+        return (IPropertySelectionModel) new 
StringToPropertySelectionModelConverter()

+                .convertValue(value);

+    }

+

+    private void assertValues(IPropertySelectionModel model, String... values)

+    {

+        assertEquals(values.length, model.getOptionCount());

+

+        for (int i = 0; i < values.length; i++)

+        {

+            assertEquals(values[i], model.getValue(i));

+            assertEquals(values[i], model.getOption(i));

+        }

+    }

+

+    private void assertLabels(IPropertySelectionModel model, String... labels)

+    {

+        assertEquals(labels.length, model.getOptionCount());

+

+        for (int i = 0; i < labels.length; i++)

+            assertEquals(labels[i], model.getLabel(i));

+    }

+

+    public void testJustLabels()

+    {

+        IPropertySelectionModel model = newModel("Green,Red,Blue");

+

+        assertValues(model, "Green", "Red", "Blue");

+        assertLabels(model, "Green", "Red", "Blue");

+    }

+

+    public void testLabelsAndValues()

+    {

+        IPropertySelectionModel model = 
newModel("Red=RED,Green=GREEN,Blue=BLUE");

+

+        assertValues(model, "RED", "GREEN", "BLUE");

+        assertLabels(model, "Red", "Green", "Blue");

+    }

+

+    public void testBlankValue()

+    {

+        IPropertySelectionModel model = 
newModel("--Colors--=,Red=RED,Green=GREEN,Blue=BLUE");

+

+        assertValues(model, "", "RED", "GREEN", "BLUE");

+        assertLabels(model, "--Colors--", "Red", "Green", "Blue");

+    }

+

+    public void testWhiteSpaceTrimmed()

+    {

+        IPropertySelectionModel model = 
newModel("--Colors--=\t,\n\tRed\t=\tRED\t,\n\tGreen\t=\tGREEN\t,\n\tBlue\t=\tBLUE\n");

+

+        assertValues(model, "", "RED", "GREEN", "BLUE");

+        assertLabels(model, "--Colors--", "Red", "Green", "Blue");

+    }

+}


Modified: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/TestServletWebResponse.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/TestServletWebResponse.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/TestServletWebResponse.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/TestServletWebResponse.java
 Sat Oct  8 08:59:15 2005
@@ -48,7 +48,7 @@
 
         response.setContentType("foo/bar");
         response.getOutputStream();
-        setReturnValue(response,stream);
+        setReturnValue(response, stream);
 
         replayControls();
 
@@ -95,7 +95,7 @@
 
         response.setContentType("foo/bar");
         response.getWriter();
-        setReturnValue(response,writer);
+        setReturnValue(response, writer);
 
         replayControls();
 
@@ -115,7 +115,7 @@
 
         response.setContentType("foo/bar");
         response.getWriter();
-        setReturnValue(response,writer1);
+        setReturnValue(response, writer1);
 
         replayControls();
 
@@ -128,7 +128,7 @@
         response.reset();
         response.setContentType("zip/zap");
         response.getWriter();
-        setReturnValue(response,writer2);
+        setReturnValue(response, writer2);
 
         replayControls();
 
@@ -185,13 +185,14 @@
         return (HttpServletResponse) newMock(HttpServletResponse.class);
     }
 
-    public void testSetHeaderMethods()
+    public void testSetHeaderMethods() throws Exception
     {
         HttpServletResponse response = newResponse();
 
         response.setHeader("fie", "fie");
         response.setDateHeader("expires", -1);
         response.setIntHeader("size", 33);
+        response.sendError(99, "foo!");
 
         replayControls();
 
@@ -200,6 +201,7 @@
         swr.setHeader("fie", "fie");
         swr.setDateHeader("expires", -1);
         swr.setIntHeader("size", 33);
+        swr.sendError(99, "foo!");
 
         verifyControls();
 

Modified: 
jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletWebResponse.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletWebResponse.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletWebResponse.java
 (original)
+++ 
jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletWebResponse.java
 Sat Oct  8 08:59:15 2005
@@ -110,4 +110,10 @@
         unsupported("setIntHeader");
     }
 
+    /** Unsupported. */
+    public void sendError(int statusCode, String message) throws IOException
+    {
+        unsupported("sendError");
+    }
+
 }

Modified: 
jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/TestPortletWebResponse.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/TestPortletWebResponse.java?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/TestPortletWebResponse.java
 (original)
+++ 
jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/TestPortletWebResponse.java
 Sat Oct  8 08:59:15 2005
@@ -150,6 +150,27 @@
         verifyControls();
     }
 
+    public void testSendErrorUnsupported() throws Exception
+    {
+        PortletResponse response = newResponse();
+
+        replayControls();
+
+        PortletWebResponse pwr = new PortletWebResponse(response);
+
+        try
+        {
+            pwr.sendError(99, "foo!");
+            unreachable();
+        }
+        catch (UnsupportedOperationException ex)
+        {
+            // Expected.
+        }
+
+        verifyControls();
+    }
+
     public void testEncodeURL()
     {
         MockControl control = newControl(PortletResponse.class);

Modified: jakarta/tapestry/trunk/status.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/status.xml?rev=307306&r1=307305&r2=307306&view=diff
==============================================================================
--- jakarta/tapestry/trunk/status.xml (original)
+++ jakarta/tapestry/trunk/status.xml Sat Oct  8 08:59:15 2005
@@ -53,7 +53,10 @@
     <release version="4.0-beta-10" date="unreleased">
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-344">Unimplemented 
abstract method check broken</action>
       <action type="add" dev="HLS">Add DefaultPrimaryKeyConverter for use with 
the For component</action>
-      <action type="update" dev="HLS">Change For component to interleave 
rendering/rewinding with access to its primary key converter</action>      
+      <action type="update" dev="HLS">Change For component to interleave 
rendering/rewinding with access to its primary key converter</action>
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-696">Race condition 
during page loading can cause anomoylous exceptions related to 
annotations</action>
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-685">Asset service 
sends a 200 response even when the provided md5 checksum is invalid</action>
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-564">Automatically 
create an IPropertySelection model from a string</action>      
     </release>
     <release version="4.0-beta-9" date="Oct 1 2005">
       <action type="fix" dev="DS" fixes-bug="TAPESTRY-663">Document Button 
component</action>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to