Author: knopp
Date: Fri Sep 19 06:29:02 2008
New Revision: 697088

URL: http://svn.apache.org/viewvc?rev=697088&view=rev
Log:
refactor 

Added:
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java
   (with props)
Modified:
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/BookmarkableEncoder.java
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java

Added: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java?rev=697088&view=auto
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java
 (added)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java
 Fri Sep 19 06:29:02 2008
@@ -0,0 +1,284 @@
+/*
+ * 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.encoder;
+
+import org.apache._wicket.IComponent;
+import org.apache._wicket.IPage;
+import org.apache._wicket.PageParameters;
+import org.apache._wicket.request.RequestHandler;
+import org.apache._wicket.request.Url;
+import org.apache._wicket.request.encoder.info.ComponentInfo;
+import org.apache._wicket.request.encoder.info.PageComponentInfo;
+import org.apache._wicket.request.encoder.info.PageInfo;
+import 
org.apache._wicket.request.handler.impl.BookmarkableListenerInterfaceRequestHandler;
+import org.apache._wicket.request.handler.impl.BookmarkablePageRequestHandler;
+import org.apache._wicket.request.handler.impl.ListenerInterfaceRequestHandler;
+import org.apache._wicket.request.handler.impl.RenderPageRequestHandler;
+import org.apache._wicket.request.request.Request;
+import org.apache.wicket.RequestListenerInterface;
+
+/**
+ * Abstract encoder for Bookmarkable, Hybrid and BookmarkableListenerInterface 
URLs.
+ * 
+ * @author Matej Knopp
+ */
+public abstract class AbstractBookmarkableEncoder extends AbstractEncoder
+{
+       /**
+        * Construct.
+        */
+       public AbstractBookmarkableEncoder()
+       {
+       }
+
+       private RequestHandler processBookmarkable(String pageMapName,
+               Class<? extends IPage> pageClass, PageParameters pageParameters)
+       {
+               IPage page = newPageInstance(pageMapName, pageClass, 
pageParameters);
+               return new RenderPageRequestHandler(page);
+       }
+
+       private RequestHandler processHybrid(PageInfo pageInfo, Class<? extends 
IPage> pageClass,
+               PageParameters pageParameters)
+       {
+               IPage page = getPageInstance(pageInfo, pageClass, 
pageParameters);
+               return new RenderPageRequestHandler(page);
+       }
+
+       private RequestHandler processListener(PageComponentInfo 
pageComponentInfo,
+               Class<? extends IPage> pageClass, PageParameters pageParameters)
+       {
+               PageInfo pageInfo = pageComponentInfo.getPageInfo();
+               ComponentInfo componentInfo = 
pageComponentInfo.getComponentInfo();
+
+               IPage page = getPageInstance(pageInfo, pageClass, 
pageParameters, true);
+               IComponent component = getComponent(page, 
componentInfo.getComponentPath());
+               RequestListenerInterface listenerInterface = 
requestListenerInterfaceFromString(componentInfo.getListenerInterface());
+
+               return new ListenerInterfaceRequestHandler(page, component, 
listenerInterface,
+                       componentInfo.getBehaviorIndex());
+       }
+
+       /**
+        * Represents information stored in URL.
+        * 
+        * @author Matej
+        */
+       protected static final class UrlInfo
+       {
+               private final PageComponentInfo pageComponentInfo;
+               private final PageParameters pageParameters;
+               private final Class<? extends IPage> pageClass;
+
+               /**
+                * Construct.
+                * 
+                * @param pageComponentInfo
+                *            optional parameter providing the page instance 
and component information
+                * @param pageClass
+                *            mandatory parameter
+                * @param pageParameters
+                *            optional parameter providing pageParameters
+                */
+               public UrlInfo(PageComponentInfo pageComponentInfo, Class<? 
extends IPage> pageClass,
+                       PageParameters pageParameters)
+               {
+                       if (pageClass == null)
+                       {
+                               throw new IllegalArgumentException("Argument 
'pageClass' may not be null.");
+                       }
+                       this.pageComponentInfo = pageComponentInfo;
+                       this.pageParameters = pageParameters != null ? 
pageParameters : null;
+                       this.pageClass = pageClass;
+               }
+
+               /**
+                * @return PageComponentInfo instance or <code>null</code>
+                */
+               public PageComponentInfo getPageComponentInfo()
+               {
+                       return pageComponentInfo;
+               }
+
+               /**
+                * @return page class
+                */
+               public Class<? extends IPage> getPageClass()
+               {
+                       return pageClass;
+               }
+
+               /**
+                * @return PageParameters instance (never <code>null</code>)
+                */
+               public PageParameters getPageParameters()
+               {
+                       return pageParameters;
+               }
+       }
+
+       /**
+        * Parse the given request to an [EMAIL PROTECTED] UrlInfo} instance.
+        * 
+        * @param request
+        * @return UrlInfo instance or <code>null</code> if this encoder can 
not handle the request
+        */
+       protected abstract UrlInfo parseRequest(Request request);
+
+       /**
+        * Builds URL for the given [EMAIL PROTECTED] UrlInfo} instance. The 
URL this method produces must be
+        * parseable by the [EMAIL PROTECTED] #parseRequest(Request)} method.
+        * 
+        * @param info
+        * @return Url result URL
+        */
+       protected abstract Url buildUrl(UrlInfo info);
+
+       public RequestHandler decode(Request request)
+       {
+               UrlInfo urlInfo = parseRequest(request);
+
+               // check if the URL is long enough and starts with the proper 
segments
+               if (urlInfo != null)
+               {
+                       PageComponentInfo info = urlInfo.getPageComponentInfo();
+                       Class<? extends IPage> pageClass = 
urlInfo.getPageClass();
+                       PageParameters pageParameters = 
urlInfo.getPageParameters();
+
+                       if (info == null || info.getPageInfo().getPageId() == 
null)
+                       {
+                               // if there are is no page instance information 
(only page map name - optionally)
+                               // then this is a simple bookmarkable URL
+                               String pageMap = info != null ? 
info.getPageInfo().getPageMapName() : null;
+                               return processBookmarkable(pageMap, pageClass, 
pageParameters);
+                       }
+                       else if (info.getPageInfo().getPageId() != null && 
info.getComponentInfo() == null)
+                       {
+                               // if there is page instance information in the 
URL but no component and listener
+                               // interface then this is a hybrid URL - we 
need to try to reuse existing page
+                               // instance
+                               return processHybrid(info.getPageInfo(), 
pageClass, pageParameters);
+                       }
+                       else if (info.getComponentInfo() != null)
+                       {
+                               // with both page instance and 
component+listener this is a listener interface URL
+                               return processListener(info, pageClass, 
pageParameters);
+                       }
+               }
+               return null;
+       }
+
+       /**
+        * Indicates whether hybrid [EMAIL PROTECTED] RenderPageRequestHandler} 
URL for page will be generated only
+        * if page has been created with bookmarkable URL.
+        * <p>
+        * Generic bookmarkable encoders this method should return 
<code>true</code>. For explicit
+        * (mounted) encoders this method should return <code>false</code>
+        * 
+        * @return <code>true</code> if hybrid URL requires page created 
bookmarkable,
+        *         <code>false</code> otherwise.
+        */
+       protected abstract boolean pageMustHaveBeenCreatedBookmarkable();
+
+       public Url encode(RequestHandler requestHandler)
+       {
+               if (requestHandler instanceof BookmarkablePageRequestHandler)
+               {
+                       // simple bookmarkable URL with no page instance 
information
+                       BookmarkablePageRequestHandler handler = 
(BookmarkablePageRequestHandler)requestHandler;
+
+                       PageInfo info = new PageInfo(null, null, 
handler.getPageMapName());
+                       UrlInfo urlInfo = new UrlInfo(new 
PageComponentInfo(info, null),
+                               handler.getPageClass(), 
handler.getPageParameters());
+
+                       return buildUrl(urlInfo);
+               }
+               else if (requestHandler instanceof RenderPageRequestHandler)
+               {
+                       // possibly hybrid URL - bookmarkable URL with page 
instance information
+                       // but only allowed if the page was created by 
bookamarkable URL
+
+                       RenderPageRequestHandler handler = 
(RenderPageRequestHandler)requestHandler;
+                       IPage page = handler.getPage();
+
+                       if (!pageMustHaveBeenCreatedBookmarkable() || 
page.wasCreatedBookmarkable())
+                       {
+                               PageInfo info = null;
+                               if (!page.isPageStateless())
+                               {
+                                       info = new PageInfo(page);
+                               }
+                               PageComponentInfo pageComponentInfo = info != 
null ? new PageComponentInfo(info,
+                                       null) : null;
+
+                               UrlInfo urlInfo = new 
UrlInfo(pageComponentInfo, page.getClass(),
+                                       handler.getPageParameters());
+                               return buildUrl(urlInfo);
+                       }
+                       else
+                       {
+                               return null;
+                       }
+
+               }
+               else if (requestHandler instanceof 
BookmarkableListenerInterfaceRequestHandler)
+               {
+                       // listener interface URL with page class information
+                       BookmarkableListenerInterfaceRequestHandler handler = 
(BookmarkableListenerInterfaceRequestHandler)requestHandler;
+                       IPage page = handler.getPage();
+                       PageInfo pageInfo = new PageInfo(page);
+                       ComponentInfo componentInfo = new ComponentInfo(
+                               
requestListenerInterfaceToString(handler.getListenerInterface()),
+                               handler.getComponent().getPath(), 
handler.getBehaviorIndex());
+
+                       UrlInfo urlInfo = new UrlInfo(new 
PageComponentInfo(pageInfo, componentInfo),
+                               page.getClass(), handler.getPageParameters());
+                       return buildUrl(urlInfo);
+               }
+
+               return null;
+       }
+
+       public abstract int getMachingSegmentsCount(Request request);
+
+       /**
+        * Convenience method for representing mountPath as array of segments
+        * 
+        * @param mountPath
+        * @return array of path segments
+        */
+       protected String[] getMountSegments(String mountPath)
+       {
+               if (mountPath.startsWith("/"))
+               {
+                       mountPath = mountPath.substring(1);
+               }
+               Url url = Url.parse(mountPath);
+
+               if (url.getSegments().isEmpty())
+               {
+                       throw new IllegalArgumentException("Mount path must 
have at least one segment.");
+               }
+
+               String[] res = new String[url.getSegments().size()];
+               for (int i = 0; i < res.length; ++i)
+               {
+                       res[i] = url.getSegments().get(i);
+               }
+               return res;
+       }
+}

Propchange: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/BookmarkableEncoder.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/BookmarkableEncoder.java?rev=697088&r1=697087&r2=697088&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/BookmarkableEncoder.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/BookmarkableEncoder.java
 Fri Sep 19 06:29:02 2008
@@ -16,22 +16,13 @@
  */
 package org.apache._wicket.request.encoder;
 
-import org.apache._wicket.IComponent;
 import org.apache._wicket.IPage;
 import org.apache._wicket.PageParameters;
-import org.apache._wicket.request.RequestHandler;
 import org.apache._wicket.request.Url;
-import org.apache._wicket.request.encoder.info.ComponentInfo;
 import org.apache._wicket.request.encoder.info.PageComponentInfo;
-import org.apache._wicket.request.encoder.info.PageInfo;
 import org.apache._wicket.request.encoder.parameters.PageParametersEncoder;
 import 
org.apache._wicket.request.encoder.parameters.SimplePageParametersEncoder;
-import 
org.apache._wicket.request.handler.impl.BookmarkableListenerInterfaceRequestHandler;
-import org.apache._wicket.request.handler.impl.BookmarkablePageRequestHandler;
-import org.apache._wicket.request.handler.impl.ListenerInterfaceRequestHandler;
-import org.apache._wicket.request.handler.impl.RenderPageRequestHandler;
 import org.apache._wicket.request.request.Request;
-import org.apache.wicket.RequestListenerInterface;
 
 /**
  * Decodes and encodes the following URLs:
@@ -57,7 +48,7 @@
  * 
  * @author Matej Knopp
  */
-public class BookmarkableEncoder extends AbstractEncoder
+public class BookmarkableEncoder extends AbstractBookmarkableEncoder
 {
        private final PageParametersEncoder pageParametersEncoder;
 
@@ -83,39 +74,23 @@
                this(new SimplePageParametersEncoder());
        }
 
-       private RequestHandler processBookmarkable(String pageMapName,
-               Class<? extends IPage> pageClass, PageParameters pageParameters)
+       @Override
+       protected Url buildUrl(UrlInfo info)
        {
-               IPage page = newPageInstance(pageMapName, pageClass, 
pageParameters);
-               return new RenderPageRequestHandler(page);
-       }
-
-       private RequestHandler processHybrid(PageInfo pageInfo, Class<? extends 
IPage> pageClass,
-               PageParameters pageParameters)
-       {
-               IPage page = getPageInstance(pageInfo, pageClass, 
pageParameters);
-               return new RenderPageRequestHandler(page);
-       }
-
-       private RequestHandler processListener(PageComponentInfo 
pageComponentInfo,
-               Class<? extends IPage> pageClass, PageParameters pageParameters)
-       {
-               PageInfo pageInfo = pageComponentInfo.getPageInfo();
-               ComponentInfo componentInfo = 
pageComponentInfo.getComponentInfo();
+               Url url = new Url();
+               url.getSegments().add(getContext().getNamespace());
+               url.getSegments().add(getContext().getBookmarkableIdentifier());
+               url.getSegments().add(info.getPageClass().getName());
 
-               IPage page = getPageInstance(pageInfo, pageClass, 
pageParameters, true);
-               IComponent component = getComponent(page, 
componentInfo.getComponentPath());
-               RequestListenerInterface listenerInterface = 
requestListenerInterfaceFromString(componentInfo.getListenerInterface());
+               encodePageComponentInfo(url, info.getPageComponentInfo());
 
-               return new ListenerInterfaceRequestHandler(page, component, 
listenerInterface,
-                       componentInfo.getBehaviorIndex());
+               return encodePageParameters(url, info.getPageParameters(), 
pageParametersEncoder);
        }
 
-       public RequestHandler decode(Request request)
+       @Override
+       protected UrlInfo parseRequest(Request request)
        {
                Url url = request.getUrl();
-
-               // check if the URL is long enough and starts with the proper 
segments
                if (url.getSegments().size() >= 3 &&
                        urlStartsWith(url, getContext().getNamespace(),
                                getContext().getBookmarkableIdentifier()))
@@ -131,87 +106,15 @@
                        PageParameters pageParameters = 
extractPageParameters(url,
                                request.getRequestParameters(), 3, 
pageParametersEncoder);
 
-                       if (info == null || info.getPageInfo().getPageId() == 
null)
-                       {
-                               // if there are is no page instance information 
(only page map name - optionally)
-                               // then this is a simple bookmarkable URL
-                               String pageMap = info != null ? 
info.getPageInfo().getPageMapName() : null;
-                               return processBookmarkable(pageMap, pageClass, 
pageParameters);
-                       }
-                       else if (info.getPageInfo().getPageId() != null && 
info.getComponentInfo() == null)
-                       {
-                               // if there is page instance ifnromation in the 
URL but no component and listener
-                               // interface then this is a hybrid URL - we 
need to try to reuse existing cpage
-                               // instance
-                               return processHybrid(info.getPageInfo(), 
pageClass, pageParameters);
-                       }
-                       else if (info.getComponentInfo() != null)
-                       {
-                               // with both page instance and 
component+listener this is a listener interface URL
-                               return processListener(info, pageClass, 
pageParameters);
-                       }
+                       return new UrlInfo(info, pageClass, pageParameters);
                }
                return null;
        }
-
-       private Url newUrl(Class<? extends IPage> pageClass)
+       
+       @Override
+       protected boolean pageMustHaveBeenCreatedBookmarkable()
        {
-               Url url = new Url();
-
-               url.getSegments().add(getContext().getNamespace());
-               url.getSegments().add(getContext().getBookmarkableIdentifier());
-               url.getSegments().add(pageClass.getName());
-
-               return url;
-       }
-
-       public Url encode(RequestHandler requestHandler)
-       {
-               if (requestHandler instanceof BookmarkablePageRequestHandler)
-               {
-                       // simple bookmarkable URL with no page instance 
information
-                       BookmarkablePageRequestHandler handler = 
(BookmarkablePageRequestHandler)requestHandler;
-                       Url url = newUrl(handler.getPageClass());
-
-                       PageInfo info = new PageInfo(null, null, 
handler.getPageMapName());
-                       encodePageComponentInfo(url, new 
PageComponentInfo(info, null));
-                       return encodePageParameters(url, 
handler.getPageParameters(), pageParametersEncoder);
-               }
-               else if (requestHandler instanceof RenderPageRequestHandler)
-               {
-                       // possibly hybrid URL - bookmarkable URL with page 
instance information
-                       // but only allowed if the page was created by 
bookamarkable URL
-
-                       IPage page = 
((RenderPageRequestHandler)requestHandler).getPage();
-
-                       // necessary check so that we won't generate 
bookmarkable URLs for all pages
-                       if (page.wasCreatedBookmarkable())
-                       {
-                               Url url = newUrl(page.getClass());
-                               PageInfo info = null;
-                               if (!page.isPageStateless())
-                               {
-                                       info = new PageInfo(page);
-                                       encodePageComponentInfo(url, new 
PageComponentInfo(info, null));
-                               }
-                               return encodePageParameters(url, 
page.getPageParameters(), pageParametersEncoder);
-                       }
-               }
-               else if (requestHandler instanceof 
BookmarkableListenerInterfaceRequestHandler)
-               {
-                       // listener interface URL with page class information
-                       BookmarkableListenerInterfaceRequestHandler handler = 
(BookmarkableListenerInterfaceRequestHandler)requestHandler;
-                       IPage page = handler.getPage();
-                       PageInfo pageInfo = new PageInfo(page);
-                       ComponentInfo componentInfo = new ComponentInfo(
-                               
requestListenerInterfaceToString(handler.getListenerInterface()),
-                               handler.getComponent().getPath(), 
handler.getBehaviorIndex());
-                       Url url = newUrl(page.getClass());
-                       encodePageComponentInfo(url, new 
PageComponentInfo(pageInfo, componentInfo));
-                       return encodePageParameters(url, 
page.getPageParameters(), pageParametersEncoder);
-               }
-
-               return null;
+               return true;
        }
 
        public int getMachingSegmentsCount(Request request)

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java?rev=697088&r1=697087&r2=697088&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java
 Fri Sep 19 06:29:02 2008
@@ -18,23 +18,13 @@
 
 import java.lang.ref.WeakReference;
 
-import org.apache._wicket.IComponent;
 import org.apache._wicket.IPage;
 import org.apache._wicket.PageParameters;
-import org.apache._wicket.request.RequestHandler;
 import org.apache._wicket.request.Url;
-import org.apache._wicket.request.encoder.info.ComponentInfo;
 import org.apache._wicket.request.encoder.info.PageComponentInfo;
-import org.apache._wicket.request.encoder.info.PageInfo;
 import org.apache._wicket.request.encoder.parameters.PageParametersEncoder;
 import 
org.apache._wicket.request.encoder.parameters.SimplePageParametersEncoder;
-import 
org.apache._wicket.request.handler.impl.BookmarkableListenerInterfaceRequestHandler;
-import org.apache._wicket.request.handler.impl.BookmarkablePageRequestHandler;
-import org.apache._wicket.request.handler.impl.ListenerInterfaceRequestHandler;
-import org.apache._wicket.request.handler.impl.RenderPageRequestHandler;
-import 
org.apache._wicket.request.handler.impl.RenderPageRequestHandler.RedirectPolicy;
 import org.apache._wicket.request.request.Request;
-import org.apache.wicket.RequestListenerInterface;
 
 /**
  * Decodes and encodes the following URLs:
@@ -60,7 +50,7 @@
  * 
  * @author Matej Knopp
  */
-public class MountedEncoder extends AbstractEncoder
+public class MountedEncoder extends AbstractBookmarkableEncoder
 {
        private final PageParametersEncoder pageParametersEncoder;
        private final String[] mountSegments;
@@ -96,27 +86,6 @@
                this.mountSegments = getMountSegments(mountPath);
        }
 
-       private String[] getMountSegments(String mountPath)
-       {
-               if (mountPath.startsWith("/"))
-               {
-                       mountPath = mountPath.substring(1);
-               }
-               Url url = Url.parse(mountPath);
-
-               if (url.getSegments().isEmpty())
-               {
-                       throw new IllegalArgumentException("Mount path must 
have at least one segment.");
-               }
-
-               String[] res = new String[url.getSegments().size()];
-               for (int i = 0; i < res.length; ++i)
-               {
-                       res[i] = url.getSegments().get(i);
-               }
-               return res;
-       }
-
        /**
         * Construct.
         * 
@@ -128,32 +97,49 @@
                this(mountPath, pageClass, new SimplePageParametersEncoder());
        }
 
-       private RequestHandler processBookmarkable(String pageMapName,
-               Class<? extends IPage> pageClass, PageParameters pageParameters)
+       @Override
+       protected UrlInfo parseRequest(Request request)
        {
-               IPage page = newPageInstance(pageMapName, pageClass, 
pageParameters);
-               return new RenderPageRequestHandler(page);
-       }
+               Url url = request.getUrl();
 
-       private RequestHandler processHybrid(PageInfo pageInfo, Class<? extends 
IPage> pageClass,
-               PageParameters pageParameters)
-       {
-               IPage page = getPageInstance(pageInfo, pageClass, 
pageParameters);
-               return new RenderPageRequestHandler(page);
-       }
+               // when redirect to buffer/render is active and 
redirectFromHomePage returns true
+               // check mounted class against the home page class. if it 
matches let wicket redirect
+               // to the mounted URL
+               if (redirectFromHomePage() && checkHomePage(url))
+               {
+                       UrlInfo info = new UrlInfo(null, 
getContext().getHomePageClass(), new PageParameters());
+                       return info;
+               }
+               // check if the URL is long enough and starts with the proper 
segments
+               else if (url.getSegments().size() >= mountSegments.length &&
+                       urlStartsWith(url, mountSegments))
+               {
+                       // try to extract page and component information from 
URL
+                       PageComponentInfo info = getPageComponentInfo(url);
 
-       private RequestHandler processListener(PageComponentInfo 
pageComponentInfo,
-               Class<? extends IPage> pageClass, PageParameters pageParameters)
-       {
-               PageInfo pageInfo = pageComponentInfo.getPageInfo();
-               ComponentInfo componentInfo = 
pageComponentInfo.getComponentInfo();
+                       Class<? extends IPage> pageClass = this.pageClass.get();
 
-               IPage page = getPageInstance(pageInfo, pageClass, 
pageParameters, true);
-               IComponent component = getComponent(page, 
componentInfo.getComponentPath());
-               RequestListenerInterface listenerInterface = 
requestListenerInterfaceFromString(componentInfo.getListenerInterface());
+                       // extract the PageParameters from URL if there are any
+                       PageParameters pageParameters = 
extractPageParameters(url,
+                               request.getRequestParameters(), 3, 
pageParametersEncoder);
+                       return new UrlInfo(info, pageClass, pageParameters);
+               }
+               else
+               {
+                       return null;
+               }
+       }
 
-               return new ListenerInterfaceRequestHandler(page, component, 
listenerInterface,
-                       componentInfo.getBehaviorIndex());
+       @Override
+       protected Url buildUrl(UrlInfo info)
+       {
+               Url url = new Url();
+               for (String s : mountSegments)
+               {
+                       url.getSegments().add(s);                       
+               }               
+               encodePageComponentInfo(url, info.getPageComponentInfo());
+               return encodePageParameters(url, info.getPageParameters(), 
pageParametersEncoder);              
        }
 
        /**
@@ -163,18 +149,17 @@
         * @param url
         * @return request handler or <code>null</code>
         */
-       private RequestHandler checkHomePage(Url url)
+       private boolean checkHomePage(Url url)
        {
                if (url.getSegments().isEmpty() && 
url.getQueryParameters().isEmpty())
                {
                        // this is home page
                        if 
(pageClass.get().equals(getContext().getHomePageClass()) && 
redirectFromHomePage())
                        {
-                               IPage page = newPageInstance(null, 
pageClass.get(), new PageParameters());
-                               return new RenderPageRequestHandler(page, 
RedirectPolicy.ALWAYS_REDIRECT);
+                               return true;
                        }
                }
-               return null;
+               return false;
        }
 
        /**
@@ -189,107 +174,10 @@
                return true;
        }
 
-       public RequestHandler decode(Request request)
+       @Override
+       protected boolean pageMustHaveBeenCreatedBookmarkable()
        {
-               Url url = request.getUrl();
-
-               RequestHandler handler = checkHomePage(url);
-               if (handler != null)
-               {
-                       return handler;
-               }
-
-               // check if the URL is long enough and starts with the proper 
segments
-               if (url.getSegments().size() >= mountSegments.length && 
urlStartsWith(url, mountSegments))
-               {
-                       // try to extract page and component information from 
URL
-                       PageComponentInfo info = getPageComponentInfo(url);
-
-                       Class<? extends IPage> pageClass = this.pageClass.get();
-
-                       // extract the PageParameters from URL if there are any
-                       PageParameters pageParameters = 
extractPageParameters(url,
-                               request.getRequestParameters(), 3, 
pageParametersEncoder);
-
-                       if (info == null || info.getPageInfo().getPageId() == 
null)
-                       {
-                               // if there are is no page instance information 
(only page map name - optionally)
-                               // then this is a simple bookmarkable URL
-                               String pageMap = info != null ? 
info.getPageInfo().getPageMapName() : null;
-                               return processBookmarkable(pageMap, pageClass, 
pageParameters);
-                       }
-                       else if (info.getPageInfo().getPageId() != null && 
info.getComponentInfo() == null)
-                       {
-                               // if there is page instance ifnromation in the 
URL but no component and listener
-                               // interface then this is a hybrid URL - we 
need to try to reuse existing cpage
-                               // instance
-                               return processHybrid(info.getPageInfo(), 
pageClass, pageParameters);
-                       }
-                       else if (info.getComponentInfo() != null)
-                       {
-                               // with both page instance and 
component+listener this is a listener interface URL
-                               return processListener(info, pageClass, 
pageParameters);
-                       }
-               }
-               return null;
-       }
-
-       private Url newUrl(Class<? extends IPage> pageClass)
-       {
-               Url url = new Url();
-
-               for (String s : mountSegments)
-               {
-                       url.getSegments().add(s);
-               }
-
-               return url;
-       }
-
-       public Url encode(RequestHandler requestHandler)
-       {
-               if (requestHandler instanceof BookmarkablePageRequestHandler)
-               {
-                       // simple bookmarkable URL with no page instance 
information
-                       BookmarkablePageRequestHandler handler = 
(BookmarkablePageRequestHandler)requestHandler;
-                       Url url = newUrl(handler.getPageClass());
-
-                       PageInfo info = new PageInfo(null, null, 
handler.getPageMapName());
-                       encodePageComponentInfo(url, new 
PageComponentInfo(info, null));
-                       return encodePageParameters(url, 
handler.getPageParameters(), pageParametersEncoder);
-               }
-               else if (requestHandler instanceof RenderPageRequestHandler)
-               {
-                       // possibly hybrid URL - bookmarkable URL with page 
instance information
-                       // but only allowed if the page was created by 
bookamarkable URL
-
-                       IPage page = 
((RenderPageRequestHandler)requestHandler).getPage();
-
-                       Url url = newUrl(page.getClass());
-                       PageInfo info = null;
-                       if (!page.isPageStateless())
-                       {
-                               info = new PageInfo(page);
-                               encodePageComponentInfo(url, new 
PageComponentInfo(info, null));
-                       }
-                       return encodePageParameters(url, 
page.getPageParameters(), pageParametersEncoder);
-
-               }
-               else if (requestHandler instanceof 
BookmarkableListenerInterfaceRequestHandler)
-               {
-                       // listener interface URL with page class information
-                       BookmarkableListenerInterfaceRequestHandler handler = 
(BookmarkableListenerInterfaceRequestHandler)requestHandler;
-                       IPage page = handler.getPage();
-                       PageInfo pageInfo = new PageInfo(page);
-                       ComponentInfo componentInfo = new ComponentInfo(
-                               
requestListenerInterfaceToString(handler.getListenerInterface()),
-                               handler.getComponent().getPath(), 
handler.getBehaviorIndex());
-                       Url url = newUrl(page.getClass());
-                       encodePageComponentInfo(url, new 
PageComponentInfo(pageInfo, componentInfo));
-                       return encodePageParameters(url, 
page.getPageParameters(), pageParametersEncoder);
-               }
-
-               return null;
+               return false;
        }
 
        public int getMachingSegmentsCount(Request request)
@@ -303,5 +191,4 @@
                        return 0;
                }
        }
-
 }


Reply via email to