Author: knopp Date: Wed Sep 17 09:09:52 2008 New Revision: 696353 URL: http://svn.apache.org/viewvc?rev=696353&view=rev Log: Bookmarkable stuff
Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/BookmarkableEncoder.java (with props) wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageParametersEncoder.java (with props) wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/SimplePageParametersEncoder.java (with props) wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/BookmarkableListenerInterfaceRequestHandler.java (with props) wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractEncoderTest.java (with props) wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java (with props) Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInfo.java wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/MockPage.java wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/PageInstanceEncoderTest.java wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java?rev=696353&r1=696352&r2=696353&view=diff ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java (original) +++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java Wed Sep 17 09:09:52 2008 @@ -18,10 +18,14 @@ import org.apache._wicket.IComponent; import org.apache._wicket.IPage; +import org.apache._wicket.PageParameters; import org.apache._wicket.request.RequestHandlerEncoder; +import org.apache._wicket.request.RequestParameters; import org.apache._wicket.request.Url; import org.apache._wicket.request.Url.QueryParameter; +import org.apache.wicket.Page; import org.apache.wicket.RequestListenerInterface; +import org.apache.wicket.Session; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.protocol.http.PageExpiredException; import org.apache.wicket.util.string.Strings; @@ -119,4 +123,122 @@ return component; } } + + @SuppressWarnings("unchecked") + protected Class<? extends IPage> getPageClass(String name) + { + try + { + if (Session.exists()) + { + Session s = Session.get(); + return (Class<? extends IPage>)s.getClassResolver().resolveClass(name); + + } + else + { + return (Class<? extends IPage>)Class.forName(name); + } + } + catch (ClassNotFoundException e) + { + throw new WicketRuntimeException("Error resolving bookmarkable page class", e); + } + } + + protected PageParameters extractPageParameters(Url url, RequestParameters requestParameters, + int segmentsToSkip, PageParametersEncoder encoder) + { + // strip the segments and first query parameter from URL + Url urlCopy = new Url(url); + while (segmentsToSkip > 0 && urlCopy.getSegments().isEmpty() == false) + { + urlCopy.getSegments().remove(0); + --segmentsToSkip; + } + + if (getPageComponentInfo(urlCopy) != null) + { + urlCopy.getQueryParameters().remove(0); + } + + PageParameters decoded = encoder.decodePageParameters(urlCopy); + return decoded != null ? decoded : new PageParameters(); + } + + protected Url encodePageParameters(Url url, PageParameters pageParameters, + PageParametersEncoder encoder) + { + if (pageParameters == null) + { + pageParameters = new PageParameters(); + } + + Url parametersUrl = encoder.encodePageParameters(pageParameters); + if (parametersUrl != null) + { + // copy the url + url = new Url(url); + + for (String s : parametersUrl.getSegments()) + { + url.getSegments().add(s); + } + for (QueryParameter p : parametersUrl.getQueryParameters()) + { + url.getQueryParameters().add(p); + } + } + + return url; + } + + protected IPage newPageInstance(String pageMapName, Class<? extends IPage> pageClass, + PageParameters pageParameters) + { + return getContext().newPageInstance(pageMapName, pageClass, pageParameters); + } + + protected IPage getPageInstance(PageInfo pageInfo, Class<? extends IPage> pageClass, + PageParameters pageParameters) + { + return getPageInstance(pageInfo, pageClass, pageParameters, false); + } + + protected IPage getPageInstance(PageInfo pageInfo, Class<? extends IPage> pageClass, + PageParameters pageParameters, boolean prepareForRenderNewPage) + { + IPage page = getContext().getPageInstance(pageInfo.getPageMapName(), pageInfo.getPageId(), + pageInfo.getVersionNumber()); + if (page != null && page.getClass().equals(pageClass) == false) + { + page = null; + } + if (page == null) + { + page = getContext().newPageInstance(pageInfo.getPageMapName(), pageClass, + pageParameters); + + // this is required for stateless listeners + if (prepareForRenderNewPage && page instanceof Page) + { + ((Page)page).prepareForRender(false); + } + } + else + { + page.getPageParameters().assign(pageParameters); + } + return page; + } + + protected void encodePageComponentInfo(Url url, PageComponentInfo info) + { + String s = info.toString(); + if (!Strings.isEmpty(s)) + { + QueryParameter parameter = new QueryParameter(s, ""); + url.getQueryParameters().add(parameter); + } + } } Added: 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=696353&view=auto ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/BookmarkableEncoder.java (added) +++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/BookmarkableEncoder.java Wed Sep 17 09:09:52 2008 @@ -0,0 +1,189 @@ +/* + * 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.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: + * + * <pre> + * Page Instance - Render + * /wicket/bookmarkable/org.apache.wicket.MyPage + * /wicket/bookmarkable/org.apache.wicket.MyPage?pageMap + * (these will redirect to hybrid alternative if page is not stateless) + * + * Page Instance - Render Hybrid + * /wicket/bookmarkable/org.apache.wicket.MyPage?2 + * /wicket/bookmarkable/org.apache.wicket.MyPage?2.4 + * /wicket/bookmarkable/org.apache.wicket.MyPage?pageMap.2.4 + * + * Page Instance - Bookmarkable Listener + * /wicket/bookmarkable/org.apache.wicket.MyPage?2-click-foo-bar-baz + * /wicket/bookmarkable/org.apache.wicket.MyPage?2.4-click-foo-bar-baz + * /wicket/bookmarkable/org.apache.wicket.MyPage?pageMap.2.4-click-foo-bar-baz + * (these will redirect to hybrid if page is not stateless) + * </pre> + * + * @author Matej Knopp + */ +public class BookmarkableEncoder extends AbstractEncoder +{ + private final PageParametersEncoder pageParametersEncoder; + + /** + * Construct. + * @param pageParametersEncoder + */ + public BookmarkableEncoder(PageParametersEncoder pageParametersEncoder) + { + this.pageParametersEncoder = pageParametersEncoder; + } + + /** + * Construct. + */ + public BookmarkableEncoder() + { + this(new SimplePageParametersEncoder()); + } + + 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); + } + + public RequestHandler decode(Request request) + { + Url url = request.getUrl(); + if (url.getSegments().size() >= 3 && + urlStartsWith(url, getContext().getNamespace(), + getContext().getBookmarkableIdentifier())) + { + PageComponentInfo info = getPageComponentInfo(url); + + String className = url.getSegments().get(2); + Class<? extends IPage> pageClass = getPageClass(className); + PageParameters pageParameters = extractPageParameters(url, + request.getRequestParameters(), 3, pageParametersEncoder); + + if (info == null || info.getPageInfo().getPageId() == null) + { + String pageMap = info != null ? info.getPageInfo().getPageMapName() : null; + return processBookmarkable(pageMap, pageClass, pageParameters); + } + else if (info.getPageInfo().getPageId() != null && info.getComponentInfo() == null) + { + return processHybrid(info.getPageInfo(), pageClass, pageParameters); + } + else if (info.getComponentInfo() != null) + { + return processListener(info, pageClass, pageParameters); + } + } + return null; + } + + private Url newUrl(Class<? extends IPage> pageClass) + { + 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) + { + 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) + { + 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 = new PageInfo(page); + encodePageComponentInfo(url, new PageComponentInfo(info, null)); + return encodePageParameters(url, page.getPageParameters(), pageParametersEncoder); + } + } + else if (requestHandler instanceof BookmarkableListenerInterfaceRequestHandler) + { + BookmarkableListenerInterfaceRequestHandler handler = (BookmarkableListenerInterfaceRequestHandler)requestHandler; + IPage page = handler.getPage(); + PageInfo pageInfo = new PageInfo(page); + ComponentInfo componentInfo = new ComponentInfo( + requestListenerInterfaceToString(handler.getListenerInterface()), + handler.getComponent().getPath()); + Url url = newUrl(page.getClass()); + encodePageComponentInfo(url, new PageComponentInfo(pageInfo, componentInfo)); + return encodePageParameters(url, page.getPageParameters(), pageParametersEncoder); + } + + return null; + } + + public int getMachingSegmentsCount(Request request) + { + return 0; + } + +} Propchange: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/BookmarkableEncoder.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInfo.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInfo.java?rev=696353&r1=696352&r2=696353&view=diff ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInfo.java (original) +++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInfo.java Wed Sep 17 09:09:52 2008 @@ -16,6 +16,7 @@ */ package org.apache._wicket.request.encoder; +import org.apache._wicket.IPage; import org.apache.wicket.Application; import org.apache.wicket.util.string.AppendingStringBuffer; import org.apache.wicket.util.string.Strings; @@ -48,8 +49,8 @@ */ public PageInfo(Integer pageId, Integer versionNumber, String pageMapName) { - if ((pageId == null && (versionNumber != null || pageMapName == null)) || - (versionNumber == null && (pageId != null || pageMapName == null))) + if ((pageId == null && versionNumber != null) || + (versionNumber == null && pageId != null)) { throw new IllegalArgumentException( "Either both pageId and versionNumber must be null or none of them."); @@ -59,6 +60,17 @@ this.pageMapName = pageMapName; } + public PageInfo(IPage page) + { + if (page == null) + { + throw new IllegalArgumentException("Argument 'page' may not be null."); + } + this.pageId = page.getPageId(); + this.versionNumber = page.getPageVersionNumber(); + this.pageMapName = page.getPageMapName(); + } + /** * @return page id */ @@ -116,7 +128,6 @@ final boolean pmEmpty = Strings.isEmpty(pageMapName); final boolean pmContainsLetter = !pmEmpty && !isNumber(pageMapName); - if (pageId != null && pmEmpty && versionNumber.intValue() == 0) { // pageId Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java?rev=696353&r1=696352&r2=696353&view=diff ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java (original) +++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java Wed Sep 17 09:09:52 2008 @@ -20,7 +20,6 @@ import org.apache._wicket.IPage; import org.apache._wicket.request.RequestHandler; import org.apache._wicket.request.Url; -import org.apache._wicket.request.Url.QueryParameter; import org.apache._wicket.request.handler.impl.ListenerInterfaceRequestHandler; import org.apache._wicket.request.handler.impl.RenderPageRequestHandler; import org.apache._wicket.request.request.Request; @@ -30,10 +29,12 @@ * Decodes and encodes the following URLs: * * <pre> + * Page Instance - Render * /wicket/page?2 * /wicket/page?2.4 * /wicket/page?abc.2.4 * + * Page Instance - Listener * /wicket/page?2-click-foo-bar-baz * /wicket/page?2.4-click-foo-bar-baz * /wicket/page?pageMap.2.4-click-foo-bar-baz @@ -88,8 +89,7 @@ { IPage page = ((RenderPageRequestHandler)requestHandler).getPage(); - PageInfo i = new PageInfo(page.getPageId(), page.getPageVersionNumber(), - page.getPageMapName()); + PageInfo i = new PageInfo(page); info = new PageComponentInfo(i, null); } else if (requestHandler instanceof ListenerInterfaceRequestHandler) @@ -99,20 +99,18 @@ String componentPath = handler.getComponent().getPath(); RequestListenerInterface listenerInterface = handler.getListenerInterface(); - PageInfo pageInfo = new PageInfo(page.getPageId(), page.getPageVersionNumber(), - page.getPageMapName()); + PageInfo pageInfo = new PageInfo(page); ComponentInfo componentInfo = new ComponentInfo( requestListenerInterfaceToString(listenerInterface), componentPath); info = new PageComponentInfo(pageInfo, componentInfo); } - + if (info != null) { Url url = new Url(); url.getSegments().add(getContext().getNamespace()); url.getSegments().add(getContext().getPageIdentifier()); - QueryParameter parameter = new QueryParameter(info.toString(), ""); - url.getQueryParameters().add(parameter); + encodePageComponentInfo(url, info); return url; } else Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageParametersEncoder.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageParametersEncoder.java?rev=696353&view=auto ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageParametersEncoder.java (added) +++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageParametersEncoder.java Wed Sep 17 09:09:52 2008 @@ -0,0 +1,47 @@ +/* + * 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.PageParameters; +import org.apache._wicket.request.RequestHandler; +import org.apache._wicket.request.Url; + +/** + * Encoder that can encode and decode [EMAIL PROTECTED] PageParameters} to/from URL. + * + * @author Matej Knopp + */ +public interface PageParametersEncoder +{ + /** + * Encode the given [EMAIL PROTECTED] PageParameters} instance into URL. The URL will be then merged with + * the URL generated for [EMAIL PROTECTED] RequestHandler}. + * + * @param pageParameters + * @return Url generated from the page parameters + */ + public Url encodePageParameters(PageParameters pageParameters); + + /** + * Decodes the given URL to [EMAIL PROTECTED] PageParameters}. The URL will have all + * [EMAIL PROTECTED] RequestHandler} specified segments/parameters stripped. + * + * @param url + * @return [EMAIL PROTECTED] PageParameters} instance + */ + public PageParameters decodePageParameters(Url url); +} Propchange: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageParametersEncoder.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/SimplePageParametersEncoder.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/SimplePageParametersEncoder.java?rev=696353&view=auto ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/SimplePageParametersEncoder.java (added) +++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/SimplePageParametersEncoder.java Wed Sep 17 09:09:52 2008 @@ -0,0 +1,84 @@ +/* + * 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 java.util.List; + +import org.apache._wicket.PageParameters; +import org.apache._wicket.request.Url; +import org.apache._wicket.request.Url.QueryParameter; +import org.apache.wicket.util.string.StringValue; + +/** + * Simple encoder with direct indexed/named parameters mapping. + * + * @author Matej Knopp + */ +public class SimplePageParametersEncoder implements PageParametersEncoder +{ + /** + * Construct. + */ + public SimplePageParametersEncoder() + { + } + + public PageParameters decodePageParameters(Url url) + { + PageParameters parameters = new PageParameters(); + + int i = 0; + for (String s : url.getSegments()) + { + parameters.setIndexedParameter(i, s); + ++i; + } + + for (QueryParameter p : url.getQueryParameters()) + { + parameters.addNamedParameter(p.getName(), p.getValue()); + } + + return parameters; + } + + public Url encodePageParameters(PageParameters pageParameters) + { + Url url = new Url(); + + for (int i = 0; i < pageParameters.getIndexedParamsCount(); ++i) + { + url.getSegments().add(pageParameters.getIndexedParameter(i).toString()); + } + + for (String key : pageParameters.getNamedParameterKeys()) + { + List<StringValue> values = pageParameters.getNamedParameters(key); + if (values != null) + { + for (StringValue value : values) + { + QueryParameter param = new QueryParameter(key, value.toString()); + url.getQueryParameters().add(param); + } + } + } + + return url; + } + +} Propchange: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/SimplePageParametersEncoder.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/BookmarkableListenerInterfaceRequestHandler.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/BookmarkableListenerInterfaceRequestHandler.java?rev=696353&view=auto ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/BookmarkableListenerInterfaceRequestHandler.java (added) +++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/BookmarkableListenerInterfaceRequestHandler.java Wed Sep 17 09:09:52 2008 @@ -0,0 +1,114 @@ +/* + * 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.handler.impl; + +import org.apache._wicket.IComponent; +import org.apache._wicket.IPage; +import org.apache._wicket.PageParameters; +import org.apache._wicket.RequestCycle; +import org.apache._wicket.request.handler.ComponentRequestHandler; +import org.apache._wicket.request.handler.PageRequestHandler; +import org.apache.wicket.RequestListenerInterface; + +/** + * Request handler for bookmarkable pages with listener intreface. This handler is only used to + * generate URLs. Rendering is always handled by [EMAIL PROTECTED] ListenerInterfaceRequestHandler}. + * + * @author Matej Knopp + */ +public class BookmarkableListenerInterfaceRequestHandler + implements + PageRequestHandler, + ComponentRequestHandler +{ + private final IComponent component; + private final IPage page; + private final RequestListenerInterface listenerInterface; + + /** + * Construct. + * + * @param page + * @param component + * @param listenerInterface + */ + public BookmarkableListenerInterfaceRequestHandler(IPage page, IComponent component, + RequestListenerInterface listenerInterface) + { + if (component == null) + { + throw new IllegalArgumentException("Argument 'component' may not be null."); + } + if (page == null) + { + throw new IllegalArgumentException("Argument 'page' may not be null."); + } + if (listenerInterface == null) + { + throw new IllegalArgumentException("Argument 'listenerInterface' may not be null."); + } + this.component = component; + this.page = page; + this.listenerInterface = listenerInterface; + } + + public IComponent getComponent() + { + return component; + } + + public IPage getPage() + { + return page; + } + + public Class<? extends IPage> getPageClass() + { + return page.getClass(); + } + + public String getPageMapName() + { + return page.getPageMapName(); + } + + public PageParameters getPageParameters() + { + return page.getPageParameters(); + } + + public void detach(RequestCycle requestCycle) + { + page.detach(); + } + + /** + * Returns the listener interface. + * + * @return listener interface + */ + public RequestListenerInterface getListenerInterface() + { + return listenerInterface; + } + + public void respond(RequestCycle requestCycle) + { + // nothing to do here, this handler is only used to generate URLs + } + +} Propchange: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/BookmarkableListenerInterfaceRequestHandler.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/MockPage.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/MockPage.java?rev=696353&r1=696352&r2=696353&view=diff ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/MockPage.java (original) +++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/MockPage.java Wed Sep 17 09:09:52 2008 @@ -26,18 +26,42 @@ private static final long serialVersionUID = 1L; - private final int pageId; + private int pageId; /** * Construct. * * @param pageId */ - public MockPage(int pageId) + public MockPage() { - this.pageId = pageId; setPath(""); } + + + /** + * Construct. + * @param pageId + * @param pageVersion + * @param pageMapName + */ + public MockPage(int pageId, int pageVersion, String pageMapName) + { + setPageId(pageId); + setPageVersionNumber(pageVersion); + setPageMapName(pageMapName); + } + + /** + * Sets the page id + * @param pageId + * @return <code>this</code> + */ + public MockPage setPageId(int pageId) + { + this.pageId = pageId; + return this; + } @Override public IPage getPage() Added: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractEncoderTest.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractEncoderTest.java?rev=696353&view=auto ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractEncoderTest.java (added) +++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractEncoderTest.java Wed Sep 17 09:09:52 2008 @@ -0,0 +1,76 @@ +/* + * 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.IPage; +import org.apache._wicket.request.RequestParameters; +import org.apache._wicket.request.Url; +import org.apache._wicket.request.UrlRequestParameters; +import org.apache._wicket.request.request.Request; +import org.apache.wicket.RequestListenerInterface; +import org.apache.wicket.markup.html.link.ILinkListener; + +import junit.framework.TestCase; + +/** + * @author Matej Knopp + */ +public abstract class AbstractEncoderTest extends TestCase +{ + + /** + * Construct. + */ + public AbstractEncoderTest() + { + } + + protected TestEncoderContext context = new TestEncoderContext(); + + @Override + protected void setUp() throws Exception + { + // inititalize the interface + RequestListenerInterface i = ILinkListener.INTERFACE; + } + + protected Request getRequest(final Url url) + { + return new Request() + { + @Override + public RequestParameters getRequestParameters() + { + return new UrlRequestParameters(getUrl()); + } + + @Override + public Url getUrl() + { + return url; + } + }; + } + + protected void checkPage(IPage page, int id, int version, String pageMapName) + { + assertEquals(id, page.getPageId()); + assertEquals(version, page.getPageVersionNumber()); + assertEquals(pageMapName, page.getPageMapName()); + } + +} Propchange: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractEncoderTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java?rev=696353&view=auto ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java (added) +++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java Wed Sep 17 09:09:52 2008 @@ -0,0 +1,285 @@ +/* + * 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.MockPage; +import org.apache._wicket.PageParameters; +import org.apache._wicket.request.RequestHandler; +import org.apache._wicket.request.Url; +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.markup.html.link.ILinkListener; + + +/** + * @author Matej Knopp + */ +public class BookmarkableEncoderTest extends AbstractEncoderTest +{ + + /** + * Construct. + */ + public BookmarkableEncoderTest() + { + } + + private BookmarkableEncoder encoder = new BookmarkableEncoder() + { + @Override + protected EncoderContext getContext() + { + return context; + } + }; + + private static final String PAGE_CLASS_NAME = MockPage.class.getName(); + + /** + * + */ + public void test1() + { + Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME); + RequestHandler handler = encoder.decode(getRequest(url)); + + assertTrue(handler instanceof RenderPageRequestHandler); + IPage page = ((RenderPageRequestHandler)handler).getPage(); + assertEquals(PAGE_CLASS_NAME, page.getClass().getName()); + assertEquals(0, page.getPageParameters().getIndexedParamsCount()); + assertTrue(page.getPageParameters().getNamedParameterKeys().isEmpty()); + } + + /** + * + */ + public void test2() + { + Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME + "/indexed1?a=b&b=c"); + RequestHandler handler = encoder.decode(getRequest(url)); + + assertTrue(handler instanceof RenderPageRequestHandler); + IPage page = ((RenderPageRequestHandler)handler).getPage(); + assertEquals(PAGE_CLASS_NAME, page.getClass().getName()); + + 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 test3() + { + Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME + "?15"); + RequestHandler handler = encoder.decode(getRequest(url)); + + assertTrue(handler instanceof RenderPageRequestHandler); + IPage page = ((RenderPageRequestHandler)handler).getPage(); + checkPage(page, 15, 0, null); + } + + /** + * + */ + public void test4() + { + Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME + "/i1/i2?abc.15.5&a=b&b=c"); + RequestHandler handler = encoder.decode(getRequest(url)); + + assertTrue(handler instanceof RenderPageRequestHandler); + IPage page = ((RenderPageRequestHandler)handler).getPage(); + checkPage(page, 15, 5, "abc"); + + 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 test5() + { + Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME + "?15-ILinkListener-foo-bar"); + RequestHandler handler = encoder.decode(getRequest(url)); + + assertTrue(handler instanceof ListenerInterfaceRequestHandler); + ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler; + + IPage page = h.getPage(); + checkPage(page, 15, 0, null); + + assertEquals(ILinkListener.INTERFACE, h.getListenerInterface()); + assertEquals("foo:bar", h.getComponent().getPath()); + } + + /** + * + */ + public void test6() + { + Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME + + "/i1/i2?abc.15.5-ILinkListener-foo-bar&a=b&b=c"); + RequestHandler handler = encoder.decode(getRequest(url)); + + assertTrue(handler instanceof ListenerInterfaceRequestHandler); + ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler; + + IPage page = h.getPage(); + checkPage(page, 15, 5, "abc"); + + assertEquals(ILinkListener.INTERFACE, h.getListenerInterface()); + assertEquals("foo:bar", h.getComponent().getPath()); + + 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 test7() + { + RequestHandler handler = new BookmarkablePageRequestHandler(MockPage.class, null, + new PageParameters()); + Url url = encoder.encode(handler); + assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME, url.toString()); + } + + /** + * + */ + public void test8() + { + PageParameters parameters = new PageParameters(); + parameters.setIndexedParameter(0, "i1"); + parameters.setIndexedParameter(1, "i2"); + parameters.setNamedParameter("a", "b"); + parameters.setNamedParameter("b", "c"); + RequestHandler handler = new BookmarkablePageRequestHandler(MockPage.class, null, + parameters); + Url url = encoder.encode(handler); + assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME + "/i1/i2?a=b&b=c", url.toString()); + } + + /** + * + */ + public void test9() + { + PageParameters parameters = new PageParameters(); + parameters.setIndexedParameter(0, "i1"); + parameters.setIndexedParameter(1, "i2"); + parameters.setNamedParameter("a", "b"); + parameters.setNamedParameter("b", "c"); + + RequestHandler handler = new BookmarkablePageRequestHandler(MockPage.class, "abc", + parameters); + Url url = encoder.encode(handler); + + assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME + "/i1/i2?abc&a=b&b=c", + url.toString()); + } + + /** + * + */ + public void test10() + { + MockPage page = new MockPage(15, 5, "abc"); + page.getPageParameters().setIndexedParameter(0, "i1"); + page.getPageParameters().setIndexedParameter(1, "i2"); + page.getPageParameters().setNamedParameter("a", "b"); + page.getPageParameters().setNamedParameter("b", "c"); + page.setCreatedBookmarkable(true); + + RequestHandler handler = new RenderPageRequestHandler(page); + Url url = encoder.encode(handler); + + assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME + "/i1/i2?abc.15.5&a=b&b=c", + url.toString()); + } + + /** + * + */ + public void test11() + { + MockPage page = new MockPage(15, 5, "abc"); + page.getPageParameters().setIndexedParameter(0, "i1"); + page.getPageParameters().setIndexedParameter(1, "i2"); + page.getPageParameters().setNamedParameter("a", "b"); + page.getPageParameters().setNamedParameter("b", "c"); + + page.setCreatedBookmarkable(false); + + RequestHandler handler = new RenderPageRequestHandler(page); + Url url = encoder.encode(handler); + + // never allow bookmarkable render url for page that has not been created by bookmarkable + // URL + + assertNull(url); + } + + /** + * + */ + public void test12() + { + MockPage page = new MockPage(15, 5, "abc"); + 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); + + IComponent c = page.get("foo:bar"); + + RequestHandler handler = new BookmarkableListenerInterfaceRequestHandler(page, c, + ILinkListener.INTERFACE); + + Url url = encoder.encode(handler); + + assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME + + "/i1/i2?abc.15.5-ILinkListener-foo-bar&a=b&b=c", url.toString()); + } +} Propchange: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/PageInstanceEncoderTest.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/PageInstanceEncoderTest.java?rev=696353&r1=696352&r2=696353&view=diff ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/PageInstanceEncoderTest.java (original) +++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/PageInstanceEncoderTest.java Wed Sep 17 09:09:52 2008 @@ -16,26 +16,19 @@ */ package org.apache._wicket.request.encoder; -import junit.framework.TestCase; - import org.apache._wicket.IComponent; -import org.apache._wicket.IPage; import org.apache._wicket.MockPage; import org.apache._wicket.request.RequestHandler; -import org.apache._wicket.request.RequestParameters; import org.apache._wicket.request.Url; -import org.apache._wicket.request.UrlRequestParameters; 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; import org.apache.wicket.markup.html.link.ILinkListener; /** * * @author Matej Knopp */ -public class PageInstanceEncoderTest extends TestCase +public class PageInstanceEncoderTest extends AbstractEncoderTest { /** @@ -46,7 +39,6 @@ { } - private TestEncoderContext context = new TestEncoderContext(); private PageInstanceEncoder encoder = new PageInstanceEncoder() { @Override @@ -55,39 +47,7 @@ return context; } }; - - @Override - protected void setUp() throws Exception - { - // inititalize the interface - RequestListenerInterface i = ILinkListener.INTERFACE; - } - - private Request getRequest(final Url url) - { - return new Request() - { - @Override - public RequestParameters getRequestParameters() - { - return new UrlRequestParameters(getUrl()); - } - - @Override - public Url getUrl() - { - return url; - } - }; - } - - private void checkPage(IPage page, int id, int version, String pageMapName) - { - assertEquals(id, page.getPageId()); - assertEquals(version, page.getPageVersionNumber()); - assertEquals(pageMapName, page.getPageMapName()); - } - + /** * */ @@ -173,9 +133,7 @@ */ public void test7() { - MockPage page = new MockPage(15); - page.setPageMapName("pm1"); - page.setPageVersionNumber(4); + MockPage page = new MockPage(15, 4, "pm1"); RequestHandler handler = new RenderPageRequestHandler(page); Url url = encoder.encode(handler); @@ -187,9 +145,7 @@ */ public void test8() { - MockPage page = new MockPage(15); - page.setPageMapName(null); - page.setPageVersionNumber(0); + MockPage page = new MockPage(15, 0, null); RequestHandler handler = new RenderPageRequestHandler(page); Url url = encoder.encode(handler); @@ -201,9 +157,7 @@ */ public void test9() { - MockPage page = new MockPage(15); - page.setPageMapName(null); - page.setPageVersionNumber(0); + MockPage page = new MockPage(15, 0, null); IComponent c = page.get("a:b:c"); Modified: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java?rev=696353&r1=696352&r2=696353&view=diff ============================================================================== --- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java (original) +++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java Wed Sep 17 09:09:52 2008 @@ -20,6 +20,7 @@ import org.apache._wicket.MockPage; import org.apache._wicket.PageParameters; import org.apache.wicket.RequestListenerInterface; +import org.apache.wicket.WicketRuntimeException; /** * Simple [EMAIL PROTECTED] EncoderContext} implementation for testing purposes @@ -77,7 +78,8 @@ public IPage getPageInstance(String pageMapName, int pageId, int versionNumber) { - MockPage page = new MockPage(pageId); + MockPage page = new MockPage(); + page.setPageId(pageId); page.setPageMapName(pageMapName); page.setPageVersionNumber(versionNumber); page.setBookmarkable(bookmarkable); @@ -89,13 +91,22 @@ public IPage newPageInstance(String pageMapName, Class<? extends IPage> pageClass, PageParameters pageParameters) - { - MockPage page = new MockPage(++idCounter); - page.setPageMapName(pageMapName); - page.setBookmarkable(true); - page.setCreatedBookmarkable(true); - page.getPageParameters().assign(pageParameters); - return page; + { + try + { + MockPage page; + page = (MockPage)pageClass.newInstance(); + page.setPageId(++idCounter); + page.setPageMapName(pageMapName); + page.setBookmarkable(true); + page.setCreatedBookmarkable(true); + page.getPageParameters().assign(pageParameters); + return page; + } + catch (Exception e) + { + throw new WicketRuntimeException(e); + } } public RequestListenerInterface requestListenerInterfaceFromString(String interfaceName)