diff options
author | James Moger <james.moger@gitblit.com> | 2014-02-28 17:58:24 -0500 |
---|---|---|
committer | James Moger <james.moger@gitblit.com> | 2014-03-01 09:21:32 -0500 |
commit | 9bb5225b87746b75bbd065bd0ab5af3e48cab0a4 (patch) | |
tree | acd4272de59dc11f732751c278ebd7e1915ec45e /src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java | |
parent | 4bdd3958a1d1167063acdf3a0cca49ac56b8e446 (diff) | |
download | gitblit-9bb5225b87746b75bbd065bd0ab5af3e48cab0a4.tar.gz gitblit-9bb5225b87746b75bbd065bd0ab5af3e48cab0a4.zip |
Bypass Wicket bug related to url coding of array-type parameters
Diffstat (limited to 'src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java')
-rw-r--r-- | src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java b/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java index 4f67a4ab..382148a6 100644 --- a/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java +++ b/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java @@ -16,12 +16,16 @@ package com.gitblit.wicket;
import java.text.MessageFormat;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
import org.apache.wicket.IRequestTarget;
import org.apache.wicket.Page;
import org.apache.wicket.PageParameters;
import org.apache.wicket.request.RequestParameters;
import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy;
+import org.apache.wicket.util.string.AppendingStringBuffer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,6 +44,8 @@ import com.gitblit.Keys; */
public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy {
+ private final String[] parameterNames;
+
private Logger logger = LoggerFactory.getLogger(GitblitParamUrlCodingStrategy.class);
private IStoredSettings settings;
@@ -61,6 +67,7 @@ public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy { Class<C> bookmarkablePageClass, String[] parameterNames) {
super(mountPath, bookmarkablePageClass, parameterNames);
+ this.parameterNames = parameterNames;
this.settings = settings;
}
@@ -114,4 +121,72 @@ public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy { requestParameters.getParameters()));
return super.decode(requestParameters);
}
+
+ /**
+ * @see org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy#appendParameters(org.apache.wicket.util.string.AppendingStringBuffer,
+ * java.util.Map)
+ */
+ @Override
+ protected void appendParameters(AppendingStringBuffer url, Map<String, ?> parameters)
+ {
+ if (!url.endsWith("/"))
+ {
+ url.append("/");
+ }
+
+ Set<String> parameterNamesToAdd = new HashSet<String>(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];
+ final Object param = parameters.get(parameterName);
+ String value = param instanceof String[] ? ((String[])param)[0] : ((param == null)
+ ? null : param.toString());
+ if (value == null)
+ {
+ value = "";
+ }
+ if (!url.endsWith("/"))
+ {
+ url.append("/");
+ }
+ url.append(urlEncodePathComponent(value));
+ parameterNamesToAdd.remove(parameterName);
+ }
+ }
+
+ if (!parameterNamesToAdd.isEmpty())
+ {
+ boolean first = true;
+ for (String parameterName : parameterNamesToAdd)
+ {
+ final Object param = parameters.get(parameterName);
+ if (param instanceof String[]) {
+ String [] values = (String[]) param;
+ for (String value : values) {
+ url.append(first ? '?' : '&');
+ url.append(urlEncodeQueryComponent(parameterName)).append("=").append(
+ urlEncodeQueryComponent(value));
+ first = false;
+ }
+ } else {
+ url.append(first ? '?' : '&');
+ String value = String.valueOf(param);
+ url.append(urlEncodeQueryComponent(parameterName)).append("=").append(
+ urlEncodeQueryComponent(value));
+ }
+ first = false;
+ }
+ }
+ }
}
\ No newline at end of file |