diff --git a/source/java/org/alfresco/filesys/alfresco/RepositoryDiskInterface.java b/source/java/org/alfresco/filesys/alfresco/RepositoryDiskInterface.java index 878a43f612..9a0a5b01a6 100644 --- a/source/java/org/alfresco/filesys/alfresco/RepositoryDiskInterface.java +++ b/source/java/org/alfresco/filesys/alfresco/RepositoryDiskInterface.java @@ -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. diff --git a/source/java/org/alfresco/filesys/repo/BufferedContentDiskDriver.java b/source/java/org/alfresco/filesys/repo/BufferedContentDiskDriver.java index e463845f99..be80fc7653 100644 --- a/source/java/org/alfresco/filesys/repo/BufferedContentDiskDriver.java +++ b/source/java/org/alfresco/filesys/repo/BufferedContentDiskDriver.java @@ -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,64 +247,75 @@ 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); - - /* - * TODO what if file state cache is stale? - * We are over-writing the "real" value here. - */ - if(fstate.hasFileSize()) - { - if(logger.isDebugEnabled()) + + /** + * File state is probably stale for directories which is why we don't attempt to + * cache. + */ + if(!info.isDirectory()) + { + /* + * What about stale file state values here? + */ + if(fstate.hasFileSize()) { - logger.debug("replace file size " + info.getSize() + " with " + fstate.getFileSize()); + if(logger.isDebugEnabled()) + { + logger.debug("replace file size " + info.getSize() + " with " + fstate.getFileSize()); + } + finfo.setFileSize(fstate.getFileSize()); } - finfo.setFileSize(fstate.getFileSize()); - } - if ( fstate.hasAccessDateTime()) - { - if(logger.isDebugEnabled()) + if ( fstate.hasAccessDateTime()) { - logger.debug("replace access date " + new Date(finfo.getAccessDateTime()) + " with " + new Date(fstate.getAccessDateTime())); + if(logger.isDebugEnabled()) + { + logger.debug("replace access date " + new Date(finfo.getAccessDateTime()) + " with " + new Date(fstate.getAccessDateTime())); + } + finfo.setAccessDateTime(fstate.getAccessDateTime()); } - finfo.setAccessDateTime(fstate.getAccessDateTime()); - } - if ( fstate.hasChangeDateTime()) - { - if(logger.isDebugEnabled()) + if ( fstate.hasChangeDateTime()) { - logger.debug("replace change date " + new Date(finfo.getChangeDateTime()) + " with " + new Date(fstate.getChangeDateTime())); + if(logger.isDebugEnabled()) + { + logger.debug("replace change date " + new Date(finfo.getChangeDateTime()) + " with " + new Date(fstate.getChangeDateTime())); + } + finfo.setChangeDateTime(fstate.getChangeDateTime()); } - finfo.setChangeDateTime(fstate.getChangeDateTime()); - } - if ( fstate.hasModifyDateTime()) - { - if(logger.isDebugEnabled()) + if ( fstate.hasModifyDateTime()) { - logger.debug("replace modified date " + new Date(finfo.getModifyDateTime()) + " with " + new Date(fstate.getModifyDateTime())); + if(logger.isDebugEnabled()) + { + logger.debug("replace modified date " + new Date(finfo.getModifyDateTime()) + " with " + new Date(fstate.getModifyDateTime())); + } + finfo.setModifyDateTime(fstate.getModifyDateTime()); + } + if ( fstate.hasAllocationSize()) + { + if(logger.isDebugEnabled()) + { + logger.debug("replace allocation size" + finfo.getAllocationSize() + " with " + fstate.getAllocationSize()); + } + finfo.setAllocationSize(fstate.getAllocationSize()); } - finfo.setModifyDateTime(fstate.getModifyDateTime()); } - -// if ( fstate.hasAllocationSize() && fstate.getAllocationSize() > info.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 diff --git a/source/java/org/alfresco/filesys/repo/CifsHelper.java b/source/java/org/alfresco/filesys/repo/CifsHelper.java index e1643894e0..e09e45f1c9 100644 --- a/source/java/org/alfresco/filesys/repo/CifsHelper.java +++ b/source/java/org/alfresco/filesys/repo/CifsHelper.java @@ -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 { diff --git a/source/java/org/alfresco/filesys/repo/CommandExecutorImpl.java b/source/java/org/alfresco/filesys/repo/CommandExecutorImpl.java index 5147cf0a35..8cc6de08c7 100644 --- a/source/java/org/alfresco/filesys/repo/CommandExecutorImpl.java +++ b/source/java/org/alfresco/filesys/repo/CommandExecutorImpl.java @@ -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) { diff --git a/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java b/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java index 57f58e64f4..80276acf3c 100644 --- a/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java +++ b/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java @@ -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 { @@ -2742,9 +2611,8 @@ public class ContentDiskDriver2 extends AlfrescoDiskDriver implements ExtendedD // Always allow write access to a newly created file 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 diff --git a/source/java/org/alfresco/filesys/repo/LegacyFileStateDriver.java b/source/java/org/alfresco/filesys/repo/LegacyFileStateDriver.java index 4f4562bfef..53193fd796 100644 --- a/source/java/org/alfresco/filesys/repo/LegacyFileStateDriver.java +++ b/source/java/org/alfresco/filesys/repo/LegacyFileStateDriver.java @@ -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) diff --git a/source/java/org/alfresco/filesys/repo/NonTransactionalRuleContentDiskDriver.java b/source/java/org/alfresco/filesys/repo/NonTransactionalRuleContentDiskDriver.java index c04a36b4bb..0d45468337 100644 --- a/source/java/org/alfresco/filesys/repo/NonTransactionalRuleContentDiskDriver.java +++ b/source/java/org/alfresco/filesys/repo/NonTransactionalRuleContentDiskDriver.java @@ -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); diff --git a/source/java/org/alfresco/filesys/repo/rules/ScenarioOpenFileInstance.java b/source/java/org/alfresco/filesys/repo/rules/ScenarioOpenFileInstance.java index 3db966b35f..f568db082d 100644 --- a/source/java/org/alfresco/filesys/repo/rules/ScenarioOpenFileInstance.java +++ b/source/java/org/alfresco/filesys/repo/rules/ScenarioOpenFileInstance.java @@ -155,7 +155,7 @@ class ScenarioOpenFileInstance implements ScenarioInstance { ArrayList commands = new ArrayList(); ArrayList postCommitCommands = new ArrayList(); - 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; diff --git a/source/java/org/alfresco/filesys/repo/rules/ScenarioSimpleNonBufferedInstance.java b/source/java/org/alfresco/filesys/repo/rules/ScenarioSimpleNonBufferedInstance.java index 35b40263ef..e5b43068af 100644 --- a/source/java/org/alfresco/filesys/repo/rules/ScenarioSimpleNonBufferedInstance.java +++ b/source/java/org/alfresco/filesys/repo/rules/ScenarioSimpleNonBufferedInstance.java @@ -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) { diff --git a/source/java/org/alfresco/filesys/repo/rules/commands/CreateFileCommand.java b/source/java/org/alfresco/filesys/repo/rules/commands/CreateFileCommand.java index 214446e6c9..b2f4e40f65 100644 --- a/source/java/org/alfresco/filesys/repo/rules/commands/CreateFileCommand.java +++ b/source/java/org/alfresco/filesys/repo/rules/commands/CreateFileCommand.java @@ -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() @@ -61,5 +63,15 @@ public class CreateFileCommand implements Command { return TxnReadState.TXN_READ_WRITE; } + + public void setAllocationSize(long allocationSize) + { + this.allocationSize = allocationSize; + } + + public long getAllocationSize() + { + return allocationSize; + } } diff --git a/source/java/org/alfresco/filesys/repo/rules/operations/CreateFileOperation.java b/source/java/org/alfresco/filesys/repo/rules/operations/CreateFileOperation.java index a76804c2e7..275e461565 100644 --- a/source/java/org/alfresco/filesys/repo/rules/operations/CreateFileOperation.java +++ b/source/java/org/alfresco/filesys/repo/rules/operations/CreateFileOperation.java @@ -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; + } }