Author: knopp
Date: Fri Sep 19 17:21:50 2008
New Revision: 697296
URL: http://svn.apache.org/viewvc?rev=697296&view=rev
Log:
added support for parameter placeholder
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/MountedEncoder.java
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.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=697296&r1=697295&r2=697296&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
Fri Sep 19 17:21:50 2008
@@ -76,8 +76,21 @@
return
getContext().requestListenerInterfaceFromString(interfaceName);
}
+ protected static String getPlaceholder(String s)
+ {
+ if (s == null || s.length() < 4 || !s.startsWith("${") ||
!s.endsWith("}"))
+ {
+ return null;
+ }
+ else
+ {
+ return s.substring(2, s.length() - 1);
+ }
+ }
+
/**
- * Returns true if the given url starts with specified segments
+ * Returns true if the given url starts with specified segments.
Segments that contain
+ * placelhoders are not compared.
*
* @param url
* @param segments
@@ -100,7 +113,8 @@
{
for (int i = 0; i < segments.length; ++i)
{
- if
(segments[i].equals(url.getSegments().get(i)) == false)
+ if
(segments[i].equals(url.getSegments().get(i)) == false &&
+ getPlaceholder(segments[i]) ==
null)
{
return false;
}
Modified:
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java
URL:
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java?rev=697296&r1=697295&r2=697296&view=diff
==============================================================================
---
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java
(original)
+++
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java
Fri Sep 19 17:21:50 2008
@@ -107,7 +107,7 @@
// to the mounted URL
if (redirectFromHomePage() && checkHomePage(url))
{
- UrlInfo info = new UrlInfo(null,
getContext().getHomePageClass(), new PageParameters());
+ UrlInfo info = new UrlInfo(null,
getContext().getHomePageClass(), newPageParameters());
return info;
}
// check if the URL is long enough and starts with the proper
segments
@@ -122,6 +122,18 @@
// extract the PageParameters from URL if there are any
PageParameters pageParameters =
extractPageParameters(url,
request.getRequestParameters(),
mountSegments.length, pageParametersEncoder);
+
+ // check if there are placeholders in mount segments
+ for (int i = 0; i < mountSegments.length; ++i)
+ {
+ String placeholder =
getPlaceholder(mountSegments[i]);
+ if (placeholder != null)
+ {
+ // extract the parameter from URL
+
pageParameters.addNamedParameter(placeholder, url.getSegments().get(i));
+ }
+ }
+
return new UrlInfo(info, pageClass, pageParameters);
}
else
@@ -129,6 +141,11 @@
return null;
}
}
+
+ protected PageParameters newPageParameters()
+ {
+ return new PageParameters();
+ }
@Override
protected Url buildUrl(UrlInfo info)
@@ -139,7 +156,20 @@
url.getSegments().add(s);
}
encodePageComponentInfo(url, info.getPageComponentInfo());
- return encodePageParameters(url, info.getPageParameters(),
pageParametersEncoder);
+
+ PageParameters copy = new
PageParameters(info.getPageParameters());
+
+ for (int i = 0; i < mountSegments.length; ++i)
+ {
+ String placeholder = getPlaceholder(mountSegments[i]);
+ if (placeholder != null)
+ {
+ url.getSegments().set(i,
copy.getNamedParameter(placeholder).toString());
+ copy.removeNamedParameter(placeholder);
+ }
+ }
+
+ return encodePageParameters(url, copy, pageParametersEncoder);
}
/**
Modified:
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.java
URL:
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.java?rev=697296&r1=697295&r2=697296&view=diff
==============================================================================
---
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.java
(original)
+++
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.java
Fri Sep 19 17:21:50 2008
@@ -52,6 +52,15 @@
}
};
+ private MountedEncoder placeholderEncoder = new
MountedEncoder("/some/${param1}/path/${param2}", MockPage.class)
+ {
+ @Override
+ protected EncoderContext getContext()
+ {
+ return context;
+ }
+ };
+
/**
*
*/
@@ -397,4 +406,62 @@
// ok
}
}
+
+ /**
+ *
+ */
+ public void testPlaceholderDecode1()
+ {
+ Url url = Url.parse("some/p1/path/p2");
+ RequestHandler handler =
placeholderEncoder.decode(getRequest(url));
+
+ assertTrue(handler instanceof RenderPageRequestHandler);
+ IPage page = ((RenderPageRequestHandler)handler).getPage();
+
+ assertEquals(0,
page.getPageParameters().getIndexedParamsCount());
+
assertTrue(page.getPageParameters().getNamedParameterKeys().size() == 2);
+ assertEquals("p1",
page.getPageParameters().getNamedParameter("param1").toString());
+ assertEquals("p2",
page.getPageParameters().getNamedParameter("param2").toString());
+ }
+
+ /**
+ *
+ */
+ public void testPlaceholderDecode2()
+ {
+ Url url = Url.parse("some/p1/path/p2/indexed1?a=b&b=c");
+ RequestHandler handler =
placeholderEncoder.decode(getRequest(url));
+
+ assertTrue(handler instanceof RenderPageRequestHandler);
+ IPage page = ((RenderPageRequestHandler)handler).getPage();
+
+ PageParameters p = page.getPageParameters();
+ assertEquals(1, p.getIndexedParamsCount());
+ assertEquals("indexed1", p.getIndexedParameter(0).toString());
+
+ assertEquals(4, p.getNamedParameterKeys().size());
+ assertEquals("b", p.getNamedParameter("a").toString());
+ assertEquals("c", p.getNamedParameter("b").toString());
+ assertEquals("p1",
page.getPageParameters().getNamedParameter("param1").toString());
+ assertEquals("p2",
page.getPageParameters().getNamedParameter("param2").toString());
+ }
+
+ /**
+ *
+ */
+ public void testPlaceholderEncode2()
+ {
+ PageParameters parameters = new PageParameters();
+ parameters.setIndexedParameter(0, "i1");
+ parameters.setIndexedParameter(1, "i2");
+ parameters.setNamedParameter("a", "b");
+ parameters.setNamedParameter("b", "c");
+ parameters.setNamedParameter("param1", "p1");
+ parameters.setNamedParameter("param2", "p2");
+
+ RequestHandler handler = new
BookmarkablePageRequestHandler(MockPage.class, null,
+ parameters);
+ Url url = placeholderEncoder.encode(handler);
+ assertEquals("some/p1/path/p2/i1/i2?a=b&b=c", url.toString());
+ }
}