Author: mgrigorov
Date: Mon Aug 16 19:07:41 2010
New Revision: 986100

URL: http://svn.apache.org/viewvc?rev=986100&view=rev
Log:
WICKET-2989 Add IRequestMapper that can mount all pages in a package

Add a mapper that replaces 
org.apache.wicket.protocol.http.WebApplication.mount(String, PackageName) from 
Wicket 1.4


Added:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
   (with props)
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java
   (with props)

Added: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java?rev=986100&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
 (added)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
 Mon Aug 16 19:07:41 2010
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.mapper;
+
+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.parameter.IPageParametersEncoder;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
+import org.apache.wicket.util.lang.Checks;
+import org.apache.wicket.util.lang.PackageName;
+
+/**
+ * A request mapper that mounts all bookmarkable pages at a given package.
+ * 
+ * <pre>
+ *  Page Class - Render (BookmarkablePageRequestHandler)
+ *  /mountPath/MyPage
+ *  (will redirect to hybrid alternative if page is not stateless)
+ * 
+ *  Page Instance - Render Hybrid (RenderPageRequestHandler for pages that 
were created using bookmarkable URLs)
+ *  /mountPath/MyPage?2
+ * 
+ *  Page Instance - Bookmarkable Listener 
(BookmarkableListenerInterfaceRequestHandler)
+ *  /mountPath/MyPage?2-click-foo-bar-baz
+ *  /mountPath/MyPage?2-click.1-foo-bar-baz (1 is behavior index)
+ *  (these will redirect to hybrid if page is not stateless)
+ * </pre>
+ */
+public class PackageMapper extends AbstractBookmarkableMapper
+{
+       /** the path to mount the bookmarkable page classes on */
+       private final String mountPath;
+
+       /**
+        * the name of the package for which all bookmarkable pages should be 
mounted
+        */
+       private final PackageName packageName;
+
+       /** the encoder used to encode/decode the page parameters */
+       private final IPageParametersEncoder pageParametersEncoder;
+
+       /**
+        * Construct.
+        * 
+        * @param mountPath
+        * @param packageName
+        */
+       public PackageMapper(final String mountPath, final PackageName 
packageName)
+       {
+               this(mountPath, packageName, new PageParametersEncoder());
+       }
+
+       /**
+        * Construct.
+        * 
+        * @param mountPath
+        * @param packageName
+        * @param pageParametersEncoder
+        */
+       public PackageMapper(final String mountPath, final PackageName 
packageName,
+               final IPageParametersEncoder pageParametersEncoder)
+       {
+               Checks.argumentNotNull(mountPath, "mountPath");
+               Checks.argumentNotNull(packageName, "packageName");
+               Checks.argumentNotNull(pageParametersEncoder, 
"pageParametersEncoder");
+
+               this.mountPath = mountPath;
+               this.packageName = packageName;
+               this.pageParametersEncoder = pageParametersEncoder;
+       }
+
+       /**
+        * @see 
org.apache.wicket.request.mapper.AbstractBookmarkableMapper#buildUrl(org.apache.wicket.request.mapper.AbstractBookmarkableMapper.UrlInfo)
+        */
+       @Override
+       protected Url buildUrl(UrlInfo info)
+       {
+               Class<? extends IRequestablePage> pageClass = 
info.getPageClass();
+               if (pageClass.getName().startsWith(packageName.getName()))
+               {
+                       Url url = new Url();
+                       url.getSegments().add(mountPath);
+                       url.getSegments().add(pageClass.getSimpleName());
+
+                       encodePageComponentInfo(url, 
info.getPageComponentInfo());
+
+                       return encodePageParameters(url, 
info.getPageParameters(), pageParametersEncoder);
+               }
+
+               return null;
+       }
+
+       /**
+        * @see 
org.apache.wicket.request.mapper.AbstractBookmarkableMapper#parseRequest(org.apache.wicket.request.Request)
+        */
+       @Override
+       protected UrlInfo parseRequest(Request request)
+       {
+               Url url = request.getUrl();
+               if (url.getSegments().size() >= 1 && urlStartsWith(url, 
mountPath))
+               {
+                       // try to extract page and component information from 
URL
+                       PageComponentInfo info = getPageComponentInfo(url);
+
+                       // load the page class
+                       String className = url.getSegments().get(1);
+                       String fullyQualifiedClassName = packageName.getName() 
+ '.' + className;
+                       Class<? extends IRequestablePage> pageClass = 
getPageClass(fullyQualifiedClassName);
+
+                       if (pageClass != null && 
IRequestablePage.class.isAssignableFrom(pageClass))
+                       {
+                               // extract the PageParameters from URL if there 
are any
+                               PageParameters pageParameters = 
extractPageParameters(request, 2,
+                                       pageParametersEncoder);
+
+                               return new UrlInfo(info, pageClass, 
pageParameters);
+                       }
+               }
+               return null;
+       }
+
+       /**
+        * @see 
org.apache.wicket.request.mapper.AbstractBookmarkableMapper#pageMustHaveBeenCreatedBookmarkable()
+        */
+       @Override
+       protected boolean pageMustHaveBeenCreatedBookmarkable()
+       {
+               return true;
+       }
+
+       /**
+        * @see 
org.apache.wicket.request.mapper.AbstractBookmarkableMapper#getCompatibilityScore(org.apache.wicket.request.Request)
+        */
+       @Override
+       public int getCompatibilityScore(Request request)
+       {
+               // always return 0 here so that the mounts have higher priority
+               return 0;
+       }
+}

Propchange: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java?rev=986100&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java
 (added)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java
 Mon Aug 16 19:07:41 2010
@@ -0,0 +1,419 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.mapper;
+
+import org.apache.wicket.MockPage;
+import org.apache.wicket.markup.html.link.ILinkListener;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.component.IRequestableComponent;
+import org.apache.wicket.request.component.IRequestablePage;
+import 
org.apache.wicket.request.handler.BookmarkableListenerInterfaceRequestHandler;
+import org.apache.wicket.request.handler.BookmarkablePageRequestHandler;
+import org.apache.wicket.request.handler.IPageProvider;
+import org.apache.wicket.request.handler.IPageRequestHandler;
+import org.apache.wicket.request.handler.ListenerInterfaceRequestHandler;
+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.parameter.PageParameters;
+import org.apache.wicket.util.lang.PackageName;
+
+/**
+ * 
+ */
+public class PackageMapperTest extends AbstractMapperTest
+{
+
+       private static final String MOUNT_PATH = "mountPath";
+
+       /**
+        * Construct.
+        */
+       public PackageMapperTest()
+       {
+       }
+
+       private final PackageMapper encoder = new PackageMapper(MOUNT_PATH,
+               PackageName.forClass(MockPage.class))
+       {
+               @Override
+               protected IMapperContext getContext()
+               {
+                       return context;
+               }
+       };
+
+       private static final String PAGE_CLASS_NAME = 
MockPage.class.getSimpleName();
+
+       /**
+        * 
+        */
+       public void testDecode1()
+       {
+               Url url = Url.parse(MOUNT_PATH + "/" + PAGE_CLASS_NAME);
+               IRequestHandler handler = encoder.mapRequest(getRequest(url));
+
+               assertTrue(handler instanceof RenderPageRequestHandler);
+               IRequestablePage page = 
((RenderPageRequestHandler)handler).getPage();
+               assertEquals(PAGE_CLASS_NAME, page.getClass().getSimpleName());
+               assertEquals(0, 
page.getPageParameters().getIndexedParamsCount());
+               
assertTrue(page.getPageParameters().getNamedParameterKeys().isEmpty());
+       }
+
+       /**
+        * 
+        */
+       public void testDecode2()
+       {
+               Url url = Url.parse(MOUNT_PATH + "/" + PAGE_CLASS_NAME + 
"/indexed1?a=b&b=c");
+               IRequestHandler handler = encoder.mapRequest(getRequest(url));
+
+               assertTrue(handler instanceof RenderPageRequestHandler);
+               IRequestablePage page = 
((RenderPageRequestHandler)handler).getPage();
+               assertEquals(PAGE_CLASS_NAME, page.getClass().getSimpleName());
+
+               PageParameters p = page.getPageParameters();
+               assertEquals(1, p.getIndexedParamsCount());
+               assertEquals("indexed1", p.getIndexedParameter(0).toString());
+
+               assertEquals(2, p.getNamedParameterKeys().size());
+               assertEquals("b", p.getNamedParameter("a").toString());
+               assertEquals("c", p.getNamedParameter("b").toString());
+       }
+
+       /**
+        * 
+        */
+       public void testDecode3()
+       {
+               Url url = Url.parse(MOUNT_PATH + "/" + PAGE_CLASS_NAME + "?15");
+               IRequestHandler handler = encoder.mapRequest(getRequest(url));
+
+               assertTrue(handler instanceof RenderPageRequestHandler);
+               IRequestablePage page = 
((RenderPageRequestHandler)handler).getPage();
+               checkPage(page, 15);
+       }
+
+       /**
+        * 
+        */
+       public void testDecode4()
+       {
+               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);
+               IRequestablePage page = 
((RenderPageRequestHandler)handler).getPage();
+               checkPage(page, 15);
+
+               PageParameters p = page.getPageParameters();
+               assertEquals(2, p.getIndexedParamsCount());
+               assertEquals("i1", p.getIndexedParameter(0).toString());
+               assertEquals("i2", p.getIndexedParameter(1).toString());
+
+               assertEquals(2, p.getNamedParameterKeys().size());
+               assertEquals("b", p.getNamedParameter("a").toString());
+               assertEquals("c", p.getNamedParameter("b").toString());
+       }
+
+       /**
+        * 
+        */
+       public void testDecode5()
+       {
+               Url url = Url.parse(MOUNT_PATH + "/" + PAGE_CLASS_NAME + 
"?15-ILinkListener-foo-bar");
+               IRequestHandler handler = encoder.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());
+               assertNull(h.getBehaviorIndex());
+       }
+
+       /**
+        * 
+        */
+       public void testDecode6()
+       {
+               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);
+               ListenerInterfaceRequestHandler h = 
(ListenerInterfaceRequestHandler)handler;
+
+               IRequestablePage page = h.getPage();
+               checkPage(page, 15);
+
+               assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
+               assertEquals("foo:bar", h.getComponent().getPageRelativePath());
+
+               PageParameters p = page.getPageParameters();
+               assertEquals(2, p.getIndexedParamsCount());
+               assertEquals("i1", p.getIndexedParameter(0).toString());
+               assertEquals("i2", p.getIndexedParameter(1).toString());
+
+               assertEquals(2, p.getNamedParameterKeys().size());
+               assertEquals("b", p.getNamedParameter("a").toString());
+               assertEquals("c", p.getNamedParameter("b").toString());
+       }
+
+       /**
+        * 
+        */
+       public void testDecode7()
+       {
+               Url url = Url.parse(MOUNT_PATH + "/" + PAGE_CLASS_NAME + 
"?15-ILinkListener.4-foo-bar");
+               IRequestHandler handler = encoder.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());
+               assertEquals((Object)4, h.getBehaviorIndex());
+       }
+
+       /**
+        * 
+        */
+       public void testDecode8()
+       {
+               Url url = Url.parse(MOUNT_PATH + "/" + PAGE_CLASS_NAME +
+                       "/i1/i2?15-5.ILinkListener-foo-bar&a=b&b=c");
+
+               context.setNextPageRenderCount(5);
+
+               IRequestHandler handler = encoder.mapRequest(getRequest(url));
+
+               assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+               ListenerInterfaceRequestHandler h = 
(ListenerInterfaceRequestHandler)handler;
+
+               IRequestablePage page = h.getPage();
+               assertEquals(page.getRenderCount(), 5);
+       }
+
+       /**
+        * 
+        */
+       public void testDecode9()
+       {
+               Url url = Url.parse(MOUNT_PATH + "/" + PAGE_CLASS_NAME +
+                       "/i1/i2?15-5.ILinkListener-foo-bar&a=b&b=c");
+
+               context.setNextPageRenderCount(6);
+
+               try
+               {
+                       IRequestHandler handler = 
encoder.mapRequest(getRequest(url));
+
+                       ((IPageRequestHandler)handler).getPage();
+
+                       // should never get here
+                       assertFalse(true);
+               }
+               catch (StalePageException e)
+               {
+
+               }
+       }
+
+       /**
+        * WICKET-2993
+        */
+       public void testDecode10()
+       {
+               // use String.class but any other non-Page will do the job as 
well
+               Url url = Url.parse(MOUNT_PATH + "/" + 
String.class.getSimpleName());
+
+               IRequestHandler handler = encoder.mapRequest(getRequest(url));
+               assertNull("A non-page class should not create a request 
handler!", handler);
+       }
+
+       /**
+        * 
+        */
+       public void testEncode1()
+       {
+               PageProvider provider = new PageProvider(MockPage.class, new 
PageParameters());
+               provider.setPageSource(context);
+               IRequestHandler handler = new 
BookmarkablePageRequestHandler(provider);
+               Url url = encoder.mapHandler(handler);
+               assertEquals(MOUNT_PATH + "/" + PAGE_CLASS_NAME, 
url.toString());
+       }
+
+       /**
+        * 
+        */
+       public void testEncode2()
+       {
+               PageParameters parameters = new PageParameters();
+               parameters.setIndexedParameter(0, "i1");
+               parameters.setIndexedParameter(1, "i2");
+               parameters.setNamedParameter("a", "b");
+               parameters.setNamedParameter("b", "c");
+               PageProvider provider = new PageProvider(MockPage.class, 
parameters);
+               provider.setPageSource(context);
+               IRequestHandler handler = new 
BookmarkablePageRequestHandler(provider);
+               Url url = encoder.mapHandler(handler);
+               assertEquals(MOUNT_PATH + "/" + PAGE_CLASS_NAME + 
"/i1/i2?a=b&b=c", url.toString());
+       }
+
+       /**
+        * 
+        */
+       public void testEncode3()
+       {
+               PageParameters parameters = new PageParameters();
+               parameters.setIndexedParameter(0, "i1");
+               parameters.setIndexedParameter(1, "i2");
+               parameters.setNamedParameter("a", "b");
+               parameters.setNamedParameter("b", "c");
+
+               PageProvider provider = new PageProvider(MockPage.class, 
parameters);
+               provider.setPageSource(context);
+               IRequestHandler handler = new 
BookmarkablePageRequestHandler(provider);
+               Url url = encoder.mapHandler(handler);
+
+               assertEquals(MOUNT_PATH + "/" + PAGE_CLASS_NAME + 
"/i1/i2?a=b&b=c", url.toString());
+       }
+
+       /**
+        * 
+        */
+       public void testEncode4()
+       {
+               MockPage page = new MockPage(15);
+               page.getPageParameters().setIndexedParameter(0, "i1");
+               page.getPageParameters().setIndexedParameter(1, "i2");
+               page.getPageParameters().setNamedParameter("a", "b");
+               page.getPageParameters().setNamedParameter("b", "c");
+               page.setCreatedBookmarkable(true);
+
+               IPageProvider provider = new PageProvider(page);
+               IRequestHandler handler = new 
RenderPageRequestHandler(provider);
+               Url url = encoder.mapHandler(handler);
+
+               assertEquals(MOUNT_PATH + "/" + PAGE_CLASS_NAME + 
"/i1/i2?15&a=b&b=c", url.toString());
+       }
+
+       /**
+        * 
+        */
+       public void testEncode5()
+       {
+               MockPage page = new MockPage(15);
+               page.getPageParameters().setIndexedParameter(0, "i1");
+               page.getPageParameters().setIndexedParameter(1, "i2");
+               page.getPageParameters().setNamedParameter("a", "b");
+               page.getPageParameters().setNamedParameter("b", "c");
+
+               page.setCreatedBookmarkable(false);
+
+               IPageProvider provider = new PageProvider(page);
+               IRequestHandler handler = new 
RenderPageRequestHandler(provider);
+               Url url = encoder.mapHandler(handler);
+
+               // never allow bookmarkable render url for page that has not 
been created by bookmarkable
+               // URL
+
+               assertNull(url);
+       }
+
+       /**
+        * 
+        */
+       public void testEncode6()
+       {
+               MockPage page = new MockPage(15);
+               page.getPageParameters().setIndexedParameter(0, "i1");
+               page.getPageParameters().setIndexedParameter(1, "i2");
+               page.getPageParameters().setNamedParameter("a", "b");
+               page.getPageParameters().setNamedParameter("b", "c");
+
+               // shouldn't make any difference for 
BookmarkableListenerInterfaceRequestHandler,
+               // as this explicitely says the url must be bookmarkable
+               page.setCreatedBookmarkable(false);
+
+               IRequestableComponent c = page.get("foo:bar");
+
+               PageAndComponentProvider provider = new 
PageAndComponentProvider(page, c);
+               IRequestHandler handler = new 
BookmarkableListenerInterfaceRequestHandler(provider,
+                       ILinkListener.INTERFACE);
+
+               Url url = encoder.mapHandler(handler);
+
+               assertEquals(MOUNT_PATH + "/" + PAGE_CLASS_NAME +
+                       "/i1/i2?15-0.ILinkListener-foo-bar&a=b&b=c", 
url.toString());
+       }
+
+       /**
+        * 
+        */
+       public void testEncode7()
+       {
+               MockPage page = new MockPage(15);
+               page.getPageParameters().setIndexedParameter(0, "i1");
+               page.getPageParameters().setIndexedParameter(1, "i2");
+               page.getPageParameters().setNamedParameter("a", "b");
+               page.getPageParameters().setNamedParameter("b", "c");
+
+               // shouldn't make any difference for 
BookmarkableListenerInterfaceRequestHandler,
+               // as this explicitely says the url must be bookmarkable
+               page.setCreatedBookmarkable(false);
+
+               IRequestableComponent c = page.get("foo:bar");
+
+               PageAndComponentProvider provider = new 
PageAndComponentProvider(page, c);
+               IRequestHandler handler = new 
BookmarkableListenerInterfaceRequestHandler(provider,
+                       ILinkListener.INTERFACE, 4);
+
+               Url url = encoder.mapHandler(handler);
+
+               assertEquals(MOUNT_PATH + "/" + PAGE_CLASS_NAME +
+                       "/i1/i2?15-0.ILinkListener.4-foo-bar&a=b&b=c", 
url.toString());
+       }
+
+       /**
+        * 
+        */
+       public void testEncode8()
+       {
+               MockPage page = new MockPage(15);
+               page.setBookmarkable(true);
+               page.setCreatedBookmarkable(true);
+               page.setPageStateless(true);
+
+               IPageProvider provider = new PageProvider(page);
+               IRequestHandler handler = new 
RenderPageRequestHandler(provider);
+
+               Url url = encoder.mapHandler(handler);
+
+               assertEquals(MOUNT_PATH + "/" + PAGE_CLASS_NAME, 
url.toString());
+       }
+}

Propchange: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/PackageMapperTest.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to