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());
}
}