Author: mgrigorov
Date: Tue Jun 28 13:38:53 2011
New Revision: 1140607

URL: http://svn.apache.org/viewvc?rev=1140607&view=rev
Log:
WICKET-3838 In wicket 1.5 urlFor returns incorrect string for package mounted 
pages

Produce correct class names for inner pages.


Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java?rev=1140607&r1=1140606&r2=1140607&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
 Tue Jun 28 13:38:53 2011
@@ -16,11 +16,11 @@
  */
 package org.apache.wicket.request.mapper;
 
+import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.mapper.info.PageComponentInfo;
-import org.apache.wicket.request.mapper.mount.MountMapper;
 import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
@@ -30,10 +30,14 @@ import org.apache.wicket.util.lang.Packa
 /**
  * A request mapper that mounts all bookmarkable pages in a given package.
  * <p>
- * To mount this mapper onto a path use the {@link MountMapper}, ex:
+ * To mount this mapper onto a path use the {@link 
WebApplication#mountPackage(String, Class)}, ex:
  * 
  * <pre>
- * new MountMapper(&quot;/my/path&quot;, new 
packageMapper(PackageName.forClass(MyPage.class)));
+ * MyApp#init() {
+ * 
+ *   super.init();
+ *   mountPackage(&quot;/my/path&quot;, MyPage.class);
+ * }
  * </pre>
  * 
  * will result in urls like {@code /my/path/MyPage}
@@ -96,10 +100,19 @@ public class PackageMapper extends Abstr
        protected Url buildUrl(UrlInfo info)
        {
                Class<? extends IRequestablePage> pageClass = 
info.getPageClass();
-               if (PackageName.forClass(pageClass).equals(packageName))
+               PackageName pageClassPackageName = 
PackageName.forClass(pageClass);
+               if (pageClassPackageName.equals(packageName))
                {
                        Url url = new Url();
-                       url.getSegments().add(pageClass.getSimpleName());
+
+                       String fullyQualifiedClassName = pageClass.getName();
+                       String packageRelativeClassName = 
fullyQualifiedClassName;
+                       int packageNameLength = packageName.getName().length();
+                       if (packageNameLength > 0)
+                       {
+                               packageRelativeClassName = 
fullyQualifiedClassName.substring(packageNameLength + 1);
+                       }
+                       url.getSegments().add(packageRelativeClassName);
                        encodePageComponentInfo(url, 
info.getPageComponentInfo());
                        return encodePageParameters(url, 
info.getPageParameters(), pageParametersEncoder);
                }

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java?rev=1140607&r1=1140606&r2=1140607&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java
 Tue Jun 28 13:38:53 2011
@@ -30,11 +30,12 @@ import org.apache.wicket.request.handler
 import org.apache.wicket.request.handler.PageAndComponentProvider;
 import org.apache.wicket.request.handler.PageProvider;
 import org.apache.wicket.request.handler.RenderPageRequestHandler;
+import org.apache.wicket.request.mapper.PackageMapperTest.OuterPage.InnerPage;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.lang.PackageName;
 
 /**
- * 
+ * Tests for {@link PackageMapper}
  */
 public class PackageMapperTest extends AbstractMapperTest
 {
@@ -409,4 +410,55 @@ public class PackageMapperTest extends A
 
                assertEquals(PAGE_CLASS_NAME, url.toString());
        }
+
+
+       private final PackageMapper innerClassEncoder = new PackageMapper(
+               PackageName.forClass(OuterPage.class))
+       {
+               @Override
+               protected IMapperContext getContext()
+               {
+                       return context;
+               }
+       };
+
+       public static class OuterPage extends MockPage
+       {
+               private static final long serialVersionUID = 1L;
+
+               public static class InnerPage extends MockPage
+               {
+                       private static final long serialVersionUID = 1L;
+               }
+       }
+
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-3838
+        */
+       public void testEncodeInnerClass()
+       {
+               InnerPage page = new OuterPage.InnerPage();
+               IPageProvider provider = new PageProvider(page);
+               IRequestHandler handler = new 
BookmarkablePageRequestHandler(provider);
+
+               Url url = innerClassEncoder.mapHandler(handler);
+
+               assertEquals("PackageMapperTest$OuterPage$InnerPage", 
url.toString());
+       }
+
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-3838
+        */
+       public void testDecodeInnerClass()
+       {
+               Url url = Url.parse("PackageMapperTest$OuterPage$InnerPage");
+               IRequestHandler handler = 
innerClassEncoder.mapRequest(getRequest(url));
+
+               assertTrue(handler instanceof RenderPageRequestHandler);
+               IRequestablePage page = 
((RenderPageRequestHandler)handler).getPage();
+               assertEquals("InnerPage", page.getClass().getSimpleName());
+               assertEquals(0, page.getPageParameters().getIndexedCount());
+               assertTrue(page.getPageParameters().getNamedKeys().isEmpty());
+       }
+
 }


Reply via email to