Refactored FreezeService after adding the HoldService

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@63769 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Tuna Aksoy
2014-03-07 15:27:40 +00:00
parent 90c40688ec
commit e5abd6fb99
9 changed files with 205 additions and 181 deletions

View File

@@ -42,31 +42,31 @@ public interface HoldService
* Adds the record to the given hold
*
* @param hold The {@link NodeRef} of the hold
* @param record The {@link NodeRef} of the record which will be added to the given hold
* @param nodeRef The {@link NodeRef} of the record / record folder which will be added to the given hold
*/
void addToHoldContainer(NodeRef hold, NodeRef record);
void addToHoldContainer(NodeRef hold, NodeRef nodeRef);
/**
* Adds the record to the given list of holds
*
* @param holds The list of {@link NodeRef}s of the holds
* @param record The {@link NodeRef} of the record which will be added to the given holds
* @param nodeRef The {@link NodeRef} of the record / record folder which will be added to the given holds
*/
void addToHoldContainers(List<NodeRef> holds, NodeRef record);
void addToHoldContainers(List<NodeRef> holds, NodeRef nodeRef);
/**
* Removes the record from the given hold
*
* @param hold The {@link NodeRef} of the hold
* @param record The {@link NodeRef} of the record which will be removed from the given hold
* @param nodeRef The {@link NodeRef} of the record / record folder which will be removed from the given hold
*/
void removeFromHoldContainer(NodeRef hold, NodeRef record);
void removeFromHoldContainer(NodeRef hold, NodeRef nodeRef);
/**
* Removes the record from the given list of hold
*
* @param holds The list {@link NodeRef}s of the holds
* @param record The {@link NodeRef} of the record which will be removed from the given holds
* @param nodeRef The {@link NodeRef} of the record / record folder which will be removed from the given holds
*/
void removeFromHoldContainers(List<NodeRef> holds, NodeRef record);
void removeFromHoldContainers(List<NodeRef> holds, NodeRef nodeRef);
}

View File

@@ -18,18 +18,28 @@
*/
package org.alfresco.module.org_alfresco_module_rm.fileplan.hold;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.ParameterCheck;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Hold service implementation
@@ -37,14 +47,23 @@ import org.alfresco.util.ParameterCheck;
* @author Tuna Aksoy
* @since 2.2
*/
public class HoldServiceImpl implements HoldService
public class HoldServiceImpl implements HoldService, RecordsManagementModel
{
/** Logger */
private static Log logger = LogFactory.getLog(HoldServiceImpl.class);
/** File Plan Service */
private FilePlanService filePlanService;
/** Node Service */
private NodeService nodeService;
/** Record Service */
private RecordService recordService;
/** Record Folder Service */
private RecordFolderService recordFolderService;
/**
* Set the file plan service
*
@@ -65,6 +84,26 @@ public class HoldServiceImpl implements HoldService
this.nodeService = nodeService;
}
/**
* Set the record service
*
* @param recordService the record service
*/
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
/**
* Set the record folder service
*
* @param recordFolderService the record folder service
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService#getHolds(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -74,11 +113,14 @@ public class HoldServiceImpl implements HoldService
ParameterCheck.mandatory("filePlan", filePlan);
NodeRef holdContainer = filePlanService.getHoldContainer(filePlan);
List<ChildAssociationRef> holdsAssocs = nodeService.getChildAssocs(holdContainer);
List<ChildAssociationRef> holdsAssocs = nodeService.getChildAssocs(holdContainer, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
List<NodeRef> holds = new ArrayList<NodeRef>(holdsAssocs.size());
for (ChildAssociationRef holdAssoc : holdsAssocs)
if (holdsAssocs != null && !holdsAssocs.isEmpty())
{
holds.add(holdAssoc.getChildRef());
for (ChildAssociationRef holdAssoc : holdsAssocs)
{
holds.add(holdAssoc.getChildRef());
}
}
return holds;
@@ -88,32 +130,64 @@ public class HoldServiceImpl implements HoldService
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService#addToHoldContainer(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef)
*/
@Override
public void addToHoldContainer(NodeRef hold, NodeRef record)
public void addToHoldContainer(NodeRef hold, NodeRef nodeRef)
{
ParameterCheck.mandatory("hold", hold);
ParameterCheck.mandatory("record", record);
ParameterCheck.mandatory("nodeRef", nodeRef);
List<NodeRef> holds = new ArrayList<NodeRef>(1);
holds.add(hold);
addToHoldContainers(Collections.unmodifiableList(holds), record);
addToHoldContainers(Collections.unmodifiableList(holds), nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService#addToHoldContainers(java.util.List, org.alfresco.service.cmr.repository.NodeRef)
*/
@Override
public void addToHoldContainers(List<NodeRef> holds, NodeRef record)
public void addToHoldContainers(List<NodeRef> holds, NodeRef nodeRef)
{
ParameterCheck.mandatoryCollection("holds", holds);
ParameterCheck.mandatory("record", record);
String recordName = (String) nodeService.getProperty(record, ContentModel.PROP_NAME);
String validLocalName = QName.createValidLocalName(recordName);
QName name = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, validLocalName);
ParameterCheck.mandatory("nodeRef", nodeRef);
for (NodeRef hold : holds)
{
nodeService.addChild(hold, record, ContentModel.ASSOC_CONTAINS, name);
// Link the record to the hold
nodeService.addChild(hold, nodeRef, ASSOC_FROZEN_RECORDS, ASSOC_FROZEN_RECORDS);
// Apply the freeze aspect
Map<QName, Serializable> props = new HashMap<QName, Serializable>(2);
props.put(PROP_FROZEN_AT, new Date());
props.put(PROP_FROZEN_BY, AuthenticationUtil.getFullyAuthenticatedUser());
nodeService.addAspect(nodeRef, ASPECT_FROZEN, props);
// Log a message about applying the the frozen aspect
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
if (recordFolderService.isRecordFolder(nodeRef))
{
List<NodeRef> records = recordService.getRecords(nodeRef);
for (NodeRef record : records)
{
// no need to freeze if already frozen!
if (nodeService.hasAspect(record, ASPECT_FROZEN) == false)
{
nodeService.addAspect(record, ASPECT_FROZEN, props);
if (logger.isDebugEnabled())
{
StringBuilder msg = new StringBuilder();
msg.append("Frozen aspect applied to '").append(record).append("'.");
logger.debug(msg.toString());
}
}
}
}
}
}
@@ -121,28 +195,28 @@ public class HoldServiceImpl implements HoldService
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService#removeFromHoldContainer(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef)
*/
@Override
public void removeFromHoldContainer(NodeRef hold, NodeRef record)
public void removeFromHoldContainer(NodeRef hold, NodeRef nodeRef)
{
ParameterCheck.mandatory("hold", hold);
ParameterCheck.mandatory("record", record);
ParameterCheck.mandatory("nodeRef", nodeRef);
List<NodeRef> holds = new ArrayList<NodeRef>(1);
holds.add(hold);
removeFromHoldContainers(Collections.unmodifiableList(holds), record);
removeFromHoldContainers(Collections.unmodifiableList(holds), nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService#removeFromHoldContainers(java.util.List, org.alfresco.service.cmr.repository.NodeRef)
*/
@Override
public void removeFromHoldContainers(List<NodeRef> holds, NodeRef record)
public void removeFromHoldContainers(List<NodeRef> holds, NodeRef nodeRef)
{
ParameterCheck.mandatory("holds", holds);
ParameterCheck.mandatory("record", record);
ParameterCheck.mandatory("nodeRef", nodeRef);
for (NodeRef hold : holds)
{
nodeService.removeChild(hold, record);
nodeService.removeChild(hold, nodeRef);
}
}
}

View File

@@ -21,25 +21,26 @@ package org.alfresco.module.org_alfresco_module_rm.freeze;
import java.util.Date;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService;
import org.alfresco.service.cmr.repository.NodeRef;
/**
* Freeze Service Interface
*
*
* TODO
* Implementation used to consolidate freeze behaviours in 2.0.
* Implementation used to consolidate freeze behaviours in 2.0.
* When implementing consider application of freeze to 'any' node references, not just records and record folders.
* (Consider implications for security and capabilities)
*
*
* @author Roy Wetherall
* @since 2.0
*/
public interface FreezeService
public interface FreezeService
{
/**
* Indicates whether the passed node reference is a hold. A hold is a container for a group of frozen object and contains the freeze
* reason.
*
*
* @param nodeRef hold node reference
* @return boolean true if hold, false otherwise
*/
@@ -47,7 +48,7 @@ public interface FreezeService
/**
* Indicates whether the passed node reference is frozen.
*
*
* @param nodeRef node reference
* @return boolean true if frozen, false otherwise
*/
@@ -55,7 +56,7 @@ public interface FreezeService
/**
* Get the 'root' frozen node references in a hold.
*
*
* @param hold hold node reference
* @return Set<NodeRef> frozen node references
*/
@@ -63,7 +64,7 @@ public interface FreezeService
/**
* Freezes a node with the provided reason, creating a hold node reference.
*
*
* @param reason freeze reason
* @param nodeRef node reference
* @return NodeRef hold node reference
@@ -72,35 +73,38 @@ public interface FreezeService
/**
* Freezes a node, adding it an existing hold.
*
*
* @param hold hold node reference
* @param nodeRef node reference
*
* @deprecated as of 2.2, use {@link HoldService#addToHoldContainer(NodeRef, NodeRef)} instead
*/
@Deprecated
void freeze(NodeRef hold, NodeRef nodeRef);
/**
* Freezes a collection of nodes with the given reason, creating a hold.
*
*
* @param reason freeze reason
* @param nodeRefs set of nodes to freeze
* @param nodeRefs set of nodes to freeze
* @return NodeRef hold node reference
*/
NodeRef freeze(String reason, Set<NodeRef> nodeRefs);
/**
* Freeze a collection of nodes, adding them to an existing hold.
*
*
* @param hold hold node reference
* @param nodeRefs set of nodes to freeze
*/
void freeze(NodeRef hold, Set<NodeRef> nodeRefs);
/**
* Unfreeze a frozen node.
* Unfreeze a frozen node.
* <p>
* The unfrozen node is automatically removed from the hold(s) it is in. If the hold is
* subsequently empty, the hold is automatically deleted.
*
*
* @param nodeRef node reference
*/
void unFreeze(NodeRef nodeRef);
@@ -110,21 +114,21 @@ public interface FreezeService
* <p>
* The unfrozen nodes are automatically removed from the hold(s) the are in. If the hold(s) is
* subsequently empty, the hold is automatically deleted.
*
*
* @param nodeRefs set of nodes to unfreeze
*/
void unFreeze(Set<NodeRef> nodeRefs);
/**
* Unfreezes all nodes within a hold and deletes the hold.
*
*
* @param hold hold node reference
*/
void relinquish(NodeRef hold);
/**
* Gets the freeze reason for a hold.
*
*
* @param hold hold node reference
* @return String freeze reason
*/
@@ -132,7 +136,7 @@ public interface FreezeService
/**
* Updates the freeze reason for a given hold.
*
*
* @param hold hold node reference
* @param reason updated reason
*/
@@ -141,15 +145,18 @@ public interface FreezeService
/**
* Gets the hold node references for a given file plan
* or an empty set if there is not any hold node available
*
*
* @param filePlan file plan for which the hold nodes will be retrieved
* @return Set<NodeRef> hold node references
*
* @deprecated as of 2.2, use {@link HoldService#getHolds(NodeRef)} instead
*/
@Deprecated
Set<NodeRef> getHolds(NodeRef filePlan);
/**
* Checks whether or not the given node has frozen children
*
*
* @param nodeRef The nodeRef for which will be checked if it has frozen children
* @return true if the given nodeRef has frozen children, false otherwise
*/
@@ -157,15 +164,15 @@ public interface FreezeService
/**
* Gets the date of the freeze for the given node, null if the node is not frozen
*
*
* @param nodeRef The nodeRef for which the date check will be performed
* @return Date The of the freeze or null
* @return Date The of the freeze or null
*/
Date getFreezeDate(NodeRef nodeRef);
/**
* Gets the initiator of the freeze for the given node, null if the node is not frozen
*
*
* @param nodeRef The nodeRef for which the initiator check will be performed
* @return String The initiator of the freeze or null
*/

View File

@@ -29,16 +29,14 @@ import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.fileplan.hold.HoldService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.ParameterCheck;
@@ -74,15 +72,12 @@ public class FreezeServiceImpl extends ServiceBaseImpl
/** File Plan Service */
protected FilePlanService filePlanService;
/** Permission service */
protected PermissionService permissionService;
/** File plan role service */
protected FilePlanRoleService filePlanRoleService;
/** Record folder service */
protected RecordFolderService recordFolderService;
/** Hold service */
protected HoldService holdService;
/**
* @param recordService record service
*/
@@ -99,22 +94,6 @@ public class FreezeServiceImpl extends ServiceBaseImpl
this.filePlanService = filePlanService;
}
/**
* @param permissionService permission service
*/
public void setPermissionService(PermissionService permissionService)
{
this.permissionService = permissionService;
}
/**
* @param filePlanRoleService file plan role service
*/
public void setFilePlanRoleService(FilePlanRoleService filePlanRoleService)
{
this.filePlanRoleService = filePlanRoleService;
}
/**
* @param recordFolderService record folder service
*/
@@ -123,6 +102,14 @@ public class FreezeServiceImpl extends ServiceBaseImpl
this.recordFolderService = recordFolderService;
}
/**
* @param holdService hold service
*/
public void setHoldService(HoldService holdService)
{
this.holdService = holdService;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#isHold(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -227,43 +214,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
ParameterCheck.mandatory("hold", hold);
ParameterCheck.mandatory("nodeRef", nodeRef);
// Link the record to the hold
nodeService.addChild(hold, nodeRef, ASSOC_FROZEN_RECORDS, ASSOC_FROZEN_RECORDS);
// Apply the freeze aspect
Map<QName, Serializable> props = new HashMap<QName, Serializable>(2);
props.put(PROP_FROZEN_AT, new Date());
props.put(PROP_FROZEN_BY, AuthenticationUtil.getFullyAuthenticatedUser());
nodeService.addAspect(nodeRef, ASPECT_FROZEN, props);
// Log a message about applying the the frozen aspect
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
if (recordFolderService.isRecordFolder(nodeRef))
{
List<NodeRef> records = recordService.getRecords(nodeRef);
for (NodeRef record : records)
{
// no need to freeze if already frozen!
if (nodeService.hasAspect(record, ASPECT_FROZEN) == false)
{
nodeService.addAspect(record, ASPECT_FROZEN, props);
if (logger.isDebugEnabled())
{
StringBuilder msg = new StringBuilder();
msg.append("Frozen aspect applied to '").append(record).append("'.");
logger.debug(msg.toString());
}
}
}
}
holdService.addToHoldContainer(hold, nodeRef);
}
/**
@@ -430,18 +381,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
{
ParameterCheck.mandatory("filePlan", filePlan);
Set<NodeRef> holds = new HashSet<NodeRef>();
NodeRef holdContainer = filePlanService.getHoldContainer(filePlan);
List<ChildAssociationRef> childAssocs = nodeService.getChildAssocs(holdContainer, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
if (childAssocs != null && !childAssocs.isEmpty())
{
for (ChildAssociationRef childAssoc : childAssocs)
{
holds.add(childAssoc.getChildRef());
}
}
return holds;
return new HashSet<NodeRef>(holdService.getHolds(filePlan));
}
/**