http://git-wip-us.apache.org/repos/asf/wicket/blob/7e032d21/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java ---------------------------------------------------------------------- diff --cc wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java index 4e0c08d,2c015a4..0be5d76 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java @@@ -259,6 -259,6 +259,12 @@@ public class PageProvider implements IP if (pageId != null) { page = getStoredPage(pageId); ++ ++ if (page == null) ++ { ++ // WICKET-4594 - ignore the parsed parameters for stateful pages ++ pageParameters = null; ++ } } if (page == null)
http://git-wip-us.apache.org/repos/asf/wicket/blob/7e032d21/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java ---------------------------------------------------------------------- diff --cc wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java index bd920de,bbe2e1c..94a4b7a --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java @@@ -138,12 -135,6 +140,12 @@@ public abstract class AbstractBookmarka } } - private final List<MountPathSegment> pathSegments; ++ protected final List<MountPathSegment> pathSegments; + + protected final String[] mountSegments; + + protected final IPageParametersEncoder pageParametersEncoder; + /** * Construct. */ @@@ -256,6 -250,12 +271,12 @@@ if (listenerInterface != null) { - if (pageInfo.getPageId() != null) - { - // WICKET-4594 - ignore the parsed parameters for stateful pages - pageParameters = null; - } ++// if (pageInfo.getPageId() != null) ++// { ++// // WICKET-4594 - ignore the parsed parameters for stateful pages ++// pageParameters = null; ++// } + PageAndComponentProvider provider = new PageAndComponentProvider(pageInfo.getPageId(), pageClass, pageParameters, renderCount, componentInfo.getComponentPath()); http://git-wip-us.apache.org/repos/asf/wicket/blob/7e032d21/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractComponentMapper.java ---------------------------------------------------------------------- diff --cc wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractComponentMapper.java index f3e3770,f3e3770..00b72a1 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractComponentMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractComponentMapper.java @@@ -83,21 -83,21 +83,16 @@@ public abstract class AbstractComponent */ protected PageComponentInfo getPageComponentInfo(final Url url) { -- if (url == null) -- { -- throw new IllegalStateException("Argument 'url' may not be null."); -- } -- else ++ Args.notNull(url, "url"); ++ ++ for (QueryParameter queryParameter : url.getQueryParameters()) { -- for (QueryParameter queryParameter : url.getQueryParameters()) ++ if (Strings.isEmpty(queryParameter.getValue())) { -- if (Strings.isEmpty(queryParameter.getValue())) ++ PageComponentInfo pageComponentInfo = PageComponentInfo.parse(queryParameter.getName()); ++ if (pageComponentInfo != null) { -- PageComponentInfo pageComponentInfo = PageComponentInfo.parse(queryParameter.getName()); -- if (pageComponentInfo != null) -- { -- return pageComponentInfo; -- } ++ return pageComponentInfo; } } } http://git-wip-us.apache.org/repos/asf/wicket/blob/7e032d21/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/7e032d21/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java ---------------------------------------------------------------------- diff --cc wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java index 37aada6,c6d3d2a..83e0374 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java @@@ -16,7 -16,9 +16,6 @@@ */ package org.apache.wicket.core.request.mapper; - import org.apache.wicket.Application; -import java.util.ArrayList; -import java.util.List; - import org.apache.wicket.RequestListenerInterface; import org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler; import org.apache.wicket.request.IRequestHandler; @@@ -63,8 -66,78 +63,8 @@@ import org.apache.wicket.util.string.St */ public class MountedMapper extends AbstractBookmarkableMapper { - private final IPageParametersEncoder pageParametersEncoder; - - private static class MountPathSegment - { - private int segmentIndex; - private String fixedPart; - private int minParameters; - private int optionalParameters; - - public MountPathSegment(int segmentIndex) - { - this.segmentIndex = segmentIndex; - } - - public void setFixedPart(String fixedPart) - { - this.fixedPart = fixedPart; - } - - public void addRequiredParameter() - { - minParameters++; - } - - public void addOptionalParameter() - { - optionalParameters++; - } - - public int getSegmentIndex() - { - return segmentIndex; - } - - public String getFixedPart() - { - return fixedPart; - } - - public int getMinParameters() - { - return minParameters; - } - - public int getOptionalParameters() - { - return optionalParameters; - } - - public int getMaxParameters() - { - return getOptionalParameters() + getMinParameters(); - } - - public int getFixedPartSize() - { - return getFixedPart() == null ? 0 : 1; - } - - @Override - public String toString() - { - return "(" + getSegmentIndex() + ") " + getMinParameters() + "-" + getMaxParameters() + - " " + (getFixedPart() == null ? "(end)" : getFixedPart()); - } - } - - private final List<MountPathSegment> pathSegments; - private final String[] mountSegments; - /** bookmarkable page class. */ - private final ClassProvider<? extends IRequestablePage> pageClassProvider; + private final IProvider<Class<? extends IRequestablePage>> pageClassProvider; /** * Construct. @@@ -110,16 -183,54 +110,16 @@@ * @param pageParametersEncoder */ public MountedMapper(String mountPath, - ClassProvider<? extends IRequestablePage> pageClassProvider, + IProvider<Class<? extends IRequestablePage>> pageClassProvider, IPageParametersEncoder pageParametersEncoder) { - Args.notEmpty(mountPath, "mountPath"); + super(mountPath, pageParametersEncoder); + Args.notNull(pageClassProvider, "pageClassProvider"); - Args.notNull(pageParametersEncoder, "pageParametersEncoder"); - this.pageParametersEncoder = pageParametersEncoder; this.pageClassProvider = pageClassProvider; - mountSegments = getMountSegments(mountPath); - pathSegments = getPathSegments(mountSegments); } - private List<MountPathSegment> getPathSegments(String[] segments) - { - List<MountPathSegment> ret = new ArrayList<MountPathSegment>(); - int segmentIndex = 0; - MountPathSegment curPathSegment = new MountPathSegment(segmentIndex); - ret.add(curPathSegment); - for (String curSegment : segments) - { - if (isFixedSegment(curSegment)) - { - curPathSegment.setFixedPart(curSegment); - curPathSegment = new MountPathSegment(segmentIndex + 1); - ret.add(curPathSegment); - } - else if (getPlaceholder(curSegment) != null) - { - curPathSegment.addRequiredParameter(); - } - else - { - curPathSegment.addOptionalParameter(); - } - segmentIndex++; - } - return ret; - } - - private boolean isFixedSegment(String segment) - { - return getOptionalPlaceholder(segment) == null && getPlaceholder(segment) == null; - } - - /** - * @see AbstractBookmarkableMapper#parseRequest(org.apache.wicket.request.Request) - */ @Override protected UrlInfo parseRequest(Request request) { @@@ -221,7 -410,37 +216,38 @@@ encodePageComponentInfo(url, info.getPageComponentInfo()); PageParameters copy = new PageParameters(info.getPageParameters()); - setPlaceholders(copy, url); ++// setPlaceholders(copy, url); + + int dropped = 0; + for (int i = 0; i < mountSegments.length; ++i) + { + String placeholder = getPlaceholder(mountSegments[i]); + String optionalPlaceholder = getOptionalPlaceholder(mountSegments[i]); + if (placeholder != null) + { + if (!copy.getNamedKeys().contains(placeholder)) + { + // no value for placeholder - cannot mount + return null; + } + url.getSegments().set(i - dropped, copy.get(placeholder).toString("")); + copy.remove(placeholder); + } + else if (optionalPlaceholder != null) + { + if (copy.getNamedKeys().contains(optionalPlaceholder)) + { + url.getSegments().set(i - dropped, copy.get(optionalPlaceholder).toString("")); + copy.remove(optionalPlaceholder); + } + else + { + url.getSegments().remove(i - dropped); + dropped++; + } + } + } + return encodePageParameters(url, copy, pageParametersEncoder); } http://git-wip-us.apache.org/repos/asf/wicket/blob/7e032d21/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java ---------------------------------------------------------------------- diff --cc wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java index 2e5d3fe,63e5914..2cc3e46 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java @@@ -214,9 -213,15 +214,9 @@@ public class PackageMapper extends Abst @Override protected boolean pageMustHaveBeenCreatedBookmarkable() { - return true; + return false; } - /** - * @see org.apache.wicket.core.request.mapper.AbstractBookmarkableMapper#getCompatibilityScore(org.apache.wicket.request.Request) - */ @Override public int getCompatibilityScore(Request request) { http://git-wip-us.apache.org/repos/asf/wicket/blob/7e032d21/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/7e032d21/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java ---------------------------------------------------------------------- diff --cc wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java index 9aafdac,0c6332d..8ebca1d --- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java @@@ -110,10 -108,10 +118,10 @@@ public class PackageMapperTest extends @Test public void decode1() { - Url url = Url.parse(PAGE_CLASS_NAME); + Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME); IRequestHandler handler = encoder.mapRequest(getRequest(url)); - assertTrue(handler instanceof RenderPageRequestHandler); + assertThat(handler, instanceOf(RenderPageRequestHandler.class)); IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); assertEquals(PAGE_CLASS_NAME, page.getClass().getSimpleName()); assertEquals(0, page.getPageParameters().getIndexedCount()); @@@ -126,10 -124,10 +134,10 @@@ @Test public void decode2() { - Url url = Url.parse(PAGE_CLASS_NAME + "/indexed1?a=b&b=c"); + Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/indexed1?a=b&b=c"); IRequestHandler handler = encoder.mapRequest(getRequest(url)); - assertTrue(handler instanceof RenderPageRequestHandler); + assertThat(handler, instanceOf(RenderPageRequestHandler.class)); IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); assertEquals(PAGE_CLASS_NAME, page.getClass().getSimpleName()); @@@ -148,10 -146,10 +156,10 @@@ @Test public void decode3() { - Url url = Url.parse(PAGE_CLASS_NAME + "?15"); + Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "?15"); IRequestHandler handler = encoder.mapRequest(getRequest(url)); - assertTrue(handler instanceof RenderPageRequestHandler); + assertThat(handler, instanceOf(RenderPageRequestHandler.class)); IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); checkPage(page, 15); } @@@ -162,10 -160,10 +170,10 @@@ @Test public void decode4() { - Url url = Url.parse(PAGE_CLASS_NAME + "/i1/i2?15&a=b&b=c"); + Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?15&a=b&b=c"); IRequestHandler handler = encoder.mapRequest(getRequest(url)); - assertTrue(handler instanceof RenderPageRequestHandler); + assertThat(handler, instanceOf(RenderPageRequestHandler.class)); IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); checkPage(page, 15); @@@ -181,10 -179,10 +189,10 @@@ @Test public void decode5() { - Url url = Url.parse(PAGE_CLASS_NAME + "?15-ILinkListener-foo-bar"); + Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "?15-ILinkListener-foo-bar"); IRequestHandler handler = encoder.mapRequest(getRequest(url)); - assertTrue(handler instanceof ListenerInterfaceRequestHandler); + assertThat(handler, instanceOf(ListenerInterfaceRequestHandler.class)); ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler; @@@ -202,10 -200,10 +210,10 @@@ @Test public void decode6() { - Url url = Url.parse(PAGE_CLASS_NAME + "/i1/i2?15-ILinkListener-foo-bar&a=b&b=c"); + Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?15-ILinkListener-foo-bar&a=b&b=c"); IRequestHandler handler = encoder.mapRequest(getRequest(url)); - assertTrue(handler instanceof ListenerInterfaceRequestHandler); + assertThat(handler, instanceOf(ListenerInterfaceRequestHandler.class)); ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler; IRequestablePage page = h.getPage(); @@@ -226,10 -224,10 +234,10 @@@ @Test public void decode7() { - Url url = Url.parse(PAGE_CLASS_NAME + "?15-ILinkListener.4-foo-bar"); + Url url = Url.parse(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "?15-ILinkListener.4-foo-bar"); IRequestHandler handler = encoder.mapRequest(getRequest(url)); - assertTrue(handler instanceof ListenerInterfaceRequestHandler); + assertThat(handler, instanceOf(ListenerInterfaceRequestHandler.class)); ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler; @@@ -405,10 -376,7 +413,7 @@@ IRequestHandler handler = new RenderPageRequestHandler(provider); Url url = encoder.mapHandler(handler); - // never allow bookmarkable render url for page that has not been created by bookmarkable - // URL - - assertNull(url); - assertEquals(Url.parse("MockPage/i1/i2?15&a=b&b=c"), url); ++ assertEquals(MOUNT_PATH + '/' + PAGE_CLASS_NAME + "/i1/i2?15&a=b&b=c", url.toString()); } /** @@@ -548,10 -497,10 +555,10 @@@ @Test public void decodeInnerClass() { - Url url = Url.parse("PackageMapperTest$OuterPage$InnerPage"); + Url url = Url.parse(MOUNT_PATH + '/' + "PackageMapperTest$OuterPage$InnerPage"); IRequestHandler handler = innerClassEncoder.mapRequest(getRequest(url)); - assertTrue(handler instanceof RenderPageRequestHandler); + assertThat(handler, instanceOf(RenderPageRequestHandler.class)); IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); assertEquals("InnerPage", page.getClass().getSimpleName()); assertEquals(0, page.getPageParameters().getIndexedCount()); @@@ -583,10 -532,10 +590,10 @@@ @Test public void decodeAlias() { - Url url = Url.parse(ALIAS + "?15"); + Url url = Url.parse(MOUNT_PATH + '/' + ALIAS + "?15"); IRequestHandler handler = aliasEncoder.mapRequest(getRequest(url)); - assertTrue(handler instanceof RenderPageRequestHandler); + assertThat(handler, instanceOf(RenderPageRequestHandler.class)); IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); checkPage(page, 15); assertEquals(PAGE_CLASS_NAME, page.getClass().getSimpleName());
