mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
RM-1096, RM-1097: Refactored CloseRecordFolderAction, CreateDispositionScheduleAction and CutOffAction
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@58002 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -33,4 +33,5 @@ rm.action.node-already-transfer=The node is already being transferred.
|
|||||||
rm.action.node-not-transfer=The node is not a transfer object.
|
rm.action.node-not-transfer=The node is not a transfer object.
|
||||||
rm.action.undo-not-last=The cut off can't be undone, because the last disposition action was not cut off.
|
rm.action.undo-not-last=The cut off can't be undone, because the last disposition action was not cut off.
|
||||||
rm.action.records_only_undeclared=Only records can be completed.
|
rm.action.records_only_undeclared=Only records can be completed.
|
||||||
rm.action.event-not-undone=The event {0} can't be undone, because it's not defined on the disposition lifecycle.
|
rm.action.event-not-undone=The event {0} can't be undone, because it's not defined on the disposition lifecycle.
|
||||||
|
rm.action.node-not-record-category=The disposition schedule could not be created, because the actioned upon node ({0}) was not a record category.
|
@@ -251,7 +251,8 @@
|
|||||||
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getNextDispositionAction=RM.Read.0
|
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getNextDispositionAction=RM.Read.0
|
||||||
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getCompletedDispositionActions=RM.Read.0
|
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getCompletedDispositionActions=RM.Read.0
|
||||||
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getLastCompletedDispostionAction=RM.Read.0
|
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getLastCompletedDispostionAction=RM.Read.0
|
||||||
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.isCutoff=RM.Read.0
|
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.isDisposableItemCutoff=RM.Read.0
|
||||||
|
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.cutoffDisposableItem=RM.Read.0
|
||||||
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.*=RM_DENY
|
org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.*=RM_DENY
|
||||||
]]>
|
]]>
|
||||||
</value>
|
</value>
|
||||||
@@ -1240,7 +1241,7 @@
|
|||||||
org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService.createRecordFolder=RM.Write.0
|
org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService.createRecordFolder=RM.Write.0
|
||||||
org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService.getRecordFolders=RM.Read.0,AFTER_RM.FilterNode
|
org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService.getRecordFolders=RM.Read.0,AFTER_RM.FilterNode
|
||||||
org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService.initialiseRecordFolder=RM.Read.0
|
org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService.initialiseRecordFolder=RM.Read.0
|
||||||
org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService.closeFolder=RM_CAP.0.rma:filePlanComponent.CloseFolders
|
org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService.closeRecordFolder=RM_CAP.0.rma:filePlanComponent.CloseFolders
|
||||||
org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService.*=RM_DENY
|
org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService.*=RM_DENY
|
||||||
]]>
|
]]>
|
||||||
</value>
|
</value>
|
||||||
|
@@ -102,7 +102,7 @@ public interface RecordsManagementService
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 2.0
|
* @since 2.0
|
||||||
* @deprecated As of 2.2, see {@link DispositionService#isCutoff(NodeRef)}
|
* @deprecated As of 2.2, see {@link DispositionService#isDisposableItemCutoff(NodeRef)}
|
||||||
*/
|
*/
|
||||||
boolean isCutoff(NodeRef nodeRef);
|
boolean isCutoff(NodeRef nodeRef);
|
||||||
|
|
||||||
|
@@ -626,12 +626,12 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated As of 2.2, see {@link DispositionService#isCutoff(NodeRef)}
|
* @deprecated As of 2.2, see {@link DispositionService#isDisposableItemCutoff(NodeRef)}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isCutoff(NodeRef nodeRef)
|
public boolean isCutoff(NodeRef nodeRef)
|
||||||
{
|
{
|
||||||
return getDispositionService().isCutoff(nodeRef);
|
return getDispositionService().isDisposableItemCutoff(nodeRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -41,7 +41,7 @@ public class CloseRecordFolderAction extends RMActionExecuterAbstractBase
|
|||||||
{
|
{
|
||||||
if (eligibleForAction(actionedUponNodeRef) == true)
|
if (eligibleForAction(actionedUponNodeRef) == true)
|
||||||
{
|
{
|
||||||
recordFolderService.closeFolder(actionedUponNodeRef);
|
recordFolderService.closeRecordFolder(actionedUponNodeRef);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -23,6 +23,7 @@ import org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstrac
|
|||||||
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
|
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
|
||||||
import org.alfresco.service.cmr.action.Action;
|
import org.alfresco.service.cmr.action.Action;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.springframework.extensions.surf.util.I18NUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create disposition schedule action
|
* Create disposition schedule action
|
||||||
@@ -31,6 +32,9 @@ import org.alfresco.service.cmr.repository.NodeRef;
|
|||||||
*/
|
*/
|
||||||
public class CreateDispositionScheduleAction extends RMActionExecuterAbstractBase
|
public class CreateDispositionScheduleAction extends RMActionExecuterAbstractBase
|
||||||
{
|
{
|
||||||
|
/** I18N */
|
||||||
|
private static final String MSG_NODE_NOT_RECORD_CATEGORY = "rm.action.node-not-record-category";
|
||||||
|
|
||||||
/** file plan service */
|
/** file plan service */
|
||||||
private FilePlanService filePlanService;
|
private FilePlanService filePlanService;
|
||||||
|
|
||||||
@@ -48,14 +52,34 @@ public class CreateDispositionScheduleAction extends RMActionExecuterAbstractBas
|
|||||||
@Override
|
@Override
|
||||||
protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
|
protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
|
||||||
{
|
{
|
||||||
if (filePlanService.isRecordCategory(actionedUponNodeRef) == true)
|
if (eligibleForAction(actionedUponNodeRef) == true)
|
||||||
{
|
{
|
||||||
// Create the disposition schedule
|
// Create the disposition schedule
|
||||||
dispositionService.createDispositionSchedule(actionedUponNodeRef, null);
|
dispositionService.createDispositionSchedule(actionedUponNodeRef, null);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new AlfrescoRuntimeException("The disposition schedule could not be created, because the actioned upon node was not a record category.");
|
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_NODE_NOT_RECORD_CATEGORY, actionedUponNodeRef));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to check the actioned upon node reference to decide to execute the action
|
||||||
|
* The preconditions are:
|
||||||
|
* - The node must exist
|
||||||
|
* - The node must not be a record category
|
||||||
|
*
|
||||||
|
* @param actionedUponNodeRef node reference
|
||||||
|
* @return Return true if the node reference passes all the preconditions for executing the action, false otherwise
|
||||||
|
*/
|
||||||
|
private boolean eligibleForAction(NodeRef actionedUponNodeRef)
|
||||||
|
{
|
||||||
|
boolean result = false;
|
||||||
|
if (nodeService.exists(actionedUponNodeRef) == true &&
|
||||||
|
filePlanService.isRecordCategory(actionedUponNodeRef) == true)
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
@@ -18,16 +18,9 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.module.org_alfresco_module_rm.action.impl;
|
package org.alfresco.module.org_alfresco_module_rm.action.impl;
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase;
|
import org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase;
|
||||||
import org.alfresco.service.cmr.action.Action;
|
import org.alfresco.service.cmr.action.Action;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.namespace.QName;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cut off disposition action
|
* Cut off disposition action
|
||||||
@@ -45,21 +38,16 @@ public class CutOffAction extends RMDispositionActionExecuterAbstractBase
|
|||||||
@Override
|
@Override
|
||||||
protected void executeRecordFolderLevelDisposition(Action action, NodeRef recordFolder)
|
protected void executeRecordFolderLevelDisposition(Action action, NodeRef recordFolder)
|
||||||
{
|
{
|
||||||
// Close folder
|
// Close the record folder
|
||||||
Boolean isClosed = (Boolean)nodeService.getProperty(recordFolder, PROP_IS_CLOSED);
|
recordFolderService.closeRecordFolder(recordFolder);
|
||||||
if (Boolean.FALSE.equals(isClosed) == true)
|
|
||||||
{
|
|
||||||
nodeService.setProperty(recordFolder, PROP_IS_CLOSED, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark the folder as cut off
|
// Mark the folder as cut off
|
||||||
doCutOff(recordFolder);
|
dispositionService.cutoffDisposableItem(recordFolder);
|
||||||
|
|
||||||
// Mark all the declared children of the folder as cut off
|
// Mark all the declared children of the folder as cut off
|
||||||
List<NodeRef> records = recordService.getRecords(recordFolder);
|
for (NodeRef record : recordService.getRecords(recordFolder))
|
||||||
for (NodeRef record : records)
|
|
||||||
{
|
{
|
||||||
doCutOff(record);
|
dispositionService.cutoffDisposableItem(record);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,22 +58,6 @@ public class CutOffAction extends RMDispositionActionExecuterAbstractBase
|
|||||||
protected void executeRecordLevelDisposition(Action action, NodeRef record)
|
protected void executeRecordLevelDisposition(Action action, NodeRef record)
|
||||||
{
|
{
|
||||||
// Mark the record as cut off
|
// Mark the record as cut off
|
||||||
doCutOff(record);
|
dispositionService.cutoffDisposableItem(record);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Marks the record or record folder as cut off, calculating the cut off date.
|
|
||||||
*
|
|
||||||
* @param nodeRef node reference
|
|
||||||
*/
|
|
||||||
private void doCutOff(NodeRef nodeRef)
|
|
||||||
{
|
|
||||||
if (nodeService.hasAspect(nodeRef, ASPECT_CUT_OFF) == false)
|
|
||||||
{
|
|
||||||
// Apply the cut off aspect and set cut off date
|
|
||||||
Map<QName, Serializable> cutOffProps = new HashMap<QName, Serializable>(1);
|
|
||||||
cutOffProps.put(PROP_CUT_OFF_DATE, new Date());
|
|
||||||
nodeService.addAspect(nodeRef, ASPECT_CUT_OFF, cutOffProps);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -32,7 +32,7 @@ public class CutoffCapabilityCondition extends AbstractCapabilityCondition
|
|||||||
@Override
|
@Override
|
||||||
public boolean evaluate(NodeRef nodeRef)
|
public boolean evaluate(NodeRef nodeRef)
|
||||||
{
|
{
|
||||||
return dispositionService.isCutoff(nodeRef);
|
return dispositionService.isDisposableItemCutoff(nodeRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -201,14 +201,23 @@ public interface DispositionService
|
|||||||
DispositionAction getLastCompletedDispostionAction(NodeRef nodeRef);
|
DispositionAction getLastCompletedDispostionAction(NodeRef nodeRef);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates whether the item is cutoff or not.
|
* Indicates whether the disposable item (records, record folders) is cutoff or not.
|
||||||
*
|
*
|
||||||
* @param nodeRef node reference
|
* @param nodeRef node reference
|
||||||
* @return boolean true if the item is cutoff, false otherwise
|
* @return boolean true if the disposable item is cutoff, false otherwise
|
||||||
*
|
*
|
||||||
* @since 2.0
|
* @since 2.0
|
||||||
*/
|
*/
|
||||||
boolean isCutoff(NodeRef nodeRef);
|
boolean isDisposableItemCutoff(NodeRef nodeRef);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marks the disposable item (record or record folder) as cut off, calculating the cut off date
|
||||||
|
*
|
||||||
|
* @param nodeRef node reference
|
||||||
|
*
|
||||||
|
* @since 2.2
|
||||||
|
*/
|
||||||
|
void cutoffDisposableItem(NodeRef nodeRef);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the next disposition action
|
* Updates the next disposition action
|
||||||
|
@@ -837,10 +837,10 @@ public class DispositionServiceImpl implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#isCutoff(NodeRef)
|
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#isDisposableItemCutoff(NodeRef)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isCutoff(NodeRef nodeRef)
|
public boolean isDisposableItemCutoff(NodeRef nodeRef)
|
||||||
{
|
{
|
||||||
ParameterCheck.mandatory("nodeRef", nodeRef);
|
ParameterCheck.mandatory("nodeRef", nodeRef);
|
||||||
return nodeService.hasAspect(nodeRef, ASPECT_CUT_OFF);
|
return nodeService.hasAspect(nodeRef, ASPECT_CUT_OFF);
|
||||||
@@ -969,4 +969,21 @@ public class DispositionServiceImpl implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#cutoffDisposableItem(NodeRef)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void cutoffDisposableItem(NodeRef nodeRef)
|
||||||
|
{
|
||||||
|
ParameterCheck.mandatory("nodeRef", nodeRef);
|
||||||
|
|
||||||
|
if (isDisposableItemCutoff(nodeRef) == false)
|
||||||
|
{
|
||||||
|
// Apply the cut off aspect and set cut off date
|
||||||
|
Map<QName, Serializable> cutOffProps = new HashMap<QName, Serializable>(1);
|
||||||
|
cutOffProps.put(PROP_CUT_OFF_DATE, new Date());
|
||||||
|
nodeService.addAspect(nodeRef, ASPECT_CUT_OFF, cutOffProps);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -38,6 +38,6 @@ public class CutoffEvaluator extends BaseEvaluator
|
|||||||
@Override
|
@Override
|
||||||
protected boolean evaluateImpl(NodeRef nodeRef)
|
protected boolean evaluateImpl(NodeRef nodeRef)
|
||||||
{
|
{
|
||||||
return (dispositionService.isCutoff(nodeRef) == isCutoff);
|
return (dispositionService.isDisposableItemCutoff(nodeRef) == isCutoff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -148,11 +148,11 @@ public interface RecordFolderService
|
|||||||
// TODO rename to getContainedRecords(NodeRef recordFolder);
|
// TODO rename to getContainedRecords(NodeRef recordFolder);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes the folder. If the given node reference is a record the parent will be retrieved and processed.
|
* Closes the record folder. If the given node reference is a record the parent will be retrieved and processed.
|
||||||
*
|
*
|
||||||
* @param nodeRef the record folder node reference
|
* @param nodeRef the record folder node reference
|
||||||
*
|
*
|
||||||
* @since 2.2
|
* @since 2.2
|
||||||
*/
|
*/
|
||||||
void closeFolder(NodeRef nodeRef);
|
void closeRecordFolder(NodeRef nodeRef);
|
||||||
}
|
}
|
||||||
|
@@ -168,7 +168,7 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
|
|||||||
|
|
||||||
// ensure nothing is being added to a closed record folder
|
// ensure nothing is being added to a closed record folder
|
||||||
NodeRef recordFolder = childAssocRef.getParentRef();
|
NodeRef recordFolder = childAssocRef.getParentRef();
|
||||||
Boolean isClosed = (Boolean) this.nodeService.getProperty(recordFolder, PROP_IS_CLOSED);
|
Boolean isClosed = (Boolean) nodeService.getProperty(recordFolder, PROP_IS_CLOSED);
|
||||||
if (isClosed != null && Boolean.TRUE.equals(isClosed) == true)
|
if (isClosed != null && Boolean.TRUE.equals(isClosed) == true)
|
||||||
{
|
{
|
||||||
throw new AlfrescoRuntimeException("You can't add new items to a closed record folder.");
|
throw new AlfrescoRuntimeException("You can't add new items to a closed record folder.");
|
||||||
@@ -247,7 +247,7 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
|
|||||||
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_RECORD_FOLDER_EXPECTED));
|
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_RECORD_FOLDER_EXPECTED));
|
||||||
}
|
}
|
||||||
|
|
||||||
return ((Boolean)this.nodeService.getProperty(nodeRef, PROP_IS_CLOSED)).booleanValue();
|
return ((Boolean) nodeService.getProperty(nodeRef, PROP_IS_CLOSED)).booleanValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -347,7 +347,7 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
|
|||||||
List<NodeRef> result = new ArrayList<NodeRef>(1);
|
List<NodeRef> result = new ArrayList<NodeRef>(1);
|
||||||
if (recordService.isRecord(record) == true)
|
if (recordService.isRecord(record) == true)
|
||||||
{
|
{
|
||||||
List<ChildAssociationRef> assocs = this.nodeService.getParentAssocs(record, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
|
List<ChildAssociationRef> assocs = nodeService.getParentAssocs(record, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
|
||||||
for (ChildAssociationRef assoc : assocs)
|
for (ChildAssociationRef assoc : assocs)
|
||||||
{
|
{
|
||||||
NodeRef parent = assoc.getParentRef();
|
NodeRef parent = assoc.getParentRef();
|
||||||
@@ -361,10 +361,10 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService#closeFolder(NodeRef)
|
* @see org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService#closeRecordFolder(NodeRef)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void closeFolder(NodeRef nodeRef)
|
public void closeRecordFolder(NodeRef nodeRef)
|
||||||
{
|
{
|
||||||
ParameterCheck.mandatory("nodeRef", nodeRef);
|
ParameterCheck.mandatory("nodeRef", nodeRef);
|
||||||
|
|
||||||
@@ -379,8 +379,7 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
|
|||||||
|
|
||||||
if (isRecordFolder(nodeRef) == true)
|
if (isRecordFolder(nodeRef) == true)
|
||||||
{
|
{
|
||||||
Boolean isClosed = (Boolean) nodeService.getProperty(nodeRef, PROP_IS_CLOSED);
|
if (isRecordFolderClosed(nodeRef) == false)
|
||||||
if (Boolean.FALSE.equals(isClosed) == true)
|
|
||||||
{
|
{
|
||||||
nodeService.setProperty(nodeRef, PROP_IS_CLOSED, true);
|
nodeService.setProperty(nodeRef, PROP_IS_CLOSED, true);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user