diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml index 5165a872f7..0cb33f1651 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml @@ -138,6 +138,7 @@ + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/aspect/RecordAspect.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/aspect/RecordAspect.java index d4181fe8ed..b464dfd9d3 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/aspect/RecordAspect.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/aspect/RecordAspect.java @@ -33,6 +33,7 @@ import java.util.Map; import java.util.Set; import org.alfresco.model.ContentModel; +import org.alfresco.model.QuickShareModel; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies; import org.alfresco.module.org_alfresco_module_rm.model.behaviour.AbstractDisposableItem; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; @@ -48,7 +49,9 @@ import org.alfresco.repo.policy.Behaviour.NotificationFrequency; import org.alfresco.repo.policy.annotation.Behaviour; import org.alfresco.repo.policy.annotation.BehaviourBean; import org.alfresco.repo.policy.annotation.BehaviourKind; +import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; +import org.alfresco.service.cmr.quickshare.QuickShareService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.NodeRef; @@ -68,6 +71,7 @@ import org.springframework.extensions.surf.util.I18NUtil; ) public class RecordAspect extends AbstractDisposableItem implements NodeServicePolicies.OnCreateChildAssociationPolicy, + NodeServicePolicies.BeforeAddAspectPolicy, RecordsManagementPolicies.OnCreateReference, RecordsManagementPolicies.OnRemoveReference, NodeServicePolicies.OnMoveNodePolicy, @@ -87,6 +91,9 @@ public class RecordAspect extends AbstractDisposableItem /** record service */ protected RecordService recordService; + /** quickShare service */ + private QuickShareService quickShareService; + /** I18N */ private static final String MSG_CANNOT_UPDATE_RECORD_CONTENT = "rm.service.update-record-content"; @@ -114,6 +121,15 @@ public class RecordAspect extends AbstractDisposableItem this.recordService = recordService; } + /** + * + * @param quickShareService + */ + public void setQuickShareService(QuickShareService quickShareService) + { + this.quickShareService = quickShareService; + } + /** * Behaviour to ensure renditions have the appropriate extended security. * @@ -169,7 +185,7 @@ public class RecordAspect extends AbstractDisposableItem // Deal with versioned records if (reference.equals(CUSTOM_REF_VERSIONS)) { - // run as system, to apply the versioned aspect to the from node + // run as system, to apply the versioned aspect to the from node // as we can't be sure if the user has add aspect rights authenticationUtil.runAsSystem(new RunAsWork() { @@ -318,7 +334,7 @@ public class RecordAspect extends AbstractDisposableItem /** * On copy complete behaviour for record aspect. - * + * * @param classRef * @param sourceNodeRef * @param targetNodeRef @@ -330,9 +346,9 @@ public class RecordAspect extends AbstractDisposableItem ( kind = BehaviourKind.CLASS ) - public void onCopyComplete(QName classRef, - NodeRef sourceNodeRef, - NodeRef targetNodeRef, + public void onCopyComplete(QName classRef, + NodeRef sourceNodeRef, + NodeRef targetNodeRef, boolean copyToNewNode, Map copyMap) { @@ -342,7 +358,7 @@ public class RecordAspect extends AbstractDisposableItem { // then remove any extended security from the newly copied record extendedSecurityService.remove(targetNodeRef); - } + } } @Override @@ -359,4 +375,30 @@ public class RecordAspect extends AbstractDisposableItem throw new IntegrityException(I18NUtil.getMessage(MSG_CANNOT_UPDATE_RECORD_CONTENT), null); } } + + /** + * Behaviour to remove the shared link before declare a record + * + * @see org.alfresco.repo.node.NodeServicePolicies.BeforeAddAspectPolicy#beforeAddAspect(org.alfresco.service.cmr.repository.NodeRef, + * org.alfresco.service.namespace.QName) + */ + @Override + @Behaviour(kind = BehaviourKind.CLASS, notificationFrequency = NotificationFrequency.FIRST_EVENT) + public void beforeAddAspect(final NodeRef nodeRef, final QName aspectTypeQName) + { + AuthenticationUtil.runAs(new RunAsWork() + { + @Override + public Void doWork() + { + String sharedId = (String) nodeService.getProperty(nodeRef, QuickShareModel.PROP_QSHARE_SHAREDID); + if (sharedId != null) + { + quickShareService.unshareContent(sharedId); + } + + return null; + } + }, AuthenticationUtil.getSystemUserName()); + } } diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CreateInplaceRecordTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CreateInplaceRecordTest.java index e5f5137695..d8b3a918ba 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CreateInplaceRecordTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CreateInplaceRecordTest.java @@ -27,12 +27,14 @@ package org.alfresco.module.org_alfresco_module_rm.test.integration.record; +import org.alfresco.model.QuickShareModel; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.service.cmr.model.FileExistsException; import org.alfresco.service.cmr.model.FileNotFoundException; +import org.alfresco.service.cmr.quickshare.QuickShareService; import org.alfresco.service.cmr.security.AccessStatus; /** @@ -42,12 +44,25 @@ import org.alfresco.service.cmr.security.AccessStatus; */ public class CreateInplaceRecordTest extends BaseRMTestCase { + private QuickShareService quickShareService; + @Override protected boolean isCollaborationSiteTest() { return true; } + /** + * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#initServices() + */ + @Override + protected void initServices() + { + super.initServices(); + + quickShareService = (QuickShareService) applicationContext.getBean("quickShareService"); + } + /** * Given a document in a collaboration site * When the document is declared by a site collaborator @@ -185,4 +200,49 @@ public class CreateInplaceRecordTest extends BaseRMTestCase } }); } + + /** + * Given a shared document in a collaboration site + * When the document is declared as record by a site collaborator + * Then the document becomes a record and is not shared anymore + */ + public void testCreateInplaceRecordFromCollabSiteRemovesSharedLink() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + public void given() + { + // Check that the document is not a record + assertFalse("The document should not be a record", recordService.isRecord(dmDocument)); + + quickShareService.shareContent(dmDocument); + // Check the document is shared + assertTrue("The document is shared", nodeService.hasAspect(dmDocument, QuickShareModel.ASPECT_QSHARE)); + } + + public void when() + { + // Declare the document as a record + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + // Declare record + recordService.createRecord(filePlan, dmDocument); + + return null; + } + }, dmCollaborator); + } + + public void then() + { + // Check that the document is a record now + assertTrue("The document should now be a record", recordService.isRecord(dmDocument)); + + // Check that the record is not shared anymore + assertFalse("The document should not be shared anymore", nodeService.hasAspect(dmDocument, QuickShareModel.ASPECT_QSHARE)); + } + }); + } }