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

Reply via email to