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.