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;
- }
-
- });
-
-
- }
-}