org.entityfs.impl
Class FileDelegateReadWritableFileAdapter

java.lang.Object
  extended by org.entityfs.impl.FileDelegateReadWritableFileAdapter
All Implemented Interfaces:
Deletable, Lockable, ReadLockable, ReadWriteLockable, WriteLockable, RandomlyAccessibleFile, ReadableFile, ReadWritableFile, WritableFile

public class FileDelegateReadWritableFileAdapter
extends Object
implements ReadWritableFile

This is an adapter object that turns a FileDelegate into a ReadWritableFile.

This object does not do any locking. All locks returned are NoObjectDummyLock:s.

Since:
1.0
Author:
Karl Gustafsson
In_jar:
entityfs-core

Constructor Summary
FileDelegateReadWritableFileAdapter(FileDelegate fd)
           
 
Method Summary
 long copy(OutputStream os)
          Dump the file contents to the stream.
 long copy(WritableByteChannel oc)
          Copy the file's contents to the WritableByteChannel.
 void delete()
          Delete the entity from the file system.
 long getDataSize()
          Get the size of the data in the file.
 EntityLock getReadLock()
          This method returns a NoObjectDummyLock.
 long getSize()
          Get the size of the file (in bytes).
 long getSizeNoLocking()
          Get an approximate size of the file without having to lock it.
 EntityLock getWriteLock()
          This method returns a NoObjectDummyLock.
 boolean isDeleted()
          Check if the entity has been deleted.
 boolean isReadLockedByCurrentThread()
          This method always returns true.
 boolean isWriteLockedByCurrentThread()
          This method always returns true.
 EntityLock lockForReading()
          This method returns a NoObjectDummyLock.
 EntityLock lockForWriting()
          This method returns a NoObjectDummyLock.
 WritableByteChannel openChannelForAppend()
          Open a WritableByteChannel for appending to the file.
 ReadableByteChannel openChannelForRead()
          Open a ReadableByteChannel for reading from the file.
 WritableByteChannel openChannelForWrite()
          Open a WritableByteChannel for writing on the file.
 OutputStream openForAppend()
          Open the file for appending.
 RandomAccess openForRandomAccess(RandomAccessMode mode)
          Open the file for random access in the specified mode.
 InputStream openForRead()
          Opens the file for reading.
 OutputStream openForWrite()
          Opens the file for writing.
 void replaceContents(ReadWritableFile f)
          Replace the contents of this file with the contents of the supplied file and then delete the supplied file.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

FileDelegateReadWritableFileAdapter

public FileDelegateReadWritableFileAdapter(FileDelegate fd)
Method Detail

getReadLock

public EntityLock getReadLock()
This method returns a NoObjectDummyLock.

Specified by:
getReadLock in interface ReadLockable
Returns:
The lockable's read lock. This might be unlocked or locked by someone else.

lockForReading

public EntityLock lockForReading()
This method returns a NoObjectDummyLock.

Specified by:
lockForReading in interface ReadLockable
Returns:
A locked read lock.

getWriteLock

public EntityLock getWriteLock()
This method returns a NoObjectDummyLock.

Specified by:
getWriteLock in interface WriteLockable
Returns:
The lockable's write lock. This might be unlocked or locked by someone else.

lockForWriting

public EntityLock lockForWriting()
This method returns a NoObjectDummyLock.

Specified by:
lockForWriting in interface WriteLockable
Returns:
A locked write lock.

isReadLockedByCurrentThread

public boolean isReadLockedByCurrentThread()
This method always returns true. Override it to change that behavior.

Specified by:
isReadLockedByCurrentThread in interface ReadLockable
Returns:
true if the lockable object is read or write locked by the current thread.

isWriteLockedByCurrentThread

public boolean isWriteLockedByCurrentThread()
This method always returns true. Override it to change that behavior.

Specified by:
isWriteLockedByCurrentThread in interface WriteLockable
Returns:
true if the lockable object is write locked by the current thread.

openForAppend

public OutputStream openForAppend()
Description copied from interface: WritableFile
Open the file for appending. This preserves all previous contents of the file. Use WritableFile.openForWrite() to delete the previous contents before writing. This requires that the file supports the FCAppendable capability (and/or that the file system supports the FSCAppendableFiles capability.

The caller is responsible for closing the stream.

When two appending output streams are open on the same file, one stream will not overwrite contents written by the other stream. Compare this with the behavior of one writing and one appending stream.

Although a write lock on the file is required for the execution thread opening the stream, the stream itself is not protected from access by other threads. It can be protected by wrapping it in a LockAwareWritableByteChannel.

Specified by:
openForAppend in interface WritableFile
Returns:
An OutputStream to write to. The stream must be closed by the caller.
See Also:
WritableFile.openForWrite(), WritableFile.openChannelForAppend()

openForWrite

public OutputStream openForWrite()
Description copied from interface: WritableFile
Opens the file for writing. This deletes all previous contents of the file. Use WritableFile.openForAppend() to append to the file.

The caller is responsible for closing the stream.

When two output streams, one writing and one appending are open on the same file, the stream opened for write will ignore the contents written by the other stream and the content written by the other stream will be overwritten. When two or more appending streams are opened on a file, a stream will not overwrite the content written by the other streams.

Although a write lock on the file is required for the execution thread opening the stream, the stream itself is not protected from access by other threads. It can be protected by wrapping it in a LockAwareOutputStream.

Specified by:
openForWrite in interface WritableFile
Returns:
An OutputStream to write to. The stream must be closed by the caller.
See Also:
WritableFile.openForAppend(), WritableFile.openChannelForWrite()

openForRead

public InputStream openForRead()
Description copied from interface: ReadableFile
Opens the file for reading. The caller is responsible for closing the returned stream.

Although a read lock on the file is required for the execution thread opening the stream, the stream itself is not protected from access by other threads. It can be protected by wrapping it in a LockAwareInputStream.

Specified by:
openForRead in interface ReadableFile
Returns:
An InputStream on the file. The stream must be closed by the caller.

openChannelForWrite

public WritableByteChannel openChannelForWrite()
Description copied from interface: WritableFile
Open a WritableByteChannel for writing on the file. The semantics of this method is the same as for WritableFile.openForWrite().

Specified by:
openChannelForWrite in interface WritableFile
Returns:
An open WritableByteChannel. The channel must be closed by the caller. The returned channel may be a GatheringByteChannel, but that is not required.
See Also:
WritableFile.openForWrite(), WritableFile.openChannelForAppend()

openChannelForAppend

public WritableByteChannel openChannelForAppend()
Description copied from interface: WritableFile
Open a WritableByteChannel for appending to the file. The semantics of this method is the same as for WritableFile.openForAppend().

Specified by:
openChannelForAppend in interface WritableFile
Returns:
An open WritableByteChannel. The channel must be closed by the caller. The returned channel may be a GatheringByteChannel, but that is not required.

openChannelForRead

public ReadableByteChannel openChannelForRead()
Description copied from interface: ReadableFile
Open a ReadableByteChannel for reading from the file. The semantics of this method is the same as for ReadableFile.openForRead().

Although a read lock on the file is required for the execution thread opening the channel, the channel itself is not protected from access by other threads. It can be protected by wrapping it in a LockAwareReadableByteChannel.

Specified by:
openChannelForRead in interface ReadableFile
Returns:
An open ReadableByteChannel. The channel must be closed by the caller. The channel may be a ScatteringByteChannel, but that is not required.
See Also:
ReadableFile.openForRead()

openForRandomAccess

public RandomAccess openForRandomAccess(RandomAccessMode mode)
Description copied from interface: RandomlyAccessibleFile
Open the file for random access in the specified mode.

Although a read or write lock on the file is required for the execution thread opening the RandomAccess, the RandomAccess object itself is not protected from access by other threads. It can be protected by wrapping it in a LockAwareRandomAccess object.

Specified by:
openForRandomAccess in interface RandomlyAccessibleFile
Parameters:
mode - The mode to open the file in.
Returns:
An open RandomAccess object. It must be closed by the caller.

delete

public void delete()
Description copied from interface: Deletable
Delete the entity from the file system. If it is a directory, it has to be empty before it can be deleted. When the entity is deleted, the entity object is invalidated (EntityView.isValid() will return false from now on).

Specified by:
delete in interface Deletable

isDeleted

public boolean isDeleted()
Description copied from interface: Deletable
Check if the entity has been deleted. Unlike EntityView.isValid() , this method does not do any backend validation, so if the entity has been deleted in the backend storage without going through the EntityFS API, use that method instead.

Specified by:
isDeleted in interface Deletable
Returns:
true if the entity object has been deleted.

getSize

public long getSize()
Description copied from interface: ReadableFile
Get the size of the file (in bytes). This is the number of bytes that the file occupies where it is stored.

Note: Most, but not all, implementations know their sizes. If an implementation does not know its size beforehand, this method will be slow since it has to calculate the file size when it is called.

Implementation note: If the size of the backing file is not known, the StreamUtil.getSizeOfDataInStream(InputStream, int) method can be used to calculate it.

Specified by:
getSize in interface ReadableFile
Returns:
The size of the file, in bytes.
See Also:
ReadableFile.getDataSize()

getSizeNoLocking

public long getSizeNoLocking()
Description copied from interface: ReadWritableFile
Get an approximate size of the file without having to lock it.

Specified by:
getSizeNoLocking in interface ReadWritableFile
Returns:
The approximate size of the file, in bytes. If the file object is invalid, 0 is returned.
See Also:
ReadableFile.getSize()

getDataSize

public long getDataSize()
Description copied from interface: ReadableFile
Get the size of the data in the file. For compressed files, this is larger than the value returned by ReadableFile.getSize().

Warning: Calculating the data size of a file has the potential of being really slow, depending on the implementation used. The entire file may have to be read through in order to calculate the size of its data.

Implementation note: If the size of the backing file is not known, the StreamUtil.getSizeOfDataInStream(InputStream, int) method can be used to calculate it.

Specified by:
getDataSize in interface ReadableFile
Returns:
The size of data in the file.
See Also:
ReadableFile.getSize()

replaceContents

public void replaceContents(ReadWritableFile f)
Description copied from interface: ReadWritableFile
Replace the contents of this file with the contents of the supplied file and then delete the supplied file. If both files are in the same file system, an optimized implementation simply moves the contents of f over to this file, which makes the entire operation quick and not requiring any extra disk space.

If both files support metadata, this file's metadata is replaced with that of f.

Specified by:
replaceContents in interface ReadWritableFile
Parameters:
f - The file whose contents are to be moved to this file. f is deleted by this method.

copy

public long copy(OutputStream os)
Description copied from interface: ReadWritableFile
Dump the file contents to the stream.

Specified by:
copy in interface ReadWritableFile
Parameters:
os - The stream the file contents are written to. The stream is not closed after writing, that must be done by the caller.
Returns:
The number of bytes written to the channel.

copy

public long copy(WritableByteChannel oc)
Description copied from interface: ReadWritableFile
Copy the file's contents to the WritableByteChannel.

Specified by:
copy in interface ReadWritableFile
Parameters:
oc - The WritableByteChannel. The channel is not closed by this method.
Returns:
The number of bytes written to the channel.