/** Encode a query string. The input Map contains names indexing Object[]. */
  public static String encodeQueryString(Map parameters) {
    final StringBuilder sb = new StringBuilder(100);
    boolean first = true;
    try {
      for (Object o : parameters.keySet()) {
        final String name = (String) o;
        final Object[] values = (Object[]) parameters.get(name);
        for (final Object currentValue : values) {
          if (currentValue instanceof String) {
            if (!first) sb.append('&');

            sb.append(URLEncoder.encode(name, NetUtils.STANDARD_PARAMETER_ENCODING));
            sb.append('=');
            sb.append(
                URLEncoder.encode((String) currentValue, NetUtils.STANDARD_PARAMETER_ENCODING));

            first = false;
          }
        }
      }
    } catch (UnsupportedEncodingException e) {
      // Should not happen as we are using a required encoding
      throw new OXFException(e);
    }
    return sb.toString();
  }
 /** Combine a path info and a parameters map to form a path info with a query string. */
 public static String pathInfoParametersToPathInfoQueryString(String pathInfo, Map parameters)
     throws IOException {
   final StringBuilder redirectURL = new StringBuilder(pathInfo);
   if (parameters != null) {
     boolean first = true;
     for (Object o : parameters.keySet()) {
       final String name = (String) o;
       final Object[] values = (Object[]) parameters.get(name);
       for (final Object currentValue : values) {
         if (currentValue instanceof String) {
           redirectURL.append(first ? "?" : "&");
           redirectURL.append(URLEncoder.encode(name, NetUtils.STANDARD_PARAMETER_ENCODING));
           redirectURL.append("=");
           redirectURL.append(
               URLEncoder.encode((String) currentValue, NetUtils.STANDARD_PARAMETER_ENCODING));
           first = false;
         }
       }
     }
   }
   return redirectURL.toString();
 }