/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package org.fcrepo.utilities;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.fcrepo.common.FaultException;
/**
* Base-64 utility methods.
*/
public abstract class Base64 {
/**
* Encodes bytes to base 64, returning bytes.
*
* @param in bytes to encode
* @return encoded bytes
*/
public static byte[] encode(byte[] in) {
return org.apache.commons.codec.binary.Base64.encodeBase64(in);
}
/**
* Encodes an input stream to base64, returning bytes.
* <p>
* The stream is guaranteed to be closed when this method returns, whether
* successful or not.
*
* @param in stream to encode
* @param encoded bytes, or null if there's an error reading the stream
*/
public static byte[] encode(InputStream in) {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[4096];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
return encode(out.toByteArray());
} catch (IOException e) {
return null;
} finally {
try {
in.close();
} catch (IOException e) {
throw new FaultException(e);
}
}
}
public static InputStream encodeToStream(InputStream in) {
return new org.apache.commons.codec.binary.Base64InputStream(in, true, -1, null);
}
/**
* Encodes bytes to base 64, returning a string.
*
* @param in bytes to encode
* @return encoded string
*/
public static String encodeToString(byte[] in) {
return getString(encode(in));
}
/**
* Encodes an input stream to base64, returning a string.
* <p>
* The stream is guaranteed to be closed when this method returns, whether
* successful or not.
*
* @param in stream to encode
* @param encoded string, or null if there's an error reading the stream
*/
public static String encodeToString(InputStream in) {
return getString(encode(in));
}
/**
* Decodes bytes from base 64, returning bytes.
*
* @param in bytes to decode
* @return decoded bytes
*/
public static byte[] decode(byte[] in) {
return org.apache.commons.codec.binary.Base64.decodeBase64(in);
}
/**
* Decodes a string from base 64, returning bytes.
*
* @param in string to decode
* @return decoded bytes
*/
public static byte[] decode(String in) {
return decode(getBytes(in));
}
/**
* Decodes bytes from base 64, returning a string.
*
* @param in bytes to decode
* @return decoded string
*/
public static String decodeToString(byte[] in) {
return getString(decode(in));
}
private static String getString(byte[] bytes) {
try {
if (bytes == null) return null;
return new String(bytes, "UTF-8");
} catch (UnsupportedEncodingException wontHappen) {
throw new FaultException(wontHappen);
}
}
private static byte[] getBytes(String string) {
try {
if (string == null) return null;
return string.getBytes("UTF-8");
} catch (UnsupportedEncodingException wontHappen) {
throw new FaultException(wontHappen);
}
}
}