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