Author: ehillenius
Date: Sat Jan 13 14:20:22 2007
New Revision: 495983
URL: http://svn.apache.org/viewvc?view=rev&rev=495983
Log:
WICKET-138
Added:
incubator/wicket/trunk/wicket/src/main/java/wicket/request/target/coding/MixedParamUrlCodingStrategy.java
incubator/wicket/trunk/wicket/src/test/java/wicket/request/
incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/
incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/
incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest$TestPage.html
incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest.java
Added:
incubator/wicket/trunk/wicket/src/main/java/wicket/request/target/coding/MixedParamUrlCodingStrategy.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/request/target/coding/MixedParamUrlCodingStrategy.java?view=auto&rev=495983
==============================================================================
---
incubator/wicket/trunk/wicket/src/main/java/wicket/request/target/coding/MixedParamUrlCodingStrategy.java
(added)
+++
incubator/wicket/trunk/wicket/src/main/java/wicket/request/target/coding/MixedParamUrlCodingStrategy.java
Sat Jan 13 14:20:22 2007
@@ -0,0 +1,180 @@
+/*
+ * 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 wicket.request.target.coding;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import wicket.Page;
+import wicket.PageMap;
+import wicket.PageParameters;
+import wicket.util.string.AppendingStringBuffer;
+import wicket.util.value.ValueMap;
+
+/**
+ *
+ * Url coding strategy for bookmarkable pages that encodes a set of given
+ * parameters
+ *
+ * in the url's path path and the rest in the querystring.
+ *
+ * <p>
+ * Strategy looks for path-parameters whose name is read from an array of
+ *
+ * names e.g. ["param0", "param1"]. Found parameters will be appended to the
url
+ * in
+ *
+ * the form <code>/mount-path/paramvalue0/paramvalue1</code>.
+ * </p>
+ *
+ * <p>
+ * All other parameters are added as parameter in the form:
+ *
+ *
<code>/mount-path/paramvalue0?otherparam0=otherparamvalue0&otherparam1=otherparamvalue1</code>.
+ * </p>
+ *
+ * <p>
+ * Decode is symmetric except for when a path parameter that is not at the end
+ * has no value during encode.
+ *
+ * For example, the names for the path parameters are: "a", "b" and "c". When
+ * "b" is
+ *
+ * not specified upon encoding, but "c" is, upon a decode "b" will get the
empty
+ * string
+ *
+ * as value. When both "b" and "c" are missing on encode, the will not get a
+ * value during decode.
+ * </p>
+ *
+ * @author erik.van.oosten
+ */
+public class MixedParamUrlCodingStrategy extends
BookmarkablePageRequestTargetUrlCodingStrategy
+{
+ private String[] parameterNames;
+
+ /**
+ * Construct.
+ *
+ * @param mountPath
+ * mount path
+ * @param bookmarkablePageClass
+ * class of mounted page
+ * @param pageMapName
+ * name of pagemap
+ * @param parameterNames
+ * the parameter names (not null)
+ */
+ public MixedParamUrlCodingStrategy(String mountPath,
+ Class<? extends Page> bookmarkablePageClass, String
pageMapName, String[] parameterNames)
+ {
+ super(mountPath, bookmarkablePageClass, pageMapName);
+ this.parameterNames = parameterNames;
+ }
+
+ /**
+ * Construct.
+ *
+ * @param mountPath
+ * mount path (not empty)
+ * @param bookmarkablePageClass
+ * class of mounted page (not null)
+ * @param parameterNames
+ * the parameter names (not null)
+ */
+ public MixedParamUrlCodingStrategy(String mountPath,
+ Class<? extends Page> bookmarkablePageClass, String[]
parameterNames)
+ {
+ super(mountPath, bookmarkablePageClass, PageMap.DEFAULT_NAME);
+ this.parameterNames = parameterNames;
+ }
+
+ /** [EMAIL PROTECTED] */
+ @SuppressWarnings("unchecked")
+ protected void appendParameters(AppendingStringBuffer url, Map
parameters)
+ {
+ Set parameterNamesToAdd = new HashSet(parameters.keySet());
+ // Find index of last specified parameter
+ boolean foundParameter = false;
+ int lastSpecifiedParameter = parameterNames.length;
+ while (lastSpecifiedParameter != 0 && !foundParameter)
+ {
+ foundParameter =
parameters.containsKey(parameterNames[--lastSpecifiedParameter]);
+ }
+
+ if (foundParameter)
+ {
+ for (int i = 0; i <= lastSpecifiedParameter; i++)
+ {
+ String parameterName = parameterNames[i];
+ String value =
(String)parameters.get(parameterName);
+ if (value == null)
+ {
+ value = "";
+ }
+ url.append("/").append(urlEncode(value));
+ parameterNamesToAdd.remove(parameterName);
+ }
+ }
+
+ if (!parameterNamesToAdd.isEmpty())
+ {
+ boolean first = true;
+ for (Iterator iter = parameterNamesToAdd.iterator();
iter.hasNext();)
+ {
+ url.append(first ? '?' : '&');
+ String parameterName = (String)iter.next();
+ String value =
(String)parameters.get(parameterName);
+
url.append(urlEncode(parameterName)).append("=").append(urlEncode(value));
+ first = false;
+ }
+ }
+ }
+
+ /** [EMAIL PROTECTED] */
+ @SuppressWarnings("unchecked")
+ protected ValueMap decodeParameters(String urlFragment, Map
urlParameters)
+ {
+ PageParameters params = new PageParameters();
+ // Add all url parameters
+ params.putAll(urlParameters);
+ String urlPath = urlFragment;
+ if (urlPath.startsWith("/"))
+ {
+ urlPath = urlPath.substring(1);
+ }
+
+ if (urlPath.length() > 0)
+ {
+ String[] pathParts = urlPath.split("/");
+ if (pathParts.length > parameterNames.length)
+ {
+ throw new IllegalArgumentException(
+ "Too many path parts, please
provide sufficient number of path parameter names");
+ }
+
+ for (int i = 0; i < pathParts.length; i++)
+ {
+ params.put(parameterNames[i], pathParts[i]);
+ }
+ }
+
+ return params;
+ }
+}
Added:
incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest$TestPage.html
URL:
http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest%24TestPage.html?view=auto&rev=495983
==============================================================================
---
incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest$TestPage.html
(added)
+++
incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest$TestPage.html
Sat Jan 13 14:20:22 2007
@@ -0,0 +1,2 @@
+<html>
+</html>
\ No newline at end of file
Added:
incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest.java?view=auto&rev=495983
==============================================================================
---
incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest.java
(added)
+++
incubator/wicket/trunk/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest.java
Sat Jan 13 14:20:22 2007
@@ -0,0 +1,331 @@
+/*
+ * 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 wicket.request.target.coding;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+import wicket.markup.html.WebPage;
+import wicket.util.string.AppendingStringBuffer;
+import wicket.util.tester.WicketTester;
+import wicket.util.value.ValueMap;
+
+/**
+ * Tests for [EMAIL PROTECTED] MixedParamUrlCodingStrategy}.
+ *
+ * @author erik.van.oosten
+ */
+public class MixedParamUrlCodingStrategyTest extends TestCase
+{
+ /**
+ * Test class.
+ *
+ * @author erik.van.oosten
+ */
+ public static class TestPage extends WebPage
+ {
+ private static final long serialVersionUID = 1L;
+ // EMPTY
+ }
+
+ private WicketTester tester;
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#appendParameters(wicket.util.string.AppendingStringBuffer,
java.util.Map)}.
+ */
+ public void testAppendParametersAppendingStringBufferMap1()
+ {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("a", "1");
+ parameters.put("d", "4");
+ parameters.put("e", "5");
+
+ String[] parameterNames = new String[] { "a", "b", "c" };
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ AppendingStringBuffer url = new AppendingStringBuffer(40);
+ npucs.appendParameters(url, parameters);
+ String urlStr = url.toString();
+ assertTrue("/1?d=4&e=5".equals(urlStr) ||
"/1?e=5&d=4".equals(urlStr));
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#appendParameters(wicket.util.string.AppendingStringBuffer,
java.util.Map)}.
+ */
+ public void testAppendParametersAppendingStringBufferMap2()
+ {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("a", "1");
+ parameters.put("b", "2");
+ parameters.put("c", "3");
+ parameters.put("d", "4");
+ parameters.put("e", "5");
+
+ String[] parameterNames = new String[] { "a", "b", "c" };
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ AppendingStringBuffer url = new AppendingStringBuffer(40);
+ npucs.appendParameters(url, parameters);
+ String urlStr = url.toString();
+ assertTrue("/1/2/3?d=4&e=5".equals(urlStr) ||
"/1/2/3?e=5&d=4".equals(urlStr));
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#appendParameters(wicket.util.string.AppendingStringBuffer,
java.util.Map)}.
+ */
+ public void testAppendParametersAppendingStringBufferMap3()
+ {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("a", "1");
+ parameters.put("b", "2");
+ parameters.put("c", "3");
+ parameters.put("d", "4");
+ parameters.put("e", "5");
+
+ String[] parameterNames = new String[] {};
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ AppendingStringBuffer url = new AppendingStringBuffer(40);
+ npucs.appendParameters(url, parameters);
+ String urlStr = url.toString();
+ assertEquals(20, urlStr.length());
+ assertTrue(urlStr.indexOf("a=1") != -1);
+ assertTrue(urlStr.indexOf("b=2") != -1);
+ assertTrue(urlStr.indexOf("c=3") != -1);
+ assertTrue(urlStr.indexOf("d=4") != -1);
+ assertTrue(urlStr.indexOf("e=5") != -1);
+
assertTrue(urlStr.matches("^\\?([abcde]=[12345]&){4}([abcde]=[12345])$"));
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#appendParameters(wicket.util.string.AppendingStringBuffer,
java.util.Map)}.
+ */
+ public void testAppendParametersAppendingStringBufferMap4()
+ {
+ Map<String, String> parameters = new HashMap<String, String>();
+
+ String[] parameterNames = new String[] { "a", "b" };
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ AppendingStringBuffer url = new AppendingStringBuffer(40);
+ npucs.appendParameters(url, parameters);
+ assertEquals("", url.toString());
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#appendParameters(wicket.util.string.AppendingStringBuffer,
java.util.Map)}.
+ */
+ public void testAppendParametersAppendingStringBufferMap5()
+ {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("a", "1");
+ parameters.put("b", "2");
+ parameters.put("c", "3");
+
+ String[] parameterNames = new String[] { "a", "b", "c" };
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ AppendingStringBuffer url = new AppendingStringBuffer(40);
+ npucs.appendParameters(url, parameters);
+ assertEquals("/1/2/3", url.toString());
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#appendParameters(wicket.util.string.AppendingStringBuffer,
java.util.Map)}.
+ */
+ public void testAppendParametersAppendingStringBufferMap6()
+ {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("a", "1");
+ parameters.put("c", "3");
+ parameters.put("d", "4");
+ parameters.put("e", "5");
+
+ String[] parameterNames = new String[] { "a", "b", "c" };
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ AppendingStringBuffer url = new AppendingStringBuffer(40);
+ npucs.appendParameters(url, parameters);
+ String urlStr = url.toString();
+ assertTrue("/1//3?d=4&e=5".equals(urlStr) ||
"/1//3?e=5&d=4".equals(urlStr));
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#decodeParameters(java.lang.String, java.util.Map)}.
+ */
+ public void testDecodeParametersStringMap1()
+ {
+ String[] parameterNames = new String[] { "a", "b", "c" };
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ Map<String, String> urlMap = new HashMap<String, String>();
+ urlMap.put("d", "4");
+ urlMap.put("e", "5");
+
+ ValueMap parameterMap = npucs.decodeParameters("/1", urlMap);
+ assertEquals(3, parameterMap.size());
+ assertContains(parameterMap, "a", "1");
+ assertContains(parameterMap, "d", "4");
+ assertContains(parameterMap, "e", "5");
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#decodeParameters(java.lang.String, java.util.Map)}.
+ */
+ public void testDecodeParametersStringMap2()
+ {
+ String[] parameterNames = new String[] { "a", "b", "c" };
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ Map<String, String> urlMap = new HashMap<String, String>();
+ urlMap.put("d", "4");
+ urlMap.put("e", "5");
+
+ ValueMap parameterMap = npucs.decodeParameters("/1/2/3",
urlMap);
+ assertEquals(5, parameterMap.size());
+ assertContains(parameterMap, "a", "1");
+ assertContains(parameterMap, "b", "2");
+ assertContains(parameterMap, "c", "3");
+ assertContains(parameterMap, "d", "4");
+ assertContains(parameterMap, "e", "5");
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#decodeParameters(java.lang.String, java.util.Map)}.
+ */
+ public void testDecodeParametersStringMap3()
+ {
+ String[] parameterNames = new String[] {};
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ Map<String, String> urlMap = new HashMap<String, String>();
+ urlMap.put("a", "1");
+ urlMap.put("b", "2");
+ urlMap.put("c", "3");
+ urlMap.put("d", "4");
+ urlMap.put("e", "5");
+
+ ValueMap parameterMap = npucs.decodeParameters("", urlMap);
+ assertEquals(5, parameterMap.size());
+ assertContains(parameterMap, "a", "1");
+ assertContains(parameterMap, "b", "2");
+ assertContains(parameterMap, "c", "3");
+ assertContains(parameterMap, "d", "4");
+ assertContains(parameterMap, "e", "5");
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#decodeParameters(java.lang.String, java.util.Map)}.
+ */
+ public void testDecodeParametersStringMap4()
+ {
+ String[] parameterNames = new String[] { "a", "b" };
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ Map urlMap = new HashMap();
+
+ ValueMap parameterMap = npucs.decodeParameters("", urlMap);
+ assertEquals(0, parameterMap.size());
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#decodeParameters(java.lang.String, java.util.Map)}.
+ */
+ public void testDecodeParametersStringMap5()
+ {
+ String[] parameterNames = new String[] { "a", "b", "c" };
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ Map urlMap = new HashMap();
+
+ ValueMap parameterMap = npucs.decodeParameters("/1/2/3",
urlMap);
+ assertEquals(3, parameterMap.size());
+ assertContains(parameterMap, "a", "1");
+ assertContains(parameterMap, "b", "2");
+ assertContains(parameterMap, "c", "3");
+ }
+
+ /**
+ * Test method for
+ * [EMAIL PROTECTED]
MixedParamUrlCodingStrategy#decodeParameters(java.lang.String, java.util.Map)}.
+ */
+ public void testDecodeParametersStringMap6()
+ {
+ String[] parameterNames = new String[] { "a", "b", "c" };
+ MixedParamUrlCodingStrategy npucs = new
MixedParamUrlCodingStrategy("mnt", TestPage.class,
+ parameterNames);
+
+ // Note nasty, but ignored c parameter
+ Map<String, String> urlMap = new HashMap<String, String>();
+ urlMap.put("c", "XXXXXXX");
+ urlMap.put("d", "4");
+ urlMap.put("e", "5");
+
+ ValueMap parameterMap = npucs.decodeParameters("/1//3", urlMap);
+ assertEquals(5, parameterMap.size());
+ assertContains(parameterMap, "a", "1");
+ // Note: missing b is translated to empty string.
+ assertContains(parameterMap, "b", "");
+ assertContains(parameterMap, "c", "3");
+ assertContains(parameterMap, "d", "4");
+ assertContains(parameterMap, "e", "5");
+ }
+
+ /** [EMAIL PROTECTED] */
+ protected void setUp() throws Exception
+ {
+ tester = new WicketTester();
+ tester.startPage(TestPage.class);
+
tester.getApplication().getRequestCycleSettings().setResponseRequestEncoding("UTF-8");
+ }
+
+ /**
+ * @param parameterMap
+ * a map
+ * @param key
+ * expected key
+ * @param value
+ * expected value
+ */
+ private void assertContains(Map parameterMap, String key, String value)
+ {
+ assertEquals(value, parameterMap.get(key));
+ }
+}