Uploaded image for project: 'Wicket'
  1. Wicket
  2. WICKET-2395

add MixedParamHybridUrlCodingStrategy

    XMLWordPrintableJSON

Details

    • New Feature
    • Status: Resolved
    • Major
    • Resolution: Invalid
    • 1.4-RC5
    • 1.4.2
    • None
    • None

    Description

      /**

      • 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; }

        }

      Attachments

        Activity

          People

            jdonnerstag Juegen Donnerstag
            vladimir.kovalyuk Vladimir Kovalyuk
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: