From 3e91b7ab54e56472434e4f78773cdfc30ad5b5f8 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Tue, 4 Dec 2012 05:57:14 +0000 Subject: [PATCH] RM-553 - Create record repository action & RM-554 - Create record UI action * filled out create record action implemenation * added 'Create Record" action to normal document library * configured UI action to call back to repo action * TODO aciton icon git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@44279 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org_alfresco_module_rm/action-context.xml | 18 -- .../messages/actions.properties | 12 +- .../action/dm/CreateRecordAction.java | 102 +++++--- .../action/dm/DeclareRecordAction.java | 219 ------------------ .../action/dm/FileRecordAction.java | 70 ------ 5 files changed, 74 insertions(+), 347 deletions(-) delete mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/DeclareRecordAction.java delete mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/FileRecordAction.java diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/action-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/action-context.xml index cbdd79e0ec..fce6814b19 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/action-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/action-context.xml @@ -24,22 +24,4 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties index ce4c5321a9..bd63793b0a 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties @@ -38,16 +38,6 @@ rm.action.event-not-undone=The event {0} can not be undone, because it is not de # # i18n for Rule Actions # -# File record -file-record.title=File record -# FIXME!!! -#file-record.description=The rule is applied to all items that... -#file-record.destination-record-folder.display-label=File record # Create record create-record.title=Create record -# FIXME!!! -#create-record.description=The rule is applied to all items that... -# Declare record -declare-record.title=Declare record -# FIXME!!! -#declare-record.description=The rule is applied to all items that... \ No newline at end of file +create-record.description=Creates a Record from an existing document. diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java index c0598c8feb..51e86cdb60 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2011 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -21,16 +21,21 @@ package org.alfresco.module.org_alfresco_module_rm.action.dm; import java.util.List; import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; +import org.alfresco.repo.action.ParameterDefinitionImpl; import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ParameterDefinition; +import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * Creates a new record from an existing content object. @@ -42,9 +47,15 @@ import org.alfresco.service.cmr.repository.NodeService; public class CreateRecordAction extends ActionExecuterAbstractBase implements RecordsManagementModel { + /** Logger */ + private static Log logger = LogFactory.getLog(CreateRecordAction.class); + /** Action name */ public static final String NAME = "create-record"; + /** Parameter names */ + public static final String PARAM_FILE_PLAN = "file-plan"; + /** Records management service */ private RecordsManagementService recordsManagementService; @@ -82,36 +93,69 @@ public class CreateRecordAction extends ActionExecuterAbstractBase * @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef) */ @Override - protected void executeImpl(Action action, final NodeRef actionedUponNodeRef) - { - // skip everything if the actioned upon node reference is already a record - if (nodeService.hasAspect(actionedUponNodeRef, ASPECT_RECORD) == false) + protected void executeImpl(final Action action, final NodeRef actionedUponNodeRef) + { + if (nodeService.hasAspect(actionedUponNodeRef, ASPECT_RECORD) == true) { - // TODO we should use the file plan passed as a parameter - // grab the file plan - List filePlans = recordsManagementService.getFilePlans(); - if (filePlans.size() == 1) + // Do not create record if the actioned upon node is already a record! + if (logger.isDebugEnabled() == true) { - // TODO parameterise the action with the file plan - final NodeRef filePlan = filePlans.get(0); - - // run record creation as system - AuthenticationUtil.runAsSystem(new RunAsWork() - { - @Override - public Void doWork() throws Exception - { - // create record from existing document - recordService.createRecordFromDocument(filePlan, actionedUponNodeRef); - - return null; - } - }); + logger.debug("Can not create record, because " + actionedUponNodeRef.toString() + " is already a record."); } - else + } + else if (nodeService.hasAspect(actionedUponNodeRef, ContentModel.ASPECT_WORKING_COPY) == true) + { + // We can not create records from working copies + if (logger.isDebugEnabled() == true) { - throw new AlfrescoRuntimeException("Unable to find file plan."); - } + logger.debug("Can node create record, because " + actionedUponNodeRef.toString() + " is a working copy."); + } + + } + else + { + // run record creation as system + AuthenticationUtil.runAsSystem(new RunAsWork() + { + @Override + public Void doWork() throws Exception + { + NodeRef filePlan = (NodeRef)action.getParameterValue(PARAM_FILE_PLAN); + if (filePlan == null) + { + List filePlans = recordsManagementService.getFilePlans(); + if (filePlans.size() == 1) + { + filePlan = filePlans.get(0); + } + else + { + if (logger.isDebugEnabled() == true) + { + logger.debug("Can not create record, because the default file plan can not be determined."); + } + throw new AlfrescoRuntimeException("Can not create record, because the default file plan can not be determined."); + } + } + else + { + // verify that the provided file plan is actually a file plan + if (recordsManagementService.isFilePlan(filePlan) == false) + { + if (logger.isDebugEnabled() == true) + { + logger.debug("Can not create record, because the provided file plan node reference is not a file plan."); + } + throw new AlfrescoRuntimeException("Can not create record, because the provided file plan node reference is not a file plan."); + } + } + + // create record from existing document + recordService.createRecordFromDocument(filePlan, actionedUponNodeRef); + + return null; + } + }); } } @@ -121,8 +165,8 @@ public class CreateRecordAction extends ActionExecuterAbstractBase @Override protected void addParameterDefinitions(List params) { - // TODO eventually we will need to pass in the file plan as a parameter - // TODO .. or the RM site + // Optional parameter used to specify the file plan + params.add(new ParameterDefinitionImpl(PARAM_FILE_PLAN, DataTypeDefinition.NODE_REF, false, getParamDisplayLabel(PARAM_FILE_PLAN))); } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/DeclareRecordAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/DeclareRecordAction.java deleted file mode 100644 index 5af2af8854..0000000000 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/DeclareRecordAction.java +++ /dev/null @@ -1,219 +0,0 @@ -package org.alfresco.module.org_alfresco_module_rm.action.dm; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.alfresco.error.AlfrescoRuntimeException; -import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService; -import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; -import org.alfresco.module.org_alfresco_module_rm.record.RecordService; -import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.service.cmr.action.Action; -import org.alfresco.service.cmr.action.ParameterDefinition; -import org.alfresco.service.cmr.dictionary.AspectDefinition; -import org.alfresco.service.cmr.dictionary.DictionaryService; -import org.alfresco.service.cmr.dictionary.PropertyDefinition; -import org.alfresco.service.cmr.dictionary.TypeDefinition; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.security.OwnableService; -import org.alfresco.service.namespace.QName; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.extensions.surf.util.I18NUtil; - -public class DeclareRecordAction extends ActionExecuterAbstractBase implements RecordsManagementModel -{ - /** I18N */ - private static final String MSG_UNDECLARED_ONLY_RECORDS = "rm.action.undeclared-only-records"; - private static final String MSG_NO_DECLARE_MAND_PROP = "rm.action.no-declare-mand-prop"; - - /** Logger */ - private static Log logger = LogFactory.getLog(DeclareRecordAction.class); - - /** Record service */ - private RecordService recordService; - - /** Record management service */ - private RecordsManagementService recordsManagementService; - - /** Node service */ - private NodeService nodeService; - - /** Ownable service **/ - private OwnableService ownableService; - - /** Dictionary service */ - private DictionaryService dictionaryService; - - /** - * @param recordService record service - */ - public void setRecordService(RecordService recordService) - { - this.recordService = recordService; - } - - /** - * @param recordsManagementService records management service - */ - public void setRecordsManagementService( - RecordsManagementService recordsManagementService) - { - this.recordsManagementService = recordsManagementService; - } - - /** - * @param nodeService node service - */ - public void setNodeService(NodeService nodeService) - { - this.nodeService = nodeService; - } - - /** - * @param ownableSerice ownable serice - */ - public void setOwnableService(OwnableService ownableService) - { - this.ownableService = ownableService; - } - - /** - * @param dictionaryService dictionary service - */ - public void setDictionaryService(DictionaryService dictionaryService) - { - this.dictionaryService = dictionaryService; - } - - @Override - protected void executeImpl(Action action, final NodeRef actionedUponNodeRef) - { - if (recordService.isRecord(actionedUponNodeRef) == true) - { - if (recordService.isDeclared(actionedUponNodeRef) == false) - { - List missingProperties = new ArrayList(5); - // Aspect not already defined - check mandatory properties then add - if (mandatoryPropertiesSet(actionedUponNodeRef, missingProperties) == true) - { - // Add the declared aspect - Map declaredProps = new HashMap(2); - declaredProps.put(PROP_DECLARED_AT, new Date()); - declaredProps.put(PROP_DECLARED_BY, AuthenticationUtil.getRunAsUser()); - nodeService.addAspect(actionedUponNodeRef, ASPECT_DECLARED_RECORD, declaredProps); - - // remove all owner related rights - ownableService.setOwner(actionedUponNodeRef, OwnableService.NO_OWNER); - } - else - { - throw new AlfrescoRuntimeException(buildMissingPropertiesErrorString(missingProperties)); - } - } - } - else - { - throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_UNDECLARED_ONLY_RECORDS, actionedUponNodeRef.toString())); - } - } - - private String buildMissingPropertiesErrorString(List missingProperties) - { - StringBuilder builder = new StringBuilder(255); - builder.append(I18NUtil.getMessage(MSG_NO_DECLARE_MAND_PROP)); - builder.append(" "); - for (String missingProperty : missingProperties) - { - builder.append(missingProperty) - .append(", "); - } - return builder.toString(); - } - - /** - * Helper method to check whether all the mandatory properties of the node have been set - * - * @param nodeRef - * node reference - * @return boolean true if all mandatory properties are set, false otherwise - */ - private boolean mandatoryPropertiesSet(NodeRef nodeRef, List missingProperties) - { - boolean result = true; - - Map nodeRefProps = nodeService.getProperties(nodeRef); - - QName nodeRefType = nodeService.getType(nodeRef); - - TypeDefinition typeDef = dictionaryService.getType(nodeRefType); - for (PropertyDefinition propDef : typeDef.getProperties().values()) - { - if (propDef.isMandatory() == true) - { - if (nodeRefProps.get(propDef.getName()) == null) - { - logMissingProperty(propDef, missingProperties); - - result = false; - break; - } - } - } - - if (result != false) - { - Set aspects = this.nodeService.getAspects(nodeRef); - for (QName aspect : aspects) - { - AspectDefinition aspectDef = dictionaryService.getAspect(aspect); - for (PropertyDefinition propDef : aspectDef.getProperties().values()) - { - if (propDef.isMandatory() == true) - { - if (nodeRefProps.get(propDef.getName()) == null) - { - logMissingProperty(propDef, missingProperties); - - result = false; - break; - } - } - } - } - } - - return result; - } - - /** - * Log information about missing properties. - * - * @param propDef property definition - * @param missingProperties missing properties - */ - private void logMissingProperty(PropertyDefinition propDef, List missingProperties) - { - if (logger.isWarnEnabled()) - { - StringBuilder msg = new StringBuilder(); - msg.append("Mandatory property missing: ").append(propDef.getName()); - logger.warn(msg.toString()); - } - missingProperties.add(propDef.getName().toString()); - } - - @Override - protected void addParameterDefinitions(List paramList) - { - // No parameters - } - -} \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/FileRecordAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/FileRecordAction.java deleted file mode 100644 index 62c9242f15..0000000000 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/FileRecordAction.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.alfresco.module.org_alfresco_module_rm.action.dm; - -import java.util.List; - -import org.alfresco.error.AlfrescoRuntimeException; -import org.alfresco.repo.action.ParameterDefinitionImpl; -import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; -import org.alfresco.service.cmr.action.Action; -import org.alfresco.service.cmr.action.ParameterDefinition; -import org.alfresco.service.cmr.dictionary.DataTypeDefinition; -import org.alfresco.service.cmr.model.FileFolderService; -import org.alfresco.service.cmr.model.FileNotFoundException; -import org.alfresco.service.cmr.repository.NodeRef; - -public class FileRecordAction extends ActionExecuterAbstractBase -{ - public static final String NAME = "file-record"; - public static final String PARAM_DESTINATION_RECORD_FOLDER = "destination-record-folder"; - - /** - * FileFolder service - */ - private FileFolderService fileFolderService; - - public void setFileFolderService(FileFolderService fileFolderService) - { - this.fileFolderService = fileFolderService; - } - - @Override - protected void addParameterDefinitions(List paramList) - { - paramList.add(new ParameterDefinitionImpl( - PARAM_DESTINATION_RECORD_FOLDER, - DataTypeDefinition.NODE_REF, - true, - getParamDisplayLabel(PARAM_DESTINATION_RECORD_FOLDER))); - } - - /** - * @see org.alfresco.repo.action.executer.ActionExecuter#execute(org.alfresco.repo.ref.NodeRef, org.alfresco.repo.ref.NodeRef) - */ - public void executeImpl(final Action ruleAction, final NodeRef actionedUponNodeRef) - { - final NodeRef destinationParent = (NodeRef)ruleAction.getParameterValue(PARAM_DESTINATION_RECORD_FOLDER); - - AuthenticationUtil.runAsSystem(new RunAsWork() - { - @Override - public Void doWork() throws Exception - { - try - { - fileFolderService.move(actionedUponNodeRef, destinationParent, null); - } - catch (FileNotFoundException e) - { - throw new AlfrescoRuntimeException("Could not file record.", e); - } - - return null; - } - - }); - - - } -}