RM-1096: Refactored AddRecordTypeAction and CloseFolderAction

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@57972 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Tuna Aksoy
2013-11-18 19:13:24 +00:00
parent b740064f77
commit 16516bb60f
8 changed files with 156 additions and 65 deletions

View File

@@ -11,7 +11,6 @@ rm.action.not-next-disp=The disposition action {0} couldn't be performed, becaus
rm.action.not-record-folder=The disposition action {0} couldn't be performed, because this isn't a record folder. (nodeRef={1})
rm.action.actioned-upon-not-record=The action {0} can't be performed because this isn't a record. (filePlanComponet={1})
rm.action.custom-aspect-not-recognised=The custom type can't be applied because it's not recognised. (customAspect={0})
rm.action.close-record-folder-not-folder=The record folder couldn't be closed because it's not defined as a record folder.(nodeRef={0})
rm.action.event-no-disp-lc=The event {0} can't be completed, because it's not defined on the disposition lifecycle.
rm.action.undeclared-only-records=Only records can be completed. (nodeRef={0})
rm.action.no-declare-mand-prop=The record can't be completed, because not all the records mandatory properties have been set.
@@ -34,5 +33,4 @@ 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.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.event-not-undone=The event {0} can't be undone, because it's not defined on the disposition lifecycle.
rm.action.actioned-upon-has-aspect=The node {0} has already the aspect {1}.
rm.action.event-not-undone=The event {0} can't be undone, because it's not defined on the disposition lifecycle.

View File

@@ -14,4 +14,6 @@ rm.service.parent-record-folder-root=Can't create a record folder, because the p
rm.service.parent-record-folder-type=Can't create record folder, because the parent was not sub-type of rm:recordsManagementContainer. (parentType={0})
rm.service.record-folder-type=Can't create record folder, because the provided type is not a sub-type of rm:recordFolder. (type={0})
rm.service.not-record=The node {0} is not a record.
rm.service.vital-def-missing=Vital record definition aspect is not present on node. (nodeRef={0})
rm.service.vital-def-missing=Vital record definition aspect is not present on node. (nodeRef={0})
rm.service.close-record-folder-not-folder=The record folder couldn't be closed because it's not defined as a record folder.(nodeRef={0})
rm.service.node-has-aspect=The node {0} has already the aspect {1}.

View File

@@ -44,7 +44,9 @@ public class AddRecordTypeAction extends RMActionExecuterAbstractBase
/** I18N */
private static final String MSG_ACTIONED_UPON_NOT_RECORD = "rm.action.actioned-upon-not-record";
private static final String MSG_ACTIONED_UPON_HAS_ASPECT = "rm.action.actioned-upon-has-aspect";
/** Constant */
private static final String DELIMITER = ",";
/** Parameter names */
public static final String PARAM_ADD_RECORD_TYPES = "recordTypes";
@@ -59,24 +61,11 @@ public class AddRecordTypeAction extends RMActionExecuterAbstractBase
@Override
protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
{
if (nodeService.exists(actionedUponNodeRef) == true &&
freezeService.isFrozen(actionedUponNodeRef) == false &&
recordService.isRecord(actionedUponNodeRef) == true &&
recordService.isDeclared(actionedUponNodeRef) == false)
if (eligibleForAction(actionedUponNodeRef) == true)
{
String recordTypes = (String) action.getParameterValue(PARAM_ADD_RECORD_TYPES);
String[] types = recordTypes.split(",");
for (String type : types)
for (String type : getRecordTypes(action))
{
QName aspectTypeQName = QName.createQName(type, namespaceService);
if (nodeService.hasAspect(actionedUponNodeRef, aspectTypeQName) == false)
{
nodeService.addAspect(actionedUponNodeRef, aspectTypeQName, null);
}
else
{
logger.info(I18NUtil.getMessage(MSG_ACTIONED_UPON_HAS_ASPECT, actionedUponNodeRef.toString(), aspectTypeQName.toString()));
}
recordService.addRecordType(actionedUponNodeRef, QName.createQName(type, namespaceService));
}
}
else if (logger.isWarnEnabled() == true)
@@ -85,6 +74,42 @@ public class AddRecordTypeAction extends RMActionExecuterAbstractBase
}
}
/**
* 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 frozen
* - The node must be record
* - The node must not be declared
*
* @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 &&
freezeService.isFrozen(actionedUponNodeRef) == false &&
recordService.isRecord(actionedUponNodeRef) == true &&
recordService.isDeclared(actionedUponNodeRef) == false)
{
result = true;
}
return result;
}
/**
* Helper method to get the record types from the action
*
* @param action The action
* @return An array of record types
*/
private String[] getRecordTypes(Action action)
{
String recordTypes = (String) action.getParameterValue(PARAM_ADD_RECORD_TYPES);
return recordTypes.split(DELIMITER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstractBase#addParameterDefinitions(java.util.List)
*/

View File

@@ -20,11 +20,7 @@ package org.alfresco.module.org_alfresco_module_rm.action.impl;
import org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstractBase;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.surf.util.I18NUtil;
/**
* Action to close the records folder
@@ -33,12 +29,6 @@ import org.springframework.extensions.surf.util.I18NUtil;
*/
public class CloseRecordFolderAction extends RMActionExecuterAbstractBase
{
/** Logger */
private static Log logger = LogFactory.getLog(CloseRecordFolderAction.class);
/** I18N */
private static final String MSG_CLOSE_RECORD_FOLDER_NOT_FOLDER = "rm.action.close-record-folder-not-folder";
/** Parameter names */
public static final String PARAM_CLOSE_PARENT = "closeParent";
@@ -49,31 +39,29 @@ public class CloseRecordFolderAction extends RMActionExecuterAbstractBase
@Override
protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
{
if (nodeService.exists(actionedUponNodeRef) == true &&
freezeService.isFrozen(actionedUponNodeRef) == false)
if (eligibleForAction(actionedUponNodeRef) == true)
{
if (recordService.isRecord(actionedUponNodeRef))
{
ChildAssociationRef assocRef = nodeService.getPrimaryParent(actionedUponNodeRef);
if (assocRef != null)
{
actionedUponNodeRef = assocRef.getParentRef();
}
}
if (recordFolderService.isRecordFolder(actionedUponNodeRef) == true)
{
Boolean isClosed = (Boolean) nodeService.getProperty(actionedUponNodeRef, PROP_IS_CLOSED);
if (Boolean.FALSE.equals(isClosed) == true)
{
nodeService.setProperty(actionedUponNodeRef, PROP_IS_CLOSED, true);
}
}
else
{
if (logger.isWarnEnabled())
logger.warn(I18NUtil.getMessage(MSG_CLOSE_RECORD_FOLDER_NOT_FOLDER, actionedUponNodeRef.toString()));
}
recordFolderService.closeFolder(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 frozen
*
* @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 &&
freezeService.isFrozen(actionedUponNodeRef) == false)
{
result = true;
}
return result;
}
}

View File

@@ -152,4 +152,12 @@ public interface RecordService
* @return List<NodeRef> list of records in the record folder
*/
List<NodeRef> getRecords(NodeRef recordFolder);
/**
* Adds the specified type to the record
*
* @param nodeRef Record node reference
* @param typeQName Type to add
*/
void addRecordType(NodeRef nodeRef, QName typeQName);
}

View File

@@ -88,6 +88,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.extensions.surf.util.I18NUtil;
/**
* Record service implementation.
@@ -107,6 +108,9 @@ public class RecordServiceImpl implements RecordService,
/** Logger */
private static Log logger = LogFactory.getLog(RecordServiceImpl.class);
/** I18N */
private static final String MSG_NODE_HAS_ASPECT = "rm.service.node-has-aspect";
/** Always edit property array */
private static final QName[] ALWAYS_EDIT_PROPERTIES = new QName[]
{
@@ -1291,7 +1295,7 @@ public class RecordServiceImpl implements RecordService,
List<NodeRef> result = new ArrayList<NodeRef>(1);
if (recordFolderService.isRecordFolder(recordFolder) == true)
{
List<ChildAssociationRef> assocs = this.nodeService.getChildAssocs(recordFolder, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(recordFolder, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
NodeRef child = assoc.getChildRef();
@@ -1303,4 +1307,23 @@ public class RecordServiceImpl implements RecordService,
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#addRecordType(NodeRef, QName)
*/
@Override
public void addRecordType(NodeRef nodeRef, QName typeQName)
{
ParameterCheck.mandatory("nodeRef", nodeRef);
ParameterCheck.mandatory("typeQName", typeQName);
if (nodeService.hasAspect(nodeRef, typeQName) == false)
{
nodeService.addAspect(nodeRef, typeQName, null);
}
else
{
logger.info(I18NUtil.getMessage(MSG_NODE_HAS_ASPECT, nodeRef.toString(), typeQName.toString()));
}
}
}

View File

@@ -35,9 +35,9 @@ public interface RecordFolderService
{
/**
* Initialises the a record folder from a standard folder.
*
*
* @param nodeRef node reference of the folder to initialise
*
*
* @since 2.2
*/
void initialiseRecordFolder(NodeRef nodeRef);
@@ -47,7 +47,7 @@ public interface RecordFolderService
*
* @param nodeRef node reference
* @return boolean true if record folder, false otherwise
*
*
* @since 2.2
*/
boolean isRecordFolder(NodeRef nodeRef);
@@ -57,7 +57,7 @@ public interface RecordFolderService
*
* @param nodeRef node reference (record folder)
* @return boolean true if record folder contents are declared, false otherwise
*
*
* @since 2.2
*/
boolean isRecordFolderDeclared(NodeRef nodeRef);
@@ -80,7 +80,7 @@ public interface RecordFolderService
* @param name name
* @param type type
* @return NodeRef node reference of record folder
*
*
* @since 2.2
*/
NodeRef createRecordFolder(NodeRef rmContainer, String name, QName type);
@@ -94,7 +94,7 @@ public interface RecordFolderService
* @param type type
* @param properties properties
* @return NodeRef node reference of record folder
*
*
* @since 2.2
*/
NodeRef createRecordFolder(NodeRef rmContainer, String name, QName type, Map<QName, Serializable> properties);
@@ -106,7 +106,7 @@ public interface RecordFolderService
* @param rmContainer records management container
* @param name name
* @return NodeRef node reference of record folder
*
*
* @since 2.2
*/
NodeRef createRecordFolder(NodeRef rmContainer, String name);
@@ -119,7 +119,7 @@ public interface RecordFolderService
* @param name name
* @param properties properties
* @return NodeRef node reference of record folder
*
*
* @since 2.2
*/
NodeRef createRecordFolder(NodeRef rmContainer, String name, Map<QName, Serializable> properties);
@@ -129,7 +129,7 @@ public interface RecordFolderService
*
* @param record the record node reference
* @return List list of folder record node references
*
*
* @since 2.2
*/
// TODO rename to List<NodeRef> getParentRecordFolders(NodeRef record);
@@ -146,4 +146,13 @@ public interface RecordFolderService
// TODO List<NodeRef> getParentRecordsManagementContainers(NodeRef container); // also applicable to record folders
// TODO rename to getContainedRecords(NodeRef recordFolder);
/**
* Closes the folder. If the given node reference is a record the parent will be retrieved and processed.
*
* @param nodeRef the record folder node reference
*
* @since 2.2
*/
void closeFolder(NodeRef nodeRef);
}

View File

@@ -42,6 +42,8 @@ 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;
import org.springframework.extensions.surf.util.I18NUtil;
/**
@@ -55,11 +57,15 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
RecordsManagementModel,
NodeServicePolicies.OnCreateChildAssociationPolicy
{
/** Logger */
private static Log logger = LogFactory.getLog(RecordFolderServiceImpl.class);
/** I18N */
private final static String MSG_RECORD_FOLDER_EXPECTED = "rm.service.record-folder-expected";
private final static String MSG_PARENT_RECORD_FOLDER_ROOT = "rm.service.parent-record-folder-root";
private final static String MSG_PARENT_RECORD_FOLDER_TYPE = "rm.service.parent-record-folder-type";
private final static String MSG_RECORD_FOLDER_TYPE = "rm.service.record-folder-type";
private final static String MSG_CLOSE_RECORD_FOLDER_NOT_FOLDER = "rm.service.close-record-folder-not-folder";
/** Policy component */
private PolicyComponent policyComponent;
@@ -353,4 +359,36 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService#closeFolder(NodeRef)
*/
@Override
public void closeFolder(NodeRef nodeRef)
{
ParameterCheck.mandatory("nodeRef", nodeRef);
if (recordService.isRecord(nodeRef))
{
ChildAssociationRef assocRef = nodeService.getPrimaryParent(nodeRef);
if (assocRef != null)
{
nodeRef = assocRef.getParentRef();
}
}
if (isRecordFolder(nodeRef) == true)
{
Boolean isClosed = (Boolean) nodeService.getProperty(nodeRef, PROP_IS_CLOSED);
if (Boolean.FALSE.equals(isClosed) == true)
{
nodeService.setProperty(nodeRef, PROP_IS_CLOSED, true);
}
}
else
{
if (logger.isWarnEnabled())
logger.warn(I18NUtil.getMessage(MSG_CLOSE_RECORD_FOLDER_NOT_FOLDER, nodeRef.toString()));
}
}
}