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 47a7b2b0a6..65f9af3a2d 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 @@ -1669,8 +1669,7 @@ Gets the list of the hold(s) - /api/rma/{store_type}/{store_id}/{id}/holds?itemNodeRef={itemNodeRef?} + /api/rma/{store_type}/{store_id}/{id}/holds?itemNodeRef={itemNodeRef?}&includedInHold={includedInHold?} /api/rma/holds?itemNodeRef={itemNodeRef?} argument user diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/hold/HoldService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/hold/HoldService.java index bf0a7a8e57..7f1298ecbe 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/hold/HoldService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/hold/HoldService.java @@ -36,15 +36,17 @@ public interface HoldService * @param filePlan The {@link NodeRef} of the file plan * @return List of hold node references */ - List getHoldsInFilePlan(NodeRef filePlan); + List getHolds(NodeRef filePlan); /** * Gets the list of all the holds within the holds container for the given node reference * - * @param nodeRef The {@link NodeRef} of the record / record folder which will be in the retrieved list of hold(s) - * @return List of hold node references which has the node reference of the given record / record folder in it + * @param nodeRef The {@link NodeRef} of the record / record folder + * @param includedInHold true to retrieve the list of hold node references which will include the node reference + * false to get a list of node references which will not have the given node reference + * @return List of hold node references */ - List getHoldsForItem(NodeRef nodeRef); + List getHolds(NodeRef nodeRef, boolean includedInHold); /** * Adds the record to the given hold diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/hold/HoldServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/hold/HoldServiceImpl.java index 62a8b279ca..1d904d78f8 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/hold/HoldServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/hold/HoldServiceImpl.java @@ -38,6 +38,7 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.ParameterCheck; +import org.apache.commons.collections.ListUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -105,10 +106,10 @@ public class HoldServiceImpl implements HoldService, RecordsManagementModel } /** - * @see org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService#getHoldsInFilePlan(org.alfresco.service.cmr.repository.NodeRef) + * @see org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService#getHolds(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public List getHoldsInFilePlan(NodeRef filePlan) + public List getHolds(NodeRef filePlan) { ParameterCheck.mandatory("filePlan", filePlan); @@ -124,21 +125,34 @@ public class HoldServiceImpl implements HoldService, RecordsManagementModel } /** - * @see org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService#getHoldsForItem(org.alfresco.service.cmr.repository.NodeRef) + * @see org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService#getHolds(org.alfresco.service.cmr.repository.NodeRef, boolean) */ @Override - public List getHoldsForItem(NodeRef nodeRef) + public List getHolds(NodeRef nodeRef, boolean includedInHold) { ParameterCheck.mandatory("nodeRef", nodeRef); + List result = new ArrayList(); + List holdsAssocs = nodeService.getParentAssocs(nodeRef, ASSOC_FROZEN_RECORDS, ASSOC_FROZEN_RECORDS); - List holds = new ArrayList(holdsAssocs.size()); + List holdsNotIncludingNodeRef = new ArrayList(holdsAssocs.size()); for (ChildAssociationRef holdAssoc : holdsAssocs) { - holds.add(holdAssoc.getParentRef()); + holdsNotIncludingNodeRef.add(holdAssoc.getParentRef()); + } + result.addAll(holdsNotIncludingNodeRef); + + if (!includedInHold) + { + NodeRef filePlan = filePlanService.getFilePlan(nodeRef); + List allHolds = getHolds(filePlan); + @SuppressWarnings("unchecked") + List holdsIncludingNodeRef = ListUtils.subtract(allHolds, holdsNotIncludingNodeRef); + result.clear(); + result.addAll(holdsIncludingNodeRef); } - return holds; + return result; } /** @@ -169,18 +183,23 @@ public class HoldServiceImpl implements HoldService, RecordsManagementModel // Link the record to the hold nodeService.addChild(hold, nodeRef, ASSOC_FROZEN_RECORDS, ASSOC_FROZEN_RECORDS); - // Apply the freeze aspect Map props = new HashMap(2); + // Apply the freeze aspect props.put(PROP_FROZEN_AT, new Date()); props.put(PROP_FROZEN_BY, AuthenticationUtil.getFullyAuthenticatedUser()); - nodeService.addAspect(nodeRef, ASPECT_FROZEN, props); + boolean hasFrozenAspect = nodeService.hasAspect(nodeRef, ASPECT_FROZEN); - // Log a message about applying the the frozen aspect - if (logger.isDebugEnabled()) + + if (!hasFrozenAspect) { - StringBuilder msg = new StringBuilder(); - msg.append("Frozen aspect applied to '").append(nodeRef).append("'."); - logger.debug(msg.toString()); + nodeService.addAspect(nodeRef, ASPECT_FROZEN, props); + + if (logger.isDebugEnabled()) + { + StringBuilder msg = new StringBuilder(); + msg.append("Frozen aspect applied to '").append(nodeRef).append("'."); + logger.debug(msg.toString()); + } } // Mark all the folders contents as frozen @@ -190,7 +209,7 @@ public class HoldServiceImpl implements HoldService, RecordsManagementModel for (NodeRef record : records) { // no need to freeze if already frozen! - if (nodeService.hasAspect(record, ASPECT_FROZEN) == false) + if (!hasFrozenAspect) { nodeService.addAspect(record, ASPECT_FROZEN, props); @@ -233,5 +252,11 @@ public class HoldServiceImpl implements HoldService, RecordsManagementModel { nodeService.removeChild(hold, nodeRef); } + + List holdList = getHolds(nodeRef, true); + if (holdList.size() == 0) + { + nodeService.removeAspect(nodeRef, ASPECT_FROZEN); + } } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeService.java index e6bb759537..415b821990 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeService.java @@ -149,7 +149,7 @@ public interface FreezeService * @param filePlan file plan for which the hold nodes will be retrieved * @return Set hold node references * - * @deprecated as of 2.2, use {@link HoldService#getHoldsInFilePlan(NodeRef)} instead + * @deprecated as of 2.2, use {@link HoldService#getHolds(NodeRef)} instead */ @Deprecated Set getHolds(NodeRef filePlan); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java index 9592c9cf23..e93cbdbb96 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java @@ -381,7 +381,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl { ParameterCheck.mandatory("filePlan", filePlan); - return new HashSet(holdService.getHoldsInFilePlan(filePlan)); + return new HashSet(holdService.getHolds(filePlan)); } /** 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 6dd6318731..2c67980428 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 @@ -91,17 +91,18 @@ public class HoldsGet extends DeclarativeWebScript @Override protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) { - NodeRef filePlan = getFilePlan(req); NodeRef itemNodeRef = getItemNodeRef(req); List holds = new ArrayList(); if (itemNodeRef == null) { - holds.addAll(holdService.getHoldsInFilePlan(filePlan)); + NodeRef filePlan = getFilePlan(req); + holds.addAll(holdService.getHolds(filePlan)); } else { - holds.addAll(holdService.getHoldsForItem(itemNodeRef)); + boolean includedInHold = getIncludedInHold(req); + holds.addAll(holdService.getHolds(itemNodeRef, includedInHold)); } List holdObjects = new ArrayList(holds.size()); @@ -119,7 +120,7 @@ public class HoldsGet extends DeclarativeWebScript } /** - * Helper method to get the file plan + * Helper method to get the file plan from the request * * @param req The webscript request * @return The {@link NodeRef} of the file plan @@ -150,7 +151,7 @@ public class HoldsGet extends DeclarativeWebScript } /** - * Helper method to get the item node reference + * Helper method to get the item node reference from the request * * @param req The webscript request * @return The {@link NodeRef} of the item (record / record folder) or null if the parameter has not been passed @@ -166,6 +167,23 @@ public class HoldsGet extends DeclarativeWebScript return itemNodeRef; } + /** + * Helper method to get the includeInHold parameter value from the request + * + * @param req The webscript request + * @return The value of the includeInHold parameter + */ + private boolean getIncludedInHold(WebScriptRequest req) + { + boolean result = true; + String includedInHold = req.getParameter("includedInHold"); + if (StringUtils.isNotBlank(includedInHold)) + { + result = Boolean.valueOf(includedInHold).booleanValue(); + } + return result; + } + /** * Helper method to sort the holds by their names * diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1008Test.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1008Test.java index e6bce4247b..2ff2718e1d 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1008Test.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1008Test.java @@ -127,7 +127,7 @@ public class RM1008Test extends BaseRMTestCase { // create hold object freezeService.freeze("test", rmFolder); - List holds = holdService.getHoldsInFilePlan(filePlan); + List holds = holdService.getHolds(filePlan); return holds.iterator().next(); } }, rmAdminName); diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1030Test.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1030Test.java index 719601519d..bc4edd702e 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1030Test.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1030Test.java @@ -46,7 +46,7 @@ public class RM1030Test extends BaseRMTestCase public NodeRef run() { // show there are no holds when we start - List holds = holdService.getHoldsInFilePlan(filePlan); + List holds = holdService.getHolds(filePlan); assertNotNull(holds); assertEquals(0, holds.size()); @@ -64,7 +64,7 @@ public class RM1030Test extends BaseRMTestCase assertTrue(freezeService.isFrozen(recordOne)); // count the number of holds - List holds = holdService.getHoldsInFilePlan(filePlan); + List holds = holdService.getHolds(filePlan); assertNotNull(holds); assertEquals(1, holds.size()); } @@ -91,7 +91,7 @@ public class RM1030Test extends BaseRMTestCase assertTrue(freezeService.isFrozen(rmFolder)); // count the number of holds - List holds = holdService.getHoldsInFilePlan(filePlan); + List holds = holdService.getHolds(filePlan); assertNotNull(holds); assertEquals(2, holds.size()); } @@ -113,7 +113,7 @@ public class RM1030Test extends BaseRMTestCase assertTrue(freezeService.isFrozen(recordOne)); assertFalse(freezeService.isFrozen(rmFolder)); - List holds = holdService.getHoldsInFilePlan(filePlan); + List holds = holdService.getHolds(filePlan); assertNotNull(holds); assertEquals(1, holds.size()); } @@ -135,7 +135,7 @@ public class RM1030Test extends BaseRMTestCase assertFalse(freezeService.isFrozen(recordOne)); assertFalse(freezeService.isFrozen(rmFolder)); - List holds = holdService.getHoldsInFilePlan(filePlan); + List holds = holdService.getHolds(filePlan); assertNotNull(holds); assertEquals(0, holds.size()); } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FreezeServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FreezeServiceImplTest.java index 9fa5fd6253..187cc4d326 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FreezeServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FreezeServiceImplTest.java @@ -65,7 +65,7 @@ public class FreezeServiceImplTest extends BaseRMTestCase assertTrue(freezeService.hasFrozenChildren(rmFolder)); // Check the hold exists - List holdAssocs = holdService.getHoldsInFilePlan(filePlan); + List holdAssocs = holdService.getHolds(filePlan); assertNotNull(holdAssocs); assertEquals(1, holdAssocs.size()); NodeRef holdNodeRef = holdAssocs.iterator().next(); @@ -98,7 +98,7 @@ public class FreezeServiceImplTest extends BaseRMTestCase assertTrue(freezeService.isHold(newHold)); // Check the holds exist - holdAssocs = holdService.getHoldsInFilePlan(filePlan); + holdAssocs = holdService.getHolds(filePlan); assertNotNull(holdAssocs); assertEquals(2, holdAssocs.size()); for (NodeRef hold : holdAssocs) @@ -136,7 +136,7 @@ public class FreezeServiceImplTest extends BaseRMTestCase freezeService.unFreeze(recordThree); // Check the holds - holdAssocs = holdService.getHoldsInFilePlan(filePlan); + holdAssocs = holdService.getHolds(filePlan); assertNotNull(holdAssocs); assertEquals(2, holdAssocs.size()); for (NodeRef hold : holdAssocs) @@ -175,7 +175,7 @@ public class FreezeServiceImplTest extends BaseRMTestCase freezeService.relinquish(holdNodeRef); // Check the existing hold - holdAssocs = holdService.getHoldsInFilePlan(filePlan); + holdAssocs = holdService.getHolds(filePlan); assertNotNull(holdAssocs); assertEquals(1, holdAssocs.size()); @@ -184,7 +184,7 @@ public class FreezeServiceImplTest extends BaseRMTestCase freezeService.unFreeze(freezeService.getFrozen(holdNodeRef)); // All holds should be deleted - holdAssocs = holdService.getHoldsInFilePlan(filePlan); + holdAssocs = holdService.getHolds(filePlan); assertEquals(0, holdAssocs.size()); // Check the nodes are unfrozen @@ -204,7 +204,7 @@ public class FreezeServiceImplTest extends BaseRMTestCase assertTrue(freezeService.hasFrozenChildren(rmFolder)); // Check the hold - holdAssocs = holdService.getHoldsInFilePlan(filePlan); + holdAssocs = holdService.getHolds(filePlan); assertNotNull(holdAssocs); assertEquals(1, holdAssocs.size()); diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java index fa4fda3b0f..db8412fde5 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java @@ -433,7 +433,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase { if (filePlan != null && nodeService.exists(filePlan)) { - List holds = holdService.getHoldsInFilePlan(filePlan); + List holds = holdService.getHolds(filePlan); for (NodeRef hold : holds) { freezeService.relinquish(hold);