package sizzle.functions;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.Deflater;
import java.util.zip.DeflaterInputStream;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.binary.Base64;
public class SizzleEncodingIntrinsics {
/**
* The function tobase64 takes an input array of byte and returns an array
* of byte containing its base64 encoding. The "safe" flag, if set, invokes
* the web-safe encoding that uses '-' instead of '+' and '_' instead of
* '/', and does not pad the output with =.
*
* @param b
* An array of byte containing the unencoded input
*
* @param websafe
* Whether the output shall be web safe
*
* @return The Base64 encoding of <em>b</em>
*/
@FunctionSpec(name = "tobase64", returnType = "bytes", formalParameters = { "bytes", "bool" })
public static byte[] toBase64(final byte[] input, final boolean websafe) {
return Base64.encodeBase64(input, false, websafe);
}
/**
* The function frombase64 takes an input bytes array and returns a bytes
* array containing its base64 decoding. The boolean flag, if set, invokes
* the web-safe decoding that uses '-' instead of '+' and '_' instead of
* '/'.
*
* @param b
* An array of byte containing the encoded input
*
* @param websafe
* Whether the output shall be web safe
*
* @return The Base64 decoding of <em>b</em>
*/
@FunctionSpec(name = "frombase64", returnType = "bytes", formalParameters = { "bytes", "bool" })
public static byte[] fromBase64(final byte[] input, final boolean websafe) {
return Base64.decodeBase64(input);
}
/**
* Decompress gzip compressed data. The data must contain a valid gzip
* header and footer (as in a .gz file), but data after the footer is
* ignored.
*
* @param compressedData
* An array of byte containing gzip compressed data
*
* @return An array of byte containing the uncompressed data
*
* @throws IOException
*/
@FunctionSpec(name = "gunzip", returnType = "bytes", formalParameters = { "bytes" })
public static byte[] gUnzip(final byte[] compressedData) throws IOException {
final GZIPInputStream i = new GZIPInputStream(new ByteArrayInputStream(compressedData));
try {
final ByteArrayOutputStream o = new ByteArrayOutputStream(compressedData.length);
try {
final byte[] buf = new byte[4096];
int len;
while ((len = i.read(buf)) > 0)
o.write(buf, 0, len);
} finally {
o.close();
}
return o.toByteArray();
} finally {
i.close();
}
}
/**
* Compress data using gzip.
*
* @param uncompressedData
* An array of byte containing data to be compressed
*
* @return An array of byte containing the compressed data
*
* @throws IOException
*/
@FunctionSpec(name = "gzip", returnType = "bytes", formalParameters = { "bytes" })
public static byte[] gZip(final byte[] uncompressedData) throws IOException {
final InputStream i = new ByteArrayInputStream(uncompressedData);
try {
final ByteArrayOutputStream o = new ByteArrayOutputStream();
try {
final GZIPOutputStream g = new GZIPOutputStream(o);
try {
final byte[] buf = new byte[8192];
int len;
while ((len = i.read(buf)) > 0)
g.write(buf, 0, len);
} finally {
g.close();
}
} finally {
o.close();
}
return o.toByteArray();
} finally {
i.close();
}
}
/**
* Uncompresses the zipped data using zlib, and returns the uncompressed
* data.
*
* @param compressedData
* An array of byte containing gzip compressed data
*
* @param skipHeader
* Ignored
*
* @return An array of byte containing the uncompressed data
*
* @throws IOException
*/
@FunctionSpec(name = "zlibuncompress", returnType = "bytes", formalParameters = { "bytes", "bool" })
public static byte[] zlibUncompress(final byte[] compressedData, final boolean skipHeader) throws IOException {
final DeflaterInputStream i = new DeflaterInputStream(new ByteArrayInputStream(compressedData), new Deflater(Deflater.DEFAULT_COMPRESSION), 8192);
try {
final ByteArrayOutputStream o = new ByteArrayOutputStream(compressedData.length);
try {
final byte[] buf = new byte[4096];
int len;
while ((len = i.read(buf)) > 0)
o.write(buf, 0, len);
} finally {
o.close();
}
return o.toByteArray();
} finally {
i.close();
}
}
/**
* Compresses data using deflate.
*
* @param uncompressedData
* An array of byte containing data to be compressed
*
* @param skipHeader
* Ignored
*
* @return An array of byte containing the compressed data
*
* @throws IOException
*/
@FunctionSpec(name = "zlibcompress", returnType = "bytes", formalParameters = { "bytes", "bool" })
public static byte[] zlibCompress(final byte[] uncompressedData, final boolean skipHeader) throws IOException {
final InputStream i = new ByteArrayInputStream(uncompressedData);
try {
final ByteArrayOutputStream o = new ByteArrayOutputStream();
try {
final DeflaterOutputStream d = new DeflaterOutputStream(o, new Deflater(Deflater.DEFAULT_COMPRESSION), 8192);
try {
final byte[] buf = new byte[8192];
int len;
while ((len = i.read(buf)) > 0)
d.write(buf, 0, len);
} finally {
d.close();
}
} finally {
o.close();
}
return o.toByteArray();
} finally {
i.close();
}
}
}