From da22f3c3c47bf65c90679e143e3e3f6cf1ed7ec9 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Fri, 10 May 2019 14:47:38 +0100 Subject: [PATCH 01/21] RM-6792 Oliver strings and fix closed folder and tests --- .../org_alfresco_module_rm/action-context.xml | 3 + .../messages/actions.properties | 3 +- .../action/dm/CreateRecordAction.java | 159 +++++++++++++++++- .../record/RecordService.java | 25 +++ .../record/RecordServiceImpl.java | 53 +++++- .../legacy/action/CreateRecordActionTest.java | 47 +++++- .../test/util/BaseRMTestCase.java | 5 + .../record/RecordServiceImplUnitTest.java | 108 ++++++++++++ .../test/util/BaseUnitTest.java | 4 + 9 files changed, 398 insertions(+), 9 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 d1dda0a2e9..c80360da50 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 @@ -16,6 +16,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..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,9 +48,10 @@ 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 # 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..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 @@ -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 final 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 && !pathParameter.isEmpty()) + { + destinationRecordFolder = resolvePath(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,102 @@ 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 + * + * @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(); + } + + final String[] pathElementsArray = StringUtils.tokenizeToStringArray(pathParameter, "/", false, true); + if ((pathElementsArray != null) && (pathElementsArray.length > 0)) + { + 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 " + NAME + " action, because the destination path is not a record folder."); + } + } + else + { + 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 + * + * @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); + + nodeRef = nodeService.getChildByName(parent, ContentModel.ASSOC_CONTAINS, childName); + + if (nodeRef == null) + { + throw new AlfrescoRuntimeException("Unable to execute " + NAME + " 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 " + NAME + " action, because the destination path is invalid."); + } + } + if (pathElements.size() > 1) + { + nodeRef = resolvePath(nodeRef, pathElements.subList(1, pathElements.size())); + } + return nodeRef; + } + + /** + * Helper method to get the default RM filePlan + * + * @return The NodeRef of the default RM filePlan + */ + private NodeRef getDefaultFilePlan() + { + NodeRef filePlan = authenticationUtil.runAsSystem(new org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork() + { + @Override + public NodeRef doWork() + { + return filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID); + } + }); + + // 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."); + } + 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..031caf5a9c 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,33 @@ 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 valid record folder + else + { + 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 @@ -1202,7 +1243,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 +1363,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..16450b107d 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; /** @@ -52,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() @@ -75,8 +83,45 @@ public class CreateRecordActionTest extends BaseRMTestCase assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(dmDocument, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.VIEW_RECORDS)); - }; + } }, dmCollaborator); } + + /** + * Test create record action with optional location + * + * Given a collaboration site document + * When the create record action with optional record location is executed for that document + * Then a record is created for it and filed in the specified location + */ + 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 4eeb564b49..a47d89dc5f 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"; @@ -273,7 +274,9 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase protected SiteInfo collaborationSite; protected NodeRef documentLibrary; protected NodeRef dmFolder; + protected NodeRef dmFolder1; protected NodeRef dmDocument; + protected NodeRef dmDocument1; /** collaboration site users */ protected String dmConsumer; @@ -786,6 +789,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(); + 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); 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 8186baf452cb5e245212203670305dc1c3ce1dbb Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Fri, 10 May 2019 15:44:32 +0100 Subject: [PATCH 02/21] Revert "RM-6792 Oliver strings and fix closed folder and tests" This reverts commit da22f3c3c47bf65c90679e143e3e3f6cf1ed7ec9 --- .../org_alfresco_module_rm/action-context.xml | 3 - .../messages/actions.properties | 3 +- .../action/dm/CreateRecordAction.java | 159 +----------------- .../record/RecordService.java | 25 --- .../record/RecordServiceImpl.java | 53 +----- .../legacy/action/CreateRecordActionTest.java | 47 +----- .../test/util/BaseRMTestCase.java | 5 - .../record/RecordServiceImplUnitTest.java | 108 ------------ .../test/util/BaseUnitTest.java | 4 - 9 files changed, 9 insertions(+), 398 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 c80360da50..d1dda0a2e9 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 @@ -16,9 +16,6 @@ - - - {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 e2d43aa52b..3b4c93b3d4 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,10 +48,9 @@ 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 and optionally files it +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 bd60827fcc..2869b9c755 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,27 +27,16 @@ 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. @@ -59,53 +48,16 @@ import org.apache.commons.logging.LogFactory; public class CreateRecordAction extends AuditableActionExecuterAbstractBase implements RecordsManagementModel { - /** Logger */ - private static final 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 */ @@ -122,14 +74,6 @@ 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 && !pathParameter.isEmpty()) - { - destinationRecordFolder = resolvePath(filePlan, pathParameter); - } - // indicate whether the record should be hidden or not (default not) boolean hideRecord = false; Boolean hideRecordValue = ((Boolean) action.getParameterValue(PARAM_HIDE_RECORD)); @@ -141,12 +85,7 @@ public class CreateRecordAction extends AuditableActionExecuterAbstractBase synchronized (this) { // create record from existing document - recordService.createRecord(filePlan, actionedUponNodeRef, destinationRecordFolder, !hideRecord); - - if (destinationRecordFolder != null) - { - recordService.file(actionedUponNodeRef); - } + recordService.createRecord(filePlan, actionedUponNodeRef, !hideRecord); } } @@ -158,102 +97,6 @@ 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 - * - * @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(); - } - - final String[] pathElementsArray = StringUtils.tokenizeToStringArray(pathParameter, "/", false, true); - if ((pathElementsArray != null) && (pathElementsArray.length > 0)) - { - 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 " + NAME + " action, because the destination path is not a record folder."); - } - } - else - { - 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 - * - * @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); - - nodeRef = nodeService.getChildByName(parent, ContentModel.ASSOC_CONTAINS, childName); - - if (nodeRef == null) - { - throw new AlfrescoRuntimeException("Unable to execute " + NAME + " 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 " + NAME + " action, because the destination path is invalid."); - } - } - if (pathElements.size() > 1) - { - nodeRef = resolvePath(nodeRef, pathElements.subList(1, pathElements.size())); - } - return nodeRef; - } - - /** - * Helper method to get the default RM filePlan - * - * @return The NodeRef of the default RM filePlan - */ - private NodeRef getDefaultFilePlan() - { - NodeRef filePlan = authenticationUtil.runAsSystem(new org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork() - { - @Override - public NodeRef doWork() - { - return filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID); - } - }); - - // 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."); - } - 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 d5a249f107..fd1209762d 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,31 +159,6 @@ 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 031caf5a9c..fc0c2615d2 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,27 +861,8 @@ 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); @@ -901,33 +882,11 @@ public class RecordServiceImpl extends BaseBehaviourBean ruleService.disableRuleType("outbound"); try { - NodeRef newRecordContainer = destinationNodeRef; - // if optional location not specified, use the unfiledContainer + // get the new record container for the file plan + NodeRef newRecordContainer = filePlanService.getUnfiledContainer(checkedFilePlan); if (newRecordContainer == null) { - // 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 valid record folder - else - { - 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."); - } + throw new AlfrescoRuntimeException("Unable to create record, because new record container could not be found."); } // get the documents readers and writers @@ -1243,7 +1202,7 @@ public class RecordServiceImpl extends BaseBehaviourBean } /** - * @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) + * @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) */ @Override public NodeRef createRecordFromContent(NodeRef parent, String name, QName type, Map properties, ContentReader reader) @@ -1363,7 +1322,7 @@ public class RecordServiceImpl extends BaseBehaviourBean } /** - * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isFiled(org.alfresco.service.cmr.repository.NodeRef) + * @see org.alfresco.module.org_alfresco_module_rm.disposableitem.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 16450b107d..0afe5d76f5 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,7 +31,6 @@ 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; /** @@ -53,13 +52,6 @@ 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() @@ -83,45 +75,8 @@ public class CreateRecordActionTest extends BaseRMTestCase assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(dmDocument, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.VIEW_RECORDS)); - } + }; }, dmCollaborator); } - - /** - * Test create record action with optional location - * - * Given a collaboration site document - * When the create record action with optional record location is executed for that document - * Then a record is created for it and filed in the specified location - */ - 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 a47d89dc5f..4eeb564b49 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,7 +123,6 @@ 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,9 +273,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; /** collaboration site users */ protected String dmConsumer; @@ -789,8 +786,6 @@ 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(); - 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); 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..a2bf96b29d 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,15 +45,12 @@ 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; @@ -72,9 +69,6 @@ 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(); @@ -90,9 +84,6 @@ 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); @@ -471,103 +462,4 @@ 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 b4ab37fed1..be68a337d2 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,12 +72,10 @@ 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; @@ -124,8 +122,6 @@ 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 2742f702209b8129450803004933a62e3fa18ddf Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 5 Nov 2018 18:51:34 +0200 Subject: [PATCH 03/21] update tas rest api version to 5.2.0.12 (cherry picked from commit f76491b09fb9d2daff3387a4d19de32fd0dd179d) --- rm-automation/rm-automation-community-rest-api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-automation/rm-automation-community-rest-api/pom.xml b/rm-automation/rm-automation-community-rest-api/pom.xml index d45d244d80..31c2e1257b 100644 --- a/rm-automation/rm-automation-community-rest-api/pom.xml +++ b/rm-automation/rm-automation-community-rest-api/pom.xml @@ -15,7 +15,7 @@ 1.8 alfresco-rm-community-share alfresco-rm-community-repo - 5.2.0-10 + 5.2.0.12 2.0.0 From 76658f0206696fa6827a39d34bd55c9071a5f12d Mon Sep 17 00:00:00 2001 From: Tom Page Date: Wed, 20 Feb 2019 08:38:17 +0000 Subject: [PATCH 04/21] Update TAS rest api to the latest version from 5.2.0.X - 5.2.0.15 --- rm-automation/rm-automation-community-rest-api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-automation/rm-automation-community-rest-api/pom.xml b/rm-automation/rm-automation-community-rest-api/pom.xml index 31c2e1257b..ca48d73c46 100644 --- a/rm-automation/rm-automation-community-rest-api/pom.xml +++ b/rm-automation/rm-automation-community-rest-api/pom.xml @@ -15,7 +15,7 @@ 1.8 alfresco-rm-community-share alfresco-rm-community-repo - 5.2.0.12 + 5.2.0.15 2.0.0 From 84aca54f31d2e1723c0b1b7ad17273c867ed6558 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Tue, 6 Nov 2018 09:04:24 +0200 Subject: [PATCH 05/21] adding search tests for the SQL support (cherry picked from commit 29f2ddf2203261f477464528a9f5b83a7679223c) # Conflicts: # rm-automation/rm-automation-enterprise-rest-api/pom.xml --- .../alfresco/rest/rm/community/base/BaseRMRestTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java index aa65f8c967..428b338910 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java @@ -57,6 +57,7 @@ import java.util.stream.Collectors; import org.alfresco.dataprep.ContentService; import org.alfresco.rest.RestTest; import org.alfresco.rest.core.RestAPIFactory; +import org.alfresco.rest.core.RestResponse; import org.alfresco.rest.model.RestNodeModel; import org.alfresco.rest.rm.community.model.fileplan.FilePlan; import org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentType; @@ -76,6 +77,7 @@ import org.alfresco.rest.rm.community.requests.gscore.api.RecordsAPI; import org.alfresco.rest.search.RestRequestQueryModel; import org.alfresco.rest.search.SearchNodeModel; import org.alfresco.rest.search.SearchRequest; +import org.alfresco.rest.search.SearchSqlRequest; import org.alfresco.rest.v0.RMRolesAndActionsAPI; import org.alfresco.rest.v0.SearchAPI; import org.alfresco.utility.data.DataUser; @@ -796,4 +798,9 @@ public class BaseRMRestTest extends RestTest return documentLibrary; } + protected RestResponse searchSql(UserModel userModel, SearchSqlRequest searchSqlRequest) throws Exception + { + return restClient.authenticateUser(userModel).withSearchSqlAPI().searchSql(searchSqlRequest); + } + } From 2ab90aad6bb8d2e40f519cffa90365b40faf654f Mon Sep 17 00:00:00 2001 From: Tom Page Date: Thu, 15 Nov 2018 11:13:28 +0000 Subject: [PATCH 06/21] RM-6141 Update SQL tests to use correct users. Also hardcode the site id of the RM site to be "rm", so that we can use this when adding site members. (cherry picked from commit 92a6dcf8ae04151699b0b5a4bad79bc82f36ae71) # Conflicts: # rm-enterprise/pom.xml --- .../java/org/alfresco/rest/rm/community/model/site/RMSite.java | 3 ++- .../java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/site/RMSite.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/site/RMSite.java index 7abae8755d..3fa3518be0 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/site/RMSite.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/site/RMSite.java @@ -53,8 +53,9 @@ public class RMSite extends RestSiteModel /** Private constructor allowing Lombok to include superclass fields in the builder. */ @Builder - private RMSite(String title, String description, RMSiteCompliance compliance) + private RMSite(String id, String title, String description, RMSiteCompliance compliance) { + this.setId(id); this.setTitle(title); this.setDescription(description); this.compliance = compliance; diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java index b3574a0fcb..bbea049fbb 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java @@ -60,7 +60,7 @@ public class RMSiteUtil */ public static RMSite createRMSiteModel(RMSiteCompliance compliance, String title, String description) { - return RMSite.builder().compliance(compliance).title(title).description(description).build(); + return RMSite.builder().id(RM_ID).compliance(compliance).title(title).description(description).build(); } /** From 23c98eaa082f0507b6911bd05e697fe07404df7f Mon Sep 17 00:00:00 2001 From: Tom Page Date: Thu, 15 Nov 2018 14:39:49 +0000 Subject: [PATCH 07/21] RM-6141 Revert change of how a user is a member of the RM site. The user should be an RM User, not a site manager. Also revert a couple of changes that were done to make this work. Minor tweaks to use constants rather than member variables. (cherry picked from commit b284ba90388ef360f5321826e292ec43bf2e5197) --- .../java/org/alfresco/rest/rm/community/model/site/RMSite.java | 3 +-- .../java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/site/RMSite.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/site/RMSite.java index 3fa3518be0..7abae8755d 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/site/RMSite.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/site/RMSite.java @@ -53,9 +53,8 @@ public class RMSite extends RestSiteModel /** Private constructor allowing Lombok to include superclass fields in the builder. */ @Builder - private RMSite(String id, String title, String description, RMSiteCompliance compliance) + private RMSite(String title, String description, RMSiteCompliance compliance) { - this.setId(id); this.setTitle(title); this.setDescription(description); this.compliance = compliance; diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java index bbea049fbb..b3574a0fcb 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java @@ -60,7 +60,7 @@ public class RMSiteUtil */ public static RMSite createRMSiteModel(RMSiteCompliance compliance, String title, String description) { - return RMSite.builder().id(RM_ID).compliance(compliance).title(title).description(description).build(); + return RMSite.builder().compliance(compliance).title(title).description(description).build(); } /** From b32f324c31b953ef55ed5aa46c96ed548b5ad2e6 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Wed, 19 Jun 2019 14:55:23 +0300 Subject: [PATCH 08/21] add the alfresco.port property --- .../src/main/resources/config.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/resources/config.properties b/rm-automation/rm-automation-community-rest-api/src/main/resources/config.properties index 8b94951ea5..727a2d00e7 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/resources/config.properties +++ b/rm-automation/rm-automation-community-rest-api/src/main/resources/config.properties @@ -1,2 +1,3 @@ alfresco.server=localhost -rest.rmPath=alfresco/api/-default-/public/gs/versions/1 \ No newline at end of file +rest.rmPath=alfresco/api/-default-/public/gs/versions/1 +alfresco.port=8080 \ No newline at end of file From 9314432beb7d6644022a205d061f0ebfb51b2cc9 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 24 Jun 2019 10:16:20 +0300 Subject: [PATCH 09/21] test updates: minor refactoring and formatting fixes --- .../rest/rm/community/requests/gscore/GSCoreAPI.java | 2 +- .../org/alfresco/rest/rm/community/base/BaseRMRestTest.java | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/GSCoreAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/GSCoreAPI.java index 23f6655166..febd2b5427 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/GSCoreAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/GSCoreAPI.java @@ -113,7 +113,7 @@ public class GSCoreAPI extends RMModelRequest /** * Provides DSL on all REST calls under records/... API path * - * @return {@link FilePlanComponentAPI} + * @return {@link RecordsAPI} */ public RecordsAPI usingRecords() { diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java index 428b338910..dafa0abb2f 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java @@ -798,9 +798,4 @@ public class BaseRMRestTest extends RestTest return documentLibrary; } - protected RestResponse searchSql(UserModel userModel, SearchSqlRequest searchSqlRequest) throws Exception - { - return restClient.authenticateUser(userModel).withSearchSqlAPI().searchSql(searchSqlRequest); - } - } From 11a638c827e781838229b2b26aadb265557be772 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Tue, 2 Jul 2019 10:29:21 +0300 Subject: [PATCH 10/21] refactoring of the added rest api tests for SQL queries new tests added for sql queries for: record categories, record folders and records --- .../requests/gscore/api/RMUserAPI.java | 111 ++++++++++++------ .../rest/v0/RMRolesAndActionsAPI.java | 37 +++++- .../src/test/resources/log4j.properties | 7 ++ 3 files changed, 116 insertions(+), 39 deletions(-) create mode 100644 rm-automation/rm-automation-community-rest-api/src/test/resources/log4j.properties diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java index d24c53c614..2466211a55 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java @@ -84,6 +84,7 @@ public class RMUserAPI extends RMModelRequest /** * Assign RM role to user + * * @param userName User's username * @param userRole User's RM role, one of {@link UserRoles} roles * @throws Exception for failed requests @@ -97,29 +98,30 @@ public class RMUserAPI extends RMModelRequest // override v1 baseURI and basePath RequestSpecification spec = new RequestSpecBuilder() - .setBaseUri(client.getApiUrl()) - .setBasePath("/") - .build(); + .setBaseUri(client.getApiUrl()) + .setBasePath("/") + .build(); Response response = given() - .spec(spec) - .log().all() - .pathParam("role", userRole) - .pathParam("authority", userName) - .param("alf_ticket", client.getAlfTicket(adminUser.getUsername(), - adminUser.getPassword())) - .when() - .post("/rm/roles/{role}/authorities/{authority}") - .prettyPeek() - .andReturn(); + .spec(spec) + .log().all() + .pathParam("role", userRole) + .pathParam("authority", userName) + .param("alf_ticket", client.getAlfTicket(adminUser.getUsername(), + adminUser.getPassword())) + .when() + .post("/rm/roles/{role}/authorities/{authority}") + .prettyPeek() + .andReturn(); getRmRestWrapper().setStatusCode(Integer.toString(response.getStatusCode())); } /** * Helper method to add permission on a component to user - * @param component The id of the file plan component on which permission should be given - * @param user {@link UserModel} for a user to be granted permission - * @param permission {@link UserPermissions} to be granted + * + * @param filePlanComponentId The id of the file plan component on which permission should be given + * @param user {@link UserModel} for a user to be granted permission + * @param permission {@link UserPermissions} to be granted */ public void addUserPermission(String filePlanComponentId, UserModel user, String permission) { @@ -129,34 +131,75 @@ public class RMUserAPI extends RMModelRequest AlfrescoHttpClient client = getAlfrescoHttpClient(); JsonObject bodyJson = buildObject() - .addArray("permissions") + .addArray("permissions") .addObject() - .add("authority", user.getUsername()) - .add("role", permission) - .end() - .getJson(); + .add("authority", (user != null ? user.getUsername() : null)) + .add("role", permission) + .end() + .getJson(); // override v1 baseURI and basePath RequestSpecification spec = new RequestSpecBuilder() - .setBaseUri(client.getApiUrl()) - .setBasePath("/") - .build(); + .setBaseUri(client.getApiUrl()) + .setBasePath("/") + .build(); // execute an "old-style" API call Response response = given() - .spec(spec) - .auth().basic(adminUser.getUsername(), adminUser.getPassword()) - .contentType(ContentType.JSON) - .body(bodyJson.toString()) - .pathParam("nodeId", filePlanComponentId) - .log().all() - .when() - .post("/node/workspace/SpacesStore/{nodeId}/rmpermissions") - .prettyPeek() - .andReturn(); + .spec(spec) + .auth().basic(adminUser.getUsername(), adminUser.getPassword()) + .contentType(ContentType.JSON) + .body(bodyJson.toString()) + .pathParam("nodeId", filePlanComponentId) + .log().all() + .when() + .post("/node/workspace/SpacesStore/{nodeId}/rmpermissions") + .prettyPeek() + .andReturn(); getRmRestWrapper().setStatusCode(Integer.toString(response.getStatusCode())); } + /** + * Helper method to add permission on a component to user + * + * @param filePlanComponentId The id of the file plan component on which permission should be given + * @param permission {@link UserPermissions} to be granted + */ + public void setUserPermissionInheritance(String filePlanComponentId, Boolean isInherited) + { + UserModel adminUser = getRmRestWrapper().getTestUser(); + + // get an "old-style" REST API client + AlfrescoHttpClient client = getAlfrescoHttpClient(); + + JsonObject bodyJson = buildObject() + .addArray("permissions") + .end() + .add("isInherited", isInherited) + .getJson(); + + // override v1 baseURI and basePath + RequestSpecification spec = new RequestSpecBuilder() + .setBaseUri(client.getApiUrl()) + .setBasePath("/") + .build(); + + // execute an "old-style" API call + Response response = given() + .spec(spec) + .auth().basic(adminUser.getUsername(), adminUser.getPassword()) + .contentType(ContentType.JSON) + .body(bodyJson.toString()) + .pathParam("nodeId", filePlanComponentId) + .log().all() + .when() + .post("/node/workspace/SpacesStore/{nodeId}/rmpermissions") + .prettyPeek() + .andReturn(); + getRmRestWrapper().setStatusCode(Integer.toString(response.getStatusCode())); + } + + /** * Creates a user with the given name using the old APIs * diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java index 6f07fcf3ab..3be051a3d2 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java @@ -48,6 +48,7 @@ import org.alfresco.dataprep.ContentService; import org.alfresco.dataprep.UserService; import org.alfresco.rest.core.v0.BaseAPI; import org.alfresco.rest.core.v0.RMEvents; +import org.alfresco.utility.Utility; import org.apache.chemistry.opencmis.client.api.CmisObject; import org.apache.commons.httpclient.HttpStatus; import org.apache.http.HttpResponse; @@ -73,6 +74,8 @@ import org.springframework.stereotype.Component; @Component public class RMRolesAndActionsAPI extends BaseAPI { + public static final String HOLDS_CONTAINER = "Holds"; + /** The URI to view the configured roles and capabilities. */ private static final String RM_ROLES = "{0}rma/admin/rmroles"; /** The URI for REST requests about a particular configured role. */ @@ -83,6 +86,8 @@ public class RMRolesAndActionsAPI extends BaseAPI private static final Logger LOGGER = LoggerFactory.getLogger(RMRolesAndActionsAPI.class); private static final String MOVE_ACTIONS_API = "action/rm-move-to/site/rm/documentLibrary/{0}"; private static final String CREATE_HOLDS_API = "{0}type/rma:hold/formprocessor"; + /** The URI to add items to hold.*/ + private static final String RM_HOLDS_API = "{0}rma/holds"; /** http client factory */ @Autowired @@ -447,9 +452,9 @@ public class RMRolesAndActionsAPI extends BaseAPI public HttpResponse createHold(String user, String password, String holdName, String reason, String description) { // if the hold already exists don't try to create it again - String holdsContainerPath = getFilePlanPath() + "/Holds"; - String fullHoldPath = holdsContainerPath + "/" + holdName; - CmisObject hold = getObjectByPath(user, password, fullHoldPath); + final String holdsContainerPath = Utility.buildPath(getFilePlanPath(), HOLDS_CONTAINER); + final String fullHoldPath = holdsContainerPath + holdName; + final CmisObject hold = getObjectByPath(user, password, fullHoldPath); if (hold != null) { return null; @@ -457,19 +462,41 @@ public class RMRolesAndActionsAPI extends BaseAPI // retrieve the Holds container nodeRef String parentNodeRef = getItemNodeRef(user, password, "/Holds"); - JSONObject requestParams = new JSONObject(); + final JSONObject requestParams = new JSONObject(); requestParams.put("alf_destination", getNodeRefSpacesStore() + parentNodeRef); requestParams.put("prop_cm_name", holdName); requestParams.put("prop_cm_description", description); requestParams.put("prop_rma_holdReason", reason); // Make the POST request and throw an assertion error if it fails. - HttpResponse httpResponse = doPostJsonRequest(user, password, SC_OK, requestParams, CREATE_HOLDS_API); + final HttpResponse httpResponse = doPostJsonRequest(user, password, SC_OK, requestParams, CREATE_HOLDS_API); assertNotNull("Expected object to have been created at " + fullHoldPath, getObjectByPath(user, password, fullHoldPath)); return httpResponse; } + /** + * Adds item (record/ record folder) to the hold + * + * @param user the user who adds the item to the hold + * @param password the user's password + * @param itemNodeRef the nodeRef of the item to be added to hold + * @param holdName the hold name + * @return The HTTP response + */ + public HttpResponse addItemToHold(String user, String password, String itemNodeRef, String holdName) + { + final JSONArray nodeRefs = new JSONArray().put(getNodeRefSpacesStore() + itemNodeRef); + final String holdNodeRef = getItemNodeRef(user, password, String.format("/%s/%s", HOLDS_CONTAINER, holdName)); + final JSONArray holds = new JSONArray().put(getNodeRefSpacesStore() + holdNodeRef); + final JSONObject requestParams = new JSONObject(); + requestParams.put("nodeRefs", nodeRefs); + requestParams.put("holds", holds); + + return doPostJsonRequest(user, password, SC_OK, requestParams, RM_HOLDS_API); + } + + /** * Updates metadata, can be used on records, folders and categories * diff --git a/rm-automation/rm-automation-community-rest-api/src/test/resources/log4j.properties b/rm-automation/rm-automation-community-rest-api/src/test/resources/log4j.properties new file mode 100644 index 0000000000..93c931c03c --- /dev/null +++ b/rm-automation/rm-automation-community-rest-api/src/test/resources/log4j.properties @@ -0,0 +1,7 @@ +log4j.rootLogger=info, console + +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n + +log4j.logger.com.example=debug \ No newline at end of file From 9dddcdc1101ff1a3e08bc66625505a276c3f2cf7 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Wed, 3 Jul 2019 18:23:45 +0300 Subject: [PATCH 11/21] code review changes --- .../rest/rm/community/requests/gscore/api/RMUserAPI.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java index 2466211a55..9671dfe7a6 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java @@ -89,7 +89,7 @@ public class RMUserAPI extends RMModelRequest * @param userRole User's RM role, one of {@link UserRoles} roles * @throws Exception for failed requests */ - public void assignRoleToUser(String userName, String userRole) throws Exception + public void assignRoleToUser(String userName, String userRole) { UserModel adminUser = getRmRestWrapper().getTestUser(); @@ -160,10 +160,10 @@ public class RMUserAPI extends RMModelRequest } /** - * Helper method to add permission on a component to user + * Helper method to set the inherited permission on a file plan component * - * @param filePlanComponentId The id of the file plan component on which permission should be given - * @param permission {@link UserPermissions} to be granted + * @param filePlanComponentId The id of the file plan component on which inherited permission should be set + * @param isInherited {@link UserPermissions} to be granted */ public void setUserPermissionInheritance(String filePlanComponentId, Boolean isInherited) { From fce52415cbf62e4df2ce0a5af511332dc15c8191 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Thu, 4 Jul 2019 13:18:16 +0300 Subject: [PATCH 12/21] review updates --- .../rest/rm/community/requests/gscore/api/RMUserAPI.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java index 9671dfe7a6..5eaf86dcb3 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java @@ -160,10 +160,11 @@ public class RMUserAPI extends RMModelRequest } /** - * Helper method to set the inherited permission on a file plan component + * Helper method to set permission inheritance on a file plan component * * @param filePlanComponentId The id of the file plan component on which inherited permission should be set - * @param isInherited {@link UserPermissions} to be granted + * @param isInherited true if the permission is inherited + * false if the permission inheritance is disabled */ public void setUserPermissionInheritance(String filePlanComponentId, Boolean isInherited) { From c412db13d5050ea713475406cc88b63dde70302b Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 27 Sep 2018 12:40:04 +0300 Subject: [PATCH 13/21] Back-port fix from MNT-19967 --- .../disposition/DispositionServiceImpl.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index d3cd3cb49d..32f68c1bb5 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -348,9 +348,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl return ds; } - - - /** * This method returns a NodeRef * Gets the disposition instructions @@ -383,7 +380,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl NodeRef result = getAssociatedDispositionScheduleImpl(parent); if (result == null) { - return null; + return getOriginDispositionSchedule(parent); } return new DispositionScheduleImpl(serviceRegistry, nodeService, result); } From 1070562e079b69007991f043e8991d8b8a4e774f Mon Sep 17 00:00:00 2001 From: cagache Date: Tue, 23 Apr 2019 08:23:43 +0300 Subject: [PATCH 14/21] transform UserPermissions in enum; add helper methods to create users with rm role, permissions or clearance (cherry picked from commit 451eaaf679b5c734607726477c8de0168aa4b722) # Conflicts: # rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java # rm-automation/rm-automation-enterprise-rest-api/src/test/java/org/alfresco/rest/rm/enterprise/base/BaseRMEnterpriseRestTest.java # rm-automation/rm-automation-enterprise-rest-api/src/test/java/org/alfresco/rest/rm/enterprise/v0/classification/folder/RecordFolderClassificationTest.java --- .../community/model/user/UserPermissions.java | 15 ++- .../requests/gscore/api/FilesAPI.java | 6 +- .../requests/gscore/api/RMUserAPI.java | 10 +- .../alfresco/rest/v0/service/RoleService.java | 107 ++++++++++++++++-- .../rm/community/base/BaseRMRestTest.java | 39 +++++-- .../community/records/DeleteRecordTests.java | 7 +- .../community/records/UpdateRecordsTests.java | 9 +- .../rest/rm/community/utils/RMSiteUtil.java | 2 +- 8 files changed, 149 insertions(+), 46 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/user/UserPermissions.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/user/UserPermissions.java index 1b9dfe5aba..7c237bd47c 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/user/UserPermissions.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/user/UserPermissions.java @@ -32,9 +32,16 @@ package org.alfresco.rest.rm.community.model.user; * @author Kristijan Conkas * @since 2.6 */ -public class UserPermissions +public enum UserPermissions { - public static final String PERMISSION_FILING = "Filing"; - public static final String PERMISSION_READ_RECORDS = "ReadRecords"; - public static final String PERMISSION_FILE_RECORDS = "FileRecords"; + PERMISSION_FILING("Filing"), + PERMISSION_READ_RECORDS("ReadRecords"), + PERMISSION_FILE_RECORDS("FileRecords"); + + public final String permissionId; + + UserPermissions(String permissionId) + { + this.permissionId = permissionId; + } } diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/FilesAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/FilesAPI.java index 10da1e0570..18b91bd2cc 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/FilesAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/FilesAPI.java @@ -57,9 +57,8 @@ public class FilesAPI extends RMModelRequest * @param fileId The Id of a file to declare as record * @param parameters Request parameters, refer to API documentation for more details * @return The {@link Record} for created record - * @throws Exception for malformed JSON responses */ - public Record declareAsRecord(String fileId, String parameters) throws Exception + public Record declareAsRecord(String fileId, String parameters) { mandatoryString("fileId", fileId); @@ -76,9 +75,8 @@ public class FilesAPI extends RMModelRequest * * @param fileId The Id of a file to declare as record * @return The {@link Record} for created record - * @throws Exception for malformed JSON responses */ - public Record declareAsRecord(String fileId) throws Exception + public Record declareAsRecord(String fileId) { mandatoryString("fileId", fileId); diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java index 5eaf86dcb3..aa78902cae 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java @@ -87,7 +87,6 @@ public class RMUserAPI extends RMModelRequest * * @param userName User's username * @param userRole User's RM role, one of {@link UserRoles} roles - * @throws Exception for failed requests */ public void assignRoleToUser(String userName, String userRole) { @@ -118,12 +117,11 @@ public class RMUserAPI extends RMModelRequest /** * Helper method to add permission on a component to user - * * @param filePlanComponentId The id of the file plan component on which permission should be given - * @param user {@link UserModel} for a user to be granted permission - * @param permission {@link UserPermissions} to be granted + * @param user {@link UserModel} for a user to be granted permission + * @param permission {@link UserPermissions} to be granted */ - public void addUserPermission(String filePlanComponentId, UserModel user, String permission) + public void addUserPermission(String filePlanComponentId, UserModel user, UserPermissions permission) { UserModel adminUser = getRmRestWrapper().getTestUser(); @@ -134,7 +132,7 @@ public class RMUserAPI extends RMModelRequest .addArray("permissions") .addObject() .add("authority", (user != null ? user.getUsername() : null)) - .add("role", permission) + .add("role", permission.permissionId) .end() .getJson(); diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/service/RoleService.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/service/RoleService.java index ccf2785cd8..a5bdff72c0 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/service/RoleService.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/service/RoleService.java @@ -26,12 +26,22 @@ */ package org.alfresco.rest.v0.service; +import static lombok.AccessLevel.PROTECTED; +import static org.springframework.http.HttpStatus.OK; + import java.util.HashSet; import java.util.Set; +import lombok.Getter; +import org.alfresco.rest.core.RestAPIFactory; +import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory; +import org.alfresco.rest.rm.community.model.user.UserPermissions; import org.alfresco.rest.rm.community.model.user.UserRoles; import org.alfresco.rest.v0.RMRolesAndActionsAPI; +import org.alfresco.utility.constants.UserRole; import org.alfresco.utility.data.DataUser; +import org.alfresco.utility.model.SiteModel; +import org.alfresco.utility.model.UserModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -45,11 +55,29 @@ import org.springframework.stereotype.Service; public class RoleService { @Autowired + @Getter (value = PROTECTED) private RMRolesAndActionsAPI rmRolesAndActionsAPI; @Autowired + @Getter (value = PROTECTED) private DataUser dataUser; + @Autowired + @Getter (value = PROTECTED) + private RestAPIFactory restAPIFactory; + + /** + * Get the capabilities for a role + * + * @param roleName the role name + * @return the list of capabilities + */ + public Set getRoleCapabilities(String roleName) + { + return getRmRolesAndActionsAPI().getCapabilitiesForRole(getDataUser().getAdminUser().getUsername(), + getDataUser().getAdminUser().getPassword(), roleName); + } + /** * Add capabilities to a role * @@ -58,12 +86,10 @@ public class RoleService */ public void addCapabilitiesToRole(UserRoles role, Set capabilities) { - Set roleCapabilities = new HashSet<>(); - roleCapabilities.addAll(rmRolesAndActionsAPI.getCapabilitiesForRole(dataUser.getAdminUser().getUsername(), - dataUser.getAdminUser().getPassword(), role.roleId)); - capabilities.stream().forEach(cap -> roleCapabilities.add(cap)); + Set roleCapabilities = new HashSet<>(getRoleCapabilities(role.roleId)); + roleCapabilities.addAll(capabilities); - rmRolesAndActionsAPI.updateRole(dataUser.getAdminUser().getUsername(), dataUser.getAdminUser().getPassword(), + getRmRolesAndActionsAPI().updateRole(getDataUser().getAdminUser().getUsername(), getDataUser().getAdminUser().getPassword(), role.roleId, role.displayName, roleCapabilities); } @@ -75,10 +101,75 @@ public class RoleService */ public void removeCapabilitiesFromRole(UserRoles role, Set capabilities) { - Set roleCapabilities = rmRolesAndActionsAPI.getCapabilitiesForRole(dataUser.getAdminUser().getUsername(), - dataUser.getAdminUser().getPassword(), role.roleId); + Set roleCapabilities = getRoleCapabilities(role.roleId); roleCapabilities.removeAll(capabilities); - rmRolesAndActionsAPI.updateRole(dataUser.getAdminUser().getUsername(), dataUser.getAdminUser().getPassword(), + getRmRolesAndActionsAPI().updateRole(getDataUser().getAdminUser().getUsername(), getDataUser().getAdminUser().getPassword(), role.roleId, role.displayName, roleCapabilities); } + + /** + * Assign permission on a record category and give the user RM role + * + * @param user the user to assign rm role and permissions + * @param categoryId the id of the category to assign permissions for + * @param userPermission the permissions to be assigned to the user + * @param userRole the rm role to be assigned to the user + */ + public void assignUserPermissionsOnCategoryAndRMRole(UserModel user, String categoryId, UserPermissions userPermission, + String userRole) + { + getRestAPIFactory().getRMUserAPI().addUserPermission(categoryId, user, userPermission); + getRmRolesAndActionsAPI().assignRoleToUser(getDataUser().getAdminUser().getUsername(), getDataUser().getAdminUser().getPassword(), + user.getUsername(), userRole); + } + + /** + * Helper method to create a test user with rm role + * + * @param userRole the rm role + * @return the created user model + */ + public UserModel createUserWithRMRole(String userRole) + { + final UserModel rmUser = getDataUser().createRandomTestUser(); + getRestAPIFactory().getRMUserAPI().assignRoleToUser(rmUser.getUsername(), userRole); + getRestAPIFactory().getRmRestWrapper().assertStatusCodeIs(OK); + return rmUser; + } + + /** + * Helper method to create a test user with rm role and permissions over the record category + * + * @param userRole the rm role + * @param userPermission the permissions over the record category + * @param recordCategory the category on which user has permissions + * @return the created user model + */ + public UserModel createUserWithRMRoleAndCategoryPermission(String userRole, RecordCategory recordCategory, + UserPermissions userPermission) + { + final UserModel rmUser = createUserWithRMRole(userRole); + getRestAPIFactory().getRMUserAPI().addUserPermission(recordCategory.getId(), rmUser, userPermission); + getRestAPIFactory().getRmRestWrapper().assertStatusCodeIs(OK); + return rmUser; + } + + /** + * Helper method to create a test user with rm role and permissions over the recordCategory and collaborator role + * in collaboration site + * + * @param siteModel collaboration site + * @param recordCategory the category on which permission should be given + * @param userRole the rm role + * @param userPermission the permissions over the recordCategory + * @return the created user model + */ + public UserModel createCollaboratorWithRMRoleAndPermission(SiteModel siteModel, RecordCategory recordCategory, + UserRoles userRole, UserPermissions userPermission) + { + final UserModel rmUser = createUserWithRMRoleAndCategoryPermission(userRole.roleId, recordCategory, + userPermission); + getDataUser().addUserToSite(rmUser, siteModel, UserRole.SiteCollaborator); + return rmUser; + } } diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java index dafa0abb2f..de56972ccd 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java @@ -54,6 +54,7 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import lombok.Getter; import org.alfresco.dataprep.ContentService; import org.alfresco.rest.RestTest; import org.alfresco.rest.core.RestAPIFactory; @@ -70,6 +71,7 @@ import org.alfresco.rest.rm.community.model.site.RMSite; import org.alfresco.rest.rm.community.model.transfercontainer.TransferContainer; import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainer; import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainerChild; +import org.alfresco.rest.rm.community.model.user.UserPermissions; import org.alfresco.rest.rm.community.requests.gscore.api.RMSiteAPI; import org.alfresco.rest.rm.community.requests.gscore.api.RecordCategoryAPI; import org.alfresco.rest.rm.community.requests.gscore.api.RecordFolderAPI; @@ -90,8 +92,6 @@ import org.springframework.http.HttpStatus; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; -import lombok.Getter; - /** * Base class for all GS REST API Tests * @@ -617,18 +617,34 @@ public class BaseRMRestTest extends RestTest } /** - * Assign filling permission on a record category and give the user RM_USER role + * Helper method to create a test user with rm role * - * @param user the user to assign the permission to - * @param categoryId the id of the category to assign permissions for - * @throws Exception + * @param userRole the rm role + * @return the created user model */ - public void assignFillingPermissionsOnCategory(UserModel user, String categoryId, - String userPermission, String userRole) throws Exception + protected UserModel createUserWithRMRole(String userRole) { - getRestAPIFactory().getRMUserAPI().addUserPermission(categoryId, user, userPermission); - rmRolesAndActionsAPI.assignRoleToUser(getAdminUser().getUsername(), - getAdminUser().getPassword(), user.getUsername(), userRole); + UserModel rmUser = getDataUser().createRandomTestUser(); + getRestAPIFactory().getRMUserAPI().assignRoleToUser(rmUser.getUsername(), userRole); + assertStatusCode(OK); + return rmUser; + } + + /** + * Helper method to create a test user with rm role and permissions over the record category + * + * @param userRole the rm role + * @param userPermission the permissions over the record category + * @param recordCategory the category on which user has permissions + * @return the created user model + */ + protected UserModel createUserWithRMRoleAndCategoryPermission(String userRole, RecordCategory recordCategory, + UserPermissions userPermission) + { + UserModel rmUser = createUserWithRMRole(userRole); + getRestAPIFactory().getRMUserAPI().addUserPermission(recordCategory.getId(), rmUser, userPermission); + assertStatusCode(OK); + return rmUser; } /** @@ -797,5 +813,4 @@ public class BaseRMRestTest extends RestTest documentLibrary.setNodeRef(nodes.get(0).onModel().getId()); return documentLibrary; } - } diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/records/DeleteRecordTests.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/records/DeleteRecordTests.java index ef63360a39..387e263460 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/records/DeleteRecordTests.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/records/DeleteRecordTests.java @@ -236,15 +236,12 @@ public class DeleteRecordTests extends BaseRMRestTest public void userWithoutDeleteRecordsCapabilityCantDeleteRecord() throws Exception { // Create test user and add it with collaboration privileges - UserModel deleteUser = getDataUser().createRandomTestUser("delnoperm"); + // Add RM role to user, RM Power User doesn't have the "Delete Record" capabilities + UserModel deleteUser = createUserWithRMRole(ROLE_RM_POWER_USER.roleId); getDataUser().addUserToSite(deleteUser, new SiteModel(getRestAPIFactory().getRMSiteAPI().getSite().getId()), SiteCollaborator); String username = deleteUser.getUsername(); logger.info("Test user: " + username); - // Add RM role to user, RM Power User doesn't have the "Delete Record" capabilities - getRestAPIFactory().getRMUserAPI().assignRoleToUser(username, ROLE_RM_POWER_USER.roleId); - assertStatusCode(OK); - // Create random folder RecordCategoryChild recordFolder = createCategoryFolderInFilePlan(); logger.info("Random folder:" + recordFolder.getName()); diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/records/UpdateRecordsTests.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/records/UpdateRecordsTests.java index 2f8f3af510..c433c99dc6 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/records/UpdateRecordsTests.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/records/UpdateRecordsTests.java @@ -234,15 +234,12 @@ public class UpdateRecordsTests extends BaseRMRestTest public void userWithEditMetadataCapsCanUpdateMetadata() throws Exception { RMUserAPI rmUserAPI = getRestAPIFactory().getRMUserAPI(); - // Create test user and add it with collab. privileges - UserModel updateUser = getDataUser().createRandomTestUser("updateuser"); + // Create test user and add it with collab. privileges. + // RM Security Officer is the lowest role with Edit Record Metadata capabilities + UserModel updateUser = createUserWithRMRole(ROLE_RM_SECURITY_OFFICER.roleId); updateUser.setUserRole(UserRole.SiteCollaborator); getDataUser().addUserToSite(updateUser, new SiteModel(getRestAPIFactory().getRMSiteAPI().getSite().getId()), UserRole.SiteCollaborator); - // RM Security Officer is the lowest role with Edit Record Metadata capabilities - rmUserAPI.assignRoleToUser(updateUser.getUsername(), ROLE_RM_SECURITY_OFFICER.roleId); - assertStatusCode(OK); - // Create random folder RecordCategoryChild recordFolder = createCategoryFolderInFilePlan(); logger.info("random folder:" + recordFolder.getName()); diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java index b3574a0fcb..80062165ca 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/utils/RMSiteUtil.java @@ -66,7 +66,7 @@ public class RMSiteUtil /** * Creates an RM Site for the given compliance and default title and description * - * @param The RM site compliance + * @param compliance The RM site compliance * @return The {@link RMSite} with the given details */ private static RMSite createRMSiteModel(RMSiteCompliance compliance) From 2a9aca2ced6fb869cc1652a29e1c051b877e17cf Mon Sep 17 00:00:00 2001 From: cagache Date: Tue, 23 Apr 2019 12:15:38 +0300 Subject: [PATCH 15/21] transform UserPermissions in enum; add helper methods to create users with rm role, permissions or clearance (cherry picked from commit ebc860ea2abaf17124cb033225c5c3728dbe85e4) # Conflicts: # rm-automation/rm-automation-enterprise-rest-api/src/test/java/org/alfresco/rest/rm/enterprise/v0/classification/content/SetRMExemptionReasonTest.java --- .../community/requests/gscore/api/FilesAPI.java | 6 ++++-- .../rest/rm/community/base/BaseRMRestTest.java | 16 ++++++++++++++++ .../rm/community/base/DataProviderClass.java | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/FilesAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/FilesAPI.java index 18b91bd2cc..10da1e0570 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/FilesAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/FilesAPI.java @@ -57,8 +57,9 @@ public class FilesAPI extends RMModelRequest * @param fileId The Id of a file to declare as record * @param parameters Request parameters, refer to API documentation for more details * @return The {@link Record} for created record + * @throws Exception for malformed JSON responses */ - public Record declareAsRecord(String fileId, String parameters) + public Record declareAsRecord(String fileId, String parameters) throws Exception { mandatoryString("fileId", fileId); @@ -75,8 +76,9 @@ public class FilesAPI extends RMModelRequest * * @param fileId The Id of a file to declare as record * @return The {@link Record} for created record + * @throws Exception for malformed JSON responses */ - public Record declareAsRecord(String fileId) + public Record declareAsRecord(String fileId) throws Exception { mandatoryString("fileId", fileId); diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java index 48ec3e4cb6..86fc641882 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java @@ -616,6 +616,22 @@ public class BaseRMRestTest extends RestTest recordCategoryAPI.deleteRecordCategory(recordCategoryId); } + /** + * Assign permission on a record category and give the user RM role + * + * @param user the user to assign rm role and permissions + * @param categoryId the id of the category to assign permissions for + * @param userPermission the permissions to be assigned to the user + * @param userRole the rm role to be assigned to the user + */ + public void assignUserPermissionsOnCategoryAndRMRole(UserModel user, String categoryId, UserPermissions userPermission, + String userRole) + { + getRestAPIFactory().getRMUserAPI().addUserPermission(categoryId, user, userPermission); + rmRolesAndActionsAPI.assignRoleToUser(getAdminUser().getUsername(), getAdminUser().getPassword(), + user.getUsername(), userRole); + } + /** * Helper method to create a test user with rm role * diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/DataProviderClass.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/DataProviderClass.java index b4b39f70b8..d437da677a 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/DataProviderClass.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/DataProviderClass.java @@ -105,7 +105,7 @@ public class DataProviderClass * @return file plan component alias */ @DataProvider - public static String[][] categoryTypes() + public static Object[][] categoryTypes() { return new String[][] { { FOLDER_TYPE }, From 5f4a5feb2a804efef025620e4e7cd977d8b57eb5 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 5 Jul 2019 12:50:19 +0300 Subject: [PATCH 16/21] fix sonar final warning --- .../requests/gscore/api/RMUserAPI.java | 12 +++++----- .../rest/v0/RMRolesAndActionsAPI.java | 22 ++++++++++--------- .../alfresco/rest/v0/service/RoleService.java | 4 ++-- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java index aa78902cae..6cd2b7d0d4 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/RMUserAPI.java @@ -166,12 +166,12 @@ public class RMUserAPI extends RMModelRequest */ public void setUserPermissionInheritance(String filePlanComponentId, Boolean isInherited) { - UserModel adminUser = getRmRestWrapper().getTestUser(); + final UserModel adminUser = getRmRestWrapper().getTestUser(); // get an "old-style" REST API client - AlfrescoHttpClient client = getAlfrescoHttpClient(); + final AlfrescoHttpClient client = getAlfrescoHttpClient(); - JsonObject bodyJson = buildObject() + final JsonObject bodyJson = buildObject() .addArray("permissions") .end() .add("isInherited", isInherited) @@ -184,7 +184,7 @@ public class RMUserAPI extends RMModelRequest .build(); // execute an "old-style" API call - Response response = given() + final Response response = given() .spec(spec) .auth().basic(adminUser.getUsername(), adminUser.getPassword()) .contentType(ContentType.JSON) @@ -210,7 +210,7 @@ public class RMUserAPI extends RMModelRequest public boolean createUser(String userName, String userPassword, String userEmail) { UserModel adminUser = getRmRestWrapper().getTestUser(); - AlfrescoHttpClient client = getAlfrescoHttpClient(); + final AlfrescoHttpClient client = getAlfrescoHttpClient(); JsonObject body = buildObject() .add("userName", userName) @@ -220,7 +220,7 @@ public class RMUserAPI extends RMModelRequest .add("email", userEmail) .getJson(); - RequestSpecification spec = new RequestSpecBuilder() + final RequestSpecification spec = new RequestSpecBuilder() .setBaseUri(client.getApiUrl()) .setBasePath("/") .setAuth(basic(adminUser.getUsername(), adminUser.getPassword())) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java index 5ca4b9c1ab..d57c16fabf 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java @@ -106,7 +106,8 @@ public class RMRolesAndActionsAPI extends BaseAPI public Set getConfiguredRoles(String adminUser, String adminPassword) { // Using "is=true" includes the in-place readers and writers. - JSONObject jsonObject = doGetRequest(adminUser, adminPassword, RM_ROLES + "?is=true").getJSONObject("data"); + final JSONObject jsonObject = doGetRequest(adminUser, adminPassword, RM_ROLES + "?is=true").getJSONObject + ("data"); return jsonObject.toMap().keySet(); } @@ -120,7 +121,8 @@ public class RMRolesAndActionsAPI extends BaseAPI */ public Set getCapabilitiesForRole(String adminUser, String adminPassword, String role) { - JSONObject jsonObject = doGetRequest(adminUser, adminPassword, RM_ROLES + "?is=true").getJSONObject("data"); + final JSONObject jsonObject = doGetRequest(adminUser, adminPassword, RM_ROLES + "?is=true").getJSONObject + ("data"); assertTrue("Could not find role '" + role + "' in " + jsonObject.keySet(), jsonObject.has(role)); return jsonObject.getJSONObject(role).getJSONObject("capabilities").keySet(); } @@ -136,10 +138,10 @@ public class RMRolesAndActionsAPI extends BaseAPI */ public void createRole(String adminUser, String adminPassword, String roleName, String roleDisplayLabel, Set capabilities) { - JSONObject requestBody = new JSONObject(); + final JSONObject requestBody = new JSONObject(); requestBody.put("name", roleName); requestBody.put("displayLabel", roleDisplayLabel); - JSONArray capabilitiesArray = new JSONArray(); + final JSONArray capabilitiesArray = new JSONArray(); capabilities.forEach(capabilitiesArray::put); requestBody.put("capabilities", capabilitiesArray); doPostJsonRequest(adminUser, adminPassword, HttpStatus.SC_OK, requestBody, RM_ROLES); @@ -156,10 +158,10 @@ public class RMRolesAndActionsAPI extends BaseAPI */ public void updateRole(String adminUser, String adminPassword, String roleName, String roleDisplayLabel, Set capabilities) { - JSONObject requestBody = new JSONObject(); + final JSONObject requestBody = new JSONObject(); requestBody.put("name", roleName); requestBody.put("displayLabel", roleDisplayLabel); - JSONArray capabilitiesArray = new JSONArray(); + final JSONArray capabilitiesArray = new JSONArray(); capabilities.forEach(capabilitiesArray::put); requestBody.put("capabilities", capabilitiesArray); doPutJsonRequest(adminUser, adminPassword, HttpStatus.SC_OK, requestBody, RM_ROLES_ROLE, roleName); @@ -175,7 +177,7 @@ public class RMRolesAndActionsAPI extends BaseAPI public void deleteRole(String adminUser, String adminPassword, String roleName) { doDeleteRequest(adminUser, adminPassword, MessageFormat.format(RM_ROLES_ROLE, "{0}", roleName)); - boolean success = !getConfiguredRoles(adminUser, adminPassword).contains(roleName); + final boolean success = !getConfiguredRoles(adminUser, adminPassword).contains(roleName); assertTrue("Failed to delete role " + roleName + " with " + adminUser, success); } @@ -206,8 +208,8 @@ public class RMRolesAndActionsAPI extends BaseAPI */ public void assignRoleToUser(String adminUser, String adminPassword, String userName, String role) { - AlfrescoHttpClient client = alfrescoHttpClientFactory.getObject(); - String reqURL = MessageFormat.format( + final AlfrescoHttpClient client = alfrescoHttpClientFactory.getObject(); + final String reqURL = MessageFormat.format( RM_ROLES_AUTHORITIES, client.getApiUrl(), role, @@ -456,7 +458,7 @@ public class RMRolesAndActionsAPI extends BaseAPI return null; } // retrieve the Holds container nodeRef - String parentNodeRef = getItemNodeRef(user, password, "/Holds"); + final String parentNodeRef = getItemNodeRef(user, password, "/Holds"); final JSONObject requestParams = new JSONObject(); requestParams.put("alf_destination", getNodeRefSpacesStore() + parentNodeRef); diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/service/RoleService.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/service/RoleService.java index a5bdff72c0..c37dcc8541 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/service/RoleService.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/service/RoleService.java @@ -86,7 +86,7 @@ public class RoleService */ public void addCapabilitiesToRole(UserRoles role, Set capabilities) { - Set roleCapabilities = new HashSet<>(getRoleCapabilities(role.roleId)); + final Set roleCapabilities = new HashSet<>(getRoleCapabilities(role.roleId)); roleCapabilities.addAll(capabilities); getRmRolesAndActionsAPI().updateRole(getDataUser().getAdminUser().getUsername(), getDataUser().getAdminUser().getPassword(), @@ -101,7 +101,7 @@ public class RoleService */ public void removeCapabilitiesFromRole(UserRoles role, Set capabilities) { - Set roleCapabilities = getRoleCapabilities(role.roleId); + final Set roleCapabilities = getRoleCapabilities(role.roleId); roleCapabilities.removeAll(capabilities); getRmRolesAndActionsAPI().updateRole(getDataUser().getAdminUser().getUsername(), getDataUser().getAdminUser().getPassword(), role.roleId, role.displayName, roleCapabilities); From bf4ed09b0959acb37de95edeb721ee136c2e44e8 Mon Sep 17 00:00:00 2001 From: alfresco-build Date: Mon, 8 Jul 2019 16:39:17 +0100 Subject: [PATCH 17/21] [maven-release-plugin] prepare release V2.5.3.2 --- pom.xml | 4 ++-- rm-automation/pom.xml | 2 +- rm-community/pom.xml | 2 +- rm-community/rm-community-repo/pom.xml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 94bb3279db..63dd6f6deb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.alfresco alfresco-rm pom - 2.5.3.2-SNAPSHOT + 2.5.3.2 Alfresco Records Management @@ -24,7 +24,7 @@ scm:git:https://git.alfresco.com/records-management/records-management.git scm:git:https://git.alfresco.com/records-management/records-management.git https://git.alfresco.com/records-management/records-management - V2.5.3 + V2.5.3.2 diff --git a/rm-automation/pom.xml b/rm-automation/pom.xml index ed4b09801c..001d2f6edd 100644 --- a/rm-automation/pom.xml +++ b/rm-automation/pom.xml @@ -8,7 +8,7 @@ org.alfresco alfresco-rm - 2.5.3.2-SNAPSHOT + 2.5.3.2 diff --git a/rm-community/pom.xml b/rm-community/pom.xml index de97020bf4..06d71f1b26 100644 --- a/rm-community/pom.xml +++ b/rm-community/pom.xml @@ -8,7 +8,7 @@ org.alfresco alfresco-rm - 2.5.3.2-SNAPSHOT + 2.5.3.2 diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index a93c2573b9..25fbb20356 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-rm-community - 2.5.3.2-SNAPSHOT + 2.5.3.2 From 249675acc7d63f4d0aab24fec7d0816c0ca5f856 Mon Sep 17 00:00:00 2001 From: alfresco-build Date: Mon, 8 Jul 2019 16:39:21 +0100 Subject: [PATCH 18/21] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- rm-automation/pom.xml | 2 +- rm-community/pom.xml | 2 +- rm-community/rm-community-repo/pom.xml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 63dd6f6deb..4797d209c1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.alfresco alfresco-rm pom - 2.5.3.2 + 2.5.3.3-SNAPSHOT Alfresco Records Management @@ -24,7 +24,7 @@ scm:git:https://git.alfresco.com/records-management/records-management.git scm:git:https://git.alfresco.com/records-management/records-management.git https://git.alfresco.com/records-management/records-management - V2.5.3.2 + V2.5.3 diff --git a/rm-automation/pom.xml b/rm-automation/pom.xml index 001d2f6edd..c61d666c8e 100644 --- a/rm-automation/pom.xml +++ b/rm-automation/pom.xml @@ -8,7 +8,7 @@ org.alfresco alfresco-rm - 2.5.3.2 + 2.5.3.3-SNAPSHOT diff --git a/rm-community/pom.xml b/rm-community/pom.xml index 06d71f1b26..73c9631e3e 100644 --- a/rm-community/pom.xml +++ b/rm-community/pom.xml @@ -8,7 +8,7 @@ org.alfresco alfresco-rm - 2.5.3.2 + 2.5.3.3-SNAPSHOT diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 25fbb20356..7e79f8c07f 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-rm-community - 2.5.3.2 + 2.5.3.3-SNAPSHOT From 726dcc2e02f88dcb4b64bad1eac45c255413e661 Mon Sep 17 00:00:00 2001 From: rlucanu Date: Tue, 9 Jul 2019 12:12:28 +0300 Subject: [PATCH 19/21] Revert "Record only merge of version change." This reverts commit eab3137a7c4b834de73a1c2b2b25ca15ddf0911c, reversing changes made to 249675acc7d63f4d0aab24fec7d0816c0ca5f856. --- pom.xml | 4 +-- rm-automation/pom.xml | 2 +- rm-community/pom.xml | 2 +- rm-community/rm-community-repo/pom.xml | 2 +- .../capability/RMAfterInvocationProvider.java | 2 -- .../disposition/DispositionScheduleImpl.java | 28 +++++-------------- .../disposition/DispositionServiceImpl.java | 5 +--- 7 files changed, 13 insertions(+), 32 deletions(-) diff --git a/pom.xml b/pom.xml index 2bb16c3e43..4797d209c1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.alfresco alfresco-rm pom - 2.5.5-SNAPSHOT + 2.5.3.3-SNAPSHOT Alfresco Records Management @@ -24,7 +24,7 @@ scm:git:https://git.alfresco.com/records-management/records-management.git scm:git:https://git.alfresco.com/records-management/records-management.git https://git.alfresco.com/records-management/records-management - HEAD + V2.5.3 diff --git a/rm-automation/pom.xml b/rm-automation/pom.xml index 21a954745a..c61d666c8e 100644 --- a/rm-automation/pom.xml +++ b/rm-automation/pom.xml @@ -8,7 +8,7 @@ org.alfresco alfresco-rm - 2.5.5-SNAPSHOT + 2.5.3.3-SNAPSHOT diff --git a/rm-community/pom.xml b/rm-community/pom.xml index 53f27e0007..73c9631e3e 100644 --- a/rm-community/pom.xml +++ b/rm-community/pom.xml @@ -8,7 +8,7 @@ org.alfresco alfresco-rm - 2.5.5-SNAPSHOT + 2.5.3.3-SNAPSHOT diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 776105b476..7e79f8c07f 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-rm-community - 2.5.5-SNAPSHOT + 2.5.3.3-SNAPSHOT diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java index 85a64b7c01..8ed963c752 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java @@ -485,7 +485,6 @@ public class RMAfterInvocationProvider extends RMSecurityCommon returnedObject.getResultSetMetaData().getLimitedBy(), PermissionEvaluationMode.EAGER, returnedObject.getResultSetMetaData().getSearchParameters())); - filteringResultSet.setNumberFound(returnedObject.getNumberFound()); return filteringResultSet; } else @@ -499,7 +498,6 @@ public class RMAfterInvocationProvider extends RMSecurityCommon returnedObject.getResultSetMetaData().getLimitedBy(), PermissionEvaluationMode.EAGER, returnedObject.getResultSetMetaData().getSearchParameters())); - filteringResultSet.setNumberFound(returnedObject.getNumberFound()); return filteringResultSet; } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java index eec7f3db4e..5ab334b6a9 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java @@ -35,7 +35,6 @@ import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; -import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -52,10 +51,7 @@ public class DispositionScheduleImpl implements DispositionSchedule, private NodeService nodeService; private RecordsManagementServiceRegistry services; private NodeRef dispositionDefinitionNodeRef; - /** authentication helper */ - private AuthenticationUtil authenticationUtil; - - + private List actions; private Map actionsById; @@ -65,11 +61,6 @@ public class DispositionScheduleImpl implements DispositionSchedule, /** Map of disposition definitions by disposition action name */ private Map actionsByDispositionActionName; - - public void setAuthenticationUtil(AuthenticationUtil authenticationUtil) - { - this.authenticationUtil = authenticationUtil; - } public DispositionScheduleImpl(RecordsManagementServiceRegistry services, NodeService nodeService, NodeRef nodeRef) { @@ -109,18 +100,13 @@ public class DispositionScheduleImpl implements DispositionSchedule, */ public boolean isRecordLevelDisposition() { - return authenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork() + boolean result = false; + Boolean value = (Boolean)this.nodeService.getProperty(this.dispositionDefinitionNodeRef, PROP_RECORD_LEVEL_DISPOSITION); + if (value != null) { - public Boolean doWork() throws Exception - { - Boolean value = (Boolean)nodeService.getProperty(dispositionDefinitionNodeRef, PROP_RECORD_LEVEL_DISPOSITION); - if (value != null) - { - return value.booleanValue(); - } - return null; - } - }); + result = value.booleanValue(); + } + return result; } /** diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index d3cd3cb49d..32f68c1bb5 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -348,9 +348,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl return ds; } - - - /** * This method returns a NodeRef * Gets the disposition instructions @@ -383,7 +380,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl NodeRef result = getAssociatedDispositionScheduleImpl(parent); if (result == null) { - return null; + return getOriginDispositionSchedule(parent); } return new DispositionScheduleImpl(serviceRegistry, nodeService, result); } From 88f2cecdd0ffe80c835115068cb71530734cf0cd Mon Sep 17 00:00:00 2001 From: rlucanu Date: Wed, 10 Jul 2019 07:49:40 +0300 Subject: [PATCH 20/21] Reset code back to 7229ec2fbc. --- .../capability/RMAfterInvocationProvider.java | 2 ++ .../disposition/DispositionScheduleImpl.java | 28 ++++++++++++++----- .../disposition/DispositionServiceImpl.java | 5 +++- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java index 8ed963c752..85a64b7c01 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java @@ -485,6 +485,7 @@ public class RMAfterInvocationProvider extends RMSecurityCommon returnedObject.getResultSetMetaData().getLimitedBy(), PermissionEvaluationMode.EAGER, returnedObject.getResultSetMetaData().getSearchParameters())); + filteringResultSet.setNumberFound(returnedObject.getNumberFound()); return filteringResultSet; } else @@ -498,6 +499,7 @@ public class RMAfterInvocationProvider extends RMSecurityCommon returnedObject.getResultSetMetaData().getLimitedBy(), PermissionEvaluationMode.EAGER, returnedObject.getResultSetMetaData().getSearchParameters())); + filteringResultSet.setNumberFound(returnedObject.getNumberFound()); return filteringResultSet; } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java index 5ab334b6a9..eec7f3db4e 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java @@ -35,6 +35,7 @@ import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -51,7 +52,10 @@ public class DispositionScheduleImpl implements DispositionSchedule, private NodeService nodeService; private RecordsManagementServiceRegistry services; private NodeRef dispositionDefinitionNodeRef; - + /** authentication helper */ + private AuthenticationUtil authenticationUtil; + + private List actions; private Map actionsById; @@ -61,6 +65,11 @@ public class DispositionScheduleImpl implements DispositionSchedule, /** Map of disposition definitions by disposition action name */ private Map actionsByDispositionActionName; + + public void setAuthenticationUtil(AuthenticationUtil authenticationUtil) + { + this.authenticationUtil = authenticationUtil; + } public DispositionScheduleImpl(RecordsManagementServiceRegistry services, NodeService nodeService, NodeRef nodeRef) { @@ -100,13 +109,18 @@ public class DispositionScheduleImpl implements DispositionSchedule, */ public boolean isRecordLevelDisposition() { - boolean result = false; - Boolean value = (Boolean)this.nodeService.getProperty(this.dispositionDefinitionNodeRef, PROP_RECORD_LEVEL_DISPOSITION); - if (value != null) + return authenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork() { - result = value.booleanValue(); - } - return result; + public Boolean doWork() throws Exception + { + Boolean value = (Boolean)nodeService.getProperty(dispositionDefinitionNodeRef, PROP_RECORD_LEVEL_DISPOSITION); + if (value != null) + { + return value.booleanValue(); + } + return null; + } + }); } /** diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 32f68c1bb5..d3cd3cb49d 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -348,6 +348,9 @@ public class DispositionServiceImpl extends ServiceBaseImpl return ds; } + + + /** * This method returns a NodeRef * Gets the disposition instructions @@ -380,7 +383,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl NodeRef result = getAssociatedDispositionScheduleImpl(parent); if (result == null) { - return getOriginDispositionSchedule(parent); + return null; } return new DispositionScheduleImpl(serviceRegistry, nodeService, result); } From 8c3371b7f0dd07e6edc4ecd908b1491161094f29 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 27 Sep 2018 12:40:04 +0300 Subject: [PATCH 21/21] Back-port fix from MNT-19967 (cherry picked from commit c412db13d5050ea713475406cc88b63dde70302b) --- .../disposition/DispositionServiceImpl.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index d3cd3cb49d..32f68c1bb5 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -348,9 +348,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl return ds; } - - - /** * This method returns a NodeRef * Gets the disposition instructions @@ -383,7 +380,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl NodeRef result = getAssociatedDispositionScheduleImpl(parent); if (result == null) { - return null; + return getOriginDispositionSchedule(parent); } return new DispositionScheduleImpl(serviceRegistry, nodeService, result); }