Added delete file and mark for delete support for pseudo files.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2321 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Gary Spencer
2006-02-08 16:07:13 +00:00
parent 1c0c31e10e
commit 3bb2dd29ea
6 changed files with 138 additions and 30 deletions

View File

@@ -51,9 +51,11 @@ import org.alfresco.filesys.smb.server.SMBSrvSession;
import org.alfresco.filesys.smb.server.repo.FileState.FileStateStatus; import org.alfresco.filesys.smb.server.repo.FileState.FileStateStatus;
import org.alfresco.filesys.smb.server.repo.pseudo.ContentPseudoFileImpl; import org.alfresco.filesys.smb.server.repo.pseudo.ContentPseudoFileImpl;
import org.alfresco.filesys.smb.server.repo.pseudo.LocalPseudoFile; import org.alfresco.filesys.smb.server.repo.pseudo.LocalPseudoFile;
import org.alfresco.filesys.smb.server.repo.pseudo.MemoryNetworkFile;
import org.alfresco.filesys.smb.server.repo.pseudo.PseudoFile; import org.alfresco.filesys.smb.server.repo.pseudo.PseudoFile;
import org.alfresco.filesys.smb.server.repo.pseudo.PseudoFileInterface; import org.alfresco.filesys.smb.server.repo.pseudo.PseudoFileInterface;
import org.alfresco.filesys.smb.server.repo.pseudo.PseudoFileList; import org.alfresco.filesys.smb.server.repo.pseudo.PseudoFileList;
import org.alfresco.filesys.smb.server.repo.pseudo.PseudoNetworkFile;
import org.alfresco.filesys.util.DataBuffer; import org.alfresco.filesys.util.DataBuffer;
import org.alfresco.filesys.util.WildCard; import org.alfresco.filesys.util.WildCard;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
@@ -1333,40 +1335,59 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface
// Remove the node if marked for delete // Remove the node if marked for delete
if (file.hasDeleteOnClose() && file instanceof ContentNetworkFile) if (file.hasDeleteOnClose())
{ {
ContentNetworkFile contentNetFile = (ContentNetworkFile) file; // Check if the file is a content file
NodeRef nodeRef = contentNetFile.getNodeRef();
// We don't know how long the network file has had the reference, so check for existence if ( file instanceof ContentNetworkFile)
if (nodeService.exists(nodeRef))
{ {
try ContentNetworkFile contentNetFile = (ContentNetworkFile) file;
NodeRef nodeRef = contentNetFile.getNodeRef();
// We don't know how long the network file has had the reference, so check for existence
if (nodeService.exists(nodeRef))
{ {
// Delete the file try
{
nodeService.deleteNode(nodeRef); // Delete the file
// Remove the file state nodeService.deleteNode(nodeRef);
if ( ctx.hasStateTable()) // Remove the file state
ctx.getStateTable().removeFileState(file.getFullName());
if ( ctx.hasStateTable())
ctx.getStateTable().removeFileState(file.getFullName());
}
catch (org.alfresco.repo.security.permissions.AccessDeniedException ex)
{
// Debug
if ( logger.isDebugEnabled())
logger.debug("Delete on close - access denied, " + file.getFullName());
// Convert to a filesystem access denied exception
throw new AccessDeniedException("Delete on close " + file.getFullName());
}
} }
catch (org.alfresco.repo.security.permissions.AccessDeniedException ex) }
else if ( file instanceof PseudoNetworkFile ||
file instanceof MemoryNetworkFile)
{
// Delete the pseudo file
if ( hasPseudoFileInterface())
{ {
// Debug // Delete the pseudo file
if ( logger.isDebugEnabled()) getPseudoFileInterface().deletePseudoFile( sess, tree, file.getFullName());
logger.debug("Delete on close - access denied, " + file.getFullName());
// Convert to a filesystem access denied exception
throw new AccessDeniedException("Delete on close " + file.getFullName());
} }
} }
} }
// done
// DEBUG
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
{ {
logger.debug("Closed file: \n" + logger.debug("Closed file: \n" +
@@ -1634,6 +1655,16 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface
{ {
try try
{ {
// Check if pseudo files are enabled
if ( hasPseudoFileInterface() &&
getPseudoFileInterface().isPseudoFile( sess, tree, name))
{
// Allow the file information to be changed
return;
}
// Get the file/folder node // Get the file/folder node
NodeRef nodeRef = getNodeForPath(tree, name); NodeRef nodeRef = getNodeForPath(tree, name);

View File

@@ -45,7 +45,7 @@ public class FileState
// File state constants // File state constants
public final static long NoTimeout = -1L; public final static long NoTimeout = -1L;
public final static long DefTimeout = 5 * 60000L; // 5 minutes public final static long DefTimeout = 2 * 60000L; // 2 minutes
public final static long RenameTimeout = 1 * 60000L; // 1 minute public final static long RenameTimeout = 1 * 60000L; // 1 minute
// File status // File status
@@ -324,7 +324,9 @@ public class FileState
*/ */
public final boolean hasPseudoFiles() public final boolean hasPseudoFiles()
{ {
return m_pseudoFiles != null ? true : false; if ( m_pseudoFiles != null)
return m_pseudoFiles.numberOfFiles() > 0;
return false;
} }
/** /**

View File

@@ -195,6 +195,34 @@ public class ContentPseudoFileImpl implements PseudoFileInterface
return pseudoCnt; return pseudoCnt;
} }
/**
* Delete a pseudo file
*
* @param sess SrvSession
* @param tree TreeConnection
* @param path String
*/
public void deletePseudoFile(SrvSession sess, TreeConnection tree, String path)
{
// Access the device context
ContentContext ctx = (ContentContext) tree.getContext();
// Get the file state for the parent folder
String[] paths = FileName.splitPath( path);
FileState fstate = getStateForPath( ctx, paths[0]);
// Check if the folder has any pseudo files
if ( fstate == null || fstate.hasPseudoFiles() == false)
return;
// Remove the pseudo file from the list
fstate.getPseudoFileList().removeFile( paths[1], false);
}
/** /**
* Return the file state for the specified path * Return the file state for the specified path

View File

@@ -17,9 +17,7 @@
package org.alfresco.filesys.smb.server.repo.pseudo; package org.alfresco.filesys.smb.server.repo.pseudo;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.RandomAccessFile;
import org.alfresco.filesys.server.filesys.AccessDeniedException; import org.alfresco.filesys.server.filesys.AccessDeniedException;
import org.alfresco.filesys.server.filesys.FileInfo; import org.alfresco.filesys.server.filesys.FileInfo;

View File

@@ -18,8 +18,6 @@
package org.alfresco.filesys.smb.server.repo.pseudo; package org.alfresco.filesys.smb.server.repo.pseudo;
import org.alfresco.filesys.server.SrvSession; import org.alfresco.filesys.server.SrvSession;
import org.alfresco.filesys.server.filesys.DiskDeviceContext;
import org.alfresco.filesys.server.filesys.DiskInterface;
import org.alfresco.filesys.server.filesys.TreeConnection; import org.alfresco.filesys.server.filesys.TreeConnection;
/** /**
@@ -60,4 +58,13 @@ public interface PseudoFileInterface
* @return int * @return int
*/ */
public int addPseudoFilesToFolder(SrvSession sess, TreeConnection tree, String path); public int addPseudoFilesToFolder(SrvSession sess, TreeConnection tree, String path);
/**
* Delete a pseudo file
*
* @param sess SrvSession
* @param tree TreeConnection
* @param path String
*/
public void deletePseudoFile(SrvSession sess, TreeConnection tree, String path);
} }

View File

@@ -102,4 +102,46 @@ public class PseudoFileList
return null; return null;
} }
/**
* Remove the specified pseudo file from the list
*
* @param fname String
* @param caseSensitive boolean
* @return PseudoFile
*/
public final PseudoFile removeFile( String fname, boolean caseSensitive)
{
// Check if there are any entries in the list
if ( m_list == null || m_list.size() == 0)
return null;
// Search for the name match
for ( int idx = 0; idx < m_list.size(); idx++)
{
// Get the current pseudo file
PseudoFile pfile = m_list.get( idx);
boolean match = false;
if ( caseSensitive && pfile.getFileName().equals( fname))
match = true;
else if ( pfile.getFileName().equalsIgnoreCase( fname))
match = true;
// If we found the matching pseudo file remove it from the list
if ( match)
{
m_list.remove( idx);
return pfile;
}
}
// File not found
return null;
}
} }