From 6cc0d385bbf75a0c3e9c7c463c0057c18d6fc8b6 Mon Sep 17 00:00:00 2001 From: Tatu Date: Thu, 21 Jul 2011 11:03:13 -0700 Subject: [PATCH] Adding LZMA-java codec --- build.xml | 1 + cfg/drivers-all.xml | 8 +- lib/lzma-java/lzma-java-1.3-SNAPSHOT.jar | Bin 0 -> 51034 bytes .../java/com/ning/jcbm/bzip2/BZip2Driver.java | 1 - .../java/com/ning/jcbm/lzma/LzmaDriver.java | 4 + .../com/ning/jcbm/lzma/LzmaJavaDriver.java | 71 ++++++++++++++++++ 6 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 lib/lzma-java/lzma-java-1.3-SNAPSHOT.jar create mode 100644 src/main/java/com/ning/jcbm/lzma/LzmaJavaDriver.java diff --git a/build.xml b/build.xml index 4aeea82..639e512 100644 --- a/build.xml +++ b/build.xml @@ -5,6 +5,7 @@ + diff --git a/cfg/drivers-all.xml b/cfg/drivers-all.xml index 241c450..7f0146f 100644 --- a/cfg/drivers-all.xml +++ b/cfg/drivers-all.xml @@ -10,6 +10,12 @@ xmlns="http://www.sun.com/japex/testSuite" xmlns:xi="http://www.w3.org/2001/XInclude" > + +

LZMA-java, streaming

+ + + +

Snappy-java, block mode

@@ -77,7 +83,7 @@
- +

7Zip's LZMA, block mode

diff --git a/lib/lzma-java/lzma-java-1.3-SNAPSHOT.jar b/lib/lzma-java/lzma-java-1.3-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..cff98438f46adad8f6974f9512b47895e6689df2 GIT binary patch literal 51034 zcma&N1C%7e7A@NDp0;hRx9nH1&9tZ$n>Cfnps;3-|E`V}Z;C3j&o&$b^7E)2g2qY2OHX1UC~S_5-~_(MoH(3=Burm`4&g zSbYG}Zniyvi}Q0cbs^_7w=vyMdGBzXcs*R?$aMfz6CH(uGrd(`k6!=#~+)vAy+Hge@K zJ0_b_(ORD_()Bh(139mMeH2+BpQJ`7Iw1P&Oi3N2t(r^~dGk0>8c2&AL}S(Su#lt~ zaMsAqqEUZXf_mcQu_6mMwcYD(+ox~Epg8zIDcvhUl#NlVEe5qbuH3irnx;fn0h1n0 znLf%&9OUj%0h6OnQFU6@(IR{!ud~|LW&∓s;>40pAUg!?$OI3dnV4ygQ!HWMJj7 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 NzCc5}v*FvP{{sy8wgLbE literal 0 HcmV?d00001 diff --git a/src/main/java/com/ning/jcbm/bzip2/BZip2Driver.java b/src/main/java/com/ning/jcbm/bzip2/BZip2Driver.java index 147db6b..9a53e5e 100644 --- a/src/main/java/com/ning/jcbm/bzip2/BZip2Driver.java +++ b/src/main/java/com/ning/jcbm/bzip2/BZip2Driver.java @@ -44,5 +44,4 @@ protected int uncompressFromStream(InputStream compIn, byte[] inputBuffer) throw } return total; } - } diff --git a/src/main/java/com/ning/jcbm/lzma/LzmaDriver.java b/src/main/java/com/ning/jcbm/lzma/LzmaDriver.java index 1e8e302..385c57c 100644 --- a/src/main/java/com/ning/jcbm/lzma/LzmaDriver.java +++ b/src/main/java/com/ning/jcbm/lzma/LzmaDriver.java @@ -4,6 +4,10 @@ import com.ning.jcbm.DriverBase; +/** + * Driver that uses original conversion done by LZMA author. + * Codec is not supported any more (AFAIK). + */ public class LzmaDriver extends DriverBase { static final int DEFAULT_ALGORITHM = 2; diff --git a/src/main/java/com/ning/jcbm/lzma/LzmaJavaDriver.java b/src/main/java/com/ning/jcbm/lzma/LzmaJavaDriver.java new file mode 100644 index 0000000..cf25440 --- /dev/null +++ b/src/main/java/com/ning/jcbm/lzma/LzmaJavaDriver.java @@ -0,0 +1,71 @@ +package com.ning.jcbm.lzma; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import lzma.streams.LzmaInputStream; +import lzma.streams.LzmaOutputStream; +import lzma.sdk.lzma.Decoder; + +import com.ning.jcbm.DriverBase; + +/** + * Driver for more up-to-date LZMA codec from + * [https://github.com/jponge/lzma-java]. + * Project is active, code maintained. + */ +public class LzmaJavaDriver extends DriverBase +{ + public LzmaJavaDriver() { + super("LZMA-java"); + } + + // No native Block API; but need some impl for test framework + + protected byte[] compressBlock(byte[] uncompressed) throws IOException { + return compressBlockUsingStream(uncompressed); + } + + protected byte[] uncompressBlock(byte[] compressed) throws IOException { + return uncompressBlockUsingStream( + new LzmaInputStream(new ByteArrayInputStream(compressed), getDecoder())); + } + + protected void compressToStream(byte[] uncompressed, OutputStream rawOut) throws IOException + { + LzmaOutputStream compressedOut = new LzmaOutputStream.Builder( + // do we really need compressed stream here? probably not, it's ByteArrayOutputStream + //new BufferedOutputStream(new FileOutputStream(compressed))) + rawOut) + // how about other settings? are defaults ok? + /* + .useMaximalDictionarySize() + .useEndMarkerMode(true) + .useBT4MatchFinder() + */ + .build(); + compressedOut.write(uncompressed); + compressedOut.close(); + } + + protected int uncompressFromStream(InputStream compIn, byte[] inputBuffer) throws IOException + { + // as above, we get a ByteArrayInputStream so no buffering needed: + // (but would reuse of Decoder help?) + LzmaInputStream compressedIn = new LzmaInputStream(compIn, getDecoder()); + + int total = 0; + int count; + + while ((count = compressedIn.read(inputBuffer)) >= 0) { + total += count; + } + return total; + } + + protected Decoder getDecoder() { + return new Decoder(); + } +}