Updated Branches: refs/heads/master 2b1ce91d6 -> e329e1e20
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/master Commit: 8b4d9de39eedeef10ff1ff0a383606b6b94785bb Parents: f99a241 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Tue Aug 7 11:58:10 2012 +0300 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Tue Aug 7 11:58:10 2012 +0300 ---------------------------------------------------------------------- .../mapper/AbstractBookmarkableMapper.java | 230 +++++++++++++++++++ .../core/request/mapper/BookmarkableMapper.java | 29 +-- .../core/request/mapper/MountedMapper.java | 225 +----------------- .../core/request/mapper/PackageMapper.java | 49 ++-- .../wicket/protocol/http/WebApplication.java | 6 +- .../core/request/mapper/PackageMapperTest.java | 104 +++++++-- .../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) {
