package at.gv.egovernment.moa.util;

import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;

/**
 * Translates a string into mime format "x-www-form-urlencoded".
 * Provides a function missing in JDK 1.3. 
 * @author Paul Ivancsics
 * @version $Id$
 */
public class URLEncoder {
  
  /**
   * Translates a string into x-www-form-urlencoded format.
   * @param s the string to be translated
   * @param encoding the encoding to use
   * @return the translated string
   * @throws UnsupportedEncodingException when the desired encoding is not supported
   */
  public static String encode(String s, String encoding) throws UnsupportedEncodingException {
    byte[] barr = s.getBytes(encoding);
    ByteArrayInputStream bin = new ByteArrayInputStream(barr);
    StringWriter out = new StringWriter();
    for (int b = bin.read(); b >= 0; b = bin.read())
      encode(b, out);
    return out.toString();
  }
  
  /**
   * Encode a character.
   * @param ch The character to encode.
   * @param out The <code>StringWriter</code> containing the result.
   */
  private static void encode(int ch, StringWriter out) {
    if ((ch >= 'a' && ch <= 'z')
      || (ch >= 'A' && ch <= 'Z')
      || (ch >= '0' && ch <= '9')
      || ch == '.' || ch == '-' || ch == '*' || ch == '_')
      out.write(ch);
    else if (ch == ' ')
      out.write('+');
    else
      encodeHex(ch, out);
  }
  
  /**
   * Encode a character as an escaped hex value. 
   * @param ch The character to encode.
   * @param out The <code>StringWriter</code> containing the result.
   */
  private static void encodeHex(int ch, StringWriter out) {
    out.write('%');
    String hex = Integer.toHexString(ch).toUpperCase();
    if (hex.length() < 2)
      out.write('0');
    else
      out.write(hex.charAt(hex.length() - 2));
    out.write(hex.charAt(hex.length() - 1));
  }

}