[Kaffe] patch for Jar program

Moses DeJong dejong at cs.umn.edu
Sun Feb 13 16:43:27 PST 2000


Attached in a patch for
libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java
that fixes the Jar implementation so that it only reads the
data from a file being added once, the current implementation
reads the data twice.

Here is the ChangeLog entry.

Sun Feb 13 Moses DeJong  <mdejong at cs.umn.edu>

        * libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java:
        Changed CRC calculation on uncompressed Zip entries so that
        the entry stream does not need to be read twice.
-------------- next part --------------
Index: libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java
===================================================================
RCS file: /cvs/kaffe/kaffe/libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java,v
retrieving revision 1.3
diff -u -r1.3 Jar.java
--- libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java	1999/10/15 22:53:13	1.3
+++ libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java	2000/02/13 23:56:15
@@ -995,7 +995,7 @@
 	// YIKES!! Watch out for the really ugly special case where
 	// we attempt to add the archive that we are writing to the
 	// archive we are writing to the archive we are writing.
-	// You get the idea. There is not way to avoid this case
+	// You get the idea. There is no way to avoid this case
 	// when writing to stdout.
 
 	if (archive != null) {
@@ -1027,52 +1027,61 @@
 	ZipEntry ze = new ZipEntry(entryname);
 	long entryfile_length = entryfile.length();
 
-	// Set some file attributes
+	// Set some entry attributes
 	if (compression) {
 	    ze.setMethod(ZipEntry.DEFLATED); // compressed entry
 	} else {
 	    ze.setMethod(ZipEntry.STORED);   // uncompressed entry
 	    ze.setSize(entryfile_length);
-
-	    // Calculate the CRC for this file if uncompressed
-	    CRC32 crc = new CRC32();
-	    InputStream in = new XPFileInputStream(entryfile);
-	    try {
-		CheckedInputStream c = new CheckedInputStream(in, crc);
-		readwriteStreams(c, new OutputStream() {
-		    public void write(int b) {
-		    }
-		    public void write(byte[] buf, int off, int len) {
-		    }
-		});
-	    } finally {
-		in.close();
-	    }
-	    ze.setCrc(crc.getValue());
+	    ze.setCrc( 0 );                  // set after stream is read/written to zip
 	}
 
-	// Compress file and write it into the archive
-	if (debug) {
-	    System.out.println("opening input file \"" + entryfile + "\"");
-	}
 	zos.putNextEntry(ze);
+
 	if (verbose) {
 	    // adding: file1 (in=16) (out=18) (deflated -12%)
 	    vout.print("adding: " + entryname + " ");
 	    vout.print("(in=" + entryfile_length + ") ");
 	}
+
+	// Write file into the archive, compressing if so requested
+	if (debug) {
+	    System.out.println("opening input file \"" + entryfile + "\"");
+	}
+
 	InputStream in = new XPFileInputStream(entryfile);
+
+	// This is part of the ugly workaround for a design flaw
+	// in the JDK zip API, for uncompressed entries we
+	// are forced to calculate a CRC for the input stream
+	CRC32 crc = null;
+	    
+	if (! compression) {
+	    crc = new CRC32();
+	    in = new CheckedInputStream(in,crc);
+	}
+
 	try {
 	    readwriteStreams(in, zos);
 	} finally {
 	    in.close();
 	}
 
+	// ZIP design flaw workaround
+	    
+	if (! compression) {
+	    ze.setCrc(crc.getValue());
+	}
+
+	// finish writing the entry to the stream
+	// this lets us access the compressed size
+	// attribute of the current ZipEntry
+
 	zos.closeEntry();
 
 	if (verbose) {
 
-	    // Find compressed size of entry adter it has been added
+	    // Find compressed size of entry after it has been added
 
 	    long unsize = ze.getSize();
 	    long csize = ze.getCompressedSize();


More information about the kaffe mailing list