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: ["foo","bar"], fragment: baz </li> * <li>http://hostname:1234/foo/bar?a=b - protocol: http, host: hostname, port: 1234, segments: ["foo","bar"] </li> * <li>//hostname:1234/foo/bar?a=b - protocol: null, host: hostname, port: 1234, segments: ["foo","bar"] </li> * <li>foo/bar/baz?a=1&b=5 - segments: ["foo","bar","baz"], query parameters: ["a"="1", "b"="5"]</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)); + } /** *