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
This commit is contained in:
Mark Rogers
2011-09-13 16:24:49 +00:00
parent 3914c77f50
commit c9a7210e9d
2 changed files with 204 additions and 12 deletions

View File

@@ -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);
}
}
}

View File

@@ -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<Void> deleteGarbageDirCB = new RetryingTransactionCallback<Void>() {
@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<Void> createTestDirCB = new RetryingTransactionCallback<Void>() {
@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<Void> createRuleCB = new RetryingTransactionCallback<Void>() {
@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<String, Serializable> props = new HashMap<String, Serializable>(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<Void> createFileCB = new RetryingTransactionCallback<Void>() {
@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<Void> writeFileCB = new RetryingTransactionCallback<Void>() {
@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<Void> validateFirstExtractionCB = new RetryingTransactionCallback<Void>() {
@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
*/