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 Stockall
Jim Allers
Joerg Wassmer
Jon Dickinson
Jon S. Stevens
Jose Alberto Fernandez
@@ -160,6 +161,7 @@ Nick Pellow
Nicola Ken Barozzi
Nico Seessle
Nigel Magnay
Oliver Merkel
Oliver Rossmueller
Patrick C. Beard
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");
* 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.
* 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 {

@@ -41,6 +44,13 @@ public interface BZip2Constants {
int MAX_SELECTORS = (2 + (900000 / G_SIZE));
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 = {
619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
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");
* you may not use this file except in compliance with the License.
@@ -28,8 +28,8 @@ package org.apache.tools.bzip2;
* of the data.
*
*/
class CRC {
public static int crc32Table[] = {
final class CRC {
static final int crc32Table[] = {
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
@@ -96,7 +96,7 @@ class CRC {
0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
};

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

@@ -124,6 +124,17 @@ class CRC {
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;
}


+ 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.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;

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

public void testRealTest() throws IOException {
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(){


Loading…
Cancel
Save