//==============================================================================
// FFile.java
//==============================================================================
package tribble.search.disk;
// System imports
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.Exception;
import java.lang.Long;
import java.lang.String;
import java.util.Date;
// Local imports
import tribble.search.DocumentI;
import tribble.search.WritableDocumentI;
/*******************************************************************************
* File object.
*
*
* @version $Revision: 1.7 $ $Date: 2001/07/16 02:10:12 $
* @since 2001-05-14
* @author
* David R. Tribble
* (david@tribble.com).
*
* Copyright
* ©2001 by David R. Tribble, all rights reserved.
*
* @see FDirectory
*/
public class FFile
implements tribble.search.WritableDocumentI
{
// Identification
/** Revision information. */
static final String REV =
"@(#)tribble/search/disk/FFile.java $Revision: 1.7 $ $Date: 2001/07/16 02:10:12 $\n";
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Public constants
/** Series number. */
public static final int SERIES = 300;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Protected constants
/** Attribute names. */
protected static final String[] s_attrNames =
{
"file",
"fullpath",
"length",
"modified",
"name",
"parent",
"path",
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Protected variables
/** File name. */
protected File m_fname;
/** The directory searcher that found and created this file entry. */
protected FDirectory m_search;
/** Input stream for this file. */
protected InputStream m_in;
/** Output stream for this file. */
protected OutputStream m_out;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Public methods
/***************************************************************************
* Determine if this directory file exists.
*
* @return
* True if the file exists, otherwise false.
*
* @since 1.2, 2001-06-15
*/
public boolean exists()
//implements tribble.search.WritableDocumentI
{
// Check if this file name exists
return (m_fname.exists());
}
/***************************************************************************
* Determine if this directory file specifies a directory.
*
* @return
* True if this file is a directory, otherwise false.
*
* @since 1.2, 2001-06-15
*/
public boolean isDirectory()
//implements tribble.search.WritableDocumentI
{
// Check if this file is a directory
return (m_fname.isDirectory());
}
/***************************************************************************
* Determine if this directory file is readable.
*
* @return
* True if this file exists and can be read, otherwise false.
*
* @since 1.2, 2001-06-15
*
* @see #getInputStream
*/
public boolean canRead()
//implements tribble.search.WritableDocumentI
{
// Check if this file is readable
return (m_fname.canRead());
}
/***************************************************************************
* Determine if this directory file is writable.
*
* @return
* True if the file exists and can be written to, otherwise false.
*
* @since 1.2, 2001-06-15
*
* @see #getOutputStream
*/
public boolean canWrite()
//implements tribble.search.WritableDocumentI
{
// Check if this file is writable
return (m_fname.canWrite());
}
/***************************************************************************
* Set the contents of this directory file to be writable.
*
*
* Note: * Once a file has been set to be unwritable (i.e., to be read-only), it * cannot be reset to writable. (This is a limitation of the underlying * {@link java.io.File} class.) * * @param flag * True if the file is to be made writable, false if it is not. * * @throws IOException * Thrown if the access mode of the file cannot be altered, or if some * other error occurs. * * @see #canWrite * * @since 1.6, 2001-07-02 */ public void makeWritable(boolean flag) throws IOException //implements tribble.search.WritableDocumentI { if (!flag) { // Set the file to be read-only if (!m_fname.setReadOnly()) throw new IOException("Can't make file read-only: " + m_fname.getPath()); } } /*************************************************************************** * Determine the length of this directory file. * * @return * The length of this file, in bytes. * * @since 1.2, 2001-06-15 */ public long length() //implements tribble.search.WritableDocumentI { // Retrieve the length of this file return (m_fname.length()); } /*************************************************************************** * Set the length of the contents of this directory file. * *
* This operation is not supported. * * @throws UnsupportedOperationException (unchecked) * Always thrown, because this method is not implemented for this document * type. * * @see #length * * @since 1.6, 2001-07-02 */ public void setLength(long len) throws UnsupportedOperationException //implements tribble.search.WritableDocumentI { // Not supported throw new UnsupportedOperationException("setLength() not supported"); } /*************************************************************************** * Determine the date that this directory file was last modified. * * @return * The date that the file was last modified, or null if the date is unknown. * * @since 1.2, 2001-06-15 */ public Date lastModified() //implements tribble.search.WritableDocumentI { long time; // Retrieve the modification date of this file time = m_fname.lastModified(); if (time > 0) return (new Date(time)); else return (null); } /*************************************************************************** * Set the date that this directory file was last modified. * * @param when * The new date that this file was last modified. If this is null, no action * it taken. * * @throws IOException * Thrown if the file time cannot be modified, or if some other error occurs. * * @see #lastModified * * @since 1.6, 2001-07-02 */ public void setLastModified(Date when) throws IOException //implements tribble.search.WritableDocumentI { if (when == null) return; // Set the file modification time if (!m_fname.setLastModified(when.getTime())) throw new IOException("Can't set modification time of file: " + m_fname.getPath()); } /*************************************************************************** * Retrieve the name for this directory file. * * @return * The filename (pathname) of this directory file. * * @since 1.2, 2001-06-15 */ public String getName() //implements tribble.search.WritableDocumentI { // Retrieve the full absolute path name for this file entry return (m_fname.getName()); } /*************************************************************************** * Retrieve the type of this directory file. * * @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.2, 2001-06-15 */ public String getType() //implements tribble.search.WritableDocumentI { String ext; int off; // Retrieve the filename type (extension/suffix) of this file entry ext = m_fname.getName(); off = ext.lastIndexOf('.'); if (off >= 0) ext = ext.substring(off+1); else ext = ""; return (ext); } /*************************************************************************** * Set the type of this directory file. * *
* This operation is not supported. * * @throws UnsupportedOperationException (unchecked) * Always thrown, because this method is not implemented for this document * type. * * @see #getType * * @since 1.6, 2001-07-02 */ public void setType(String type) throws UnsupportedOperationException //implements tribble.search.WritableDocumentI { // Unsupported operation throw new UnsupportedOperationException("setType() not supported"); } /*************************************************************************** * Retrieve the attribute names for this directory file. * * @return * An array containing the names of the attributes associated with this file, * or null if it has none. * * @throws Exception * Thrown if the information about the file is unobtainable, or if some * other error occurs. * * @since 1.5, 2001-06-30 */ public String[] getAttributeNames() //implements tribble.search.WritableDocumentI { return (s_attrNames); } /*************************************************************************** * Add a new attribute name to this document. * *
* This operation is not supported. * * @throws UnsupportedOperationException (unchecked) * Always thrown, because this method is not implemented for this document * type. * * @see #getAttribute * @see #setAttribute * @see #getAttributeNames * * @since 1.6, 2001-07-02 */ public void addAttribute(String name) throws UnsupportedOperationException //implements tribble.search.WritableDocumentI { throw new UnsupportedOperationException("addAttribute() not supported"); } /*************************************************************************** * Retrieve the value of an attribute for this directory file. * * @param key * The name of an attribute associated with this directory file. * The following attribute names are supported: *
* "file" File
* "fullpath" String
* "length" Long
* "modified" Date
* "name" String
* "parent" String
* "path" String
*
* @return
* The value of the specified attribute, or null if this file 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 file is unobtainable, or if some
* other error occurs.
*
* @since 1.5, 2001-06-30
*/
public Object getAttribute(String key)
//implements tribble.search.WritableDocumentI
{
// Retrieve the value of the named attribute
if (key == "file")
return (m_fname); // File
else if (key == "fullpath")
return (m_fname.getAbsolutePath()); // String
else if (key == "length")
return (new Long(length())); // Long
else if (key == "modified")
return (lastModified()); // Date
else if (key == "name")
return (m_fname.getName()); // String
else if (key == "parent")
return (m_fname.getParent()); // String
else if (key == "path")
return (m_fname.getPath()); // String
else if (key.equalsIgnoreCase("file"))
return (getAttribute("file"));
else if (key.equalsIgnoreCase("length"))
return (getAttribute("length"));
else if (key.equalsIgnoreCase("modified"))
return (getAttribute("modified"));
else if (key.equalsIgnoreCase("name"))
return (getAttribute("name"));
else if (key.equalsIgnoreCase("parent"))
return (getAttribute("parent"));
else if (key.equalsIgnoreCase("path"))
return (getAttribute("path"));
else
throw new IllegalArgumentException("Unknown attribute: '"
+ key + "'");
}
/***************************************************************************
* Set the value of an attribute for this document.
* 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 UnsupportedOperationException
//implements tribble.search.WritableDocumentI
{
// Not supported
throw new UnsupportedOperationException("setAttribute");
}
/***************************************************************************
* Get a readable input stream for this directory file.
*
* @return
* An input stream, from which the data contents of this directory file can
* be read.
*
* @throws IOException
* Thrown if the file cannot be accessed, or if some other error occurs.
*
* @since 1.1, 2001-05-14
*/
public synchronized InputStream getInputStream()
throws IOException
//implements tribble.search.WritableDocumentI
{
FileInputStream in;
// Close the previously opened stream, if any
if (m_in != null)
{
m_in.close();
m_in = null;
}
// Open a writable output stream for this file
in = new FileInputStream(m_fname);
m_in = in;
return (m_in);
}
/***************************************************************************
* Get a writable output stream for this directory file.
*
* @return
* An output stream, to which the data contents of this directory file can
* be written.
*
* @throws IOException
* Thrown if the file cannot be accessed, or if some other error occurs.
*
* @since 1.1, 2001-05-14
*/
public synchronized OutputStream getOutputStream()
throws IOException
//implements tribble.search.WritableDocumentI
{
FileOutputStream out;
// Close the previously opened stream, if any
if (m_out != null)
{
m_out.close();
m_out = null;
}
// Open a writable output stream for this file
out = new FileOutputStream(m_fname);
m_out = out;
return (m_out);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Protected constructors
/***************************************************************************
* Constructor.
*
* @param dir
* The directory searcher that created (and owns) this file.
*
* @param fname
* The filename of this file.
*
* @since 1.2, 2001-06-15
*/
protected FFile(FDirectory dir, File fname)
{
// Establish this directory file
m_fname = fname;
m_search = dir;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Package private methods
/***************************************************************************
* Establish the input stream for this file.
*
* @param in
* The input stream to associate with this file.
*
* @since 1.1, 2001-05-14
*/
void setInput(InputStream in)
{
// Establish the input stream for this file
m_in = in;
}
/***************************************************************************
* Establish the output stream for this file.
*
* @param out
* The output stream to associate with this file.
*
* @since 1.1, 2001-05-14
*/
void setOutput(OutputStream out)
{
// Establish the output stream for this file
m_out = out;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Private constructors
/***************************************************************************
* Default constructor.
*
* @since 1.1, 2001-05-14
*/
private FFile()
{
// Do nothing
}
}
// End FFile.java