diff --git a/pom.xml b/pom.xml index c5733a041f..0c0e109041 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,8 @@ scm:git:https://git.alfresco.com/records-management/records-management.git scm:git:https://git.alfresco.com/records-management/records-management.git https://git.alfresco.com/records-management/records-management - + HEAD + JIRA 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)); + } + }); + } } diff --git a/rm-community/rm-community-rest-api-explorer/src/main/webapp/definitions/gs-core-api.yaml b/rm-community/rm-community-rest-api-explorer/src/main/webapp/definitions/gs-core-api.yaml index af99534fa8..09f746fbf1 100644 --- a/rm-community/rm-community-rest-api-explorer/src/main/webapp/definitions/gs-core-api.yaml +++ b/rm-community/rm-community-rest-api-explorer/src/main/webapp/definitions/gs-core-api.yaml @@ -46,11 +46,10 @@ paths: - gs-sites summary: Create the Records Management (RM) site description: | - **Note:** this endpoint is available in Records Management 2.6 and newer versions. Creates the RM site with the given details. - **Note:** the id of a site cannot be updated once the site has been created. + **Note:** The default site id is rm and the default site name is Records Management. The id of a site cannot be updated once the site has been created. For example, to create an RM site named "Records Management" with "Records Management Description" as description, the following body could be used: ```JSON @@ -62,7 +61,7 @@ paths: The creator will be added as a member with Site Manager role. - When you create the RM site, the **filePlan** structure is also created. + When you create the RM site, the **filePlan** structure is also created including special containers, such as containers for transfers, holds and, unfiled records. operationId: createRMSite produces: @@ -102,8 +101,7 @@ paths: - gs-sites summary: Get the Records Management (RM) site description: | - **Note:** this endpoint is available in Records Management 2.6 and newer versions. - + Gets information for RM site. operationId: getRMSite @@ -133,7 +131,6 @@ paths: - gs-sites summary: Delete the Records Management (RM) site description: | - **Note:** this endpoint is available in Records Management 2.6 and newer versions. Deletes the RM site. operationId: deleteRMSite @@ -161,7 +158,6 @@ paths: - gs-sites summary: Update the Records Management (RM) site description: | - **Note:** this endpoint is available in Records Management 2.6 and newer versions. Update the details for the RM site. Site Manager or other (site) admin can update title or description. @@ -795,7 +791,7 @@ paths: delete: tags: - unfiled-record-folders - summary : Delete an unfiled record folder + summary : Delete an unfiled record folder. Deleted file plan components cannot be recovered, they are deleted permanently. description: | Deletes the unfiled record folder **unfiledRecordFolderId**. operationId: deleteUnfiledRecordFolder @@ -1403,7 +1399,7 @@ paths: - record-folders summary : Delete a record folder description: | - Deletes record folder **recordFolderId**. + Deletes record folder **recordFolderId**. Deleted file plan components cannot be recovered, they are deleted permanently. operationId: deleteRecordFolder parameters: - $ref: '#/parameters/recordFolderIdParam' @@ -1661,7 +1657,7 @@ paths: - $ref: '#/parameters/fieldsParam' - in: body name: recordBodyUpdate - description: The node information to update. + description: The record information to update. required: true schema: $ref: '#/definitions/FilePlanComponentBodyUpdate' @@ -1694,7 +1690,7 @@ paths: - records summary : Delete a record description: | - Deletes the record **recordId**. + Deletes the record **recordId**. Deleted file plan components cannot be recovered, they are deleted permanently. operationId: deleteRecord parameters: - $ref: '#/parameters/recordIdParam' @@ -1756,7 +1752,7 @@ paths: description: | Files the record **recordId** in the target record folder. - You can specify the target record folder by providing its id **targetParentId** + You need to specify the target record folder by providing its id **targetParentId** If the record is already filed, a link to the target record folder is created. @@ -1846,7 +1842,7 @@ paths: tags: - files summary: Declare as record - description: Declares the file **fileId** in the unfiled records container. + description: Declares the file **fileId** in the unfiled records container. The original file is moved to the Records Management site and a secondary parent association is created in the file's original site. operationId: declareRecord parameters: - name: fileId diff --git a/rm-community/rm-community-rest-api-explorer/src/main/webapp/index.html b/rm-community/rm-community-rest-api-explorer/src/main/webapp/index.html index 9739da746c..0a66c86a80 100644 --- a/rm-community/rm-community-rest-api-explorer/src/main/webapp/index.html +++ b/rm-community/rm-community-rest-api-explorer/src/main/webapp/index.html @@ -1,116 +1,147 @@ - - - Alfresco Governance Services REST API Explorer - - - - - - - - - - - - - - - - - - - - - - + + + + + + + Alfresco Governance Services REST API Explorer + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - + - +