/** Copyright by Barry G. Becker, 2000-2011. Licensed under MIT License: http://www.opensource.org/licenses/MIT */
package com.barrybecker4.common.util;
import org.apache.commons.codec.binary.Base64;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
/**
* Utility methods for Base64 compression and decompression.
*
* @author Barry Becker
*/
public final class Base64Codec {
public static final String CONVERTER_UTF8 = "UTF8";
private Base64Codec() {}
/**
* take a String and compress it.
* See @decompress for reversing the compression.
* @param data a string to compress.
* @return compressed string representation.
*/
public static synchronized String compress( final String data ) {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream( 512 );
Deflater deflater = new Deflater();
DeflaterOutputStream oStream = new DeflaterOutputStream( byteOut, deflater );
try {
oStream.write( data.getBytes( CONVERTER_UTF8 ) );
oStream.flush();
oStream.close();
} catch (UnsupportedEncodingException e) {
throw new IllegalArgumentException( "Unsupported encoding exception :" + e.getMessage(), e);
} catch (IOException e) {
throw new IllegalStateException( "io error :" + e.getMessage(), e);
}
return new String(Base64.encodeBase64( byteOut.toByteArray() ));
}
/**
* Take a String and decompress it.
* @param data the compressed string to decompress.
* @return the decompressed string.
*/
public static synchronized String decompress( final String data ) {
// convert from string to bytes for decompressing
byte[] compressedDat = Base64.decodeBase64( data.getBytes() );
final ByteArrayInputStream in = new ByteArrayInputStream( compressedDat );
final Inflater inflater = new Inflater();
final InflaterInputStream iStream = new InflaterInputStream( in, inflater );
final char cBuffer[] = new char[4096];
StringBuilder sBuf = new StringBuilder();
try {
InputStreamReader iReader = new InputStreamReader( iStream, CONVERTER_UTF8 );
while ( true ) {
final int numRead = iReader.read( cBuffer );
if ( numRead == -1 ) {
break;
}
sBuf.append( cBuffer, 0, numRead );
}
} catch (UnsupportedEncodingException e) {
throw new IllegalArgumentException( "Unsupported encoding exception :" + e.getMessage(), e);
} catch (IOException e) {
throw new IllegalStateException( "io error :" + e.getMessage(), e);
}
return sBuf.toString();
}
}