Added code to regenerate root folder file state if it expires. Fix for AR-1140.

Some fixes after merge.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4651 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Gary Spencer
2006-12-19 09:29:57 +00:00
parent b3933922b2
commit 372b3a8243
6 changed files with 166 additions and 33 deletions

View File

@@ -279,28 +279,6 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface {
context.enableStateTable( true, getStateReaper()); context.enableStateTable( true, getStateReaper());
// Get a list of the available AVM stores
List<AVMStoreDescriptor> storeList = m_avmService.getStores();
if ( storeList != null && storeList.size() > 0)
{
// Create a file state for the root folder that does not expire, and add pseudo files
// for the stores
FileState rootState = context.getStateTable().findFileState( FileName.DOS_SEPERATOR_STR, true, true);
rootState.setExpiryTime( FileState.NoTimeout);
// Add pseudo files for the stores
for ( AVMStoreDescriptor storeDesc : storeList)
{
// Add a pseudo file for the current store
rootState.addPseudoFile( new StorePseudoFile( storeDesc));
}
}
// Plug the virtualization view context into the various store/version call back listeners // 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 // so that store/version pseudo folders can be kept in sync with AVM
@@ -756,6 +734,8 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface {
netFile.setGrantedAccess(NetworkFile.READWRITE); netFile.setGrantedAccess(NetworkFile.READWRITE);
netFile.setFullName(params.getPath()); netFile.setFullName(params.getPath());
netFile.setFileId( fileStorePath.generateFileId());
// Set the mime-type for the new file // Set the mime-type for the new file
netFile.setMimeType( m_mimetypeService.guessMimetype( paths[1])); netFile.setMimeType( m_mimetypeService.guessMimetype( paths[1]));
@@ -1067,7 +1047,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface {
try try
{ {
AVMNodeDescriptor nodeDesc = m_avmService.lookup( ctx.isVersion(), storePath.getAVMPath()); AVMNodeDescriptor nodeDesc = m_avmService.lookup( storePath.getVersion(), storePath.getAVMPath());
if ( nodeDesc != null) if ( nodeDesc != null)
{ {
@@ -1107,7 +1087,11 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface {
attr += FileAttribute.ReadOnly; attr += FileAttribute.ReadOnly;
info.setFileAttributes( attr); info.setFileAttributes( attr);
// Set the file id
info.setFileId( storePath.generateFileId());
// DEBUG // DEBUG
if ( logger.isDebugEnabled()) if ( logger.isDebugEnabled())
@@ -1226,6 +1210,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface {
netFile.setGrantedAccess(NetworkFile.READWRITE); netFile.setGrantedAccess(NetworkFile.READWRITE);
netFile.setFullName(params.getPath()); netFile.setFullName(params.getPath());
netFile.setFileId( storePath.generateFileId());
// Set the mime-type for the new file // Set the mime-type for the new file
@@ -1462,6 +1447,11 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface {
if ( WildCard.containsWildcards( searchPath)) if ( WildCard.containsWildcards( searchPath))
{ {
// Check if the pseudo file list is valid
if ( searchList == null)
searchList = new PseudoFileList();
// Create the search context, wildcard filter will take care of secondary filtering of the // Create the search context, wildcard filter will take care of secondary filtering of the
// folder listing // folder listing
@@ -1523,7 +1513,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface {
// folder listing // folder listing
WildCard wildCardFilter = new WildCard( paths[1], false); WildCard wildCardFilter = new WildCard( paths[1], false);
context = new AVMSearchContext( fileList, attrib, wildCardFilter); context = new AVMSearchContext( fileList, attrib, wildCardFilter, storePath.getRelativePath());
} }
} }
else else
@@ -1540,7 +1530,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface {
{ {
// Create the search context for the single file/folder // Create the search context for the single file/folder
context = new AVMSingleFileSearchContext( nodeDesc); context = new AVMSingleFileSearchContext( nodeDesc, storePath.getRelativePath());
} }
} }
@@ -1669,7 +1659,7 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface {
// Get the root folder file state // Get the root folder file state
fstate = avmCtx.getStateTable().findFileState( FileName.DOS_SEPERATOR_STR); fstate = avmCtx.getStateTable().findFileState( FileName.DOS_SEPERATOR_STR);
if ( fstate != null) if ( fstate != null && fstate.hasPseudoFiles())
psFile = fstate.getPseudoFileList().findFile( avmPath.getStoreName(), false); psFile = fstate.getPseudoFileList().findFile( avmPath.getStoreName(), false);
break; break;
@@ -1843,6 +1833,32 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface {
// Get the root path file state // Get the root path file state
fstate = avmCtx.getStateTable().findFileState( FileName.DOS_SEPERATOR_STR); fstate = avmCtx.getStateTable().findFileState( FileName.DOS_SEPERATOR_STR);
// Check if the root file state is valid
if ( fstate == null)
{
// Create a file state for the root folder
fstate = avmCtx.getStateTable().findFileState( FileName.DOS_SEPERATOR_STR, true, true);
fstate.setExpiryTime( FileState.NoTimeout);
// Get a list of the available AVM stores
List<AVMStoreDescriptor> storeList = m_avmService.getStores();
if ( storeList != null && storeList.size() > 0)
{
// Add pseudo files for the stores
for ( AVMStoreDescriptor storeDesc : storeList)
{
// Add a pseudo file for the current store
fstate.addPseudoFile( new StorePseudoFile( storeDesc));
}
}
}
break; break;
// Store folder // Store folder

View File

@@ -498,6 +498,99 @@ public class AVMPath {
m_levelId = LevelId.StorePath; m_levelId = LevelId.StorePath;
} }
/**
* Generate a file id for the path
*
* @return int
*/
public final int generateFileId()
{
// Check if the path is a store path or pseudo path
int fid = -1;
if ( isLevel() == LevelId.StorePath)
{
// Use the share relative path to generate the file id
fid = getRelativePath().hashCode();
}
else if ( isPseudoPath())
{
// Create a relative path to the pseudo folder
StringBuilder relStr = new StringBuilder();
relStr.append( FileName.DOS_SEPERATOR);
switch( isLevel())
{
case StoreRoot:
relStr.append( getStoreName());
break;
case Head:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionNameHead);
break;
case HeadData:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionNameHead);
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.DataFolder);
break;
case HeadMetaData:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionNameHead);
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.MetaDataFolder);
break;
case VersionRoot:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionsFolder);
break;
case Version:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionsFolder);
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionFolderPrefix);
relStr.append( getVersion());
break;
case VersionData:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionsFolder);
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionFolderPrefix);
relStr.append( getVersion());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.DataFolder);
break;
case VersionMetaData:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionsFolder);
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionFolderPrefix);
relStr.append( getVersion());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.MetaDataFolder);
break;
}
// Generate the file id using the pseudo folder relative path
fid = relStr.toString().hashCode();
}
// Return the file id
return fid;
}
/** /**
* Return the AVM path details as a string * Return the AVM path details as a string
* *

View File

@@ -19,6 +19,7 @@ package org.alfresco.filesys.avm;
import org.alfresco.filesys.server.filesys.FileAttribute; import org.alfresco.filesys.server.filesys.FileAttribute;
import org.alfresco.filesys.server.filesys.FileInfo; import org.alfresco.filesys.server.filesys.FileInfo;
import org.alfresco.filesys.server.filesys.FileName;
import org.alfresco.filesys.server.filesys.SearchContext; import org.alfresco.filesys.server.filesys.SearchContext;
import org.alfresco.filesys.util.WildCard; import org.alfresco.filesys.util.WildCard;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor; import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
@@ -45,18 +46,27 @@ public class AVMSearchContext extends SearchContext {
private WildCard m_filter; private WildCard m_filter;
// Relative path to the parent folder being searched
private String m_parentPath;
/** /**
* Class constructor * Class constructor
* *
* @param fileList SortedMap<String, AVMNodeDescriptor> * @param fileList SortedMap<String, AVMNodeDescriptor>
* @param attrib int * @param attrib int
* @param filter WildCard * @param filter WildCard
* @param parentPath String
*/ */
public AVMSearchContext( AVMNodeDescriptor[] fileList, int attrib, WildCard filter) public AVMSearchContext( AVMNodeDescriptor[] fileList, int attrib, WildCard filter, String parentPath)
{ {
m_attrib = attrib; m_attrib = attrib;
m_filter = filter; m_filter = filter;
m_fileList = fileList; m_fileList = fileList;
m_parentPath = parentPath;
if ( m_parentPath != null && m_parentPath.endsWith( FileName.DOS_SEPERATOR_STR) == false)
m_parentPath = m_parentPath + FileName.DOS_SEPERATOR_STR;
} }
/** /**
@@ -163,6 +173,13 @@ public class AVMSearchContext extends SearchContext {
attr += FileAttribute.Hidden; attr += FileAttribute.Hidden;
info.setFileAttributes( attr); info.setFileAttributes( attr);
// Generate a file id for the current file
StringBuilder pathStr = new StringBuilder( m_parentPath);
pathStr.append ( curFile.getName());
info.setFileId( pathStr.toString().hashCode());
} }
// Indicate if the file information is valid // Indicate if the file information is valid

View File

@@ -39,14 +39,20 @@ public class AVMSingleFileSearchContext extends SearchContext {
private boolean m_endOfSearch; private boolean m_endOfSearch;
// Relative path to the file/folder
private String m_relativePath;
/** /**
* Class constructor * Class constructor
* *
* @param fileDetails AVMNodeDescriptor * @param fileDetails AVMNodeDescriptor
* @param relPath String
*/ */
public AVMSingleFileSearchContext( AVMNodeDescriptor fileDetails) public AVMSingleFileSearchContext( AVMNodeDescriptor fileDetails, String relPath)
{ {
m_fileDetails = fileDetails; m_fileDetails = fileDetails;
m_relativePath = relPath;
} }
/** /**
@@ -102,6 +108,7 @@ public class AVMSingleFileSearchContext extends SearchContext {
attr += FileAttribute.Hidden; attr += FileAttribute.Hidden;
info.setFileAttributes( attr); info.setFileAttributes( attr);
info.setFileId( m_relativePath.hashCode());
// Set the end of search flag, indicate that the file informatin is valid // Set the end of search flag, indicate that the file informatin is valid

View File

@@ -502,7 +502,7 @@ public abstract class SrvSession
* @return boolean * @return boolean
* @exception AlfrescoRuntimeException * @exception AlfrescoRuntimeException
*/ */
public final boolean beginTransaction(TransactionService transService, boolean readOnly) private final boolean beginTransaction(TransactionService transService, boolean readOnly)
throws AlfrescoRuntimeException throws AlfrescoRuntimeException
{ {
boolean created = false; boolean created = false;

View File

@@ -554,7 +554,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{ {
// Get the file information for the node // Get the file information for the node
session.beginTransaction(transactionService, true); session.beginReadTransaction(transactionService);
finfo = cifsHelper.getFileInformation(nodeRef); finfo = cifsHelper.getFileInformation(nodeRef);
} }
@@ -582,7 +582,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
{ {
// Create the transaction // Create the transaction
session.beginTransaction(transactionService, true); session.beginReadTransaction(transactionService);
// Get the node for the folder path // Get the node for the folder path