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