Merged HEAD-BUG-FIX (4.3/Cloud) to HEAD (4.3/Cloud)

57041: Merged V4.2-BUG-FIX (4.2.1) to HEAD-BUG-FIX (Cloud/4.3)
      56508: Merged HEAD-BUG-FIX to V4.2-BUG-FIX (4.2.1)
         55931: <<NOT IN 4.1.6>> Merged V4.1-BUG-FIX (4.1.7) to HEAD-BUG-FIX (4.2)
            55872: Merged DEV to V4.1-BUG-FIX (4.1.7)
               55854: MNT-9067: bulkimport "Replace existing files" option does not work when versioning is enabled
                  Clear version history on import versioned file and replace existing versioned file.
                  Remove versionable aspect on import non versioned file and replace existing versioned file.
                  Added unit test.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@61675 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Alan Davis 2014-02-11 18:52:11 +00:00
parent 6deb31c4c5
commit 76f8740cd3
13 changed files with 243 additions and 12 deletions

View File

@ -173,30 +173,28 @@ public abstract class AbstractNodeImporter implements NodeImporter
return(result); return(result);
} }
protected final int importImportableItemFile(NodeRef nodeRef, ImportableItem importableItem, MetadataLoader.Metadata metadata) protected final int importImportableItemFile(NodeRef nodeRef, ImportableItem importableItem, MetadataLoader.Metadata metadata, NodeState nodeState)
{ {
int result = 0; int result = 0;
if (importableItem.hasVersionEntries()) if (importableItem.hasVersionEntries())
{ {
// If cm:versionable isn't listed as one of the aspects for this node, add it - cm:versionable is required for nodes that have versions result = importContentVersions(nodeRef, importableItem, nodeState);
if (!metadata.getAspects().contains(ContentModel.ASPECT_VERSIONABLE))
{
if (logger.isWarnEnabled()) logger.warn("Metadata for file '" + getFileName(importableItem.getHeadRevision().getContentFile()) + "' was missing the cm:versionable aspect, yet it has " + importableItem.getVersionEntries().size() + " versions. Adding cm:versionable.");
metadata.addAspect(ContentModel.ASPECT_VERSIONABLE);
}
result = importContentVersions(nodeRef, importableItem);
} }
else else
{ {
if (nodeState == NodeState.REPLACED)
{
nodeService.removeAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE);
}
importContentAndMetadata(nodeRef, importableItem.getHeadRevision(), metadata); importContentAndMetadata(nodeRef, importableItem.getHeadRevision(), metadata);
} }
return(result); return(result);
} }
protected final int importContentVersions(NodeRef nodeRef, ImportableItem importableItem) protected final int importContentVersions(NodeRef nodeRef, ImportableItem importableItem, NodeState nodeState)
{ {
int result = 0; int result = 0;
Map<String, Serializable> versionProperties = new HashMap<String, Serializable>(); Map<String, Serializable> versionProperties = new HashMap<String, Serializable>();
@ -206,6 +204,11 @@ public abstract class AbstractNodeImporter implements NodeImporter
//versionProperties.put(ContentModel.PROP_VERSION_LABEL.toPrefixString(), String.valueOf(versionEntry.getVersion())); //versionProperties.put(ContentModel.PROP_VERSION_LABEL.toPrefixString(), String.valueOf(versionEntry.getVersion()));
versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MAJOR); // Load every version as a major version for now - see http://code.google.com/p/alfresco-bulk-filesystem-import/issues/detail?id=84 versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MAJOR); // Load every version as a major version for now - see http://code.google.com/p/alfresco-bulk-filesystem-import/issues/detail?id=84
if(nodeState == NodeState.REPLACED)
{
versionService.deleteVersionHistory(nodeRef);
}
for (final ImportableItem.VersionedContentAndMetadata versionEntry : importableItem.getVersionEntries()) for (final ImportableItem.VersionedContentAndMetadata versionEntry : importableItem.getVersionEntries())
{ {
MetadataLoader.Metadata metadata = loadMetadata(versionEntry); MetadataLoader.Metadata metadata = loadMetadata(versionEntry);
@ -220,6 +223,13 @@ public abstract class AbstractNodeImporter implements NodeImporter
if (logger.isDebugEnabled()) logger.debug("Creating head revision of node " + nodeRef.toString()); if (logger.isDebugEnabled()) logger.debug("Creating head revision of node " + nodeRef.toString());
ImportableItem.ContentAndMetadata contentAndMetadata = importableItem.getHeadRevision(); ImportableItem.ContentAndMetadata contentAndMetadata = importableItem.getHeadRevision();
MetadataLoader.Metadata metadata = loadMetadata(contentAndMetadata); MetadataLoader.Metadata metadata = loadMetadata(contentAndMetadata);
// If cm:versionable isn't listed as one of the aspects for this node, add it - cm:versionable is required for nodes that have versions
if (!metadata.getAspects().contains(ContentModel.ASPECT_VERSIONABLE))
{
if (logger.isWarnEnabled()) logger.warn("Metadata for file '" + getFileName(importableItem.getHeadRevision().getContentFile()) + "' was missing the cm:versionable aspect, yet it has " + importableItem.getVersionEntries().size() + " versions. Adding cm:versionable.");
metadata.addAspect(ContentModel.ASPECT_VERSIONABLE);
}
importContentAndMetadata(nodeRef, importableItem.getHeadRevision(), metadata); importContentAndMetadata(nodeRef, importableItem.getHeadRevision(), metadata);
versionService.createVersion(nodeRef, versionProperties); versionService.createVersion(nodeRef, versionProperties);

View File

@ -125,7 +125,7 @@ public class StreamingNodeImporterFactory extends AbstractNodeImporterFactory
} }
else else
{ {
numVersionProperties = importImportableItemFile(result, importableItem, metadata); numVersionProperties = importImportableItemFile(result, importableItem, metadata, nodeState);
} }
importStatus.incrementNodesWritten(importableItem, isDirectory, nodeState, metadata.getProperties().size() + 4, numVersionProperties); importStatus.incrementNodesWritten(importableItem, isDirectory, nodeState, metadata.getProperties().size() + 4, numVersionProperties);

View File

@ -375,4 +375,215 @@ public class BulkImportTest extends AbstractBulkImportTests
assertEquals("This is version 1 of fileWithVersions.txt.", contentReader.getContentString()); assertEquals("This is version 1 of fileWithVersions.txt.", contentReader.getContentString());
} }
/**
* MNT-9067: bulkimport "Replace existing files" option does not work when versioning is enabled
*
* @throws Throwable
*/
@Test
public void testMNT9067() throws Throwable
{
txn = transactionService.getUserTransaction();
txn.begin();
NodeRef folderNode = topLevelFolder.getNodeRef();
//initial import
try
{
NodeImporter nodeImporter = streamingNodeImporterFactory.getNodeImporter(ResourceUtils.getFile("classpath:bulkimport3/initial"));
BulkImportParameters bulkImportParameters = new BulkImportParameters();
bulkImportParameters.setTarget(folderNode);
bulkImportParameters.setReplaceExisting(true);
bulkImportParameters.setDisableRulesService(true);
bulkImportParameters.setBatchSize(40);
bulkImporter.bulkImport(bulkImportParameters, nodeImporter);
}
catch(Throwable e)
{
fail(e.getMessage());
}
txn.commit();
txn = transactionService.getUserTransaction();
txn.begin();
System.out.println(bulkImporter.getStatus());
assertEquals(false, bulkImporter.getStatus().inProgress());
List<FileInfo> files = getFiles(folderNode, null);
assertEquals("One file is expected to be imported:", 1, files.size());
FileInfo file = files.get(0);
assertEquals("File name is not equal:", "fileWithVersions.txt", file.getName());
NodeRef fileNodeRef = file.getNodeRef();
assertTrue("Imported file should be versioned:", versionService.isVersioned(fileNodeRef));
VersionHistory history = versionService.getVersionHistory(fileNodeRef);
assertEquals("Imported file should have 4 versions:", 4, history.getAllVersions().size());
//replace versioned file with new versioned file
try
{
NodeImporter nodeImporter = streamingNodeImporterFactory.getNodeImporter(ResourceUtils.getFile("classpath:bulkimport3/replace_with_versioned"));
BulkImportParameters bulkImportParameters = new BulkImportParameters();
bulkImportParameters.setTarget(folderNode);
bulkImportParameters.setReplaceExisting(true);
bulkImportParameters.setDisableRulesService(true);
bulkImportParameters.setBatchSize(40);
bulkImporter.bulkImport(bulkImportParameters, nodeImporter);
}
catch(Throwable e)
{
fail(e.getMessage());
}
System.out.println(bulkImporter.getStatus());
assertEquals(false, bulkImporter.getStatus().inProgress());
txn.commit();
txn = transactionService.getUserTransaction();
txn.begin();
files = getFiles(folderNode, null);
assertEquals("One file is expected to be imported:", 1, files.size());
file = files.get(0);
assertEquals("File name is not equal:", "fileWithVersions.txt", file.getName());
fileNodeRef = file.getNodeRef();
assertTrue("Imported file should be versioned:", versionService.isVersioned(fileNodeRef));
history = versionService.getVersionHistory(fileNodeRef);
assertNotNull(history);
assertEquals("Imported file should have 5 versions:", 5, history.getAllVersions().size());
Version[] versions = history.getAllVersions().toArray(new Version[5]);
//compare the content of each version
ContentReader contentReader;
contentReader = this.contentService.getReader(versions[0].getFrozenStateNodeRef(), ContentModel.PROP_CONTENT);
assertNotNull(contentReader);
assertEquals("This is the final version of replaced on import fileWithVersions.txt.", contentReader.getContentString());
contentReader = this.contentService.getReader(versions[1].getFrozenStateNodeRef(), ContentModel.PROP_CONTENT);
assertNotNull(contentReader);
assertEquals("This is version 4 of replaced on import fileWithVersions.txt.", contentReader.getContentString());
contentReader = this.contentService.getReader(versions[2].getFrozenStateNodeRef(), ContentModel.PROP_CONTENT);
assertNotNull(contentReader);
assertEquals("This is version 3 of replaced on import fileWithVersions.txt.", contentReader.getContentString());
contentReader = this.contentService.getReader(versions[3].getFrozenStateNodeRef(), ContentModel.PROP_CONTENT);
assertNotNull(contentReader);
assertEquals("This is version 2 of replaced on import fileWithVersions.txt.", contentReader.getContentString());
contentReader = this.contentService.getReader(versions[4].getFrozenStateNodeRef(), ContentModel.PROP_CONTENT);
assertNotNull(contentReader);
assertEquals("This is version 1 of replaced on import fileWithVersions.txt.", contentReader.getContentString());
txn.commit();
txn = transactionService.getUserTransaction();
txn.begin();
//import non versioned file
try
{
NodeImporter nodeImporter = streamingNodeImporterFactory.getNodeImporter(ResourceUtils.getFile("classpath:bulkimport3/replace_with_non_versioned"));
BulkImportParameters bulkImportParameters = new BulkImportParameters();
bulkImportParameters.setTarget(folderNode);
bulkImportParameters.setReplaceExisting(true);
bulkImportParameters.setDisableRulesService(true);
bulkImportParameters.setBatchSize(40);
bulkImporter.bulkImport(bulkImportParameters, nodeImporter);
}
catch(Throwable e)
{
fail(e.getMessage());
}
txn.commit();
txn = transactionService.getUserTransaction();
txn.begin();
System.out.println(bulkImporter.getStatus());
assertEquals(false, bulkImporter.getStatus().inProgress());
files = getFiles(folderNode, null);
assertEquals("One file is expected to be imported:", 1, files.size());
file = files.get(0);
assertEquals("File name is not equal:", "fileWithVersions.txt", file.getName());
fileNodeRef = file.getNodeRef();
assertTrue("Imported file should be non versioned:", !versionService.isVersioned(fileNodeRef));
contentReader = this.contentService.getReader(fileNodeRef, ContentModel.PROP_CONTENT);
assertNotNull(contentReader);
assertEquals("This is non versioned fileWithVersions.txt.", contentReader.getContentString());
txn.commit();
txn = transactionService.getUserTransaction();
txn.begin();
//use initial file again to replace non versioned file
try
{
NodeImporter nodeImporter = streamingNodeImporterFactory.getNodeImporter(ResourceUtils.getFile("classpath:bulkimport3/initial"));
BulkImportParameters bulkImportParameters = new BulkImportParameters();
bulkImportParameters.setTarget(folderNode);
bulkImportParameters.setReplaceExisting(true);
bulkImportParameters.setDisableRulesService(true);
bulkImportParameters.setBatchSize(40);
bulkImporter.bulkImport(bulkImportParameters, nodeImporter);
}
catch(Throwable e)
{
fail(e.getMessage());
}
txn.commit();
txn = transactionService.getUserTransaction();
txn.begin();
System.out.println(bulkImporter.getStatus());
assertEquals(false, bulkImporter.getStatus().inProgress());
files = getFiles(folderNode, null);
assertEquals("One file is expected to be imported:", 1, files.size());
file = files.get(0);
assertEquals("File name is not equal:", "fileWithVersions.txt", file.getName());
fileNodeRef = file.getNodeRef();
assertTrue("Imported file should be versioned:", versionService.isVersioned(fileNodeRef));
history = versionService.getVersionHistory(fileNodeRef);
assertNotNull(history);
assertEquals("Imported file should have 4 versions:", 4, history.getAllVersions().size());
versions = history.getAllVersions().toArray(new Version[4]);
//compare the content of each version
contentReader = this.contentService.getReader(versions[0].getFrozenStateNodeRef(), ContentModel.PROP_CONTENT);
assertNotNull(contentReader);
assertEquals("This is the final version of fileWithVersions.txt.", contentReader.getContentString());
contentReader = this.contentService.getReader(versions[1].getFrozenStateNodeRef(), ContentModel.PROP_CONTENT);
assertNotNull(contentReader);
assertEquals("This is version 3 of fileWithVersions.txt.", contentReader.getContentString());
contentReader = this.contentService.getReader(versions[2].getFrozenStateNodeRef(), ContentModel.PROP_CONTENT);
assertNotNull(contentReader);
assertEquals("This is version 2 of fileWithVersions.txt.", contentReader.getContentString());
contentReader = this.contentService.getReader(versions[3].getFrozenStateNodeRef(), ContentModel.PROP_CONTENT);
assertNotNull(contentReader);
assertEquals("This is version 1 of fileWithVersions.txt.", contentReader.getContentString());
}
} }

View File

@ -0,0 +1 @@
This is the final version of fileWithVersions.txt.

View File

@ -0,0 +1 @@
This is version 1 of fileWithVersions.txt.

View File

@ -0,0 +1 @@
This is version 2 of fileWithVersions.txt.

View File

@ -0,0 +1 @@
This is version 3 of fileWithVersions.txt.

View File

@ -0,0 +1 @@
This is non versioned fileWithVersions.txt.

View File

@ -0,0 +1 @@
This is the final version of replaced on import fileWithVersions.txt.

View File

@ -0,0 +1 @@
This is version 1 of replaced on import fileWithVersions.txt.

View File

@ -0,0 +1 @@
This is version 2 of replaced on import fileWithVersions.txt.

View File

@ -0,0 +1 @@
This is version 3 of replaced on import fileWithVersions.txt.

View File

@ -0,0 +1 @@
This is version 4 of replaced on import fileWithVersions.txt.