From 3e1bd9a1a9df39b55ac88d863ed0342696920841 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Tue, 25 Mar 2014 07:06:12 +0000 Subject: [PATCH] RM-1362: When a record folder is transferred the records should not have the review or edit review date actions * including unit tests for the updated transfer evaluator git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@65499 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../app/evaluator/TransferEvaluator.java | 52 +++++- .../transfer/TransferServiceImpl.java | 10 +- .../AllUnitTestSuite.java | 4 +- .../org_alfresco_module_rm/BaseUnitTest.java | 29 +++ .../hold/HoldServiceImplUnitTest.java | 21 +-- .../evaluator/TransferEvaluatorUnitTest.java | 170 ++++++++++++++++++ .../RecordMetadataBootstrapUnitTest.java | 3 - 7 files changed, 261 insertions(+), 28 deletions(-) create mode 100644 rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/evaluator/TransferEvaluatorUnitTest.java diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/evaluator/TransferEvaluator.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/evaluator/TransferEvaluator.java index 8a22f8085a..6ef3904d55 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/evaluator/TransferEvaluator.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/evaluator/TransferEvaluator.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2011 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -27,29 +27,73 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.RegexQNamePattern; /** + * Evaluates whether the node in question is transferring is either a transfer or accession. + * * @author Roy Wetherall */ public class TransferEvaluator extends BaseEvaluator { + /** indicates whether we are looking for accessions or transfers */ private boolean transferAccessionIndicator = false; + /** + * @param transferAccessionIndicator true if accession, false otherwise + */ public void setTransferAccessionIndicator(boolean transferAccessionIndicator) { this.transferAccessionIndicator = transferAccessionIndicator; } + /** + * @see org.alfresco.module.org_alfresco_module_rm.jscript.app.BaseEvaluator#evaluateImpl(org.alfresco.service.cmr.repository.NodeRef) + */ @Override protected boolean evaluateImpl(NodeRef nodeRef) { + boolean result = false; + + NodeRef transfer = getTransferNodeRef(nodeRef); + if (transfer != null) + { + boolean actual = ((Boolean)nodeService.getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR)).booleanValue(); + result = (actual == transferAccessionIndicator); + } + + return result; + } + + /** + * Helper method to get the transfer node reference. + *

+ * Takes into account records in tranferred record folders. + * + * @param nodeRef node reference + * @return {@link NodeRef} transfer node + */ + private NodeRef getTransferNodeRef(NodeRef nodeRef) + { + NodeRef result = null; + List parents = nodeService.getParentAssocs(nodeRef, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); if (parents.size() == 1) { - boolean actual = ((Boolean)nodeService.getProperty(parents.get(0).getParentRef(), RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR)).booleanValue(); - return (actual == transferAccessionIndicator); + result = parents.get(0).getParentRef(); } else { - return false; + if (recordService.isRecord(nodeRef)) + { + for (NodeRef recordFolder : recordFolderService.getRecordFolders(nodeRef)) + { + result = getTransferNodeRef(recordFolder); + if (result != null) + { + break; + } + }; + } } + + return result; } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java index 7d9ece2618..8c004ddbfc 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java @@ -185,7 +185,15 @@ public class TransferServiceImpl extends ServiceBaseImpl implements TransferServ setPDFIndicationFlag(transferNodeRef, nodeRef); // Set the transferring indicator aspect - nodeService.addAspect(nodeRef, ASPECT_TRANSFERRING, null); + nodeService.addAspect(nodeRef, ASPECT_TRANSFERRING, null); + if (isRecordFolder(nodeRef) == true) + { + // add the transferring indicator aspect to all the child records + for (NodeRef record : recordService.getRecords(nodeRef)) + { + nodeService.addAspect(record, ASPECT_TRANSFERRING, null); + } + } return transferNodeRef; } diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/AllUnitTestSuite.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/AllUnitTestSuite.java index 3f35bfca29..f5d000dd29 100755 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/AllUnitTestSuite.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/AllUnitTestSuite.java @@ -20,6 +20,7 @@ package org.alfresco.module.org_alfresco_module_rm; import org.alfresco.module.org_alfresco_module_rm.forms.RecordsManagementTypeFormFilterUnitTest; import org.alfresco.module.org_alfresco_module_rm.hold.HoldServiceImplUnitTest; +import org.alfresco.module.org_alfresco_module_rm.jscript.app.evaluator.TransferEvaluatorUnitTest; import org.alfresco.module.org_alfresco_module_rm.record.RecordMetadataBootstrapUnitTest; import org.alfresco.module.org_alfresco_module_rm.record.RecordServiceImplUnitTest; import org.junit.runner.RunWith; @@ -38,7 +39,8 @@ import org.junit.runners.Suite.SuiteClasses; RecordMetadataBootstrapUnitTest.class, RecordServiceImplUnitTest.class, RecordsManagementTypeFormFilterUnitTest.class, - HoldServiceImplUnitTest.class + HoldServiceImplUnitTest.class, + TransferEvaluatorUnitTest.class }) public class AllUnitTestSuite { diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/BaseUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/BaseUnitTest.java index 485102a1ae..40ea420c7d 100755 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/BaseUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/BaseUnitTest.java @@ -18,19 +18,29 @@ */ package org.alfresco.module.org_alfresco_module_rm; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.identifier.IdentifierService; 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.recordfolder.RecordFolderService; import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.repository.ChildAssociationRef; 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.NamespaceService; import org.alfresco.service.namespace.QName; +import org.alfresco.service.namespace.QNamePattern; import org.alfresco.util.GUID; import org.alfresco.util.collections.CollectionUtils; import org.junit.Before; @@ -46,6 +56,9 @@ public class BaseUnitTest implements RecordsManagementModel { protected NodeRef filePlanComponent; protected NodeRef filePlan; + + protected NodeRef recordFolder; + protected NodeRef record; /** core service mocks */ @Mock(name="nodeService") protected NodeService mockedNodeService; @@ -54,6 +67,8 @@ public class BaseUnitTest implements RecordsManagementModel @Mock(name="identifierService") protected IdentifierService mockedIdentifierService; @Mock(name="filePlanService") protected FilePlanService mockedFilePlanService; + @Mock(name="recordFolderService") protected RecordFolderService mockedRecordFolderService; + @Mock(name="recordService") protected RecordService mockedRecordService; /** * Test method setup @@ -71,6 +86,20 @@ public class BaseUnitTest implements RecordsManagementModel when(mockedNamespaceService.getNamespaceURI(RM_PREFIX)).thenReturn(RM_URI); when(mockedNamespaceService.getPrefixes(RM_URI)).thenReturn(CollectionUtils.unmodifiableSet(RM_PREFIX)); + // setup record folder and record + recordFolder = generateRecordFolder(); + doReturn(true).when(mockedRecordFolderService).isRecordFolder(recordFolder); + record = generateRecord(); + doReturn(true).when(mockedRecordService).isRecord(record); + + // set record as child of record folder + List result = new ArrayList(1); + result.add(new ChildAssociationRef(ContentModel.ASSOC_CONTAINS, recordFolder, generateQName(), record, true, 1)); + doReturn(result).when(mockedNodeService).getChildAssocs(eq(recordFolder), eq(ContentModel.ASSOC_CONTAINS), any(QNamePattern.class)); + doReturn(result).when(mockedNodeService).getParentAssocs(record); + doReturn(Collections.singletonList(recordFolder)).when(mockedRecordFolderService).getRecordFolders(record); + doReturn(Collections.singletonList(record)).when(mockedRecordService).getRecords(recordFolder); + } /** diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java index 589040a917..9e39b48ca1 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java @@ -42,19 +42,15 @@ import java.util.Map; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.BaseUnitTest; -import org.alfresco.module.org_alfresco_module_rm.record.RecordService; -import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; -import org.alfresco.service.namespace.QNamePattern; import org.alfresco.service.namespace.RegexQNamePattern; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; -import org.mockito.Mock; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -74,12 +70,7 @@ public class HoldServiceImplUnitTest extends BaseUnitTest protected NodeRef holdContainer; protected NodeRef hold; - protected NodeRef hold2; - protected NodeRef recordFolder; - protected NodeRef record; - - @Mock(name="recordFolderService") protected RecordFolderService mockedRecordFolderService; - @Mock(name="recordService") protected RecordService mockedRecordService; + protected NodeRef hold2; @Spy @InjectMocks HoldServiceImpl holdService; @@ -93,19 +84,11 @@ public class HoldServiceImplUnitTest extends BaseUnitTest holdContainer = generateNodeRef(TYPE_HOLD_CONTAINER); hold = generateNodeRef(TYPE_HOLD); hold2 = generateNodeRef(TYPE_HOLD); - recordFolder = generateRecordFolder(); - record = generateRecord(); // setup interactions doReturn(holdContainer).when(mockedFilePlanService).getHoldContainer(filePlan); - // set record as child of record folder - List result = new ArrayList(1); - result.add(new ChildAssociationRef(ContentModel.ASSOC_CONTAINS, recordFolder, generateQName(), record, true, 1)); - doReturn(result).when(mockedNodeService).getChildAssocs(eq(recordFolder), eq(ContentModel.ASSOC_CONTAINS), any(QNamePattern.class)); - doReturn(result).when(mockedNodeService).getParentAssocs(record); - doReturn(Collections.singletonList(recordFolder)).when(mockedRecordFolderService).getRecordFolders(record); - doReturn(Collections.singletonList(record)).when(mockedRecordService).getRecords(recordFolder); + } @Test diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/evaluator/TransferEvaluatorUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/evaluator/TransferEvaluatorUnitTest.java new file mode 100644 index 0000000000..25d626dc0e --- /dev/null +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/evaluator/TransferEvaluatorUnitTest.java @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.jscript.app.evaluator; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.alfresco.module.org_alfresco_module_rm.BaseUnitTest; +import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.RegexQNamePattern; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Spy; + +/** + * Transfer evaluator unit test. + * + * @author Roy Wetherall + */ +public class TransferEvaluatorUnitTest extends BaseUnitTest +{ + private NodeRef transfer; + + @Spy @InjectMocks TransferEvaluator transferEvaluator; + + @Override + public void before() + { + super.before(); + + // setup node references + transfer = generateNodeRef(TYPE_TRANSFER); + } + + private List getParentAssocs(NodeRef provided) + { + List result = new ArrayList(1); + result.add(new ChildAssociationRef(ASSOC_TRANSFERRED, transfer, generateQName(), provided, false, 1)); + return result; + } + + @Test + public void isNotTransferringRecord() + { + // setup interactions + doReturn(Collections.emptyList()).when(mockedNodeService).getParentAssocs(record, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + + // evaluate + assertFalse(transferEvaluator.evaluate(record)); + + // verify interactions + verify(mockedNodeService, times(1)).getParentAssocs(record, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + verify(mockedNodeService, never()).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + verify(mockedRecordFolderService, times(1)).getRecordFolders(record); + + } + + @Test + public void isTransferringWhenExpectingAccending() + { + // setup interactions + doReturn(Boolean.FALSE).when(mockedNodeService).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + doReturn(getParentAssocs(record)).when(mockedNodeService).getParentAssocs(record, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + transferEvaluator.setTransferAccessionIndicator(true); + + // evaluate + assertFalse(transferEvaluator.evaluate(record)); + + // verify interactions + verify(mockedNodeService, times(1)).getParentAssocs(record, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + verify(mockedNodeService, times(1)).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + verify(mockedRecordFolderService, never()).getRecordFolders(record); + } + + @Test + public void transferringRecord() + { + // setup interactions + doReturn(Boolean.FALSE).when(mockedNodeService).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + doReturn(getParentAssocs(record)).when(mockedNodeService).getParentAssocs(record, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + + // evaluate + assertTrue(transferEvaluator.evaluate(record)); + + // verify interactions + verify(mockedNodeService, times(1)).getParentAssocs(record, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + verify(mockedNodeService, times(1)).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + verify(mockedRecordFolderService, never()).getRecordFolders(record); + + } + + @Test + public void transferringRecordFolder() + { + // setup interactions + doReturn(Boolean.FALSE).when(mockedNodeService).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + doReturn(getParentAssocs(recordFolder)).when(mockedNodeService).getParentAssocs(recordFolder, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + + // evaluate + assertTrue(transferEvaluator.evaluate(recordFolder)); + + // verify interactions + verify(mockedNodeService, times(1)).getParentAssocs(recordFolder, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + verify(mockedNodeService, times(1)).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + verify(mockedRecordFolderService, never()).getRecordFolders(record); + } + + @Test + public void transferringRecordWithinRecordFolder() + { + // setup interactions + doReturn(Boolean.FALSE).when(mockedNodeService).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + doReturn(Collections.emptyList()).when(mockedNodeService).getParentAssocs(record, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + doReturn(getParentAssocs(recordFolder)).when(mockedNodeService).getParentAssocs(recordFolder, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + + // evaluate + assertTrue(transferEvaluator.evaluate(record)); + + // verify interactions + verify(mockedNodeService, times(1)).getParentAssocs(record, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + verify(mockedNodeService, times(1)).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + verify(mockedRecordFolderService, times(1)).getRecordFolders(record); + + } + + @Test + public void accendingRecord() + { + // setup interactions + doReturn(Boolean.TRUE).when(mockedNodeService).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + doReturn(getParentAssocs(record)).when(mockedNodeService).getParentAssocs(record, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + transferEvaluator.setTransferAccessionIndicator(true); + + // evaluate + assertTrue(transferEvaluator.evaluate(record)); + + // verify interactions + verify(mockedNodeService, times(1)).getParentAssocs(record, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); + verify(mockedNodeService, times(1)).getProperty(transfer, RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR); + verify(mockedRecordFolderService, never()).getRecordFolders(record); + + } + +} diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordMetadataBootstrapUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordMetadataBootstrapUnitTest.java index d3293f4520..e34ed315e7 100755 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordMetadataBootstrapUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordMetadataBootstrapUnitTest.java @@ -27,7 +27,6 @@ import org.alfresco.module.org_alfresco_module_rm.BaseUnitTest; import org.alfresco.service.namespace.QName; import org.junit.Test; import org.mockito.InjectMocks; -import org.mockito.Mock; /** * Unit test for RecordMetadataBootstrap @@ -36,8 +35,6 @@ import org.mockito.Mock; */ public class RecordMetadataBootstrapUnitTest extends BaseUnitTest { - @Mock(name="recordService") protected RecordService mockedRecordService; - @InjectMocks private RecordMetadataBootstrap bootstrap; /**