From 9bb5225b87746b75bbd065bd0ab5af3e48cab0a4 Mon Sep 17 00:00:00 2001 From: James Moger Date: Fri, 28 Feb 2014 17:58:24 -0500 Subject: [PATCH] Bypass Wicket bug related to url coding of array-type parameters --- .../wicket/GitblitParamUrlCodingStrategy.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) 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 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 parameters) + { + if (!url.endsWith("/")) + { + url.append("/"); + } + + 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]; + 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 -- 2.39.5