Class FileDataStore

java.lang.Object
org.apache.jackrabbit.core.data.AbstractDataStore
org.apache.jackrabbit.core.data.FileDataStore
All Implemented Interfaces:
DataStore, MultiDataStoreAware
Direct Known Subclasses:
OakFileDataStore

public class FileDataStore extends AbstractDataStore implements MultiDataStoreAware
Simple file-based data store. Data records are stored as normal files named using a message digest of the contained binary stream. Configuration:
 <DataStore class="org.apache.jackrabbit.core.data.FileDataStore">
     <param name="path" value="/data/datastore"/>
     <param name="minRecordLength" value="1024"/>
 </DataStore>
 

If the directory is not set, the directory <repository home>/repository/datastore is used.

A three level directory structure is used to avoid placing too many files in a single directory. The chosen structure is designed to scale up to billions of distinct records.

This implementation relies on the underlying file system to support atomic O(1) move operations with Files.move(Path, Path, CopyOption...).

  • Constructor Details

    • FileDataStore

      public FileDataStore()
  • Method Details

    • init

      public void init(String homeDir)
      Initialized the data store. If the path is not set, <repository home>/repository/datastore is used. This directory is automatically created if it does not yet exist.
      Specified by:
      init in interface DataStore
      Parameters:
      homeDir -
    • getRecordIfStored

      public DataRecord getRecordIfStored(DataIdentifier identifier) throws DataStoreException
      Get a data record for the given identifier.
      Specified by:
      getRecordIfStored in interface DataStore
      Parameters:
      identifier - the identifier
      Returns:
      the data record or null
      Throws:
      DataStoreException - if the data store could not be accessed
    • addRecord

      public DataRecord addRecord(InputStream input) throws DataStoreException
      Creates a new data record. The stream is first consumed and the contents are saved in a temporary file and the AbstractDataStore.DIGEST message digest of the stream is calculated. If a record with the same AbstractDataStore.DIGEST digest (and length) is found then it is returned. Otherwise the temporary file is moved in place to become the new data record that gets returned.
      Specified by:
      addRecord in interface DataStore
      Parameters:
      input - binary stream
      Returns:
      data record that contains the given stream
      Throws:
      DataStoreException - if the record could not be created
    • updateModifiedDateOnAccess

      public void updateModifiedDateOnAccess(long before)
      Description copied from interface: DataStore
      From now on, update the modified date of an object even when accessing it. Usually, the modified date is only updated when creating a new object, or when a new link is added to an existing object. When this setting is enabled, even getLength() will update the modified date.
      Specified by:
      updateModifiedDateOnAccess in interface DataStore
      Parameters:
      before - - update the modified date to the current time if it is older than this value
    • deleteRecord

      public void deleteRecord(DataIdentifier identifier) throws DataStoreException
      Description copied from interface: MultiDataStoreAware
      Deletes a single DataRecord based on the given identifier. Delete will only be used by the MultiDataStore.MoveDataTask.
      Specified by:
      deleteRecord in interface MultiDataStoreAware
      Parameters:
      identifier - data identifier
      Throws:
      DataStoreException - if the data store could not be accessed, or if the given identifier is invalid
    • deleteAllOlderThan

      public int deleteAllOlderThan(long min)
      Description copied from interface: DataStore
      Delete objects that have a modified date older than the specified date.
      Specified by:
      deleteAllOlderThan in interface DataStore
      Parameters:
      min - the minimum time
      Returns:
      the number of data records deleted
    • getAllIdentifiers

      public Iterator<DataIdentifier> getAllIdentifiers()
      Description copied from interface: DataStore
      Get all identifiers.
      Specified by:
      getAllIdentifiers in interface DataStore
      Returns:
      an iterator over all DataIdentifier objects
    • clearInUse

      public void clearInUse()
      Description copied from interface: DataStore
      Clear the in-use list. This is only used for testing to make the the garbage collection think that objects are no longer in use.
      Specified by:
      clearInUse in interface DataStore
    • getPath

      public String getPath()
      Get the name of the directory where this data store keeps the files.
      Returns:
      the full path name
    • setPath

      public void setPath(String directoryName)
      Set the name of the directory where this data store keeps the files.
      Parameters:
      directoryName - the path name
    • getMinRecordLength

      public int getMinRecordLength()
      Description copied from interface: DataStore
      Get the minimum size of an object that should be stored in this data store. Depending on the overhead and configuration, each store may return a different value.
      Specified by:
      getMinRecordLength in interface DataStore
      Returns:
      the minimum size in bytes
    • setMinRecordLength

      public void setMinRecordLength(int minRecordLength)
      Set the minimum object length.
      Parameters:
      minRecordLength - the length
    • close

      public void close()
      Description copied from interface: DataStore
      Close the data store
      Specified by:
      close in interface DataStore