Revision: 847
          http://stripes.svn.sourceforge.net/stripes/?rev=847&view=rev
Author:   bengunter
Date:     2008-02-07 19:20:20 -0800 (Thu, 07 Feb 2008)

Log Message:
-----------
Further fixes for STS-504. Added a couple of NPE checks. Had to change the 
rules for $event so that you cannot assign it a default value by doing 
{$event=blah}. Instead it relies solely on @DefaultHandler. In addition, 
UrlBindingParameter.getValue() no longer returns the default value if the value 
is null. It probably never should have in the first place, but more importantly 
it became necessary to allow calling code to know if the given value is null, 
even if there is a default value. All these changes were necessary because 
there were times when the default event would be added to the request 
parameters even when another event was specified in a form. Thankfully, such a 
condition (multiple events) now causes an exception to be thrown.

Modified Paths:
--------------
    trunk/stripes/src/net/sourceforge/stripes/action/UrlBinding.java
    
trunk/stripes/src/net/sourceforge/stripes/controller/StripesRequestWrapper.java
    trunk/stripes/src/net/sourceforge/stripes/controller/UrlBindingFactory.java
    
trunk/stripes/src/net/sourceforge/stripes/controller/UrlBindingParameter.java
    trunk/stripes/src/net/sourceforge/stripes/util/UrlBuilder.java

Modified: trunk/stripes/src/net/sourceforge/stripes/action/UrlBinding.java
===================================================================
--- trunk/stripes/src/net/sourceforge/stripes/action/UrlBinding.java    
2008-02-07 04:20:53 UTC (rev 846)
+++ trunk/stripes/src/net/sourceforge/stripes/action/UrlBinding.java    
2008-02-08 03:20:20 UTC (rev 847)
@@ -45,8 +45,8 @@
  * [EMAIL PROTECTED] @UrlBinding("/foo/{bar=abc}/{baz=123}")}. If a parameter 
with a default value is missing
  * from a request URL, it will still be made available as a request parameter 
with the default
  * value. Default values are automatically embedded when building URLs with 
the Stripes JSP tags.
- * The default value for $event can be automatically determined from the 
[EMAIL PROTECTED] DefaultHandler}
- * annotation or it can be explicitly set like any other parameter.
+ * The default value for $event is determined from the [EMAIL PROTECTED] 
DefaultHandler} and may not be set in
+ * the [EMAIL PROTECTED] @UrlBinding}.
  * </p>
  * <p>
  * Clean URLs support both prefix mapping ([EMAIL PROTECTED] 
/action/foo/{bar}}) and extension mapping ([EMAIL PROTECTED] 
/foo/{bar}.action}).

Modified: 
trunk/stripes/src/net/sourceforge/stripes/controller/StripesRequestWrapper.java
===================================================================
--- 
trunk/stripes/src/net/sourceforge/stripes/controller/StripesRequestWrapper.java 
    2008-02-07 04:20:53 UTC (rev 846)
+++ 
trunk/stripes/src/net/sourceforge/stripes/controller/StripesRequestWrapper.java 
    2008-02-08 03:20:20 UTC (rev 847)
@@ -462,9 +462,20 @@
                 if (name != null) {
                     String value = p.getValue();
                     if (UrlBindingParameter.PARAMETER_NAME_EVENT.equals(name)) 
{
-                        name = value;
-                        value = "";
+                        if (value == null) {
+                            // Don't provide the default event name. The 
dispatcher will handle that
+                            // automatically, and there's no way of knowing at 
this point if another
+                            // event name is provided by a different parameter.
+                            continue;
+                        }
+                        else {
+                            name = value;
+                            value = "";
+                        }
                     }
+                    if (value == null) {
+                        value = p.getDefaultValue();
+                    }
                     if (name != null && value != null) {
                         if (params == null) {
                             params = new LinkedHashMap<String, String[]>();

Modified: 
trunk/stripes/src/net/sourceforge/stripes/controller/UrlBindingFactory.java
===================================================================
--- trunk/stripes/src/net/sourceforge/stripes/controller/UrlBindingFactory.java 
2008-02-07 04:20:53 UTC (rev 846)
+++ trunk/stripes/src/net/sourceforge/stripes/controller/UrlBindingFactory.java 
2008-02-08 03:20:20 UTC (rev 847)
@@ -366,9 +366,9 @@
         // handle whatever is left
         if (buf.length() > 0) {
             if (escape)
-                throw new ParseException("Expression must not end with escape 
character", pattern);
+                throw new ParseException(pattern, "Expression must not end 
with escape character");
             else if (braceLevel > 0)
-                throw new ParseException("Unterminated left brace ('{') in 
expression", pattern);
+                throw new ParseException(pattern, "Unterminated left brace 
('{') in expression");
             else if (path == null)
                 path = buf.toString();
             else if (c == '}')
@@ -388,6 +388,7 @@
      * @param beanClass the bean class to which the binding applies
      * @param string the parameter string
      * @return a parameter object
+     * @throws ParseException if the pattern cannot be parsed
      */
     protected static UrlBindingParameter parseUrlBindingParameter(
             Class<? extends ActionBean> beanClass, String string) {
@@ -415,6 +416,12 @@
         }
 
         String dflt = defaultValue.length() < 1 ? null : 
defaultValue.toString();
+        if (dflt != null && 
UrlBindingParameter.PARAMETER_NAME_EVENT.equals(name.toString())) {
+            throw new ParseException(string, "In ActionBean class " + 
beanClass.getName()
+                    + ", the " + UrlBindingParameter.PARAMETER_NAME_EVENT
+                    + " parameter may not be assigned a default value. Its 
default value is"
+                    + " determined by the @DefaultHandler annotation.");
+        }
         return new UrlBindingParameter(beanClass, name.toString(), null, dflt) 
{
             @Override
             public String getValue() {

Modified: 
trunk/stripes/src/net/sourceforge/stripes/controller/UrlBindingParameter.java
===================================================================
--- 
trunk/stripes/src/net/sourceforge/stripes/controller/UrlBindingParameter.java   
    2008-02-07 04:20:53 UTC (rev 846)
+++ 
trunk/stripes/src/net/sourceforge/stripes/controller/UrlBindingParameter.java   
    2008-02-08 03:20:20 UTC (rev 847)
@@ -85,8 +85,7 @@
     }
 
     /**
-     * Get the parameter's default value. This value will be returned by 
[EMAIL PROTECTED] #getValue()} if the
-     * parameter's actual value is null. The default value may be null.
+     * Get the parameter's default value, which may be null.
      * 
      * @return the default value
      */
@@ -120,13 +119,12 @@
     }
 
     /**
-     * Return the parameter value that was extracted from a URI. If the value 
is null, then the
-     * default value will be returned.
+     * Return the parameter value that was extracted from a URI.
      * 
      * @return parameter value
      */
     public String getValue() {
-        return value == null ? defaultValue : value;
+        return value;
     }
 
     @Override

Modified: trunk/stripes/src/net/sourceforge/stripes/util/UrlBuilder.java
===================================================================
--- trunk/stripes/src/net/sourceforge/stripes/util/UrlBuilder.java      
2008-02-07 04:20:53 UTC (rev 846)
+++ trunk/stripes/src/net/sourceforge/stripes/util/UrlBuilder.java      
2008-02-08 03:20:20 UTC (rev 847)
@@ -402,8 +402,12 @@
             boolean seenQuestionMark = buffer.indexOf("?") != -1;
             for (Parameter param : parameters) {
                 // special handling for event parameter
-                if (param == this.event)
-                    param = new Parameter((String) this.event.value, "");
+                if (param == this.event) {
+                    if (param.value == null)
+                        continue;
+                    else
+                        param = new Parameter((String) this.event.value, "");
+                }
 
                 // Figure out whether we already have params or not
                 if (!seenQuestionMark) {
@@ -504,7 +508,7 @@
                         ok = true;
                     }
                 }
-                else if (assigned.isEvent()) {
+                else if (assigned != null && assigned.isEvent()) {
                     // remove event parameter even if value is null
                     parameters.remove(assigned);
                 }


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Stripes-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-development

Reply via email to