package org.araqne.logstorage.file;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import net.jpountz.lz4.LZ4Compressor;
import net.jpountz.lz4.LZ4Factory;
import net.jpountz.lz4.LZ4FastDecompressor;
import net.jpountz.util.Native;
public class Lz4Compression implements Compression {
private static final LZ4Factory factory;
static {
org.slf4j.Logger slog = org.slf4j.LoggerFactory.getLogger(Lz4Compression.class);
try {
Native.load();
slog.info("araqne logstorage: loaded native lz4 library successfully, result [{}]", Native.isLoaded());
} catch (Throwable t) {
slog.warn("araqne logstorage: cannot load native lz4 library, cause []", t.toString());
} finally {
factory = LZ4Factory.fastestInstance();
}
}
@Override
public ByteBuffer compress(byte[] b, int offset, int limit) throws IOException {
LZ4Compressor compressor = factory.fastCompressor();
int maxCompressedLength = compressor.maxCompressedLength(limit);
byte[] compressed = new byte[maxCompressedLength];
int compressedLength = compressor.compress(b, offset, limit, compressed, 0, maxCompressedLength);
return ByteBuffer.wrap(Arrays.copyOf(compressed, compressedLength));
}
@Override
public void uncompress(byte[] output, byte[] b, int offset, int limit) throws IOException {
LZ4FastDecompressor decompressor = factory.fastDecompressor();
decompressor.decompress(b, offset, output, 0, output.length);
}
@Override
public void close() {
}
}