Author: ehillenius
Date: Sat Jan 13 14:19:52 2007
New Revision: 495982

URL: http://svn.apache.org/viewvc?view=rev&rev=495982
Log:
WICKET-138

Added:
    
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/request/target/coding/MixedParamUrlCodingStrategy.java
    incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/
    
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/
    
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/
    
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest$TestPage.html
    
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest.java

Added: 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/request/target/coding/MixedParamUrlCodingStrategy.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/request/target/coding/MixedParamUrlCodingStrategy.java?view=auto&rev=495982
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/request/target/coding/MixedParamUrlCodingStrategy.java
 (added)
+++ 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/request/target/coding/MixedParamUrlCodingStrategy.java
 Sat Jan 13 14:19:52 2007
@@ -0,0 +1,177 @@
+/*
+ * 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.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 
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 
bookmarkablePageClass,
+                       String[] parameterNames)
+       {
+               super(mountPath, bookmarkablePageClass, PageMap.DEFAULT_NAME);
+               this.parameterNames = parameterNames;
+       }
+
+       /** [EMAIL PROTECTED] */
+       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] */
+       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/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest$TestPage.html
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest%24TestPage.html?view=auto&rev=495982
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest$TestPage.html
 (added)
+++ 
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest$TestPage.html
 Sat Jan 13 14:19:52 2007
@@ -0,0 +1,2 @@
+<html>
+</html>
\ No newline at end of file

Added: 
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest.java?view=auto&rev=495982
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest.java
 (added)
+++ 
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/request/target/coding/MixedParamUrlCodingStrategyTest.java
 Sat Jan 13 14:19:52 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 parameters = new HashMap();
+               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 parameters = new HashMap();
+               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 parameters = new HashMap();
+               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 parameters = new HashMap();
+
+               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 parameters = new HashMap();
+               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 parameters = new HashMap();
+               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 urlMap = new HashMap();
+               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 urlMap = new HashMap();
+               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 urlMap = new HashMap();
+               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 urlMap = new HashMap();
+               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.setHomePage(TestPage.class);
+               
tester.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));
+       }
+}


Reply via email to