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
This commit is contained in:
Roy Wetherall
2014-03-25 07:06:12 +00:00
parent da76f3b18f
commit 3e1bd9a1a9
7 changed files with 261 additions and 28 deletions

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2011 Alfresco Software Limited. * Copyright (C) 2005-2014 Alfresco Software Limited.
* *
* This file is part of Alfresco * This file is part of Alfresco
* *
@@ -27,29 +27,73 @@ import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.service.namespace.RegexQNamePattern;
/** /**
* Evaluates whether the node in question is transferring is either a transfer or accession.
*
* @author Roy Wetherall * @author Roy Wetherall
*/ */
public class TransferEvaluator extends BaseEvaluator public class TransferEvaluator extends BaseEvaluator
{ {
/** indicates whether we are looking for accessions or transfers */
private boolean transferAccessionIndicator = false; private boolean transferAccessionIndicator = false;
/**
* @param transferAccessionIndicator true if accession, false otherwise
*/
public void setTransferAccessionIndicator(boolean transferAccessionIndicator) public void setTransferAccessionIndicator(boolean transferAccessionIndicator)
{ {
this.transferAccessionIndicator = transferAccessionIndicator; this.transferAccessionIndicator = transferAccessionIndicator;
} }
/**
* @see org.alfresco.module.org_alfresco_module_rm.jscript.app.BaseEvaluator#evaluateImpl(org.alfresco.service.cmr.repository.NodeRef)
*/
@Override @Override
protected boolean evaluateImpl(NodeRef nodeRef) 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.
* <p>
* 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<ChildAssociationRef> parents = nodeService.getParentAssocs(nodeRef, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL); List<ChildAssociationRef> parents = nodeService.getParentAssocs(nodeRef, RecordsManagementModel.ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL);
if (parents.size() == 1) if (parents.size() == 1)
{ {
boolean actual = ((Boolean)nodeService.getProperty(parents.get(0).getParentRef(), RecordsManagementModel.PROP_TRANSFER_ACCESSION_INDICATOR)).booleanValue(); result = parents.get(0).getParentRef();
return (actual == transferAccessionIndicator);
} }
else else
{ {
return false; if (recordService.isRecord(nodeRef))
{
for (NodeRef recordFolder : recordFolderService.getRecordFolders(nodeRef))
{
result = getTransferNodeRef(recordFolder);
if (result != null)
{
break;
}
};
}
} }
return result;
} }
} }

View File

@@ -185,7 +185,15 @@ public class TransferServiceImpl extends ServiceBaseImpl implements TransferServ
setPDFIndicationFlag(transferNodeRef, nodeRef); setPDFIndicationFlag(transferNodeRef, nodeRef);
// Set the transferring indicator aspect // 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; return transferNodeRef;
} }

View File

@@ -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.forms.RecordsManagementTypeFormFilterUnitTest;
import org.alfresco.module.org_alfresco_module_rm.hold.HoldServiceImplUnitTest; 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.RecordMetadataBootstrapUnitTest;
import org.alfresco.module.org_alfresco_module_rm.record.RecordServiceImplUnitTest; import org.alfresco.module.org_alfresco_module_rm.record.RecordServiceImplUnitTest;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -38,7 +39,8 @@ import org.junit.runners.Suite.SuiteClasses;
RecordMetadataBootstrapUnitTest.class, RecordMetadataBootstrapUnitTest.class,
RecordServiceImplUnitTest.class, RecordServiceImplUnitTest.class,
RecordsManagementTypeFormFilterUnitTest.class, RecordsManagementTypeFormFilterUnitTest.class,
HoldServiceImplUnitTest.class HoldServiceImplUnitTest.class,
TransferEvaluatorUnitTest.class
}) })
public class AllUnitTestSuite public class AllUnitTestSuite
{ {

View File

@@ -18,19 +18,29 @@
*/ */
package org.alfresco.module.org_alfresco_module_rm; 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.doReturn;
import static org.mockito.Mockito.when; 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.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; 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.identifier.IdentifierService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; 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.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.QNamePattern;
import org.alfresco.util.GUID; import org.alfresco.util.GUID;
import org.alfresco.util.collections.CollectionUtils; import org.alfresco.util.collections.CollectionUtils;
import org.junit.Before; import org.junit.Before;
@@ -46,6 +56,9 @@ public class BaseUnitTest implements RecordsManagementModel
{ {
protected NodeRef filePlanComponent; protected NodeRef filePlanComponent;
protected NodeRef filePlan; protected NodeRef filePlan;
protected NodeRef recordFolder;
protected NodeRef record;
/** core service mocks */ /** core service mocks */
@Mock(name="nodeService") protected NodeService mockedNodeService; @Mock(name="nodeService") protected NodeService mockedNodeService;
@@ -54,6 +67,8 @@ public class BaseUnitTest implements RecordsManagementModel
@Mock(name="identifierService") protected IdentifierService mockedIdentifierService; @Mock(name="identifierService") protected IdentifierService mockedIdentifierService;
@Mock(name="filePlanService") protected FilePlanService mockedFilePlanService; @Mock(name="filePlanService") protected FilePlanService mockedFilePlanService;
@Mock(name="recordFolderService") protected RecordFolderService mockedRecordFolderService;
@Mock(name="recordService") protected RecordService mockedRecordService;
/** /**
* Test method setup * Test method setup
@@ -71,6 +86,20 @@ public class BaseUnitTest implements RecordsManagementModel
when(mockedNamespaceService.getNamespaceURI(RM_PREFIX)).thenReturn(RM_URI); when(mockedNamespaceService.getNamespaceURI(RM_PREFIX)).thenReturn(RM_URI);
when(mockedNamespaceService.getPrefixes(RM_URI)).thenReturn(CollectionUtils.unmodifiableSet(RM_PREFIX)); 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<ChildAssociationRef> result = new ArrayList<ChildAssociationRef>(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);
} }
/** /**

View File

@@ -42,19 +42,15 @@ import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.BaseUnitTest; 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.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.QNamePattern;
import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.service.namespace.RegexQNamePattern;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
import org.mockito.invocation.InvocationOnMock; import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
@@ -74,12 +70,7 @@ public class HoldServiceImplUnitTest extends BaseUnitTest
protected NodeRef holdContainer; protected NodeRef holdContainer;
protected NodeRef hold; protected NodeRef hold;
protected NodeRef hold2; protected NodeRef hold2;
protected NodeRef recordFolder;
protected NodeRef record;
@Mock(name="recordFolderService") protected RecordFolderService mockedRecordFolderService;
@Mock(name="recordService") protected RecordService mockedRecordService;
@Spy @InjectMocks HoldServiceImpl holdService; @Spy @InjectMocks HoldServiceImpl holdService;
@@ -93,19 +84,11 @@ public class HoldServiceImplUnitTest extends BaseUnitTest
holdContainer = generateNodeRef(TYPE_HOLD_CONTAINER); holdContainer = generateNodeRef(TYPE_HOLD_CONTAINER);
hold = generateNodeRef(TYPE_HOLD); hold = generateNodeRef(TYPE_HOLD);
hold2 = generateNodeRef(TYPE_HOLD); hold2 = generateNodeRef(TYPE_HOLD);
recordFolder = generateRecordFolder();
record = generateRecord();
// setup interactions // setup interactions
doReturn(holdContainer).when(mockedFilePlanService).getHoldContainer(filePlan); doReturn(holdContainer).when(mockedFilePlanService).getHoldContainer(filePlan);
// set record as child of record folder
List<ChildAssociationRef> result = new ArrayList<ChildAssociationRef>(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 @Test

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<ChildAssociationRef> getParentAssocs(NodeRef provided)
{
List<ChildAssociationRef> result = new ArrayList<ChildAssociationRef>(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);
}
}

View File

@@ -27,7 +27,6 @@ import org.alfresco.module.org_alfresco_module_rm.BaseUnitTest;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.junit.Test; import org.junit.Test;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock;
/** /**
* Unit test for RecordMetadataBootstrap * Unit test for RecordMetadataBootstrap
@@ -36,8 +35,6 @@ import org.mockito.Mock;
*/ */
public class RecordMetadataBootstrapUnitTest extends BaseUnitTest public class RecordMetadataBootstrapUnitTest extends BaseUnitTest
{ {
@Mock(name="recordService") protected RecordService mockedRecordService;
@InjectMocks private RecordMetadataBootstrap bootstrap; @InjectMocks private RecordMetadataBootstrap bootstrap;
/** /**