mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
ALF-10941 - CIFS Open file from excel
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@32068 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -48,9 +48,10 @@ public interface RepositoryDiskInterface
|
||||
* @param rootNode
|
||||
* @param fromPath - the source node
|
||||
* @param toPath - the target node
|
||||
* @param allocationSize size to allocate for new file
|
||||
* @throws FileNotFoundException
|
||||
*/
|
||||
public NetworkFile createFile(NodeRef rootNode, String Path) throws IOException;
|
||||
public NetworkFile createFile(NodeRef rootNode, String Path, long allocationSize) throws IOException;
|
||||
|
||||
/**
|
||||
* CloseFile.
|
||||
|
@@ -236,7 +236,8 @@ public class BufferedContentDiskDriver implements ExtendedDiskInterface,
|
||||
FileInfo info = getFileInformationInternal(sess, tree, path);
|
||||
|
||||
/*
|
||||
* Some information is not maintained by the repo
|
||||
* Some information is not maintained by the repo and represents an in-progress update.
|
||||
* For example as a file is being written the modification and access dates change.
|
||||
*/
|
||||
if(tctx.hasStateCache())
|
||||
{
|
||||
@@ -246,14 +247,19 @@ public class BufferedContentDiskDriver implements ExtendedDiskInterface,
|
||||
{
|
||||
if(logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("state cache available - overwriting from state cache");
|
||||
logger.debug("state cache available - overwriting from state cache: isDirectory=" +info.isDirectory());
|
||||
}
|
||||
FileInfo finfo = new FileInfo();
|
||||
finfo.copyFrom(info);
|
||||
|
||||
/**
|
||||
* File state is probably stale for directories which is why we don't attempt to
|
||||
* cache.
|
||||
*/
|
||||
if(!info.isDirectory())
|
||||
{
|
||||
/*
|
||||
* TODO what if file state cache is stale?
|
||||
* We are over-writing the "real" value here.
|
||||
* What about stale file state values here?
|
||||
*/
|
||||
if(fstate.hasFileSize())
|
||||
{
|
||||
@@ -287,23 +293,29 @@ public class BufferedContentDiskDriver implements ExtendedDiskInterface,
|
||||
}
|
||||
finfo.setModifyDateTime(fstate.getModifyDateTime());
|
||||
}
|
||||
|
||||
// if ( fstate.hasAllocationSize() && fstate.getAllocationSize() > info.getAllocationSize())
|
||||
// {
|
||||
// finfo.setAllocationSize( fstate.getAllocationSize());
|
||||
// }
|
||||
if ( fstate.hasAllocationSize())
|
||||
{
|
||||
if(logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("replace allocation size" + finfo.getAllocationSize() + " with " + fstate.getAllocationSize());
|
||||
}
|
||||
finfo.setAllocationSize(fstate.getAllocationSize());
|
||||
}
|
||||
}
|
||||
|
||||
if(logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("getFileInformation path" + path + ", returning:" + finfo +
|
||||
", readOnly:" +finfo.isReadOnly() +
|
||||
", fileId:" +finfo.getFileId() +
|
||||
", fileSize:" +finfo.getSize() +
|
||||
", directoryId:" + finfo.getDirectoryId() +
|
||||
", createdDate: " + finfo.getCreationDateTime() +
|
||||
", accessDate:" + new Date(finfo.getAccessDateTime()) +
|
||||
", modifiedDate:" + new Date(finfo.getModifyDateTime()) +
|
||||
", changeDate:" + new Date(finfo.getChangeDateTime()) +
|
||||
", mode" + finfo.getMode());
|
||||
", fileAttributes: 0x"+ Integer.toHexString(info.getFileAttributes()) +
|
||||
", mode: 0x" + Integer.toHexString(finfo.getMode()));
|
||||
}
|
||||
|
||||
return finfo;
|
||||
@@ -414,6 +426,14 @@ public class BufferedContentDiskDriver implements ExtendedDiskInterface,
|
||||
NetworkFile param) throws IOException
|
||||
{
|
||||
diskInterface.closeFile(sess, tree, param);
|
||||
|
||||
/**
|
||||
* If the fileInfo cache may have just had some content updated.
|
||||
*/
|
||||
if(!param.isDirectory() && !param.isReadOnly())
|
||||
{
|
||||
fileInfoCache.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -33,6 +33,7 @@ import org.alfresco.error.AlfrescoRuntimeException;
|
||||
import org.alfresco.jlan.server.filesys.FileAttribute;
|
||||
import org.alfresco.jlan.server.filesys.FileExistsException;
|
||||
import org.alfresco.jlan.server.filesys.FileName;
|
||||
import org.alfresco.jlan.server.filesys.FileType;
|
||||
import org.alfresco.jlan.util.WildCard;
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.repo.model.filefolder.FileFolderServiceImpl;
|
||||
@@ -212,6 +213,7 @@ public class CifsHelper
|
||||
// add directory attribute
|
||||
fileAttributes |= FileAttribute.Directory;
|
||||
fileInfo.setFileAttributes(fileAttributes);
|
||||
fileInfo.setFileType(FileType.Directory);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@@ -196,7 +196,7 @@ public class CommandExecutorImpl implements CommandExecutor
|
||||
{
|
||||
logger.debug("create file command");
|
||||
CreateFileCommand create = (CreateFileCommand)command;
|
||||
return repositoryDiskInterface.createFile(create.getRootNode(), create.getPath());
|
||||
return repositoryDiskInterface.createFile(create.getRootNode(), create.getPath(), create.getAllocationSize());
|
||||
}
|
||||
else if(command instanceof DeleteFileCommand)
|
||||
{
|
||||
|
@@ -1035,14 +1035,6 @@ public class ContentDiskDriver2 extends AlfrescoDiskDriver implements ExtendedD
|
||||
logger.debug("open file for read only");
|
||||
netFile = ContentNetworkFile.createFile(nodeService, contentService, mimetypeService, getCifsHelper(), nodeRef, params, session);
|
||||
|
||||
if(!netFile.isReadOnly())
|
||||
{
|
||||
logger.debug("work around");
|
||||
// Bug work around fix for read only stuff
|
||||
int attrib = netFile.getFileAttributes();
|
||||
attrib = attrib + FileAttribute.ReadOnly;
|
||||
netFile.setAttributes(attrib);
|
||||
}
|
||||
}
|
||||
else if(params.isReadWriteAccess())
|
||||
{
|
||||
@@ -1237,7 +1229,6 @@ public class ContentDiskDriver2 extends AlfrescoDiskDriver implements ExtendedD
|
||||
/**
|
||||
* Create a new file on the file system.
|
||||
*
|
||||
*
|
||||
* @param sess Server session
|
||||
* @param tree Tree connection
|
||||
* @param params File create parameters
|
||||
@@ -1246,130 +1237,8 @@ public class ContentDiskDriver2 extends AlfrescoDiskDriver implements ExtendedD
|
||||
*/
|
||||
public NetworkFile createFile(SrvSession sess, final TreeConnection tree, final FileOpenParams params) throws IOException
|
||||
{
|
||||
// Obsolete
|
||||
return null;
|
||||
// final ContentContext ctx = (ContentContext) tree.getContext();
|
||||
//
|
||||
// if (logger.isDebugEnabled())
|
||||
// {
|
||||
// logger.debug("createFile :" + params);
|
||||
// }
|
||||
//
|
||||
// try
|
||||
// {
|
||||
// // Get the device root
|
||||
//
|
||||
// NodeRef deviceRootNodeRef = ctx.getRootNode();
|
||||
//
|
||||
// String path = params.getPath();
|
||||
// //String parentPath = path;
|
||||
//
|
||||
// // MER NEW CODE BELOW
|
||||
// //NodeRef parentNodeRef = cifsHelper.getNodeRef(deviceRootNodeRef, parentPath);
|
||||
//
|
||||
// // TODO Check whether node already exists
|
||||
//
|
||||
// // TODO Check permissions to create new node
|
||||
// //ContentWriter writer = contentService.getTempWriter();
|
||||
//
|
||||
// //File file = TempFileProvider.createTempFile("cifs", ".bin");
|
||||
//
|
||||
// //TempNetworkFile netFile = new TempNetworkFile(file, path);
|
||||
//
|
||||
// //netFile.setFileId(12345);
|
||||
//
|
||||
// //tempFiles.put(path, netFile);
|
||||
//
|
||||
// //if(logger.isDebugEnabled())
|
||||
// //{
|
||||
// // logger.debug("temp network file created:" + file);
|
||||
// //}
|
||||
// // MER NEW CODE ABOVE
|
||||
//
|
||||
// NodeRef nodeRef = cifsHelper.createNode(deviceRootNodeRef, path, ContentModel.TYPE_CONTENT);
|
||||
//
|
||||
// nodeService.addAspect(nodeRef, ContentModel.ASPECT_NO_CONTENT, null);
|
||||
//
|
||||
// // Create the network file
|
||||
//
|
||||
// ContentNetworkFile netFile = ContentNetworkFile.createFile(nodeService, contentService, mimetypeService, getCifsHelper(), nodeRef, params, sess);
|
||||
//
|
||||
// // Always allow write access to a newly created file
|
||||
//
|
||||
// netFile.setGrantedAccess(NetworkFile.READWRITE);
|
||||
//
|
||||
// // Set the owner process id for this open file
|
||||
//
|
||||
// netFile.setProcessId( params.getProcessId());
|
||||
//
|
||||
// // Truncate the file so that the content stream is created
|
||||
// netFile.truncateFile( 0L);
|
||||
//
|
||||
// // Generate a file id for the file
|
||||
//
|
||||
// if ( netFile != null)
|
||||
// {
|
||||
// long id = DefaultTypeConverter.INSTANCE.convert(Long.class, nodeService.getProperty(netFile.getNodeRef(), ContentModel.PROP_NODE_DBID));
|
||||
// netFile.setFileId((int) (id & 0xFFFFFFFFL));
|
||||
// }
|
||||
//
|
||||
// if (logger.isDebugEnabled())
|
||||
// {
|
||||
// logger.debug("Created file: path=" + params.getPath() + " file open parameters=" + params + " node=" + nodeRef + " network file=" + netFile);
|
||||
// }
|
||||
//
|
||||
// // Return the new network file
|
||||
//
|
||||
// return netFile;
|
||||
// }
|
||||
// catch (org.alfresco.repo.security.permissions.AccessDeniedException ex)
|
||||
// {
|
||||
// // Debug
|
||||
//
|
||||
// if ( logger.isDebugEnabled())
|
||||
// {
|
||||
// logger.debug("Create file - access denied, " + params.getFullPath());
|
||||
// }
|
||||
//
|
||||
// // Convert to a filesystem access denied status
|
||||
//
|
||||
// throw new AccessDeniedException("Unable to create file " + params.getFullPath());
|
||||
// }
|
||||
// catch (IOException ex)
|
||||
// {
|
||||
// // Debug
|
||||
//
|
||||
// if ( logger.isDebugEnabled())
|
||||
// {
|
||||
// logger.debug("Create file - content I/O error, " + params.getFullPath());
|
||||
// }
|
||||
//
|
||||
// throw ex;
|
||||
// }
|
||||
// catch (ContentIOException ex)
|
||||
// {
|
||||
// // Debug
|
||||
//
|
||||
// if ( logger.isDebugEnabled())
|
||||
// {
|
||||
// logger.debug("Create file - content I/O error, " + params.getFullPath());
|
||||
// }
|
||||
// // Convert to a filesystem disk full status
|
||||
//
|
||||
// throw new DiskFullException("Unable to create file " + params.getFullPath());
|
||||
// }
|
||||
// catch (AlfrescoRuntimeException ex)
|
||||
// {
|
||||
// // Debug
|
||||
//
|
||||
// if ( logger.isDebugEnabled())
|
||||
// {
|
||||
// logger.debug("Create file error", ex);
|
||||
// }
|
||||
//
|
||||
// // Convert to a general I/O exception
|
||||
//
|
||||
// throw new IOException("Unable to create file " + params.getFullPath(), ex);
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2699,7 +2568,7 @@ public class ContentDiskDriver2 extends AlfrescoDiskDriver implements ExtendedD
|
||||
}
|
||||
|
||||
@Override
|
||||
public NetworkFile createFile(NodeRef rootNode, String path)
|
||||
public NetworkFile createFile(NodeRef rootNode, String path, long allocationSize)
|
||||
throws IOException
|
||||
{
|
||||
|
||||
@@ -2743,8 +2612,7 @@ public class ContentDiskDriver2 extends AlfrescoDiskDriver implements ExtendedD
|
||||
netFile.setGrantedAccess(NetworkFile.READWRITE);
|
||||
netFile.setAllowedAccess(NetworkFile.READWRITE);
|
||||
|
||||
// Truncate the file so that the content stream is created
|
||||
//netFile.truncateFile( 0L);
|
||||
|
||||
|
||||
// Generate a file id for the file
|
||||
|
||||
|
@@ -108,7 +108,13 @@ public class LegacyFileStateDriver implements ExtendedDiskInterface
|
||||
|
||||
// Indicate that the file is open
|
||||
fstate.setFileStatus(newFile.isDirectory()? FileStatus.DirectoryExists : FileStatus.FileExists);
|
||||
fstate.setAllocationSize( params.getAllocationSize());
|
||||
|
||||
long allocationSize = params.getAllocationSize();
|
||||
if(allocationSize > 0)
|
||||
{
|
||||
fstate.setAllocationSize(allocationSize);
|
||||
fstate.setFileSize(allocationSize);
|
||||
}
|
||||
|
||||
if (newFile instanceof NodeRefNetworkFile)
|
||||
{
|
||||
@@ -201,7 +207,8 @@ public class LegacyFileStateDriver implements ExtendedDiskInterface
|
||||
fstate.setProcessId(params.getProcessId());
|
||||
fstate.setSharedAccess( params.getSharedAccess());
|
||||
fstate.setFileStatus(FileStatus.FileExists);
|
||||
fstate.updateAccessDateTime();
|
||||
// Access date time is read/write time not open time
|
||||
// fstate.updateAccessDateTime();
|
||||
|
||||
fstate.setFileSize(x.getFileSize());
|
||||
fstate.updateChangeDateTime(x.getModifyDate());
|
||||
@@ -221,7 +228,8 @@ public class LegacyFileStateDriver implements ExtendedDiskInterface
|
||||
fstate.setFileStatus(FileStatus.FileExists);
|
||||
fstate.setProcessId(params.getProcessId());
|
||||
fstate.setSharedAccess( params.getSharedAccess());
|
||||
fstate.updateAccessDateTime();
|
||||
// access date time is read/write time not open time
|
||||
//fstate.updateAccessDateTime();
|
||||
|
||||
fstate.setFileSize(x.getFileSize());
|
||||
fstate.updateChangeDateTime(x.getModifyDate());
|
||||
@@ -240,7 +248,8 @@ public class LegacyFileStateDriver implements ExtendedDiskInterface
|
||||
fstate.setFileStatus(FileStatus.DirectoryExists);
|
||||
fstate.setProcessId(params.getProcessId());
|
||||
fstate.setSharedAccess( params.getSharedAccess());
|
||||
fstate.updateAccessDateTime();
|
||||
// Access date time is read/write time not open time
|
||||
//fstate.updateAccessDateTime();
|
||||
|
||||
fstate.setFileSize(x.getFileSize());
|
||||
fstate.updateChangeDateTime(x.getModifyDate());
|
||||
@@ -289,11 +298,15 @@ public class LegacyFileStateDriver implements ExtendedDiskInterface
|
||||
FileStateCache cache = tctx.getStateCache();
|
||||
FileState fstate = cache.findFileState( param.getFullName(), true);
|
||||
|
||||
// MER Experiment Need to reset shared access
|
||||
if(fstate.getOpenCount() ==0 )
|
||||
{
|
||||
logger.debug("reset shared access to READWRITEDELETE");
|
||||
fstate.setSharedAccess( SharingMode.READWRITE + SharingMode.DELETE);
|
||||
|
||||
fstate.setAllocationSize(-1);
|
||||
fstate.setFileSize(-1);
|
||||
fstate.updateChangeDateTime(0);
|
||||
fstate.updateModifyDateTime(0);
|
||||
}
|
||||
|
||||
if(fstate != null && param.getAccessToken() != null)
|
||||
|
@@ -194,7 +194,7 @@ public class NonTransactionalRuleContentDiskDriver implements ExtendedDiskInterf
|
||||
+ ", requestExclusiveOpLock:" +params.requestExclusiveOpLock()
|
||||
+ ", isDeleteOnClose:" +params.isDeleteOnClose()
|
||||
+ ", sharedAccess: " + strSharedAccess
|
||||
+ " allocationSize: " + params.getAllocationSize());
|
||||
+ ", allocationSize: " + params.getAllocationSize());
|
||||
}
|
||||
|
||||
long creationDateTime = params.getCreationDateTime();
|
||||
@@ -213,7 +213,7 @@ public class NonTransactionalRuleContentDiskDriver implements ExtendedDiskInterf
|
||||
DriverState driverState = getDriverState(sess);
|
||||
EvaluatorContext ctx = getEvaluatorContext(driverState, folder);
|
||||
|
||||
Operation o = new CreateFileOperation(file, rootNode, params.getPath());
|
||||
Operation o = new CreateFileOperation(file, rootNode, params.getPath(), params.getAllocationSize());
|
||||
Command c = ruleEvaluator.evaluate(ctx, o);
|
||||
|
||||
Object ret = commandExecutor.execute(sess, tree, c);
|
||||
|
@@ -155,7 +155,7 @@ class ScenarioOpenFileInstance implements ScenarioInstance
|
||||
{
|
||||
ArrayList<Command> commands = new ArrayList<Command>();
|
||||
ArrayList<Command> postCommitCommands = new ArrayList<Command>();
|
||||
commands.add(new CreateFileCommand(c.getName(), c.getRootNodeRef(), c.getPath()));
|
||||
commands.add(new CreateFileCommand(c.getName(), c.getRootNodeRef(), c.getPath(), c.getAllocationSize()));
|
||||
postCommitCommands.add(newOpenFileCallbackCommand());
|
||||
return new CompoundCommand(commands, postCommitCommands);
|
||||
}
|
||||
@@ -410,7 +410,9 @@ class ScenarioOpenFileInstance implements ScenarioInstance
|
||||
|
||||
state = InternalState.OPEN;
|
||||
|
||||
if(fileHandle.isReadOnly())
|
||||
//
|
||||
if(fileHandle.getGrantedAccess() == NetworkFile.READONLY)
|
||||
//if(fileHandle.isReadOnly())
|
||||
{
|
||||
openReadOnlyCount++;
|
||||
fileHandleReadOnly=fileHandle;
|
||||
|
@@ -56,7 +56,7 @@ public class ScenarioSimpleNonBufferedInstance implements ScenarioInstance
|
||||
if(operation instanceof CreateFileOperation)
|
||||
{
|
||||
CreateFileOperation c = (CreateFileOperation)operation;
|
||||
return new CreateFileCommand(c.getName(), c.getRootNodeRef(), c.getPath());
|
||||
return new CreateFileCommand(c.getName(), c.getRootNodeRef(), c.getPath(), c.getAllocationSize());
|
||||
}
|
||||
else if(operation instanceof DeleteFileOperation)
|
||||
{
|
||||
|
@@ -32,12 +32,14 @@ public class CreateFileCommand implements Command
|
||||
private String name;
|
||||
private NodeRef rootNode;
|
||||
private String path;
|
||||
private long allocationSize;
|
||||
|
||||
public CreateFileCommand(String name, NodeRef rootNode, String path)
|
||||
public CreateFileCommand(String name, NodeRef rootNode, String path, long allocationSize)
|
||||
{
|
||||
this.name = name;
|
||||
this.path = path;
|
||||
this.rootNode = rootNode;
|
||||
this.allocationSize = allocationSize;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
@@ -62,4 +64,14 @@ public class CreateFileCommand implements Command
|
||||
return TxnReadState.TXN_READ_WRITE;
|
||||
}
|
||||
|
||||
public void setAllocationSize(long allocationSize)
|
||||
{
|
||||
this.allocationSize = allocationSize;
|
||||
}
|
||||
|
||||
public long getAllocationSize()
|
||||
{
|
||||
return allocationSize;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -31,12 +31,14 @@ public class CreateFileOperation implements Operation
|
||||
private String name;
|
||||
private NodeRef rootNodeRef;
|
||||
private String path;
|
||||
private long allocationSize;
|
||||
|
||||
public CreateFileOperation(String name, NodeRef rootNodeRef, String path)
|
||||
public CreateFileOperation(String name, NodeRef rootNodeRef, String path, long allocationSize)
|
||||
{
|
||||
this.name = name;
|
||||
this.rootNodeRef = rootNodeRef;
|
||||
this.path = path;
|
||||
this.allocationSize = allocationSize;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
@@ -76,4 +78,14 @@ public class CreateFileOperation implements Operation
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setAllocationSize(long allocationSize)
|
||||
{
|
||||
this.allocationSize = allocationSize;
|
||||
}
|
||||
|
||||
public long getAllocationSize()
|
||||
{
|
||||
return allocationSize;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user