diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml index 34da746fb3..9c37e9482f 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml @@ -93,7 +93,8 @@ - + + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RMNodesImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RMNodesImpl.java index 81e839c120..b581ff89b2 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RMNodesImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RMNodesImpl.java @@ -61,6 +61,7 @@ import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.model.FileFolderService; 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.namespace.QName; import org.alfresco.util.Pair; import org.alfresco.util.ParameterCheck; @@ -277,6 +278,11 @@ public class RMNodesImpl extends NodesImpl implements RMNodes } } + if(!filePlanService.isFilePlanComponent(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, nodeId))) + { + throw new InvalidParameterException("The provided node is not a fileplan component"); + } + return super.validateNode(nodeId); } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RecordsImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RecordsImpl.java index 2938feee94..5bc3500ab9 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RecordsImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RecordsImpl.java @@ -36,6 +36,7 @@ import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.util.AuthenticationUtil; import org.alfresco.repo.node.integrity.IntegrityException; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; +import org.alfresco.rest.api.Nodes; import org.alfresco.rest.api.model.Node; import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException; import org.alfresco.rest.framework.resource.parameters.Parameters; @@ -67,7 +68,8 @@ public class RecordsImpl implements Records, InitializingBean protected FileFolderService fileFolderService; protected DictionaryService dictionaryService; protected AuthenticationUtil authenticationUtil; - protected RMNodes nodes; + protected RMNodes rmNodes; + protected Nodes nodes; public void setRecordService(RecordService recordService) { @@ -99,7 +101,12 @@ public class RecordsImpl implements Records, InitializingBean this.authenticationUtil = authenticationUtil; } - public void setNodes(RMNodes nodes) + public void setRmNodes(RMNodes rmNodes) + { + this.rmNodes = rmNodes; + } + + public void setNodes(Nodes nodes) { this.nodes = nodes; } @@ -108,6 +115,7 @@ public class RecordsImpl implements Records, InitializingBean public Node declareFileAsRecord(String fileId, Parameters parameters) { // Get file to be declared + // Use nodes instead of rmNodes because the file is not a record yet NodeRef fileNodeRef = nodes.validateNode(fileId) ; // Get fileplan @@ -127,7 +135,7 @@ public class RecordsImpl implements Records, InitializingBean recordService.createRecord(filePlan, fileNodeRef, !hideRecord); // Get information about the new record - return nodes.getFolderOrDocument(fileId, parameters); + return rmNodes.getFolderOrDocument(fileId, parameters); } @Override @@ -139,7 +147,7 @@ public class RecordsImpl implements Records, InitializingBean } // Get record - NodeRef record = nodes.validateNode(recordId); + NodeRef record = rmNodes.validateNode(recordId); // Get record folder to file/link the record to String parentContainerId = target.getTargetParentId(); @@ -155,7 +163,7 @@ public class RecordsImpl implements Records, InitializingBean } }); } - NodeRef parentRecordFolder = nodes.getOrCreatePath(parentContainerId, target.getRelativePath(), ContentModel.TYPE_CONTENT); + NodeRef parentRecordFolder = rmNodes.getOrCreatePath(parentContainerId, target.getRelativePath(), ContentModel.TYPE_CONTENT); // Check if the target is a record folder if(!dictionaryService.isSubClass(nodeService.getType(parentRecordFolder), RecordsManagementModel.TYPE_RECORD_FOLDER)) @@ -186,7 +194,7 @@ public class RecordsImpl implements Records, InitializingBean } // Get the record info - return nodes.getFolderOrDocument(recordId, parameters); + return rmNodes.getFolderOrDocument(recordId, parameters); } @Override @@ -194,7 +202,7 @@ public class RecordsImpl implements Records, InitializingBean { ParameterCheck.mandatory("recordService", recordService); ParameterCheck.mandatory("filePlanService", filePlanService); - ParameterCheck.mandatory("nodes", nodes); + ParameterCheck.mandatory("nodes", rmNodes); ParameterCheck.mandatory("nodeService", nodeService); ParameterCheck.mandatory("fileFolderService", fileFolderService); ParameterCheck.mandatory("dictionaryService", dictionaryService); diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplRelativePathUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplRelativePathUnitTest.java index 0a0db60ae7..796242aa56 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplRelativePathUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplRelativePathUnitTest.java @@ -85,6 +85,7 @@ public class RMNodesImplRelativePathUnitTest extends BaseUnitTest * Given any parent node */ NodeRef parentNode = AlfMock.generateNodeRef(mockedNodeService); + when(mockedFilePlanService.isFilePlanComponent(parentNode)).thenReturn(true); /* * When trying to create a node in the parent node with no relative path @@ -112,6 +113,7 @@ public class RMNodesImplRelativePathUnitTest extends BaseUnitTest * Given a parent node and an existing path c1/f1 under it */ NodeRef parentNode = AlfMock.generateNodeRef(mockedNodeService); + when(mockedFilePlanService.isFilePlanComponent(parentNode)).thenReturn(true); String category = "c1"; NodeRef categoryNode = AlfMock.generateNodeRef(mockedNodeService); @@ -154,6 +156,7 @@ public class RMNodesImplRelativePathUnitTest extends BaseUnitTest String category1 = "c1"; NodeRef categoryNode1 = AlfMock.generateNodeRef(mockedNodeService); when(mockedNodeService.getChildByName(fileplanNodeRef, ContentModel.ASSOC_CONTAINS, category1)).thenReturn(categoryNode1); + when(mockedFilePlanService.isFilePlanComponent(fileplanNodeRef)).thenReturn(true); // create c2 String category2 = "c2"; @@ -200,6 +203,7 @@ public class RMNodesImplRelativePathUnitTest extends BaseUnitTest */ NodeRef unfiledRecordContainer = AlfMock.generateNodeRef(mockedNodeService); when(mockedNodeService.getType(unfiledRecordContainer)).thenReturn(TYPE_UNFILED_RECORD_CONTAINER); + when(mockedFilePlanService.isFilePlanComponent(unfiledRecordContainer)).thenReturn(true); /* * When trying to create a content node in the relative path f1/f2/f3 @@ -255,6 +259,7 @@ public class RMNodesImplRelativePathUnitTest extends BaseUnitTest */ NodeRef fileplanNodeRef = AlfMock.generateNodeRef(mockedNodeService); when(mockedNodeService.getType(fileplanNodeRef)).thenReturn(TYPE_FILE_PLAN); + when(mockedFilePlanService.isFilePlanComponent(fileplanNodeRef)).thenReturn(true); /* * When trying to create a folder node in the relative path c1/c2/c3 diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplUnitTest.java index e174775483..ddd5db3af7 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplUnitTest.java @@ -318,10 +318,9 @@ public class RMNodesImplUnitTest extends BaseUnitTest setupCompanyHomeAndPrimaryParent(nodeRef); when(mockedFilePlanService.isFilePlanComponent(nodeRef)).thenReturn(false); - List includeParamList = new ArrayList(); try { - rmNodesImpl.getFolderOrDocument(nodeRef, null, null, includeParamList, null); + rmNodesImpl.validateNode(nodeRef.getId()); fail("Expected exception since the requested node is not a fileplan component."); } catch(InvalidParameterException ex) @@ -628,6 +627,7 @@ public class RMNodesImplUnitTest extends BaseUnitTest public void testValidateNode() throws Exception { NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService); + when(mockedFilePlanService.isFilePlanComponent(nodeRef)).thenReturn(true); NodeRef validateOrLookupNode = rmNodesImpl.validateNode(nodeRef.getId()); assertEquals(nodeRef, validateOrLookupNode); } diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RecordsImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RecordsImplUnitTest.java index c10b272441..e3c57b407a 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RecordsImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RecordsImplUnitTest.java @@ -40,6 +40,7 @@ import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock; import org.alfresco.module.org_alfresco_module_rm.test.util.MockAuthenticationUtilHelper; import org.alfresco.module.org_alfresco_module_rm.util.AuthenticationUtil; +import org.alfresco.rest.api.Nodes; import org.alfresco.rest.framework.resource.parameters.Parameters; import org.alfresco.rm.rest.api.RMNodes; import org.alfresco.rm.rest.api.Records; @@ -77,7 +78,9 @@ public class RecordsImplUnitTest @Mock protected AuthenticationUtil mockedAuthenticationUtil; @Mock - protected RMNodes mockedNodes; + protected RMNodes mockedRMNodes; + @Mock + protected Nodes mockedNodes; @InjectMocks private RecordsImpl recordsImpl; @@ -119,7 +122,7 @@ public class RecordsImplUnitTest * Then a record is created under the existing fileplan from the provided file */ verify(mockedRecordService).createRecord(fileplan, mockedFile, false); - verify(mockedNodes).getFolderOrDocument(mockedFile.getId(), params); + verify(mockedRMNodes).getFolderOrDocument(mockedFile.getId(), params); } /** @@ -134,7 +137,7 @@ public class RecordsImplUnitTest * Given a record */ NodeRef mockedRecord = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodes.validateNode(mockedRecord.getId())).thenReturn(mockedRecord); + when(mockedRMNodes.validateNode(mockedRecord.getId())).thenReturn(mockedRecord); /* * When trying to filing a record providing a blank destination path @@ -157,7 +160,7 @@ public class RecordsImplUnitTest */ // mock the record to file NodeRef mockedRecord = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodes.validateNode(mockedRecord.getId())).thenReturn(mockedRecord); + when(mockedRMNodes.validateNode(mockedRecord.getId())).thenReturn(mockedRecord); // mock the current primary parent NodeRef mockedPrimaryParent = AlfMock.generateNodeRef(mockedNodeService); @@ -169,7 +172,7 @@ public class RecordsImplUnitTest // mock the target record folder to file the record into NodeRef mockedTargetRecordFolder = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodes.getOrCreatePath(mockedTargetRecordFolder.getId(), null, TYPE_CONTENT)).thenReturn(mockedTargetRecordFolder); + when(mockedRMNodes.getOrCreatePath(mockedTargetRecordFolder.getId(), null, TYPE_CONTENT)).thenReturn(mockedTargetRecordFolder); when(mockedNodeService.getType(mockedTargetRecordFolder)).thenReturn(TYPE_RECORD_FOLDER); when(mockedDictionaryService.isSubClass(TYPE_RECORD_FOLDER, TYPE_RECORD_FOLDER)).thenReturn(true); @@ -185,7 +188,7 @@ public class RecordsImplUnitTest /* * Then the record is moved under the destination folder */ - verify(mockedNodes).getOrCreatePath(mockedTargetRecordFolder.getId(), null, TYPE_CONTENT); + verify(mockedRMNodes).getOrCreatePath(mockedTargetRecordFolder.getId(), null, TYPE_CONTENT); verify(mockedFileFolderService).moveFrom(mockedRecord, mockedPrimaryParent, mockedTargetRecordFolder, null); } @@ -203,7 +206,7 @@ public class RecordsImplUnitTest */ // mock the record to file NodeRef mockedRecord = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodes.validateNode(mockedRecord.getId())).thenReturn(mockedRecord); + when(mockedRMNodes.validateNode(mockedRecord.getId())).thenReturn(mockedRecord); // mock the current primary parent NodeRef mockedPrimaryParent = AlfMock.generateNodeRef(mockedNodeService); @@ -220,7 +223,7 @@ public class RecordsImplUnitTest // mock the target record folder to file the record into String relativePath = "category/recordFolder"; NodeRef mockedTargetRecordFolder = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodes.getOrCreatePath(fileplan.getId(), relativePath, TYPE_CONTENT)).thenReturn(mockedTargetRecordFolder); + when(mockedRMNodes.getOrCreatePath(fileplan.getId(), relativePath, TYPE_CONTENT)).thenReturn(mockedTargetRecordFolder); when(mockedNodeService.getType(mockedTargetRecordFolder)).thenReturn(TYPE_RECORD_FOLDER); when(mockedDictionaryService.isSubClass(TYPE_RECORD_FOLDER, TYPE_RECORD_FOLDER)).thenReturn(true); @@ -236,7 +239,7 @@ public class RecordsImplUnitTest /* * Then the record is moved under the destination folder relative to the fileplan */ - verify(mockedNodes).getOrCreatePath(fileplan.getId(), relativePath, TYPE_CONTENT); + verify(mockedRMNodes).getOrCreatePath(fileplan.getId(), relativePath, TYPE_CONTENT); verify(mockedFileFolderService).moveFrom(mockedRecord, mockedPrimaryParent, mockedTargetRecordFolder, null); } @@ -254,7 +257,7 @@ public class RecordsImplUnitTest */ // mock the record to file NodeRef mockedRecord = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodes.validateNode(mockedRecord.getId())).thenReturn(mockedRecord); + when(mockedRMNodes.validateNode(mockedRecord.getId())).thenReturn(mockedRecord); // mock the current primary parent NodeRef mockedPrimaryParent = AlfMock.generateNodeRef(mockedNodeService); @@ -270,7 +273,7 @@ public class RecordsImplUnitTest // mock the target record folder to file the record into String relativePath = "category/recordFolder"; NodeRef mockedTargetRecordFolder = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodes.getOrCreatePath(mockedTargetCategory.getId(), relativePath, TYPE_CONTENT)).thenReturn(mockedTargetRecordFolder); + when(mockedRMNodes.getOrCreatePath(mockedTargetCategory.getId(), relativePath, TYPE_CONTENT)).thenReturn(mockedTargetRecordFolder); when(mockedNodeService.getType(mockedTargetRecordFolder)).thenReturn(TYPE_RECORD_FOLDER); when(mockedDictionaryService.isSubClass(TYPE_RECORD_FOLDER, TYPE_RECORD_FOLDER)).thenReturn(true); @@ -287,7 +290,7 @@ public class RecordsImplUnitTest /* * Then the record is moved under the correct destination folder */ - verify(mockedNodes).getOrCreatePath(mockedTargetCategory.getId(), relativePath, TYPE_CONTENT); + verify(mockedRMNodes).getOrCreatePath(mockedTargetCategory.getId(), relativePath, TYPE_CONTENT); verify(mockedFileFolderService).moveFrom(mockedRecord, mockedPrimaryParent, mockedTargetRecordFolder, null); } @@ -304,7 +307,7 @@ public class RecordsImplUnitTest */ // mock the record to link NodeRef mockedRecord = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodes.validateNode(mockedRecord.getId())).thenReturn(mockedRecord); + when(mockedRMNodes.validateNode(mockedRecord.getId())).thenReturn(mockedRecord); // mock the current primary parent NodeRef mockedPrimaryParent = AlfMock.generateNodeRef(mockedNodeService); @@ -316,7 +319,7 @@ public class RecordsImplUnitTest // mock the target record folder to file the record into NodeRef mockedTargetRecordFolder = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodes.getOrCreatePath(mockedTargetRecordFolder.getId(), null, TYPE_CONTENT)).thenReturn(mockedTargetRecordFolder); + when(mockedRMNodes.getOrCreatePath(mockedTargetRecordFolder.getId(), null, TYPE_CONTENT)).thenReturn(mockedTargetRecordFolder); when(mockedNodeService.getType(mockedTargetRecordFolder)).thenReturn(TYPE_RECORD_FOLDER); /* @@ -331,7 +334,7 @@ public class RecordsImplUnitTest /* * Then the record is linked to the destination folder */ - verify(mockedNodes).getOrCreatePath(mockedTargetRecordFolder.getId(), null, TYPE_CONTENT); + verify(mockedRMNodes).getOrCreatePath(mockedTargetRecordFolder.getId(), null, TYPE_CONTENT); verify(mockedRecordService).link(mockedRecord, mockedTargetRecordFolder); } }