[ 
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.

Reply via email to