Author: ivaynberg
Date: Tue Jul 17 10:32:53 2007
New Revision: 556985

URL: http://svn.apache.org/viewvc?view=rev&rev=556985
Log:
WICKET-765 fix invalid page map name url encoding

Modified:
    
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/PageMap.java
    
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java
    
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/RequestParameters.java
    
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/basic/URIRequestTargetUrlCodingStrategy.java
    
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/AbstractRequestTargetUrlCodingStrategy.java
    
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java
    
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/IndexedParamUrlCodingStrategy.java
    
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/PackageRequestTargetUrlCodingStrategy.java

Modified: 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/PageMap.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/PageMap.java?view=diff&rev=556985&r1=556984&r2=556985
==============================================================================
--- 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/PageMap.java
 (original)
+++ 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/PageMap.java
 Tue Jul 17 10:32:53 2007
@@ -84,6 +84,10 @@
         */
        public PageMap(String name)
        {
+               if ("".equals(name))
+               {
+                       throw new IllegalStateException("Empty string name for 
pagemaps is not allowed");
+               }
                this.name = name;
        }
 
@@ -243,7 +247,7 @@
                setUpRedirect(cycle);
                cycle.setResponsePage(page);
        }
-       
+
        private void setUpRedirect(final RequestCycle cycle)
        {
                Session session = Session.get();
@@ -254,8 +258,8 @@
 
                // The intercept continuation URL should be saved exactly as the
                // original request specified.
-                interceptContinuationURL = "/" + cycle.getRequest().getURL();
-               
+               interceptContinuationURL = "/" + cycle.getRequest().getURL();
+
                // Page map is dirty
                dirty();
 

Modified: 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985
==============================================================================
--- 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java
 (original)
+++ 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java
 Tue Jul 17 10:32:53 2007
@@ -78,6 +78,16 @@
        /** Pagemap parameter constant */
        public static final String PAGEMAP = NAME_SPACE + "pageMapName";
 
+       /**
+        * Url name of the default pagemap
+        * 
+        * When we encode the default pagemap name in a url we cannot always use
+        * null or "" because it breaks urls which are encoded with 
/param1/value1/
+        * eg /product/14/wicket:pageMapName/ split on / will split into
+        * {product,14,wicket:pageMapName}
+        */
+       public static final String DEFAULT_PAGEMAP_NAME = "wicketdef";
+
        /** The URL path prefix expected for (so called) resources (not html 
pages). */
        public static final String RESOURCES_PATH_PREFIX = "resources/";
 
@@ -87,8 +97,8 @@
         * this parameter is not important, it simply has to be present to 
enable
         * the behavior
         */
-       public static final String IGNORE_IF_NOT_ACTIVE_PARAMETER_NAME = 
NAME_SPACE
-                       + "ignoreIfNotActive";
+       public static final String IGNORE_IF_NOT_ACTIVE_PARAMETER_NAME = 
NAME_SPACE +
+                       "ignoreIfNotActive";
 
        /**
         * Various settings used to configure this strategy
@@ -181,7 +191,8 @@
                final RequestParameters parameters = new RequestParameters();
                final String pathInfo = getRequestPath(request);
                parameters.setPath(pathInfo);
-               parameters.setPageMapName(request.getParameter(PAGEMAP));
+               
parameters.setPageMapName(WebRequestCodingStrategy.decodePageMapName(request
+                               .getParameter(PAGEMAP)));
                addInterfaceParameters(request, parameters);
                addBookmarkablePageParameters(request, parameters);
                addResourceParameters(request, parameters);
@@ -337,8 +348,8 @@
 
                if (mountsOnPath.strategyForMount(path) != null)
                {
-                       throw new WicketRuntimeException(path + " is already 
mounted for "
-                                       + mountsOnPath.strategyForMount(path));
+                       throw new WicketRuntimeException(path + " is already 
mounted for " +
+                                       mountsOnPath.strategyForMount(path));
                }
                mountsOnPath.mount(path, encoder);
        }
@@ -414,8 +425,8 @@
                        final String[] components = 
Strings.split(requestString, Component.PATH_SEPARATOR);
                        if (components.length != 2)
                        {
-                               throw new WicketRuntimeException("Invalid 
bookmarkablePage parameter: "
-                                               + requestString + ", expected: 
'pageMapName:pageClassName'");
+                               throw new WicketRuntimeException("Invalid 
bookmarkablePage parameter: " +
+                                               requestString + ", expected: 
'pageMapName:pageClassName'");
                        }
 
                        // Extract any pagemap name
@@ -474,8 +485,8 @@
                // 
pagemap:(pageid:componenta:componentb:...):version:interface:behavior:depth
                if (pathComponents.length < 6)
                {
-                       throw new WicketRuntimeException("Internal error 
parsing " + INTERFACE_PARAMETER_NAME
-                                       + " = " + interfaceParameter);
+                       throw new WicketRuntimeException("Internal error 
parsing " + INTERFACE_PARAMETER_NAME +
+                                       " = " + interfaceParameter);
                }
 
                // Extract version
@@ -489,10 +500,10 @@
                }
                catch (NumberFormatException e)
                {
-                       throw new WicketRuntimeException("Internal error 
parsing " + INTERFACE_PARAMETER_NAME
-                                       + " = " + interfaceParameter
-                                       + "; wrong format for page version 
argument. Expected a number but was '"
-                                       + versionNumberString + "'", e);
+                       throw new WicketRuntimeException("Internal error 
parsing " + INTERFACE_PARAMETER_NAME +
+                                       " = " + interfaceParameter +
+                                       "; wrong format for page version 
argument. Expected a number but was '" +
+                                       versionNumberString + "'", e);
                }
 
                // Set pagemap name
@@ -517,8 +528,8 @@
 
                // Component path is everything after pageMapName and before 
version
                final int start = pageMapName.length() + 1;
-               final int end = interfaceParameter.length() - 
behaviourId.length() - interfaceName.length()
-                               - versionNumberString.length() - 
urlDepthString.length() - 4;
+               final int end = interfaceParameter.length() - 
behaviourId.length() -
+                               interfaceName.length() - 
versionNumberString.length() - urlDepthString.length() - 4;
                final String componentPath = 
interfaceParameter.substring(start, end);
                parameters.setComponentPath(componentPath);
        }
@@ -630,9 +641,9 @@
                }
 
                WebRequestEncoder encoder = new WebRequestEncoder(url);
-               if (!application.getHomePage().equals(pageClass)
-                               || !"".equals(pageMapName)
-                               || (application.getHomePage().equals(pageClass) 
&& requestTarget instanceof BookmarkableListenerInterfaceRequestTarget))
+               if (!application.getHomePage().equals(pageClass) ||
+                               !"".equals(pageMapName) ||
+                               (application.getHomePage().equals(pageClass) && 
requestTarget instanceof BookmarkableListenerInterfaceRequestTarget))
                {
                        /*
                         * Add <page-map-name>:<bookmarkable-page-class>
@@ -645,8 +656,8 @@
                         * because we can't rely on the browser to interpret 
the unencoded
                         * url correctly.
                         */
-                       
encoder.addValue(WebRequestCodingStrategy.BOOKMARKABLE_PAGE_PARAMETER_NAME, 
pageMapName
-                                       + Component.PATH_SEPARATOR + 
pageClass.getName());
+                       
encoder.addValue(WebRequestCodingStrategy.BOOKMARKABLE_PAGE_PARAMETER_NAME,
+                                       pageMapName + Component.PATH_SEPARATOR 
+ pageClass.getName());
                }
 
                // Get page parameters
@@ -1029,5 +1040,48 @@
                                }
                        }
                };
+       }
+
+       /**
+        * Makes page map name url safe.
+        * 
+        * Since the default page map name in wicket is null and null does not
+        * encode well into urls this method will substitute null for a known 
token.
+        * If the <code>pageMapName</code> passed in is not null it is returned
+        * without modification.
+        * 
+        * @param pageMapName
+        *            page map name
+        * @return encoded pagemap name
+        */
+       public static final String encodePageMapName(String pageMapName)
+       {
+               if (Strings.isEmpty(pageMapName))
+               {
+                       return DEFAULT_PAGEMAP_NAME;
+               }
+               else
+               {
+                       return pageMapName;
+               }
+       }
+
+       /**
+        * Undoes the effect of [EMAIL PROTECTED] #encodePageMapName(String)}
+        * 
+        * @param pageMapName
+        *            page map name
+        * @return decoded page map name
+        */
+       public static String decodePageMapName(String pageMapName)
+       {
+               if (DEFAULT_PAGEMAP_NAME.equals(pageMapName))
+               {
+                       return null;
+               }
+               else
+               {
+                       return pageMapName;
+               }
        }
 }

Modified: 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/RequestParameters.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/RequestParameters.java?view=diff&rev=556985&r1=556984&r2=556985
==============================================================================
--- 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/RequestParameters.java
 (original)
+++ 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/RequestParameters.java
 Tue Jul 17 10:32:53 2007
@@ -37,8 +37,8 @@
  * <p>
  * Though this object can be extended and hence more parameter options can be
  * used, anything other than in this implementation must be supported by
- * specific [EMAIL PROTECTED] 
org.apache.wicket.request.IRequestCycleProcessor} implementations and
- * thus are not supported by default implementations.
+ * specific [EMAIL PROTECTED] org.apache.wicket.request.IRequestCycleProcessor}
+ * implementations and thus are not supported by default implementations.
  * </p>
  * 
  * @author Eelco Hillenius
@@ -81,7 +81,7 @@
 
        /** the path info. */
        private String path;
-       
+
        /** depth of the page for relative URLs. */
        private int urlDepth = -1;
 
@@ -289,7 +289,9 @@
         */
        public void setPageMapName(String pageMapName)
        {
-               this.pageMapName = pageMapName;
+               // this should be done in coding strategies, but its here as a
+               // precaution
+               this.pageMapName = 
WebRequestCodingStrategy.decodePageMapName(pageMapName);
        }
 
        /**
@@ -336,7 +338,7 @@
        {
                this.versionNumber = versionNumber;
        }
-       
+
        /**
         * Gets the depth for relative URLs. Used in AJAX requests.
         * 
@@ -350,7 +352,9 @@
        /**
         * Sets the depth for relative URLs. Used in AJAX requests.
         * 
-        * @param urlDepth Number of slashes deep the page is that an AJAX 
request is made from.
+        * @param urlDepth
+        *            Number of slashes deep the page is that an AJAX request is
+        *            made from.
         */
        public void setUrlDepth(int urlDepth)
        {

Modified: 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/basic/URIRequestTargetUrlCodingStrategy.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/basic/URIRequestTargetUrlCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985
==============================================================================
--- 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/basic/URIRequestTargetUrlCodingStrategy.java
 (original)
+++ 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/basic/URIRequestTargetUrlCodingStrategy.java
 Tue Jul 17 10:32:53 2007
@@ -92,8 +92,8 @@
        {
                if (!(requestTarget instanceof IBookmarkablePageRequestTarget))
                {
-                       throw new IllegalArgumentException("This encoder can 
only be used with "
-                                       + "instances of " + 
IBookmarkablePageRequestTarget.class.getName());
+                       throw new IllegalArgumentException("This encoder can 
only be used with " +
+                                       "instances of " + 
IBookmarkablePageRequestTarget.class.getName());
                }
                final AppendingStringBuffer url = new AppendingStringBuffer(40);
                url.append(getMountPath());
@@ -107,7 +107,8 @@
                        {
                                pageParameters = new PageParameters();
                        }
-                       pageParameters.put(WebRequestCodingStrategy.PAGEMAP, 
pagemap);
+                       pageParameters.put(WebRequestCodingStrategy.PAGEMAP, 
WebRequestCodingStrategy
+                                       .encodePageMapName(pagemap));
                }
                appendParameters(url, pageParameters);
                return url;

Modified: 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/AbstractRequestTargetUrlCodingStrategy.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/AbstractRequestTargetUrlCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985
==============================================================================
--- 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/AbstractRequestTargetUrlCodingStrategy.java
 (original)
+++ 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/AbstractRequestTargetUrlCodingStrategy.java
 Tue Jul 17 10:32:53 2007
@@ -45,7 +45,8 @@
                        IMountableRequestTargetUrlCodingStrategy
 {
        /** log. */
-       private static final Logger log = 
LoggerFactory.getLogger(AbstractRequestTargetUrlCodingStrategy.class);
+       private static final Logger log = LoggerFactory
+                       
.getLogger(AbstractRequestTargetUrlCodingStrategy.class);
 
        /** mounted path. */
        private final String mountPath;
@@ -122,7 +123,7 @@
                        }
                }
        }
-       
+
        private void appendValue(AppendingStringBuffer url, String key, String 
value)
        {
                String escapedValue = urlEncode(value);
@@ -162,8 +163,8 @@
                if (pairs.length % 2 != 0)
                {
                        // give up
-                       throw new IllegalStateException("URL fragment has 
unmatched key/value " + "pair: "
-                                       + urlFragment);
+                       throw new IllegalStateException("URL fragment has 
unmatched key/value " + "pair: " +
+                                       urlFragment);
                }
 
                // Loop through pairs

Modified: 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985
==============================================================================
--- 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java
 (original)
+++ 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java
 Tue Jul 17 10:32:53 2007
@@ -37,7 +37,7 @@
                        AbstractRequestTargetUrlCodingStrategy
 {
        /** bookmarkable page class. */
-       protected final WeakReference/*<Class>*/ bookmarkablePageClassRef;
+       protected final WeakReference/* <Class> */bookmarkablePageClassRef;
 
        /** page map name. */
        private final String pageMapName;
@@ -75,7 +75,8 @@
                                getMountPath().length());
                final PageParameters parameters = new 
PageParameters(decodeParameters(parametersFragment,
                                requestParameters.getParameters()));
-               String pageMapName = 
(String)parameters.remove(WebRequestCodingStrategy.PAGEMAP);
+               String pageMapName = 
WebRequestCodingStrategy.decodePageMapName((String)parameters
+                               .remove(WebRequestCodingStrategy.PAGEMAP));
                if (requestParameters.getPageMapName() == null)
                {
                        requestParameters.setPageMapName(pageMapName);
@@ -95,12 +96,13 @@
                {
                        
WebRequestCodingStrategy.addInterfaceParameters(interfaceParameter, 
requestParameters);
                        return new 
BookmarkableListenerInterfaceRequestTarget(pageMapName,
-                                       (Class)bookmarkablePageClassRef.get(), 
parameters, requestParameters.getComponentPath(),
-                                       requestParameters.getInterfaceName());
+                                       (Class)bookmarkablePageClassRef.get(), 
parameters, requestParameters
+                                                       .getComponentPath(), 
requestParameters.getInterfaceName());
                }
                else
                {
-                       return new BookmarkablePageRequestTarget(pageMapName, 
(Class)bookmarkablePageClassRef.get(), parameters);
+                       return new BookmarkablePageRequestTarget(pageMapName, 
(Class)bookmarkablePageClassRef
+                                       .get(), parameters);
                }
        }
 
@@ -111,8 +113,8 @@
        {
                if (!(requestTarget instanceof IBookmarkablePageRequestTarget))
                {
-                       throw new IllegalArgumentException("This encoder can 
only be used with "
-                                       + "instances of " + 
IBookmarkablePageRequestTarget.class.getName());
+                       throw new IllegalArgumentException("This encoder can 
only be used with " +
+                                       "instances of " + 
IBookmarkablePageRequestTarget.class.getName());
                }
                final AppendingStringBuffer url = new AppendingStringBuffer(40);
                url.append(getMountPath());
@@ -126,7 +128,8 @@
                        {
                                pageParameters = new PageParameters();
                        }
-                       pageParameters.put(WebRequestCodingStrategy.PAGEMAP, 
pagemap);
+                       pageParameters.put(WebRequestCodingStrategy.PAGEMAP, 
WebRequestCodingStrategy
+                                       .encodePageMapName(pagemap));
                }
                appendParameters(url, pageParameters);
                return url;

Modified: 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/IndexedParamUrlCodingStrategy.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/IndexedParamUrlCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985
==============================================================================
--- 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/IndexedParamUrlCodingStrategy.java
 (original)
+++ 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/IndexedParamUrlCodingStrategy.java
 Tue Jul 17 10:32:53 2007
@@ -84,6 +84,7 @@
                if (pageMap != null)
                {
                        i++;
+                       pageMap = 
WebRequestCodingStrategy.encodePageMapName(pageMap);
                        
url.append("/").append(WebRequestCodingStrategy.PAGEMAP).append("/").append(
                                        urlEncode(pageMap));
                }
@@ -91,8 +92,8 @@
                if (i != parameters.size())
                {
                        throw new WicketRuntimeException(
-                                       "Not all parameters were encoded. Make 
sure all parameter names are integers in consecutive order starting with zero. 
Current parameter names are: "
-                                                       + 
parameters.keySet().toString());
+                                       "Not all parameters were encoded. Make 
sure all parameter names are integers in consecutive order starting with zero. 
Current parameter names are: " +
+                                                       
parameters.keySet().toString());
                }
        }
 
@@ -114,7 +115,8 @@
                        if (WebRequestCodingStrategy.PAGEMAP.equals(parts[i]))
                        {
                                i++;
-                               params.put(WebRequestCodingStrategy.PAGEMAP, 
urlDecode(parts[i]));
+                               params.put(WebRequestCodingStrategy.PAGEMAP, 
WebRequestCodingStrategy
+                                               
.decodePageMapName(urlDecode(parts[i])));
                        }
                        else
                        {

Modified: 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/PackageRequestTargetUrlCodingStrategy.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/PackageRequestTargetUrlCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985
==============================================================================
--- 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/PackageRequestTargetUrlCodingStrategy.java
 (original)
+++ 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/PackageRequestTargetUrlCodingStrategy.java
 Tue Jul 17 10:32:53 2007
@@ -99,11 +99,12 @@
                {
                        log.debug(e.getMessage());
                        return null;
-               }               
+               }
                PageParameters parameters = new 
PageParameters(decodeParameters(parametersFragment,
                                requestParameters.getParameters()));
 
-               final String pageMapName = 
(String)parameters.remove(WebRequestCodingStrategy.PAGEMAP);
+               String pageMapName = 
(String)parameters.remove(WebRequestCodingStrategy.PAGEMAP);
+               pageMapName = 
WebRequestCodingStrategy.decodePageMapName(pageMapName);
                requestParameters.setPageMapName(pageMapName);
 
                // do some extra work for checking whether this is a normal 
request to a
@@ -132,8 +133,8 @@
        {
                if (!(requestTarget instanceof IBookmarkablePageRequestTarget))
                {
-                       throw new IllegalArgumentException("this encoder can 
only be used with instances of "
-                                       + 
IBookmarkablePageRequestTarget.class.getName());
+                       throw new IllegalArgumentException("this encoder can 
only be used with instances of " +
+                                       
IBookmarkablePageRequestTarget.class.getName());
                }
                AppendingStringBuffer url = new AppendingStringBuffer(40);
                url.append(getMountPath());
@@ -143,7 +144,8 @@
                PageParameters pageParameters = target.getPageParameters();
                if (target.getPageMapName() != null)
                {
-                       pageParameters.put(WebRequestCodingStrategy.PAGEMAP, 
target.getPageMapName());
+                       pageParameters.put(WebRequestCodingStrategy.PAGEMAP, 
WebRequestCodingStrategy
+                                       
.encodePageMapName(target.getPageMapName()));
                }
 
                appendParameters(url, pageParameters);


Reply via email to