//============================================================================== // ZFile.java //============================================================================== package tribble.search.zip; // System imports import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.lang.Exception; import java.lang.IllegalArgumentException; import java.lang.Long; import java.lang.String; import java.util.ConcurrentModificationException; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; // Local imports import tribble.search.DocumentI; /******************************************************************************* * Zipfile data file. * *
* This represents the contents of an entry found within a zipfile.
*
*
* @version $Revision: 1.6 $ $Date: 2001/07/02 22:40:58 $
* @since 2001-05-18
* @author
* David R. Tribble
* (david@tribble.com).
*
* Copyright
* ©2001 by David R. Tribble, all rights reserved.
*
* @see ZArchive
*/
public class ZFile
implements tribble.search.DocumentI
{
// Identification
/** Revision information. */
static final String REV =
"@(#)tribble/search/zip/ZFile.java $Revision: 1.6 $ $Date: 2001/07/02 22:40:58 $\n";
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Public constants
/** Series number. */
public static final int SERIES = 300;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Protected constants
/** Zipfile entry key attribute names. */
protected static final String[] s_attrNames =
{
"comment",
"compressed.size",
"crc",
"extra",
"method",
"name",
"size",
"time",
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Protected variables
/** Searcher that found and created this zipfile entry. */
protected ZArchive m_searcher;
/* Zipfile entry. */
protected ZipEntry m_entry;
/**
* Serial number (zipfile open count).
* This is used to determine if the zipfile has been closed or reopened since
* this entry was created, and thus whether this entry is still valid or not.
*/
protected int m_serialNo;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Public methods
/***************************************************************************
* Determine if this zipfile entry exists.
*
* @return
* True always.
*
* @since 1.3, 2001-06-15
*/
public boolean exists()
//implements tribble.search.DocumentI
{
// Always true
return (true);
}
/***************************************************************************
* Determine if this zipfile entry specifies a directory entry.
*
* @return
* True if this entry names a directory, otherwise false.
*
* @since 1.3, 2001-06-15
*/
public boolean isDirectory()
//implements tribble.search.DocumentI
{
// Determine if this entry is a directory
return (m_entry.isDirectory());
}
/***************************************************************************
* Determine if this zipfile entry is readable.
*
* @return
* True always.
*
* @since 1.3, 2001-06-15
*/
public boolean canRead()
//implements tribble.search.DocumentI
{
// Always true
return (true);
}
/***************************************************************************
* Determine if this zipfile entry is writable.
*
* @return
* False always (since zipfile entries cannot be written to).
*
* @since 1.3, 2001-06-15
*/
public boolean canWrite()
//implements tribble.search.DocumentI
{
// Always false
return (false);
}
/***************************************************************************
* Determine the length of this zipfile entry.
*
* @return
* The size of this file, in bytes.
*
* @since 1.3, 2001-06-15
*/
public long length()
//implements tribble.search.DocumentI
{
// Retrieve the zipfile entry size
return (m_entry.getSize());
}
/***************************************************************************
* Determine the date that this zipfile entry was last modified.
*
* @return
* The date that this file was last modified, or null if the date is unknown.
*
* @since 1.3, 2001-06-15
*/
public Date lastModified()
//implements tribble.search.DocumentI
{
long when;
// Retrieve the zipfile entry date
when = m_entry.getTime();
if (when > 0)
return (new Date(when));
else
return (null);
}
/***************************************************************************
* Retrieve the name of this zipfile entry.
*
* @return
* The name of this file.
*
* @since 1.3, 2001-06-15
*/
public String getName()
//implements tribble.search.DocumentI
{
// Retrieve the zipfile entry name
return (m_entry.getName());
}
/***************************************************************************
* Retrieve the type of the data file corresponding to this zipfile entry.
*
* @return
* The type of the file (which is the filename extension or suffix, which can
* be empty ""). Such a type name is typically suitable for display
* by some user interface.
*
* @since 1.3, 2001-06-15
*/
public String getType()
//implements tribble.search.DocumentI
{
String ext;
int off;
// Retrieve the filename type (extension/suffix) of this zipfile entry
ext = m_entry.getName();
off = ext.lastIndexOf('.');
if (off >= 0)
ext = ext.substring(off+1);
else
ext = "";
return (ext);
}
/***************************************************************************
* Retrieve the attribute names for this zipfile entry.
*
* @return
* An array containing the names of the attributes associated with this
* zipfile entry, or null if it has none.
*
* @throws Exception
* Thrown if the information about the entry is unobtainable, or if some
* other error occurs.
*
* @see #getAttribute
*
* @since 1.5, 2001-06-30
*/
public String[] getAttributeNames()
//implements tribble.search.DocumentI
{
return (s_attrNames);
}
/***************************************************************************
* Retrieve the value of an attribute for this zipfile entry.
*
* @param key
* The name of an attribute associated with this zipfile entry.
* The following attribute names are supported:
*
* "comment" String
* "compressed.size" Long
* "crc" Long
* "extra" byte[]
* "method" String
* "name" String
* "size" Long
* "time" Date
*
* @return
* The value of the specified attribute, or null if this entry has no
* such attribute. Note that the value is returned as a generic
* Object, meaning that it must be cast into the appropriate type.
*
* @throws Exception
* Thrown if the information about the entry is unobtainable, or if some
* other error occurs.
*
* @see #getAttributeNames
*
* @since 1.5, 2001-06-30
*/
public Object getAttribute(String key)
//implements tribble.search.DocumentI
{
// Retrieve the value of the named attribute
if (key == "method")
{
int meth;
meth = m_entry.getMethod();
switch (meth)
{
case ZipEntry.STORED: return ("stored");
case ZipEntry.DEFLATED: return ("deflated");
default: return (meth + "");
}
}
else if (key == "comment")
return (m_entry.getComment()); // String
else if (key == "compressed.size")
return (new Long(m_entry.getCompressedSize())); // Long
else if (key == "crc")
return (new Long(m_entry.getCrc())); // Long
else if (key == "extra")
return (m_entry.getExtra()); // byte[]
else if (key == "name")
return (m_entry.getName()); // String
else if (key == "size")
return (new Long(m_entry.getSize())); // Long
else if (key == "time")
return (new Date(m_entry.getTime())); // Date
else if (key.equalsIgnoreCase("comment"))
return (getAttribute("comment"));
else if (key.equalsIgnoreCase("comment"))
return (getAttribute("comment"));
else if (key.equalsIgnoreCase("compressed.size"))
return (getAttribute("compressed.size"));
else if (key.equalsIgnoreCase("crc"))
return (getAttribute("crc"));
else if (key.equalsIgnoreCase("extra"))
return (getAttribute("extra"));
else if (key.equalsIgnoreCase("method"))
return (getAttribute("method"));
else if (key.equalsIgnoreCase("name"))
return (getAttribute("name"));
else if (key.equalsIgnoreCase("size"))
return (getAttribute("size"));
else if (key.equalsIgnoreCase("time"))
return (getAttribute("time"));
else
throw new IllegalArgumentException("Unknown attribute: '"
+ key + "'");
}
/***************************************************************************
* Set the value of an attribute for this zipfile entry.
* This method is not supported.
*
* @throws UnsupportedOperationException (unchecked)
* Always thrown, because this method is not implemented for this document
* type.
*
* @since 1.5, 2001-06-30
*/
public void setAttribute(String attr, Object val)
throws Exception, UnsupportedOperationException
//implements tribble.search.DocumentI
{
// Not supported
throw new UnsupportedOperationException("setAttribute");
}
/***************************************************************************
* Get a readable input stream for this zipfile entry.
*
* @return
* An input stream, from which the data contents of this zipfile entry can be
* read.
*
* @throws IOException
* Thrown if the input stream cannot be obtained, or if some other error
* occurs.
*
* @throws ZipException
* Thrown if the input stream cannot be obtained from the zipfile.
*
*
*
* @since 1.1, 2001-05-18
*/
public synchronized InputStream getInputStream()
throws IOException, ZipException
//implements tribble.search.DocumentI
{
// Retrieve an input stream for reading this entry
synchronized (m_searcher)
{
InputStream in;
ZipFile zfile;
// Insure that the zipfile is still open
zfile = m_searcher.m_zipfile;
if (zfile == null || m_searcher.m_serialNo != this.m_serialNo)
throw new IOException("Zipfile is no longer open");
///throw new ConcurrentModificationException(...);
// Retrieve an input stream for reading this entry
in = zfile.getInputStream(m_entry);
return (in);
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Protected constructors
/***************************************************************************
* Constructor.
*
* @param searcher
* The zipfile searcher that found and created this entry.
*
* @param ent
* The zipfile entry for this file entry.
*
* @param serialNo
* The open count at the time the zipfile containing this entry was opened.
*
* @since 1.3, 2001-06-15
*/
protected ZFile(ZArchive searcher, ZipEntry ent, int serialNo)
{
// Establish this zipfile file entry
m_searcher = searcher;
m_entry = ent;
m_serialNo = serialNo;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Private constructors
/***************************************************************************
* Default constructor.
*
* @since 1.1, 2001-05-18
*/
private ZFile()
{
// Do nothing
}
}
// End ZFile.java