From c9a7210e9d61a6efcb3c78c71ffe91eb9c816bdc Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Tue, 13 Sep 2011 16:24:49 +0000 Subject: [PATCH] ALF-10213 - Content rule is not applied to empty files, created via CIFS git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@30484 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../filesys/repo/ContentDiskDriver2.java | 23 +-- .../filesys/repo/ContentDiskDriverTest.java | 193 ++++++++++++++++++ 2 files changed, 204 insertions(+), 12 deletions(-) diff --git a/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java b/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java index 9e0e022531..5c0e078daa 100644 --- a/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java +++ b/source/java/org/alfresco/filesys/repo/ContentDiskDriver2.java @@ -2800,6 +2800,17 @@ public class ContentDiskDriver2 extends AlfrescoDiskDriver implements ExtendedD TempNetworkFile tempFile =(TempNetworkFile)file; + NodeRef target = getCifsHelper().getNodeRef(rootNode, tempFile.getFullName()); + + if(nodeService.hasAspect(target, ContentModel.ASPECT_NO_CONTENT)) + { + if(logger.isDebugEnabled()) + { + logger.debug("removed no content aspect"); + } + nodeService.removeAspect(target, ContentModel.ASPECT_NO_CONTENT); + } + if(tempFile.getWriteCount() > 0) { // Some content was written to the temp file. @@ -2826,22 +2837,10 @@ public class ContentDiskDriver2 extends AlfrescoDiskDriver implements ExtendedD is.close(); } } - - NodeRef target = getCifsHelper().getNodeRef(rootNode, tempFile.getFullName()); ContentWriter writer = contentService.getWriter(target, ContentModel.PROP_CONTENT, true); writer.setMimetype(mimetype); writer.setEncoding(encoding); writer.putContent(tempFile.getFile()); - - long size = writer.getSize(); - if(nodeService.hasAspect(target, ContentModel.ASPECT_NO_CONTENT) && size > 0) - { - if(logger.isDebugEnabled()) - { - logger.debug("removed no content aspect"); - } - nodeService.removeAspect(target, ContentModel.ASPECT_NO_CONTENT); - } } } diff --git a/source/java/org/alfresco/filesys/repo/ContentDiskDriverTest.java b/source/java/org/alfresco/filesys/repo/ContentDiskDriverTest.java index acb4b22521..c63c251d76 100644 --- a/source/java/org/alfresco/filesys/repo/ContentDiskDriverTest.java +++ b/source/java/org/alfresco/filesys/repo/ContentDiskDriverTest.java @@ -3313,6 +3313,199 @@ public class ContentDiskDriverTest extends TestCase tran.doInTransaction(validateCB, true, true); } // Scenario frame maker save + /** + * + * @throws Exception + */ + public void testZeroByteRules() throws Exception + { + logger.debug("testZeroByteRules"); + final String FILE_NAME_ZERO = "Zero.docx"; + final String FILE_NAME_NON_ZERO = "NonZero.docx"; + + class TestContext + { + NodeRef testDirNodeRef; + NodeRef testZeroNodeRef; + NodeRef testNonZeroNodeRef; + NetworkFile firstFileHandle; + NetworkFile secondFileHandle; + }; + + final TestContext testContext = new TestContext(); + + final String TEST_DIR = TEST_ROOT_DOS_PATH + "\\testZeroByteRules"; + + ServerConfiguration scfg = new ServerConfiguration("testServer"); + TestServer testServer = new TestServer("testServer", scfg); + final SrvSession testSession = new TestSrvSession(666, testServer, "test", "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 deleteGarbageDirCB = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + driver.deleteDirectory(testSession, testConnection, TEST_DIR); + return null; + } + }; + + try + { + tran.doInTransaction(deleteGarbageDirCB); + } + catch (Exception e) + { + // expect to go here + } + + logger.debug("create Test directory" + TEST_DIR); + RetryingTransactionCallback createTestDirCB = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + /** + * 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); + + testContext.testDirNodeRef = getNodeForPath(testConnection, TEST_DIR); + assertNotNull("testDirNodeRef is null", testContext.testDirNodeRef); + return null; + + + } + }; + tran.doInTransaction(createTestDirCB); + logger.debug("Create rule on test dir"); + + RetryingTransactionCallback createRuleCB = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + Rule rule = new Rule(); + rule.setRuleType(RuleType.INBOUND); + rule.applyToChildren(true); + rule.setRuleDisabled(false); + rule.setTitle("Make Versionable"); + rule.setDescription("ContentDiskDriverTest Test Zero Byte files"); + + Map props = new HashMap(1); + props.put("aspect-name", ContentModel.ASPECT_VERSIONABLE); + Action addVersionable = actionService.createAction("add-features", props); + + ActionCondition noCondition1 = actionService.createActionCondition(NoConditionEvaluator.NAME); + addVersionable.addActionCondition(noCondition1); + + ActionCondition noCondition2 = actionService.createActionCondition(NoConditionEvaluator.NAME); + CompositeAction compAction = actionService.createCompositeAction(); + compAction.setTitle("Make Versionablea"); + compAction.setDescription("Add Aspect - Versionable"); + compAction.addAction(addVersionable); + compAction.addActionCondition(noCondition2); + + rule.setAction(compAction); + + ruleService.saveRule(testContext.testDirNodeRef, rule); + + logger.debug("add aspect versionable rule created"); + + return null; + } + }; + tran.doInTransaction(createRuleCB, false, true); + + /** + * Create a file in the test directory + */ + logger.debug("create test file in test directory"); + RetryingTransactionCallback createFileCB = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + /** + * Create the zero byte file we are going to use to test + */ + FileOpenParams createFileParams = new FileOpenParams(TEST_DIR + "\\" + FILE_NAME_ZERO, 0, AccessMode.ReadWrite, FileAttribute.NTNormal, 0); + testContext.firstFileHandle = driver.createFile(testSession, testConnection, createFileParams); + assertNotNull(testContext.firstFileHandle); + + testContext.testZeroNodeRef = getNodeForPath(testConnection, TEST_DIR + "\\" + FILE_NAME_ZERO); + assertNotNull("testContext.testNodeRef is null", testContext.testZeroNodeRef); + + /** + * Create the non zero byte file we are going to use to test + */ + FileOpenParams createFileParams2 = new FileOpenParams(TEST_DIR + "\\" + FILE_NAME_NON_ZERO, 0, AccessMode.ReadWrite, FileAttribute.NTNormal, 0); + testContext.secondFileHandle = driver.createFile(testSession, testConnection, createFileParams2); + assertNotNull(testContext.secondFileHandle); + + testContext.testNonZeroNodeRef = getNodeForPath(testConnection, TEST_DIR + "\\" + FILE_NAME_NON_ZERO); + assertNotNull("testContext.testNodeRef is null", testContext.testNonZeroNodeRef); + + return null; + } + }; + tran.doInTransaction(createFileCB, false, true); + + logger.debug("step b: close the file with zero byte content"); + + /** + * Write ContentDiskDriverTest1.docx to the test file, + */ + RetryingTransactionCallback writeFileCB = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + + logger.debug("close the file, firstFileHandle"); + driver.closeFile(testSession, testConnection, testContext.firstFileHandle); + + + // Write hello world into the second file + byte[] stuff = "Hello World".getBytes(); + driver.writeFile(testSession, testConnection, testContext.secondFileHandle, stuff, 0, stuff.length, 0); + + logger.debug("close the second non zero file, secondFileHandle"); + driver.closeFile(testSession, testConnection, testContext.secondFileHandle); + + return null; + } + }; + tran.doInTransaction(writeFileCB, false, true); + + logger.debug("Step c: validate versioble aspect has been applied."); + + /** + * c: check zero byte file has the versionable aspect. + */ + RetryingTransactionCallback validateFirstExtractionCB = new RetryingTransactionCallback() { + + @Override + public Void execute() throws Throwable + { + assertTrue("versionable aspect not applied to non zero file.", nodeService.hasAspect(testContext.testNonZeroNodeRef, ContentModel.ASPECT_VERSIONABLE)); + assertTrue("versionable aspect not applied to zero byte file.", nodeService.hasAspect(testContext.testZeroNodeRef, ContentModel.ASPECT_VERSIONABLE)); + return null; + } + }; + tran.doInTransaction(validateFirstExtractionCB, false, true); + + } // testZeroByteRules + /** * Test server */