From 98ca0abe19af3c8d59c37f0e06a0a277f5620aca Mon Sep 17 00:00:00 2001 From: Mihai Cozma Date: Thu, 6 Oct 2016 13:03:40 +0300 Subject: [PATCH] RM-2368 Initial version record does not inherit document type and aspects from original document --- .../record/RecordServiceImpl.java | 2 +- .../version/RecordableVersionService.java | 26 ++- .../version/RecordableVersionServiceImpl.java | 55 +++--- .../version/DeclareAsRecordVersionTest.java | 174 +++++++++++------- 4 files changed, 156 insertions(+), 101 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index 6e54dbcf03..f4fa00e1d0 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -1039,7 +1039,7 @@ public class RecordServiceImpl extends BaseBehaviourBean NodeRef versionRecord = null; - recordableVersionService.createFreezeVersion(nodeRef); + recordableVersionService.createSnapshotVersion(nodeRef); // wire record up to previous record VersionHistory versionHistory = versionService.getVersionHistory(nodeRef); if (versionHistory != null) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionService.java index 63aad9852f..d33e5ac532 100755 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionService.java @@ -64,7 +64,7 @@ public interface RecordableVersionService Version getRecordedVersion(NodeRef record); /** - * Creates a record from the latest version, marking it as recorded. + * Creates a record from the latest frozen version, marking it as recorded. *

* Does not create a record if the node is not versionable or the latest version is already recorded. * @@ -72,6 +72,19 @@ public interface RecordableVersionService * @return NodeRef node reference to the created record. */ NodeRef createRecordFromLatestVersion(NodeRef filePlan, NodeRef nodeRef); + + /** + * Creates a record from the latest version, marking it as recorded. + *

+ * Does not create a record if the node is not versionable or the latest version is already recorded. + * + * @param nodeRef parent node reference + * @param nodeRef node reference + * @param autoVersion true, create new record version from latest version, false creates a record from the latest frozen version + * @return NodeRef node reference to the created record. + * + */ + NodeRef createRecordFromLatestVersion(NodeRef filePlan, NodeRef nodeRef, boolean autoVersion); /** * Indicates whether a record version is destroyed or not. @@ -91,17 +104,16 @@ public interface RecordableVersionService void destroyRecordedVersion(Version version); /** - * Flag that indicate to create new version on record creation if current state of node is modified + * Flag that indicate to create new version on record creation if current node is modified * - * @return boolean + * @return boolean true to auto-version on record creation, false to use latest versioned version */ - public boolean isEnableAutoVersionOnRecordCreation(); + boolean isEnableAutoVersionOnRecordCreation(); /** - * Create a snapshot - 'freeze' version of current node + * Create a snapshot version of current node * * @param nodeRef node reference - * @return version version or null */ - Version createFreezeVersion(NodeRef nodeRef); + void createSnapshotVersion(NodeRef nodeRef); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java index b2508898fb..8463159849 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java @@ -673,6 +673,17 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl { return new NodeRef(convertStoreRef(nodeRef.getStoreRef()), nodeRef.getId()); } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionService#createRecordFromLatestVersion(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef, autoVersion) + */ + @Override + public NodeRef createRecordFromLatestVersion(final NodeRef filePlan, final NodeRef nodeRef, final boolean isEnableAutoVersionOnRecordCreation) + { + setEnableAutoVersionOnRecordCreation(isEnableAutoVersionOnRecordCreation); + + return createRecordFromLatestVersion(filePlan, nodeRef); + } /** * @see org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionService#createRecordFromLatestVersion(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef) @@ -688,7 +699,7 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl // check for versionable aspect if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE)) { - createFreezeVersion(nodeRef); + createSnapshotVersion(nodeRef); // get the latest version final Version currentVersion = getCurrentVersion(nodeRef); @@ -902,37 +913,27 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl */ public boolean isCurrentVersionDirty(NodeRef nodeRef) { + if (!nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE)) { return false; } - if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE) == true) - { - // get the latest version - Version currentVersion = getCurrentVersion(nodeRef); - Date modificationDate = (Date) nodeService.getProperty(nodeRef, ContentModel.PROP_MODIFIED); - if (currentVersion != null) - { - // grab the frozen state - NodeRef currentFrozenState = currentVersion.getFrozenStateNodeRef(); - Date frozenModificationDate = (Date) nodeService.getProperty(currentFrozenState, ContentModel.PROP_MODIFIED); - if (frozenModificationDate != null) - { - if (modificationDate.getTime() > frozenModificationDate.getTime()) { return true; } - } - } - else - { - return true; - } + // get the latest version + Version currentVersion = getCurrentVersion(nodeRef); + Date modificationDate = (Date) nodeService.getProperty(nodeRef, ContentModel.PROP_MODIFIED); - } - return false; + if (currentVersion == null) { return true; } + + // grab the frozen state + NodeRef currentFrozenState = currentVersion.getFrozenStateNodeRef(); + Date frozenModificationDate = (Date) nodeService.getProperty(currentFrozenState, ContentModel.PROP_MODIFIED); + + boolean versionStoreOutdated = ((frozenModificationDate != null) && (modificationDate.getTime() > frozenModificationDate.getTime())); + return versionStoreOutdated; } /** - * @see RecordableVersionService#createFreezeVersion(NodeRef) + * @see RecordableVersionService#createSnapshotVersion(NodeRef) */ - public Version createFreezeVersion(NodeRef nodeRef) + public void createSnapshotVersion(NodeRef nodeRef) { - Version newVersion = null; boolean autoVersion = isEnableAutoVersionOnRecordCreation(); // if the flag autoversion on record creation set, create new version on dirty nodes if (autoVersion && isCurrentVersionDirty(nodeRef)) @@ -940,8 +941,8 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl Map autoVersionProperties = new HashMap(2); autoVersionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MINOR); autoVersionProperties.put(VersionModel.PROP_DESCRIPTION, I18NUtil.getMessage(AUTO_VERSION_ON_RECORD_CREATION)); - newVersion = createVersion(nodeRef, autoVersionProperties); + createVersion(nodeRef, autoVersionProperties); } - return newVersion; + } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/version/DeclareAsRecordVersionTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/version/DeclareAsRecordVersionTest.java index 3e2d83f0f6..6010515860 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/version/DeclareAsRecordVersionTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/version/DeclareAsRecordVersionTest.java @@ -102,9 +102,10 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest } /** - * Given versionable content with a recorded latest version - * When I declare a version record - * Then nothing happens since the latest version is already recorded And a warning is logged + * Given versionable content with a recorded latest version + * When I declare a version record + * Then nothing happens since the latest version is already recorded + * And a warning is logged */ public void testDeclareLatestVersionAsRecordButAlreadyRecorded() { @@ -215,6 +216,98 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest * * @see https://issues.alfresco.com/jira/browse/RM-2368 */ + + public void testCreateRecordFromLatestVersionAutoTrue() + { + doBehaviourDrivenTest(new BehaviourDrivenTest(dmCollaborator) + { + private NodeRef myDocument; + private NodeRef versionedRecord; + private Map versionProperties; + private Date createdDate; + private Date modificationDate; + private String record_name = "initial_name"; + private String AUTO_VERSION_DESCRIPTION = "Auto Version on Record Creation"; + private boolean autoVersion = true; + + public void given() throws Exception + { + // create a document + myDocument = fileFolderService.create(dmFolder, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef(); + createdDate = (Date) nodeService.getProperty(myDocument, ContentModel.PROP_CREATED); + modificationDate = (Date) nodeService.getProperty(myDocument, ContentModel.PROP_MODIFIED); + assertTrue("Modified date must be after or on creation date", createdDate.getTime() == modificationDate.getTime()); + + // Set initial set of properties + Map properties = new HashMap(3); + // Ensure default behaviour autoversion on change properties is set to false + properties.put(ContentModel.PROP_AUTO_VERSION_PROPS, false); + // Set initial name + properties.put(ContentModel.PROP_NAME, "initial_name"); + nodeService.setProperties(myDocument, properties); + nodeService.setProperty(myDocument, ContentModel.PROP_DESCRIPTION, DESCRIPTION); + nodeService.addAspect(myDocument, ContentModel.ASPECT_OWNABLE, null); + // make sure document is versionable + nodeService.addAspect(myDocument, ContentModel.ASPECT_VERSIONABLE, null); + // Change Type to a custom document + nodeService.setType(myDocument, TYPE_CUSTOM_TYPE); + + // setup version properties + versionProperties = new HashMap(2); + versionProperties.put(Version.PROP_DESCRIPTION, DESCRIPTION); + versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MAJOR); + + // create initial version + versionService.createVersion(myDocument, versionProperties); + } + + public void when() + { + // Apply a custom aspect + nodeService.addAspect(myDocument, ContentModel.ASPECT_TITLED, null); + // Update properties + nodeService.setProperty(myDocument, ContentModel.PROP_NAME, "updated_name"); + nodeService.setProperty(myDocument, ContentModel.PROP_DESCRIPTION, DESCRIPTION); + // test RM-2368 + versionedRecord = recordableVersionService.createRecordFromLatestVersion(filePlan, myDocument, autoVersion); + } + + public void then() + { + // Properties updated / flag as modified + // check the created record + assertNotNull(versionedRecord); + assertTrue(recordService.isRecord(versionedRecord)); + + // check the record type is correct + assertEquals(TYPE_CUSTOM_TYPE, nodeService.getType(versionedRecord)); + + // assert the current version is recorded + assertTrue(recordableVersionService.isCurrentVersionRecorded(myDocument)); + + // get name of record + record_name = (String) nodeService.getProperty(versionedRecord, ContentModel.PROP_NAME); + + // new version is create, current node was modified + assertTrue("Name was updated:", record_name.contains("updated_name")); + // check record + checkRecordedVersion(myDocument, AUTO_VERSION_DESCRIPTION, "1.1"); + + } + + }); + + } + + + /** + * + * Given versionable content with a recorded latest version + * When I declare this version record + * Then a new minor version is created for document + * + * @see https://issues.alfresco.com/jira/browse/RM-2368 + */ public void testCreateRecordFromLatestVersion() { doBehaviourDrivenTest(new BehaviourDrivenTest(dmCollaborator) @@ -223,10 +316,8 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest private NodeRef versionedRecord; private Map versionProperties; private Date createdDate; - private Date frozenModifDate; private Date modificationDate; private String record_name = "initial_name"; - private String AUTO_VERSION_DESCRIPTION = "Auto Version on Record Creation"; private boolean autoVersion = false; public void given() throws Exception @@ -251,8 +342,6 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest // Change Type to a custom document nodeService.setType(myDocument, TYPE_CUSTOM_TYPE); - Date modificationDate1 = (Date) nodeService.getProperty(myDocument, ContentModel.PROP_MODIFIED); - assertTrue("Frozen modification date", modificationDate.getTime() == modificationDate1.getTime()); // setup version properties versionProperties = new HashMap(2); versionProperties.put(Version.PROP_DESCRIPTION, DESCRIPTION); @@ -260,35 +349,17 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest // create initial version versionService.createVersion(myDocument, versionProperties); - Version version = versionService.getCurrentVersion(myDocument); - frozenModifDate = version.getFrozenModifiedDate(); - - // get autoversion flag from cofiguratie - autoVersion = recordableVersionService.isEnableAutoVersionOnRecordCreation(); } public void when() { - // current node is not dirty - assertFalse(isCurrentVersionDirty(myDocument)); - - if (autoVersion) - { - // Apply a custom aspect - nodeService.addAspect(myDocument, ContentModel.ASPECT_TITLED, null); - // Update properties - nodeService.setProperty(myDocument, ContentModel.PROP_NAME, "updated_name"); - nodeService.setProperty(myDocument, ContentModel.PROP_DESCRIPTION, DESCRIPTION); - // node should be modified - assertTrue(isCurrentVersionDirty(myDocument)); - } - else - { - assertFalse(isCurrentVersionDirty(myDocument)); - } + // Apply a custom aspect + nodeService.addAspect(myDocument, ContentModel.ASPECT_TITLED, null); + // Update properties + nodeService.setProperty(myDocument, ContentModel.PROP_NAME, "initial_name"); + nodeService.setProperty(myDocument, ContentModel.PROP_DESCRIPTION, DESCRIPTION); // test RM-2368 - versionedRecord = recordableVersionService.createRecordFromLatestVersion(filePlan, myDocument); - + versionedRecord = recordableVersionService.createRecordFromLatestVersion(filePlan, myDocument, autoVersion); } public void then() @@ -307,45 +378,16 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest // get name of record record_name = (String) nodeService.getProperty(versionedRecord, ContentModel.PROP_NAME); - if (autoVersion) - { - // new version is create, current node was modified - assertTrue("Name was updated:", record_name.contains("updated_name")); - // check record - checkRecordedVersion(myDocument, AUTO_VERSION_DESCRIPTION, "1.1"); - } - else - { - // record is created based on existing frozen, which does not contain any modification of node - assertTrue("Name is not modified: ", record_name.contains("initial_name")); - checkRecordedVersion(myDocument, DESCRIPTION, "1.0"); - } - } - - public boolean isCurrentVersionDirty(NodeRef nodeRef) - { - if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE) == true) - { - // get the latest version - Version currentVersion = versionService.getCurrentVersion(nodeRef); - Date modificationDate = (Date) nodeService.getProperty(nodeRef, ContentModel.PROP_MODIFIED); - if (currentVersion != null) - { - // grab the frozen state - NodeRef currentFrozenState = currentVersion.getFrozenStateNodeRef(); - Date frozenModificationDate = (Date) nodeService.getProperty(currentFrozenState, ContentModel.PROP_MODIFIED); - if (modificationDate.getTime() > frozenModificationDate.getTime()) { return true; } - } - else - { - return true; - } - } - return false; + // record is created based on existing frozen, which does not contain any modification of node + assertTrue("Name is not modified: ", record_name.contains("initial_name")); + checkRecordedVersion(myDocument, DESCRIPTION, "1.0"); + } + }); } + }