Author: ivaynberg
Date: Thu Oct 14 06:06:37 2010
New Revision: 1022384

URL: http://svn.apache.org/viewvc?rev=1022384&view=rev
Log:

Issue: WICKET-3086

Added:
    
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/lang/Checks.java  
 (with props)
Modified:
    
wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/requestmapper/LocaleFirstMapper.java
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Request.java
    wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/CompoundRequestMapper.java
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/ParentPathReferenceRewriter.java
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/MountMapper.java
    
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/mock/MockWebRequest.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequest.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/RenderPageRequestHandler.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/AbstractMapperTest.java
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java

Modified: 
wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/requestmapper/LocaleFirstMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/requestmapper/LocaleFirstMapper.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/requestmapper/LocaleFirstMapper.java
 (original)
+++ 
wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/requestmapper/LocaleFirstMapper.java
 Thu Oct 14 06:06:37 2010
@@ -77,7 +77,7 @@ public class LocaleFirstMapper extends A
                                url.getSegments().remove(0);
 
                                // create a request based on the new url
-                               request = request.requestWithUrl(url);
+                               request = request.cloneWithUrl(url);
                        }
                }
 

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Request.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Request.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Request.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Request.java
 Thu Oct 14 06:06:37 2010
@@ -38,7 +38,22 @@ public abstract class Request
        public abstract Url getUrl();
 
        /**
-        * In case this request has been created using {...@link 
#requestWithUrl(Url)}, this method should
+        * Returns the base URL relative to which this request should be 
processed.
+        * 
+        * If the current requested url is:
+        * 
+        * <pre>
+        * /con/text/fil/ter/wicket/page?1&foo=bar
+        * </pre>
+        * 
+        * the relative url is: </pre> wicket/page </pre>
+        * 
+        * @return ajax base url
+        */
+       public abstract Url getBaseUrl();
+
+       /**
+        * In case this request has been created using {...@link 
#cloneWithUrl(Url)}, this method should
         * return the original URL.
         * 
         * @return original URL
@@ -86,7 +101,7 @@ public abstract class Request
         *            Url instance
         * @return request with specified URL.
         */
-       public Request requestWithUrl(final Url url)
+       public Request cloneWithUrl(final Url url)
        {
                return new Request()
                {
@@ -119,6 +134,12 @@ public abstract class Request
                        {
                                return Request.this.getCharset();
                        }
+
+                       @Override
+                       public Url getBaseUrl()
+                       {
+                               return getUrl();
+                       }
                };
        }
 

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java 
(original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java 
Thu Oct 14 06:06:37 2010
@@ -257,6 +257,18 @@ public final class Url implements Serial
                setCharset(charset);
        }
 
+       public void resolveRelativeTo(Url base)
+       {
+               Url url = new Url(base);
+
+               while (!getSegments().isEmpty() && 
"..".equals(getSegments().get(0)))
+               {
+                       removeLeadingSegments(0);
+                       url.getSegments().remove(url.getSegments().size() - 1);
+               }
+               getSegments().addAll(url.getSegments());
+       }
+
        /**
         * Returns segments of the URL. Segments form the part before query 
string.
         * 
@@ -701,4 +713,54 @@ public final class Url implements Serial
                        return result.toString();
                }
        }
+
+       /**
+        * Makes this url the result of resolving the {...@code relative} url 
against this url.
+        * <p>
+        * Segments will be properly resolved, handling any {...@code ..} 
references, while the query
+        * parameters will be completely replaced with {...@code relative}'s 
query parameters.
+        * </p>
+        * <p>
+        * For example:
+        * 
+        * <pre>
+        * wicket/page/render?foo=bar
+        * </pre>
+        * 
+        * resolved with
+        * 
+        * <pre>
+        * ../component/render?a=b
+        * </pre>
+        * 
+        * will become
+        * 
+        * <pre>
+        * wicket/component/render?a=b
+        * </pre>
+        * 
+        * </p>
+        * 
+        * @param relative
+        *            relative url
+        */
+       public void resolveRelative(Url relative)
+       {
+               // strip the first non-folder segment
+               getSegments().remove(getSegments().size() - 1);
+
+               // process any ../ segments in the relative url
+               while (!relative.getSegments().isEmpty() && 
"".equals(relative.getSegments().get(0)))
+               {
+                       relative.getSegments().remove(0);
+                       getSegments().remove(getSegments().size() - 1);
+               }
+
+               // append the remaining relative segments
+               getSegments().addAll(relative.getSegments());
+
+               // replace query params with the ones from relative
+               parameters.clear();
+               parameters.addAll(relative.getQueryParameters());
+       }
 }

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
 Thu Oct 14 06:06:37 2010
@@ -33,9 +33,19 @@ import org.apache.wicket.util.string.Str
  * Base class for request that provides additional web-related information.
  * 
  * @author Matej Knopp
+ * @author Igor Vaynberg
  */
 public abstract class WebRequest extends Request
 {
+       /** marker for Ajax requests */
+       protected static final String PARAM_AJAX = "wicket-ajax";
+       /** marker for Ajax requests */
+       protected static final String HEADER_AJAX = "Wicket-Ajax";
+       /** marker for Ajax-relative url */
+       protected static final String PARAM_AJAX_BASE_URL = 
"wicket-ajax-baseurl";
+       /** marker for Ajax-relative url */
+       protected static final String HEADER_AJAX_BASE_URL = 
"Wicket-Ajax-BaseURL";
+
        /**
         * @return request cookies
         */
@@ -101,15 +111,11 @@ public abstract class WebRequest extends
                }
        }
 
-       /**
-        * Marker parameter for AjaxRequest.
-        */
-       private static final String PARAM_AJAX = "wicket:ajax";
-       private static final String HEADER_AJAX = "Wicket-Ajax";
 
        /**
-        * Returns whether this request is an Ajax request. This implementation 
only checks for value of
-        * wicket:ajax url parameter. Subclasses can use other approach.
+        * Returns whether this request is an Ajax request. This implementation 
checks for values of
+        * {...@value #PARAM_AJAX} url parameter or the {...@value 
#HEADER_AJAX} header. Subclasses can use
+        * other approaches.
         * 
         * @return <code>true</code> if this request is an ajax request, 
<code>false</code> otherwise.
         */
@@ -127,7 +133,7 @@ public abstract class WebRequest extends
         * @return request with specified URL.
         */
        @Override
-       public WebRequest requestWithUrl(final Url url)
+       public WebRequest cloneWithUrl(final Url url)
        {
                return new WebRequest()
                {
@@ -178,6 +184,12 @@ public abstract class WebRequest extends
                        {
                                return WebRequest.this.getCharset();
                        }
+
+                       @Override
+                       public Url getBaseUrl()
+                       {
+                               return WebRequest.this.getBaseUrl();
+                       }
                };
        }
 

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java
 Thu Oct 14 06:06:37 2010
@@ -118,7 +118,7 @@ public abstract class AbstractMapper
                        removeMetaParameter(urlCopy);
                }
 
-               PageParameters decoded = 
encoder.decodePageParameters(request.requestWithUrl(urlCopy));
+               PageParameters decoded = 
encoder.decodePageParameters(request.cloneWithUrl(urlCopy));
                return decoded;
        }
 

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/CompoundRequestMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/CompoundRequestMapper.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/CompoundRequestMapper.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/CompoundRequestMapper.java
 Thu Oct 14 06:06:37 2010
@@ -118,7 +118,8 @@ public class CompoundRequestMapper imple
 
                for (IRequestMapper encoder : mappers)
                {
-                       list.add(new EncoderWithSegmentsCount(encoder, 
encoder.getCompatibilityScore(request)));
+                       int score = encoder.getCompatibilityScore(request);
+                       list.add(new EncoderWithSegmentsCount(encoder, score));
                }
 
                Collections.sort(list);

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/ParentPathReferenceRewriter.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/ParentPathReferenceRewriter.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/ParentPathReferenceRewriter.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/ParentPathReferenceRewriter.java
 Thu Oct 14 06:06:37 2010
@@ -79,7 +79,7 @@ public class ParentPathReferenceRewriter
                        }
                }
 
-               return chain.mapRequest(request.requestWithUrl(url));
+               return chain.mapRequest(request.cloneWithUrl(url));
        }
 
        /**

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/MountMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/MountMapper.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/MountMapper.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/MountMapper.java
 Thu Oct 14 06:06:37 2010
@@ -103,7 +103,7 @@ public class MountMapper extends Abstrac
        {
                Url dismountedUrl = new Url(request.getUrl());
                dismountedUrl.removeLeadingSegments(mountSegments.length);
-               return request.requestWithUrl(dismountedUrl);
+               return request.cloneWithUrl(dismountedUrl);
        }
 
        /**

Added: 
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/lang/Checks.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/lang/Checks.java?rev=1022384&view=auto
==============================================================================
--- 
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/lang/Checks.java 
(added)
+++ 
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/lang/Checks.java 
Thu Oct 14 06:06:37 2010
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.wicket.util.lang;
+
+import org.apache.wicket.util.string.Strings;
+
+/**
+ * 
+ */
+public class Checks
+{
+       /**
+        * Checks value is not null
+        * 
+        * @param argument
+        * @param name
+        * @throws IllegalStateException
+        */
+       public static void notNull(final Object argument, final String message)
+       {
+               if (argument == null)
+               {
+                       throw new IllegalStateException(message);
+               }
+       }
+
+       /**
+        * Checks argument is not empty (not null and has a non-whitespace 
character)
+        * 
+        * @param argument
+        * @param name
+        * @throws IllegalStateException
+        */
+       public static void notEmpty(final String argument, final String message)
+       {
+               if (Strings.isEmpty(argument))
+               {
+                       throw new IllegalStateException(message);
+               }
+       }
+
+       /**
+        * Checks if argument is within a range
+        * 
+        * @param <T>
+        * @param min
+        * @param max
+        * @param value
+        * @param name
+        * @throws IllegalStateException
+        */
+       public static <T extends Comparable<T>> void withinRange(T min, T max, 
T value, String message)
+       {
+               notNull(min, message);
+               notNull(max, message);
+               if (value.compareTo(min) < 0 || value.compareTo(max) > 0)
+               {
+                       throw new IllegalStateException(message);
+               }
+
+               return;
+       }
+
+       /**
+        * Checks value is not null
+        * 
+        * @param argument
+        * @param name
+        * @throws IllegalStateException
+        */
+       public static void notNullShort(final Object argument, final String 
name)
+       {
+               notNull(argument, name + " may not be null.");
+       }
+
+       /**
+        * Checks argument is not empty (not null and has a non-whitespace 
character)
+        * 
+        * @param argument
+        * @param name
+        * @throws IllegalStateException
+        */
+       public static void notEmptyShort(final String argument, final String 
name)
+       {
+               notEmpty(argument, name + " may not be null or empty string.");
+       }
+
+       /**
+        * Checks if argument is within a range
+        * 
+        * @param <T>
+        * @param min
+        * @param max
+        * @param value
+        * @param name
+        * @throws IllegalStateException
+        */
+       public static <T extends Comparable<T>> void withinRangeShort(T min, T 
max, T value, String name)
+       {
+               withinRange(min, max, value,
+                       String.format("%s must have a value within [%s,%s], but 
was %s", name, min, max, value));
+       }
+}

Propchange: 
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/lang/Checks.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
 (original)
+++ 
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
 Thu Oct 14 06:06:37 2010
@@ -639,21 +639,26 @@ public final class Strings
                        }
                        for (int i = 1; i < fragments.length; i++)
                        {
-                               if ((fragments[i - 1] != null) || (fragments[i] 
!= null))
+                               String fragment = fragments[i];
+                               if ((fragments[i - 1] != null) || (fragment != 
null))
                                {
                                        boolean lhsClosed = fragments[i - 
1].endsWith(separator);
-                                       boolean rhsClosed = 
fragments[i].startsWith(separator);
+                                       boolean rhsClosed = 
fragment.startsWith(separator);
                                        if (lhsClosed && rhsClosed)
                                        {
-                                               
buff.append(fragments[i].substring(1));
+                                               
buff.append(fragment.substring(1));
                                        }
                                        else if (!lhsClosed && !rhsClosed)
                                        {
-                                               
buff.append(separator).append(fragments[i]);
+                                               if (!Strings.isEmpty(fragment))
+                                               {
+                                                       buff.append(separator);
+                                               }
+                                               buff.append(fragment);
                                        }
                                        else
                                        {
-                                               buff.append(fragments[i]);
+                                               buff.append(fragment);
                                        }
                                }
                        }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
 Thu Oct 14 06:06:37 2010
@@ -23,9 +23,7 @@ import org.apache.wicket.behavior.Abstra
 import org.apache.wicket.markup.html.IHeaderResponse;
 import org.apache.wicket.markup.html.WicketEventReference;
 import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.request.Url;
 import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.resource.JavascriptResourceReference;
 import org.apache.wicket.request.resource.PackageResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
@@ -295,14 +293,7 @@ public abstract class AbstractDefaultAja
                RequestCycle requestCycle = RequestCycle.get();
                requestCycle.scheduleRequestHandlerAfterCurrent(target);
 
-               Url oldBaseURL = requestCycle.getUrlRenderer().getBaseUrl();
-               WebRequest request = (WebRequest)requestCycle.getRequest();
-               Url baseURL = 
Url.parse(request.getHeader("Wicket-Ajax-BaseURL"), request.getCharset());
-               requestCycle.getUrlRenderer().setBaseUrl(baseURL);
-
                respond(target);
-
-               requestCycle.getUrlRenderer().setBaseUrl(oldBaseURL);
        }
 
        /**

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java 
(original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java 
Thu Oct 14 06:06:37 2010
@@ -32,7 +32,6 @@ import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Page;
-import org.apache.wicket.ajax.AjaxRequestTarget.IListener;
 import org.apache.wicket.behavior.IBehavior;
 import org.apache.wicket.markup.html.IHeaderResponse;
 import org.apache.wicket.markup.html.internal.HeaderResponse;
@@ -42,7 +41,6 @@ import org.apache.wicket.markup.repeater
 import org.apache.wicket.request.IRequestCycle;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.Response;
-import org.apache.wicket.request.Url;
 import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.handler.IPageRequestHandler;
@@ -574,19 +572,13 @@ public class AjaxRequestTarget implement
                try
                {
                        RequestCycle rc = (RequestCycle)requestCycle;
-                       Url oldBaseURL = rc.getUrlRenderer().getBaseUrl();
-                       WebRequest request = 
(WebRequest)requestCycle.getRequest();
-                       Url baseURL = 
Url.parse(request.getHeader("Wicket-Ajax-BaseURL"), request.getCharset());
-
-                       rc.getUrlRenderer().setBaseUrl(baseURL);
 
                        final WebResponse response = 
(WebResponse)requestCycle.getResponse();
 
                        if (markupIdToComponent.values().contains(page))
                        {
                                // the page itself has been added to the 
request target, we simply issue a redirect
-// back
-// to the page
+                               // back to the page
                                IRequestHandler handler = new 
RenderPageRequestHandler(new PageProvider(page));
                                final String url = 
rc.urlFor(handler).toString();
                                response.sendRedirect(url);
@@ -646,8 +638,6 @@ public class AjaxRequestTarget implement
                        }
 
                        response.write("</ajax-response>");
-
-                       rc.getUrlRenderer().setBaseUrl(oldBaseURL);
                }
                finally
                {

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js Thu 
Oct 14 06:06:37 2010
@@ -1151,7 +1151,7 @@ Wicket.Ajax.Call.prototype = {
                
                // reconfigure the form
                form.target=iframe.name;
-               form.action=this.request.url + "&wicket:ajax=true";
+               form.action=this.request.url + 
"&wicket-ajax=true&wicket-ajax-baseurl=" + 
Wicket.Form.encode(Wicket.Ajax.baseUrl);
                form.method="post";
                form.enctype="multipart/form-data";
                form.encoding="multipart/form-data";

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java 
(original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java 
Thu Oct 14 06:06:37 2010
@@ -37,10 +37,13 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
 import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.IRequestParameters;
+import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Response;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.UrlDecoder;
+import org.apache.wicket.request.UrlRenderer;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.settings.IApplicationSettings;
@@ -590,6 +593,18 @@ public class Form<T> extends WebMarkupCo
         */
        public final CharSequence getJsForInterfaceUrl(CharSequence url)
        {
+               /*
+                * since the passed in url is handled when the current url is 
form's action url and not the
+                * current request's url we rerender the passed in url to be 
relative to the form's action
+                * url
+                */
+               UrlRenderer renderer = getRequestCycle().getUrlRenderer();
+               Url oldBase = renderer.getBaseUrl();
+               Url action = Url.parse(getActionUrl().toString());
+               renderer.setBaseUrl(action);
+               url = renderer.renderUrl(Url.parse(url.toString()));
+               renderer.setBaseUrl(oldBase);
+
                Form<?> root = getRootForm();
                return new 
AppendingStringBuffer("document.getElementById('").append(
                        root.getHiddenFieldId())
@@ -1059,9 +1074,16 @@ public class Form<T> extends WebMarkupCo
         */
        private void dispatchEvent(final Page page, final String url)
        {
-               Url parsed = Url.parse(url, getRequest().getCharset());
-               IRequestHandler handler = 
getApplication().getRootRequestMapper().mapRequest(
-                       getRequest().requestWithUrl(parsed));
+               // the current requst's url is most likely 
wicket/page?x-y.IFormSubmitListener-path-to-form
+               // while the passed in url is most likely 
page?x.y.IOnChangeListener-path-to-component
+               // we transform the passed in url into 
wicket/page?x-y.IOnChangeListener-path-to-component
+               // so the system mapper can interpret it
+               Url resolved = new Url(getRequest().getUrl());
+               resolved.resolveRelative(Url.parse(url));
+
+               IRequestMapper mapper = getApplication().getRootRequestMapper();
+               Request request = getRequest().cloneWithUrl(resolved);
+               IRequestHandler handler = mapper.mapRequest(request);
 
                if (handler != null)
                {
@@ -1510,7 +1532,7 @@ public class Form<T> extends WebMarkupCo
                {
                        String method = getMethod().toLowerCase();
                        tag.put("method", method);
-                       String url = 
urlFor(IFormSubmitListener.INTERFACE).toString();
+                       String url = getActionUrl().toString();
                        if (encodeUrlInHiddenFields())
                        {
                                int i = url.indexOf('?');
@@ -1552,6 +1574,16 @@ public class Form<T> extends WebMarkupCo
        }
 
        /**
+        * Generates the action url for the form
+        * 
+        * @return action url
+        */
+       protected CharSequence getActionUrl()
+       {
+               return urlFor(IFormSubmitListener.INTERFACE);
+       }
+
+       /**
         * @see 
org.apache.wicket.Component#renderPlaceholderTag(org.apache.wicket.markup.ComponentTag,
         *      org.apache.wicket.request.Response)
         */
@@ -1614,7 +1646,7 @@ public class Form<T> extends WebMarkupCo
                        // and have to write the url parameters as hidden fields
                        if (encodeUrlInHiddenFields())
                        {
-                               String url = 
urlFor(IFormSubmitListener.INTERFACE).toString();
+                               String url = getActionUrl().toString();
                                int i = url.indexOf('?');
                                String[] params = ((i > -1) ? url.substring(i + 
1) : url).split("&");
 

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/mock/MockWebRequest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/mock/MockWebRequest.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/mock/MockWebRequest.java 
(original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/mock/MockWebRequest.java 
Thu Oct 14 06:06:37 2010
@@ -28,6 +28,7 @@ import javax.servlet.http.Cookie;
 
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.request.Url;
+import org.apache.wicket.request.Url.QueryParameter;
 import org.apache.wicket.request.http.WebRequest;
 
 /**
@@ -64,7 +65,7 @@ public class MockWebRequest extends WebR
        }
 
        @Override
-       public MockWebRequest requestWithUrl(Url url)
+       public MockWebRequest cloneWithUrl(Url url)
        {
                return new MockWebRequest(url, cookies, headers, 
postRequestParameters, locale);
        }
@@ -249,4 +250,10 @@ public class MockWebRequest extends WebR
        {
                return Charset.forName("UTF-8");
        }
+
+       @Override
+       public Url getBaseUrl()
+       {
+               return new Url(url.getSegments(), Collections.<QueryParameter> 
emptyList());
+       }
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequest.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequest.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequest.java
 Thu Oct 14 06:06:37 2010
@@ -60,7 +60,7 @@ public abstract class MultipartServletWe
        }
 
        @Override
-       public ServletWebRequest requestWithUrl(Url url)
+       public ServletWebRequest cloneWithUrl(Url url)
        {
                return new MultipartServletWebRequest(getHttpServletRequest(), 
getFilterPrefix(), url)
                {

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
 Thu Oct 14 06:06:37 2010
@@ -42,6 +42,7 @@ import org.apache.wicket.request.http.We
 import org.apache.wicket.util.io.Streams;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.lang.Bytes;
+import org.apache.wicket.util.lang.Checks;
 import org.apache.wicket.util.string.PrependingStringBuffer;
 import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
@@ -104,7 +105,54 @@ public class ServletWebRequest extends W
                }
        }
 
-       private Url getUrl(HttpServletRequest request, String filterPrefix)
+       /**
+        * Returns base url without context or filter mapping.
+        * 
+        * Example: if current url is
+        * 
+        * <pre>
+        * 
http://localhost:8080/context/filter/mapping/wicket/bookmarkable/com.foo.Page?1&id=2
+        * </pre>
+        * 
+        * the base url is wicket/bookmarkable/com.foo.Page
+        * 
+        * <pre>
+        * wicket / bookmarkab
+        * @see org.apache.wicket.request.Request#getBaseUrl()
+        */
+       @Override
+       public Url getBaseUrl()
+       {
+               if (!isAjax())
+               {
+                       return Url.parse(getBaseUrl(httpServletRequest, 
filterPrefix).toString(), getCharset());
+               }
+               else
+               {
+                       String base = null;
+
+                       base = getHeader(HEADER_AJAX_BASE_URL);
+
+                       if (base == null)
+                       {
+                               base = 
getRequestParameters().getParameterValue(PARAM_AJAX_BASE_URL).toString(null);
+                       }
+
+                       Checks.notNull(base, "Current ajax request is missing 
the base url header or parameter");
+
+                       return Url.parse(base, getCharset());
+               }
+
+       }
+
+       /**
+        * Builds base url for this request
+        * 
+        * @param request
+        * @param filterPrefix
+        * @return
+        */
+       private StringBuilder getBaseUrl(HttpServletRequest request, String 
filterPrefix)
        {
                if (filterPrefix.length() > 0 && !filterPrefix.endsWith("/"))
                {
@@ -116,6 +164,13 @@ public class ServletWebRequest extends W
                final int start = request.getContextPath().length() + 
filterPrefix.length() + 1;
                url.append(uri.substring(start));
 
+               return url;
+       }
+
+       private Url getUrl(HttpServletRequest request, String filterPrefix)
+       {
+               StringBuilder url = getBaseUrl(request, filterPrefix);
+
                String query = request.getQueryString();
                if (!Strings.isEmpty(query))
                {
@@ -123,7 +178,7 @@ public class ServletWebRequest extends W
                        url.append(query);
                }
 
-               return Url.parse(Strings.stripJSessionId(url.toString()), 
getCharset());
+               return Url.parse(url.toString(), getCharset());
        }
 
 
@@ -311,7 +366,7 @@ public class ServletWebRequest extends W
        }
 
        @Override
-       public ServletWebRequest requestWithUrl(Url url)
+       public ServletWebRequest cloneWithUrl(Url url)
        {
                return new ServletWebRequest(httpServletRequest, filterPrefix, 
url)
                {
@@ -372,4 +427,5 @@ public class ServletWebRequest extends W
                return RequestUtils.getCharset(httpServletRequest);
        }
 
+
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
 Thu Oct 14 06:06:37 2010
@@ -28,6 +28,7 @@ import org.apache.wicket.protocol.http.R
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.http.WebResponse;
 import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.string.Strings;
 
 /**
  * WebResponse that wraps a {...@link ServletWebResponse}.
@@ -215,25 +216,13 @@ public class ServletWebResponse extends 
 
                        final Url current;
 
-                       if (webRequest.isAjax())
-                       {
-                               String ajaxBaseUrl = 
httpServletRequest.getHeader("Wicket-Ajax-BaseURL");
-
-                               if (ajaxBaseUrl == null)
-                                       throw new IllegalStateException(
-                                               "current ajax request is 
missing the base url header");
-
-                               current = Url.parse('/' + ajaxBaseUrl, charset);
-                       }
-                       else
-                       {
-                               current = 
Url.parse(httpServletRequest.getRequestURI(), charset);
-                       }
+                       current = webRequest.getBaseUrl();
 
                        Url append = Url.parse(url, charset);
                        current.concatSegments(append.getSegments());
                        Url result = new Url(current.getSegments(), 
append.getQueryParameters());
-                       return getAbsolutePrefix() + result.toString();
+                       return Strings.join("/", getAbsolutePrefix(), 
httpServletRequest.getContextPath(),
+                               webRequest.getFilterPrefix(), 
result.toString());
                }
        }
 

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
 Thu Oct 14 06:06:37 2010
@@ -154,7 +154,7 @@ public class RequestCycle extends Reques
        protected UrlRenderer newUrlRenderer()
        {
                // All URLs will be rendered relative to current request (can 
be overriden afterwards)
-               return new UrlRenderer(getRequest().getUrl());
+               return new UrlRenderer(getRequest().getBaseUrl());
        }
 
        /**

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/RenderPageRequestHandler.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/RenderPageRequestHandler.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/RenderPageRequestHandler.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/RenderPageRequestHandler.java
 Thu Oct 14 06:06:37 2010
@@ -21,6 +21,7 @@ import org.apache.wicket.request.IReques
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.handler.render.PageRenderer;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.lang.Args;
 
@@ -144,6 +145,7 @@ public class RenderPageRequestHandler im
         */
        public void respond(IRequestCycle requestCycle)
        {
-               
Application.get().getPageRendererProvider().get(this).respond((RequestCycle)requestCycle);
+               PageRenderer renderer = 
Application.get().getPageRendererProvider().get(this);
+               renderer.respond((RequestCycle)requestCycle);
        }
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
 Thu Oct 14 06:06:37 2010
@@ -73,7 +73,7 @@ public class CryptoMapper implements IRe
                        return null;
                }
 
-               return wrappedMapper.mapRequest(request.requestWithUrl(url));
+               return wrappedMapper.mapRequest(request.cloneWithUrl(url));
        }
 
        private ICrypt getCrypt()

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/AbstractMapperTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/AbstractMapperTest.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/AbstractMapperTest.java
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/AbstractMapperTest.java
 Thu Oct 14 06:06:37 2010
@@ -69,6 +69,12 @@ public abstract class AbstractMapperTest
                        {
                                return Charset.forName("UTF-8");
                        }
+
+                       @Override
+                       public Url getBaseUrl()
+                       {
+                               return url;
+                       }
                };
        }
 

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java?rev=1022384&r1=1022383&r2=1022384&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java
 Thu Oct 14 06:06:37 2010
@@ -58,6 +58,12 @@ public class ResourceMapperTest extends 
                        {
                                return CHARSET;
                        }
+
+                       @Override
+                       public Url getBaseUrl()
+                       {
+                               return getUrl();
+                       }
                };
        }
 
@@ -146,7 +152,7 @@ public class ResourceMapperTest extends 
 
                public void respond(Attributes attributes)
                {
-                       this.pageParameters = attributes.getParameters();
+                       pageParameters = attributes.getParameters();
                }
        }
 }


Reply via email to