Author: jcompagner
Date: Mon May 19 14:08:31 2008
New Revision: 657980

URL: http://svn.apache.org/viewvc?rev=657980&view=rev
Log:
WICKET-1643 Bookmarkable / Stateless form submit bug
Fix when the stateless form is mounted then the interface paramters can come in 
differently

Modified:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java?rev=657980&r1=657979&r2=657980&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java
 Mon May 19 14:08:31 2008
@@ -32,9 +32,8 @@
  * 
  * @author Eelco Hillenius
  */
-public class BookmarkablePageRequestTargetUrlCodingStrategy
-               extends
-                       AbstractRequestTargetUrlCodingStrategy
+public class BookmarkablePageRequestTargetUrlCodingStrategy extends
+       AbstractRequestTargetUrlCodingStrategy
 {
        /** bookmarkable page class. */
        protected final WeakReference/* <Class> */bookmarkablePageClassRef;
@@ -53,7 +52,7 @@
         *            the page map name if any
         */
        public BookmarkablePageRequestTargetUrlCodingStrategy(final String 
mountPath,
-                       final Class bookmarkablePageClass, String pageMapName)
+               final Class bookmarkablePageClass, String pageMapName)
        {
                super(mountPath);
 
@@ -72,38 +71,48 @@
        public IRequestTarget decode(RequestParameters requestParameters)
        {
                final String parametersFragment = 
requestParameters.getPath().substring(
-                               getMountPath().length());
+                       getMountPath().length());
                final PageParameters parameters = new 
PageParameters(decodeParameters(parametersFragment,
-                               requestParameters.getParameters()));
-               String pageMapName = 
WebRequestCodingStrategy.decodePageMapName((String)parameters
-                               .remove(WebRequestCodingStrategy.PAGEMAP));
-               if (requestParameters.getPageMapName() == null)
-               {
-                       requestParameters.setPageMapName(pageMapName);
-               }
-               else
-               {
-                       pageMapName = requestParameters.getPageMapName();
-               }
+                       requestParameters.getParameters()));
 
                // do some extra work for checking whether this is a normal 
request to a
                // bookmarkable page, or a request to a stateless page (in 
which case a
                // wicket:interface parameter should be available
-               final String interfaceParameter = (String)parameters
-                               
.remove(WebRequestCodingStrategy.INTERFACE_PARAMETER_NAME);
 
-               if (interfaceParameter != null)
+               // the page map name can be defined already by logic done in
+               // WebRequestCodingStrategy.decode(),
+               // but it could also be done by the decodeParameters() call
+               // So we always remove the pagemap parameter just in case.
+               String pageMapNameEncoded = 
(String)parameters.remove(WebRequestCodingStrategy.PAGEMAP);
+               if (requestParameters.getPageMapName() == null)
+               {
+                       requestParameters.setPageMapName(pageMapNameEncoded);
+               }
+
+               // the interface can be defined already by logic done in
+               // WebRequestCodingStrategy.decode(),
+               // but it could also be done by the decodeParameters() call
+               // So we always remove the interface parameter just in case.
+               String interfaceParameter = 
(String)parameters.remove(WebRequestCodingStrategy.INTERFACE_PARAMETER_NAME);
+               if (requestParameters.getInterfaceName() == null)
                {
                        
WebRequestCodingStrategy.addInterfaceParameters(interfaceParameter, 
requestParameters);
-                       return new 
BookmarkableListenerInterfaceRequestTarget(pageMapName,
-                                       (Class)bookmarkablePageClassRef.get(), 
parameters, requestParameters
-                                                       .getComponentPath(), 
requestParameters.getInterfaceName(),
-                                       requestParameters.getVersionNumber());
                }
+
+               // if an interface name was set prior to this method or in the
+               // above block, process it
+               if (requestParameters.getInterfaceName() != null)
+               {
+                       return new BookmarkableListenerInterfaceRequestTarget(
+                               requestParameters.getPageMapName(), 
(Class)bookmarkablePageClassRef.get(),
+                               parameters, 
requestParameters.getComponentPath(),
+                               requestParameters.getInterfaceName(), 
requestParameters.getVersionNumber());
+               }
+               // otherwise process as a normal bookmark page request
                else
                {
-                       return new BookmarkablePageRequestTarget(pageMapName, 
(Class)bookmarkablePageClassRef
-                                       .get(), parameters);
+                       return new 
BookmarkablePageRequestTarget(requestParameters.getPageMapName(),
+                               (Class)bookmarkablePageClassRef.get(), 
parameters);
                }
        }
 
@@ -115,7 +124,7 @@
                if (!(requestTarget instanceof IBookmarkablePageRequestTarget))
                {
                        throw new IllegalArgumentException("This encoder can 
only be used with " +
-                                       "instances of " + 
IBookmarkablePageRequestTarget.class.getName());
+                               "instances of " + 
IBookmarkablePageRequestTarget.class.getName());
                }
                final AppendingStringBuffer url = new AppendingStringBuffer(40);
                url.append(getMountPath());
@@ -129,8 +138,8 @@
                        {
                                pageParameters = new PageParameters();
                        }
-                       pageParameters.put(WebRequestCodingStrategy.PAGEMAP, 
WebRequestCodingStrategy
-                                       .encodePageMapName(pagemap));
+                       pageParameters.put(WebRequestCodingStrategy.PAGEMAP,
+                               
WebRequestCodingStrategy.encodePageMapName(pagemap));
                }
                appendParameters(url, pageParameters);
                return url;
@@ -162,6 +171,7 @@
        /**
         * @see java.lang.Object#toString()
         */
+       @Override
        public String toString()
        {
                return "BookmarkablePageEncoder[page=" + 
bookmarkablePageClassRef.get() + "]";


Reply via email to