From 9574e4e135aa9f74a764f60439b28a76be6b2462 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 13 Nov 2014 03:45:55 +0000 Subject: [PATCH] RM-1757: Record is not renamed when filed by rule git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@90353 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-service-context.xml | 3 +- .../rm-version-context.xml | 5 +- .../record/RecordService.java | 8 + .../record/RecordServiceImpl.java | 94 +++++++++- .../version/RecordableVersionServiceImpl.java | 160 ++---------------- .../RecordableVersionServiceImplUnitTest.java | 41 +---- 6 files changed, 125 insertions(+), 186 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 4e290a15ea..b5697229ef 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -1101,7 +1101,8 @@ org.alfresco.module.org_alfresco_module_rm.record.RecordService.isDeclared=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.record.RecordService.isFiled=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecord=RM_ALLOW - org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecordFromContent=RM.Create.0 + org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecordFromContent=RM.Create.0 + org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecordFromCopy=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.record.RecordService.file=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.record.RecordService.isPropertyEditable=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.record.RecordService.isMetadataStub=RM.Read.0 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml index 5245ccc2ea..e58a78ee8a 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml @@ -15,12 +15,9 @@ - - - - + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java index fd284c3e30..b12b032939 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java @@ -164,6 +164,14 @@ public interface RecordService * @see #createRecord(NodeRef, NodeRef, boolean) */ void createRecord(NodeRef filePlan, NodeRef nodeRef); + + /** + * Creates a record from a copy of the node reference provided. + * + * @param filePlan file plan + * @param nodeRef node reference + */ + NodeRef createRecordFromCopy(NodeRef filePlan, NodeRef nodeRef); /** * Creates a new document in the unfiled records container if the given node reference is a file plan 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 434ff30197..6cba2aaf6c 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 @@ -77,7 +77,9 @@ import org.alfresco.service.cmr.dictionary.ClassDefinition; import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.model.FileExistsException; import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileNotFoundException; +import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.ContentReader; @@ -849,6 +851,9 @@ public class RecordServiceImpl extends BaseBehaviourBean // get the documents primary parent assoc ChildAssociationRef parentAssoc = nodeService.getPrimaryParent(nodeRef); + // get the latest version record, if there is one + NodeRef latestVersionRecord = getLatestVersionRecord(nodeRef); + behaviourFilter.disableBehaviour(); try { @@ -867,9 +872,6 @@ public class RecordServiceImpl extends BaseBehaviourBean aspectProperties.put(PROP_RECORD_ORIGINATING_CREATION_DATE, new Date()); nodeService.addAspect(nodeRef, ASPECT_RECORD_ORIGINATING_DETAILS, aspectProperties); - // get the latest version record, if there is one - NodeRef latestVersionRecord = getLatestVersionRecord(nodeRef); - // make the document a record makeRecord(nodeRef); @@ -918,6 +920,92 @@ public class RecordServiceImpl extends BaseBehaviourBean }); } + /** + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#createRecordFromCopy(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef) + */ + @Override + public NodeRef createRecordFromCopy(final NodeRef filePlan, final NodeRef nodeRef) + { + return authenticationUtil.runAsSystem(new RunAsWork() + { + public NodeRef doWork() throws Exception + { + // get the unfiled record folder + final NodeRef unfiledRecordFolder = filePlanService.getUnfiledContainer(filePlan); + + // get the documents readers + Long aclId = nodeService.getNodeAclId(nodeRef); + Set readers = extendedPermissionService.getReaders(aclId); + Set writers = extendedPermissionService.getWriters(aclId); + + // add the current owner to the list of extended writers + Set modifiedWrtiers = new HashSet(writers); + if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_OWNABLE)) + { + String owner = ownableService.getOwner(nodeRef); + if (owner != null && !owner.isEmpty() && !owner.equals(OwnableService.NO_OWNER)) + { + modifiedWrtiers.add(owner); + } + } + + // add the current user as extended writer + modifiedWrtiers.add(authenticationUtil.getFullyAuthenticatedUser()); + + // copy version state and create record + NodeRef record = null; + try + { + List originalAssocs = null; + if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_COPIEDFROM)) + { + // take a note of any copyFrom information already on the node + originalAssocs = nodeService.getTargetAssocs(nodeRef, ContentModel.ASSOC_ORIGINAL); + } + + // create a copy of the original state and add it to the unfiled record container + FileInfo recordInfo = fileFolderService.copy(nodeRef, unfiledRecordFolder, null); + record = recordInfo.getNodeRef(); + + // make record + makeRecord(record); + + // remove added copy assocs + List recordAssocs = nodeService.getTargetAssocs(record, ContentModel.ASSOC_ORIGINAL); + for (AssociationRef recordAssoc : recordAssocs) + { + nodeService.removeAssociation( + recordAssoc.getSourceRef(), + recordAssoc.getTargetRef(), + ContentModel.ASSOC_ORIGINAL); + } + + // re-add origional assocs or remove aspect + if (originalAssocs == null) + { + nodeService.removeAspect(record, ContentModel.ASPECT_COPIEDFROM); + } + else + { + for (AssociationRef originalAssoc : originalAssocs) + { + nodeService.createAssociation(originalAssoc.getSourceRef(), originalAssoc.getTargetRef(), ContentModel.ASSOC_ORIGINAL); + } + } + } + catch (FileNotFoundException e) + { + throw new AlfrescoRuntimeException("Can't create recorded version, because copy fails.", e); + } + + // set extended security on record + extendedSecurityService.addExtendedSecurity(record, readers, writers); + + return record; + } + }); + } + /** * Helper to get the latest version record for a given document (ie non-record) * 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 63703c3f32..b782aa43ee 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 @@ -24,30 +24,21 @@ import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; -import java.util.List; import java.util.Map; -import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; +import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.relationship.RelationshipService; -import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService; import org.alfresco.module.org_alfresco_module_rm.util.AuthenticationUtil; import org.alfresco.repo.policy.PolicyScope; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; -import org.alfresco.repo.security.permissions.impl.ExtendedPermissionService; import org.alfresco.repo.version.Version2Model; import org.alfresco.repo.version.Version2ServiceImpl; import org.alfresco.repo.version.VersionModel; -import org.alfresco.service.cmr.model.FileFolderService; -import org.alfresco.service.cmr.model.FileInfo; -import org.alfresco.service.cmr.model.FileNotFoundException; -import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.security.OwnableService; import org.alfresco.service.cmr.version.ReservedVersionNameException; import org.alfresco.service.cmr.version.Version; import org.alfresco.service.cmr.version.VersionHistory; @@ -77,25 +68,16 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl public static final String PROP_VERSION_RECORD = "RecordVersion"; /** file plan service */ - protected FilePlanService filePlanService; - - /** file folder service */ - protected FileFolderService fileFolderService; - - /** extended permission service */ - protected ExtendedPermissionService extendedPermissionService; - - /** ownable service */ - protected OwnableService ownableService; - - /** extended security service */ - protected ExtendedSecurityService extendedSecurityService; + private FilePlanService filePlanService; /** authentication util helper */ - protected AuthenticationUtil authenticationUtil; + private AuthenticationUtil authenticationUtil; /** relationship service */ - protected RelationshipService relationshipService; + private RelationshipService relationshipService; + + /** record service */ + private RecordService recordService; /** * @param filePlanService file plan service @@ -105,38 +87,6 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl this.filePlanService = filePlanService; } - /** - * @param fileFolderService file folder service - */ - public void setFileFolderService(FileFolderService fileFolderService) - { - this.fileFolderService = fileFolderService; - } - - /** - * @param extendedPermissionService extended permission service - */ - public void setExtendedPermissionService(ExtendedPermissionService extendedPermissionService) - { - this.extendedPermissionService = extendedPermissionService; - } - - /** - * @param ownableService ownable service - */ - public void setOwnableService(OwnableService ownableService) - { - this.ownableService = ownableService; - } - - /** - * @param extendedSecurityService extended security service - */ - public void setExtendedSecurityService(ExtendedSecurityService extendedSecurityService) - { - this.extendedSecurityService = extendedSecurityService; - } - /** * @param authenticationUtil authentication util helper */ @@ -152,6 +102,14 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl { this.relationshipService = relationshipService; } + + /** + * @param recordService record service + */ + public void setRecordService(RecordService recordService) + { + this.recordService = recordService; + } /** * @see org.alfresco.repo.version.Version2ServiceImpl#createVersion(org.alfresco.service.cmr.repository.NodeRef, java.util.Map, int) @@ -329,7 +287,7 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl final NodeRef nodeRef = (NodeRef)standardVersionProperties.get(Version2Model.PROP_QNAME_FROZEN_NODE_REF); // create record - final NodeRef record = createRecord(nodeRef, filePlan); + final NodeRef record = recordService.createRecordFromCopy(filePlan, nodeRef); // apply version record aspect to record PropertyMap versionRecordProps = new PropertyMap(3); @@ -441,92 +399,6 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl return versionRecord; } - /** - * Create record from current version - * - * @param nodeRef state to freeze - * @param filePlan destination file plan - * @return {@link NodeRef} versioned record - */ - private NodeRef createRecord(final NodeRef nodeRef, final NodeRef filePlan) - { - return authenticationUtil.runAs(new RunAsWork() - { - public NodeRef doWork() throws Exception - { - // get the unfiled record folder - final NodeRef unfiledRecordFolder = filePlanService.getUnfiledContainer(filePlan); - - // get the documents readers - Long aclId = dbNodeService.getNodeAclId(nodeRef); - Set readers = extendedPermissionService.getReaders(aclId); - Set writers = extendedPermissionService.getWriters(aclId); - - // add the current owner to the list of extended writers - Set modifiedWrtiers = new HashSet(writers); - if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_OWNABLE)) - { - String owner = ownableService.getOwner(nodeRef); - if (owner != null && !owner.isEmpty() && !owner.equals(OwnableService.NO_OWNER)) - { - modifiedWrtiers.add(owner); - } - } - - // add the current user as extended writer - modifiedWrtiers.add(authenticationUtil.getFullyAuthenticatedUser()); - - // copy version state and create record - NodeRef record = null; - try - { - List originalAssocs = null; - if (dbNodeService.hasAspect(nodeRef, ContentModel.ASPECT_COPIEDFROM)) - { - // take a note of any copyFrom information already on the node - originalAssocs = dbNodeService.getTargetAssocs(nodeRef, ContentModel.ASSOC_ORIGINAL); - } - - // create a copy of the original state and add it to the unfiled record container - FileInfo recordInfo = fileFolderService.copy(nodeRef, unfiledRecordFolder, null); - record = recordInfo.getNodeRef(); - - // remove added copy assocs - List recordAssocs = dbNodeService.getTargetAssocs(record, ContentModel.ASSOC_ORIGINAL); - for (AssociationRef recordAssoc : recordAssocs) - { - dbNodeService.removeAssociation( - recordAssoc.getSourceRef(), - recordAssoc.getTargetRef(), - ContentModel.ASSOC_ORIGINAL); - } - - // re-add origional assocs or remove aspect - if (originalAssocs == null) - { - dbNodeService.removeAspect(record, ContentModel.ASPECT_COPIEDFROM); - } - else - { - for (AssociationRef originalAssoc : originalAssocs) - { - dbNodeService.createAssociation(originalAssoc.getSourceRef(), originalAssoc.getTargetRef(), ContentModel.ASSOC_ORIGINAL); - } - } - } - catch (FileNotFoundException e) - { - throw new AlfrescoRuntimeException("Can't create recorded version, because copy fails.", e); - } - - // set extended security on record - extendedSecurityService.addExtendedSecurity(record, readers, writers); - - return record; - } - }, authenticationUtil.getAdminUserName()); - } - /** * Freezes audit aspect properties. * diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImplUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImplUnitTest.java index 169d55eded..c334e94640 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImplUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImplUnitTest.java @@ -29,7 +29,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import java.io.Serializable; -import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -199,33 +198,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest recordableVersionService.createVersion(nodeRef, versionProperties); // then the recorded version is created - verifyRecordedVersion(filePlan); - - } - - /** - * Helper method that verifies that a recorded version was created. - */ - @SuppressWarnings("unchecked") - private void verifyRecordedVersion(NodeRef filePlan) throws Exception - { - // then unfiled container is retrieved for file plan - verify(mockedFilePlanService, times(1)).getUnfiledContainer(filePlan); - - // then the node is copied into the file plan - verify(mockedFileFolderService, times(1)).copy(eq(nodeRef), - eq(unfiledRecordContainer), - anyString()); - - // then the version is created - verify(mockedDbNodeService, times(1)).createNode(any(NodeRef.class), - eq(Version2Model.CHILD_QNAME_VERSIONS), - any(QName.class), - eq(TYPE_CONTENT), - anyMap()); - verify(mockedNodeService, times(1)).addAspect(eq(version), eq(Version2Model.ASPECT_VERSION), anyMap()); - verify(mockedNodeService, times(1)).addAspect(eq(version), eq(RecordableVersionModel.ASPECT_RECORDED_VERSION), - eq(Collections.singletonMap(RecordableVersionModel.PROP_RECORD_NODE_REF, (Serializable)record))); + verify(mockedRecordService, times(1)).createRecordFromCopy(filePlan, nodeRef); } /** @@ -267,7 +240,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest recordableVersionService.createVersion(nodeRef, versionProperties); // then the recorded version is created - verifyRecordedVersion(filePlan); + verify(mockedRecordService, times(1)).createRecordFromCopy(filePlan, nodeRef); } @@ -308,7 +281,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest recordableVersionService.createVersion(nodeRef, versionProperties); // then the recorded version is created - verifyRecordedVersion(filePlan); + verify(mockedRecordService, times(1)).createRecordFromCopy(filePlan, nodeRef); } /** @@ -355,7 +328,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest recordableVersionService.createVersion(nodeRef, versionProperties); // then the recorded version is created - verifyRecordedVersion(anotherFilePlan); + verify(mockedRecordService, times(0)).createRecordFromCopy(filePlan, nodeRef); } /** @@ -380,7 +353,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest recordableVersionService.createVersion(nodeRef, versionProperties); // then the recorded version is created - verifyRecordedVersion(anotherFilePlan); + verify(mockedRecordService, times(0)).createRecordFromCopy(filePlan, nodeRef); } @Test @@ -395,7 +368,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest recordableVersionService.createVersion(nodeRef, versionProperties); // then the recorded version is created - verifyRecordedVersion(filePlan); + verify(mockedRecordService, times(1)).createRecordFromCopy(filePlan, nodeRef); } @Test @@ -411,6 +384,6 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest recordableVersionService.createVersion(nodeRef, versionProperties); // then the recorded version is created - verifyRecordedVersion(filePlan); + verify(mockedRecordService, times(1)).createRecordFromCopy(filePlan, nodeRef); } } \ No newline at end of file