Author: ivaynberg
Date: Thu Feb 10 00:58:05 2011
New Revision: 1069181

URL: http://svn.apache.org/viewvc?rev=1069181&view=rev
Log:
added ability to render full urls rather then just relative or 
context-relative. fixed https switching.
Issue: WICKET-3407

Added:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java
   (with props)
Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebSession.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsRequestChecker.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandler.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/UrlUtils.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandlerTest.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.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/UrlRenderer.java
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebSession.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebSession.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebSession.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebSession.java
 Thu Feb 10 00:58:05 2011
@@ -206,7 +206,7 @@ public class WebSession extends Session
                                        IRequestHandler activeRequestHandler = 
requestCycle.getActiveRequestHandler();
                                        String url = 
requestCycle.urlFor(activeRequestHandler).toString();
                                        String relativeUrl = 
requestCycle.getUrlRenderer()
-                                               
.renderContextPathRelativeUrl(url, request);
+                                               
.renderContextPathRelativeUrl(url);
                                        Page browserInfoPage = 
newBrowserInfoPage(relativeUrl);
                                        throw new 
RestartResponseException(browserInfoPage);
                                }

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
 Thu Feb 10 00:58:05 2011
@@ -123,7 +123,7 @@ public class ServletWebRequest extends W
        {
                if (!isAjax())
                {
-                       return Url.parse(getUrl(httpServletRequest, 
filterPrefix).toString(), getCharset());
+                       return getUrl(httpServletRequest, filterPrefix);
                }
                else
                {
@@ -138,9 +138,16 @@ public class ServletWebRequest extends W
 
                        Checks.notNull(base, "Current ajax request is missing 
the base url header or parameter");
 
-                       return Url.parse(base, getCharset());
+                       return setParameters(Url.parse(base, getCharset()));
                }
+       }
 
+       private Url setParameters(Url url)
+       {
+               url.setPort(httpServletRequest.getServerPort());
+               url.setHost(httpServletRequest.getServerName());
+               url.setProtocol(httpServletRequest.getScheme());
+               return url;
        }
 
        private Url getUrl(HttpServletRequest request, String filterPrefix)
@@ -162,10 +169,9 @@ public class ServletWebRequest extends W
                        url.append(query);
                }
 
-               return Url.parse(url.toString(), getCharset());
+               return setParameters(Url.parse(url.toString(), getCharset()));
        }
 
-
        /**
         * Returns the prefix of Wicket filter (without the leading /)
         * 

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java
 Thu Feb 10 00:58:05 2011
@@ -119,6 +119,18 @@ public class HttpsMapper implements IReq
         */
        public Url mapHandler(IRequestHandler requestHandler)
        {
-               return 
delegate.mapHandler(checker.checkSecureOutgoing(requestHandler, httpsConfig));
+               Url url = delegate.mapHandler(requestHandler);
+               switch (checker.getProtocol(requestHandler))
+               {
+                       case HTTP :
+                               url.setProtocol("http");
+                               url.setPort(httpsConfig.getHttpPort());
+                               break;
+                       case HTTPS :
+                               url.setProtocol("https");
+                               url.setPort(httpsConfig.getHttpsPort());
+                               break;
+               }
+               return url;
        }
 }

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsRequestChecker.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsRequestChecker.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsRequestChecker.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsRequestChecker.java
 Thu Feb 10 00:58:05 2011
@@ -16,10 +16,8 @@
  */
 package org.apache.wicket.protocol.https;
 
-import org.apache.wicket.protocol.https.SwitchProtocolRequestHandler.Protocol;
 import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.handler.BookmarkablePageRequestHandler;
-import org.apache.wicket.request.handler.IPageRequestHandler;
+import org.apache.wicket.request.handler.IPageClassRequestHandler;
 
 /**
  * A helper class which will replace the current {@link IRequestHandler 
request handler} with
@@ -72,44 +70,29 @@ class HttpsRequestChecker
        }
 
        /**
+        * Figures out the protocol that should be used for a given request 
handler
+        * 
         * @param requestHandler
-        *            the original request handler
-        * @param httpsConfig
-        *            the https configuration
-        * @return either {@link SwitchProtocolRequestHandler} if the page that 
is going to be rendered
-        *         is annotated with @{@link RequireHttps} and the protocol of 
the current request is
-        *         http, or will return the original handler if these 
conditions are not fulfilled
+        * @return protocol
         */
-       IRequestHandler checkSecureOutgoing(IRequestHandler requestHandler, 
HttpsConfig httpsConfig)
+       public Protocol getProtocol(IRequestHandler requestHandler)
        {
-
-               if (requestHandler != null && requestHandler instanceof 
SwitchProtocolRequestHandler)
-               {
-                       return requestHandler;
-               }
-
                Class<?> pageClass = getPageClass(requestHandler);
                if (pageClass != null)
                {
-                       final IRequestHandler redirect;
-
                        if (hasSecureAnnotation(pageClass))
                        {
-                               redirect = 
SwitchProtocolRequestHandler.requireProtocol(Protocol.HTTPS,
-                                       requestHandler, httpsConfig);
+                               return Protocol.HTTPS;
                        }
                        else
                        {
-                               redirect = 
SwitchProtocolRequestHandler.requireProtocol(Protocol.HTTP,
-                                       requestHandler, httpsConfig);
-                       }
-                       if (redirect != null)
-                       {
-                               return redirect;
+                               return Protocol.HTTP;
                        }
-
                }
-               return requestHandler;
+               else
+               {
+                       return Protocol.PRESERVE_CURRENT;
+               }
        }
 
        /**
@@ -147,13 +130,9 @@ class HttpsRequestChecker
         */
        private Class<?> getPageClass(IRequestHandler handler)
        {
-               if (handler instanceof IPageRequestHandler)
-               {
-                       return ((IPageRequestHandler)handler).getPageClass();
-               }
-               else if (handler instanceof BookmarkablePageRequestHandler)
+               if (handler instanceof IPageClassRequestHandler)
                {
-                       return 
((BookmarkablePageRequestHandler)handler).getPageClass();
+                       return 
((IPageClassRequestHandler)handler).getPageClass();
                }
                else
                {

Added: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java?rev=1069181&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java
 (added)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java
 Thu Feb 10 00:58:05 2011
@@ -0,0 +1,29 @@
+/*
+ * 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.protocol.https;
+
+/**
+ * Protocols
+ */
+enum Protocol {
+       /*** HTTP */
+       HTTP,
+       /** HTTPS */
+       HTTPS,
+       /** CURRENT */
+       PRESERVE_CURRENT
+}
\ No newline at end of file

Propchange: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandler.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandler.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandler.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandler.java
 Thu Feb 10 00:58:05 2011
@@ -32,18 +32,6 @@ import org.apache.wicket.util.lang.Args;
 class SwitchProtocolRequestHandler implements IRequestHandlerDelegate
 {
 
-       /**
-        * Protocols
-        */
-       public enum Protocol {
-               /*** HTTP */
-               HTTP,
-               /** HTTPS */
-               HTTPS,
-               /** CURRENT */
-               PRESERVE_CURRENT
-       }
-
        /** the protocol this request handler is going to switch to */
        private final Protocol protocol;
 

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
 Thu Feb 10 00:58:05 2011
@@ -140,7 +140,7 @@ public class RequestCycle extends Reques
        protected UrlRenderer newUrlRenderer()
        {
                // All URLs will be rendered relative to current request (can 
be overridden afterwards)
-               return new UrlRenderer(getRequest().getClientUrl());
+               return new UrlRenderer(getRequest().getClientUrl(), 
getRequest().getPrefixToContextPath());
        }
 
        /**

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/UrlUtils.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/UrlUtils.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/UrlUtils.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/UrlUtils.java
 Thu Feb 10 00:58:05 2011
@@ -64,8 +64,7 @@ public class UrlUtils
        {
                if (isRelative(url))
                {
-                       return 
requestCycle.getUrlRenderer().renderContextPathRelativeUrl(url,
-                               requestCycle.getRequest());
+                       return 
requestCycle.getUrlRenderer().renderContextPathRelativeUrl(url);
                }
                else
                {

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandlerTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandlerTest.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandlerTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandlerTest.java
 Thu Feb 10 00:58:05 2011
@@ -23,7 +23,6 @@ import javax.servlet.http.HttpServletReq
 
 import org.apache.wicket.MockPage;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
-import org.apache.wicket.protocol.https.SwitchProtocolRequestHandler.Protocol;
 import org.apache.wicket.request.IRequestCycle;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.Url;

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
 Thu Feb 10 00:58:05 2011
@@ -35,7 +35,7 @@ public class UrlRendererTest extends Tes
         */
        public void test1()
        {
-               UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"));
+               UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"), 
"");
                assertEquals("./xyz?x=y", 
r1.renderUrl(Url.parse("foo/bar/xyz?x=y")));
                assertEquals("./baz/xyz?x=y", 
r1.renderUrl(Url.parse("foo/bar/baz/xyz?x=y")));
                assertEquals("../aaa/xyz?x=y", 
r1.renderUrl(Url.parse("foo/aaa/xyz?x=y")));
@@ -47,7 +47,7 @@ public class UrlRendererTest extends Tes
         */
        public void test2()
        {
-               UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"));
+               UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"), 
"");
                assertEquals("../../foo?x=y", 
r1.renderUrl(Url.parse("foo?x=y")));
                assertEquals("../../aaa?x=y", 
r1.renderUrl(Url.parse("aaa?x=y")));
        }
@@ -57,7 +57,7 @@ public class UrlRendererTest extends Tes
         */
        public void test3()
        {
-               UrlRenderer r1 = new UrlRenderer(Url.parse("?a=b"));
+               UrlRenderer r1 = new UrlRenderer(Url.parse("?a=b"), "");
                assertEquals("a/b/c?x=y", r1.renderUrl(Url.parse("a/b/c?x=y")));
        }
 
@@ -66,7 +66,7 @@ public class UrlRendererTest extends Tes
         */
        public void test5()
        {
-               UrlRenderer r1 = new UrlRenderer(Url.parse("url"));
+               UrlRenderer r1 = new UrlRenderer(Url.parse("url"), "");
                assertEquals("./url?1", r1.renderUrl(Url.parse("url?1")));
        }
 
@@ -75,7 +75,7 @@ public class UrlRendererTest extends Tes
         */
        public void test6()
        {
-               UrlRenderer r1 = new UrlRenderer(Url.parse("url/"));
+               UrlRenderer r1 = new UrlRenderer(Url.parse("url/"), "");
                assertEquals("./x?1", r1.renderUrl(Url.parse("url/x?1")));
        }
 
@@ -85,7 +85,7 @@ public class UrlRendererTest extends Tes
        public void test7()
        {
                UrlRenderer r1 = new UrlRenderer(
-                       
Url.parse("MyTestPage/indexed1/indexed2/indexed3?10-27.ILinkListener-l2&p1=v1"));
+                       
Url.parse("MyTestPage/indexed1/indexed2/indexed3?10-27.ILinkListener-l2&p1=v1"),
 "");
                assertEquals("../../../MyTestPage?10", 
r1.renderUrl(Url.parse("MyTestPage?10")));
        }
 
@@ -94,7 +94,7 @@ public class UrlRendererTest extends Tes
         */
        public void test8()
        {
-               UrlRenderer r1 = new 
UrlRenderer(Url.parse("en/first-test-page?16-1.ILinkListener-l1"));
+               UrlRenderer r1 = new 
UrlRenderer(Url.parse("en/first-test-page?16-1.ILinkListener-l1"), "");
                
assertEquals("./first-test-page/indexed1/indexed2/indexed3?p1=v1",
                        
r1.renderUrl(Url.parse("en/first-test-page/indexed1/indexed2/indexed3?p1=v1")));
        }
@@ -104,7 +104,7 @@ public class UrlRendererTest extends Tes
         */
        public void test9()
        {
-               UrlRenderer r1 = new UrlRenderer(Url.parse("a/b/q/d/e"));
+               UrlRenderer r1 = new UrlRenderer(Url.parse("a/b/q/d/e"), "");
                assertEquals("../../../q/c/d/e", 
r1.renderUrl(Url.parse("a/q/c/d/e")));
        }
 
@@ -113,7 +113,6 @@ public class UrlRendererTest extends Tes
         */
        public void test10()
        {
-               UrlRenderer r1 = new UrlRenderer(Url.parse("a/b/q/d/e"));
 
                HttpServletRequest httpRequest = 
Mockito.mock(HttpServletRequest.class);
                
Mockito.when(httpRequest.getCharacterEncoding()).thenReturn("UTF-8");
@@ -121,15 +120,16 @@ public class UrlRendererTest extends Tes
                
Mockito.when(httpRequest.getRequestURI()).thenReturn("/contextPath/filterPath/anything");
 
                ServletWebRequest request = new ServletWebRequest(httpRequest, 
"filterPath/");
+               UrlRenderer r1 = new UrlRenderer(Url.parse("a/b/q/d/e"), 
request.getPrefixToContextPath());
 
-               assertEquals("../../../../../", 
r1.renderContextPathRelativeUrl("", request));
-               assertEquals("../../../../../", 
r1.renderContextPathRelativeUrl("/", request));
-               assertEquals("../../../../../f", 
r1.renderContextPathRelativeUrl("/f", request));
-               assertEquals("../../../../../../f", 
r1.renderContextPathRelativeUrl("../f", request));
+               assertEquals("../../../../../", 
r1.renderContextPathRelativeUrl(""));
+               assertEquals("../../../../../", 
r1.renderContextPathRelativeUrl("/"));
+               assertEquals("../../../../../f", 
r1.renderContextPathRelativeUrl("/f"));
+               assertEquals("../../../../../../f", 
r1.renderContextPathRelativeUrl("../f"));
 
                try
                {
-                       r1.renderContextPathRelativeUrl(null, request);
+                       r1.renderContextPathRelativeUrl(null);
                        fail("Null 'url' is not allowed!");
                }
                catch (IllegalArgumentException iax)
@@ -143,7 +143,7 @@ public class UrlRendererTest extends Tes
         */
        public void test11()
        {
-               UrlRenderer r1 = new UrlRenderer(Url.parse("a"));
+               UrlRenderer r1 = new UrlRenderer(Url.parse("a"), "");
                assertEquals(".", r1.renderUrl(Url.parse("")));
        }
 }

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=1069181&r1=1069180&r2=1069181&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 Feb 10 00:58:05 2011
@@ -69,6 +69,10 @@ public final class Url implements Serial
        private String charsetName;
        private transient Charset _charset;
 
+       private String protocol;
+       private Integer port;
+       private String host;
+
        /**
         * 
         * @param qp
@@ -804,4 +808,66 @@ public final class Url implements Serial
                parameters.clear();
                parameters.addAll(relative.getQueryParameters());
        }
+
+       /**
+        * Gets the protocol of this url (http/https/etc)
+        * 
+        * @return protocol or {@code null} if none has been set
+        */
+       public String getProtocol()
+       {
+               return protocol;
+       }
+
+       /**
+        * Sets the protocol of this url (http/https/etc)
+        * 
+        * @param protocol
+        */
+       public void setProtocol(String protocol)
+       {
+               this.protocol = protocol;
+       }
+
+       /**
+        * Gets the port of this url
+        * 
+        * @return port or {@code null} if none has been set
+        */
+       public Integer getPort()
+       {
+               return port;
+       }
+
+       /**
+        * Sets the port of this url
+        * 
+        * @param port
+        */
+       public void setPort(Integer port)
+       {
+               this.port = port;
+       }
+
+       /**
+        * Gets the host name of this url
+        * 
+        * @return host name or {@code null} if none is seto
+        */
+       public String getHost()
+       {
+               return host;
+       }
+
+       /**
+        * Sets the host name of this url
+        * 
+        * @param host
+        */
+       public void setHost(String host)
+       {
+               this.host = host;
+       }
+
+
 }

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
 Thu Feb 10 00:58:05 2011
@@ -17,36 +17,54 @@
 package org.apache.wicket.request;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.string.PrependingStringBuffer;
+import org.apache.wicket.util.string.Strings;
 
 /**
- * Takes care of rendering relative (or in future possibly absolute - 
depending on configuration)
- * URLs.
+ * Takes care of rendering URLs.
  * <p>
- * All Urls are rendered relative to the base Url. Base Url is normally Url of 
the page being
+ * Normally Urls are rendered relative to the base Url. Base Url is normally 
Url of the page being
  * rendered. However, during Ajax request and redirect to buffer rendering the 
BaseUrl needs to be
  * adjusted.
  * 
  * @author Matej Knopp
+ * @author Igor Vaynberg
  */
 public class UrlRenderer
 {
+       private static Map<String, Integer> PROTO_TO_PORT = new HashMap<String, 
Integer>();
+       static
+       {
+               PROTO_TO_PORT.put("http", 80);
+               PROTO_TO_PORT.put("https", 443);
+       }
+
+
        private Url baseUrl;
+       private final Url originalBaseUrl;
+       private final String prefixToContextPath;
+
 
        /**
         * Construct.
         * 
         * @param base
         *            base Url. All generated Urls will be relative to this Url.
+        * @param prefixToContextPath
+        *            prefix that when prepended to {@code base} will make it 
context-relative
         */
-       public UrlRenderer(final Url base)
+       public UrlRenderer(final Url base, String prefixToContextPath)
        {
                Args.notNull(base, "base");
-
+               Args.notNull(prefixToContextPath, "prefixToContextPath");
                baseUrl = base;
+               originalBaseUrl = baseUrl;
+               this.prefixToContextPath = prefixToContextPath;
        }
 
        /**
@@ -75,6 +93,92 @@ public class UrlRenderer
        }
 
        /**
+        * Renders the Url
+        * 
+        * @param url
+        * @return Url rendered as string
+        */
+       public String renderUrl(final Url url)
+       {
+               if (shouldRenderAsFull(url))
+               {
+                       return renderFullUrl(url);
+               }
+               else
+               {
+                       return renderRelativeUrl(url);
+               }
+       }
+
+       /**
+        * Renders a full URL in the {@code protocol://hostname:port/path} 
format
+        * 
+        * @param url
+        * @return rendered URL
+        */
+       public String renderFullUrl(Url url)
+       {
+               StringBuilder render = new StringBuilder();
+
+               final String protocol = resolveProtocol(url);
+               final String host = resolveHost(url);
+               final Integer port = resolvePort(url);
+               final String path = url.toString();
+
+               render.append(protocol).append("://").append(host);
+
+               if (port != null && !port.equals(PROTO_TO_PORT.get(protocol)))
+               {
+                       render.append(":").append(port);
+               }
+
+               if (!path.startsWith("/"))
+               {
+                       render.append("/");
+               }
+
+               render.append(path);
+
+               return render.toString();
+       }
+
+       /**
+        * Gets port that should be used to render the url
+        * 
+        * @param url
+        *            url being rendered
+        * @return port or {@code null} if none is set
+        */
+       protected Integer resolvePort(Url url)
+       {
+               return choose(url.getPort(), baseUrl.getPort(), 
originalBaseUrl.getPort());
+       }
+
+       /**
+        * Gets the host name that should be used to render the url
+        * 
+        * @param url
+        *            url being rendered
+        * @return the host name or {@code null} if none is set
+        */
+       protected String resolveHost(Url url)
+       {
+               return choose(url.getHost(), baseUrl.getHost(), 
originalBaseUrl.getHost());
+       }
+
+       /**
+        * Gets the protocol that should be used to render the url
+        * 
+        * @param url
+        *            url being rendered
+        * @return the protocol or {@code null} if none is set
+        */
+       protected String resolveProtocol(Url url)
+       {
+               return choose(url.getProtocol(), baseUrl.getProtocol(), 
originalBaseUrl.getProtocol());
+       }
+
+       /**
         * Renders the Url relative to currently set Base Url.
         * 
         * This method is only intended for Wicket URLs, because the {@link 
Url} object represents part
@@ -85,7 +189,7 @@ public class UrlRenderer
         * @param url
         * @return Url rendered as string
         */
-       public String renderUrl(final Url url)
+       public String renderRelativeUrl(final Url url)
        {
                Args.notNull(url, "url");
 
@@ -144,13 +248,36 @@ public class UrlRenderer
        }
 
        /**
+        * Determines whether a URL should be rendered in its full form
+        * 
+        * @param url
+        * @return {@code true} if URL should be rendered in the full form
+        */
+       protected boolean shouldRenderAsFull(Url url)
+       {
+               if (!Strings.isEmpty(url.getProtocol()) && 
!url.getProtocol().equals(baseUrl.getProtocol()))
+               {
+                       return true;
+               }
+               if (!Strings.isEmpty(url.getHost()) && 
!url.getHost().equals(baseUrl.getHost()))
+               {
+                       return true;
+               }
+               if (url.getPort() != null && 
!url.getPort().equals(baseUrl.getPort()))
+               {
+                       return true;
+               }
+               return false;
+       }
+
+       /**
         * Renders the URL within context relative to current base URL.
         * 
         * @param url
         * @param request
         * @return relative URL
         */
-       public String renderContextPathRelativeUrl(String url, final Request 
request)
+       public String renderContextPathRelativeUrl(String url)
        {
                Args.notNull(url, "url");
 
@@ -165,8 +292,34 @@ public class UrlRenderer
                        buffer.prepend("../");
                }
 
-               buffer.prepend(request.getPrefixToContextPath());
+               buffer.prepend(prefixToContextPath);
 
                return buffer.toString();
        }
+
+       private static String choose(String value, String fallback1, String 
fallback2)
+       {
+               if (Strings.isEmpty(value))
+               {
+                       value = fallback1;
+                       if (Strings.isEmpty(value))
+                       {
+                               value = fallback2;
+                       }
+               }
+               return value;
+       }
+
+       private static Integer choose(Integer value, Integer fallback1, Integer 
fallback2)
+       {
+               if (value == null)
+               {
+                       value = fallback1;
+                       if (value == null)
+                       {
+                               value = fallback2;
+                       }
+               }
+               return value;
+       }
 }

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java?rev=1069181&r1=1069180&r2=1069181&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java
 Thu Feb 10 00:58:05 2011
@@ -80,8 +80,7 @@ public class RedirectRequestHandler impl
                if (redirectUrl.startsWith("/"))
                {
                        // context-absolute url
-                       location = 
requestCycle.getUrlRenderer().renderContextPathRelativeUrl(redirectUrl,
-                               requestCycle.getRequest());
+                       location = 
requestCycle.getUrlRenderer().renderContextPathRelativeUrl(redirectUrl);
                }
                else
                {


Reply via email to