]> source.dussan.org Git - gitblit.git/commitdiff
Bypass Wicket bug related to url coding of array-type parameters
authorJames Moger <james.moger@gitblit.com>
Fri, 28 Feb 2014 22:58:24 +0000 (17:58 -0500)
committerJames Moger <james.moger@gitblit.com>
Sat, 1 Mar 2014 14:21:32 +0000 (09:21 -0500)
src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java

index 4f67a4ab4dff93dd4f795ec419a0eba779fa9658..382148a6017b0512d9e820dd84e42b214ce5c4f8 100644 (file)
 package com.gitblit.wicket;\r
 \r
 import java.text.MessageFormat;\r
+import java.util.HashSet;\r
+import java.util.Map;\r
+import java.util.Set;\r
 \r
 import org.apache.wicket.IRequestTarget;\r
 import org.apache.wicket.Page;\r
 import org.apache.wicket.PageParameters;\r
 import org.apache.wicket.request.RequestParameters;\r
 import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy;\r
+import org.apache.wicket.util.string.AppendingStringBuffer;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
@@ -40,6 +44,8 @@ import com.gitblit.Keys;
  */\r
 public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy {\r
 \r
+       private final String[] parameterNames;\r
+\r
        private Logger logger = LoggerFactory.getLogger(GitblitParamUrlCodingStrategy.class);\r
 \r
        private IStoredSettings settings;\r
@@ -61,6 +67,7 @@ public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy {
                        Class<C> bookmarkablePageClass, String[] parameterNames) {\r
 \r
                super(mountPath, bookmarkablePageClass, parameterNames);\r
+               this.parameterNames = parameterNames;\r
                this.settings = settings;\r
        }\r
 \r
@@ -114,4 +121,72 @@ public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy {
                                requestParameters.getParameters()));\r
                return super.decode(requestParameters);\r
        }\r
+\r
+       /**\r
+        * @see org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy#appendParameters(org.apache.wicket.util.string.AppendingStringBuffer,\r
+        *      java.util.Map)\r
+        */\r
+       @Override\r
+       protected void appendParameters(AppendingStringBuffer url, Map<String, ?> parameters)\r
+       {\r
+               if (!url.endsWith("/"))\r
+               {\r
+                       url.append("/");\r
+               }\r
+\r
+               Set<String> parameterNamesToAdd = new HashSet<String>(parameters.keySet());\r
+\r
+               // Find index of last specified parameter\r
+               boolean foundParameter = false;\r
+               int lastSpecifiedParameter = parameterNames.length;\r
+               while (lastSpecifiedParameter != 0 && !foundParameter)\r
+               {\r
+                       foundParameter = parameters.containsKey(parameterNames[--lastSpecifiedParameter]);\r
+               }\r
+\r
+               if (foundParameter)\r
+               {\r
+                       for (int i = 0; i <= lastSpecifiedParameter; i++)\r
+                       {\r
+                               String parameterName = parameterNames[i];\r
+                               final Object param = parameters.get(parameterName);\r
+                               String value = param instanceof String[] ? ((String[])param)[0] : ((param == null)\r
+                                       ? null : param.toString());\r
+                               if (value == null)\r
+                               {\r
+                                       value = "";\r
+                               }\r
+                               if (!url.endsWith("/"))\r
+                               {\r
+                                       url.append("/");\r
+                               }\r
+                               url.append(urlEncodePathComponent(value));\r
+                               parameterNamesToAdd.remove(parameterName);\r
+                       }\r
+               }\r
+\r
+               if (!parameterNamesToAdd.isEmpty())\r
+               {\r
+                       boolean first = true;\r
+                       for (String parameterName : parameterNamesToAdd)\r
+                       {\r
+                               final Object param = parameters.get(parameterName);\r
+                               if (param instanceof String[]) {\r
+                                       String [] values = (String[]) param;\r
+                                       for (String value : values) {\r
+                                               url.append(first ? '?' : '&');\r
+                                               url.append(urlEncodeQueryComponent(parameterName)).append("=").append(\r
+                                                               urlEncodeQueryComponent(value));\r
+                                               first = false;\r
+                                       }\r
+                               } else {\r
+                                       url.append(first ? '?' : '&');\r
+                                       String value = String.valueOf(param);\r
+                                       url.append(urlEncodeQueryComponent(parameterName)).append("=").append(\r
+                                               urlEncodeQueryComponent(value));\r
+                               }\r
+                               first = false;\r
+                       }\r
+               }\r
+       }\r
 }
\ No newline at end of file