You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Erik van Oosten (JIRA)" <ji...@apache.org> on 2009/09/27 21:12:16 UTC
[jira] Commented: (WICKET-2395) add
MixedParamHybridUrlCodingStrategy
[ https://issues.apache.org/jira/browse/WICKET-2395?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12760086#action_12760086 ]
Erik van Oosten commented on WICKET-2395:
-----------------------------------------
Igor committed WICKET-2439 earlier. WICKET-2439 also contains this class.
> add MixedParamHybridUrlCodingStrategy
> -------------------------------------
>
> Key: WICKET-2395
> URL: https://issues.apache.org/jira/browse/WICKET-2395
> Project: Wicket
> Issue Type: New Feature
> Affects Versions: 1.4-RC5
> Reporter: Vladimir Kovalyuk
> Assignee: Juergen Donnerstag
> Fix For: 1.4.2
>
>
> /**
> * Apache 2 license.
> */
> import java.util.HashSet;
> import java.util.Iterator;
> import java.util.Map;
> import java.util.Set;
> import org.apache.wicket.Page;
> import org.apache.wicket.PageParameters;
> import org.apache.wicket.RequestCycle;
> import org.apache.wicket.request.target.coding.HybridUrlCodingStrategy;
> import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy;
> import org.apache.wicket.util.string.AppendingStringBuffer;
> import org.apache.wicket.util.value.ValueMap;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
> /**
> * @see MixedParamUrlCodingStrategy
> *
> * @author Erik van Oosten
> */
> public class MixedParamHybridUrlCodingStrategy extends HybridUrlCodingStrategy {
> private static Logger logger = LoggerFactory.getLogger(MixedParamHybridUrlCodingStrategy.class);
> private final String[] parameterNames;
> private boolean ignoreUndeclaredParameters = true;
> /**
> * Construct.
> *
> * @param mountPath
> * mount path
> * @param pageClass
> * class of mounted page
> * @param redirectOnBookmarkableRequest
> * ?
> * @param parameterNames
> * the parameter names (not null)
> */
> public MixedParamHybridUrlCodingStrategy(String mountPath, Class<? extends Page> pageClass,
> boolean redirectOnBookmarkableRequest, String[] parameterNames) {
> super(mountPath, pageClass, redirectOnBookmarkableRequest);
> this.parameterNames = parameterNames;
> }
> /**
> * Construct.
> *
> * @param mountPath
> * mount path
> * @param pageClass
> * class of mounted page
> * @param parameterNames
> * the parameter names (not null)
> */
> public MixedParamHybridUrlCodingStrategy(String mountPath, Class<? extends Page> pageClass, String[] parameterNames) {
> super(mountPath, pageClass);
> this.parameterNames = parameterNames;
> }
> /** {@inheritDoc} */
> @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] : (String) param;
> if (value == null) {
> value = "";
> }
> url.append(urlEncodePathComponent(value)).append("/");
> parameterNamesToAdd.remove(parameterName);
> }
> }
> if (!parameterNamesToAdd.isEmpty()) {
> boolean first = true;
> final Iterator iterator = parameterNamesToAdd.iterator();
> while (iterator.hasNext()) {
> url.append(first ? '?' : '&');
> String parameterName = (String) iterator.next();
> final Object param = parameters.get(parameterName);
> String value = param instanceof String[] ? ((String[]) param)[0] : (String) param;
> url.append(urlEncodeQueryComponent(parameterName)).append("=").append(urlEncodeQueryComponent(value));
> first = false;
> }
> }
> }
> /** {@inheritDoc} */
> @Override
> protected ValueMap decodeParameters(String urlFragment, Map<String, ?> urlParameters) {
> PageParameters params = new PageParameters();
> // Add all url parameters
> params.putAll(urlParameters);
> String urlPath = urlFragment;
> urlPath = removeStartSlash(urlPath);
> urlPath = removeEndSlash(urlPath);
> if (urlPath.length() > 0) {
> String[] pathParts = urlPath.split("/");
> if (pathParts.length > parameterNames.length) {
> String msg = String.format(
> "Too many path parts, please provide sufficient number of path parameter names "
> + " url: '%s', mountpath: '%s', urlPath: '%s', expected %d parameters", RequestCycle
> .get().getRequest().getURL(), getMountPath(), urlPath, parameterNames.length);
> if (ignoreUndeclaredParameters) {
> logger.error(msg);
> } else {
> throw new IllegalArgumentException(msg);
> }
> }
> int actualParameterCount = Math.min(pathParts.length, parameterNames.length);
> for (int i = 0; i < actualParameterCount; i++) {
> params.put(parameterNames[i], urlDecodePathComponent(pathParts[i]));
> }
> }
> return params;
> }
> private String removeEndSlash(String urlPath) {
> if (urlPath.endsWith("/")) {
> urlPath = urlPath.substring(0, urlPath.length() - 1);
> }
> return urlPath;
> }
> private String removeStartSlash(String urlPath) {
> if (urlPath.startsWith("/")) {
> urlPath = urlPath.substring(1);
> }
> return urlPath;
> }
> /**
> * @param ignoreUndeclaredParameters
> * true to ignore undeclared parameters in the URL (still
> * logged), false to throw an exception when this happens
> * (default is true)
> */
> public void setIgnoreUndeclaredParameters(boolean ignoreUndeclaredParameters) {
> this.ignoreUndeclaredParameters = ignoreUndeclaredParameters;
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.