From 0a13a1f7aaec3538e1e5a3ba4506631b9e4d30b4 Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Fri, 1 Mar 2013 17:51:05 +0000 Subject: [PATCH] cifs : if restoring rather than creating, should replace empty contents. + new unit test git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@47458 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../filesys/repo/ContentDiskDriver2.java | 8 +- .../filesys/repo/ContentDiskDriverTest.java | 160 ++++++++++++++++++ .../ScenarioDeleteRenameOrCreateInstance.java | 3 + 3 files changed, 167 insertions(+), 4 deletions(-) diff --git a/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java b/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java index 845f696dbb..82f5305d0a 100644 --- a/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java +++ b/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java @@ -2320,9 +2320,7 @@ public class ContentDiskDriver2 extends AlfrescoDiskDriver implements ExtendedD ContentData targetData = (ContentData)targetProp; logger.debug("copy the existing mimetype"); prop = ContentData.setMimetype(data, targetData.getMimetype()); - } - - + } } } @@ -2330,8 +2328,10 @@ public class ContentDiskDriver2 extends AlfrescoDiskDriver implements ExtendedD } else { - // No content to set logger.debug("no content to save"); + // No content to set - need to remove old content + ContentWriter writer = contentService.getWriter(targetNodeRef, ContentModel.PROP_CONTENT, true); + writer.putContent(""); } } diff --git a/source/java/org/alfresco/filesys/repo/ContentDiskDriverTest.java b/source/java/org/alfresco/filesys/repo/ContentDiskDriverTest.java index 0c608b4f6c..1514fcfb75 100644 --- a/source/java/org/alfresco/filesys/repo/ContentDiskDriverTest.java +++ b/source/java/org/alfresco/filesys/repo/ContentDiskDriverTest.java @@ -6771,6 +6771,166 @@ public class ContentDiskDriverTest extends TestCase tran.doInTransaction(validateCB, true, true); } // Test Word 7 Explorer Update + /** + * 0. test.txt and ~test.txt exist. + * 1. Delete test.txt + * 2. Rename test.txt~ to test.txt + */ + public void testNFS() throws Exception + { + logger.debug("testNFS()"); + + final String FILE_NAME = "test.txt"; + final String FILE_NAME_TEMP = "test.txt~"; + + class TestContext + { + NetworkFile firstFileHandle; + NetworkFile tempFileHandle; + NodeRef file1NodeRef; + }; + + final String TEST_DIR = TEST_ROOT_DOS_PATH + "\\testNFS"; + + ServerConfiguration scfg = new ServerConfiguration("testServer"); + TestServer testServer = new TestServer("testServer", scfg); + final SrvSession testSession = new TestSrvSession(666, testServer, "cifs", "remoteName"); + DiskSharedDevice share = getDiskSharedDevice(); + final TreeConnection testConnection = testServer.getTreeConnection(share); + final RetryingTransactionHelper tran = transactionService.getRetryingTransactionHelper(); + + /** + * Clean up just in case garbage is left from a previous run + */ + RetryingTransactionCallback deleteGarbageFileCB = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + driver.deleteFile(testSession, testConnection, TEST_DIR + "\\" + FILE_NAME); + return null; + } + }; + RetryingTransactionCallback deleteGarbageFileCB2 = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + driver.deleteFile(testSession, testConnection, TEST_DIR + "\\" + FILE_NAME_TEMP); + return null; + } + }; + + /** + * Create a file in the test directory + */ + + try + { + logger.debug("expect to get exception - cleaning garbage"); + tran.doInTransaction(deleteGarbageFileCB); + } + catch (Exception e) + { + // expect to go here + } + try + { + logger.debug("expect to get exception - cleaning garbage"); + tran.doInTransaction(deleteGarbageFileCB2); + } + catch (Exception e) + { + // expect to go here + } + + logger.debug("0) create new file"); + RetryingTransactionCallback setupCB = new RetryingTransactionCallback() { + @Override + public TestContext execute() throws Throwable + { + + TestContext ctx = new TestContext(); + /** + * Create the test directory we are going to use + */ + FileOpenParams createRootDirParams = new FileOpenParams(TEST_ROOT_DOS_PATH, 0, AccessMode.ReadWrite, FileAttribute.NTNormal, 0); + FileOpenParams createDirParams = new FileOpenParams(TEST_DIR, 0, AccessMode.ReadWrite, FileAttribute.NTNormal, 0); + driver.createDirectory(testSession, testConnection, createRootDirParams); + driver.createDirectory(testSession, testConnection, createDirParams); + + /** + * Create the file we are going to use + */ + { + FileOpenParams createFileParams = new FileOpenParams(TEST_DIR + "\\" + FILE_NAME, 0, AccessMode.ReadWrite, FileAttribute.NTNormal, 0); + ctx.firstFileHandle = driver.createFile(testSession, testConnection, createFileParams); + assertNotNull(ctx.firstFileHandle); + driver.closeFile(testSession, testConnection, ctx.firstFileHandle); + ctx.file1NodeRef = getNodeForPath(testConnection, TEST_DIR + "\\" + FILE_NAME); + } + { + FileOpenParams createTempFileParams = new FileOpenParams(TEST_DIR + "\\" + FILE_NAME_TEMP, 0, AccessMode.ReadWrite, FileAttribute.NTNormal, 0); + ctx.tempFileHandle = driver.createFile(testSession, testConnection, createTempFileParams); + assertNotNull(ctx.tempFileHandle); + driver.closeFile(testSession, testConnection, ctx.tempFileHandle); + } + return ctx; + } + }; + final TestContext testContext = tran.doInTransaction(setupCB, false, true); + + /** + * 1) delete the old file + */ + logger.debug("1) delete old file"); + RetryingTransactionCallback deleteOldFileCB = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + driver.deleteFile(testSession, testConnection, TEST_DIR + "\\" + FILE_NAME); + return null; + } + }; + tran.doInTransaction(deleteOldFileCB, false, true); + + logger.debug("2) remame temp file"); + RetryingTransactionCallback renameTempFileCB = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + driver.renameFile(testSession, testConnection, TEST_DIR + "\\" + FILE_NAME_TEMP, TEST_DIR + "\\" + FILE_NAME); + return null; + } + }; + tran.doInTransaction(renameTempFileCB, false, true); + + logger.debug("3) validate results"); + /** + * Now validate everything is correct + */ + RetryingTransactionCallback validateCB = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + NodeRef shuffledNodeRef = getNodeForPath(testConnection, TEST_DIR + "\\" + FILE_NAME); + + Map props = nodeService.getProperties(shuffledNodeRef); + +// assertTrue("versionable aspect missing", nodeService.hasAspect(shuffledNodeRef, ContentModel.ASPECT_VERSIONABLE)); + + assertEquals("Node ref has changed", shuffledNodeRef, testContext.file1NodeRef); + return null; + } + }; + + tran.doInTransaction(validateCB, true, true); + logger.debug("end testNFS"); + + } // testNFS /** diff --git a/source/java/org/alfresco/filesys/repo/rules/ScenarioDeleteRenameOrCreateInstance.java b/source/java/org/alfresco/filesys/repo/rules/ScenarioDeleteRenameOrCreateInstance.java index c76273db31..95f933a2ee 100644 --- a/source/java/org/alfresco/filesys/repo/rules/ScenarioDeleteRenameOrCreateInstance.java +++ b/source/java/org/alfresco/filesys/repo/rules/ScenarioDeleteRenameOrCreateInstance.java @@ -45,6 +45,9 @@ import org.apache.commons.logging.LogFactory; * b) Close fileA * c) Rename whatever fileA * + * a) Delete fileA + * b)Rename File~ to File + * * This rule will kick in and ... * */