Browse Source

Major speed improvements on BZip2 streams.

PR: 24798
Submitted by:	Joerg Wassmer <joerg dot wassmer at web dot de>


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278137 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 20 years ago
parent
commit
134d95afef
6 changed files with 2360 additions and 1674 deletions
  1. +2
    -0
      CONTRIBUTORS
  2. +12
    -2
      src/main/org/apache/tools/bzip2/BZip2Constants.java
  3. +696
    -556
      src/main/org/apache/tools/bzip2/CBZip2InputStream.java
  4. +1586
    -1109
      src/main/org/apache/tools/bzip2/CBZip2OutputStream.java
  5. +15
    -4
      src/main/org/apache/tools/bzip2/CRC.java
  6. +49
    -3
      src/testcases/org/apache/tools/ant/taskdefs/BZip2Test.java

+ 2
- 0
CONTRIBUTORS View File

@@ -104,6 +104,7 @@ Jerome Lacoste
Jesse Glick Jesse Glick
Jesse Stockall Jesse Stockall
Jim Allers Jim Allers
Joerg Wassmer
Jon Dickinson Jon Dickinson
Jon S. Stevens Jon S. Stevens
Jose Alberto Fernandez Jose Alberto Fernandez
@@ -160,6 +161,7 @@ Nick Pellow
Nicola Ken Barozzi Nicola Ken Barozzi
Nico Seessle Nico Seessle
Nigel Magnay Nigel Magnay
Oliver Merkel
Oliver Rossmueller Oliver Rossmueller
Patrick C. Beard Patrick C. Beard
Patrick Chanezon Patrick Chanezon


+ 12
- 2
src/main/org/apache/tools/bzip2/BZip2Constants.java View File

@@ -1,5 +1,5 @@
/* /*
* Copyright 2001,2004 The Apache Software Foundation
* Copyright 2001,2004-2005 The Apache Software Foundation
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -26,7 +26,10 @@ package org.apache.tools.bzip2;
/** /**
* Base class for both the compress and decompress classes. * Base class for both the compress and decompress classes.
* Holds common arrays, and static data. * Holds common arrays, and static data.
*
* <p>
* This interface is public for historical purposes.
* You should have no need to use it.
* </p>
*/ */
public interface BZip2Constants { public interface BZip2Constants {


@@ -41,6 +44,13 @@ public interface BZip2Constants {
int MAX_SELECTORS = (2 + (900000 / G_SIZE)); int MAX_SELECTORS = (2 + (900000 / G_SIZE));
int NUM_OVERSHOOT_BYTES = 20; int NUM_OVERSHOOT_BYTES = 20;


/**
* This array really shouldn't be here.
* Again, for historical purposes it is.
*
* <p>FIXME: This array should be in a private or package private
* location, since it could be modified by malicious code.</p>
*/
int[] rNums = { int[] rNums = {
619, 720, 127, 481, 931, 816, 813, 233, 566, 247, 619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
985, 724, 205, 454, 863, 491, 741, 242, 949, 214, 985, 724, 205, 454, 863, 491, 741, 242, 949, 214,


+ 696
- 556
src/main/org/apache/tools/bzip2/CBZip2InputStream.java
File diff suppressed because it is too large
View File


+ 1586
- 1109
src/main/org/apache/tools/bzip2/CBZip2OutputStream.java
File diff suppressed because it is too large
View File


+ 15
- 4
src/main/org/apache/tools/bzip2/CRC.java View File

@@ -1,5 +1,5 @@
/* /*
* Copyright 2001-2002,2004 The Apache Software Foundation
* Copyright 2001-2002,2004-2005 The Apache Software Foundation
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -28,8 +28,8 @@ package org.apache.tools.bzip2;
* of the data. * of the data.
* *
*/ */
class CRC {
public static int crc32Table[] = {
final class CRC {
static final int crc32Table[] = {
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
@@ -96,7 +96,7 @@ class CRC {
0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
}; };


public CRC() {
CRC() {
initialiseCRC(); initialiseCRC();
} }


@@ -124,6 +124,17 @@ class CRC {
globalCrc = (globalCrc << 8) ^ CRC.crc32Table[temp]; globalCrc = (globalCrc << 8) ^ CRC.crc32Table[temp];
} }


void updateCRC(int inCh, int repeat) {
int globalCrc = this.globalCrc;
while (repeat-- > 0) {
int temp = (globalCrc >> 24) ^ inCh;
globalCrc = (globalCrc << 8) ^ crc32Table[(temp >= 0)
? temp
: (temp + 256)];
}
this.globalCrc = globalCrc;
}

int globalCrc; int globalCrc;
} }



+ 49
- 3
src/testcases/org/apache/tools/ant/taskdefs/BZip2Test.java View File

@@ -19,7 +19,12 @@ package org.apache.tools.ant.taskdefs;


import org.apache.tools.ant.BuildFileTest; import org.apache.tools.ant.BuildFileTest;
import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.bzip2.CBZip2InputStream;


import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException; import java.io.IOException;


/** /**
@@ -44,9 +49,50 @@ public class BZip2Test extends BuildFileTest {


public void testRealTest() throws IOException { public void testRealTest() throws IOException {
executeTarget("realTest"); executeTarget("realTest");
assertTrue("File content mismatch",
FILE_UTILS.contentEquals(project.resolveFile("expected/asf-logo-huge.tar.bz2"),
project.resolveFile("asf-logo-huge.tar.bz2")));

// doesn't work: Depending on the compression engine used,
// compressed bytes may differ. False errors would be
// reported.
// assertTrue("File content mismatch",
// FILE_UTILS.contentEquals(project.resolveFile("expected/asf-logo-huge.tar.bz2"),
// project.resolveFile("asf-logo-huge.tar.bz2")));

// We have to compare the decompressed content instead:

File originalFile =
project.resolveFile("expected/asf-logo-huge.tar.bz2");
File actualFile = project.resolveFile("asf-logo-huge.tar.bz2");

InputStream originalIn =
new BufferedInputStream(new FileInputStream(originalFile));
assertEquals((byte) 'B', originalIn.read());
assertEquals((byte) 'Z', originalIn.read());

InputStream actualIn =
new BufferedInputStream(new FileInputStream(actualFile));
assertEquals((byte) 'B', actualIn.read());
assertEquals((byte) 'Z', actualIn.read());

originalIn = new CBZip2InputStream(originalIn);
actualIn = new CBZip2InputStream(actualIn);

while (true) {
int expected = originalIn.read();
int actual = actualIn.read();
if (expected >= 0) {
if (expected != actual) {
fail("File content mismatch");
}
} else {
if (actual >= 0) {
fail("File content mismatch");
}
break;
}
}

originalIn.close();
actualIn.close();
} }


public void testDateCheck(){ public void testDateCheck(){


Loading…
Cancel
Save