Updated Branches: refs/heads/master 0c638293f -> d1770dc6a
WICKET-4994 Make it possible to mount paths case insensitively Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/d1770dc6 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/d1770dc6 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/d1770dc6 Branch: refs/heads/master Commit: d1770dc6a992103991fd8ecdc14c7919d39f9b2b Parents: 0c63829 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Mon Jan 13 12:36:48 2014 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Mon Jan 13 12:36:48 2014 +0200 ---------------------------------------------------------------------- .../mapper/AbstractBookmarkableMapper.java | 64 +++++++++++++++++++- .../wicket/protocol/http/WebApplication.java | 31 ++++++---- .../core/request/mapper/MountedMapperTest.java | 16 +++++ .../core/request/mapper/PackageMapperTest.java | 16 +++++ 4 files changed, 111 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/d1770dc6/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 aa80b37..3e86718 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 @@ -56,6 +56,14 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper private static Logger logger = LoggerFactory.getLogger(AbstractBookmarkableMapper.class); /** + * A flag that is used when comparing the mounted paths' segments against + * the request's url ones. + * + * @see #setCaseSensitiveMatch(boolean) + */ + private boolean isCaseSensitive = true; + + /** * Represents information stored in URL. * * @author Matej Knopp @@ -631,9 +639,8 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper for (int count = max - 1; count >= 0; count--) { - if (url.getSegments() - .get(segmentIndex + count) - .equals(curPathSegment.getFixedPart())) + if (segmentsMatch(url.getSegments() + .get(segmentIndex + count), curPathSegment.getFixedPart())) { foundFixedPart = true; segmentIndex += count + 1; @@ -655,6 +662,57 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper } /** + * Decides whether a segment from the mounted path matches with a segment + * from the requested url. + * + * A custom implementation of this class may use more complex logic to handle + * spelling errors + * + * @param mountedSegment + * the segment from the mounted path + * @param urlSegment + * the segment from the request url + * @return {@code true} if the segments match + */ + protected boolean segmentsMatch(String mountedSegment, String urlSegment) + { + final boolean result; + if (isCaseSensitiveMatch()) + { + result = mountedSegment.equals(urlSegment); + } + else + { + result = mountedSegment.equalsIgnoreCase(urlSegment); + } + return result; + } + + /** + * @return whether the matching of mounted segments against request's url ones should be + * case sensitive or not + */ + protected boolean isCaseSensitiveMatch() + { + return isCaseSensitive; + } + + /** + * Sets whether the matching of mounted segments against request's url ones should be + * case sensitive or not. + * + * @param isCaseSensitive + * a flag indicating whether the matching of mounted segments against request's + * url ones should be case sensitive or not + * @return this instance, for chaining + */ + public AbstractBookmarkableMapper setCaseSensitiveMatch(boolean isCaseSensitive) + { + this.isCaseSensitive = isCaseSensitive; + return this; + } + + /** * Replaces mandatory and optional parameters with their values. * * If a mandatory parameter is not provided then the method returns {@code false} http://git-wip-us.apache.org/repos/asf/wicket/blob/d1770dc6/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 1ff1acf..5c212ed 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 @@ -106,14 +106,14 @@ import org.slf4j.LoggerFactory; * </pre> * * @see WicketFilter - * @see org.apache.wicket.settings.IApplicationSettings - * @see org.apache.wicket.settings.IDebugSettings - * @see org.apache.wicket.settings.IExceptionSettings - * @see org.apache.wicket.settings.IMarkupSettings - * @see org.apache.wicket.settings.IPageSettings - * @see org.apache.wicket.settings.IRequestCycleSettings - * @see org.apache.wicket.settings.IResourceSettings - * @see org.apache.wicket.settings.ISecuritySettings + * @see org.apache.wicket.settings.ApplicationSettings + * @see org.apache.wicket.settings.DebugSettings + * @see org.apache.wicket.settings.ExceptionSettings + * @see org.apache.wicket.settings.MarkupSettings + * @see org.apache.wicket.settings.PageSettings + * @see org.apache.wicket.settings.RequestCycleSettings + * @see org.apache.wicket.settings.ResourceSettings + * @see org.apache.wicket.settings.SecuritySettings * @see javax.servlet.Filter * @see javax.servlet.FilterConfig * @see javax.servlet.ServletContext @@ -331,9 +331,11 @@ public abstract class WebApplication extends Application * @param pageClass * the page class to be mounted */ - public final <T extends Page> void mountPage(final String path, final Class<T> pageClass) + public final <T extends Page> MountedMapper mountPage(final String path, final Class<T> pageClass) { - mount(new MountedMapper(path, pageClass)); + MountedMapper mapper = new MountedMapper(path, pageClass); + mount(mapper); + return mapper; } /** @@ -344,13 +346,15 @@ public abstract class WebApplication extends Application * @param reference * resource reference to be mounted */ - public final void mountResource(final String path, final ResourceReference reference) + public final ResourceMapper mountResource(final String path, final ResourceReference reference) { if (reference.canBeRegistered()) { getResourceReferenceRegistry().registerResourceReference(reference); } - mount(new ResourceMapper(path, reference)); + ResourceMapper mapper = new ResourceMapper(path, reference); + mount(mapper); + return mapper; } /** @@ -364,10 +368,11 @@ public abstract class WebApplication extends Application * @param pageClass * the page class to be mounted */ - public final <P extends Page> void mountPackage(final String path, final Class<P> pageClass) + public final <P extends Page> PackageMapper mountPackage(final String path, final Class<P> pageClass) { PackageMapper packageMapper = new PackageMapper(path, PackageName.forClass(pageClass)); mount(packageMapper); + return packageMapper; } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/d1770dc6/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java index 9538ac6..04ca930 100644 --- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java @@ -115,6 +115,22 @@ public class MountedMapperTest extends AbstractMapperTest } /** + * https://issues.apache.org/jira/browse/WICKET-4994 + */ + @Test + public void decode1CaseInsensitively() + { + Url url = Url.parse("somE/moUnt/paTh"); + IRequestHandler handler = encoder.setCaseSensitiveMatch(false).mapRequest(getRequest(url)); + + assertThat(handler, instanceOf(RenderPageRequestHandler.class)); + IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); + + assertEquals(0, page.getPageParameters().getIndexedCount()); + assertTrue(page.getPageParameters().getNamedKeys().isEmpty()); + } + + /** * */ @Test http://git-wip-us.apache.org/repos/asf/wicket/blob/d1770dc6/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 e9a9d3f..bc2d8c4 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 @@ -129,6 +129,22 @@ public class PackageMapperTest extends AbstractMapperTest } /** + * https://issues.apache.org/jira/browse/WICKET-4994 + */ + @Test + public void decode1CaseInsensitively() + { + Url url = Url.parse(MOUNT_PATH.replace('o', 'O').replace('p', 'P') + '/' + PAGE_CLASS_NAME); + IRequestHandler handler = encoder.setCaseSensitiveMatch(false).mapRequest(getRequest(url)); + + assertThat(handler, instanceOf(RenderPageRequestHandler.class)); + IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); + assertEquals(PAGE_CLASS_NAME, page.getClass().getSimpleName()); + assertEquals(0, page.getPageParameters().getIndexedCount()); + assertTrue(page.getPageParameters().getNamedKeys().isEmpty()); + } + + /** * */ @Test
