Author: ivaynberg Date: Tue Jul 17 10:32:53 2007 New Revision: 556985 URL: http://svn.apache.org/viewvc?view=rev&rev=556985 Log: WICKET-765 fix invalid page map name url encoding
Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/PageMap.java incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/RequestParameters.java incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/basic/URIRequestTargetUrlCodingStrategy.java incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/AbstractRequestTargetUrlCodingStrategy.java incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/IndexedParamUrlCodingStrategy.java incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/PackageRequestTargetUrlCodingStrategy.java Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/PageMap.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/PageMap.java?view=diff&rev=556985&r1=556984&r2=556985 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/PageMap.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/PageMap.java Tue Jul 17 10:32:53 2007 @@ -84,6 +84,10 @@ */ public PageMap(String name) { + if ("".equals(name)) + { + throw new IllegalStateException("Empty string name for pagemaps is not allowed"); + } this.name = name; } @@ -243,7 +247,7 @@ setUpRedirect(cycle); cycle.setResponsePage(page); } - + private void setUpRedirect(final RequestCycle cycle) { Session session = Session.get(); @@ -254,8 +258,8 @@ // The intercept continuation URL should be saved exactly as the // original request specified. - interceptContinuationURL = "/" + cycle.getRequest().getURL(); - + interceptContinuationURL = "/" + cycle.getRequest().getURL(); + // Page map is dirty dirty(); Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java Tue Jul 17 10:32:53 2007 @@ -78,6 +78,16 @@ /** Pagemap parameter constant */ public static final String PAGEMAP = NAME_SPACE + "pageMapName"; + /** + * Url name of the default pagemap + * + * When we encode the default pagemap name in a url we cannot always use + * null or "" because it breaks urls which are encoded with /param1/value1/ + * eg /product/14/wicket:pageMapName/ split on / will split into + * {product,14,wicket:pageMapName} + */ + public static final String DEFAULT_PAGEMAP_NAME = "wicketdef"; + /** The URL path prefix expected for (so called) resources (not html pages). */ public static final String RESOURCES_PATH_PREFIX = "resources/"; @@ -87,8 +97,8 @@ * this parameter is not important, it simply has to be present to enable * the behavior */ - public static final String IGNORE_IF_NOT_ACTIVE_PARAMETER_NAME = NAME_SPACE - + "ignoreIfNotActive"; + public static final String IGNORE_IF_NOT_ACTIVE_PARAMETER_NAME = NAME_SPACE + + "ignoreIfNotActive"; /** * Various settings used to configure this strategy @@ -181,7 +191,8 @@ final RequestParameters parameters = new RequestParameters(); final String pathInfo = getRequestPath(request); parameters.setPath(pathInfo); - parameters.setPageMapName(request.getParameter(PAGEMAP)); + parameters.setPageMapName(WebRequestCodingStrategy.decodePageMapName(request + .getParameter(PAGEMAP))); addInterfaceParameters(request, parameters); addBookmarkablePageParameters(request, parameters); addResourceParameters(request, parameters); @@ -337,8 +348,8 @@ if (mountsOnPath.strategyForMount(path) != null) { - throw new WicketRuntimeException(path + " is already mounted for " - + mountsOnPath.strategyForMount(path)); + throw new WicketRuntimeException(path + " is already mounted for " + + mountsOnPath.strategyForMount(path)); } mountsOnPath.mount(path, encoder); } @@ -414,8 +425,8 @@ final String[] components = Strings.split(requestString, Component.PATH_SEPARATOR); if (components.length != 2) { - throw new WicketRuntimeException("Invalid bookmarkablePage parameter: " - + requestString + ", expected: 'pageMapName:pageClassName'"); + throw new WicketRuntimeException("Invalid bookmarkablePage parameter: " + + requestString + ", expected: 'pageMapName:pageClassName'"); } // Extract any pagemap name @@ -474,8 +485,8 @@ // pagemap:(pageid:componenta:componentb:...):version:interface:behavior:depth if (pathComponents.length < 6) { - throw new WicketRuntimeException("Internal error parsing " + INTERFACE_PARAMETER_NAME - + " = " + interfaceParameter); + throw new WicketRuntimeException("Internal error parsing " + INTERFACE_PARAMETER_NAME + + " = " + interfaceParameter); } // Extract version @@ -489,10 +500,10 @@ } catch (NumberFormatException e) { - throw new WicketRuntimeException("Internal error parsing " + INTERFACE_PARAMETER_NAME - + " = " + interfaceParameter - + "; wrong format for page version argument. Expected a number but was '" - + versionNumberString + "'", e); + throw new WicketRuntimeException("Internal error parsing " + INTERFACE_PARAMETER_NAME + + " = " + interfaceParameter + + "; wrong format for page version argument. Expected a number but was '" + + versionNumberString + "'", e); } // Set pagemap name @@ -517,8 +528,8 @@ // Component path is everything after pageMapName and before version final int start = pageMapName.length() + 1; - final int end = interfaceParameter.length() - behaviourId.length() - interfaceName.length() - - versionNumberString.length() - urlDepthString.length() - 4; + final int end = interfaceParameter.length() - behaviourId.length() - + interfaceName.length() - versionNumberString.length() - urlDepthString.length() - 4; final String componentPath = interfaceParameter.substring(start, end); parameters.setComponentPath(componentPath); } @@ -630,9 +641,9 @@ } WebRequestEncoder encoder = new WebRequestEncoder(url); - if (!application.getHomePage().equals(pageClass) - || !"".equals(pageMapName) - || (application.getHomePage().equals(pageClass) && requestTarget instanceof BookmarkableListenerInterfaceRequestTarget)) + if (!application.getHomePage().equals(pageClass) || + !"".equals(pageMapName) || + (application.getHomePage().equals(pageClass) && requestTarget instanceof BookmarkableListenerInterfaceRequestTarget)) { /* * Add <page-map-name>:<bookmarkable-page-class> @@ -645,8 +656,8 @@ * because we can't rely on the browser to interpret the unencoded * url correctly. */ - encoder.addValue(WebRequestCodingStrategy.BOOKMARKABLE_PAGE_PARAMETER_NAME, pageMapName - + Component.PATH_SEPARATOR + pageClass.getName()); + encoder.addValue(WebRequestCodingStrategy.BOOKMARKABLE_PAGE_PARAMETER_NAME, + pageMapName + Component.PATH_SEPARATOR + pageClass.getName()); } // Get page parameters @@ -1029,5 +1040,48 @@ } } }; + } + + /** + * Makes page map name url safe. + * + * Since the default page map name in wicket is null and null does not + * encode well into urls this method will substitute null for a known token. + * If the <code>pageMapName</code> passed in is not null it is returned + * without modification. + * + * @param pageMapName + * page map name + * @return encoded pagemap name + */ + public static final String encodePageMapName(String pageMapName) + { + if (Strings.isEmpty(pageMapName)) + { + return DEFAULT_PAGEMAP_NAME; + } + else + { + return pageMapName; + } + } + + /** + * Undoes the effect of [EMAIL PROTECTED] #encodePageMapName(String)} + * + * @param pageMapName + * page map name + * @return decoded page map name + */ + public static String decodePageMapName(String pageMapName) + { + if (DEFAULT_PAGEMAP_NAME.equals(pageMapName)) + { + return null; + } + else + { + return pageMapName; + } } } Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/RequestParameters.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/RequestParameters.java?view=diff&rev=556985&r1=556984&r2=556985 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/RequestParameters.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/RequestParameters.java Tue Jul 17 10:32:53 2007 @@ -37,8 +37,8 @@ * <p> * Though this object can be extended and hence more parameter options can be * used, anything other than in this implementation must be supported by - * specific [EMAIL PROTECTED] org.apache.wicket.request.IRequestCycleProcessor} implementations and - * thus are not supported by default implementations. + * specific [EMAIL PROTECTED] org.apache.wicket.request.IRequestCycleProcessor} + * implementations and thus are not supported by default implementations. * </p> * * @author Eelco Hillenius @@ -81,7 +81,7 @@ /** the path info. */ private String path; - + /** depth of the page for relative URLs. */ private int urlDepth = -1; @@ -289,7 +289,9 @@ */ public void setPageMapName(String pageMapName) { - this.pageMapName = pageMapName; + // this should be done in coding strategies, but its here as a + // precaution + this.pageMapName = WebRequestCodingStrategy.decodePageMapName(pageMapName); } /** @@ -336,7 +338,7 @@ { this.versionNumber = versionNumber; } - + /** * Gets the depth for relative URLs. Used in AJAX requests. * @@ -350,7 +352,9 @@ /** * Sets the depth for relative URLs. Used in AJAX requests. * - * @param urlDepth Number of slashes deep the page is that an AJAX request is made from. + * @param urlDepth + * Number of slashes deep the page is that an AJAX request is + * made from. */ public void setUrlDepth(int urlDepth) { Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/basic/URIRequestTargetUrlCodingStrategy.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/basic/URIRequestTargetUrlCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/basic/URIRequestTargetUrlCodingStrategy.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/basic/URIRequestTargetUrlCodingStrategy.java Tue Jul 17 10:32:53 2007 @@ -92,8 +92,8 @@ { if (!(requestTarget instanceof IBookmarkablePageRequestTarget)) { - throw new IllegalArgumentException("This encoder can only be used with " - + "instances of " + IBookmarkablePageRequestTarget.class.getName()); + throw new IllegalArgumentException("This encoder can only be used with " + + "instances of " + IBookmarkablePageRequestTarget.class.getName()); } final AppendingStringBuffer url = new AppendingStringBuffer(40); url.append(getMountPath()); @@ -107,7 +107,8 @@ { pageParameters = new PageParameters(); } - pageParameters.put(WebRequestCodingStrategy.PAGEMAP, pagemap); + pageParameters.put(WebRequestCodingStrategy.PAGEMAP, WebRequestCodingStrategy + .encodePageMapName(pagemap)); } appendParameters(url, pageParameters); return url; Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/AbstractRequestTargetUrlCodingStrategy.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/AbstractRequestTargetUrlCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/AbstractRequestTargetUrlCodingStrategy.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/AbstractRequestTargetUrlCodingStrategy.java Tue Jul 17 10:32:53 2007 @@ -45,7 +45,8 @@ IMountableRequestTargetUrlCodingStrategy { /** log. */ - private static final Logger log = LoggerFactory.getLogger(AbstractRequestTargetUrlCodingStrategy.class); + private static final Logger log = LoggerFactory + .getLogger(AbstractRequestTargetUrlCodingStrategy.class); /** mounted path. */ private final String mountPath; @@ -122,7 +123,7 @@ } } } - + private void appendValue(AppendingStringBuffer url, String key, String value) { String escapedValue = urlEncode(value); @@ -162,8 +163,8 @@ if (pairs.length % 2 != 0) { // give up - throw new IllegalStateException("URL fragment has unmatched key/value " + "pair: " - + urlFragment); + throw new IllegalStateException("URL fragment has unmatched key/value " + "pair: " + + urlFragment); } // Loop through pairs Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/BookmarkablePageRequestTargetUrlCodingStrategy.java Tue Jul 17 10:32:53 2007 @@ -37,7 +37,7 @@ AbstractRequestTargetUrlCodingStrategy { /** bookmarkable page class. */ - protected final WeakReference/*<Class>*/ bookmarkablePageClassRef; + protected final WeakReference/* <Class> */bookmarkablePageClassRef; /** page map name. */ private final String pageMapName; @@ -75,7 +75,8 @@ getMountPath().length()); final PageParameters parameters = new PageParameters(decodeParameters(parametersFragment, requestParameters.getParameters())); - String pageMapName = (String)parameters.remove(WebRequestCodingStrategy.PAGEMAP); + String pageMapName = WebRequestCodingStrategy.decodePageMapName((String)parameters + .remove(WebRequestCodingStrategy.PAGEMAP)); if (requestParameters.getPageMapName() == null) { requestParameters.setPageMapName(pageMapName); @@ -95,12 +96,13 @@ { WebRequestCodingStrategy.addInterfaceParameters(interfaceParameter, requestParameters); return new BookmarkableListenerInterfaceRequestTarget(pageMapName, - (Class)bookmarkablePageClassRef.get(), parameters, requestParameters.getComponentPath(), - requestParameters.getInterfaceName()); + (Class)bookmarkablePageClassRef.get(), parameters, requestParameters + .getComponentPath(), requestParameters.getInterfaceName()); } else { - return new BookmarkablePageRequestTarget(pageMapName, (Class)bookmarkablePageClassRef.get(), parameters); + return new BookmarkablePageRequestTarget(pageMapName, (Class)bookmarkablePageClassRef + .get(), parameters); } } @@ -111,8 +113,8 @@ { if (!(requestTarget instanceof IBookmarkablePageRequestTarget)) { - throw new IllegalArgumentException("This encoder can only be used with " - + "instances of " + IBookmarkablePageRequestTarget.class.getName()); + throw new IllegalArgumentException("This encoder can only be used with " + + "instances of " + IBookmarkablePageRequestTarget.class.getName()); } final AppendingStringBuffer url = new AppendingStringBuffer(40); url.append(getMountPath()); @@ -126,7 +128,8 @@ { pageParameters = new PageParameters(); } - pageParameters.put(WebRequestCodingStrategy.PAGEMAP, pagemap); + pageParameters.put(WebRequestCodingStrategy.PAGEMAP, WebRequestCodingStrategy + .encodePageMapName(pagemap)); } appendParameters(url, pageParameters); return url; Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/IndexedParamUrlCodingStrategy.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/IndexedParamUrlCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/IndexedParamUrlCodingStrategy.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/IndexedParamUrlCodingStrategy.java Tue Jul 17 10:32:53 2007 @@ -84,6 +84,7 @@ if (pageMap != null) { i++; + pageMap = WebRequestCodingStrategy.encodePageMapName(pageMap); url.append("/").append(WebRequestCodingStrategy.PAGEMAP).append("/").append( urlEncode(pageMap)); } @@ -91,8 +92,8 @@ if (i != parameters.size()) { throw new WicketRuntimeException( - "Not all parameters were encoded. Make sure all parameter names are integers in consecutive order starting with zero. Current parameter names are: " - + parameters.keySet().toString()); + "Not all parameters were encoded. Make sure all parameter names are integers in consecutive order starting with zero. Current parameter names are: " + + parameters.keySet().toString()); } } @@ -114,7 +115,8 @@ if (WebRequestCodingStrategy.PAGEMAP.equals(parts[i])) { i++; - params.put(WebRequestCodingStrategy.PAGEMAP, urlDecode(parts[i])); + params.put(WebRequestCodingStrategy.PAGEMAP, WebRequestCodingStrategy + .decodePageMapName(urlDecode(parts[i]))); } else { Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/PackageRequestTargetUrlCodingStrategy.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/PackageRequestTargetUrlCodingStrategy.java?view=diff&rev=556985&r1=556984&r2=556985 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/PackageRequestTargetUrlCodingStrategy.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/PackageRequestTargetUrlCodingStrategy.java Tue Jul 17 10:32:53 2007 @@ -99,11 +99,12 @@ { log.debug(e.getMessage()); return null; - } + } PageParameters parameters = new PageParameters(decodeParameters(parametersFragment, requestParameters.getParameters())); - final String pageMapName = (String)parameters.remove(WebRequestCodingStrategy.PAGEMAP); + String pageMapName = (String)parameters.remove(WebRequestCodingStrategy.PAGEMAP); + pageMapName = WebRequestCodingStrategy.decodePageMapName(pageMapName); requestParameters.setPageMapName(pageMapName); // do some extra work for checking whether this is a normal request to a @@ -132,8 +133,8 @@ { if (!(requestTarget instanceof IBookmarkablePageRequestTarget)) { - throw new IllegalArgumentException("this encoder can only be used with instances of " - + IBookmarkablePageRequestTarget.class.getName()); + throw new IllegalArgumentException("this encoder can only be used with instances of " + + IBookmarkablePageRequestTarget.class.getName()); } AppendingStringBuffer url = new AppendingStringBuffer(40); url.append(getMountPath()); @@ -143,7 +144,8 @@ PageParameters pageParameters = target.getPageParameters(); if (target.getPageMapName() != null) { - pageParameters.put(WebRequestCodingStrategy.PAGEMAP, target.getPageMapName()); + pageParameters.put(WebRequestCodingStrategy.PAGEMAP, WebRequestCodingStrategy + .encodePageMapName(target.getPageMapName())); } appendParameters(url, pageParameters);