mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-01 14:41:46 +00:00
Merged DEV/INPLACE to HEAD :
41707: RM: Transparent records management prototype WIP * Create Record service and refactor * Add 'createRecord' method that preserves origional location(s) of the content * Add content readers information to record on extended security aspect * Experimental dynamic authority * DM action to 'create' record * Behaviour and methods to create and get new record container 41708: RM: In-place filing prototype WIP 42063: RM: Inplace filing prototype * extension of seciruty service to allow management of extended readers * extended reader maintained within file plan hierarchy * support ready for removal (ie move) and overlapping of readers in hirearchy (maintained in reference counting map) * general rename to "Unfiled Records" rather than "New Records" * File plan unfiled records filter * Unit tests * Correct permissions on created unfiled container (file for admin as per file plan root) * record readers dynamic authority applied to file plan components on bootstrap and creation 42374: RM InPlace Prototype: * permission mapping improvements ... allows filling and declaration of unfiled records * actions of 'records' in doc lib are shown as restricted rm list * "Record" banner is shown in doc lib if content is a record (this differs from the normal record view where the undeclared status is shown, this isn't relevant for a content user) * linked to many record folders indicator not shown unless it really is linked to many record folders 42700: RM Prototype: * stoppped hidden RM actions from appearing in UI * added file record action (TODO run-as RecordsManager and make applicable via aspect) * added hook points to allow customisation of Rule UI and customised for file record action 43030: RM: In-place prototype 43238: Rule editing fixed 43332: Implemented a DeclareRecordAction so that a rule can be setup for a folder and a user can declare a record just uploading a file (in a collaboration site) into the folder. 43348: DeclareRecordAction: The actioned upon node should be a record no need to create a record from the actioned node. If it is not a record an error should be thrown. If a user wants to create and declare a file as record a composite rule can be used. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@43934 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
|
||||
package org.alfresco.module.org_alfresco_module_rm.test.service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
|
||||
/**
|
||||
* Records management security service test.
|
||||
*
|
||||
* @author Roy Wetherall
|
||||
*/
|
||||
public class NewRecordsManagementSecurityServiceImplTest extends BaseRMTestCase
|
||||
{
|
||||
private NodeRef record;
|
||||
private NodeRef recordToo;
|
||||
|
||||
@Override
|
||||
protected boolean isUserTest()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setupTestDataImpl()
|
||||
{
|
||||
super.setupTestDataImpl();
|
||||
|
||||
record = utils.createRecord(rmFolder, "record.txt");
|
||||
recordToo = utils.createRecord(rmFolder, "recordToo.txt");
|
||||
}
|
||||
|
||||
|
||||
// TODO testGetProtectedAspects
|
||||
|
||||
// TODO getProtectedProperties
|
||||
|
||||
// TODO bootstrapDefaultRoles
|
||||
|
||||
// TODO getRoles
|
||||
|
||||
// TODO getRolesByUser
|
||||
|
||||
// TODO getRole
|
||||
|
||||
// TODO existsRole
|
||||
|
||||
// TODO hasRMAdminRole
|
||||
|
||||
// TODO createRole
|
||||
|
||||
// TODO updateRole
|
||||
|
||||
// TODO deleteRole
|
||||
|
||||
// TODO assignRoleToAuthority
|
||||
|
||||
// TODO setPermission
|
||||
|
||||
// TODO deletePermission
|
||||
|
||||
public void testExtendedReaders()
|
||||
{
|
||||
doTestInTransaction(new Test<Void>()
|
||||
{
|
||||
public Void run()
|
||||
{
|
||||
assertFalse(hasExtendedReadersAspect(filePlan));
|
||||
assertFalse(hasExtendedReadersAspect(rmContainer));
|
||||
assertFalse(hasExtendedReadersAspect(rmFolder));
|
||||
assertFalse(hasExtendedReadersAspect(record));
|
||||
|
||||
assertNull(securityService.getExtendedReaders(record));
|
||||
|
||||
Set<String> extendedReaders = new HashSet<String>(2);
|
||||
extendedReaders.add("monkey");
|
||||
extendedReaders.add("elephant");
|
||||
|
||||
securityService.setExtendedReaders(record, extendedReaders);
|
||||
|
||||
Map<String, Integer> testMap = new HashMap<String, Integer>(2);
|
||||
testMap.put("monkey", Integer.valueOf(1));
|
||||
testMap.put("elephant", Integer.valueOf(1));
|
||||
|
||||
test(filePlan, testMap);
|
||||
test(rmContainer, testMap);
|
||||
test(rmFolder, testMap);
|
||||
test(record, testMap);
|
||||
|
||||
Set<String> extendedReadersToo = new HashSet<String>(2);
|
||||
extendedReadersToo.add("monkey");
|
||||
extendedReadersToo.add("snake");
|
||||
|
||||
securityService.setExtendedReaders(recordToo, extendedReadersToo);
|
||||
|
||||
Map<String, Integer> testMapToo = new HashMap<String, Integer>(2);
|
||||
testMapToo.put("monkey", Integer.valueOf(1));
|
||||
testMapToo.put("snake", Integer.valueOf(1));
|
||||
|
||||
Map<String, Integer> testMapThree = new HashMap<String, Integer>(3);
|
||||
testMapThree.put("monkey", Integer.valueOf(2));
|
||||
testMapThree.put("elephant", Integer.valueOf(1));
|
||||
testMapThree.put("snake", Integer.valueOf(1));
|
||||
|
||||
test(filePlan, testMapThree);
|
||||
test(rmContainer, testMapThree);
|
||||
test(rmFolder, testMapThree);
|
||||
test(recordToo, testMapToo);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean hasExtendedReadersAspect(NodeRef nodeRef)
|
||||
{
|
||||
return nodeService.hasAspect(nodeRef, ASPECT_EXTENDED_READERS);
|
||||
}
|
||||
|
||||
private void test(NodeRef nodeRef, Map<String, Integer> testMap)
|
||||
{
|
||||
assertTrue(hasExtendedReadersAspect(nodeRef));
|
||||
|
||||
Map<String, Integer> readersMap = (Map<String,Integer>)nodeService.getProperty(nodeRef, PROP_READERS);
|
||||
assertNotNull(readersMap);
|
||||
assertEquals(testMap.size(), readersMap.size());
|
||||
|
||||
for (Map.Entry<String, Integer> entry: testMap.entrySet())
|
||||
{
|
||||
assertTrue(readersMap.containsKey(entry.getKey()));
|
||||
assertEquals(entry.getValue(), readersMap.get(entry.getKey()));
|
||||
|
||||
}
|
||||
|
||||
Set<String> readers = securityService.getExtendedReaders(nodeRef);
|
||||
assertNotNull(readers);
|
||||
assertEquals(testMap.size(), readers.size());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// TODO getExtendedReaders
|
||||
|
||||
// TODO setExtendedReaders
|
||||
|
||||
// TODO removeExtendedReaders
|
||||
|
||||
// TODO removeAllExtendedReaders
|
||||
}
|
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2011 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.test.service;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.action.dm.CreateRecordAction;
|
||||
import org.alfresco.module.org_alfresco_module_rm.capability.Capability;
|
||||
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.security.ExtendedReaderDynamicAuthority;
|
||||
import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.site.SiteModel;
|
||||
import org.alfresco.repo.site.SiteServiceImpl;
|
||||
import org.alfresco.service.cmr.action.Action;
|
||||
import org.alfresco.service.cmr.action.ActionService;
|
||||
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.cmr.site.SiteInfo;
|
||||
import org.alfresco.service.cmr.site.SiteService;
|
||||
import org.alfresco.service.cmr.site.SiteVisibility;
|
||||
import org.alfresco.service.cmr.tagging.TaggingService;
|
||||
import org.alfresco.util.GUID;
|
||||
|
||||
/**
|
||||
* Record service implementation unit test.
|
||||
*
|
||||
* @author Roy Wetherall
|
||||
*/
|
||||
public class RecordServiceTestImpl extends BaseRMTestCase
|
||||
{
|
||||
protected static final String COLLABORATION_SITE_ID = "collab-site-id";
|
||||
|
||||
protected ActionService dmActionService;
|
||||
protected TaggingService taggingService;
|
||||
protected PermissionService dmPermissionService;
|
||||
|
||||
protected SiteInfo collaborationSite;
|
||||
protected NodeRef documentLibrary;
|
||||
protected NodeRef dmFolder;
|
||||
protected NodeRef dmDocument;
|
||||
|
||||
protected String dmUserName;
|
||||
protected NodeRef dmUserPerson;
|
||||
|
||||
@Override
|
||||
protected void initServices()
|
||||
{
|
||||
super.initServices();
|
||||
|
||||
dmActionService = (ActionService)applicationContext.getBean("ActionService");
|
||||
taggingService = (TaggingService)applicationContext.getBean("TaggingService");
|
||||
dmPermissionService = (PermissionService)applicationContext.getBean("PermissionService");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isUserTest()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setupTestData()
|
||||
{
|
||||
super.setupTestData();
|
||||
|
||||
doTestInTransaction(new Test<Void>()
|
||||
{
|
||||
public Void run()
|
||||
{
|
||||
setupCollaborationSiteTestDataImpl();
|
||||
return null;
|
||||
}
|
||||
},
|
||||
AuthenticationUtil.getSystemUserName());
|
||||
}
|
||||
|
||||
protected void setupCollaborationSiteTestDataImpl()
|
||||
{
|
||||
// create collaboration site
|
||||
collaborationSite = siteService.createSite("preset", COLLABORATION_SITE_ID, "title", "description", SiteVisibility.PRIVATE);
|
||||
documentLibrary = SiteServiceImpl.getSiteContainer(
|
||||
COLLABORATION_SITE_ID,
|
||||
SiteService.DOCUMENT_LIBRARY,
|
||||
true,
|
||||
siteService,
|
||||
transactionService,
|
||||
taggingService);
|
||||
|
||||
assertNotNull("Collaboration site document library component was not successfully created.", documentLibrary);
|
||||
|
||||
// create a folder and documents
|
||||
dmFolder = fileFolderService.create(documentLibrary, "collabFolder", ContentModel.TYPE_FOLDER).getNodeRef();
|
||||
dmDocument = fileFolderService.create(dmFolder, "collabDocument.txt", ContentModel.TYPE_CONTENT).getNodeRef();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setupTestUsersImpl(NodeRef filePlan)
|
||||
{
|
||||
super.setupTestUsersImpl(filePlan);
|
||||
|
||||
dmUserName = GUID.generate();
|
||||
dmUserPerson = createPerson(dmUserName);
|
||||
siteService.setMembership(COLLABORATION_SITE_ID, dmUserName, SiteModel.SITE_COLLABORATOR);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDownImpl()
|
||||
{
|
||||
super.tearDownImpl();
|
||||
siteService.deleteSite(COLLABORATION_SITE_ID);
|
||||
}
|
||||
|
||||
public void testCreateRecordAction()
|
||||
{
|
||||
doTestInTransaction(new Test<Void>()
|
||||
{
|
||||
public Void run()
|
||||
{
|
||||
assertEquals(AccessStatus.DENIED, dmPermissionService.hasPermission(dmDocument, RMPermissionModel.READ_RECORDS));
|
||||
assertEquals(AccessStatus.DENIED, dmPermissionService.hasPermission(filePlan, RMPermissionModel.VIEW_RECORDS));
|
||||
|
||||
Action action = dmActionService.createAction(CreateRecordAction.NAME);
|
||||
dmActionService.executeAction(action, dmDocument);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void test(Void result) throws Exception
|
||||
{
|
||||
assertEquals(AccessStatus.ALLOWED, dmPermissionService.hasPermission(dmDocument, RMPermissionModel.READ_RECORDS));
|
||||
assertEquals(AccessStatus.ALLOWED, dmPermissionService.hasPermission(filePlan, RMPermissionModel.VIEW_RECORDS));
|
||||
|
||||
assertTrue(rmService.isRecord(dmDocument));
|
||||
|
||||
//
|
||||
Capability createCapability = capabilityService.getCapability("Create");
|
||||
assertNotNull(createCapability);
|
||||
createCapability.evaluate(dmDocument);
|
||||
|
||||
|
||||
|
||||
};
|
||||
},
|
||||
dmUserName);
|
||||
|
||||
doTestInTransaction(new Test<Void>()
|
||||
{
|
||||
public Void run()
|
||||
{
|
||||
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
@@ -56,7 +56,7 @@ import org.alfresco.util.GUID;
|
||||
import org.alfresco.util.PropertyMap;
|
||||
|
||||
/**
|
||||
* Event service implementation unit test
|
||||
* Security service implementation unit test
|
||||
*
|
||||
* @author Roy Wetherall
|
||||
*/
|
||||
|
@@ -574,10 +574,7 @@ public class RecordsManagementServiceImplTest extends BaseRMTestCase
|
||||
});
|
||||
}
|
||||
|
||||
/********** Record methods **********/
|
||||
|
||||
// TODO void testGetRecordFolders(NodeRef record);
|
||||
|
||||
/********** RM2 - Multi-hierarchy record taxonomy's **********/
|
||||
|
||||
/**
|
||||
|
@@ -20,7 +20,7 @@ package org.alfresco.module.org_alfresco_module_rm.test.service;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementSearchBehaviour;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordsManagementSearchBehaviour;
|
||||
import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase;
|
||||
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordDefinition;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,812 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2011 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.test.system;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.action.impl.BroadcastDispositionActionDefinitionUpdateAction;
|
||||
import org.alfresco.module.org_alfresco_module_rm.action.impl.FileAction;
|
||||
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionAction;
|
||||
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition;
|
||||
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule;
|
||||
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEvent;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.test.util.TestUtilities;
|
||||
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordDefinition;
|
||||
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordService;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||
import org.alfresco.service.cmr.model.FileFolderService;
|
||||
import org.alfresco.service.cmr.model.FileInfo;
|
||||
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.Period;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.service.cmr.search.SearchService;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.service.transaction.TransactionService;
|
||||
import org.alfresco.util.BaseSpringTest;
|
||||
|
||||
/**
|
||||
* System test for records management service.
|
||||
*
|
||||
* Awaiting refactoring into records management test.
|
||||
*
|
||||
* @author Roy Wetherall
|
||||
*/
|
||||
public class RecordsManagementServiceImplSystemTest extends BaseSpringTest implements RecordsManagementModel
|
||||
{
|
||||
protected static StoreRef SPACES_STORE = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore");
|
||||
|
||||
private NodeRef filePlan;
|
||||
|
||||
private FileFolderService fileFolderService;
|
||||
private NodeService nodeService;
|
||||
private NodeService unprotectedNodeService;
|
||||
private RecordsManagementActionService rmActionService;
|
||||
private RecordsManagementService rmService;
|
||||
private SearchService searchService;
|
||||
private TransactionService transactionService;
|
||||
private RetryingTransactionHelper transactionHelper;
|
||||
private DispositionService dispositionService;
|
||||
private VitalRecordService vitalRecordService;
|
||||
|
||||
@Override
|
||||
protected void onSetUpInTransaction() throws Exception
|
||||
{
|
||||
super.onSetUpInTransaction();
|
||||
|
||||
// Get the service required in the tests
|
||||
this.fileFolderService = (FileFolderService)this.applicationContext.getBean("FileFolderService");
|
||||
this.nodeService = (NodeService)this.applicationContext.getBean("NodeService");
|
||||
this.unprotectedNodeService = (NodeService)this.applicationContext.getBean("nodeService");
|
||||
this.transactionService = (TransactionService)this.applicationContext.getBean("TransactionService");
|
||||
this.searchService = (SearchService)this.applicationContext.getBean("searchService");
|
||||
this.rmActionService = (RecordsManagementActionService)this.applicationContext.getBean("recordsManagementActionService");
|
||||
this.rmService = (RecordsManagementService)this.applicationContext.getBean("recordsManagementService");
|
||||
this.transactionHelper = (RetryingTransactionHelper)this.applicationContext.getBean("retryingTransactionHelper");
|
||||
this.dispositionService = (DispositionService)this.applicationContext.getBean("dispositionService");
|
||||
vitalRecordService = (VitalRecordService)applicationContext.getBean("VitalRecordService");
|
||||
|
||||
// Set the current security context as admin
|
||||
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
|
||||
|
||||
// Get the test data
|
||||
setUpTestData();
|
||||
}
|
||||
|
||||
private void setUpTestData()
|
||||
{
|
||||
filePlan = TestUtilities.loadFilePlanData(applicationContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onTearDownInTransaction() throws Exception
|
||||
{
|
||||
try
|
||||
{
|
||||
UserTransaction txn = transactionService.getUserTransaction(false);
|
||||
txn.begin();
|
||||
this.nodeService.deleteNode(filePlan);
|
||||
txn.commit();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// Nothing
|
||||
//System.out.println("DID NOT DELETE FILE PLAN!");
|
||||
}
|
||||
}
|
||||
|
||||
public void testDispositionPresence() throws Exception
|
||||
{
|
||||
setComplete();
|
||||
endTransaction();
|
||||
|
||||
// create a record category node in
|
||||
final NodeRef nodeRef = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
NodeRef rootNode = nodeService.getRootNode(SPACES_STORE);
|
||||
Map<QName, Serializable> props = new HashMap<QName, Serializable>(1);
|
||||
String recordCategoryName = "Test Record Category";
|
||||
props.put(ContentModel.PROP_NAME, recordCategoryName);
|
||||
NodeRef result = nodeService.createNode(rootNode, ContentModel.ASSOC_CHILDREN,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(recordCategoryName)),
|
||||
TYPE_RECORD_CATEGORY, props).getChildRef();
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// ensure the record category node has the scheduled aspect and the disposition schedule association
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
assertTrue(nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_SCHEDULED));
|
||||
List<ChildAssociationRef> scheduleAssocs = nodeService.getChildAssocs(nodeRef, ASSOC_DISPOSITION_SCHEDULE, RegexQNamePattern.MATCH_ALL);
|
||||
|
||||
|
||||
assertNotNull(scheduleAssocs);
|
||||
assertEquals(1, scheduleAssocs.size());
|
||||
|
||||
// test retrieval of the disposition schedule via RM service
|
||||
DispositionSchedule schedule = dispositionService.getDispositionSchedule(nodeRef);
|
||||
assertNotNull(schedule);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* This test method contains a subset of the tests in TC 7-2 of the DoD doc.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testRescheduleRecord_IsNotCutOff() throws Exception
|
||||
{
|
||||
final NodeRef recCat = TestUtilities.getRecordCategory(rmService, nodeService, "Reports", "AIS Audit Records");
|
||||
// This RC has disposition instructions "Cut off monthly, hold 1 month, then destroy."
|
||||
|
||||
setComplete();
|
||||
endTransaction();
|
||||
|
||||
// Create a suitable folder for this test.
|
||||
final NodeRef testFolder = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
Map<QName, Serializable> folderProps = new HashMap<QName, Serializable>(1);
|
||||
String folderName = "testFolder" + System.currentTimeMillis();
|
||||
folderProps.put(ContentModel.PROP_NAME, folderName);
|
||||
NodeRef recordFolder = nodeService.createNode(recCat,
|
||||
ContentModel.ASSOC_CONTAINS,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, folderName),
|
||||
TYPE_RECORD_FOLDER).getChildRef();
|
||||
return recordFolder;
|
||||
}
|
||||
});
|
||||
|
||||
// Create a record in the test folder. File it and declare it.
|
||||
final NodeRef testRecord = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
final NodeRef result = nodeService.createNode(testFolder, ContentModel.ASSOC_CONTAINS,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
|
||||
"Record" + System.currentTimeMillis() + ".txt"),
|
||||
ContentModel.TYPE_CONTENT).getChildRef();
|
||||
|
||||
rmActionService.executeRecordsManagementAction(result, "file");
|
||||
TestUtilities.declareRecord(result, unprotectedNodeService, rmActionService);
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
assertTrue("recCat missing scheduled aspect", nodeService.hasAspect(recCat, RecordsManagementModel.ASPECT_SCHEDULED));
|
||||
assertFalse("folder should not have scheduled aspect", nodeService.hasAspect(testFolder, RecordsManagementModel.ASPECT_SCHEDULED));
|
||||
assertFalse("record should not have scheduled aspect", nodeService.hasAspect(testRecord, RecordsManagementModel.ASPECT_SCHEDULED));
|
||||
|
||||
assertFalse("recCat should not have dispositionLifecycle aspect", nodeService.hasAspect(recCat, RecordsManagementModel.ASPECT_DISPOSITION_LIFECYCLE));
|
||||
assertTrue("testFolder missing dispositionLifecycle aspect", nodeService.hasAspect(testFolder, RecordsManagementModel.ASPECT_DISPOSITION_LIFECYCLE));
|
||||
assertFalse("testRecord should not have dispositionLifecycle aspect", nodeService.hasAspect(testRecord, RecordsManagementModel.ASPECT_DISPOSITION_LIFECYCLE));
|
||||
|
||||
// Change the cutoff conditions for the associated record category
|
||||
final Date dateBeforeChange = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Date>()
|
||||
{
|
||||
public Date execute() throws Throwable
|
||||
{
|
||||
Date asOfDate = dispositionService.getNextDispositionAction(testFolder).getAsOfDate();
|
||||
System.out.println("Going to change the disposition asOf Date.");
|
||||
System.out.println(" - Original value: " + asOfDate);
|
||||
|
||||
// Now change "Cut off monthly, hold 1 month, then destroy."
|
||||
// to "Cut off yearly, hold 1 month, then destroy."
|
||||
List<DispositionActionDefinition> dads = dispositionService.getDispositionSchedule(testFolder).getDispositionActionDefinitions();
|
||||
DispositionActionDefinition firstDAD = dads.get(0);
|
||||
assertEquals("cutoff", firstDAD.getName());
|
||||
NodeRef dadNode = firstDAD.getNodeRef();
|
||||
|
||||
nodeService.setProperty(dadNode, PROP_DISPOSITION_PERIOD, new Period("year|1"));
|
||||
|
||||
List<QName> updatedProps = new ArrayList<QName>(1);
|
||||
updatedProps.add(PROP_DISPOSITION_PERIOD);
|
||||
refreshDispositionActionDefinition(dadNode, updatedProps);
|
||||
|
||||
return asOfDate;
|
||||
}
|
||||
});
|
||||
|
||||
// view the record metadata to verify that the record has been rescheduled.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
DispositionAction nextDispositionAction = dispositionService.getNextDispositionAction(testFolder);
|
||||
|
||||
assertEquals("cutoff", nextDispositionAction.getName());
|
||||
Date asOfDateAfterChange = nextDispositionAction.getAsOfDate();
|
||||
System.out.println(" - Updated value: " + asOfDateAfterChange);
|
||||
|
||||
assertFalse("Expected disposition asOf date to change.", asOfDateAfterChange.equals(dateBeforeChange));
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// Change the disposition type (e.g. time-based to event-based)
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
List<RecordsManagementEvent> rmes = dispositionService.getNextDispositionAction(testFolder).getDispositionActionDefinition().getEvents();
|
||||
System.out.println("Going to change the RMEs.");
|
||||
System.out.println(" - Original value: " + rmes);
|
||||
|
||||
List<DispositionActionDefinition> dads = dispositionService.getDispositionSchedule(testFolder).getDispositionActionDefinitions();
|
||||
DispositionActionDefinition firstDAD = dads.get(0);
|
||||
assertEquals("cutoff", firstDAD.getName());
|
||||
NodeRef dadNode = firstDAD.getNodeRef();
|
||||
|
||||
// nodeService.setProperty(dadNode, PROP_DISPOSITION_PERIOD, null);
|
||||
List<String> eventNames= new ArrayList<String>();
|
||||
eventNames.add("study_complete");
|
||||
nodeService.setProperty(dadNode, PROP_DISPOSITION_EVENT, (Serializable)eventNames);
|
||||
|
||||
return null;
|
||||
}
|
||||
});
|
||||
// Now add a second event to the same
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
DispositionAction nextDispositionAction = dispositionService.getNextDispositionAction(testFolder);
|
||||
StringBuilder buf = new StringBuilder();
|
||||
for (RecordsManagementEvent e : nextDispositionAction.getDispositionActionDefinition().getEvents()) {
|
||||
buf.append(e.getName()).append(',');
|
||||
}
|
||||
|
||||
System.out.println("Going to change the RMEs again.");
|
||||
System.out.println(" - Original value: " + buf.toString());
|
||||
|
||||
List<DispositionActionDefinition> dads = dispositionService.getDispositionSchedule(testFolder).getDispositionActionDefinitions();
|
||||
DispositionActionDefinition firstDAD = dads.get(0);
|
||||
assertEquals("cutoff", firstDAD.getName());
|
||||
NodeRef dadNode = firstDAD.getNodeRef();
|
||||
|
||||
List<String> eventNames= new ArrayList<String>();
|
||||
eventNames.add("study_complete");
|
||||
eventNames.add("case_complete");
|
||||
nodeService.setProperty(dadNode, PROP_DISPOSITION_EVENT, (Serializable)eventNames);
|
||||
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// View the record metadata to verify that the record has been rescheduled.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
DispositionAction nextDispositionAction = dispositionService.getNextDispositionAction(testFolder);
|
||||
|
||||
assertEquals("cutoff", nextDispositionAction.getName());
|
||||
StringBuilder buf = new StringBuilder();
|
||||
for (RecordsManagementEvent e : nextDispositionAction.getDispositionActionDefinition().getEvents()) {
|
||||
buf.append(e.getName()).append(',');
|
||||
}
|
||||
System.out.println(" - Updated value: " + buf.toString());
|
||||
|
||||
assertFalse("Disposition should not be eligible.", nextDispositionAction.isEventsEligible());
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// Tidy up test nodes.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
nodeService.deleteNode(testRecord);
|
||||
|
||||
// Change the disposition Period back to what it was.
|
||||
List<DispositionActionDefinition> dads = dispositionService.getDispositionSchedule(testFolder).getDispositionActionDefinitions();
|
||||
DispositionActionDefinition firstDAD = dads.get(0);
|
||||
assertEquals("cutoff", firstDAD.getName());
|
||||
NodeRef dadNode = firstDAD.getNodeRef();
|
||||
nodeService.setProperty(dadNode, PROP_DISPOSITION_PERIOD, new Period("month|1"));
|
||||
|
||||
nodeService.deleteNode(testFolder);
|
||||
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void refreshDispositionActionDefinition(NodeRef nodeRef, List<QName> updatedProps)
|
||||
{
|
||||
if (updatedProps != null)
|
||||
{
|
||||
Map<String, Serializable> params = new HashMap<String, Serializable>();
|
||||
params.put(BroadcastDispositionActionDefinitionUpdateAction.CHANGED_PROPERTIES, (Serializable)updatedProps);
|
||||
rmActionService.executeRecordsManagementAction(nodeRef, BroadcastDispositionActionDefinitionUpdateAction.NAME, params);
|
||||
}
|
||||
|
||||
// Remove the unpublished update aspect
|
||||
nodeService.removeAspect(nodeRef, ASPECT_UNPUBLISHED_UPDATE);
|
||||
}
|
||||
|
||||
public void testGetDispositionInstructions() throws Exception
|
||||
{
|
||||
setComplete();
|
||||
endTransaction();
|
||||
|
||||
// Get a record
|
||||
// TODO
|
||||
|
||||
// Get a record folder
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
NodeRef folderRecord = TestUtilities.getRecordFolder(rmService, nodeService, "Reports", "AIS Audit Records", "January AIS Audit Records");
|
||||
assertNotNull(folderRecord);
|
||||
assertEquals("January AIS Audit Records", nodeService.getProperty(folderRecord, ContentModel.PROP_NAME));
|
||||
|
||||
assertFalse(rmService.isRecord(folderRecord));
|
||||
assertTrue(rmService.isRecordFolder(folderRecord));
|
||||
assertFalse(rmService.isRecordCategory(folderRecord));
|
||||
|
||||
DispositionSchedule di = dispositionService.getDispositionSchedule(folderRecord);
|
||||
assertNotNull(di);
|
||||
assertEquals("N1-218-00-4 item 023", di.getDispositionAuthority());
|
||||
assertEquals("Cut off monthly, hold 1 month, then destroy.", di.getDispositionInstructions());
|
||||
assertFalse(di.isRecordLevelDisposition());
|
||||
|
||||
// Get a record category
|
||||
NodeRef recordCategory = TestUtilities.getRecordCategory(rmService, nodeService, "Reports", "AIS Audit Records");
|
||||
assertNotNull(recordCategory);
|
||||
assertEquals("AIS Audit Records", nodeService.getProperty(recordCategory, ContentModel.PROP_NAME));
|
||||
|
||||
assertFalse(rmService.isRecord(recordCategory));
|
||||
assertFalse(rmService.isRecordFolder(recordCategory));
|
||||
assertTrue(rmService.isRecordCategory(recordCategory));
|
||||
|
||||
di = dispositionService.getDispositionSchedule(recordCategory);
|
||||
assertNotNull(di);
|
||||
assertEquals("N1-218-00-4 item 023", di.getDispositionAuthority());
|
||||
assertEquals("Cut off monthly, hold 1 month, then destroy.", di.getDispositionInstructions());
|
||||
assertFalse(di.isRecordLevelDisposition());
|
||||
|
||||
List<DispositionActionDefinition> das = di.getDispositionActionDefinitions();
|
||||
assertNotNull(das);
|
||||
assertEquals(2, das.size());
|
||||
assertEquals("cutoff", das.get(0).getName());
|
||||
assertEquals("destroy", das.get(1).getName());
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void testMoveRecordWithinFileplan()
|
||||
{
|
||||
setComplete();
|
||||
endTransaction();
|
||||
|
||||
// We need record folders for test-filing as follows:
|
||||
// 1. A 'clean' record folder with no disposition schedult and no review period.
|
||||
// 2. A 'vital' record folder which has a review period defined.
|
||||
// 3. A 'dispositionable' record folder which has an applicable disposition schedule.
|
||||
//
|
||||
// The example fileplan includes a folder which covers [2] and [3] together.
|
||||
|
||||
final NodeRef cleanRecordFolder = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
NodeRef result = TestUtilities.getRecordFolder(rmService, nodeService, "Civilian Files", "Case Files and Papers", "Gilbert Competency Hearing");
|
||||
assertNotNull("cleanRecordFolder was null", result);
|
||||
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(result);
|
||||
assertNull("cleanRecordFolder had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertTrue("cleanRecordFolder had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(result);
|
||||
assertEquals("cleanRecordFolder had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
|
||||
assertNull("cleanRecordFolder had non-null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return result;
|
||||
}
|
||||
});
|
||||
final NodeRef dispAndVitalRecordFolder = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
NodeRef result = TestUtilities.getRecordFolder(rmService, nodeService, "Reports", "AIS Audit Records", "January AIS Audit Records");
|
||||
assertNotNull("dispositionAndVitalRecordFolder was null", result);
|
||||
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(result);
|
||||
assertNotNull("dispositionAndVitalRecordFolder had null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertFalse("dispositionAndVitalRecordFolder had empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(result);
|
||||
assertFalse("dispositionAndVitalRecordFolder had wrong review period.", "none|0".equals(vitalRecordDefinition.getReviewPeriod().getExpression()));
|
||||
assertNotNull("dispositionAndVitalRecordFolder had null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
// Create a record in the 'clean' folder.
|
||||
final NodeRef testRecord = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
final NodeRef result = nodeService.createNode(cleanRecordFolder, ContentModel.ASSOC_CONTAINS,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
|
||||
"Record" + System.currentTimeMillis() + ".txt"),
|
||||
ContentModel.TYPE_CONTENT).getChildRef();
|
||||
|
||||
rmActionService.executeRecordsManagementAction(result, "file");
|
||||
TestUtilities.declareRecord(result, unprotectedNodeService, rmActionService);
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
// Ensure it's devoid of all disposition and review-related state.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(testRecord);
|
||||
assertNull("testRecord had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertTrue("testRecord had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(testRecord);
|
||||
assertEquals("testRecord had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
|
||||
assertNull("testRecord had non-null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// Move from non-vital to vital - also non-dispositionable to dispositionable at the same time.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
nodeService.moveNode(testRecord, dispAndVitalRecordFolder, ContentModel.ASSOC_CONTAINS, ContentModel.ASSOC_CONTAINS);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// Assert that the disposition and review-related data are correct after the move.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(testRecord);
|
||||
assertNotNull("testRecord had null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertFalse("testRecord had empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(testRecord);
|
||||
assertFalse("testRecord had wrong review period.", "0".equals(vitalRecordDefinition.getReviewPeriod().getExpression()));
|
||||
assertNotNull("testRecord had null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// Move the test record back from vital to non-vital - also dispositionable to non-dispositionable at the same time.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
nodeService.moveNode(testRecord, cleanRecordFolder, ContentModel.ASSOC_CONTAINS, ContentModel.ASSOC_CONTAINS);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// Assert that the disposition and review-related data are correct after the move.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(testRecord);
|
||||
assertNull("testRecord had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertTrue("testRecord had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(testRecord);
|
||||
assertEquals("testRecord had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
|
||||
assertNull("testRecord had non-null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
//TODO check the search aspect
|
||||
|
||||
// Tidy up.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
nodeService.deleteNode(testRecord);
|
||||
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void testCopyRecordWithinFileplan()
|
||||
{
|
||||
setComplete();
|
||||
endTransaction();
|
||||
|
||||
// We need record folders for test-filing as follows:
|
||||
// 1. A 'clean' record folder with no disposition schedule and no review period.
|
||||
// 2. A 'vital' record folder which has a review period defined.
|
||||
// 3. A 'dispositionable' record folder which has an applicable disposition schedule.
|
||||
//
|
||||
// The example fileplan includes a folder which covers [2] and [3] together.
|
||||
|
||||
final NodeRef cleanRecordFolder = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
NodeRef result = TestUtilities.getRecordFolder(rmService, nodeService, "Civilian Files", "Case Files and Papers", "Gilbert Competency Hearing");
|
||||
assertNotNull("cleanRecordFolder was null", result);
|
||||
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(result);
|
||||
assertNull("cleanRecordFolder had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertTrue("cleanRecordFolder had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(result);
|
||||
assertEquals("cleanRecordFolder had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
|
||||
assertNull("cleanRecordFolder had non-null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return result;
|
||||
}
|
||||
});
|
||||
final NodeRef dispAndVitalRecordFolder = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
NodeRef result = TestUtilities.getRecordFolder(rmService, nodeService, "Reports", "AIS Audit Records", "January AIS Audit Records");
|
||||
assertNotNull("dispositionAndVitalRecordFolder was null", result);
|
||||
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(result);
|
||||
assertNotNull("dispositionAndVitalRecordFolder had null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertFalse("dispositionAndVitalRecordFolder had empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(result);
|
||||
assertFalse("dispositionAndVitalRecordFolder had wrong review period.", "none|0".equals(vitalRecordDefinition.getReviewPeriod().getExpression()));
|
||||
assertNotNull("dispositionAndVitalRecordFolder had null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
// Create a record in the 'clean' folder.
|
||||
final NodeRef testRecord = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
final NodeRef result = nodeService.createNode(cleanRecordFolder, ContentModel.ASSOC_CONTAINS,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
|
||||
"Record" + System.currentTimeMillis() + ".txt"),
|
||||
ContentModel.TYPE_CONTENT).getChildRef();
|
||||
|
||||
rmActionService.executeRecordsManagementAction(result, "file");
|
||||
TestUtilities.declareRecord(result, unprotectedNodeService, rmActionService);
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
// Ensure it's devoid of all disposition and review-related state.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(testRecord);
|
||||
assertNull("testRecord had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertTrue("testRecord had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(testRecord);
|
||||
assertEquals("testRecord had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
|
||||
assertNull("testRecord had non-null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// Copy from non-vital to vital - also non-dispositionable to dispositionable at the same time.
|
||||
final NodeRef copiedNode = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
FileInfo fileInfo = fileFolderService.copy(testRecord, dispAndVitalRecordFolder, null);
|
||||
NodeRef n = fileInfo.getNodeRef();
|
||||
return n;
|
||||
}
|
||||
});
|
||||
|
||||
// Assert that the disposition and review-related data are correct after the copy.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(copiedNode);
|
||||
assertNotNull("copiedNode had null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertFalse("copiedNode had empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(copiedNode);
|
||||
assertFalse("copiedNode had wrong review period.", "0".equals(vitalRecordDefinition.getReviewPeriod().getExpression()));
|
||||
assertNotNull("copiedNode had null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// Create a record in the 'vital and disposition' folder.
|
||||
final NodeRef testRecord2 = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
final NodeRef result = nodeService.createNode(dispAndVitalRecordFolder, ContentModel.ASSOC_CONTAINS,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
|
||||
"Record2" + System.currentTimeMillis() + ".txt"),
|
||||
ContentModel.TYPE_CONTENT).getChildRef();
|
||||
|
||||
rmActionService.executeRecordsManagementAction(result, "file");
|
||||
TestUtilities.declareRecord(result, unprotectedNodeService, rmActionService);
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
// Check the vital and disposition status.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(testRecord2);
|
||||
assertNotNull("testRecord2 had null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertFalse("testRecord2 had empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(testRecord2);
|
||||
assertFalse("testRecord2 had wrong review period.", "0".equals(vitalRecordDefinition.getReviewPeriod().getExpression()));
|
||||
assertNotNull("testRecord2 had null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// copy the record back from vital to non-vital - also dispositionable to non-dispositionable at the same time.
|
||||
final NodeRef copiedBackNode = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
|
||||
{
|
||||
public NodeRef execute() throws Throwable
|
||||
{
|
||||
FileInfo fileInfo = fileFolderService.copy(testRecord2, cleanRecordFolder, null); // TODO Something wrong here.
|
||||
NodeRef n = fileInfo.getNodeRef();
|
||||
return n;
|
||||
}
|
||||
});
|
||||
|
||||
// Assert that the disposition and review-related data are correct after the copy-back.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(copiedBackNode);
|
||||
assertNull("copiedBackNode had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
|
||||
assertTrue("copiedBackNode had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
|
||||
|
||||
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(copiedBackNode);
|
||||
assertEquals("copiedBackNode had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
|
||||
assertNull("copiedBackNode had non-null review date.", vitalRecordDefinition.getNextReviewDate());
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
//TODO check the search aspect
|
||||
|
||||
// Tidy up.
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
nodeService.deleteNode(copiedBackNode);
|
||||
nodeService.deleteNode(testRecord2);
|
||||
nodeService.deleteNode(copiedNode);
|
||||
nodeService.deleteNode(testRecord);
|
||||
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void xxxtestUpdateNextDispositionAction()
|
||||
{
|
||||
setComplete();
|
||||
endTransaction();
|
||||
|
||||
final FileAction fileAction = (FileAction)applicationContext.getBean("file");
|
||||
|
||||
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
|
||||
{
|
||||
public Void execute() throws Throwable
|
||||
{
|
||||
// Get a record folder
|
||||
NodeRef folderRecord = TestUtilities.getRecordFolder(rmService, nodeService, "Reports", "AIS Audit Records", "January AIS Audit Records");
|
||||
assertNotNull(folderRecord);
|
||||
assertEquals("January AIS Audit Records", nodeService.getProperty(folderRecord, ContentModel.PROP_NAME));
|
||||
|
||||
DispositionSchedule di = dispositionService.getDispositionSchedule(folderRecord);
|
||||
assertNotNull(di);
|
||||
assertEquals("N1-218-00-4 item 023", di.getDispositionAuthority());
|
||||
assertEquals("Cut off monthly, hold 1 month, then destroy.", di.getDispositionInstructions());
|
||||
assertFalse(di.isRecordLevelDisposition());
|
||||
|
||||
assertFalse(nodeService.hasAspect(folderRecord, ASPECT_DISPOSITION_LIFECYCLE));
|
||||
|
||||
fileAction.updateNextDispositionAction(folderRecord);
|
||||
|
||||
|
||||
// Check the next disposition action
|
||||
assertTrue(nodeService.hasAspect(folderRecord, ASPECT_DISPOSITION_LIFECYCLE));
|
||||
NodeRef ndNodeRef = nodeService.getChildAssocs(folderRecord, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL).get(0).getChildRef();
|
||||
assertNotNull(ndNodeRef);
|
||||
assertEquals("cutoff", nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_ACTION));
|
||||
assertEquals(di.getDispositionActionDefinitions().get(0).getId(), nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_ACTION_ID));
|
||||
assertNotNull(nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_AS_OF));
|
||||
|
||||
// Check the history is empty
|
||||
// TODO
|
||||
|
||||
Map<QName, Serializable> props = new HashMap<QName, Serializable>(1);
|
||||
props.put(PROP_CUT_OFF_DATE, new Date());
|
||||
unprotectedNodeService.addAspect(folderRecord, ASPECT_CUT_OFF, props);
|
||||
fileAction.updateNextDispositionAction(folderRecord);
|
||||
|
||||
assertTrue(nodeService.hasAspect(folderRecord, ASPECT_DISPOSITION_LIFECYCLE));
|
||||
ndNodeRef = nodeService.getChildAssocs(folderRecord, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL).get(0).getChildRef();
|
||||
assertNotNull(ndNodeRef);
|
||||
assertEquals("destroy", nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_ACTION));
|
||||
assertEquals(di.getDispositionActionDefinitions().get(1).getId(), nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_ACTION_ID));
|
||||
assertNotNull(nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_AS_OF));
|
||||
|
||||
// Check the history has an action
|
||||
// TODO
|
||||
|
||||
fileAction.updateNextDispositionAction(folderRecord);
|
||||
|
||||
assertTrue(nodeService.hasAspect(folderRecord, ASPECT_DISPOSITION_LIFECYCLE));
|
||||
assertTrue(nodeService.getChildAssocs(folderRecord, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL).isEmpty());
|
||||
|
||||
// Check the history has both actions
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@@ -33,7 +33,7 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService
|
||||
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.RmSiteType;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RmSiteType;
|
||||
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService;
|
||||
@@ -43,6 +43,7 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||
import org.alfresco.service.cmr.model.FileFolderService;
|
||||
import org.alfresco.service.cmr.repository.ContentService;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
@@ -50,6 +51,7 @@ import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.service.cmr.search.SearchService;
|
||||
import org.alfresco.service.cmr.security.AuthorityService;
|
||||
import org.alfresco.service.cmr.security.MutableAuthenticationService;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
import org.alfresco.service.cmr.security.PersonService;
|
||||
import org.alfresco.service.cmr.site.SiteInfo;
|
||||
import org.alfresco.service.cmr.site.SiteService;
|
||||
@@ -104,6 +106,8 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase
|
||||
protected AuthorityService authorityService;
|
||||
protected PersonService personService;
|
||||
protected TransactionService transactionService;
|
||||
protected FileFolderService fileFolderService;
|
||||
protected PermissionService permissionService;
|
||||
|
||||
/** RM Services */
|
||||
protected RecordsManagementService rmService;
|
||||
@@ -261,6 +265,8 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase
|
||||
authenticationService = (MutableAuthenticationService)this.applicationContext.getBean("AuthenticationService");
|
||||
personService = (PersonService)this.applicationContext.getBean("PersonService");
|
||||
transactionService = (TransactionService)applicationContext.getBean("TransactionService");
|
||||
fileFolderService = (FileFolderService)applicationContext.getBean("FileFolderService");
|
||||
permissionService = (PermissionService)applicationContext.getBean("PermissionService");
|
||||
|
||||
// Get RM services
|
||||
rmService = (RecordsManagementService)applicationContext.getBean("RecordsManagementService");
|
||||
@@ -325,16 +331,15 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase
|
||||
*/
|
||||
protected void setupTestData()
|
||||
{
|
||||
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Object>()
|
||||
doTestInTransaction(new Test<Void>()
|
||||
{
|
||||
@Override
|
||||
public Object execute() throws Throwable
|
||||
public Void run()
|
||||
{
|
||||
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
|
||||
setupTestDataImpl();
|
||||
return null;
|
||||
setupTestDataImpl();
|
||||
return null;
|
||||
}
|
||||
});
|
||||
},
|
||||
AuthenticationUtil.getSystemUserName());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -1,5 +1,20 @@
|
||||
/**
|
||||
*
|
||||
/*
|
||||
* Copyright (C) 2005-2012 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.test.util;
|
||||
|
||||
@@ -17,7 +32,7 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedul
|
||||
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.RmSiteType;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RmSiteType;
|
||||
import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordService;
|
||||
|
@@ -35,7 +35,7 @@ import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementSearchBehaviour;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordsManagementSearchBehaviour;
|
||||
import org.alfresco.module.org_alfresco_module_rm.script.BootstrapTestDataGet;
|
||||
import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
|
Reference in New Issue
Block a user