Martin Buchholz wrote:
I have an updated version of this fix, with these changes:

- Documented the turkish i problem

    /**
     * Compares two strings for equality, ignoring case.  The second
     * argument must contain only upper-case ASCII characters.
     * We don't want case comparison to be locale-dependent (else we
     * have the notorious "turkish i bug").
     */
    private boolean equalsIgnoreCase(String s, String upper) {

- Refactored code so that updateEntry now also sets the method to STORED.

        /**
         * Updates a ZipEntry which describes the data read by this
         * output stream, in STORED mode.
         */
        public void updateEntry(ZipEntry e) {
            e.setMethod(ZipEntry.STORED);
            e.setSize(n);
            e.setCrc(crc.getValue());
        }

- addIndex was never updating the size in the ZipEntry (as required),
  which was not previously noticed because closeEntry was never called.

    private void addIndex(JarIndex index, ZipOutputStream zos)
        throws IOException
    {
        ZipEntry e = new ZipEntry(INDEX_NAME);
        e.setTime(System.currentTimeMillis());
        if (flag0) {
            CRC32OutputStream os = new CRC32OutputStream(crc32);
            index.write(os);
            os.updateEntry(e);
        }
        zos.putNextEntry(e);
        index.write(zos);
        zos.closeEntry();
    }

http://cr.openjdk.java.net/~martin/jar-misc/ <http://cr.openjdk.java.net/%7Emartin/jar-misc/>
Previous webrev:
http://cr.openjdk.java.net/~martin/jar-misc.0/ <http://cr.openjdk.java.net/%7Emartin/jar-misc.0/>

Martin

yes, it now solved the puzzle:-)

(1)closeEntry() is not strictly necessary, either putNextEntry or close() will close the previous entry (2)you might want to go a little further to "encapsulate" the updateEntry into crc32os, pass the entry
into the constructor and setup the value with a crc32os.close()...bad idea?

btw,

sherman

Reply via email to