diff --git a/config/alfresco/network-protocol-context.xml b/config/alfresco/network-protocol-context.xml
index 42d4894c8d..c00e5e7271 100644
--- a/config/alfresco/network-protocol-context.xml
+++ b/config/alfresco/network-protocol-context.xml
@@ -62,7 +62,6 @@
Adds Alfresco extensions to the network file. */ -public abstract class AlfrescoNetworkFile extends NetworkFile { +public abstract class AlfrescoNetworkFile extends NetworkFile implements NetworkFileStateInterface { // Associated file state diff --git a/source/java/org/alfresco/filesys/alfresco/HomeShareMapper.java b/source/java/org/alfresco/filesys/alfresco/HomeShareMapper.java index dd6d37da43..7aa7c1a1d2 100644 --- a/source/java/org/alfresco/filesys/alfresco/HomeShareMapper.java +++ b/source/java/org/alfresco/filesys/alfresco/HomeShareMapper.java @@ -352,7 +352,7 @@ public class HomeShareMapper implements ShareMapper ContentDiskDriver diskDrv = ( ContentDiskDriver) getRepoDiskInterface(); ContentContext diskCtx = new ContentContext( getHomeFolderName(), "", "", client.getHomeFolder()); - diskCtx.enableStateTable( true, diskDrv.getStateReaper()); + diskCtx.enableStateCache( true); // Create a temporary shared device for the users home directory diff --git a/source/java/org/alfresco/filesys/alfresco/MultiTenantShareMapper.java b/source/java/org/alfresco/filesys/alfresco/MultiTenantShareMapper.java index 30bd409ff3..2a2c239544 100644 --- a/source/java/org/alfresco/filesys/alfresco/MultiTenantShareMapper.java +++ b/source/java/org/alfresco/filesys/alfresco/MultiTenantShareMapper.java @@ -420,7 +420,7 @@ public class MultiTenantShareMapper implements ShareMapper, ConfigurationListene // Enable file state caching - diskCtx.enableStateTable( true, diskDrv.getStateReaper()); + diskCtx.enableStateCache( true); // Initialize the I/O control handler diff --git a/source/java/org/alfresco/filesys/alfresco/PseudoFileImpl.java b/source/java/org/alfresco/filesys/alfresco/PseudoFileImpl.java index 080ec61219..0d0685b0b0 100644 --- a/source/java/org/alfresco/filesys/alfresco/PseudoFileImpl.java +++ b/source/java/org/alfresco/filesys/alfresco/PseudoFileImpl.java @@ -23,14 +23,15 @@ import java.util.Enumeration; import org.alfresco.jlan.server.SrvSession; import org.alfresco.jlan.server.filesys.FileName; import org.alfresco.jlan.server.filesys.TreeConnection; +import org.alfresco.jlan.server.filesys.cache.FileState; import org.alfresco.jlan.server.filesys.pseudo.MemoryPseudoFile; import org.alfresco.jlan.server.filesys.pseudo.PseudoFile; import org.alfresco.jlan.server.filesys.pseudo.PseudoFileInterface; import org.alfresco.jlan.smb.server.SMBSrvSession; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.filesys.alfresco.DesktopAction; import org.alfresco.filesys.alfresco.DesktopActionTable; import org.alfresco.filesys.repo.ContentContext; -import org.alfresco.filesys.state.FileState; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -170,7 +171,7 @@ public class PseudoFileImpl implements PseudoFileInterface // If the file state is null create a file state for the path if ( fstate == null) - ctx.getStateTable().findFileState( path, true, true); + ctx.getStateCache().findFileState( path, true); // Add the desktop action pseudo files @@ -205,17 +206,18 @@ public class PseudoFileImpl implements PseudoFileInterface { // Make sure the state has the associated node details - if ( fstate.getNodeRef() != null) + if ( fstate.hasFilesystemObject()) { // Build the URL file data + NodeRef nodeRef = (NodeRef) fstate.getFilesystemObject(); StringBuilder urlStr = new StringBuilder(); urlStr.append("[InternetShortcut]\r\n"); urlStr.append("URL="); urlStr.append(ctx.getURLPrefix()); urlStr.append("navigate/browse/workspace/SpacesStore/"); - urlStr.append( fstate.getNodeRef().getId()); + urlStr.append( nodeRef.getId()); urlStr.append("\r\n"); // Create the in memory pseudo file for the URL link @@ -282,11 +284,11 @@ public class PseudoFileImpl implements PseudoFileInterface FileState fstate = null; - if ( ctx.hasStateTable()) + if ( ctx.hasStateCache()) { // Get the file state for a file/folder - fstate = ctx.getStateTable().findFileState(path); + fstate = ctx.getStateCache().findFileState(path); } // Return the file state diff --git a/source/java/org/alfresco/filesys/avm/AVMContext.java b/source/java/org/alfresco/filesys/avm/AVMContext.java index 6010efc7b6..49d2f3be0b 100644 --- a/source/java/org/alfresco/filesys/avm/AVMContext.java +++ b/source/java/org/alfresco/filesys/avm/AVMContext.java @@ -25,12 +25,12 @@ import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.filesys.alfresco.AlfrescoContext; import org.alfresco.filesys.alfresco.AlfrescoDiskDriver; import org.alfresco.filesys.alfresco.IOControlHandler; -import org.alfresco.filesys.state.FileState; -import org.alfresco.filesys.state.FileStateTable; import org.alfresco.jlan.server.filesys.DiskInterface; import org.alfresco.jlan.server.filesys.FileName; import org.alfresco.jlan.server.filesys.FileSystem; import org.alfresco.jlan.server.filesys.NotifyChange; +import org.alfresco.jlan.server.filesys.cache.FileState; +import org.alfresco.jlan.server.filesys.cache.FileStateCache; import org.alfresco.jlan.util.StringList; import org.alfresco.repo.avm.CreateStoreCallback; import org.alfresco.repo.avm.CreateVersionCallback; @@ -440,13 +440,13 @@ public class AVMContext extends AlfrescoContext // Make sure the file state cache is enabled - FileStateTable fsTable = getStateTable(); + FileStateCache fsTable = getStateCache(); if ( fsTable == null) return; // Find the file state for the root folder - FileState rootState = fsTable.findFileState( FileName.DOS_SEPERATOR_STR, true, true); + FileState rootState = fsTable.findFileState( FileName.DOS_SEPERATOR_STR, true); if ( rootState != null) { @@ -481,7 +481,7 @@ public class AVMContext extends AlfrescoContext // Make sure the file state cache is enabled - FileStateTable fsTable = getStateTable(); + FileStateCache fsTable = getStateCache(); if ( fsTable == null) return; @@ -542,7 +542,7 @@ public class AVMContext extends AlfrescoContext // Make sure the file state cache is enabled - FileStateTable fsTable = getStateTable(); + FileStateCache fsTable = getStateCache(); if ( fsTable == null) return; @@ -612,7 +612,7 @@ public class AVMContext extends AlfrescoContext // Make sure the file state cache is enabled - FileStateTable fsTable = getStateTable(); + FileStateCache fsTable = getStateCache(); if ( fsTable == null) return; diff --git a/source/java/org/alfresco/filesys/avm/AVMDiskDriver.java b/source/java/org/alfresco/filesys/avm/AVMDiskDriver.java index 8926f97a57..dbb7b04fa6 100644 --- a/source/java/org/alfresco/filesys/avm/AVMDiskDriver.java +++ b/source/java/org/alfresco/filesys/avm/AVMDiskDriver.java @@ -29,7 +29,6 @@ import javax.transaction.UserTransaction; import org.springframework.extensions.config.ConfigElement; import org.alfresco.filesys.alfresco.AlfrescoDiskDriver; -import org.alfresco.filesys.state.FileState; import org.alfresco.jlan.server.SrvSession; import org.alfresco.jlan.server.auth.ClientInfo; import org.alfresco.jlan.server.core.DeviceContext; @@ -47,6 +46,7 @@ import org.alfresco.jlan.server.filesys.NetworkFile; import org.alfresco.jlan.server.filesys.PathNotFoundException; import org.alfresco.jlan.server.filesys.SearchContext; import org.alfresco.jlan.server.filesys.TreeConnection; +import org.alfresco.jlan.server.filesys.cache.FileState; import org.alfresco.jlan.server.filesys.pseudo.PseudoFile; import org.alfresco.jlan.server.filesys.pseudo.PseudoFileList; import org.alfresco.jlan.server.filesys.pseudo.PseudoFolderNetworkFile; @@ -394,7 +394,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface // Enable file state caching - context.enableStateTable(true, getStateReaper()); + context.enableStateCache( true); } } @@ -452,7 +452,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface { // Enable file state caching - context.enableStateTable(true, getStateReaper()); + context.enableStateCache(true); // Plug the virtualization view context into the various store/version call back listeners // so that store/version pseudo folders can be kept in sync with AVM @@ -584,7 +584,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface // Enable file state caching - context.enableStateTable(true, getStateReaper()); + context.enableStateCache(true); } // Commit the transaction @@ -2111,7 +2111,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface // Get the root folder file state - fstate = avmCtx.getStateTable().findFileState(FileName.DOS_SEPERATOR_STR); + fstate = avmCtx.getStateCache().findFileState(FileName.DOS_SEPERATOR_STR); if (fstate != null && fstate.hasPseudoFiles()) psFile = fstate.getPseudoFileList().findFile(avmPath.getStoreName(), false); @@ -2329,7 +2329,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface // Get the root path file state - fstate = avmCtx.getStateTable().findFileState( FileName.DOS_SEPERATOR_STR); + fstate = avmCtx.getStateCache().findFileState( FileName.DOS_SEPERATOR_STR); // Check if the root file state is valid @@ -2337,7 +2337,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface { // Create a file state for the root folder - fstate = avmCtx.getStateTable().findFileState( FileName.DOS_SEPERATOR_STR, true, true); + fstate = avmCtx.getStateCache().findFileState( FileName.DOS_SEPERATOR_STR, true); fstate.setExpiryTime( FileState.NoTimeout); // Get a list of the available AVM stores @@ -2565,13 +2565,13 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface // Search for the file state for the store pseudo folder relPath = str.toString(); - fstate = avmCtx.getStateTable().findFileState( relPath); + fstate = avmCtx.getStateCache().findFileState( relPath); if ( fstate == null) { // Create a file state for the store path - fstate = avmCtx.getStateTable().findFileState( str.toString(), true, true); + fstate = avmCtx.getStateCache().findFileState( str.toString(), true); // Add a pseudo file for the head version @@ -2606,13 +2606,13 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface relPath = str.toString(); - fstate = avmCtx.getStateTable().findFileState( relPath); + fstate = avmCtx.getStateCache().findFileState( relPath); if ( fstate == null) { // Create a file state for the store head folder path - fstate = avmCtx.getStateTable().findFileState( str.toString(), true, true); + fstate = avmCtx.getStateCache().findFileState( str.toString(), true); // Add a pseudo file for the data pseudo folder @@ -2650,7 +2650,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface // Create a file state for the store path relPath = str.toString(); - fstate = avmCtx.getStateTable().findFileState( relPath, true, true); + fstate = avmCtx.getStateCache().findFileState( relPath, true); // Add pseudo folders if the list is empty @@ -2720,13 +2720,13 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface // Search for the file state for the version pseudo folder relPath = str.toString(); - fstate = avmCtx.getStateTable().findFileState( relPath); + fstate = avmCtx.getStateCache().findFileState( relPath); if ( fstate == null) { // Create a file state for the version folder path - fstate = avmCtx.getStateTable().findFileState( str.toString(), true, true); + fstate = avmCtx.getStateCache().findFileState( str.toString(), true); // Add a pseudo file for the data pseudo folder @@ -2852,7 +2852,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface // Get root file state, get the store pseudo folder details - FileState rootState = avmCtx.getStateTable().findFileState( FileName.DOS_SEPERATOR_STR); + FileState rootState = avmCtx.getStateCache().findFileState( FileName.DOS_SEPERATOR_STR); if ( rootState == null){ // Recreate the root file state, new stores may have been added @@ -3073,7 +3073,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface // Get the root folder file state - FileState fstate = avmCtx.getStateTable().findFileState( FileName.DOS_SEPERATOR_STR, true, false); + FileState fstate = avmCtx.getStateCache().findFileState( FileName.DOS_SEPERATOR_STR, true); if ( fstate == null) return; diff --git a/source/java/org/alfresco/filesys/avm/AVMShareMapper.java b/source/java/org/alfresco/filesys/avm/AVMShareMapper.java index fa95225c38..34be8c6068 100644 --- a/source/java/org/alfresco/filesys/avm/AVMShareMapper.java +++ b/source/java/org/alfresco/filesys/avm/AVMShareMapper.java @@ -284,7 +284,7 @@ public class AVMShareMapper implements ShareMapper, InitializingBean { // Create a dynamic share mapped to the AVM store/version AVMContext avmCtx = new AVMContext( name, storePath, storeVersion); - avmCtx.enableStateTable( true, m_driver.getStateReaper()); + avmCtx.enableStateCache( true); // Create a dynamic shared device for the store version diff --git a/source/java/org/alfresco/filesys/config/ServerConfigurationBean.java b/source/java/org/alfresco/filesys/config/ServerConfigurationBean.java index 1e1d599230..067cb75601 100644 --- a/source/java/org/alfresco/filesys/config/ServerConfigurationBean.java +++ b/source/java/org/alfresco/filesys/config/ServerConfigurationBean.java @@ -62,6 +62,7 @@ import org.alfresco.jlan.server.core.DeviceContext; import org.alfresco.jlan.server.core.DeviceContextException; import org.alfresco.jlan.server.core.ShareMapper; import org.alfresco.jlan.server.core.ShareType; +import org.alfresco.jlan.server.filesys.DiskDeviceContext; import org.alfresco.jlan.server.filesys.DiskSharedDevice; import org.alfresco.jlan.server.filesys.FilesystemsConfigSection; import org.alfresco.jlan.server.thread.ThreadRequestPool; @@ -1559,6 +1560,17 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean filesys = new DiskSharedDevice(filesystem.getDeviceName(), filesysDriver, (AVMContext)filesystem); + // Check if the filesystem uses the file state cache, if so then add to the file state reaper + + DiskDeviceContext diskCtx = (DiskDeviceContext) filesystem; + + if ( diskCtx.hasStateCache()) { + + // Register the state cache with the reaper thread + + fsysConfig.addFileStateCache( filesystem.getDeviceName(), diskCtx.getStateCache()); + } + // Start the filesystem ((AVMContext)filesystem).startFilesystem(filesys); @@ -1596,6 +1608,15 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean filesys.setAccessControlList(acls); + // Check if the filesystem uses the file state cache, if so then add to the file state reaper + + if ( filesysContext.hasStateCache()) { + + // Register the state cache with the reaper thread + + fsysConfig.addFileStateCache( filesystem.getDeviceName(), filesysContext.getStateCache()); + } + // Start the filesystem filesysContext.startFilesystem(filesys); @@ -1647,7 +1668,7 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean // Create the new share for the store AVMContext avmContext = new AVMContext(storeName, storeName + ":/", AVMContext.VERSION_HEAD); - avmContext.enableStateTable(true, avmDriver.getStateReaper()); + avmContext.enableStateCache(true); // Create the shared filesystem diff --git a/source/java/org/alfresco/filesys/repo/CacheLookupSearchContext.java b/source/java/org/alfresco/filesys/repo/CacheLookupSearchContext.java index 874a345dc7..09adeff820 100644 --- a/source/java/org/alfresco/filesys/repo/CacheLookupSearchContext.java +++ b/source/java/org/alfresco/filesys/repo/CacheLookupSearchContext.java @@ -21,9 +21,9 @@ package org.alfresco.filesys.repo; import java.util.List; -import org.alfresco.filesys.state.FileState; -import org.alfresco.filesys.state.FileStateTable; import org.alfresco.jlan.server.filesys.FileInfo; +import org.alfresco.jlan.server.filesys.cache.FileState; +import org.alfresco.jlan.server.filesys.cache.FileStateCache; import org.alfresco.jlan.server.filesys.pseudo.PseudoFileList; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.commons.logging.Log; @@ -45,7 +45,7 @@ public class CacheLookupSearchContext extends ContentSearchContext { // File state cache - private FileStateTable m_stateCache; + private FileStateCache m_stateCache; // File information for the '.' and '..' pseduo entries, returned during a wildcard search @@ -68,7 +68,7 @@ public class CacheLookupSearchContext extends ContentSearchContext { String searchStr, PseudoFileList pseudoList, String relPath, - FileStateTable stateCache) + FileStateCache stateCache) { super(cifsHelper, results, searchStr, pseudoList, relPath); super.setSearchString(searchStr); diff --git a/source/java/org/alfresco/filesys/repo/ContentDiskDriver.java b/source/java/org/alfresco/filesys/repo/ContentDiskDriver.java index 475c4cde33..3f3a1e0f18 100644 --- a/source/java/org/alfresco/filesys/repo/ContentDiskDriver.java +++ b/source/java/org/alfresco/filesys/repo/ContentDiskDriver.java @@ -33,9 +33,6 @@ import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.filesys.alfresco.AlfrescoContext; import org.alfresco.filesys.alfresco.AlfrescoDiskDriver; import org.alfresco.filesys.alfresco.AlfrescoNetworkFile; -import org.alfresco.filesys.state.FileState; -import org.alfresco.filesys.state.FileStateLockManager; -import org.alfresco.filesys.state.FileState.FileStateStatus; import org.alfresco.jlan.server.SrvSession; import org.alfresco.jlan.server.core.DeviceContext; import org.alfresco.jlan.server.core.DeviceContextException; @@ -53,7 +50,8 @@ import org.alfresco.jlan.server.filesys.FileStatus; import org.alfresco.jlan.server.filesys.NetworkFile; import org.alfresco.jlan.server.filesys.SearchContext; import org.alfresco.jlan.server.filesys.TreeConnection; -import org.alfresco.jlan.server.filesys.db.DBFileInfo; +import org.alfresco.jlan.server.filesys.cache.FileState; +import org.alfresco.jlan.server.filesys.cache.FileStateLockManager; import org.alfresco.jlan.server.filesys.pseudo.MemoryNetworkFile; import org.alfresco.jlan.server.filesys.pseudo.PseudoFile; import org.alfresco.jlan.server.filesys.pseudo.PseudoFileInterface; @@ -102,7 +100,7 @@ import org.springframework.extensions.config.ConfigElement; * *
Provides a filesystem interface for various protocols such as SMB/CIFS and FTP.
*
- * @author Derek Hulley
+ * @author gkspencer
*/
public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterface, FileLockingInterface, OpLockInterface
{
@@ -116,6 +114,21 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
private static final String KEY_ROOT_PATH = "rootPath";
private static final String KEY_RELATIVE_PATH = "relativePath";
+ // File status values used in the file state cache
+
+ public static final int FileUnknown = FileStatus.Unknown;
+ public static final int FileNotExist = FileStatus.NotExist;
+ public static final int FileExists = FileStatus.FileExists;
+ public static final int DirectoryExists = FileStatus.DirectoryExists;
+
+ public static final int CustomFileStatus= FileStatus.MaxStatus + 1;
+ public static final int FileRenamed = CustomFileStatus;
+ public static final int DeleteOnClose = CustomFileStatus + 1;
+
+ // File state attributes
+
+ public static final String AttrLinkNode = "ContentLinkNode";
+
// Services and helpers
private CifsHelper cifsHelper;
@@ -139,7 +152,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Lock manager
- private static FileStateLockManager _lockManager = new FileStateLockManager();
+ private static FileStateLockManager _lockManager;
/**
* Class constructor
@@ -626,7 +639,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Enable file state caching
- context.enableStateTable( true, getStateReaper());
+ context.enableStateCache( true);
// Initialize the I/O control handler
@@ -643,15 +656,13 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
context.setNodeMonitor( nodeMonitor);
}
+ // Create the lock manager
+
+ _lockManager = new FileStateLockManager( context.getStateCache());
+
// Check if oplocks are enabled
- if ( context.getDisableOplocks() == false) {
-
- // Enable oplock support
-
- _lockManager.setStateTable( context.getStateTable());
- }
- else
+ if ( context.getDisableOplocks() == true)
logger.warn("Oplock support disabled for filesystem " + ctx.getDeviceName());
// Start the quota manager, if enabled
@@ -749,7 +760,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Make sure the parent folder has a file state, and the path exists
String[] paths = FileName.splitPath( path);
- FileState fstate = ctx.getStateTable().findFileState( paths[0]);
+ FileState fstate = ctx.getStateCache().findFileState( paths[0]);
if ( fstate == null)
{
@@ -764,10 +775,10 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Create the file state
- fstate = ctx.getStateTable().findFileState( paths[0], true, true);
+ fstate = ctx.getStateCache().findFileState( paths[0], true);
- fstate.setFileStatus( FileStatus.DirectoryExists);
- fstate.setNodeRef( nodeRef);
+ fstate.setFileStatus( DirectoryExists);
+ fstate.setFilesystemObject( nodeRef);
// Add pseudo files to the folder
@@ -782,11 +793,11 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{
// Make sure the file state has the node ref
- if ( fstate.hasNodeRef() == false)
+ if ( fstate.hasFilesystemObject() == false)
{
// Get the node for the folder path
- fstate.setNodeRef( getNodeForPath( tree, paths[0]));
+ fstate.setFilesystemObject( getNodeForPath( tree, paths[0]));
}
// Add pseudo files for the parent folder
@@ -897,9 +908,12 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Create a file state for the file/folder
- fstate = ctx.getStateTable().findFileState( path, finfo.isDirectory(), true);
-
- fstate.setNodeRef( nodeRef);
+ fstate = ctx.getStateCache().findFileState( path, true);
+ if ( finfo.isDirectory())
+ fstate.setFileStatus( DirectoryExists);
+ else
+ fstate.setFileStatus( FileExists);
+ fstate.setFilesystemObject( nodeRef);
}
}
@@ -971,7 +985,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
String[] paths = FileName.splitPath(searchPath);
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
// See if the folder to be searched has a file state, we can avoid having to walk the path
@@ -988,16 +1002,16 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{
// Create a file state for the folder
- searchFolderState = ctx.getStateTable().findFileState( paths[0], true, true);
+ searchFolderState = ctx.getStateCache().findFileState( paths[0], true);
}
// Make sure the associated node is set
- if ( searchFolderState.hasNodeRef() == false)
+ if ( searchFolderState.hasFilesystemObject() == false)
{
// Set the associated node for the folder
- searchFolderState.setNodeRef( nodeRef);
+ searchFolderState.setFilesystemObject( nodeRef);
}
// Add pseudo files to the folder being searched
@@ -1115,16 +1129,16 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{
// Use a cache lookup search context
- CacheLookupSearchContext cacheContext = new CacheLookupSearchContext(cifsHelper, results, searchFileSpec, pseudoList, paths[0], ctx.getStateTable());
+ CacheLookupSearchContext cacheContext = new CacheLookupSearchContext(cifsHelper, results, searchFileSpec, pseudoList, paths[0], ctx.getStateCache());
searchCtx = cacheContext;
// Set the '.' and '..' pseudo file entry details
- if ( searchFolderState != null && searchFolderState.hasNodeRef())
+ if ( searchFolderState != null && searchFolderState.hasFilesystemObject())
{
// Get the '.' pseudo entry file details
- FileInfo finfo = cifsHelper.getFileInformation( searchFolderState.getNodeRef());
+ FileInfo finfo = cifsHelper.getFileInformation((NodeRef) searchFolderState.getFilesystemObject());
// Blend in any cached timestamps
@@ -1166,11 +1180,11 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Get the file state for the parent path, if available
- FileState parentState = ctx.getStateTable().findFileState( parentPath);
+ FileState parentState = ctx.getStateCache().findFileState( parentPath);
NodeRef parentNode = null;
if ( parentState != null)
- parentNode = parentState.getNodeRef();
+ parentNode = (NodeRef) parentState.getFilesystemObject();
if ( parentState == null || parentNode == null)
parentNode = getNodeForPath( tree, parentPath);
@@ -1247,27 +1261,21 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{
ContentContext ctx = (ContentContext) tree.getContext();
int status = FileStatus.Unknown;
+ FileState fstate = null;
try
{
// Check for a cached file state
- FileState fstate = null;
+ if ( ctx.hasStateCache())
+ fstate = ctx.getStateCache().findFileState(name, true);
- if ( ctx.hasStateTable())
- ctx.getStateTable().findFileState(name);
-
- if ( fstate != null)
+ if ( fstate != null && fstate.getFileStatus() != FileUnknown)
{
- FileStateStatus fsts = fstate.getFileStatus();
+ status = fstate.getFileStatus();
+ if ( status >= CustomFileStatus)
+ status = FileNotExist;
- if ( fsts == FileStateStatus.FileExists)
- status = FileStatus.FileExists;
- else if ( fsts == FileStateStatus.FolderExists)
- status = FileStatus.DirectoryExists;
- else if ( fsts == FileStateStatus.NotExist || fsts == FileStateStatus.Renamed)
- status = FileStatus.NotExist;
-
// DEBUG
if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_INFO))
@@ -1286,7 +1294,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Make sure the parent folder has a file state, and the path exists
String[] paths = FileName.splitPath( name);
- fstate = ctx.getStateTable().findFileState( paths[0]);
+ fstate = ctx.getStateCache().findFileState( paths[0]);
if ( fstate == null) {
@@ -1296,14 +1304,14 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{
// Create the file state
- fstate = ctx.getStateTable().findFileState( paths[0], true, true);
+ fstate = ctx.getStateCache().findFileState( paths[0], true);
- fstate.setFileStatus( FileStatus.DirectoryExists);
+ fstate.setFileStatus( DirectoryExists);
// Get the node for the folder path
beginReadTransaction( sess);
- fstate.setNodeRef( getNodeForPath( tree, paths[0]));
+ fstate.setFilesystemObject( getNodeForPath( tree, paths[0]));
// Add pseudo files to the folder
@@ -1319,7 +1327,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{
// Make sure the file state has the node ref
- if ( fstate.hasNodeRef() == false)
+ if ( fstate.hasFilesystemObject() == false)
{
// Create the transaction
@@ -1327,7 +1335,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Get the node for the folder path
- fstate.setNodeRef( getNodeForPath( tree, paths[0]));
+ fstate.setFilesystemObject( getNodeForPath( tree, paths[0]));
}
// Add pseudo files for the parent folder
@@ -1378,12 +1386,19 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{
status = FileStatus.FileExists;
}
+
+ // Update the file state status
+
+ if ( fstate != null)
+ fstate.setFileStatus( status);
}
}
}
catch (FileNotFoundException e)
{
status = FileStatus.NotExist;
+ if ( fstate != null)
+ fstate.setFileStatus( status);
}
catch (IOException e)
{
@@ -1398,7 +1413,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Debug
if (logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_INFO))
- logger.debug("File status determined: name=" + name + " status=" + FileStatus.asString(status));
+ logger.debug("File status determined: name=" + name + " status=" + fileStatusString(fstate.getFileStatus()));
// Return the file/folder status
@@ -1436,7 +1451,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Make sure the parent folder has a file state, and the path exists
String[] paths = FileName.splitPath( path);
- FileState fstate = ctx.getStateTable().findFileState( paths[0]);
+ FileState fstate = ctx.getStateCache().findFileState( paths[0]);
if ( fstate == null) {
@@ -1446,9 +1461,9 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{
// Create the file state and add any pseudo files
- fstate = ctx.getStateTable().findFileState( paths[0], true, true);
+ fstate = ctx.getStateCache().findFileState( paths[0], true);
- fstate.setFileStatus( FileStatus.DirectoryExists);
+ fstate.setFileStatus( DirectoryExists);
getPseudoFileInterface( ctx).addPseudoFilesToFolder( sess, tree, paths[0]);
// Debug
@@ -1523,11 +1538,11 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
FileState fstate = null;
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
// Check if there is a file state for the file
- fstate = ctx.getStateTable().findFileState( params.getPath());
+ fstate = ctx.getStateCache().findFileState( params.getPath());
if ( fstate != null)
{
@@ -1540,7 +1555,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Create a file state for the path
- fstate = ctx.getStateTable().findFileState( params.getPath(), false, true);
+ fstate = ctx.getStateCache().findFileState( params.getPath(), true);
}
// Check if the current file open allows the required shared access
@@ -1765,15 +1780,15 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Create a file state for the open file
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
if ( fstate == null)
- fstate = ctx.getStateTable().findFileState(params.getPath(), params.isDirectory(), true);
+ fstate = ctx.getStateCache().findFileState(params.getPath(), true);
// Update the file state, cache the node
fstate.incrementOpenCount();
- fstate.setNodeRef(nodeRef);
+ fstate.setFilesystemObject(nodeRef);
// Store the state with the file
@@ -1846,7 +1861,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// If the state table is available then try to find the parent folder node for the new file
// to save having to walk the path
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
// See if the parent folder has a file state, we can avoid having to walk the path
@@ -1871,8 +1886,8 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Get the file state for the parent folder
parentState = getStateForPath(tree, paths[0]);
- if ( parentState == null && ctx.hasStateTable())
- parentState = ctx.getStateTable().findFileState( paths[0], true, true);
+ if ( parentState == null && ctx.hasStateCache())
+ parentState = ctx.getStateCache().findFileState( paths[0], true);
}
}
@@ -1904,9 +1919,9 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Add a file state for the new file/folder
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
- FileState fstate = ctx.getStateTable().findFileState(params.getPath(), false, true);
+ FileState fstate = ctx.getStateCache().findFileState(params.getPath(), true);
if ( fstate != null)
{
// Save the file sharing mode, needs to be done before the open count is incremented
@@ -1916,9 +1931,9 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Indicate that the file is open
- fstate.setFileStatus(FileStateStatus.FileExists);
+ fstate.setFileStatus( FileExists);
fstate.incrementOpenCount();
- fstate.setNodeRef(nodeRef);
+ fstate.setFilesystemObject(nodeRef);
// Store the file state with the file
@@ -2008,7 +2023,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// If the state table is available then try to find the parent folder node for the new folder
// to save having to walk the path
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
// See if the parent folder has a file state, we can avoid having to walk the path
@@ -2033,8 +2048,8 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Get the file state for the parent folder
parentState = getStateForPath(tree, paths[0]);
- if ( parentState == null && ctx.hasStateTable())
- parentState = ctx.getStateTable().findFileState( paths[0], true, true);
+ if ( parentState == null && ctx.hasStateCache())
+ parentState = ctx.getStateCache().findFileState( paths[0], true);
}
}
@@ -2044,15 +2059,15 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Add a file state for the new folder
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
- FileState fstate = ctx.getStateTable().findFileState( params.getPath(), true, true);
+ FileState fstate = ctx.getStateCache().findFileState( params.getPath(), true);
if ( fstate != null)
{
// Indicate that the file is open
- fstate.setFileStatus(FileStateStatus.FolderExists);
- fstate.setNodeRef(nodeRef);
+ fstate.setFileStatus( DirectoryExists);
+ fstate.setFilesystemObject(nodeRef);
// DEBUG
@@ -2131,11 +2146,11 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Remove the file state
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
// Remove the file state
- ctx.getStateTable().removeFileState(dir);
+ ctx.getStateCache().removeFileState(dir);
// Update, or create, a parent folder file state
@@ -2145,8 +2160,8 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Get the file state for the parent folder
FileState parentState = getStateForPath(tree, paths[0]);
- if ( parentState == null && ctx.hasStateTable())
- parentState = ctx.getStateTable().findFileState( paths[0], true, true);
+ if ( parentState == null && ctx.hasStateCache())
+ parentState = ctx.getStateCache().findFileState( paths[0], true);
// Update the modification timestamp
@@ -2251,32 +2266,32 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
return;
}
- }
- if ( ctx.hasStateTable())
- {
- FileState fstate = ctx.getStateTable().findFileState(file.getFullName());
- if ( fstate != null) {
-
- // If the file open count is now zero then reset the stored sharing mode
-
- if ( fstate.decrementOpenCount() == 0)
- fstate.setSharedAccess( SharingMode.READWRITE + SharingMode.DELETE);
-
- // Check if there is a cached modification timestamp to be written out
-
- if ( file.hasDeleteOnClose() == false && fstate.hasModifyDateTime() && fstate.hasNodeRef()) {
-
- // Update the modification date on the file/folder node
-
- Date modifyDate = new Date( fstate.getModifyDateTime());
- nodeService.setProperty( fstate.getNodeRef(), ContentModel.PROP_MODIFIED, modifyDate);
-
- // Debug
-
- if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
- logger.debug("Updated modifcation timestamp, " + file.getFullName() + ", modTime=" + modifyDate);
- }
+ if ( ctx.hasStateCache())
+ {
+ FileState fstate = ctx.getStateCache().findFileState(file.getFullName());
+ if ( fstate != null) {
+
+ // If the file open count is now zero then reset the stored sharing mode
+
+ if ( fstate.decrementOpenCount() == 0)
+ fstate.setSharedAccess( SharingMode.READWRITE + SharingMode.DELETE);
+
+ // Check if there is a cached modification timestamp to be written out
+
+ if ( file.hasDeleteOnClose() == false && fstate.hasModifyDateTime() && fstate.hasFilesystemObject()) {
+
+ // Update the modification date on the file/folder node
+
+ Date modifyDate = new Date( fstate.getModifyDateTime());
+ nodeService.setProperty((NodeRef) fstate.getFilesystemObject(), ContentModel.PROP_MODIFIED, modifyDate);
+
+ // Debug
+
+ if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
+ logger.debug("Updated modifcation timestamp, " + file.getFullName() + ", modTime=" + modifyDate);
+ }
+ }
}
}
@@ -2341,28 +2356,28 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Set the file state to indicate a delete on close
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
if ( isVersionable == true) {
// Get, or create, the file state
- FileState fState = ctx.getStateTable().findFileState(file.getFullName(), false, true);
+ FileState fState = ctx.getStateCache().findFileState(file.getFullName(), true);
// Indicate that the file was deleted via a delete on close request
- fState.setFileStatus(FileStateStatus.DeleteOnClose);
+ fState.setFileStatus( DeleteOnClose);
// Make sure the file state is cached for a short while, save the noderef details
fState.setExpiryTime(System.currentTimeMillis() + FileState.RenameTimeout);
- fState.setNodeRef(nodeRef);
+ fState.setFilesystemObject(nodeRef);
}
else {
// Remove the file state
- ctx.getStateTable().removeFileState( file.getFullName());
+ ctx.getStateCache().removeFileState( file.getFullName());
}
}
}
@@ -2444,7 +2459,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Remove the file state
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
// Check if the node is versionable, cache the node details for a short while
@@ -2453,17 +2468,17 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Make sure the file state is cached for a short while, a new file may be renamed to the same name
// in which case we can connect the file to the previous version history
- FileState delState = ctx.getStateTable().findFileState( name, false, true);
+ FileState delState = ctx.getStateCache().findFileState( name, true);
delState.setExpiryTime(System.currentTimeMillis() + FileState.DeleteTimeout);
- delState.setFileStatus(FileStateStatus.DeleteOnClose);
- delState.setNodeRef( nodeRef);
+ delState.setFileStatus( DeleteOnClose);
+ delState.setFilesystemObject( nodeRef);
}
else {
// Remove the file state
- ctx.getStateTable().removeFileState( name);
+ ctx.getStateCache().removeFileState( name);
}
// Update, or create, a parent folder file state
@@ -2474,8 +2489,8 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Get the file state for the parent folder
FileState parentState = getStateForPath(tree, paths[0]);
- if ( parentState == null && ctx.hasStateTable())
- parentState = ctx.getStateTable().findFileState( paths[0], true, true);
+ if ( parentState == null && ctx.hasStateCache())
+ parentState = ctx.getStateCache().findFileState( paths[0], true);
// Update the modification timestamp
@@ -2580,7 +2595,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Get the file state for the old file, if available
- FileState oldState = ctx.getStateTable().findFileState( oldName);
+ FileState oldState = ctx.getStateCache().findFileState( oldName);
// Check if we are renaming a folder, or the rename is to a different folder
@@ -2594,7 +2609,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{
// Update the file state index to use the new name
- ctx.getStateTable().renameFileState(newName, oldState);
+ ctx.getStateCache().renameFileState(newName, oldState, true);
}
// Rename or move the file/folder
@@ -2616,7 +2631,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Check if the target file already exists
int newExists = fileExists( sess, tree, newName);
- FileState newState = ctx.getStateTable().findFileState( newName, false, true);
+ FileState newState = ctx.getStateCache().findFileState( newName, true);
NodeRef targetNodeRef = null;
@@ -2632,7 +2647,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Check if the target has a renamed or delete-on-close state
- if ( newState.getFileStatus() == FileStateStatus.Renamed) {
+ if ( newState.getFileStatus() == FileRenamed) {
// DEBUG
@@ -2641,9 +2656,9 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Use the renamed node to clone aspects/state
- cloneNodeAspects( name, newState.getNodeRef(), nodeToMoveRef, ctx);
+ cloneNodeAspects( name, (NodeRef) newState.getFilesystemObject(), nodeToMoveRef, ctx);
}
- else if ( newState.getFileStatus() == FileStateStatus.DeleteOnClose) {
+ else if ( newState.getFileStatus() == DeleteOnClose) {
// DEBUG
@@ -2652,7 +2667,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Restore the deleted node so we can relink the new version to the old history/properties
- NodeRef archivedNode = getNodeArchiveService().getArchivedNode( newState.getNodeRef());
+ NodeRef archivedNode = getNodeArchiveService().getArchivedNode((NodeRef) newState.getFilesystemObject());
// DEBUG
@@ -2672,16 +2687,18 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Check if the deleted file had a linked node, due to a rename
- if ( newState.hasLinkNode() && nodeService.exists( newState.getLinkNode())) {
+ NodeRef linkNode = (NodeRef) newState.findAttribute( AttrLinkNode);
+
+ if ( linkNode != null && nodeService.exists( linkNode)) {
// Clone aspects from the linked node onto the restored node
- cloneNodeAspects( name, newState.getLinkNode(), targetNodeRef, ctx);
+ cloneNodeAspects( name, linkNode, targetNodeRef, ctx);
// DEBUG
if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_RENAME)) {
- logger.debug(" Moved aspects from linked node " + newState.getLinkNode());
+ logger.debug(" Moved aspects from linked node " + linkNode);
// Check if the node is a working copy
@@ -2730,8 +2747,8 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Mark the new file as existing
- newState.setFileStatus( FileStatus.FileExists);
- newState.setNodeRef( nodeToMoveRef);
+ newState.setFileStatus( FileExists);
+ newState.setFilesystemObject( nodeToMoveRef);
// Make sure the old file state is cached for a short while, the file may not be open so the
// file state could be expired
@@ -2740,8 +2757,8 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Indicate that this is a renamed file state, set the node ref of the file that was renamed
- oldState.setFileStatus(FileStateStatus.Renamed);
- oldState.setNodeRef(nodeToMoveRef);
+ oldState.setFileStatus( FileRenamed);
+ oldState.setFilesystemObject(nodeToMoveRef);
// DEBUG
@@ -2770,8 +2787,8 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Mark the new file as existing
- newState.setFileStatus( FileStatus.FileExists);
- newState.setNodeRef( targetNodeRef);
+ newState.setFileStatus( FileExists);
+ newState.setFilesystemObject( targetNodeRef);
// Delete the old file
@@ -2784,12 +2801,12 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Indicate that this is a deleted file state, set the node ref of the file that was renamed
- oldState.setFileStatus(FileStateStatus.DeleteOnClose);
- oldState.setNodeRef(nodeToMoveRef);
+ oldState.setFileStatus( DeleteOnClose);
+ oldState.setFilesystemObject(nodeToMoveRef);
// Link to the new node, a new file may be renamed into place, we need to transfer aspect/locks
- oldState.setLinkNode( targetNodeRef);
+ oldState.addAttribute( AttrLinkNode, targetNodeRef);
// DEBUG
@@ -3259,16 +3276,16 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
ContentContext ctx = (ContentContext) tree.getContext();
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
// Try and get the node ref from an in memory file state
- FileState fstate = ctx.getStateTable().findFileState(path);
- if ( fstate != null && fstate.hasNodeRef() && fstate.exists() )
+ FileState fstate = ctx.getStateCache().findFileState(path);
+ if ( fstate != null && fstate.hasFilesystemObject() && fstate.exists() )
{
// Check that the node exists
- if (fileFolderService.exists(fstate.getNodeRef()))
+ if (fileFolderService.exists((NodeRef) fstate.getFilesystemObject()))
{
// Bump the file states expiry time
@@ -3276,11 +3293,11 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Return the cached noderef
- return fstate.getNodeRef();
+ return (NodeRef) fstate.getFilesystemObject();
}
else
{
- ctx.getStateTable().removeFileState(path);
+ ctx.getStateCache().removeFileState(path);
}
}
}
@@ -3344,11 +3361,11 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
ContentContext ctx = (ContentContext) tree.getContext();
FileState fstate = null;
- if ( ctx.hasStateTable())
+ if ( ctx.hasStateCache())
{
// Get the file state for a file/folder
- fstate = ctx.getStateTable().findFileState(path);
+ fstate = ctx.getStateCache().findFileState(path);
}
// Return the file state
@@ -3548,5 +3565,38 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_RENAME))
logger.debug(" Removed versionable aspect from temp file");
}
- }
+ }
+
+ /**
+ * Return the file state status as a string
+ *
+ * @param sts int
+ * @return String
+ */
+ private final String fileStatusString( int sts) {
+ String fstatus = "Unknown";
+
+ switch ( sts) {
+ case FileUnknown:
+ fstatus = "Unknown";
+ break;
+ case FileNotExist:
+ fstatus = "NotExist";
+ break;
+ case FileExists:
+ fstatus = "FileExists";
+ break;
+ case DirectoryExists:
+ fstatus = "DirectoryExists";
+ break;
+ case FileRenamed:
+ fstatus = "FileRenamed";
+ break;
+ case DeleteOnClose:
+ fstatus = "DeleteOnClose";
+ break;
+ }
+
+ return fstatus;
+ }
}
diff --git a/source/java/org/alfresco/filesys/repo/HomeShareMapper.java b/source/java/org/alfresco/filesys/repo/HomeShareMapper.java
index b33bc15a79..e5477e4240 100644
--- a/source/java/org/alfresco/filesys/repo/HomeShareMapper.java
+++ b/source/java/org/alfresco/filesys/repo/HomeShareMapper.java
@@ -389,7 +389,7 @@ public class HomeShareMapper implements ShareMapper, InitializingBean
// Create the disk driver and context
ContentContext diskCtx = new ContentContext( getHomeFolderName(), "", "", alfClient.getHomeFolder());
- diskCtx.enableStateTable( true, m_driver.getStateReaper());
+ diskCtx.enableStateCache( true);
// Create a temporary shared device for the users home directory
diff --git a/source/java/org/alfresco/filesys/repo/NodeMonitor.java b/source/java/org/alfresco/filesys/repo/NodeMonitor.java
index 2930c8ba57..e3329217c9 100644
--- a/source/java/org/alfresco/filesys/repo/NodeMonitor.java
+++ b/source/java/org/alfresco/filesys/repo/NodeMonitor.java
@@ -22,10 +22,10 @@ package org.alfresco.filesys.repo;
import java.io.Serializable;
import java.util.Map;
-import org.alfresco.filesys.state.FileState;
-import org.alfresco.filesys.state.FileStateTable;
import org.alfresco.jlan.server.filesys.FileStatus;
import org.alfresco.jlan.server.filesys.NotifyChange;
+import org.alfresco.jlan.server.filesys.cache.FileState;
+import org.alfresco.jlan.server.filesys.cache.FileStateCache;
import org.alfresco.jlan.smb.server.notify.NotifyChangeHandler;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.node.NodeServicePolicies;
@@ -88,7 +88,7 @@ public class NodeMonitor extends TransactionListenerAdapter
// File state table and change notification handler
- private FileStateTable m_stateTable;
+ private FileStateCache m_stateTable;
private NotifyChangeHandler m_changeHandler;
// Root node path and store
@@ -188,7 +188,7 @@ public class NodeMonitor extends TransactionListenerAdapter
// Get the file state table and change notification handler, if enabled
- m_stateTable = m_filesysCtx.getStateTable();
+ m_stateTable = m_filesysCtx.getStateCache();
m_changeHandler = m_filesysCtx.getChangeHandler();
// Start the event processing thread
diff --git a/source/java/org/alfresco/filesys/repo/desk/CheckInOutDesktopAction.java b/source/java/org/alfresco/filesys/repo/desk/CheckInOutDesktopAction.java
index ba9149603d..0620eb0369 100644
--- a/source/java/org/alfresco/filesys/repo/desk/CheckInOutDesktopAction.java
+++ b/source/java/org/alfresco/filesys/repo/desk/CheckInOutDesktopAction.java
@@ -26,11 +26,11 @@ import org.alfresco.filesys.alfresco.DesktopAction;
import org.alfresco.filesys.alfresco.DesktopParams;
import org.alfresco.filesys.alfresco.DesktopResponse;
import org.alfresco.filesys.alfresco.DesktopTarget;
-import org.alfresco.filesys.state.FileState;
-import org.alfresco.filesys.state.FileStateTable;
import org.alfresco.jlan.server.filesys.FileName;
import org.alfresco.jlan.server.filesys.FileStatus;
import org.alfresco.jlan.server.filesys.NotifyChange;
+import org.alfresco.jlan.server.filesys.cache.FileState;
+import org.alfresco.jlan.server.filesys.cache.FileStateCache;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
import org.alfresco.service.cmr.repository.NodeRef;
@@ -183,12 +183,12 @@ public class CheckInOutDesktopAction extends DesktopAction {
// Update cached state for the working copy to indicate the file exists
- FileStateTable stateTable = getContext().getStateTable();
- if ( stateTable != null) {
+ FileStateCache stateCache = getContext().getStateCache();
+ if ( stateCache != null) {
// Update any cached state for the working copy file
- FileState fstate = stateTable.findFileState( fileName);
+ FileState fstate = stateCache.findFileState( fileName);
if ( fstate != null)
fstate.setFileStatus( FileStatus.FileExists);
}
diff --git a/source/java/org/alfresco/filesys/state/FileState.java b/source/java/org/alfresco/filesys/state/FileState.java
deleted file mode 100644
index 7901120240..0000000000
--- a/source/java/org/alfresco/filesys/state/FileState.java
+++ /dev/null
@@ -1,841 +0,0 @@
-/*
- * Copyright (C) 2005-2010 Alfresco Software Limited.
- *
- * This file is part of Alfresco
- *
- * Alfresco is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Alfresco 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see
Keeps track of file state across all sessions on the server, to keep track of file sharing modes,
- * file locks and also for synchronizing access to files/folders.
- *
- * @author gkspencer
- */
-public class FileState
-{
- private static final Log logger = LogFactory.getLog(FileState.class);
-
- // File state constants
-
- public final static long NoTimeout = -1L;
- public final static long DefTimeout = 2 * 60000L; // 2 minutes
- public final static long RenameTimeout = 1 * 60000L; // 1 minute
- public final static long DeleteTimeout = 15000L; // 15 seconds
-
- // File status
-
- public enum FileStateStatus { NotExist, FileExists, FolderExists, Renamed, DeleteOnClose };
-
- // File name/path
-
- private String m_path;
-
- // File state timeout, -1 indicates no timeout
-
- private long m_tmo;
-
- // File status, indicates if the file/folder exists and if it is a file or folder.
-
- private FileStateStatus m_fileStatus = FileStateStatus.NotExist;
-
- // Open file count
-
- private int m_openCount;
-
- // Sharing mode and PID of first process to open the file
-
- private int m_sharedAccess = SharingMode.READWRITE + SharingMode.DELETE;
- private int m_pid = -1;
-
- // File lock list, allocated once there are active locks on this file
-
- private FileLockList m_lockList;
-
- // Oplock details
-
- private OpLockDetails m_oplock;
-
- // Node for this file
-
- private NodeRef m_nodeRef;
-
- // Link to the new file state when a file is renamed
-
- private FileState m_newNameState;
-
- // Pseudo file list
-
- private PseudoFileList m_pseudoFiles;
-
- // File timestamps updated only whilst file is open
-
- private long m_accessDate;
- private long m_modifyDate;
- private long m_changeDate;
-
- // Keep track of the node we are linked to, when deleted
-
- private NodeRef m_linkNode;
-
- /**
- * Class constructor
- *
- * @param fname String
- * @param isdir boolean
- */
- public FileState(String fname, boolean isdir)
- {
-
- // Normalize the file path
-
- setPath(fname);
- setExpiryTime(System.currentTimeMillis() + DefTimeout);
-
- // Set the file/folder status
-
- setFileStatus( isdir ? FileStateStatus.FolderExists : FileStateStatus.FileExists);
- }
-
- /**
- * Return the file name/path
- *
- * @return String
- */
- public final String getPath()
- {
- return m_path;
- }
-
- /**
- * Return the file status
- *
- * @return FileStateStatus
- */
- public final FileStateStatus getFileStatus()
- {
- return m_fileStatus;
- }
-
- /**
- * Determine if the file/folder exists
- *
- * @return boolen
- */
- public final boolean exists()
- {
- if ( m_fileStatus == FileStateStatus.FileExists ||
- m_fileStatus == FileStateStatus.FolderExists)
- return true;
- return false;
- }
-
- /**
- * Return the directory state
- *
- * @return boolean
- */
- public final boolean isDirectory()
- {
- return m_fileStatus == FileStateStatus.FolderExists ? true : false;
- }
-
- /**
- * Determine if the associated node has been set
- *
- * @return boolean
- */
- public final boolean hasNodeRef()
- {
- return m_nodeRef != null ? true : false;
- }
-
- /**
- * Return the associated node
- *
- * @return NodeRef
- */
- public final NodeRef getNodeRef()
- {
- return m_nodeRef;
- }
-
- /**
- * Return the file open count
- *
- * @return int
- */
- public final int getOpenCount()
- {
- return m_openCount;
- }
-
- /**
- * Return the shared access mode
- *
- * @return int
- */
- public final int getSharedAccess()
- {
- return m_sharedAccess;
- }
-
- /**
- * Return the PID of the first process to open the file, or -1 if the file is not open
- *
- * @return int
- */
- public final int getProcessId()
- {
- return m_pid;
- }
-
- /**
- * Check if there are active locks on this file
- *
- * @return boolean
- */
- public final boolean hasActiveLocks()
- {
- if (m_lockList != null && m_lockList.numberOfLocks() > 0)
- return true;
- return false;
- }
-
- /**
- * Check if this file state does not expire
- *
- * @return boolean
- */
- public final boolean hasNoTimeout()
- {
- return m_tmo == NoTimeout ? true : false;
- }
-
- /**
- * Check if the file can be opened depending on any current file opens and the sharing mode of
- * the first file open
- *
- * @param params FileOpenParams
- * @return boolean
- */
- public final boolean allowsOpen(FileOpenParams params)
- {
-
- // If the file is not currently open then allow the file open
-
- if (getOpenCount() == 0)
- return true;
-
- // Check the shared access mode
-
- if (getSharedAccess() == SharingMode.READWRITE && params.getSharedAccess() == SharingMode.READWRITE)
- return true;
- else if ((getSharedAccess() & SharingMode.READ) != 0 && params.isReadOnlyAccess())
- return true;
- else if ((getSharedAccess() & SharingMode.WRITE) != 0 && params.isWriteOnlyAccess())
- return true;
-
- // Sharing violation, do not allow the file open
-
- return false;
- }
-
- /**
- * Increment the file open count
- *
- * @return int
- */
- public final synchronized int incrementOpenCount()
- {
- return m_openCount++;
- }
-
- /**
- * Decrement the file open count
- *
- * @return int
- */
- public final synchronized int decrementOpenCount()
- {
-
- // Debug
-
- if (m_openCount <= 0)
- logger.debug("@@@@@ File close name=" + getPath() + ", count=" + m_openCount + " < Implementation of a lock manager that uses the file state cache to track locks on a file.
- *
- * @author gkspencer
- */
-public class FileStateLockManager implements LockManager, OpLockManager, Runnable {
-
- // Oplock break timeout
-
- private static final long OpLockBreakTimeout = 5000L; // 5 seconds
-
- // File state cache used for byte range locks/oplocks
-
- private FileStateTable m_stateCache;
-
- // Oplock breaks in progress
-
- private Hashtable FileStateTable objects register with the file state reaper to periodically check for expired file states.
- *
- * @author gkspencer
- */
-public class FileStateReaper implements Runnable {
-
- // Logging
-
- private static final Log logger = LogFactory.getLog(FileStateReaper.class);
-
- // Default expire check thread interval
-
- private static final long DEFAULT_EXPIRECHECK = 15000;
-
- // Wakeup interval for the expire file state checker thread
-
- private long m_expireInterval = DEFAULT_EXPIRECHECK;
-
- // File state checker thread
-
- private Thread m_thread;
-
- // Shutdown request flag
-
- private boolean m_shutdown;
-
- // List of file state tables to be scanned for expired file states
-
- private Hashtable Contains an indexed list of the currently open files/folders.
- *
- * @author gkspencer
- */
-public class FileStateTable
-{
- private static final Log logger = LogFactory.getLog(FileStateTable.class);
-
- // Initial allocation size for the state cache
-
- private static final int INITIAL_SIZE = 100;
-
- // File state table, keyed by file path
-
- private Hashtable