Author: ggregory
Date: Wed Aug  5 19:55:54 2009
New Revision: 801391

URL: http://svn.apache.org/viewvc?rev=801391&view=rev
Log:
[CODEC-73] Hex: Make string2byte conversions indepedent of platform default 
encoding.
Also refactor DigestUtils to call a new method on Hex.

Modified:
    commons/proper/codec/trunk/src/java/org/apache/commons/codec/binary/Hex.java
    
commons/proper/codec/trunk/src/java/org/apache/commons/codec/binary/StringUtils.java
    
commons/proper/codec/trunk/src/java/org/apache/commons/codec/digest/DigestUtils.java
    
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/Base64Test.java
    
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/HexTest.java
    
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/StringUtilsTest.java

Modified: 
commons/proper/codec/trunk/src/java/org/apache/commons/codec/binary/Hex.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/java/org/apache/commons/codec/binary/Hex.java?rev=801391&r1=801390&r2=801391&view=diff
==============================================================================
--- 
commons/proper/codec/trunk/src/java/org/apache/commons/codec/binary/Hex.java 
(original)
+++ 
commons/proper/codec/trunk/src/java/org/apache/commons/codec/binary/Hex.java 
Wed Aug  5 19:55:54 2009
@@ -17,13 +17,17 @@
 
 package org.apache.commons.codec.binary;
 
+import java.io.UnsupportedEncodingException;
+
 import org.apache.commons.codec.BinaryDecoder;
 import org.apache.commons.codec.BinaryEncoder;
+import org.apache.commons.codec.CharEncoding;
 import org.apache.commons.codec.DecoderException;
 import org.apache.commons.codec.EncoderException;
 
 /**
- * Hex encoder and decoder.
+ * Hex encoder and decoder. The charset used for certain operation can be set, 
the default is set in
+ * {...@link #DEFAULT_CHARSET_NAME}
  * 
  * @since 1.1
  * @author Apache Software Foundation
@@ -31,34 +35,31 @@
  */
 public class Hex implements BinaryEncoder, BinaryDecoder {
 
-    /** 
-     * Used to build output as Hex 
+    /**
+     * Default charset name is {...@link CharEncoding#UTF_8}
+     */
+    public static final String DEFAULT_CHARSET_NAME = CharEncoding.UTF_8;
+
+    /**
+     * Used to build output as Hex
+     */
+    private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', 
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+    /**
+     * Used to build output as Hex
      */
-    private static final char[] DIGITS_LOWER = {
-        '0', '1', '2', '3', '4', '5', '6', '7',
-           '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
-    };
-
-    /** 
-     * Used to build output as Hex 
-     */
-    private static final char[] DIGITS_UPPER = {
-        '0', '1', '2', '3', '4', '5', '6', '7',
-           '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
-    };
-
-    /**
-     * Converts an array of characters representing hexadecimal values into an
-     * array of bytes of those same values. The returned array will be half the
-     * length of the passed array, as it takes two characters to represent any
-     * given byte. An exception is thrown if the passed char array has an odd
-     * number of elements.
-     * 
-     * @param data An array of characters containing hexadecimal digits
-     * @return A byte array containing binary data decoded from
-     *         the supplied char array.
-     * @throws DecoderException Thrown if an odd number or illegal of 
characters 
-     *         is supplied
+    private static final char[] DIGITS_UPPER = {'0', '1', '2', '3', '4', '5', 
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+
+    /**
+     * Converts an array of characters representing hexadecimal values into an 
array of bytes of those same values. The
+     * returned array will be half the length of the passed array, as it takes 
two characters to represent any given
+     * byte. An exception is thrown if the passed char array has an odd number 
of elements.
+     * 
+     * @param data
+     *            An array of characters containing hexadecimal digits
+     * @return A byte array containing binary data decoded from the supplied 
char array.
+     * @throws DecoderException
+     *             Thrown if an odd number or illegal of characters is supplied
      */
     public static byte[] decodeHex(char[] data) throws DecoderException {
 
@@ -83,22 +84,6 @@
     }
 
     /**
-     * Converts a hexadecimal character to an integer.
-     *  
-     * @param ch A character to convert to an integer digit
-     * @param index The index of the character in the source
-     * @return An integer
-     * @throws DecoderException Thrown if ch is an illegal hex character
-     */
-    protected static int toDigit(char ch, int index) throws DecoderException {
-        int digit = Character.digit(ch, 16);
-        if (digit == -1) {
-            throw new DecoderException("Illegal hexadecimal charcter " + ch + 
" at index " + index);
-        }
-        return digit;
-    }
-
-    /**
      * Converts an array of bytes into an array of characters representing the 
hexadecimal values of each byte in order.
      * The returned array will be double the length of the passed array, as it 
takes two characters to represent any
      * given byte.
@@ -151,35 +136,87 @@
     }
 
     /**
-     * Converts an array of character bytes representing hexadecimal values 
into an
-     * array of bytes of those same values. The returned array will be half the
-     * length of the passed array, as it takes two characters to represent any
-     * given byte. An exception is thrown if the passed char array has an odd
-     * number of elements.
-     * 
-     * @param array An array of character bytes containing hexadecimal digits
-     * @return A byte array containing binary data decoded from
-     *         the supplied byte array (representing characters).
-     * @throws DecoderException Thrown if an odd number of characters is 
supplied
-     *                   to this function
+     * Converts an array of bytes into a String representing the hexadecimal 
values of each byte in order. The returned
+     * String will be double the length of the passed array, as it takes two 
characters to represent any given byte.
+     * 
+     * @param data
+     *            a byte[] to convert to Hex characters
+     * @return A String containing hexadecimal characters
+     * @since 1.4
+     */
+    public static String encodeHexString(byte[] data) {
+        return new String(encodeHex(data));
+    }
+
+    /**
+     * Converts a hexadecimal character to an integer.
+     * 
+     * @param ch
+     *            A character to convert to an integer digit
+     * @param index
+     *            The index of the character in the source
+     * @return An integer
+     * @throws DecoderException
+     *             Thrown if ch is an illegal hex character
+     */
+    protected static int toDigit(char ch, int index) throws DecoderException {
+        int digit = Character.digit(ch, 16);
+        if (digit == -1) {
+            throw new DecoderException("Illegal hexadecimal charcter " + ch + 
" at index " + index);
+        }
+        return digit;
+    }
+
+    private String charsetName = DEFAULT_CHARSET_NAME;
+
+    /**
+     * Creates a new codec with the default charset name {...@link 
#DEFAULT_CHARSET_NAME}
+     */
+    public Hex() {
+        // use default encoding
+    }
+
+    /**
+     * Creates a new codec with the given charset name.
+     * 
+     * @param csName
+     *            the charset name.
+     */
+    public Hex(String csName) {
+        setCharsetName(csName);
+    }
+
+    /**
+     * Converts an array of character bytes representing hexadecimal values 
into an array of bytes of those same values.
+     * The returned array will be half the length of the passed array, as it 
takes two characters to represent any given
+     * byte. An exception is thrown if the passed char array has an odd number 
of elements.
+     * 
+     * @param array
+     *            An array of character bytes containing hexadecimal digits
+     * @return A byte array containing binary data decoded from the supplied 
byte array (representing characters).
+     * @throws DecoderException
+     *             Thrown if an odd number of characters is supplied to this 
function
      * @see #decodeHex(char[])
      */
     public byte[] decode(byte[] array) throws DecoderException {
-        return decodeHex(new String(array).toCharArray());
+        try {
+            return decodeHex(new String(array, 
getCharsetName()).toCharArray());
+        } catch (UnsupportedEncodingException e) {
+            throw new DecoderException(e.getMessage(), e);
+        }
     }
-    
+
     /**
-     * Converts a String or an array of character bytes representing 
hexadecimal values into an
-     * array of bytes of those same values. The returned array will be half the
-     * length of the passed String or array, as it takes two characters to 
represent any
-     * given byte. An exception is thrown if the passed char array has an odd
-     * number of elements.
-     * 
-     * @param object A String or, an array of character bytes containing 
hexadecimal digits
-     * @return A byte array containing binary data decoded from
-     *         the supplied byte array (representing characters).
-     * @throws DecoderException Thrown if an odd number of characters is 
supplied
-     *                   to this function or the object is not a String or 
char[]
+     * Converts a String or an array of character bytes representing 
hexadecimal values into an array of bytes of those
+     * same values. The returned array will be half the length of the passed 
String or array, as it takes two characters
+     * to represent any given byte. An exception is thrown if the passed char 
array has an odd number of elements.
+     * 
+     * @param object
+     *            A String or, an array of character bytes containing 
hexadecimal digits
+     * @return A byte array containing binary data decoded from the supplied 
byte array (representing characters).
+     * @throws DecoderException
+     *             Thrown if an odd number of characters is supplied to this 
function or the object is not a String or
+     *             char[]
      * @see #decodeHex(char[])
      */
     public Object decode(Object object) throws DecoderException {
@@ -192,38 +229,73 @@
     }
 
     /**
-     * Converts an array of bytes into an array of bytes for the characters 
representing the
-     * hexadecimal values of each byte in order. The returned array will be
-     * double the length of the passed array, as it takes two characters to
+     * Converts an array of bytes into an array of bytes for the characters 
representing the hexadecimal values of each
+     * byte in order. The returned array will be double the length of the 
passed array, as it takes two characters to
      * represent any given byte.
-     *
-     * @param array a byte[] to convert to Hex characters
+     * <p>
+     * The conversion from hexadecimal characters to the returned bytes is 
performed with the charset named by
+     * {...@link #getCharsetName()}.
+     * </p>
+     * 
+     * @param array
+     *            a byte[] to convert to Hex characters
      * @return A byte[] containing the bytes of the hexadecimal characters
+     * @throws IllegalStateException
+     *             if the charsetName is invalid. This API throws {...@link 
IllegalStateException} instead of
+     *             {...@link UnsupportedEncodingException} for backward 
compatibility.
      * @see #encodeHex(byte[])
      */
     public byte[] encode(byte[] array) {
-        return new String(encodeHex(array)).getBytes();
+        return StringUtils.getBytesUnchecked(encodeHexString(array), 
getCharsetName());
     }
 
     /**
-     * Converts a String or an array of bytes into an array of characters 
representing the
-     * hexadecimal values of each byte in order. The returned array will be
-     * double the length of the passed String or array, as it takes two 
characters to
-     * represent any given byte.
-     *
-     * @param object a String, or byte[] to convert to Hex characters
+     * Converts a String or an array of bytes into an array of characters 
representing the hexadecimal values of each
+     * byte in order. The returned array will be double the length of the 
passed String or array, as it takes two
+     * characters to represent any given byte.
+     * <p>
+     * The conversion from hexadecimal characters to bytes to be encoded to 
performed with the charset named by
+     * {...@link #getCharsetName()}.
+     * </p>
+     * 
+     * @param object
+     *            a String, or byte[] to convert to Hex characters
      * @return A char[] containing hexadecimal characters
-     * @throws EncoderException Thrown if the given object is not a String or 
byte[]
+     * @throws EncoderException
+     *             Thrown if the given object is not a String or byte[]
      * @see #encodeHex(byte[])
      */
-    public Object encode(Object object) throws EncoderException {    
+    public Object encode(Object object) throws EncoderException {
         try {
-            byte[] byteArray = object instanceof String ? ((String) 
object).getBytes() : (byte[]) object;
+            byte[] byteArray = object instanceof String ? ((String) 
object).getBytes(getCharsetName()) : (byte[]) object;
             return encodeHex(byteArray);
         } catch (ClassCastException e) {
             throw new EncoderException(e.getMessage(), e);
+        } catch (UnsupportedEncodingException e) {
+            throw new EncoderException(e.getMessage(), e);
         }
     }
 
-}
+    /**
+     * Gets the charset name.
+     * 
+     * @return the charset name.
+     */
+    public String getCharsetName() {
+        return this.charsetName;
+    }
 
+    /**
+     * Sets the charset name.
+     * 
+     * @param charsetName
+     *            the charset name.
+     */
+    public void setCharsetName(String charsetName) {
+        this.charsetName = charsetName;
+    }
+
+    public String toString() {
+        return super.toString() + "[charsetName=" + this.charsetName + "]";
+    }
+}

Modified: 
commons/proper/codec/trunk/src/java/org/apache/commons/codec/binary/StringUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/java/org/apache/commons/codec/binary/StringUtils.java?rev=801391&r1=801390&r2=801391&view=diff
==============================================================================
--- 
commons/proper/codec/trunk/src/java/org/apache/commons/codec/binary/StringUtils.java
 (original)
+++ 
commons/proper/codec/trunk/src/java/org/apache/commons/codec/binary/StringUtils.java
 Wed Aug  5 19:55:54 2009
@@ -43,10 +43,10 @@
      * @throws IllegalStateException
      *             Thrown when the charset is missing, which should be never 
according the the Java specification.
      * @see <a 
href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html";>Standard
 charsets</a>
-     * @see #getSupportedBytes(String, String)
+     * @see #getBytesUnchecked(String, String)
      */
     public static byte[] getBytesIso8859_1(String string) {
-        return StringUtils.getSupportedBytes(string, CharEncoding.ISO_8859_1);
+        return StringUtils.getBytesUnchecked(string, CharEncoding.ISO_8859_1);
     }
 
     /**
@@ -59,10 +59,10 @@
      * @throws IllegalStateException
      *             Thrown when the charset is missing, which should be never 
according the the Java specification.
      * @see <a 
href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html";>Standard
 charsets</a>
-     * @see #getSupportedBytes(String, String)
+     * @see #getBytesUnchecked(String, String)
      */
     public static byte[] getBytesUsAscii(String string) {
-        return StringUtils.getSupportedBytes(string, CharEncoding.US_ASCII);
+        return StringUtils.getBytesUnchecked(string, CharEncoding.US_ASCII);
     }
 
     /**
@@ -75,10 +75,10 @@
      * @throws IllegalStateException
      *             Thrown when the charset is missing, which should be never 
according the the Java specification.
      * @see <a 
href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html";>Standard
 charsets</a>
-     * @see #getSupportedBytes(String, String)
+     * @see #getBytesUnchecked(String, String)
      */
     public static byte[] getBytesUtf16(String string) {
-        return StringUtils.getSupportedBytes(string, CharEncoding.UTF_16);
+        return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_16);
     }
 
     /**
@@ -91,10 +91,10 @@
      * @throws IllegalStateException
      *             Thrown when the charset is missing, which should be never 
according the the Java specification.
      * @see <a 
href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html";>Standard
 charsets</a>
-     * @see #getSupportedBytes(String, String)
+     * @see #getBytesUnchecked(String, String)
      */
     public static byte[] getBytesUtf16Be(String string) {
-        return StringUtils.getSupportedBytes(string, CharEncoding.UTF_16BE);
+        return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_16BE);
     }
 
     /**
@@ -107,10 +107,10 @@
      * @throws IllegalStateException
      *             Thrown when the charset is missing, which should be never 
according the the Java specification.
      * @see <a 
href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html";>Standard
 charsets</a>
-     * @see #getSupportedBytes(String, String)
+     * @see #getBytesUnchecked(String, String)
      */
     public static byte[] getBytesUtf16Le(String string) {
-        return StringUtils.getSupportedBytes(string, CharEncoding.UTF_16LE);
+        return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_16LE);
     }
 
     /**
@@ -123,10 +123,10 @@
      * @throws IllegalStateException
      *             Thrown when the charset is missing, which should be never 
according the the Java specification.
      * @see <a 
href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html";>Standard
 charsets</a>
-     * @see #getSupportedBytes(String, String)
+     * @see #getBytesUnchecked(String, String)
      */
     public static byte[] getBytesUtf8(String string) {
-        return StringUtils.getSupportedBytes(string, CharEncoding.UTF_8);
+        return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_8);
     }
 
     /**
@@ -148,7 +148,7 @@
      * @see CharEncoding
      * @see String#getBytes(String)
      */
-    public static byte[] getSupportedBytes(String string, String charsetName) {
+    public static byte[] getBytesUnchecked(String string, String charsetName) {
         if (string == null) {
             return null;
         }

Modified: 
commons/proper/codec/trunk/src/java/org/apache/commons/codec/digest/DigestUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/java/org/apache/commons/codec/digest/DigestUtils.java?rev=801391&r1=801390&r2=801391&view=diff
==============================================================================
--- 
commons/proper/codec/trunk/src/java/org/apache/commons/codec/digest/DigestUtils.java
 (original)
+++ 
commons/proper/codec/trunk/src/java/org/apache/commons/codec/digest/DigestUtils.java
 Wed Aug  5 19:55:54 2009
@@ -198,7 +198,7 @@
      * @return MD5 digest as a hex string
      */
     public static String md5Hex(byte[] data) {
-        return new String(Hex.encodeHex(md5(data)));
+        return Hex.encodeHexString(md5(data));
     }
 
     /**
@@ -212,7 +212,7 @@
      * @since 1.4
      */
     public static String md5Hex(InputStream data) throws IOException {
-        return new String(Hex.encodeHex(md5(data)));
+        return Hex.encodeHexString(md5(data));
     }
 
     /**
@@ -223,7 +223,7 @@
      * @return MD5 digest as a hex string
      */
     public static String md5Hex(String data) {
-        return new String(Hex.encodeHex(md5(data)));
+        return Hex.encodeHexString(md5(data));
     }
 
     /**
@@ -321,7 +321,7 @@
      * @since 1.4
      */
     public static String sha256Hex(byte[] data) {
-        return new String(Hex.encodeHex(sha256(data)));
+        return Hex.encodeHexString(sha256(data));
     }
 
     /**
@@ -338,7 +338,7 @@
      * @since 1.4
      */
     public static String sha256Hex(InputStream data) throws IOException {
-        return new String(Hex.encodeHex(sha256(data)));
+        return Hex.encodeHexString(sha256(data));
     }
 
     /**
@@ -353,7 +353,7 @@
      * @since 1.4
      */
     public static String sha256Hex(String data) {
-        return new String(Hex.encodeHex(sha256(data)));
+        return Hex.encodeHexString(sha256(data));
     }
 
     /**
@@ -415,7 +415,7 @@
      * @since 1.4
      */
     public static String sha384Hex(byte[] data) {
-        return new String(Hex.encodeHex(sha384(data)));
+        return Hex.encodeHexString(sha384(data));
     }
 
     /**
@@ -432,7 +432,7 @@
      * @since 1.4
      */
     public static String sha384Hex(InputStream data) throws IOException {
-        return new String(Hex.encodeHex(sha384(data)));
+        return Hex.encodeHexString(sha384(data));
     }
 
     /**
@@ -447,7 +447,7 @@
      * @since 1.4
      */
     public static String sha384Hex(String data) {
-        return new String(Hex.encodeHex(sha384(data)));
+        return Hex.encodeHexString(sha384(data));
     }
 
     /**
@@ -509,7 +509,7 @@
      * @since 1.4
      */
     public static String sha512Hex(byte[] data) {
-        return new String(Hex.encodeHex(sha512(data)));
+        return Hex.encodeHexString(sha512(data));
     }
 
     /**
@@ -526,7 +526,7 @@
      * @since 1.4
      */
     public static String sha512Hex(InputStream data) throws IOException {
-        return new String(Hex.encodeHex(sha512(data)));
+        return Hex.encodeHexString(sha512(data));
     }
 
     /**
@@ -541,7 +541,7 @@
      * @since 1.4
      */
     public static String sha512Hex(String data) {
-        return new String(Hex.encodeHex(sha512(data)));
+        return Hex.encodeHexString(sha512(data));
     }
 
     /**
@@ -552,7 +552,7 @@
      * @return SHA-1 digest as a hex string
      */
     public static String shaHex(byte[] data) {
-        return new String(Hex.encodeHex(sha(data)));
+        return Hex.encodeHexString(sha(data));
     }
 
     /**
@@ -566,7 +566,7 @@
      * @since 1.4
      */
     public static String shaHex(InputStream data) throws IOException {
-        return new String(Hex.encodeHex(sha(data)));
+        return Hex.encodeHexString(sha(data));
     }
 
     /**
@@ -577,6 +577,6 @@
      * @return SHA-1 digest as a hex string
      */
     public static String shaHex(String data) {
-        return new String(Hex.encodeHex(sha(data)));
+        return Hex.encodeHexString(sha(data));
     }
 }

Modified: 
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/Base64Test.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/Base64Test.java?rev=801391&r1=801390&r2=801391&view=diff
==============================================================================
--- 
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/Base64Test.java
 (original)
+++ 
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/Base64Test.java
 Wed Aug  5 19:55:54 2009
@@ -940,24 +940,24 @@
             // Very important debugging output should anyone
             // ever need to delve closely into this stuff.
             if (false) {
-                System.out.println("reference: [" + new 
String(Hex.encodeHex(ids[i])) + "]");
+                System.out.println("reference: [" + 
Hex.encodeHexString(ids[i]) + "]");
                 System.out.println("standard:  [" +
-                    new String(Hex.encodeHex(decodedStandard)) +
+                        Hex.encodeHexString(decodedStandard) +
                     "] From: [" +
                     StringUtils.newStringUtf8(standard[i]) +
                     "]");
                 System.out.println("safe1:     [" +
-                    new String(Hex.encodeHex(decodedUrlSafe1)) +
+                        Hex.encodeHexString(decodedUrlSafe1) +
                     "] From: [" +
                     StringUtils.newStringUtf8(urlSafe1[i]) +
                     "]");
                 System.out.println("safe2:     [" +
-                    new String(Hex.encodeHex(decodedUrlSafe2)) +
+                        Hex.encodeHexString(decodedUrlSafe2) +
                     "] From: [" +
                     StringUtils.newStringUtf8(urlSafe2[i]) +
                     "]");
                 System.out.println("safe3:     [" +
-                    new String(Hex.encodeHex(decodedUrlSafe3)) +
+                        Hex.encodeHexString(decodedUrlSafe3) +
                     "] From: [" +
                     StringUtils.newStringUtf8(urlSafe3[i]) +
                     "]");

Modified: 
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/HexTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/HexTest.java?rev=801391&r1=801390&r2=801391&view=diff
==============================================================================
--- 
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/HexTest.java
 (original)
+++ 
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/HexTest.java
 Wed Aug  5 19:55:54 2009
@@ -17,9 +17,15 @@
 
 package org.apache.commons.codec.binary;
 
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
 import java.util.Arrays;
+import java.util.Iterator;
 import java.util.Random;
+import java.util.Set;
+import java.util.SortedMap;
 
+import junit.framework.Assert;
 import junit.framework.TestCase;
 
 import org.apache.commons.codec.DecoderException;
@@ -31,19 +37,112 @@
  * @author Apache Software Foundation
  * @version $Id$
  */
-
 public class HexTest extends TestCase {
 
+    private final static boolean LOG = false;
+
     public HexTest(String name) {
         super(name);
     }
-    
-    public void testDecodeArrayOddCharacters() {
+
+    /**
+     * @param data
+     */
+    private void checkDecodeHexOddCharacters(char[] data) {
         try {
-            new Hex().decode(new byte[] { 65 });
+            Hex.decodeHex(data);
             fail("An exception wasn't thrown when trying to decode an odd 
number of characters");
+        } catch (DecoderException e) {
+            // Expected exception
+        }
+    }
+
+    private void log(String s) {
+        if (LOG) {
+            System.out.println(s);
+        }
+    }
+
+    public void testCustomCharset() throws UnsupportedEncodingException, 
DecoderException {
+        SortedMap map = Charset.availableCharsets();
+        Set keys = map.keySet();
+        Iterator iterator = keys.iterator();
+        log("testCustomCharset: Checking " + keys.size() + " charsets...");
+        while (iterator.hasNext()) {
+            String name = (String) iterator.next();
+            testCustomCharset(name, "testCustomCharset");
+        }
+    }
+
+    /**
+     * @param name
+     * @param parent
+     *            TODO
+     * @throws UnsupportedEncodingException
+     * @throws DecoderException
+     */
+    private void testCustomCharset(String name, String parent) throws 
UnsupportedEncodingException, DecoderException {
+        if (charsetSanityCheck(name) == false) {
+            log("Interesting Java charset oddity: Charset sanity check failed 
for " + name);
+            return;
+        }
+        log(parent + "=" + name);
+        Hex customCodec = new Hex(name);
+        // source data
+        String sourceString = "Hello World";
+        byte[] sourceBytes = sourceString.getBytes(name);
+        // test 1
+        // encode source to hex string to bytes with charset
+        byte[] actualEncodedBytes = customCodec.encode(sourceBytes);
+        // encode source to hex string...
+        String expectedHexString = Hex.encodeHexString(sourceBytes);
+        // ... and get the bytes in the expected charset
+        byte[] expectedHexStringBytes = expectedHexString.getBytes(name);
+        Assert.assertTrue(Arrays.equals(expectedHexStringBytes, 
actualEncodedBytes));
+        // test 2
+        String actualStringFromBytes = new String(actualEncodedBytes, name);
+        assertEquals(name + ", expectedHexString=" + expectedHexString + ", 
actualStringFromBytes=" + actualStringFromBytes,
+                expectedHexString, actualStringFromBytes);
+        // second test:
+        Hex utf8Codec = new Hex();
+        expectedHexString = "48656c6c6f20576f726c64";
+        byte[] decodedUtf8Bytes = (byte[]) utf8Codec.decode(expectedHexString);
+        actualStringFromBytes = new String(decodedUtf8Bytes, 
utf8Codec.getCharsetName());
+        // sanity check:
+        assertEquals(name, sourceString, actualStringFromBytes);
+        // actual check:
+        byte[] decodedCustomBytes = customCodec.decode(actualEncodedBytes);
+        actualStringFromBytes = new String(decodedCustomBytes, name);
+        assertEquals(name, sourceString, actualStringFromBytes);
+    }
+
+    private boolean charsetSanityCheck(String name) {
+        final String source = "the quick brown dog jumped over the lazy fox";
+        try {
+            byte[] bytes = source.getBytes(name);
+            String str = new String(bytes, name);
+            return source.equals(str);
+        } catch (UnsupportedEncodingException e) {
+            // Should NEVER happen since we are getting the name from the 
Charset class.
+            if (LOG) {
+                e.printStackTrace();
+            }
+            return false;
+        } catch (UnsupportedOperationException e) {
+            // Happens with:
+            // x-JIS0208 on Windows XP and Java Sun 1.6.0_14
+            if (LOG) {
+                e.printStackTrace();
+            }
+            return false;
         }
-        catch (DecoderException e) {
+    }
+
+    public void testDecodeArrayOddCharacters() {
+        try {
+            new Hex().decode(new byte[]{65});
+            fail("An exception wasn't thrown when trying to decode an odd 
number of characters");
+        } catch (DecoderException e) {
             // Expected exception
         }
     }
@@ -52,8 +151,7 @@
         try {
             new Hex().decode("q0");
             fail("An exception wasn't thrown when trying to decode an illegal 
character");
-        }
-        catch (DecoderException e) {
+        } catch (DecoderException e) {
             // Expected exception
         }
     }
@@ -62,38 +160,37 @@
         try {
             new Hex().decode("0q");
             fail("An exception wasn't thrown when trying to decode an illegal 
character");
-        }
-        catch (DecoderException e) {
+        } catch (DecoderException e) {
             // Expected exception
         }
     }
 
     public void testDecodeClassCastException() {
         try {
-            new Hex().decode(new int[] { 65 });
+            new Hex().decode(new int[]{65});
             fail("An exception wasn't thrown when trying to decode.");
-        }
-        catch (DecoderException e) {
+        } catch (DecoderException e) {
             // Expected exception
         }
     }
 
-    public void testDecodeHexOddCharacters() {
-        try {
-            Hex.decodeHex(new char[] { 'A' });
-            fail("An exception wasn't thrown when trying to decode an odd 
number of characters");
-        }
-        catch (DecoderException e) {
-            // Expected exception
-        }
+    public void testDecodeHexOddCharacters1() {
+        checkDecodeHexOddCharacters(new char[]{'A'});
+    }
+
+    public void testDecodeHexOddCharacters3() {
+        checkDecodeHexOddCharacters(new char[]{'A', 'B', 'C'});
+    }
+
+    public void testDecodeHexOddCharacters5() {
+        checkDecodeHexOddCharacters(new char[]{'A', 'B', 'C', 'D', 'E'});
     }
 
     public void testDecodeStringOddCharacters() {
         try {
             new Hex().decode("6");
             fail("An exception wasn't thrown when trying to decode an odd 
number of characters");
-        }
-        catch (DecoderException e) {
+        } catch (DecoderException e) {
             // Expected exception
         }
     }
@@ -101,15 +198,14 @@
     public void testDencodeEmpty() throws DecoderException {
         assertTrue(Arrays.equals(new byte[0], Hex.decodeHex(new char[0])));
         assertTrue(Arrays.equals(new byte[0], new Hex().decode(new byte[0])));
-        assertTrue(Arrays.equals(new byte[0], (byte[])new Hex().decode("")));
+        assertTrue(Arrays.equals(new byte[0], (byte[]) new Hex().decode("")));
     }
-    
+
     public void testEncodeClassCastException() {
         try {
-            new Hex().encode(new int[] { 65 });
+            new Hex().encode(new int[]{65});
             fail("An exception wasn't thrown when trying to encode.");
-        }
-        catch (EncoderException e) {
+        } catch (EncoderException e) {
             // Expected exception
         }
     }
@@ -126,7 +222,7 @@
             char[] encodedChars = Hex.encodeHex(data);
             byte[] decodedBytes = Hex.decodeHex(encodedChars);
             assertTrue(Arrays.equals(data, decodedBytes));
-            
+
             // instance API with array parameter
             byte[] encodedStringBytes = hex.encode(data);
             decodedBytes = hex.decode(encodedStringBytes);
@@ -134,34 +230,31 @@
 
             // instance API with char[] (Object) parameter
             String dataString = new String(encodedChars);
-            char[] encodedStringChars = (char[])hex.encode(dataString);
-            decodedBytes = (byte[])hex.decode(encodedStringChars);
-            assertTrue(Arrays.equals(dataString.getBytes(), decodedBytes));
+            char[] encodedStringChars = (char[]) hex.encode(dataString);
+            decodedBytes = (byte[]) hex.decode(encodedStringChars);
+            assertTrue(Arrays.equals(StringUtils.getBytesUtf8(dataString), 
decodedBytes));
 
             // instance API with String (Object) parameter
             dataString = new String(encodedChars);
-            encodedStringChars = (char[])hex.encode(dataString);
-            decodedBytes = (byte[])hex.decode(new String(encodedStringChars));
-            assertTrue(Arrays.equals(dataString.getBytes(), decodedBytes));
+            encodedStringChars = (char[]) hex.encode(dataString);
+            decodedBytes = (byte[]) hex.decode(new String(encodedStringChars));
+            assertTrue(Arrays.equals(StringUtils.getBytesUtf8(dataString), 
decodedBytes));
         }
     }
 
     public void testEncodeEmpty() throws EncoderException {
         assertTrue(Arrays.equals(new char[0], Hex.encodeHex(new byte[0])));
         assertTrue(Arrays.equals(new byte[0], new Hex().encode(new byte[0])));
-        assertTrue(Arrays.equals(new char[0], (char[])new Hex().encode("")));
+        assertTrue(Arrays.equals(new char[0], (char[]) new Hex().encode("")));
     }
 
     public void testEncodeZeroes() {
         char[] c = Hex.encodeHex(new byte[36]);
-        assertEquals(
-            "000000000000000000000000000000000000"
-                + "000000000000000000000000000000000000",
-            new String(c));
+        
assertEquals("000000000000000000000000000000000000000000000000000000000000000000000000",
 new String(c));
     }
 
     public void testHelloWorldLowerCaseHex() {
-        byte[] b = "Hello World".getBytes();
+        byte[] b = StringUtils.getBytesUtf8("Hello World");
         final String expected = "48656c6c6f20576f726c64";
         char[] actual;
         actual = Hex.encodeHex(b);
@@ -173,7 +266,7 @@
     }
 
     public void testHelloWorldUpperCaseHex() {
-        byte[] b = "Hello World".getBytes();
+        byte[] b = StringUtils.getBytesUtf8("Hello World");
         final String expected = "48656C6C6F20576F726C64";
         char[] actual;
         actual = Hex.encodeHex(b);
@@ -183,4 +276,13 @@
         actual = Hex.encodeHex(b, false);
         assertTrue(expected.equals(new String(actual)));
     }
+
+    public void testRequiredCharset() throws UnsupportedEncodingException, 
DecoderException {
+        testCustomCharset("UTF-8", "testRequiredCharset");
+        testCustomCharset("UTF-16", "testRequiredCharset");
+        testCustomCharset("UTF-16BE", "testRequiredCharset");
+        testCustomCharset("UTF-16LE", "testRequiredCharset");
+        testCustomCharset("US-ASCII", "testRequiredCharset");
+        testCustomCharset("ISO8859_1", "testRequiredCharset");
+    }
 }

Modified: 
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/StringUtilsTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/StringUtilsTest.java?rev=801391&r1=801390&r2=801391&view=diff
==============================================================================
--- 
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/StringUtilsTest.java
 (original)
+++ 
commons/proper/codec/trunk/src/test/org/apache/commons/codec/binary/StringUtilsTest.java
 Wed Aug  5 19:55:54 2009
@@ -53,15 +53,21 @@
 
     public void testGetBytesIso8859_1() throws UnsupportedEncodingException {
         String charsetName = "ISO-8859-1";
-        testGetSupportedBytes(charsetName);
+        testGetBytesUnchecked(charsetName);
         byte[] expected = STRING_FIXTURE.getBytes(charsetName);
         byte[] actual = StringUtils.getBytesIso8859_1(STRING_FIXTURE);
         Assert.assertTrue(Arrays.equals(expected, actual));
     }
 
+    private void testGetBytesUnchecked(String charsetName) throws 
UnsupportedEncodingException {
+        byte[] expected = STRING_FIXTURE.getBytes(charsetName);
+        byte[] actual = StringUtils.getBytesUnchecked(STRING_FIXTURE, 
charsetName);
+        Assert.assertTrue(Arrays.equals(expected, actual));
+    }
+
     public void testGetBytesUsAscii() throws UnsupportedEncodingException {
         String charsetName = "US-ASCII";
-        testGetSupportedBytes(charsetName);
+        testGetBytesUnchecked(charsetName);
         byte[] expected = STRING_FIXTURE.getBytes(charsetName);
         byte[] actual = StringUtils.getBytesUsAscii(STRING_FIXTURE);
         Assert.assertTrue(Arrays.equals(expected, actual));
@@ -69,7 +75,7 @@
 
     public void testGetBytesUtf16() throws UnsupportedEncodingException {
         String charsetName = "UTF-16";
-        testGetSupportedBytes(charsetName);
+        testGetBytesUnchecked(charsetName);
         byte[] expected = STRING_FIXTURE.getBytes(charsetName);
         byte[] actual = StringUtils.getBytesUtf16(STRING_FIXTURE);
         Assert.assertTrue(Arrays.equals(expected, actual));
@@ -77,7 +83,7 @@
 
     public void testGetBytesUtf16Be() throws UnsupportedEncodingException {
         String charsetName = "UTF-16BE";
-        testGetSupportedBytes(charsetName);
+        testGetBytesUnchecked(charsetName);
         byte[] expected = STRING_FIXTURE.getBytes(charsetName);
         byte[] actual = StringUtils.getBytesUtf16Be(STRING_FIXTURE);
         Assert.assertTrue(Arrays.equals(expected, actual));
@@ -85,7 +91,7 @@
 
     public void testGetBytesUtf16Le() throws UnsupportedEncodingException {
         String charsetName = "UTF-16LE";
-        testGetSupportedBytes(charsetName);
+        testGetBytesUnchecked(charsetName);
         byte[] expected = STRING_FIXTURE.getBytes(charsetName);
         byte[] actual = StringUtils.getBytesUtf16Le(STRING_FIXTURE);
         Assert.assertTrue(Arrays.equals(expected, actual));
@@ -93,21 +99,15 @@
 
     public void testGetBytesUtf8() throws UnsupportedEncodingException {
         String charsetName = "UTF-8";
-        testGetSupportedBytes(charsetName);
+        testGetBytesUnchecked(charsetName);
         byte[] expected = STRING_FIXTURE.getBytes(charsetName);
         byte[] actual = StringUtils.getBytesUtf8(STRING_FIXTURE);
         Assert.assertTrue(Arrays.equals(expected, actual));
     }
 
-    private void testGetSupportedBytes(String charsetName) throws 
UnsupportedEncodingException {
-        byte[] expected = STRING_FIXTURE.getBytes(charsetName);
-        byte[] actual = StringUtils.getSupportedBytes(STRING_FIXTURE, 
charsetName);
-        Assert.assertTrue(Arrays.equals(expected, actual));
-    }
-
-    public void testGetSupportedBytesBadEnc() {
+    public void testGetBytesUncheckedBadName() {
         try {
-            StringUtils.getSupportedBytes(STRING_FIXTURE, "UNKNOWN");
+            StringUtils.getBytesUnchecked(STRING_FIXTURE, "UNKNOWN");
             Assert.fail("Expected " + IllegalStateException.class.getName());
         } catch (IllegalStateException e) {
             // Expected


Reply via email to