From efc037a9748a0fd3adb239507fb365a4f92c7e88 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Wed, 24 Apr 2019 11:42:42 +0100 Subject: [PATCH 1/6] RM-6792 Optional Record Locn --- .../org_alfresco_module_rm/action-context.xml | 3 + .../messages/actions.properties | 1 + .../action/dm/CreateRecordAction.java | 143 +++++++++++++++++- .../record/RecordService.java | 25 +++ .../record/RecordServiceImpl.java | 48 +++++- .../legacy/action/CreateRecordActionTest.java | 33 +++- .../test/util/BaseRMTestCase.java | 3 + .../record/RecordServiceImplUnitTest.java | 108 +++++++++++++ .../test/util/BaseUnitTest.java | 4 + 9 files changed, 360 insertions(+), 8 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/action-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/action-context.xml index 45fa00a4f2..b471c996c0 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/action-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/action-context.xml @@ -18,6 +18,9 @@ + + + {http://www.alfresco.org/model/content/1.0}content diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties index 3b4c93b3d4..c1e8bce28e 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties @@ -51,6 +51,7 @@ create-record.title=Declare as Record create-record.description=Declares file as a record create-record.file-plan.display-label=File Plan create-record.hide-record.display-label=Hide Record +create-record.path.display-label=Destination Record Folder Path # Declare As Version Record declare-as-version-record.title=Declare Version as Record declare-as-version-record.description=Declares this version of the file as a record diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java index 2869b9c755..9cf67a954d 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java @@ -27,16 +27,27 @@ package org.alfresco.module.org_alfresco_module_rm.action.dm; +import java.util.Arrays; import java.util.List; +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.action.AuditableActionExecuterAbstractBase; +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.util.AuthenticationUtil; import org.alfresco.repo.action.ParameterDefinitionImpl; 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.alfresco.service.namespace.QName; + +import org.springframework.util.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * Creates a new record from an existing content object. @@ -48,16 +59,53 @@ import org.alfresco.service.cmr.repository.NodeRef; public class CreateRecordAction extends AuditableActionExecuterAbstractBase 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"; public static final String PARAM_HIDE_RECORD = "hide-record"; + public static final String PARAM_PATH = "path"; + + /** Node service */ + private NodeService nodeService; + + /** File plan service */ + private FilePlanService filePlanService; + + /** Authentication util */ + private AuthenticationUtil authenticationUtil; /** Record service */ private RecordService recordService; + /** + * @param nodeService node service + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** + * @param filePlanService file plan service + */ + public void setFilePlanService(FilePlanService filePlanService) + { + this.filePlanService = filePlanService; + } + + /** + * @param authenticationUtil authentication util + */ + public void setAuthenticationUtil(AuthenticationUtil authenticationUtil) + { + this.authenticationUtil = authenticationUtil; + } + /** * @param recordService record service */ @@ -74,6 +122,14 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase { NodeRef filePlan = (NodeRef) action.getParameterValue(PARAM_FILE_PLAN); + // resolve destination record folder if path supplied + NodeRef destinationRecordFolder = null; + String pathParameter = (String) action.getParameterValue(PARAM_PATH); + if (pathParameter != null) + { + destinationRecordFolder = resolvePath(action, filePlan, pathParameter); + } + // indicate whether the record should be hidden or not (default not) boolean hideRecord = false; Boolean hideRecordValue = ((Boolean) action.getParameterValue(PARAM_HIDE_RECORD)); @@ -85,7 +141,12 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase synchronized (this) { // create record from existing document - recordService.createRecord(filePlan, actionedUponNodeRef, !hideRecord); + recordService.createRecord(filePlan, actionedUponNodeRef, destinationRecordFolder, !hideRecord); + + if (destinationRecordFolder != null) + { + recordService.file(actionedUponNodeRef); + } } } @@ -97,6 +158,86 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase { // NOTE: commented out for now so that it doesn't appear in the UI ... enable later when multi-file plan support is added //params.add(new ParameterDefinitionImpl(PARAM_FILE_PLAN, DataTypeDefinition.NODE_REF, false, getParamDisplayLabel(PARAM_FILE_PLAN))); + params.add(new ParameterDefinitionImpl(PARAM_PATH, DataTypeDefinition.TEXT, false, getParamDisplayLabel(PARAM_PATH))); params.add(new ParameterDefinitionImpl(PARAM_HIDE_RECORD, DataTypeDefinition.BOOLEAN, false, getParamDisplayLabel(PARAM_HIDE_RECORD))); } + + /* Helper method to get the target record folder node reference from the action path parameter */ + private NodeRef resolvePath(final Action action, NodeRef filePlan, final String pathParameter) + { + NodeRef destinationFolder; + + if (filePlan == null) + { + filePlan = getDefaultFilePlan(action); + } + + final String[] pathElementsArray = StringUtils.tokenizeToStringArray(pathParameter, "/", false, true); + if ((pathElementsArray != null) && (pathElementsArray.length > 0)) + { + destinationFolder = resolvePath(action, filePlan, Arrays.asList(pathElementsArray)); + + // destination must be a record folder + QName nodeType = nodeService.getType(destinationFolder); + if (!nodeType.equals(RecordsManagementModel.TYPE_RECORD_FOLDER)) + { + throw new AlfrescoRuntimeException("Unable to execute " + action.getActionDefinitionName() + " action, because the destination path is not a record folder."); + } + } + else + { + throw new AlfrescoRuntimeException("Unable to execute " + action.getActionDefinitionName() + " action, because the destination path could not be resolved."); + } + return destinationFolder; + } + + /* Helper method to recursively get the next path element node reference from the action path parameter */ + private NodeRef resolvePath(Action action, NodeRef parent, List pathElements) + { + NodeRef nodeRef; + String childName = pathElements.get(0); + + nodeRef = nodeService.getChildByName(parent, ContentModel.ASSOC_CONTAINS, childName); + + if (nodeRef == null) + { + throw new AlfrescoRuntimeException("Unable to execute " + action.getActionDefinitionName() + " action, because the destination path could not be resolved."); + } + else + { + QName nodeType = nodeService.getType(nodeRef); + if (nodeType.equals(RecordsManagementModel.TYPE_HOLD_CONTAINER) || + nodeType.equals(RecordsManagementModel.TYPE_TRANSFER_CONTAINER) || + nodeType.equals(RecordsManagementModel.TYPE_UNFILED_RECORD_CONTAINER)) + { + throw new AlfrescoRuntimeException("Unable to execute " + action.getActionDefinitionName() + " action, because the destination path is invalid."); + } + } + if (pathElements.size() > 1) + { + nodeRef = resolvePath(action, nodeRef, pathElements.subList(1, pathElements.size())); + } + return nodeRef; + } + + /* Helper method to get the default RM filePlan */ + private NodeRef getDefaultFilePlan(final Action action) + { + NodeRef filePlan = authenticationUtil.runAs(new org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork() + { + @Override + public NodeRef doWork() + { + return filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID); + } + }, authenticationUtil.getAdminUserName()); + + // if the file plan is still null, raise an exception + if (filePlan == null) + { + logger.debug("Unable to execute " + action.getActionDefinitionName() + " action, because the path fileplan could not be determined. Make sure at least one file plan has been created."); + throw new AlfrescoRuntimeException("Unable to execute " + action.getActionDefinitionName() + " action, because the path fileplan could not be determined."); + } + return filePlan; + } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java index fd1209762d..d5a249f107 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java @@ -159,6 +159,31 @@ public interface RecordService */ boolean isDeclared(NodeRef nodeRef); + /** + * Creates a new record from an existing node and files it into the specified location. + *

+ * Note that the node reference of the record will be the same as the original + * document. + * + * @param filePlan The filePlan in which the record should be placed. filePlan can be null in this case the default RM site will be used. + * @param nodeRef The node from which the record will be created + * @param locationNodeRef The container in which the record will be created + * @param isLinked indicates if the newly created record is linked to it's original location or not. + */ + void createRecord(final NodeRef filePlan, final NodeRef nodeRef, final NodeRef locationNodeRef, final boolean isLinked); + + /** + * Creates a new record from an existing node and files it into the specified location. + *

+ * Note that the node reference of the record will be the same as the original + * document. + * + * @param filePlan The filePlan in which the record should be placed. filePlan can be null in this case the default RM site will be used. + * @param nodeRef The node from which the record will be created + * @param locationNodeRef The container in which the record will be created + */ + void createRecord(final NodeRef filePlan, final NodeRef nodeRef, final NodeRef locationNodeRef); + /** * Creates a new unfiled record from an existing node. *

diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index fc0c2615d2..91255cd918 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -812,7 +812,7 @@ public class RecordServiceImpl extends BaseBehaviourBean } /** - * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#getRecordMetaDataAspects(org.alfresco.service.cmr.repository.NodeRef) + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#getRecordMetadataAspects(org.alfresco.service.cmr.repository.NodeRef) */ @Override public Set getRecordMetadataAspects(NodeRef nodeRef) @@ -861,8 +861,27 @@ public class RecordServiceImpl extends BaseBehaviourBean */ @Override public void createRecord(final NodeRef filePlan, final NodeRef nodeRef, final boolean isLinked) + { + createRecord(filePlan, nodeRef, null, isLinked); + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#createRecord(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef) + */ + @Override + public void createRecord(final NodeRef filePlan, final NodeRef nodeRef, final NodeRef destinationNodeRef) + { + createRecord(filePlan, nodeRef, destinationNodeRef, true); + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#createRecord(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef, boolean) + */ + @Override + public void createRecord(final NodeRef filePlan, final NodeRef nodeRef, final NodeRef destinationNodeRef, final boolean isLinked) { // filePlan can be null. In this case the default RM site will be used. + // locationNodeRef can be null. In this case the unfiled record container will be used ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("isLinked", isLinked); @@ -882,11 +901,28 @@ public class RecordServiceImpl extends BaseBehaviourBean ruleService.disableRuleType("outbound"); try { - // get the new record container for the file plan - NodeRef newRecordContainer = filePlanService.getUnfiledContainer(checkedFilePlan); + NodeRef newRecordContainer = destinationNodeRef; + // if optional location not specified, use the unfiledContainer if (newRecordContainer == null) { - throw new AlfrescoRuntimeException("Unable to create record, because new record container could not be found."); + // get the new record container for the file plan + newRecordContainer = filePlanService.getUnfiledContainer(checkedFilePlan); + if (newRecordContainer == null) + { + throw new AlfrescoRuntimeException("Unable to create record, because new record container could not be found."); + } + + } + // if optional location supplied, check that it is a folder + else + { + // first look to see if the destination record folder has been specified + QName nodeType = nodeService.getType(newRecordContainer); + if(!(nodeType.equals(RecordsManagementModel.TYPE_RECORD_FOLDER) || + nodeType.equals(RecordsManagementModel.TYPE_UNFILED_RECORD_FOLDER))) + { + throw new AlfrescoRuntimeException("Unable to create record, because container is not a valid type for new record."); + } } // get the documents readers and writers @@ -1202,7 +1238,7 @@ public class RecordServiceImpl extends BaseBehaviourBean } /** - * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#createNewRecord(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map, org.alfresco.service.cmr.repository.ContentReader) + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#createRecordFromContent(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map, org.alfresco.service.cmr.repository.ContentReader) */ @Override public NodeRef createRecordFromContent(NodeRef parent, String name, QName type, Map properties, ContentReader reader) @@ -1322,7 +1358,7 @@ public class RecordServiceImpl extends BaseBehaviourBean } /** - * @see org.alfresco.module.org_alfresco_module_rm.disposableitem.RecordService#isFiled(org.alfresco.service.cmr.repository.NodeRef) + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isFiled(org.alfresco.service.cmr.repository.NodeRef) */ @Override public boolean isFiled(final NodeRef nodeRef) diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/CreateRecordActionTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/CreateRecordActionTest.java index 0afe5d76f5..fab575f6c2 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/CreateRecordActionTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/CreateRecordActionTest.java @@ -31,6 +31,7 @@ import org.alfresco.module.org_alfresco_module_rm.action.dm.CreateRecordAction; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; import org.alfresco.service.cmr.action.Action; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.AccessStatus; /** @@ -75,8 +76,38 @@ public class CreateRecordActionTest extends BaseRMTestCase assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(dmDocument, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.VIEW_RECORDS)); - }; + } }, dmCollaborator); } + + public void testCreateRecordActionWithLocation() + { + doTestInTransaction(new Test() + { + public Void run() + { + assertFalse(recordService.isRecord(dmDocument1)); + + Action action = actionService.createAction(CreateRecordAction.NAME); + action.setParameterValue(CreateRecordAction.PARAM_HIDE_RECORD, false); + action.setParameterValue(CreateRecordAction.PARAM_FILE_PLAN, filePlan); + action.setParameterValue(CreateRecordAction.PARAM_PATH, "rmContainer/rmFolder"); + actionService.executeAction(action, dmDocument1); + + return null; + } + + public void test(Void result) throws Exception + { + assertTrue(recordService.isRecord(dmDocument1)); + assertTrue(recordService.isFiled(dmDocument1)); + + // is the record folder the primary parent of the filed record + NodeRef parent = nodeService.getPrimaryParent(dmDocument1).getParentRef(); + assertEquals(rmFolder, parent); + } + }, + ADMIN_USER); + } } diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java index 98862908ab..00b3b4b400 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java @@ -123,6 +123,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase /** test data */ protected String NAME_DM_DOCUMENT = "collabDocument.txt"; + protected String NAME_DM_DOCUMENT1 = "collabDocument1.txt"; /** admin user */ protected static final String ADMIN_USER = "admin"; @@ -274,6 +275,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase protected NodeRef documentLibrary; protected NodeRef dmFolder; protected NodeRef dmDocument; + protected NodeRef dmDocument1; /** collaboration site users */ protected String dmConsumer; @@ -779,6 +781,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase // create a folder and documents dmFolder = fileFolderService.create(documentLibrary, "collabFolder", ContentModel.TYPE_FOLDER).getNodeRef(); dmDocument = fileFolderService.create(dmFolder, NAME_DM_DOCUMENT, ContentModel.TYPE_CONTENT).getNodeRef(); + dmDocument1 = fileFolderService.create(dmFolder, NAME_DM_DOCUMENT1, ContentModel.TYPE_CONTENT).getNodeRef(); dmConsumer = GUID.generate(); dmConsumerNodeRef = createPerson(dmConsumer); diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java index a2bf96b29d..c38b5cf2e1 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java @@ -45,12 +45,15 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; import org.alfresco.repo.policy.Behaviour; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.AccessStatus; +import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.apache.commons.collections.CollectionUtils; @@ -69,6 +72,9 @@ public class RecordServiceImplUnitTest extends BaseUnitTest { private NodeRef nonStandardFilePlanComponent; private NodeRef nonStandardFilePlan; + private NodeRef dmNodeRef; + private NodeRef unfiledRecordFolder; + private ChildAssociationRef parentAssoc; private static QName TYPE_MY_FILE_PLAN = generateQName(); private static QName ASPECT_FOR_FILE_PLAN = generateQName(); @@ -84,6 +90,9 @@ public class RecordServiceImplUnitTest extends BaseUnitTest nonStandardFilePlanComponent = generateNodeRef(TYPE_RECORD_CATEGORY); nonStandardFilePlan = generateNodeRef(TYPE_MY_FILE_PLAN); + dmNodeRef = generateNodeRef(TYPE_CONTENT); + unfiledRecordFolder = generateNodeRef(TYPE_UNFILED_RECORD_FOLDER); + parentAssoc = mock(ChildAssociationRef.class); // set-up node service when(mockedNodeService.getProperty(nonStandardFilePlanComponent, PROP_ROOT_NODEREF)).thenReturn(nonStandardFilePlan); @@ -462,4 +471,103 @@ public class RecordServiceImplUnitTest extends BaseUnitTest // verify verify(values, never()).add(nodeRef); } + + /** + * Given a file that is not yet a record + * When I create the record without specifying a location + * Then the record is created in the unfiled record folder + */ + @Test + public void createRecordIntoUnfiledRecordFolder() + { + mocksForRecordCreation(); + + // create the record + recordService.createRecord(nonStandardFilePlan, dmNodeRef); + + // verify record was created in unfiled record container + verify(mockedNodeService, times(1)).moveNode( + dmNodeRef, + unfiledRecordFolder, + ContentModel.ASSOC_CONTAINS, + parentAssoc.getQName()); + } + + /** + * Given a file that is not yet a record + * When I create the record specifying the unfiled record folder + * Then the record is created in the unfiled record folder + */ + @Test + public void createRecordIntoSpecifiedUnfiledRecordFolder() + { + mocksForRecordCreation(); + + // create the record + recordService.createRecord(nonStandardFilePlan, dmNodeRef, unfiledRecordFolder); + + // verify record was created in specified record folder + verify(mockedNodeService, times(1)).moveNode( + dmNodeRef, + unfiledRecordFolder, + ContentModel.ASSOC_CONTAINS, + parentAssoc.getQName()); + } + + /** + * Given a file that is not yet a record + * When I create the record specifying a location + * Then the record is created in the specified record folder + */ + @Test + public void createRecordIntoSpecifiedRecordFolder() + { + mocksForRecordCreation(); + + // create the record + recordService.createRecord(nonStandardFilePlan, dmNodeRef, recordFolder); + + // verify record was created in specified record folder + verify(mockedNodeService, times(1)).moveNode( + dmNodeRef, + recordFolder, + ContentModel.ASSOC_CONTAINS, + parentAssoc.getQName()); + } + + /** + * Given a file that is not yet a record + * When I create the record specifying an invalid location + * Then an exception is thrown + */ + @Test(expected=AlfrescoRuntimeException.class) + public void createRecordIntoInvalidRecordFolder() + { + mocksForRecordCreation(); + NodeRef recordCategory = generateNodeRef(TYPE_RECORD_CATEGORY); + + // create the record + recordService.createRecord(nonStandardFilePlan, dmNodeRef, recordCategory); + } + + /* Helper method to set up the mocks for record creation */ + private void mocksForRecordCreation() + { + when(mockedNodeService.getPrimaryParent(dmNodeRef)) + .thenReturn(parentAssoc); + when(parentAssoc.getQName()).thenReturn(generateQName()); + + // mocks for sanity checks on node and fileplan + when(mockedExtendedPermissionService.hasPermission(dmNodeRef, PermissionService.WRITE)).thenReturn(AccessStatus.ALLOWED); + when(mockedDictionaryService.isSubClass(mockedNodeService.getType(dmNodeRef), ContentModel.TYPE_CONTENT)).thenReturn(true); + when(mockedFilePlanService.isFilePlan(nonStandardFilePlan)).thenReturn(true); + + // mocks for policies + doNothing().when(recordService).invokeBeforeRecordDeclaration(dmNodeRef); + doNothing().when(recordService).invokeOnRecordDeclaration(dmNodeRef); + + when(mockedFilePlanService.getUnfiledContainer(nonStandardFilePlan)).thenReturn(unfiledRecordFolder); + + when(mockedVersionService.getVersionHistory(dmNodeRef)).thenReturn(null); + } } diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java index be68a337d2..b4ab37fed1 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java @@ -72,10 +72,12 @@ import org.alfresco.service.cmr.repository.CopyService; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.rule.RuleService; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.AuthorityService; import org.alfresco.service.cmr.security.OwnableService; import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.cmr.version.VersionService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QNamePattern; @@ -122,6 +124,8 @@ public class BaseUnitTest implements RecordsManagementModel, ContentModel @Mock(name="copyService") protected CopyService mockedCopyService; @Mock(name="fileFolderService") protected FileFolderService mockedFileFolderService; @Mock(name="modelSecurityService") protected ModelSecurityService mockedModelSecurityService; + @Mock(name="ruleService") protected RuleService mockedRuleService; + @Mock(name="versionService") protected VersionService mockedVersionService; /** rm service mocks */ @Mock(name="filePlanService") protected FilePlanService mockedFilePlanService; From f2e5c9c6a855a678e2aab5f4304f886a2e492f18 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Fri, 10 May 2019 15:26:17 +0100 Subject: [PATCH 2/6] RM-6792 Oliver strings and fix closed folder and tests --- .../messages/actions.properties | 2 +- .../action/dm/CreateRecordAction.java | 56 ++++++++++++------- .../record/RecordServiceImpl.java | 10 +++- .../legacy/action/CreateRecordActionTest.java | 7 +++ .../test/util/BaseRMTestCase.java | 4 +- 5 files changed, 54 insertions(+), 25 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties index c1e8bce28e..e2d43aa52b 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties @@ -48,7 +48,7 @@ isRecordType.description=Records have a specified record type # # Declare As Record create-record.title=Declare as Record -create-record.description=Declares file as a record +create-record.description=Declares file as a record and optionally files it create-record.file-plan.display-label=File Plan create-record.hide-record.display-label=Hide Record create-record.path.display-label=Destination Record Folder Path diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java index 9cf67a954d..bd60827fcc 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java @@ -60,7 +60,7 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase implements RecordsManagementModel { /** Logger */ - private static Log logger = LogFactory.getLog(CreateRecordAction.class); + private static final Log LOGGER = LogFactory.getLog(CreateRecordAction.class); /** Action name */ public static final String NAME = "create-record"; @@ -125,9 +125,9 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase // resolve destination record folder if path supplied NodeRef destinationRecordFolder = null; String pathParameter = (String) action.getParameterValue(PARAM_PATH); - if (pathParameter != null) + if (pathParameter != null && !pathParameter.isEmpty()) { - destinationRecordFolder = resolvePath(action, filePlan, pathParameter); + destinationRecordFolder = resolvePath(filePlan, pathParameter); } // indicate whether the record should be hidden or not (default not) @@ -162,37 +162,49 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase params.add(new ParameterDefinitionImpl(PARAM_HIDE_RECORD, DataTypeDefinition.BOOLEAN, false, getParamDisplayLabel(PARAM_HIDE_RECORD))); } - /* Helper method to get the target record folder node reference from the action path parameter */ - private NodeRef resolvePath(final Action action, NodeRef filePlan, final String pathParameter) + /** + * Helper method to get the target record folder node reference from the action path parameter + * + * @param filePlan The filePlan containing the path + * @param pathParameter The path + * @return The NodeRef of the resolved path + */ + private NodeRef resolvePath(NodeRef filePlan, final String pathParameter) { NodeRef destinationFolder; if (filePlan == null) { - filePlan = getDefaultFilePlan(action); + filePlan = getDefaultFilePlan(); } final String[] pathElementsArray = StringUtils.tokenizeToStringArray(pathParameter, "/", false, true); if ((pathElementsArray != null) && (pathElementsArray.length > 0)) { - destinationFolder = resolvePath(action, filePlan, Arrays.asList(pathElementsArray)); + destinationFolder = resolvePath(filePlan, Arrays.asList(pathElementsArray)); // destination must be a record folder QName nodeType = nodeService.getType(destinationFolder); if (!nodeType.equals(RecordsManagementModel.TYPE_RECORD_FOLDER)) { - throw new AlfrescoRuntimeException("Unable to execute " + action.getActionDefinitionName() + " action, because the destination path is not a record folder."); + throw new AlfrescoRuntimeException("Unable to execute " + NAME + " action, because the destination path is not a record folder."); } } else { - throw new AlfrescoRuntimeException("Unable to execute " + action.getActionDefinitionName() + " action, because the destination path could not be resolved."); + throw new AlfrescoRuntimeException("Unable to execute " + NAME + " action, because the destination path could not be found."); } return destinationFolder; } - /* Helper method to recursively get the next path element node reference from the action path parameter */ - private NodeRef resolvePath(Action action, NodeRef parent, List pathElements) + /** + * Helper method to recursively get the next path element node reference from the action path parameter + * + * @param parent The parent of the path elements + * @param pathElements The path elements still to be resolved + * @return The NodeRef of the resolved path element + */ + private NodeRef resolvePath(NodeRef parent, List pathElements) { NodeRef nodeRef; String childName = pathElements.get(0); @@ -201,7 +213,7 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase if (nodeRef == null) { - throw new AlfrescoRuntimeException("Unable to execute " + action.getActionDefinitionName() + " action, because the destination path could not be resolved."); + throw new AlfrescoRuntimeException("Unable to execute " + NAME + " action, because the destination path could not be resolved."); } else { @@ -210,33 +222,37 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase nodeType.equals(RecordsManagementModel.TYPE_TRANSFER_CONTAINER) || nodeType.equals(RecordsManagementModel.TYPE_UNFILED_RECORD_CONTAINER)) { - throw new AlfrescoRuntimeException("Unable to execute " + action.getActionDefinitionName() + " action, because the destination path is invalid."); + throw new AlfrescoRuntimeException("Unable to execute " + NAME + " action, because the destination path is invalid."); } } if (pathElements.size() > 1) { - nodeRef = resolvePath(action, nodeRef, pathElements.subList(1, pathElements.size())); + nodeRef = resolvePath(nodeRef, pathElements.subList(1, pathElements.size())); } return nodeRef; } - /* Helper method to get the default RM filePlan */ - private NodeRef getDefaultFilePlan(final Action action) + /** + * Helper method to get the default RM filePlan + * + * @return The NodeRef of the default RM filePlan + */ + private NodeRef getDefaultFilePlan() { - NodeRef filePlan = authenticationUtil.runAs(new org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork() + NodeRef filePlan = authenticationUtil.runAsSystem(new org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork() { @Override public NodeRef doWork() { return filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID); } - }, authenticationUtil.getAdminUserName()); + }); // if the file plan is still null, raise an exception if (filePlan == null) { - logger.debug("Unable to execute " + action.getActionDefinitionName() + " action, because the path fileplan could not be determined. Make sure at least one file plan has been created."); - throw new AlfrescoRuntimeException("Unable to execute " + action.getActionDefinitionName() + " action, because the path fileplan could not be determined."); + LOGGER.debug("Unable to execute " + NAME + " action, because the fileplan path could not be determined. Make sure at least one file plan has been created."); + throw new AlfrescoRuntimeException("Unable to execute " + NAME + " action, because the fileplan path could not be determined."); } return filePlan; } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index 91255cd918..dfbebbf810 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -911,18 +911,22 @@ public class RecordServiceImpl extends BaseBehaviourBean { throw new AlfrescoRuntimeException("Unable to create record, because new record container could not be found."); } - } - // if optional location supplied, check that it is a folder + // if optional location supplied, check that it is a valid record folder else { - // first look to see if the destination record folder has been specified QName nodeType = nodeService.getType(newRecordContainer); if(!(nodeType.equals(RecordsManagementModel.TYPE_RECORD_FOLDER) || nodeType.equals(RecordsManagementModel.TYPE_UNFILED_RECORD_FOLDER))) { throw new AlfrescoRuntimeException("Unable to create record, because container is not a valid type for new record."); } + + Boolean isClosed = (Boolean) nodeService.getProperty(newRecordContainer, PROP_IS_CLOSED); + if (isClosed != null && isClosed) + { + throw new AlfrescoRuntimeException("Unable to create record, because container is closed."); + } } // get the documents readers and writers diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/CreateRecordActionTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/CreateRecordActionTest.java index fab575f6c2..9bb0a18d0d 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/CreateRecordActionTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/CreateRecordActionTest.java @@ -53,6 +53,13 @@ public class CreateRecordActionTest extends BaseRMTestCase return true; } + /** + * Test create record action + * + * Given a collaboration site document + * When the create record action is executed for that document + * Then a record is created for it + */ public void testCreateRecordAction() { doTestInTransaction(new Test() diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java index 00b3b4b400..09667ed0f9 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java @@ -274,6 +274,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase protected SiteInfo collaborationSite; protected NodeRef documentLibrary; protected NodeRef dmFolder; + protected NodeRef dmFolder1; protected NodeRef dmDocument; protected NodeRef dmDocument1; @@ -781,7 +782,8 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase // create a folder and documents dmFolder = fileFolderService.create(documentLibrary, "collabFolder", ContentModel.TYPE_FOLDER).getNodeRef(); dmDocument = fileFolderService.create(dmFolder, NAME_DM_DOCUMENT, ContentModel.TYPE_CONTENT).getNodeRef(); - dmDocument1 = fileFolderService.create(dmFolder, NAME_DM_DOCUMENT1, ContentModel.TYPE_CONTENT).getNodeRef(); + dmFolder1 = fileFolderService.create(documentLibrary, "collabFolder1", ContentModel.TYPE_FOLDER).getNodeRef(); + dmDocument1 = fileFolderService.create(dmFolder1, NAME_DM_DOCUMENT1, ContentModel.TYPE_CONTENT).getNodeRef(); dmConsumer = GUID.generate(); dmConsumerNodeRef = createPerson(dmConsumer); From e4ffc81ed453b6ecd655b2415670c04ff14b2eef Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Thu, 16 May 2019 10:44:29 +0100 Subject: [PATCH 3/6] RM-6792 updates from review 1 --- .../action/dm/CreateRecordAction.java | 9 ++++++--- .../record/RecordServiceImpl.java | 4 ++-- .../record/RecordServiceImplUnitTest.java | 18 +++++++++--------- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java index bd60827fcc..8684092a73 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/CreateRecordAction.java @@ -213,7 +213,7 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase if (nodeRef == null) { - throw new AlfrescoRuntimeException("Unable to execute " + NAME + " action, because the destination path could not be resolved."); + throw new AlfrescoRuntimeException("Unable to execute " + NAME + " action, because the destination path could not be found."); } else { @@ -251,8 +251,11 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase // if the file plan is still null, raise an exception if (filePlan == null) { - LOGGER.debug("Unable to execute " + NAME + " action, because the fileplan path could not be determined. Make sure at least one file plan has been created."); - throw new AlfrescoRuntimeException("Unable to execute " + NAME + " action, because the fileplan path could not be determined."); + if (LOGGER.isDebugEnabled()) + { + LOGGER.debug("Unable to execute " + NAME + " action, because the fileplan path could not be determined. Make sure at least one file plan has been created."); + throw new AlfrescoRuntimeException("Unable to execute " + NAME + " action, because the fileplan path could not be determined."); + } } return filePlan; } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index dfbebbf810..2a31b852c5 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -881,7 +881,7 @@ public class RecordServiceImpl extends BaseBehaviourBean public void createRecord(final NodeRef filePlan, final NodeRef nodeRef, final NodeRef destinationNodeRef, final boolean isLinked) { // filePlan can be null. In this case the default RM site will be used. - // locationNodeRef can be null. In this case the unfiled record container will be used + // destinationNodeRef can be null. In this case the unfiled record container will be used ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("isLinked", isLinked); @@ -909,7 +909,7 @@ public class RecordServiceImpl extends BaseBehaviourBean newRecordContainer = filePlanService.getUnfiledContainer(checkedFilePlan); if (newRecordContainer == null) { - throw new AlfrescoRuntimeException("Unable to create record, because new record container could not be found."); + throw new AlfrescoRuntimeException("Unable to create record, because record container could not be found."); } } // if optional location supplied, check that it is a valid record folder diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java index c38b5cf2e1..5574d1a1ae 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java @@ -475,10 +475,10 @@ public class RecordServiceImplUnitTest extends BaseUnitTest /** * Given a file that is not yet a record * When I create the record without specifying a location - * Then the record is created in the unfiled record folder + * Then the record is created in the unfiled record container */ @Test - public void createRecordIntoUnfiledRecordFolder() + public void createRecordIntoUnfiledRecordContainer() { mocksForRecordCreation(); @@ -495,18 +495,18 @@ public class RecordServiceImplUnitTest extends BaseUnitTest /** * Given a file that is not yet a record - * When I create the record specifying the unfiled record folder - * Then the record is created in the unfiled record folder + * When I create the record specifying the unfiled record container + * Then the record is created in the unfiled record container */ @Test - public void createRecordIntoSpecifiedUnfiledRecordFolder() + public void createRecordIntoSpecifiedUnfiledRecordContainer() { mocksForRecordCreation(); // create the record - recordService.createRecord(nonStandardFilePlan, dmNodeRef, unfiledRecordFolder); + recordService.createRecord(filePlan, dmNodeRef, unfiledRecordFolder); - // verify record was created in specified record folder + // verify record was created in specified unfiled record container verify(mockedNodeService, times(1)).moveNode( dmNodeRef, unfiledRecordFolder, @@ -525,7 +525,7 @@ public class RecordServiceImplUnitTest extends BaseUnitTest mocksForRecordCreation(); // create the record - recordService.createRecord(nonStandardFilePlan, dmNodeRef, recordFolder); + recordService.createRecord(filePlan, dmNodeRef, recordFolder); // verify record was created in specified record folder verify(mockedNodeService, times(1)).moveNode( @@ -547,7 +547,7 @@ public class RecordServiceImplUnitTest extends BaseUnitTest NodeRef recordCategory = generateNodeRef(TYPE_RECORD_CATEGORY); // create the record - recordService.createRecord(nonStandardFilePlan, dmNodeRef, recordCategory); + recordService.createRecord(filePlan, dmNodeRef, recordCategory); } /* Helper method to set up the mocks for record creation */ From b13d5a90044bb83663dcaee4369b05026746311b Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Mon, 20 May 2019 06:39:56 +0100 Subject: [PATCH 4/6] RM-6792 updates from review - sonar --- .../module/org_alfresco_module_rm/record/RecordServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index caf754fcf4..4e4f9740d0 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -915,7 +915,7 @@ public class RecordServiceImpl extends BaseBehaviourBean // if optional location supplied, check that it is a valid record folder else { - QName nodeType = nodeService.getType(newRecordContainer); + final QName nodeType = nodeService.getType(newRecordContainer); if(!(nodeType.equals(RecordsManagementModel.TYPE_RECORD_FOLDER) || nodeType.equals(RecordsManagementModel.TYPE_UNFILED_RECORD_FOLDER))) { From 6aa99b03bbcf195a5a8b8c293ee0874426ad3007 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Tue, 21 May 2019 12:39:46 +0100 Subject: [PATCH 5/6] RM-6792 review - change unfiled folder to container --- .../record/RecordServiceImpl.java | 3 ++- .../record/RecordServiceImplUnitTest.java | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index 4e4f9740d0..868cfbee95 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -917,7 +917,8 @@ public class RecordServiceImpl extends BaseBehaviourBean { final QName nodeType = nodeService.getType(newRecordContainer); if(!(nodeType.equals(RecordsManagementModel.TYPE_RECORD_FOLDER) || - nodeType.equals(RecordsManagementModel.TYPE_UNFILED_RECORD_FOLDER))) + nodeType.equals(RecordsManagementModel.TYPE_UNFILED_RECORD_FOLDER) || + nodeType.equals(RecordsManagementModel.TYPE_UNFILED_RECORD_CONTAINER))) { throw new AlfrescoRuntimeException("Unable to create record, because container is not a valid type for new record."); } diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java index 5574d1a1ae..43a717d4b3 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java @@ -73,6 +73,7 @@ public class RecordServiceImplUnitTest extends BaseUnitTest private NodeRef nonStandardFilePlanComponent; private NodeRef nonStandardFilePlan; private NodeRef dmNodeRef; + private NodeRef unfiledRecordContainer; private NodeRef unfiledRecordFolder; private ChildAssociationRef parentAssoc; @@ -91,6 +92,7 @@ public class RecordServiceImplUnitTest extends BaseUnitTest nonStandardFilePlanComponent = generateNodeRef(TYPE_RECORD_CATEGORY); nonStandardFilePlan = generateNodeRef(TYPE_MY_FILE_PLAN); dmNodeRef = generateNodeRef(TYPE_CONTENT); + unfiledRecordContainer = generateNodeRef(TYPE_UNFILED_RECORD_CONTAINER); unfiledRecordFolder = generateNodeRef(TYPE_UNFILED_RECORD_FOLDER); parentAssoc = mock(ChildAssociationRef.class); @@ -483,12 +485,12 @@ public class RecordServiceImplUnitTest extends BaseUnitTest mocksForRecordCreation(); // create the record - recordService.createRecord(nonStandardFilePlan, dmNodeRef); + recordService.createRecord(filePlan, dmNodeRef); // verify record was created in unfiled record container verify(mockedNodeService, times(1)).moveNode( dmNodeRef, - unfiledRecordFolder, + unfiledRecordContainer, ContentModel.ASSOC_CONTAINS, parentAssoc.getQName()); } @@ -504,12 +506,12 @@ public class RecordServiceImplUnitTest extends BaseUnitTest mocksForRecordCreation(); // create the record - recordService.createRecord(filePlan, dmNodeRef, unfiledRecordFolder); + recordService.createRecord(filePlan, dmNodeRef, unfiledRecordContainer); // verify record was created in specified unfiled record container verify(mockedNodeService, times(1)).moveNode( dmNodeRef, - unfiledRecordFolder, + unfiledRecordContainer, ContentModel.ASSOC_CONTAINS, parentAssoc.getQName()); } @@ -566,7 +568,7 @@ public class RecordServiceImplUnitTest extends BaseUnitTest doNothing().when(recordService).invokeBeforeRecordDeclaration(dmNodeRef); doNothing().when(recordService).invokeOnRecordDeclaration(dmNodeRef); - when(mockedFilePlanService.getUnfiledContainer(nonStandardFilePlan)).thenReturn(unfiledRecordFolder); + when(mockedFilePlanService.getUnfiledContainer(filePlan)).thenReturn(unfiledRecordContainer); when(mockedVersionService.getVersionHistory(dmNodeRef)).thenReturn(null); } From b27239abf5cc263dff6c496272247e6497f28214 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Tue, 21 May 2019 12:48:32 +0100 Subject: [PATCH 6/6] RM-6792 review - change unfiled folder to container --- .../org_alfresco_module_rm/record/RecordServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index 868cfbee95..3662dfb9e9 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -905,14 +905,14 @@ public class RecordServiceImpl extends BaseBehaviourBean // if optional location not specified, use the unfiledContainer if (newRecordContainer == null) { - // get the new record container for the file plan + // get the unfiled record container node for the file plan newRecordContainer = filePlanService.getUnfiledContainer(checkedFilePlan); if (newRecordContainer == null) { throw new AlfrescoRuntimeException("Unable to create record, because record container could not be found."); } } - // if optional location supplied, check that it is a valid record folder + // if optional location supplied, check that it is a valid record folder, unfiled record container or folder else { final QName nodeType = nodeService.getType(newRecordContainer);