From fe36982d6d5bb4da133dcaf60aefaa147db85947 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Sat, 28 Jun 2014 07:13:58 +0000 Subject: [PATCH] RM-1573: Holds the user has read-only permission for are displayed in Remove from Hold dialog git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@75188 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-webscript-context.xml | 1 + .../org/alfresco/rma/holds.get.desc.xml | 2 +- .../hold/HoldServiceImpl.java | 5 +-- .../script/hold/HoldsGet.java | 36 +++++++++++++++++-- .../script/hold/HoldsGetUnitTest.java | 36 +++++++++++++++++++ 5 files changed, 73 insertions(+), 7 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml index f3d3fb87a0..c815e3e411 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml @@ -593,6 +593,7 @@ + diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/holds.get.desc.xml b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/holds.get.desc.xml index 15a066beec..4f3dcbf566 100644 --- a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/holds.get.desc.xml +++ b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/holds.get.desc.xml @@ -11,7 +11,7 @@ retrieved which do not include the given node reference. ]]> - /api/rma/{store_type}/{store_id}/{id}/holds?itemNodeRef={itemNodeRef?}&includedInHold={includedInHold?} + /api/rma/{store_type}/{store_id}/{id}/holds?itemNodeRef={itemNodeRef?}&includedInHold={includedInHold?}&fileOnly={fileOnly?} /api/rma/holds?itemNodeRef={itemNodeRef?} argument user diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java index 360b064fbe..22ea92d531 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java @@ -249,8 +249,6 @@ public class HoldServiceImpl extends ServiceBaseImpl // get the root hold container NodeRef holdContainer = filePlanService.getHoldContainer(filePlan); - // If you remove the "All Records Management Roles" which means users do not have read permissions on hold container - // at all, the hold container will not be found for the logged in user. That's why we need to do a check here. if (holdContainer != null) { // get the children of the root hold container @@ -258,8 +256,7 @@ public class HoldServiceImpl extends ServiceBaseImpl for (ChildAssociationRef holdAssoc : holdsAssocs) { NodeRef hold = holdAssoc.getChildRef(); - boolean hasPermissionOnHold = (permissionService.hasPermission(hold, RMPermissionModel.FILING) == AccessStatus.ALLOWED); - if (isHold(hold) && hasPermissionOnHold) + if (isHold(hold)) { // add to list of holds holds.add(hold); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/hold/HoldsGet.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/hold/HoldsGet.java index f1e3d4c03e..ccfb8afad5 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/hold/HoldsGet.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/hold/HoldsGet.java @@ -26,11 +26,14 @@ import java.util.List; import java.util.Map; import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.hold.HoldService; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.security.AccessStatus; +import org.alfresco.service.cmr.security.PermissionService; import org.apache.commons.lang.StringUtils; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.DeclarativeWebScript; @@ -54,6 +57,9 @@ public class HoldsGet extends DeclarativeWebScript /** Hold Service */ private HoldService holdService; + + /** permission service */ + private PermissionService permissionService; /** * Set the file plan service @@ -84,6 +90,16 @@ public class HoldsGet extends DeclarativeWebScript { this.holdService = holdService; } + + /** + * Set the permission service + * + * @param permissionService the permission service + */ + public void setPermissionService(PermissionService permissionService) + { + this.permissionService = permissionService; + } /** * @see org.springframework.extensions.webscripts.DeclarativeWebScript#executeImpl(org.springframework.extensions.webscripts.WebScriptRequest, org.springframework.extensions.webscripts.Status, org.springframework.extensions.webscripts.Cache) @@ -91,6 +107,7 @@ public class HoldsGet extends DeclarativeWebScript @Override protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) { + boolean fileOnly = getFileOnly(req); NodeRef itemNodeRef = getItemNodeRef(req); List holds = new ArrayList(); @@ -108,8 +125,12 @@ public class HoldsGet extends DeclarativeWebScript List holdObjects = new ArrayList(holds.size()); for (NodeRef nodeRef : holds) { - String name = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); - holdObjects.add(new Hold(name, nodeRef)); + // only add if user has filling permisson on the hold + if (!fileOnly || permissionService.hasPermission(nodeRef, RMPermissionModel.FILING) == AccessStatus.ALLOWED) + { + String name = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); + holdObjects.add(new Hold(name, nodeRef)); + } } Map model = new HashMap(1); @@ -189,6 +210,17 @@ public class HoldsGet extends DeclarativeWebScript } return result; } + + private boolean getFileOnly(WebScriptRequest req) + { + boolean result = false; + String fillingOnly = req.getParameter("fileOnly"); + if (StringUtils.isNotBlank(fillingOnly)) + { + result = Boolean.valueOf(fillingOnly).booleanValue(); + } + return result; + } /** * Helper method to sort the holds by their names diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/hold/HoldsGetUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/hold/HoldsGetUnitTest.java index 2a8f197022..85602a132c 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/hold/HoldsGetUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/hold/HoldsGetUnitTest.java @@ -27,7 +27,9 @@ import static org.alfresco.module.org_alfresco_module_rm.test.util.WebScriptExce import java.util.Collections; import java.util.Map; +import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; +import org.alfresco.service.cmr.security.AccessStatus; import org.json.JSONArray; import org.json.JSONObject; import org.junit.Test; @@ -205,6 +207,40 @@ public class HoldsGetUnitTest extends BaseHoldWebScriptUnitTest testForBothHolds(json); } + public void getFileOnlyHolds() throws Exception + { + doReturn(AccessStatus.ALLOWED).when(mockedPermissionService).hasPermission(hold1NodeRef, RMPermissionModel.FILING); + doReturn(AccessStatus.DENIED).when(mockedPermissionService).hasPermission(hold2NodeRef, RMPermissionModel.FILING); + + // setup web script parameters + Map parameters = buildParameters + ( + "store_type", filePlan.getStoreRef().getProtocol(), + "store_id", filePlan.getStoreRef().getIdentifier(), + "id", filePlan.getId(), + "itemNodeRef", record.toString(), + "includedInHold", "false", + "fileOnly", "true" + ); + + // execute web script + JSONObject json = executeJSONWebScript(parameters); + assertNotNull(json); + + // check the JSON result + assertTrue(json.has("data")); + assertTrue(json.getJSONObject("data").has("holds")); + + JSONArray jsonHolds = json.getJSONObject("data").getJSONArray("holds"); + assertNotNull(jsonHolds); + assertEquals(1, jsonHolds.length()); + + JSONObject hold1 = jsonHolds.getJSONObject(0); + assertNotNull(hold1); + assertEquals("hold1", hold1.getString("name")); + assertEquals(hold1NodeRef.toString(), hold1.getString("nodeRef")); + } + /** * Helper method to test JSON object for the presence of both test holds. *