com.myJava.file.driver.hash
Class HashFileSystemDriver

java.lang.Object
  extended by com.myJava.file.driver.AbstractFileSystemDriver
      extended by com.myJava.file.driver.AbstractLinkableFileSystemDriver
          extended by com.myJava.file.driver.hash.HashFileSystemDriver
All Implemented Interfaces:
FileSystemDriver, LinkableFileSystemDriver

public class HashFileSystemDriver
extends AbstractLinkableFileSystemDriver

Paths length cannot exceed 256 characters under Windows.
This due to a limitation of Sun's VM implementation for Windows and a limitation of the windows platform itself.
This Driver computes a hashCode for each component of the files paths, and uses it as physical name.
The advantage of using these hashCodes is that they are smaller than the original name. This original name is stored in a "companion" file and can thus be retrieved by simply reading the content of this companion file.

This class is particularly useful for EncryptedFileSystemDrivers which may create encrypted paths of greater length than the original path.

Author:
Olivier PETRUCCI

Areca Build ID : 7299034069467778562

Nested Class Summary
protected static class HashFileSystemDriver.FileFilterAdapter
           
protected static class HashFileSystemDriver.FilenameFilterAdapter
           
 
Field Summary
protected  HashCache cache
           
protected  java.io.File directoryRoot
           
 
Fields inherited from class com.myJava.file.driver.AbstractLinkableFileSystemDriver
predecessor
 
Fields inherited from class com.myJava.file.driver.AbstractFileSystemDriver
CHECK_PATH
 
Fields inherited from interface com.myJava.file.driver.FileSystemDriver
ACCESS_EFFICIENCY_AVERAGE, ACCESS_EFFICIENCY_GOOD, ACCESS_EFFICIENCY_POOR
 
Constructor Summary
HashFileSystemDriver(java.io.File directoryRoot)
          Constructor
 
Method Summary
 void applyMetaData(FileMetaData p, java.io.File f)
          Applies the attributes provided as argument
 boolean canRead(java.io.File file)
           
 boolean canWrite(java.io.File file)
           
protected  void createDecodingFile(java.io.File encoded, java.lang.String decodedName)
          Creates the companion file, which stores the real name of the file/directory.
 boolean createNewFile(java.io.File file)
           
protected  java.io.File decodeFileName(java.io.File file)
          Reads the companion file to decode the hashed name
protected  java.lang.String decodeFileName(java.io.File parent, java.lang.String shortName)
          Reads the companion file to decode the hashed name
 boolean delete(java.io.File file)
           
 void deleteOnExit(java.io.File f)
           
 boolean directFileAccessSupported()
          No direct file access is supported !
protected  java.io.File encodeFileName(java.io.File file)
          Hash the fileName
protected  java.lang.String encodeFileName(java.io.File encodedParent, java.lang.String shortName)
          Hash the fileName : - 2 first chars of the original name - length (hexadecimal) of the original name - Java hashCode (see String class) of the original name
 boolean equals(java.lang.Object o)
           
 boolean exists(java.io.File file)
           
 java.io.InputStream getCachedFileInputStream(java.io.File file)
          Ensures that a local copy of the file exists and return an InputStream on this file
 java.io.OutputStream getCachedFileOutputStream(java.io.File file)
          Returns an OutputStream for the given File
This outputStream will be cached, and written only during call to "flush"
protected  java.io.File getDecodingFile(java.io.File file)
          Computes the companion file's name.
 java.io.File getDirectoryRoot()
          Return the root of the Driver
 java.io.InputStream getFileInputStream(java.io.File file)
           
 java.io.OutputStream getFileOutputStream(java.io.File file)
           
 java.io.OutputStream getFileOutputStream(java.io.File file, boolean append)
           
 java.io.OutputStream getFileOutputStream(java.io.File file, boolean append, OutputStreamListener listener)
           
 FileCacheableInformations getInformations(java.io.File file)
          Returns a global set of file informations (length, lastmodified, ...)
 FileMetaData getMetaData(java.io.File f, boolean onlyBasicAttributes)
          Returns the file's attributes
 int hashCode()
           
 boolean isContentSensitive()
          Returns true if the driver is sensitive to the content.
protected  boolean isDecodingFile(java.io.File f)
          Checks wether the file is a "companion" file (which must be ignored by file listing methods)
protected  boolean isDecodingFile(java.lang.String f)
          Checks wether the file is a "companion" file (which must be ignored by file listing methods)
 boolean isDirectory(java.io.File file)
           
 boolean isFile(java.io.File file)
           
 boolean isHidden(java.io.File file)
           
 long lastModified(java.io.File file)
           
 long length(java.io.File file)
           
 java.lang.String[] list(java.io.File file)
           
 java.lang.String[] list(java.io.File file, java.io.FilenameFilter filter)
           
 java.io.File[] listFiles(java.io.File file)
           
 java.io.File[] listFiles(java.io.File file, java.io.FileFilter filter)
           
 java.io.File[] listFiles(java.io.File file, java.io.FilenameFilter filter)
           
 boolean mkdir(java.io.File file)
           
 boolean renameTo(java.io.File source, java.io.File dest)
           
 boolean setLastModified(java.io.File file, long time)
           
 boolean setReadOnly(java.io.File file)
           
 java.lang.String toString()
           
 
Methods inherited from class com.myJava.file.driver.AbstractLinkableFileSystemDriver
flush, getAbsoluteFile, getAbsolutePath, getAccessEfficiency, getCanonicalFile, getCanonicalPath, getName, getParent, getParentFile, getPath, getPredecessor, mount, setPredecessor, supportsLongFileNames, unmount
 
Methods inherited from class com.myJava.file.driver.AbstractFileSystemDriver
checkFilePath, createSymbolicLink, isAbsolute, mkdirs, normalizeIfNeeded
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface com.myJava.file.driver.FileSystemDriver
createSymbolicLink, isAbsolute, mkdirs
 

Field Detail

cache

protected HashCache cache

directoryRoot

protected java.io.File directoryRoot
Constructor Detail

HashFileSystemDriver

public HashFileSystemDriver(java.io.File directoryRoot)
Constructor

Method Detail

getDirectoryRoot

public java.io.File getDirectoryRoot()
Return the root of the Driver


canRead

public boolean canRead(java.io.File file)

canWrite

public boolean canWrite(java.io.File file)

createNewFile

public boolean createNewFile(java.io.File file)
                      throws java.io.IOException
Specified by:
createNewFile in interface FileSystemDriver
Overrides:
createNewFile in class AbstractFileSystemDriver
Throws:
java.io.IOException

delete

public boolean delete(java.io.File file)
Specified by:
delete in interface FileSystemDriver
Overrides:
delete in class AbstractFileSystemDriver

exists

public boolean exists(java.io.File file)
Specified by:
exists in interface FileSystemDriver
Overrides:
exists in class AbstractFileSystemDriver

isDirectory

public boolean isDirectory(java.io.File file)
Specified by:
isDirectory in interface FileSystemDriver
Overrides:
isDirectory in class AbstractFileSystemDriver

isFile

public boolean isFile(java.io.File file)
Specified by:
isFile in interface FileSystemDriver
Overrides:
isFile in class AbstractFileSystemDriver

isHidden

public boolean isHidden(java.io.File file)
Specified by:
isHidden in interface FileSystemDriver
Overrides:
isHidden in class AbstractFileSystemDriver

lastModified

public long lastModified(java.io.File file)
Specified by:
lastModified in interface FileSystemDriver
Overrides:
lastModified in class AbstractFileSystemDriver

getInformations

public FileCacheableInformations getInformations(java.io.File file)
Description copied from interface: FileSystemDriver
Returns a global set of file informations (length, lastmodified, ...)


getMetaData

public FileMetaData getMetaData(java.io.File f,
                                boolean onlyBasicAttributes)
                         throws java.io.IOException
Description copied from interface: FileSystemDriver
Returns the file's attributes

Specified by:
getMetaData in interface FileSystemDriver
Overrides:
getMetaData in class AbstractFileSystemDriver
Throws:
java.io.IOException

length

public long length(java.io.File file)
Specified by:
length in interface FileSystemDriver
Overrides:
length in class AbstractFileSystemDriver

deleteOnExit

public void deleteOnExit(java.io.File f)
Specified by:
deleteOnExit in interface FileSystemDriver
Overrides:
deleteOnExit in class AbstractFileSystemDriver

list

public java.lang.String[] list(java.io.File file,
                               java.io.FilenameFilter filter)
Specified by:
list in interface FileSystemDriver
Overrides:
list in class AbstractFileSystemDriver

list

public java.lang.String[] list(java.io.File file)
Specified by:
list in interface FileSystemDriver
Overrides:
list in class AbstractFileSystemDriver

listFiles

public java.io.File[] listFiles(java.io.File file,
                                java.io.FileFilter filter)
Specified by:
listFiles in interface FileSystemDriver
Overrides:
listFiles in class AbstractFileSystemDriver

listFiles

public java.io.File[] listFiles(java.io.File file,
                                java.io.FilenameFilter filter)
Specified by:
listFiles in interface FileSystemDriver
Overrides:
listFiles in class AbstractFileSystemDriver

listFiles

public java.io.File[] listFiles(java.io.File file)
Specified by:
listFiles in interface FileSystemDriver
Overrides:
listFiles in class AbstractFileSystemDriver

mkdir

public boolean mkdir(java.io.File file)
Specified by:
mkdir in interface FileSystemDriver
Overrides:
mkdir in class AbstractFileSystemDriver

renameTo

public boolean renameTo(java.io.File source,
                        java.io.File dest)
Specified by:
renameTo in interface FileSystemDriver
Overrides:
renameTo in class AbstractFileSystemDriver

setLastModified

public boolean setLastModified(java.io.File file,
                               long time)
Specified by:
setLastModified in interface FileSystemDriver
Overrides:
setLastModified in class AbstractFileSystemDriver

applyMetaData

public void applyMetaData(FileMetaData p,
                          java.io.File f)
                   throws java.io.IOException
Description copied from interface: FileSystemDriver
Applies the attributes provided as argument

Specified by:
applyMetaData in interface FileSystemDriver
Overrides:
applyMetaData in class AbstractFileSystemDriver
Throws:
java.io.IOException

setReadOnly

public boolean setReadOnly(java.io.File file)
Specified by:
setReadOnly in interface FileSystemDriver
Overrides:
setReadOnly in class AbstractFileSystemDriver

getCachedFileInputStream

public java.io.InputStream getCachedFileInputStream(java.io.File file)
                                             throws java.io.IOException
Description copied from interface: FileSystemDriver
Ensures that a local copy of the file exists and return an InputStream on this file

Throws:
java.io.IOException

getFileInputStream

public java.io.InputStream getFileInputStream(java.io.File file)
                                       throws java.io.IOException
Throws:
java.io.IOException

getCachedFileOutputStream

public java.io.OutputStream getCachedFileOutputStream(java.io.File file)
                                               throws java.io.IOException
Description copied from interface: FileSystemDriver
Returns an OutputStream for the given File
This outputStream will be cached, and written only during call to "flush"

Throws:
java.io.IOException

getFileOutputStream

public java.io.OutputStream getFileOutputStream(java.io.File file)
                                         throws java.io.IOException
Throws:
java.io.IOException

getFileOutputStream

public java.io.OutputStream getFileOutputStream(java.io.File file,
                                                boolean append)
                                         throws java.io.IOException
Throws:
java.io.IOException

getFileOutputStream

public java.io.OutputStream getFileOutputStream(java.io.File file,
                                                boolean append,
                                                OutputStreamListener listener)
                                         throws java.io.IOException
Throws:
java.io.IOException

directFileAccessSupported

public boolean directFileAccessSupported()
No direct file access is supported !


encodeFileName

protected java.io.File encodeFileName(java.io.File file)
Hash the fileName


encodeFileName

protected java.lang.String encodeFileName(java.io.File encodedParent,
                                          java.lang.String shortName)
                                   throws HashCollisionException,
                                          java.io.IOException
Hash the fileName : - 2 first chars of the original name - length (hexadecimal) of the original name - Java hashCode (see String class) of the original name

Throws:
HashCollisionException
java.io.IOException

decodeFileName

protected java.io.File decodeFileName(java.io.File file)
                               throws java.io.IOException
Reads the companion file to decode the hashed name

Throws:
java.io.IOException

decodeFileName

protected java.lang.String decodeFileName(java.io.File parent,
                                          java.lang.String shortName)
                                   throws java.io.IOException
Reads the companion file to decode the hashed name

Throws:
java.io.IOException

getDecodingFile

protected java.io.File getDecodingFile(java.io.File file)
Computes the companion file's name.


createDecodingFile

protected void createDecodingFile(java.io.File encoded,
                                  java.lang.String decodedName)
                           throws java.io.IOException
Creates the companion file, which stores the real name of the file/directory.

Throws:
java.io.IOException

isDecodingFile

protected boolean isDecodingFile(java.io.File f)
Checks wether the file is a "companion" file (which must be ignored by file listing methods)


isDecodingFile

protected boolean isDecodingFile(java.lang.String f)
Checks wether the file is a "companion" file (which must be ignored by file listing methods)


hashCode

public int hashCode()
Overrides:
hashCode in class java.lang.Object

equals

public boolean equals(java.lang.Object o)
Overrides:
equals in class java.lang.Object

toString

public java.lang.String toString()
Overrides:
toString in class AbstractLinkableFileSystemDriver

isContentSensitive

public boolean isContentSensitive()
Description copied from interface: FileSystemDriver
Returns true if the driver is sensitive to the content.
In other words, if the driver has a chance to fail during initialization if files pre-exist on its storage location