Repository: wicket
Updated Branches:
  refs/heads/wicket-6.x a256f030e -> 58fa34bc8


WICKET-5717 Support fragment in Url parse and toString

(cherry picked from commit ca70ec70a0b7ea20f51db849ea866aa7c3d6cd11)


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/58fa34bc
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/58fa34bc
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/58fa34bc

Branch: refs/heads/wicket-6.x
Commit: 58fa34bc8ff9b531b61e9258ac33480296cc66f6
Parents: a256f03
Author: Guillaume Smet <guillaume.s...@gmail.com>
Authored: Wed Oct 1 01:42:27 2014 +0200
Committer: Martin Tzvetanov Grigorov <mgrigo...@apache.org>
Committed: Wed Oct 8 13:19:48 2014 +0300

----------------------------------------------------------------------
 .../core/request/mapper/MountedMapperTest.java  |  5 +-
 .../java/org/apache/wicket/request/Url.java     | 41 +++++++++++++++-
 .../java/org/apache/wicket/request/UrlTest.java | 50 +++++++++++++++++++-
 3 files changed, 92 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/58fa34bc/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
index 555bf33..14b1def 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
@@ -16,6 +16,9 @@
  */
 package org.apache.wicket.core.request.mapper;
 
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+
 import org.apache.wicket.MockPage;
 import 
org.apache.wicket.core.request.handler.BookmarkableListenerInterfaceRequestHandler;
 import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler;
@@ -707,7 +710,7 @@ public class MountedMapperTest extends AbstractMapperTest
                Url url = Url.parse("some/p1/path/p2/p3");
                IRequestHandler handler = 
optionPlaceholderEncoder.mapRequest(getRequest(url));
 
-               assertTrue(handler instanceof RenderPageRequestHandler);
+               assertThat(handler, 
is(instanceOf(RenderPageRequestHandler.class)));
                IRequestablePage page = 
((RenderPageRequestHandler)handler).getPage();
 
                assertEquals(0, page.getPageParameters().getIndexedCount());

http://git-wip-us.apache.org/repos/asf/wicket/blob/58fa34bc/wicket-request/src/main/java/org/apache/wicket/request/Url.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/Url.java 
b/wicket-request/src/main/java/org/apache/wicket/request/Url.java
index e32a2dc..a795cc1 100755
--- a/wicket-request/src/main/java/org/apache/wicket/request/Url.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/Url.java
@@ -53,6 +53,7 @@ import org.apache.wicket.util.string.Strings;
  * Example URLs:
  * 
  * <ul>
+ *     <li>http://hostname:1234/foo/bar?a=b#baz - protocol: http, host: 
hostname, port: 1234, segments: [&quot;foo&quot;,&quot;bar&quot;], fragment: 
baz </li>
  *     <li>http://hostname:1234/foo/bar?a=b - protocol: http, host: hostname, 
port: 1234, segments: [&quot;foo&quot;,&quot;bar&quot;] </li>
  *     <li>//hostname:1234/foo/bar?a=b - protocol: null, host: hostname, port: 
1234, segments: [&quot;foo&quot;,&quot;bar&quot;] </li>
  *     <li>foo/bar/baz?a=1&amp;b=5    - segments: 
[&quot;foo&quot;,&quot;bar&quot;,&quot;baz&quot;], query parameters: 
[&quot;a&quot;=&quot;1&quot;, &quot;b&quot;=&quot;5&quot;]</li>
@@ -84,6 +85,7 @@ public class Url implements Serializable
        private String protocol;
        private Integer port;
        private String host;
+       private String fragment;
 
        /**
         * Modes with which urls can be stringized
@@ -229,6 +231,15 @@ public class Url implements Serializable
                final String queryString;
                final String absoluteUrl;
 
+               final int fragmentAt = url.indexOf('#');
+
+               // matches url fragment, but doesn't match optional path 
parameter (e.g. .../#{optional}/...)
+               if (fragmentAt > -1 && url.length() > fragmentAt + 1 && 
url.charAt(fragmentAt + 1) != '{')
+               {
+                       result.fragment = url.substring(fragmentAt + 1);
+                       url = url.substring(0, fragmentAt);
+               }
+
                final int queryAt = url.indexOf('?');
 
                if (queryAt == -1)
@@ -448,6 +459,24 @@ public class Url implements Serializable
        }
 
        /**
+        * 
+        * @return fragment
+        */
+       public String getFragment()
+       {
+               return fragment;
+       }
+
+       /**
+        * 
+        * @param fragment
+        */
+       public void setFragment(String fragment)
+       {
+               this.fragment = fragment;
+       }
+
+       /**
         * Returns whether the Url is absolute. Absolute Urls start with a 
'{@literal /}'.
         * 
         * @return <code>true</code> if Url is absolute, <code>false</code> 
otherwise.
@@ -610,7 +639,8 @@ public class Url implements Serializable
                Url rhs = (Url)obj;
 
                return getSegments().equals(rhs.getSegments()) &&
-                       getQueryParameters().equals(rhs.getQueryParameters());
+                       getQueryParameters().equals(rhs.getQueryParameters()) &&
+                       Objects.isEqual(getFragment(), rhs.getFragment());
        }
 
        /**
@@ -619,7 +649,7 @@ public class Url implements Serializable
        @Override
        public int hashCode()
        {
-               return Objects.hashCode(getSegments(), getQueryParameters());
+               return Objects.hashCode(getSegments(), getQueryParameters(), 
getFragment());
        }
 
        /**
@@ -731,6 +761,13 @@ public class Url implements Serializable
 
                result.append(path);
                result.append(getQueryString(charset));
+
+               String _fragment = getFragment();
+               if (Strings.isEmpty(_fragment) == false)
+               {
+                       result.append('#').append(_fragment);
+               }
+
                return result.toString();
        }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/58fa34bc/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java 
b/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
index 5140b6c..bfd7318 100644
--- a/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
+++ b/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
@@ -16,6 +16,9 @@
  */
 package org.apache.wicket.request;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
@@ -60,10 +63,11 @@ public class UrlTest extends Assert
        @Test
        public void parse1()
        {
-               String s = "foo/bar/baz?a=4&b=5";
+               String s = "foo/bar/baz?a=4&b=5#foo2";
                Url url = Url.parse(s);
                checkSegments(url, "foo", "bar", "baz");
                checkQueryParams(url, "a", "4", "b", "5");
+               assertEquals("foo2", url.getFragment());
        }
 
        /**
@@ -286,6 +290,39 @@ public class UrlTest extends Assert
        }
 
        /**
+        * https://issues.apache.org/jira/browse/WICKET-5717
+        */
+       @Test
+       public void parse19()
+       {
+               String s = "http://me:secret@localhost:8080/segment/#fragment";;
+               Url url = Url.parse(s);
+               assertEquals("fragment", url.getFragment());
+       }
+
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-5717
+        */
+       @Test
+       public void parse20()
+       {
+               String s = "http://me:secret@localhost:8080/segment/#";;
+               Url url = Url.parse(s);
+               assertThat(url.getFragment(), is(nullValue()));
+       }
+
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-5717
+        */
+       @Test
+       public void parse21()
+       {
+               String s = "http://me:secret@localhost:8080/segment#";;
+               Url url = Url.parse(s);
+               assertThat(url.getFragment(), is(nullValue()));
+       }
+
+       /**
         * 
         */
        @Test
@@ -350,6 +387,17 @@ public class UrlTest extends Assert
                assertEquals(url.toString(StringMode.LOCAL), url.toString());
        }
 
+       @Test
+       public void render6()
+       {
+               Url url = 
Url.parse("https://www.domain.com/foo/bar?baz=ban#bat";);
+
+               // local string mode
+               assertEquals("/foo/bar?baz=ban#bat", 
url.toString(StringMode.LOCAL));
+
+               // full string mode
+               assertEquals("https://www.domain.com/foo/bar?baz=ban#bat";, 
url.toString(StringMode.FULL));
+       }
 
        /**
         * 

Reply via email to