From c26e705362dc5786a587457ade683a822a0a9b47 Mon Sep 17 00:00:00 2001 From: Andrea Del Bene Date: Tue, 14 Jan 2025 12:49:33 +0100 Subject: [PATCH] Wicket 7138 support ur lfragment with page parameters (#1072) --- .../request/mapper/MountedMapperTest.java | 3 +- .../wicket/request/mapper/AbstractMapper.java | 33 +++++----- .../mapper/parameter/PageParameters.java | 61 ++++++++++++++----- .../parameter/PageParametersEncoder.java | 4 ++ .../parameter/PageParametersEncoderTest.java | 3 +- 5 files changed, 72 insertions(+), 32 deletions(-) diff --git a/wicket-core-tests/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java b/wicket-core-tests/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java index 3cfd257c046..c81a1d13bad 100644 --- a/wicket-core-tests/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java +++ b/wicket-core-tests/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java @@ -370,11 +370,12 @@ void encode2() parameters.set(1, "i2"); parameters.set("a", "b", INamedParameters.Type.QUERY_STRING); parameters.set("b", "c", INamedParameters.Type.QUERY_STRING); + parameters.setFragment("fragment"); PageProvider provider = new PageProvider(MockPage.class, parameters); provider.setPageSource(context); IRequestHandler handler = new BookmarkablePageRequestHandler(provider); Url url = encoder.mapHandler(handler); - assertEquals("some/mount/path/i1/i2?a=b&b=c", url.toString()); + assertEquals("some/mount/path/i1/i2?a=b&b=c#fragment", url.toString()); } /** diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java index 14408c0f5ec..ff1a851923b 100644 --- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java @@ -216,22 +216,27 @@ protected Url encodePageParameters(Url url, PageParameters pageParameters, } Url parametersUrl = encoder.encodePageParameters(pageParameters); - if (parametersUrl != null) - { - // copy the url - url = new Url(url); - - for (String s : parametersUrl.getSegments()) - { - url.getSegments().add(s); - } - for (QueryParameter p : parametersUrl.getQueryParameters()) - { - url.getQueryParameters().add(p); - } + + if (parametersUrl == null) { + //nothing to do + return url; } + + // copy the url + Url urlCopy = new Url(url); - return url; + for (String s : parametersUrl.getSegments()) + { + urlCopy.getSegments().add(s); + } + for (QueryParameter p : parametersUrl.getQueryParameters()) + { + urlCopy.getQueryParameters().add(p); + } + + urlCopy.setFragment(parametersUrl.getFragment()); + + return urlCopy; } /** diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParameters.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParameters.java index 579cf8d180a..59e05a61562 100644 --- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParameters.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParameters.java @@ -44,7 +44,7 @@ *

*

* How those parameters are populated depends on the {@link IRequestMapper}s - * + * * @author Matej Knopp */ public class PageParameters implements IClusterable, IIndexedParameters, INamedParameters @@ -55,6 +55,8 @@ public class PageParameters implements IClusterable, IIndexedParameters, INamedP private List namedParameters; + private String fragment; + private Locale locale = Locale.getDefault(Locale.Category.DISPLAY); /** @@ -66,7 +68,7 @@ public PageParameters() /** * Copy constructor. - * + * * @param copy * The parameters to copy from */ @@ -158,7 +160,7 @@ public Set getNamedKeys() /** * Checks if the parameter with the given name exists - * + * * @param name the parameter name * @return {@code true} if the parameter exists, {@code false} otherwise */ @@ -298,7 +300,7 @@ public PageParameters remove(final String name, final String... values) /** * Adds a page parameter to these with {@code name} and {@code value} - * + * * @param name * @param value * @return these @@ -332,7 +334,7 @@ public PageParameters add(final String name, final Object value, final int index return this; } - private void addNamed(String name, String[] values, int index, Type type) + private void addNamed(String name, String[] values, int index, Type type) { if (namedParameters == null && values.length > 0) { @@ -345,7 +347,7 @@ private void addNamed(String name, String[] values, int index, Type type) } } - private void addNamed(String name, String value, int index, Type type) + private void addNamed(String name, String value, int index, Type type) { if (namedParameters == null) { @@ -366,7 +368,7 @@ private void addNamed(String name, String value, int index, Type type) /** * Sets the page parameter with {@code name} and {@code value} at the given {@code index} - * + * * @param name * @param value * @param index @@ -391,7 +393,7 @@ public PageParameters set(final String name, final Object value, final int index /** * Sets the page parameter with {@code name} and {@code value} - * + * * @param name * @param value * @return this @@ -425,7 +427,7 @@ public PageParameters clearNamed() /** * Copy the page parameters - * + * * @param other * The new parameters * @return this instance, for chaining @@ -437,13 +439,14 @@ public PageParameters overwriteWith(final PageParameters other) indexedParameters = other.indexedParameters; namedParameters = other.namedParameters; locale = other.locale; + fragment = other.fragment; } return this; } /** * Merges the page parameters into this, overwriting existing values - * + * * @param other * The parameters to merge * @return this instance, for chaining @@ -454,6 +457,8 @@ public PageParameters mergeWith(final PageParameters other) { mergeIndexed(other); mergeNamed(other); + + fragment = Objects.defaultIfNull(other.fragment, fragment); } return this; } @@ -471,7 +476,7 @@ private void mergeIndexed(PageParameters other) } } - private void mergeNamed(PageParameters other) + private void mergeNamed(PageParameters other) { final List otherNamed = other.namedParameters; if (otherNamed == null || otherNamed.isEmpty()) @@ -495,6 +500,16 @@ private void mergeNamed(PageParameters other) } } + public String getFragment() + { + return fragment; + } + + public void setFragment(String fragment) + { + this.fragment = fragment; + } + @Override public int hashCode() { @@ -502,6 +517,7 @@ public int hashCode() int result = 1; result = prime * result + ((indexedParameters == null) ? 0 : indexedParameters.hashCode()); result = prime * result + ((namedParameters == null) ? 0 : namedParameters.hashCode()); + result = prime * result + ((fragment == null) ? 0 : fragment.hashCode()); return result; } @@ -531,12 +547,14 @@ else if (other.namedParameters == null) return false; else if (!CollectionUtils.isEqualCollection(namedParameters, other.namedParameters)) return false; + if(!Strings.isEqual(other.fragment, fragment)) + return false; return true; } /** * Compares two {@link PageParameters} objects. - * + * * @param p1 * The first parameters * @param p2 @@ -549,11 +567,11 @@ public static boolean equals(final PageParameters p1, final PageParameters p2) { return true; } - if ((p1 == null) && (p2.getIndexedCount() == 0) && p2.getNamedCount() == 0) + if ((p1 == null) && (p2.getIndexedCount() == 0) && p2.getNamedCount() == 0 && p2.fragment == null) { return true; } - if ((p2 == null) && (p1.getIndexedCount() == 0) && p1.getNamedCount() == 0) + if ((p2 == null) && (p1.getIndexedCount() == 0) && p1.getNamedCount() == 0 && p1.fragment == null) { return true; } @@ -561,11 +579,11 @@ public static boolean equals(final PageParameters p1, final PageParameters p2) } /** - * @return true if the parameters are empty, false otherwise. + * @return true if the parameters are empty and fragment is null, false otherwise. */ public boolean isEmpty() { - return getIndexedCount() == 0 && getNamedCount() == 0; + return getIndexedCount() == 0 && getNamedCount() == 0 && fragment == null; } public PageParameters setLocale(Locale locale) @@ -615,6 +633,17 @@ public String toString() str.append('[').append(entry.getValue()).append(']'); } } + + if (fragment != null) + { + if (str.length() > 0) + { + str.append(", "); + } + + str.append("fragment=").append('\'').append(fragment).append('\''); + } + return str.toString(); } } diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoder.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoder.java index aa095deea24..0ad463eb588 100644 --- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoder.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoder.java @@ -54,6 +54,8 @@ public PageParameters decodePageParameters(final Url url) parameters.add(parameterName, p.getValue(), INamedParameters.Type.QUERY_STRING); } } + + parameters.setFragment(url.getFragment()); return parameters.isEmpty() ? null : parameters; } @@ -75,6 +77,8 @@ public Url encodePageParameters(final PageParameters pageParameters) QueryParameter param = new QueryParameter(pair.getKey(), pair.getValue()); url.getQueryParameters().add(param); } + + url.setFragment(pageParameters.getFragment()); } return url; diff --git a/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoderTest.java b/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoderTest.java index 27fde72729b..715428f7e4a 100644 --- a/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoderTest.java +++ b/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoderTest.java @@ -34,7 +34,7 @@ class PageParametersEncoderTest void decodeParameters() { PageParametersEncoder encoder = new PageParametersEncoder(); - Url url = Url.parse("idx1/idx2?named1=value1&=&named2=value2"); + Url url = Url.parse("idx1/idx2?named1=value1&=&named2=value2#fragment"); PageParameters pageParameters = encoder.decodePageParameters(url); assertEquals(2, pageParameters.getIndexedCount()); @@ -43,5 +43,6 @@ void decodeParameters() { assertEquals("idx2", pageParameters.get(1).toOptionalString()); assertEquals("value1", pageParameters.get("named1").toOptionalString()); assertEquals("value2", pageParameters.get("named2").toOptionalString()); + assertEquals("fragment", pageParameters.getFragment()); } }