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