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.
*