org.entityfs.cap.metadata.impl
Class MetadataFileAdapter

java.lang.Object
  extended by org.entityfs.support.lang.ObjectProxySupport<T>
      extended by org.entityfs.lock.AbstractReadWriteLockableProxy<EntityImplementation>
          extended by org.entityfs.cap.metadata.impl.MetadataFileAdapter
All Implemented Interfaces:
Deletable, Lockable, ReadLockable, ReadWriteLockable, WriteLockable, RandomlyAccessibleFile, ReadableFile, ReadWritableFile, WritableFile

public class MetadataFileAdapter
extends AbstractReadWriteLockableProxy<EntityImplementation>
implements ReadWritableFile

This adapter enables a metadata-enabling entity delegate (an entity adapter that implements MetadataEnablingEntityDelegate) to be used as a file.

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

Constructor Summary
MetadataFileAdapter(EntityImplementation parent, MetadataEnablingEntityDelegate delegate, String name, boolean canCreateLazily)
           
MetadataFileAdapter(EntityImplementation parent, MetadataEnablingEntityDelegate delegate, String name, FileDelegate file)
           
 
Method Summary
 long copy(OutputStream os)
          Dump the file contents to the stream.
 long copy(WritableByteChannel c)
          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.
 long getSize()
          Get the size of the file (in bytes).
 long getSizeNoLocking()
          Get an approximate size of the file without having to lock it.
 boolean isDeleted()
          Check if the entity has been deleted.
 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 m)
          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 org.entityfs.lock.AbstractReadWriteLockableProxy
getReadLock, getWriteLock, isReadLockedByCurrentThread, isWriteLockedByCurrentThread, lockForReading, lockForWriting
 
Methods inherited from class org.entityfs.support.lang.ObjectProxySupport
equals, getProxied, hashCode, toString
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.entityfs.lock.ReadLockable
getReadLock, isReadLockedByCurrentThread, lockForReading
 
Methods inherited from interface org.entityfs.lock.WriteLockable
getWriteLock, isWriteLockedByCurrentThread, lockForWriting
 

Constructor Detail

MetadataFileAdapter

public MetadataFileAdapter(EntityImplementation parent,
                           MetadataEnablingEntityDelegate delegate,
                           String name,
                           boolean canCreateLazily)

MetadataFileAdapter

public MetadataFileAdapter(EntityImplementation parent,
                           MetadataEnablingEntityDelegate delegate,
                           String name,
                           FileDelegate file)
Method Detail

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.

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()

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()

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()

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.

openForRandomAccess

public RandomAccess openForRandomAccess(RandomAccessMode m)
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:
m - 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 c)
Description copied from interface: ReadWritableFile
Copy the file's contents to the WritableByteChannel.

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