You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/08/07 10:59:37 UTC
git commit: WICKET-4686
Updated Branches:
refs/heads/sandbox/WICKET-4686 [created] 8b4d9de39
WICKET-4686
Make it possible to use named mandatory and optional parameters in the url mounted with PackageMapper
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/8b4d9de3
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/8b4d9de3
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/8b4d9de3
Branch: refs/heads/sandbox/WICKET-4686
Commit: 8b4d9de39eedeef10ff1ff0a383606b6b94785bb
Parents: f99a241
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Tue Aug 7 11:58:10 2012 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Tue Aug 7 11:58:10 2012 +0300
----------------------------------------------------------------------
.../request/mapper/AbstractBookmarkableMapper.java | 230 +++++++++++++++
.../core/request/mapper/BookmarkableMapper.java | 29 +--
.../wicket/core/request/mapper/MountedMapper.java | 225 +--------------
.../wicket/core/request/mapper/PackageMapper.java | 49 ++--
.../wicket/protocol/http/WebApplication.java | 6 +-
.../core/request/mapper/PackageMapperTest.java | 104 +++++--
.../wicket/request/mapper/mount/MountMapper.java | 5 +-
.../mapper/mount/UnmountedMapperAdapter.java | 14 +-
.../mount/UnmountedRequestHandlerAdapter.java | 11 +-
.../mapper/parameter/PageParametersEncoder.java | 6 -
10 files changed, 351 insertions(+), 328 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/8b4d9de3/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
index 86c64a6..bd920de 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
@@ -16,6 +16,9 @@
*/
package org.apache.wicket.core.request.mapper;
+import java.util.ArrayList;
+import java.util.List;
+
import org.apache.wicket.RequestListenerInterface;
import org.apache.wicket.core.request.handler.BookmarkableListenerInterfaceRequestHandler;
import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler;
@@ -34,7 +37,9 @@ import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.mapper.info.ComponentInfo;
import org.apache.wicket.request.mapper.info.PageComponentInfo;
import org.apache.wicket.request.mapper.info.PageInfo;
+import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
import org.apache.wicket.util.lang.Args;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -133,11 +138,27 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper
}
}
+ private final List<MountPathSegment> pathSegments;
+
+ protected final String[] mountSegments;
+
+ protected final IPageParametersEncoder pageParametersEncoder;
+
/**
* Construct.
*/
public AbstractBookmarkableMapper()
{
+ this("notUsed", new PageParametersEncoder());
+ }
+
+ public AbstractBookmarkableMapper(String mountPath, IPageParametersEncoder pageParametersEncoder)
+ {
+ Args.notEmpty(mountPath, "mountPath");
+
+ this.pageParametersEncoder = Args.notNull(pageParametersEncoder, "pageParametersEncoder");
+ mountSegments = getMountSegments(mountPath);
+ pathSegments = getPathSegments(mountSegments);
}
/**
@@ -428,4 +449,213 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper
return new PageInfo(pageId);
}
+
+ protected static class MountPathSegment
+ {
+ private int segmentIndex;
+ private String fixedPart;
+ private int minParameters;
+ private int optionalParameters;
+
+ public MountPathSegment(int segmentIndex)
+ {
+ this.segmentIndex = segmentIndex;
+ }
+
+ public void setFixedPart(String fixedPart)
+ {
+ this.fixedPart = fixedPart;
+ }
+
+ public void addRequiredParameter()
+ {
+ minParameters++;
+ }
+
+ public void addOptionalParameter()
+ {
+ optionalParameters++;
+ }
+
+ public int getSegmentIndex()
+ {
+ return segmentIndex;
+ }
+
+ public String getFixedPart()
+ {
+ return fixedPart;
+ }
+
+ public int getMinParameters()
+ {
+ return minParameters;
+ }
+
+ public int getOptionalParameters()
+ {
+ return optionalParameters;
+ }
+
+ public int getMaxParameters()
+ {
+ return getOptionalParameters() + getMinParameters();
+ }
+
+ public int getFixedPartSize()
+ {
+ return getFixedPart() == null ? 0 : 1;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "(" + getSegmentIndex() + ") " + getMinParameters() + '-' + getMaxParameters() +
+ ' ' + (getFixedPart() == null ? "(end)" : getFixedPart());
+ }
+ }
+
+ protected List<MountPathSegment> getPathSegments(String[] segments)
+ {
+ List<MountPathSegment> ret = new ArrayList<MountPathSegment>();
+ int segmentIndex = 0;
+ MountPathSegment curPathSegment = new MountPathSegment(segmentIndex);
+ ret.add(curPathSegment);
+ for (String curSegment : segments)
+ {
+ if (isFixedSegment(curSegment))
+ {
+ curPathSegment.setFixedPart(curSegment);
+ curPathSegment = new MountPathSegment(segmentIndex + 1);
+ ret.add(curPathSegment);
+ }
+ else if (getPlaceholder(curSegment) != null)
+ {
+ curPathSegment.addRequiredParameter();
+ }
+ else
+ {
+ curPathSegment.addOptionalParameter();
+ }
+ segmentIndex++;
+ }
+ return ret;
+ }
+
+ protected boolean isFixedSegment(String segment)
+ {
+ return getOptionalPlaceholder(segment) == null && getPlaceholder(segment) == null;
+ }
+
+
+ /**
+ * Extracts the PageParameters from URL if there are any
+ */
+ protected PageParameters extractPageParameters(Request request, Url url)
+ {
+ int[] matchedParameters = getMatchedSegmentSizes(url);
+ int total = 0;
+ for (int curMatchSize : matchedParameters)
+ total += curMatchSize;
+ PageParameters pageParameters = extractPageParameters(request, total, pageParametersEncoder);
+
+ int skippedParameters = 0;
+ for (int pathSegmentIndex = 0; pathSegmentIndex < pathSegments.size(); pathSegmentIndex++)
+ {
+ MountPathSegment curPathSegment = pathSegments.get(pathSegmentIndex);
+ int matchSize = matchedParameters[pathSegmentIndex] - curPathSegment.getFixedPartSize();
+ int optionalParameterMatch = matchSize - curPathSegment.getMinParameters();
+ for (int matchSegment = 0; matchSegment < matchSize; matchSegment++)
+ {
+ if (pageParameters == null)
+ {
+ pageParameters = new PageParameters();
+ }
+
+ int curSegmentIndex = matchSegment + curPathSegment.getSegmentIndex();
+ String curSegment = mountSegments[curSegmentIndex];
+ String placeholder = getPlaceholder(curSegment);
+ String optionalPlaceholder = getOptionalPlaceholder(curSegment);
+ // extract the parameter from URL
+ if (placeholder != null)
+ {
+ pageParameters.add(placeholder,
+ url.getSegments().get(curSegmentIndex - skippedParameters));
+ }
+ else if (optionalPlaceholder != null && optionalParameterMatch > 0)
+ {
+ pageParameters.add(optionalPlaceholder,
+ url.getSegments().get(curSegmentIndex - skippedParameters));
+ optionalParameterMatch--;
+ }
+ }
+ skippedParameters += curPathSegment.getMaxParameters() - matchSize;
+ }
+ return pageParameters;
+ }
+
+ protected int[] getMatchedSegmentSizes(Url url)
+ {
+ int[] ret = new int[pathSegments.size()];
+ int segmentIndex = 0;
+ int pathSegmentIndex = 0;
+ for (MountPathSegment curPathSegment : pathSegments.subList(0, pathSegments.size() - 1))
+ {
+ boolean foundFixedPart = false;
+ segmentIndex += curPathSegment.getMinParameters();
+ int max = Math.min(curPathSegment.getOptionalParameters() + 1,
+ url.getSegments().size() - segmentIndex);
+
+ for (int count = max - 1; count >= 0; count--)
+ {
+ if (url.getSegments()
+ .get(segmentIndex + count)
+ .equals(curPathSegment.getFixedPart()))
+ {
+ foundFixedPart = true;
+ segmentIndex += count + 1;
+ ret[pathSegmentIndex] = count + curPathSegment.getMinParameters() + 1;
+ break;
+ }
+ }
+ if (!foundFixedPart)
+ return null;
+ pathSegmentIndex++;
+ }
+ MountPathSegment lastSegment = pathSegments.get(pathSegments.size() - 1);
+ segmentIndex += lastSegment.getMinParameters();
+ if (segmentIndex > url.getSegments().size())
+ return null;
+ ret[pathSegmentIndex] = Math.min(lastSegment.getMaxParameters(), url.getSegments().size() -
+ segmentIndex + lastSegment.getMinParameters());
+ return ret;
+ }
+
+ protected void setPlaceholders(PageParameters parameters, Url url)
+ {
+ int dropped = 0;
+ for (int i = 0; i < mountSegments.length; ++i)
+ {
+ String placeholder = getPlaceholder(mountSegments[i]);
+ String optionalPlaceholder = getOptionalPlaceholder(mountSegments[i]);
+ if (placeholder != null)
+ {
+ url.getSegments().set(i - dropped, parameters.get(placeholder).toString(""));
+ parameters.remove(placeholder);
+ }
+ else if (optionalPlaceholder != null)
+ {
+ if (parameters.getNamedKeys().contains(optionalPlaceholder))
+ {
+ url.getSegments().set(i - dropped, parameters.get(optionalPlaceholder).toString(""));
+ parameters.remove(optionalPlaceholder);
+ }
+ else
+ {
+ url.getSegments().remove(i - dropped);
+ dropped++;
+ }
+ }
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/8b4d9de3/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java
index f8c7ffe..f3a8dac 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java
@@ -24,7 +24,6 @@ import org.apache.wicket.request.mapper.info.PageComponentInfo;
import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
-import org.apache.wicket.util.lang.Args;
/**
* Decodes and encodes the following URLs:
@@ -47,31 +46,24 @@ import org.apache.wicket.util.lang.Args;
*/
public class BookmarkableMapper extends AbstractBookmarkableMapper
{
- private final IPageParametersEncoder pageParametersEncoder;
-
/**
* Construct.
- *
- * @param pageParametersEncoder
*/
- public BookmarkableMapper(IPageParametersEncoder pageParametersEncoder)
+ public BookmarkableMapper()
{
- Args.notNull(pageParametersEncoder, "pageParametersEncoder");
-
- this.pageParametersEncoder = pageParametersEncoder;
+ this(new PageParametersEncoder());
}
/**
* Construct.
+ *
+ * @param pageParametersEncoder
*/
- public BookmarkableMapper()
+ public BookmarkableMapper(IPageParametersEncoder pageParametersEncoder)
{
- this(new PageParametersEncoder());
+ super("notUsed", pageParametersEncoder);
}
- /**
- * @see AbstractBookmarkableMapper#buildUrl(AbstractBookmarkableMapper.UrlInfo)
- */
@Override
protected Url buildUrl(UrlInfo info)
{
@@ -85,9 +77,6 @@ public class BookmarkableMapper extends AbstractBookmarkableMapper
return encodePageParameters(url, info.getPageParameters(), pageParametersEncoder);
}
- /**
- * @see AbstractBookmarkableMapper#parseRequest(org.apache.wicket.request.Request)
- */
@Override
protected UrlInfo parseRequest(Request request)
{
@@ -122,18 +111,12 @@ public class BookmarkableMapper extends AbstractBookmarkableMapper
return null;
}
- /**
- * @see AbstractBookmarkableMapper#pageMustHaveBeenCreatedBookmarkable()
- */
@Override
protected boolean pageMustHaveBeenCreatedBookmarkable()
{
return true;
}
- /**
- * @see AbstractBookmarkableMapper#getCompatibilityScore(org.apache.wicket.request.Request)
- */
@Override
public int getCompatibilityScore(Request request)
{
http://git-wip-us.apache.org/repos/asf/wicket/blob/8b4d9de3/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
index a7a5be8..37aada6 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
@@ -16,9 +16,6 @@
*/
package org.apache.wicket.core.request.mapper;
-import java.util.ArrayList;
-import java.util.List;
-
import org.apache.wicket.Application;
import org.apache.wicket.RequestListenerInterface;
import org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler;
@@ -66,76 +63,6 @@ import org.apache.wicket.util.string.Strings;
*/
public class MountedMapper extends AbstractBookmarkableMapper
{
- private final IPageParametersEncoder pageParametersEncoder;
-
- private static class MountPathSegment
- {
- private int segmentIndex;
- private String fixedPart;
- private int minParameters;
- private int optionalParameters;
-
- public MountPathSegment(int segmentIndex)
- {
- this.segmentIndex = segmentIndex;
- }
-
- public void setFixedPart(String fixedPart)
- {
- this.fixedPart = fixedPart;
- }
-
- public void addRequiredParameter()
- {
- minParameters++;
- }
-
- public void addOptionalParameter()
- {
- optionalParameters++;
- }
-
- public int getSegmentIndex()
- {
- return segmentIndex;
- }
-
- public String getFixedPart()
- {
- return fixedPart;
- }
-
- public int getMinParameters()
- {
- return minParameters;
- }
-
- public int getOptionalParameters()
- {
- return optionalParameters;
- }
-
- public int getMaxParameters()
- {
- return getOptionalParameters() + getMinParameters();
- }
-
- public int getFixedPartSize()
- {
- return getFixedPart() == null ? 0 : 1;
- }
-
- @Override
- public String toString()
- {
- return "(" + getSegmentIndex() + ") " + getMinParameters() + "-" + getMaxParameters() +
- " " + (getFixedPart() == null ? "(end)" : getFixedPart());
- }
- }
-
- private final List<MountPathSegment> pathSegments;
- private final String[] mountSegments;
-
/** bookmarkable page class. */
private final ClassProvider<? extends IRequestablePage> pageClassProvider;
@@ -186,51 +113,13 @@ public class MountedMapper extends AbstractBookmarkableMapper
ClassProvider<? extends IRequestablePage> pageClassProvider,
IPageParametersEncoder pageParametersEncoder)
{
- Args.notEmpty(mountPath, "mountPath");
+ super(mountPath, pageParametersEncoder);
+
Args.notNull(pageClassProvider, "pageClassProvider");
- Args.notNull(pageParametersEncoder, "pageParametersEncoder");
- this.pageParametersEncoder = pageParametersEncoder;
this.pageClassProvider = pageClassProvider;
- mountSegments = getMountSegments(mountPath);
- pathSegments = getPathSegments(mountSegments);
}
- private List<MountPathSegment> getPathSegments(String[] segments)
- {
- List<MountPathSegment> ret = new ArrayList<MountPathSegment>();
- int segmentIndex = 0;
- MountPathSegment curPathSegment = new MountPathSegment(segmentIndex);
- ret.add(curPathSegment);
- for (String curSegment : segments)
- {
- if (isFixedSegment(curSegment))
- {
- curPathSegment.setFixedPart(curSegment);
- curPathSegment = new MountPathSegment(segmentIndex + 1);
- ret.add(curPathSegment);
- }
- else if (getPlaceholder(curSegment) != null)
- {
- curPathSegment.addRequiredParameter();
- }
- else
- {
- curPathSegment.addOptionalParameter();
- }
- segmentIndex++;
- }
- return ret;
- }
-
- private boolean isFixedSegment(String segment)
- {
- return getOptionalPlaceholder(segment) == null && getPlaceholder(segment) == null;
- }
-
- /**
- * @see AbstractBookmarkableMapper#parseRequest(org.apache.wicket.request.Request)
- */
@Override
protected UrlInfo parseRequest(Request request)
{
@@ -259,52 +148,6 @@ public class MountedMapper extends AbstractBookmarkableMapper
}
}
- /*
- * extract the PageParameters from URL if there are any
- */
- private PageParameters extractPageParameters(Request request, Url url)
- {
- int[] matchedParameters = getMatchedSegmentSizes(url);
- int total = 0;
- for (int curMatchSize : matchedParameters)
- total += curMatchSize;
- PageParameters pageParameters = extractPageParameters(request, total, pageParametersEncoder);
-
- int skippedParameters = 0;
- for (int pathSegmentIndex = 0; pathSegmentIndex < pathSegments.size(); pathSegmentIndex++)
- {
- MountPathSegment curPathSegment = pathSegments.get(pathSegmentIndex);
- int matchSize = matchedParameters[pathSegmentIndex] - curPathSegment.getFixedPartSize();
- int optionalParameterMatch = matchSize - curPathSegment.getMinParameters();
- for (int matchSegment = 0; matchSegment < matchSize; matchSegment++)
- {
- if (pageParameters == null)
- {
- pageParameters = new PageParameters();
- }
-
- int curSegmentIndex = matchSegment + curPathSegment.getSegmentIndex();
- String curSegment = mountSegments[curSegmentIndex];
- String placeholder = getPlaceholder(curSegment);
- String optionalPlaceholder = getOptionalPlaceholder(curSegment);
- // extract the parameter from URL
- if (placeholder != null)
- {
- pageParameters.add(placeholder,
- url.getSegments().get(curSegmentIndex - skippedParameters));
- }
- else if (optionalPlaceholder != null && optionalParameterMatch > 0)
- {
- pageParameters.add(optionalPlaceholder,
- url.getSegments().get(curSegmentIndex - skippedParameters));
- optionalParameterMatch--;
- }
- }
- skippedParameters += curPathSegment.getMaxParameters() - matchSize;
- }
- return pageParameters;
- }
-
@Override
protected boolean urlStartsWith(Url url, String... segments)
{
@@ -318,43 +161,6 @@ public class MountedMapper extends AbstractBookmarkableMapper
}
}
- private int[] getMatchedSegmentSizes(Url url)
- {
- int[] ret = new int[pathSegments.size()];
- int segmentIndex = 0;
- int pathSegmentIndex = 0;
- for (MountPathSegment curPathSegment : pathSegments.subList(0, pathSegments.size() - 1))
- {
- boolean foundFixedPart = false;
- segmentIndex += curPathSegment.getMinParameters();
- int max = Math.min(curPathSegment.getOptionalParameters() + 1,
- url.getSegments().size() - segmentIndex);
-
- for (int count = max - 1; count >= 0; count--)
- {
- if (url.getSegments()
- .get(segmentIndex + count)
- .equals(curPathSegment.getFixedPart()))
- {
- foundFixedPart = true;
- segmentIndex += count + 1;
- ret[pathSegmentIndex] = count + curPathSegment.getMinParameters() + 1;
- break;
- }
- }
- if (!foundFixedPart)
- return null;
- pathSegmentIndex++;
- }
- MountPathSegment lastSegment = pathSegments.get(pathSegments.size() - 1);
- segmentIndex += lastSegment.getMinParameters();
- if (segmentIndex > url.getSegments().size())
- return null;
- ret[pathSegmentIndex] = Math.min(lastSegment.getMaxParameters(), url.getSegments().size() -
- segmentIndex + lastSegment.getMinParameters());
- return ret;
- }
-
protected PageParameters newPageParameters()
{
return new PageParameters();
@@ -415,32 +221,7 @@ public class MountedMapper extends AbstractBookmarkableMapper
encodePageComponentInfo(url, info.getPageComponentInfo());
PageParameters copy = new PageParameters(info.getPageParameters());
-
- int dropped = 0;
- for (int i = 0; i < mountSegments.length; ++i)
- {
- String placeholder = getPlaceholder(mountSegments[i]);
- String optionalPlaceholder = getOptionalPlaceholder(mountSegments[i]);
- if (placeholder != null)
- {
- url.getSegments().set(i - dropped, copy.get(placeholder).toString(""));
- copy.remove(placeholder);
- }
- else if (optionalPlaceholder != null)
- {
- if (copy.getNamedKeys().contains(optionalPlaceholder))
- {
- url.getSegments().set(i - dropped, copy.get(optionalPlaceholder).toString(""));
- copy.remove(optionalPlaceholder);
- }
- else
- {
- url.getSegments().remove(i - dropped);
- dropped++;
- }
- }
- }
-
+ setPlaceholders(copy, url);
return encodePageParameters(url, copy, pageParametersEncoder);
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/8b4d9de3/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java
index 54729e9..2e5d3fe 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java
@@ -66,38 +66,32 @@ public class PackageMapper extends AbstractBookmarkableMapper
*/
private final PackageName packageName;
- /** the encoder used to encode/decode the page parameters */
- private final IPageParametersEncoder pageParametersEncoder;
-
/**
- * Construct.
+ * Constructor.
*
* @param packageName
*/
- public PackageMapper(final PackageName packageName)
+ public PackageMapper(String mountPath, final PackageName packageName)
{
- this(packageName, new PageParametersEncoder());
+ this(mountPath, packageName, new PageParametersEncoder());
}
/**
- * Construct.
+ * Constructor.
*
* @param packageName
* @param pageParametersEncoder
*/
- public PackageMapper(final PackageName packageName,
+ public PackageMapper(String mountPath, final PackageName packageName,
final IPageParametersEncoder pageParametersEncoder)
{
+ super(mountPath, pageParametersEncoder);
+
Args.notNull(packageName, "packageName");
- Args.notNull(pageParametersEncoder, "pageParametersEncoder");
this.packageName = packageName;
- this.pageParametersEncoder = pageParametersEncoder;
}
- /**
- * @see org.apache.wicket.core.request.mapper.AbstractBookmarkableMapper#buildUrl(UrlInfo)
- */
@Override
protected Url buildUrl(UrlInfo info)
{
@@ -106,6 +100,10 @@ public class PackageMapper extends AbstractBookmarkableMapper
if (pageClassPackageName.equals(packageName))
{
Url url = new Url();
+ for (String s : mountSegments)
+ {
+ url.getSegments().add(s);
+ }
String fullyQualifiedClassName = pageClass.getName();
String packageRelativeClassName = fullyQualifiedClassName;
@@ -117,26 +115,27 @@ public class PackageMapper extends AbstractBookmarkableMapper
packageRelativeClassName = transformForUrl(packageRelativeClassName);
url.getSegments().add(packageRelativeClassName);
encodePageComponentInfo(url, info.getPageComponentInfo());
- return encodePageParameters(url, info.getPageParameters(), pageParametersEncoder);
+
+ PageParameters copy = new PageParameters(info.getPageParameters());
+ setPlaceholders(copy, url);
+
+ return encodePageParameters(url, copy, pageParametersEncoder);
}
return null;
}
- /**
- * @see org.apache.wicket.core.request.mapper.AbstractBookmarkableMapper#parseRequest(org.apache.wicket.request.Request)
- */
@Override
protected UrlInfo parseRequest(Request request)
{
Url url = request.getUrl();
- if (url.getSegments().size() >= 1)
+ if (url.getSegments().size() > mountSegments.length)
{
// try to extract page and component information from URL
PageComponentInfo info = getPageComponentInfo(url);
// load the page class
- String className = url.getSegments().get(0);
+ String className = url.getSegments().get(mountSegments.length);
if (isValidClassName(className) == false)
{
@@ -151,8 +150,10 @@ public class PackageMapper extends AbstractBookmarkableMapper
IRequestablePage.class.isAssignableFrom(pageClass))
{
// extract the PageParameters from URL if there are any
- PageParameters pageParameters = extractPageParameters(request, 1,
- pageParametersEncoder);
+ Url urlWithoutPageSegment = new Url(url);
+ urlWithoutPageSegment.getSegments().remove(mountSegments.length);
+ Request requestWithoutPageSegment = request.cloneWithUrl(urlWithoutPageSegment);
+ PageParameters pageParameters = extractPageParameters(requestWithoutPageSegment, urlWithoutPageSegment);
return new UrlInfo(info, pageClass, pageParameters);
}
@@ -210,18 +211,12 @@ public class PackageMapper extends AbstractBookmarkableMapper
return className;
}
- /**
- * @see org.apache.wicket.core.request.mapper.AbstractBookmarkableMapper#pageMustHaveBeenCreatedBookmarkable()
- */
@Override
protected boolean pageMustHaveBeenCreatedBookmarkable()
{
return true;
}
- /**
- * @see org.apache.wicket.core.request.mapper.AbstractBookmarkableMapper#getCompatibilityScore(org.apache.wicket.request.Request)
- */
@Override
public int getCompatibilityScore(Request request)
{
http://git-wip-us.apache.org/repos/asf/wicket/blob/8b4d9de3/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
index 42ab5d1..384184d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
+++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
@@ -62,7 +62,6 @@ import org.apache.wicket.request.handler.render.PageRenderer;
import org.apache.wicket.request.handler.render.WebPageRenderer;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
-import org.apache.wicket.request.mapper.mount.MountMapper;
import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import org.apache.wicket.request.resource.ResourceReference;
@@ -366,9 +365,8 @@ public abstract class WebApplication extends Application
*/
public final <P extends Page> void mountPackage(final String path, final Class<P> pageClass)
{
- PackageMapper packageMapper = new PackageMapper(PackageName.forClass(pageClass));
- MountMapper mountMapper = new MountMapper(path, packageMapper);
- mount(mountMapper);
+ PackageMapper packageMapper = new PackageMapper(path, PackageName.forClass(pageClass));
+ mount(packageMapper);
}
/**
http://git-wip-us.apache.org/repos/asf/wicket/blob/8b4d9de3/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
index a342bd5..9aafdac 100644
--- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
@@ -40,10 +40,11 @@ import org.junit.Test;
*/
public class PackageMapperTest extends AbstractMapperTest
{
+ private static final String MOUNT_PATH = "mount/path";
private static final String ALIAS = "alias";
- private final PackageMapper encoder = new PackageMapper(PackageName.forClass(MockPage.class))
+ private final PackageMapper encoder = new PackageMapper(MOUNT_PATH, PackageName.forClass(MockPage.class))
{
@Override
protected IMapperContext getContext()
@@ -54,7 +55,7 @@ public class PackageMapperTest extends AbstractMapperTest
private static final String PAGE_CLASS_NAME = MockPage.class.getSimpleName();
- private final PackageMapper aliasEncoder = new PackageMapper(
+ private final PackageMapper aliasEncoder = new PackageMapper(MOUNT_PATH,
PackageName.forClass(MockPage.class))
{
@Override
@@ -94,13 +95,22 @@ public class PackageMapperTest extends AbstractMapperTest
}
};
+ private final PackageMapper namedParametersEncoder = new PackageMapper(MOUNT_PATH + "/${foo}/${bar}", PackageName.forClass(MockPage.class))
+ {
+ @Override
+ protected IMapperContext getContext()
+ {
+ return context;
+ }
+ };
+
/**
*
*/
@Test
public void decode1()
{
- Url url = Url.parse(PAGE_CLASS_NAME);
+ Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME);
IRequestHandler handler = encoder.mapRequest(getRequest(url));
assertTrue(handler instanceof RenderPageRequestHandler);
@@ -116,7 +126,7 @@ public class PackageMapperTest extends AbstractMapperTest
@Test
public void decode2()
{
- Url url = Url.parse(PAGE_CLASS_NAME + "/indexed1?a=b&b=c");
+ Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/indexed1?a=b&b=c");
IRequestHandler handler = encoder.mapRequest(getRequest(url));
assertTrue(handler instanceof RenderPageRequestHandler);
@@ -138,7 +148,7 @@ public class PackageMapperTest extends AbstractMapperTest
@Test
public void decode3()
{
- Url url = Url.parse(PAGE_CLASS_NAME + "?15");
+ Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "?15");
IRequestHandler handler = encoder.mapRequest(getRequest(url));
assertTrue(handler instanceof RenderPageRequestHandler);
@@ -152,7 +162,7 @@ public class PackageMapperTest extends AbstractMapperTest
@Test
public void decode4()
{
- Url url = Url.parse(PAGE_CLASS_NAME + "/i1/i2?15&a=b&b=c");
+ Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?15&a=b&b=c");
IRequestHandler handler = encoder.mapRequest(getRequest(url));
assertTrue(handler instanceof RenderPageRequestHandler);
@@ -171,7 +181,7 @@ public class PackageMapperTest extends AbstractMapperTest
@Test
public void decode5()
{
- Url url = Url.parse(PAGE_CLASS_NAME + "?15-ILinkListener-foo-bar");
+ Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "?15-ILinkListener-foo-bar");
IRequestHandler handler = encoder.mapRequest(getRequest(url));
assertTrue(handler instanceof ListenerInterfaceRequestHandler);
@@ -192,7 +202,7 @@ public class PackageMapperTest extends AbstractMapperTest
@Test
public void decode6()
{
- Url url = Url.parse(PAGE_CLASS_NAME + "/i1/i2?15-ILinkListener-foo-bar&a=b&b=c");
+ Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?15-ILinkListener-foo-bar&a=b&b=c");
IRequestHandler handler = encoder.mapRequest(getRequest(url));
assertTrue(handler instanceof ListenerInterfaceRequestHandler);
@@ -216,7 +226,7 @@ public class PackageMapperTest extends AbstractMapperTest
@Test
public void decode7()
{
- Url url = Url.parse(PAGE_CLASS_NAME + "?15-ILinkListener.4-foo-bar");
+ Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "?15-ILinkListener.4-foo-bar");
IRequestHandler handler = encoder.mapRequest(getRequest(url));
assertTrue(handler instanceof ListenerInterfaceRequestHandler);
@@ -237,7 +247,7 @@ public class PackageMapperTest extends AbstractMapperTest
@Test
public void decode8()
{
- Url url = Url.parse(PAGE_CLASS_NAME + "/i1/i2?15-5.ILinkListener-foo-bar&a=b&b=c");
+ Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?15-5.ILinkListener-foo-bar&a=b&b=c");
context.setNextPageRenderCount(5);
@@ -256,7 +266,7 @@ public class PackageMapperTest extends AbstractMapperTest
@Test(expected = StalePageException.class)
public void decode9()
{
- Url url = Url.parse(PAGE_CLASS_NAME + "/i1/i2?15-5.ILinkListener-foo-bar&a=b&b=c");
+ Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?15-5.ILinkListener-foo-bar&a=b&b=c");
context.setNextPageRenderCount(6);
@@ -267,6 +277,33 @@ public class PackageMapperTest extends AbstractMapperTest
}
/**
+ *
+ */
+ @Test
+ public void decodeNamedParameters()
+ {
+ Url url = Url.parse(MOUNT_PATH + "/fooValue/barValue/" + PAGE_CLASS_NAME + "/i1/i2?15-ILinkListener-foo-bar&a=b&b=c");
+ IRequestHandler handler = namedParametersEncoder.mapRequest(getRequest(url));
+
+ assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+ ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+ IRequestablePage page = h.getPage();
+ checkPage(page, 15);
+
+ assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
+ assertEquals("foo:bar", h.getComponent().getPageRelativePath());
+
+ PageParameters p = h.getPageParameters();
+ assertEquals(2, p.getIndexedCount());
+
+ assertEquals(4, p.getNamedKeys().size());
+ assertEquals("fooValue", p.get("foo").toString());
+ assertEquals("barValue", p.get("bar").toString());
+
+ }
+
+ /**
* WICKET-2993
*/
@Test
@@ -289,7 +326,7 @@ public class PackageMapperTest extends AbstractMapperTest
provider.setPageSource(context);
IRequestHandler handler = new BookmarkablePageRequestHandler(provider);
Url url = encoder.mapHandler(handler);
- assertEquals(PAGE_CLASS_NAME, url.toString());
+ assertEquals(MOUNT_PATH + '/' + PAGE_CLASS_NAME, url.toString());
}
/**
@@ -307,7 +344,7 @@ public class PackageMapperTest extends AbstractMapperTest
provider.setPageSource(context);
IRequestHandler handler = new BookmarkablePageRequestHandler(provider);
Url url = encoder.mapHandler(handler);
- assertEquals(PAGE_CLASS_NAME + "/i1/i2?a=b&b=c", url.toString());
+ assertEquals(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?a=b&b=c", url.toString());
}
/**
@@ -327,7 +364,7 @@ public class PackageMapperTest extends AbstractMapperTest
IRequestHandler handler = new BookmarkablePageRequestHandler(provider);
Url url = encoder.mapHandler(handler);
- assertEquals(PAGE_CLASS_NAME + "/i1/i2?a=b&b=c", url.toString());
+ assertEquals(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?a=b&b=c", url.toString());
}
/**
@@ -347,7 +384,7 @@ public class PackageMapperTest extends AbstractMapperTest
IRequestHandler handler = new RenderPageRequestHandler(provider);
Url url = encoder.mapHandler(handler);
- assertEquals(PAGE_CLASS_NAME + "/i1/i2?15&a=b&b=c", url.toString());
+ assertEquals(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?15&a=b&b=c", url.toString());
}
/**
@@ -398,7 +435,7 @@ public class PackageMapperTest extends AbstractMapperTest
Url url = encoder.mapHandler(handler);
- assertEquals(PAGE_CLASS_NAME + "/i1/i2?15-0.ILinkListener-foo-bar&a=b&b=c", url.toString());
+ assertEquals(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?15-0.ILinkListener-foo-bar&a=b&b=c", url.toString());
}
/**
@@ -425,7 +462,7 @@ public class PackageMapperTest extends AbstractMapperTest
Url url = encoder.mapHandler(handler);
- assertEquals(PAGE_CLASS_NAME + "/i1/i2?15-0.ILinkListener.4-foo-bar&a=b&b=c",
+ assertEquals(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?15-0.ILinkListener.4-foo-bar&a=b&b=c",
url.toString());
}
@@ -445,11 +482,32 @@ public class PackageMapperTest extends AbstractMapperTest
Url url = encoder.mapHandler(handler);
- assertEquals(PAGE_CLASS_NAME, url.toString());
+ assertEquals(MOUNT_PATH + '/' + PAGE_CLASS_NAME, url.toString());
+ }
+
+ /**
+ *
+ */
+ @Test
+ public void encodeNamedPageParameters()
+ {
+ MockPage page = new MockPage(15);
+ page.setBookmarkable(true);
+ page.setCreatedBookmarkable(true);
+ page.setPageStateless(true);
+
+ IPageProvider provider = new PageProvider(page);
+ page.getPageParameters().set("foo", "fooValue");
+ page.getPageParameters().set("bar", "barValue");
+ IRequestHandler handler = new RenderPageRequestHandler(provider);
+
+ Url url = namedParametersEncoder.mapHandler(handler);
+
+ assertEquals(MOUNT_PATH + "/fooValue/barValue/" + PAGE_CLASS_NAME, url.toString());
}
- private final PackageMapper innerClassEncoder = new PackageMapper(
+ private final PackageMapper innerClassEncoder = new PackageMapper(MOUNT_PATH,
PackageName.forClass(OuterPage.class))
{
@Override
@@ -481,7 +539,7 @@ public class PackageMapperTest extends AbstractMapperTest
Url url = innerClassEncoder.mapHandler(handler);
- assertEquals("PackageMapperTest$OuterPage$InnerPage", url.toString());
+ assertEquals(MOUNT_PATH + '/' + "PackageMapperTest$OuterPage$InnerPage", url.toString());
}
/**
@@ -490,7 +548,7 @@ public class PackageMapperTest extends AbstractMapperTest
@Test
public void decodeInnerClass()
{
- Url url = Url.parse("PackageMapperTest$OuterPage$InnerPage");
+ Url url = Url.parse(MOUNT_PATH + '/' + "PackageMapperTest$OuterPage$InnerPage");
IRequestHandler handler = innerClassEncoder.mapRequest(getRequest(url));
assertTrue(handler instanceof RenderPageRequestHandler);
@@ -516,7 +574,7 @@ public class PackageMapperTest extends AbstractMapperTest
Url url = aliasEncoder.mapHandler(handler);
- assertEquals(ALIAS, url.toString());
+ assertEquals(MOUNT_PATH + '/' + ALIAS, url.toString());
}
/**
@@ -525,7 +583,7 @@ public class PackageMapperTest extends AbstractMapperTest
@Test
public void decodeAlias()
{
- Url url = Url.parse(ALIAS + "?15");
+ Url url = Url.parse(MOUNT_PATH + '/' + ALIAS + "?15");
IRequestHandler handler = aliasEncoder.mapRequest(getRequest(url));
assertTrue(handler instanceof RenderPageRequestHandler);
http://git-wip-us.apache.org/repos/asf/wicket/blob/8b4d9de3/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/MountMapper.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/MountMapper.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/MountMapper.java
index 2bc619e..7fe6818 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/MountMapper.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/MountMapper.java
@@ -88,7 +88,8 @@ public class MountMapper extends AbstractMapper
{
if (urlStartsWith(request.getUrl(), mountSegments))
{
- return mountSegments.length + mapper.getCompatibilityScore(dismountRequest(request));
+ Request dismountedRequest = dismountRequest(request);
+ return mountSegments.length + mapper.getCompatibilityScore(dismountedRequest);
}
else
{
@@ -118,7 +119,7 @@ public class MountMapper extends AbstractMapper
{
final Url url = request.getUrl();
- if ((url.getSegments().size() >= mountSegments.length) && urlStartsWith(url, mountSegments))
+ if (urlStartsWith(url, mountSegments))
{
MountParameters params = new MountParameters();
for (int i = 0; i < mountSegments.length; i++)
http://git-wip-us.apache.org/repos/asf/wicket/blob/8b4d9de3/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/UnmountedMapperAdapter.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/UnmountedMapperAdapter.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/UnmountedMapperAdapter.java
index 397495c..7268c5f 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/UnmountedMapperAdapter.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/UnmountedMapperAdapter.java
@@ -20,6 +20,7 @@ import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.IRequestMapper;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Url;
+import org.apache.wicket.util.lang.Args;
/**
* Adapts a {@link IRequestMapper} to be used as a {@link IMountedRequestMapper}
@@ -36,25 +37,20 @@ class UnmountedMapperAdapter implements IMountedRequestMapper
* Construct.
*
* @param mapper
+ * the request mapper to adapt
*/
public UnmountedMapperAdapter(final IRequestMapper mapper)
{
super();
- this.mapper = mapper;
+ this.mapper = Args.notNull(mapper, "mapper");
}
- /**
- * @see org.apache.wicket.request.mapper.mount.IMountedRequestMapper#getCompatibilityScore(org.apache.wicket.request.Request)
- */
@Override
public int getCompatibilityScore(final Request request)
{
return mapper.getCompatibilityScore(request);
}
- /**
- * @see org.apache.wicket.request.mapper.mount.IMountedRequestMapper#mapHandler(org.apache.org.apache.wicket.request.IRequestHandler)
- */
@Override
public Mount mapHandler(final IRequestHandler requestHandler)
{
@@ -66,10 +62,6 @@ class UnmountedMapperAdapter implements IMountedRequestMapper
return null;
}
- /**
- * @see org.apache.wicket.request.mapper.mount.IMountedRequestMapper#mapRequest(org.apache.wicket.request.Request,
- * org.apache.wicket.request.mapper.mount.MountParameters)
- */
@Override
public IRequestHandler mapRequest(final Request request, final MountParameters mountParams)
{
http://git-wip-us.apache.org/repos/asf/wicket/blob/8b4d9de3/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/UnmountedRequestHandlerAdapter.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/UnmountedRequestHandlerAdapter.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/UnmountedRequestHandlerAdapter.java
index 932edbc..9a77e84 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/UnmountedRequestHandlerAdapter.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/mount/UnmountedRequestHandlerAdapter.java
@@ -35,24 +35,19 @@ class UnmountedRequestHandlerAdapter implements IMountedRequestMapper
* Construct.
*
* @param handler
+ * the request handler to adapt
*/
public UnmountedRequestHandlerAdapter(final IRequestHandler handler)
{
this.handler = handler;
}
- /**
- * @see org.apache.wicket.request.mapper.mount.IMountedRequestMapper#getCompatibilityScore(org.apache.wicket.request.Request)
- */
@Override
public int getCompatibilityScore(final Request request)
{
return 0;
}
- /**
- * @see org.apache.wicket.request.mapper.mount.IMountedRequestMapper#mapHandler(org.apache.org.apache.wicket.request.IRequestHandler)
- */
@Override
public Mount mapHandler(final IRequestHandler requestHandler)
{
@@ -63,10 +58,6 @@ class UnmountedRequestHandlerAdapter implements IMountedRequestMapper
return null;
}
- /**
- * @see org.apache.wicket.request.mapper.mount.IMountedRequestMapper#mapRequest(org.apache.wicket.request.Request,
- * org.apache.wicket.request.mapper.mount.MountParameters)
- */
@Override
public IRequestHandler mapRequest(final Request request, final MountParameters mountParams)
{
http://git-wip-us.apache.org/repos/asf/wicket/blob/8b4d9de3/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoder.java
----------------------------------------------------------------------
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 8139460..d848668 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
@@ -33,9 +33,6 @@ public class PageParametersEncoder implements IPageParametersEncoder
{
}
- /**
- * @see IPageParametersEncoder#decodePageParameters(org.apache.wicket.request.Url)
- */
@Override
public PageParameters decodePageParameters(final Url url)
{
@@ -56,9 +53,6 @@ public class PageParametersEncoder implements IPageParametersEncoder
return parameters.isEmpty() ? null : parameters;
}
- /**
- * @see org.apache.wicket.request.mapper.parameter.IPageParametersEncoder#encodePageParameters(org.apache.wicket.request.mapper.parameter.PageParameters)
- */
@Override
public Url encodePageParameters(final PageParameters pageParameters)
{