/*-
* Copyright (C) 2008 Erik Larsson
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.catacombae.storage.fs;
import java.io.InputStream;
import java.io.OutputStream;
import org.catacombae.io.RandomAccessStream;
import org.catacombae.io.ReadableRandomAccessStream;
import org.catacombae.io.TruncatableRandomAccessStream;
import org.catacombae.io.WritableRandomAccessStream;
/**
* @author <a href="http://www.catacombae.org/" target="_top">Erik Larsson</a>
*/
public interface FSFork {
/* Returns the type of this fork (if any).
*
* @return the type of this fork (if any).
*/
public abstract FSForkType getType();
/**
* Returns the length (in bytes) of this fork.
*
* @return the length (in bytes) of this fork.
*/
public abstract long getLength();
/**
* Returns the number of bytes that this fork occupies on disk. This may be
* larger or smaller than the length of the fork, depending on the
* allocation strategy and whether compression is applied.
*
* @return the number of bytes that this fork occupies on disk.
*/
public abstract long getOccupiedSize();
/**
* Returns whether or not the underlying implementation allows writing to
* this fork. If this method returns true, you can use the methods:
* <ul>
* <li>getWritableRandomAccessStream()</li>
* <li>getRandomAccessStream()</li>
* </ul>
*
* @return whether or not the underlying implementation allows writing to
* this file.
*/
public abstract boolean isWritable();
/**
* Returns whether or not the underlying implementation allows changing the
* length of this fork. If this method returns true, you can use the
* methods:
* <ul>
* <li>getOutputStream()</li>
* <li>getForkStream()</li>
* </ul>
* This property implies isWritable(). There should never be a situation
* where isWritable() returns false while isTruncatable returns true.
*
* @return whether or not the underlying implementation allows writing to
* this file.
*/
public abstract boolean isTruncatable();
/**
* Returns whether or not the fork is compressed on disk.
*
* This does not affect the way that this fork can be used, so this is
* purely advisory information that upper layers can use to indicate whether
* compression is applied.
*
* @return whether or not the fork is compressed on disk.
*/
public abstract boolean isCompressed();
/**
* Returns an identifier which distinguishes this fork from the other
* available forks. It's up to the implementor to decide what strings to
* return. In a NTFS file system, forks (called Alternate Data Streams) have
* names, so the natural approach would be to return the name
* "[filename]:[forkname]", Windows-style, or just "[filename]" for the main
* fork.<br>
* File systems with a fixed number of forks, like HFS+ which has two forks
* for each file entry, the data fork and the resource fork, can simply
* return the strings "Data fork" and "Resource fork". These strings will be
* used as descriptions in any user interface using this library.
*
* @return an identifier which distinguishes this fork from the other
* available forks.
*/
public abstract String getForkIdentifier();
/**
* Returns whether or not this fork can be mapped to a UNIX extended
* attribute, i.e. if there is a defined name for that extended attribute.
*
* @return whether or not this fork can be mapped to a UNIX extended
* attribute.
*/
public abstract boolean hasXattrName();
/**
* Returns the UNIX 'xattr'-style name of this fork, if applicable, or
* <code>null</code> if no such mapping can be made.
*
* @return the UNIX 'xattr'-style name of this fork if possible, or
* <code>null</code> otherwise.
*/
public abstract String getXattrName();
/**
* Creates an input stream from which the file's contents can be read.
* All implementations must support this method, and it is assumed that it's
* properly implemented.
*
* @return an input stream from which the file's contents can be read.
*/
public abstract InputStream getInputStream();
/**
* Creates a ReadableRandomAccessStream with access to the fork's contents.
* All implementations must support this method, and it is assumed that it's
* properly implemented.
*
* @return a ReadableRandomAccessStream with access to the fork's contents.
*/
public abstract ReadableRandomAccessStream getReadableRandomAccessStream();
/**
* Opens a WritableRandomAccessStream with access to the fork contents
* (optional operation).
*
* @return a WritableRandomAccessStream with access to the fork contents.
* @throws java.lang.UnsupportedOperationException if the implementation
* does not support writing to files. You can check this using
* <code>isWritable()</code>.
*/
public abstract WritableRandomAccessStream getWritableRandomAccessStream()
throws UnsupportedOperationException;
/**
* Opens a RandomAccessStream with access to the fork contents (optional
* operation). This does not allow changing the size of the fork, only
* reading and writing those bytes that are already allocated.
*
* @return a RandomAccessStream with access to the fork contents.
* @throws java.lang.UnsupportedOperationException if the implementation
* does not support writing to files. You can check this using
* <code>isWritable()</code>.
*/
public abstract RandomAccessStream getRandomAccessStream()
throws UnsupportedOperationException;
/**
* Truncates the file to length 0 and opens a new output stream where you
* can write the new fork contents (optional operation).
*
* @return a new output stream where you can write the new fork contents.
* @throws java.lang.UnsupportedOperationException if the implementation
* does not support writing to files or changing their size. You can check
* this using <code>isTruncatable()</code>.
*/
public abstract OutputStream getOutputStream()
throws UnsupportedOperationException;
/**
* Opens a read/write TruncatableRandomAccessStream with access to the fork
* contents (optional operation). This is the most complete way of accessing
* files on a file system as it supports all the data operations you can
* perform on a file.
*
* @return a TruncatableRandomAccessStream with access to the fork contents.
* @throws java.lang.UnsupportedOperationException if the implementation
* does not support writing to files or changing their size. You can check
* this using <code>isTruncatable()</code>.
*/
public abstract TruncatableRandomAccessStream getForkStream()
throws UnsupportedOperationException;
}