JarFile.java (manifest): Not final.

* java/util/jar/JarFile.java (manifest): Not final.
        (manifestRead): New field.
        (JarFile): Don't read Manifest in constructor.
        (getManifest): New method.
        (JarEnumeration.nextElement): Use new method.
        (getEntry): Likewise.
        * java/util/zip/ZipFile.java (name): Final.
        (raf): Likewsie.
        (entries): Change type to Hashtable.
        (closed): New field.
        (ZipFile): Don't read enties in constructor.
        (readEntries): Use Hashtable.
        (close): Set new close flag and set entries to null inside
        synchronized block.
        (entries): Contruct enumeration using new getEntries() method and
        entries Hashtable.
        (getEntryIndex): Removed.
        (getEntries): New method.
        (getEntry): Use new getEntries() method and entries Hastable.
        (getInputStream): Likewise.
        (size): Return getEntries().size().
        (ZipEntryEnumeration): Wrap entries Hashtable elements.
        * java/util/zip/ZipEntry.java (cal): Don't initialize.
        (time): Removed
        (dostime): New field.
        (zipFileIndex): Removed.
        (ZipEntry(ZipEntry)): Copy dostime.
        (setDOSTime): Now final and doesn't convert dos time.
        (getDOSTime): Likewise.
        (setTime): Convert dos time.
        (getTime): Likewise.
        (getCalendar): New method.
        (setExtra): Use setTime().
        * java/util/zip/ZipInputStream.java (getNextEntry): Format error msg.

From-SVN: r59785
This commit is contained in:
Mark Wielaard 2002-12-03 22:06:31 +00:00 committed by Mark Wielaard
parent 6e1be6b19c
commit 9c1180ea42
5 changed files with 216 additions and 127 deletions

View file

@ -46,6 +46,7 @@ import java.io.IOException;
import java.io.EOFException;
import java.io.RandomAccessFile;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.NoSuchElementException;
/**
@ -61,21 +62,26 @@ import java.util.NoSuchElementException;
public class ZipFile implements ZipConstants
{
/** Mode flag to open a zip file for reading
*
/**
* Mode flag to open a zip file for reading.
*/
public static final int OPEN_READ = 0x1;
/** Mode flag to delete a zip file after reading
*
/**
* Mode flag to delete a zip file after reading.
*/
public static final int OPEN_DELETE = 0x4;
private String name;
RandomAccessFile raf;
ZipEntry[] entries;
// Name of this zip file.
private final String name;
// File from which zip entries are read.
private final RandomAccessFile raf;
// The entries of this zip file when initialized and not yet closed.
private Hashtable entries;
private boolean closed = false;
/**
* Opens a Zip file with the given name for reading.
@ -87,7 +93,6 @@ public class ZipFile implements ZipConstants
{
this.raf = new RandomAccessFile(name, "r");
this.name = name;
readEntries();
}
/**
@ -100,7 +105,6 @@ public class ZipFile implements ZipConstants
{
this.raf = new RandomAccessFile(file, "r");
this.name = file.getName();
readEntries();
}
/**
@ -130,7 +134,6 @@ public class ZipFile implements ZipConstants
}
this.raf = new RandomAccessFile(file, "r");
this.name = file.getName();
readEntries();
}
/**
@ -160,7 +163,7 @@ public class ZipFile implements ZipConstants
/**
* Read the central directory of a zip file and fill the entries
* array. This is called exactly once by the constructors.
* array. This is called exactly once when first needed.
* @exception IOException if a i/o error occured.
* @exception ZipException if the central directory is malformed
*/
@ -187,7 +190,7 @@ public class ZipFile implements ZipConstants
throw new EOFException(name);
int centralOffset = readLeInt(raf);
entries = new ZipEntry[count];
entries = new Hashtable(count);
raf.seek(centralOffset);
byte[] ebs = new byte[24];
ByteArrayInputStream ebais = new ByteArrayInputStream(ebs);
@ -236,9 +239,8 @@ public class ZipFile implements ZipConstants
raf.readFully(buffer, 0, commentLen);
entry.setComment(new String(buffer, 0, commentLen));
}
entry.zipFileIndex = i;
entry.offset = offset;
entries[i] = entry;
entries.put(name, entry);
}
}
@ -250,9 +252,10 @@ public class ZipFile implements ZipConstants
*/
public void close() throws IOException
{
entries = null;
synchronized (raf)
{
closed = true;
entries = null;
raf.close();
}
}
@ -262,17 +265,34 @@ public class ZipFile implements ZipConstants
*/
public Enumeration entries()
{
if (entries == null)
throw new IllegalStateException("ZipFile has closed: " + name);
return new ZipEntryEnumeration(entries);
try
{
return new ZipEntryEnumeration(getEntries().elements());
}
catch (IOException ioe)
{
return null;
}
}
private int getEntryIndex(String name)
/**
* Checks that the ZipFile is still open and reads entries when necessary.
*
* @exception IllegalStateException when the ZipFile has already been closed.
* @exception IOEexception when the entries could not be read.
*/
private Hashtable getEntries() throws IOException
{
for (int i = 0; i < entries.length; i++)
if (name.equals(entries[i].getName()))
return i;
return -1;
synchronized(raf)
{
if (closed)
throw new IllegalStateException("ZipFile has closed: " + name);
if (entries == null)
readEntries();
return entries;
}
}
/**
@ -283,10 +303,16 @@ public class ZipFile implements ZipConstants
* @see #entries */
public ZipEntry getEntry(String name)
{
if (entries == null)
throw new IllegalStateException("ZipFile has closed: " + name);
int index = getEntryIndex(name);
return index >= 0 ? (ZipEntry) entries[index].clone() : null;
try
{
Hashtable entries = getEntries();
ZipEntry entry = (ZipEntry) entries.get(name);
return entry != null ? (ZipEntry) entry.clone() : null;
}
catch (IOException ioe)
{
return null;
}
}
/**
@ -334,21 +360,16 @@ public class ZipFile implements ZipConstants
*/
public InputStream getInputStream(ZipEntry entry) throws IOException
{
if (entries == null)
throw new IllegalStateException("ZipFile has closed");
int index = entry.zipFileIndex;
if (index < 0 || index >= entries.length
|| entries[index].getName() != entry.getName())
{
index = getEntryIndex(entry.getName());
if (index < 0)
throw new NoSuchElementException();
}
Hashtable entries = getEntries();
String name = entry.getName();
ZipEntry zipEntry = (ZipEntry) entries.get(name);
if (zipEntry == null)
throw new NoSuchElementException(name);
long start = checkLocalHeader(entries[index]);
int method = entries[index].getMethod();
long start = checkLocalHeader(zipEntry);
int method = zipEntry.getMethod();
InputStream is = new PartialInputStream
(raf, start, entries[index].getCompressedSize());
(raf, start, zipEntry.getCompressedSize());
switch (method)
{
case ZipOutputStream.STORED:
@ -375,42 +396,34 @@ public class ZipFile implements ZipConstants
{
try
{
return entries.length;
return getEntries().size();
}
catch (NullPointerException ex)
catch (IOException ioe)
{
throw new IllegalStateException("ZipFile has closed");
return 0;
}
}
private static class ZipEntryEnumeration implements Enumeration
{
ZipEntry[] array;
int ptr = 0;
private final Enumeration elements;
public ZipEntryEnumeration(ZipEntry[] arr)
public ZipEntryEnumeration(Enumeration elements)
{
array = arr;
this.elements = elements;
}
public boolean hasMoreElements()
{
return ptr < array.length;
return elements.hasMoreElements();
}
public Object nextElement()
{
try
{
/* We return a clone, just to be safe that the user doesn't
* change the entry.
*/
return array[ptr++].clone();
}
catch (ArrayIndexOutOfBoundsException ex)
{
throw new NoSuchElementException();
}
/* We return a clone, just to be safe that the user doesn't
* change the entry.
*/
return ((ZipEntry)elements.nextElement()).clone();
}
}