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;
}
}
-
}