/*
* #%L
* Alfresco Records Management Module
* %%
* Copyright (C) 2005 - 2016 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* -
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
* -
* 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/>.
* #L%
*/
package org.alfresco.module.org_alfresco_module_rm.test.system;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
import org.alfresco.module.org_alfresco_module_rm.test.util.CommonRMTestUtils;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.security.MutableAuthenticationService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteRole;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.ApplicationContextHelper;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.extensions.webscripts.GUID;
public class DataLoadSystemTest
{
/** services */
protected FilePlanService filePlanService;
protected RecordFolderService recordFolderService;
protected RecordService recordService;
protected TransactionService transactionService;
protected AuthorityService authorityService;
protected MutableAuthenticationService authenticationService;
protected PersonService personService;
protected FilePlanRoleService filePlanRoleService;
protected SiteService siteService;
protected FileFolderService fileFolderService;
/** config locations */
protected String[] getConfigLocations()
{
return new String[]
{
"classpath:alfresco/application-context.xml",
"classpath:test-context.xml"
};
}
/** transaction batch size */
private static final int BATCH_SIZE = 100;
/** file plan sizing */
private static final int ROOT_CATEGORY_COUNT = 0;
private static final int RECORD_FOLDER_COUNT = 0;
private static final int RECORD_COUNT = 0;
/** rm user sizing */
private static final int RM_GROUP_COUNT = 0;
private static final int RM_USER_COUNT = 0;
/** inplace sizing */
private static final int USER_COUNT = 0;
private static final int INPLACE_RECORD_COUNT = 5000;
/** application context */
private ApplicationContext applicationContext;
CommonRMTestUtils utils;
private int totalCount;
private List<NodeRef> recordCategories;
private List<NodeRef> recordFolders;
private List<String> groups;
@Before
public void before()
{
applicationContext = ApplicationContextHelper.getApplicationContext(getConfigLocations());
utils = new CommonRMTestUtils(applicationContext);
filePlanService = (FilePlanService)applicationContext.getBean("FilePlanService");
recordFolderService = (RecordFolderService)applicationContext.getBean("RecordFolderService");
recordService = (RecordService)applicationContext.getBean("RecordService");
transactionService = (TransactionService)applicationContext.getBean("transactionService");
authorityService = (AuthorityService)applicationContext.getBean("authorityService");
authenticationService = (MutableAuthenticationService)applicationContext.getBean("AuthenticationService");
personService = (PersonService)applicationContext.getBean("personService");
filePlanRoleService = (FilePlanRoleService)applicationContext.getBean("filePlanRoleService");
siteService = (SiteService)applicationContext.getBean("siteService");
fileFolderService = (FileFolderService)applicationContext.getBean("fileFolderService");
}
@Test
public void loadAllData()
{
loadFilePlanData();
loadRMUsersAndGroups();
loadInPlace();
}
private void loadInPlace()
{
AuthenticationUtil.runAs(new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
final SiteInfo site = siteService.getSite("test");
if (site == null)
{
throw new AlfrescoRuntimeException("The collab site test is not present.");
}
final NodeRef filePlan = filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID);
if (filePlan == null)
{
Assert.fail("The default RM site is not present.");
}
// create users and add to site
repeatInTransactionBatches(new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
// create user
String userName = GUID.generate();
System.out.println("Creating user " + userName);
createPerson(userName, true);
// add to collab site
siteService.setMembership("test", userName, SiteRole.SiteCollaborator.toString());
return null;
}
}, USER_COUNT);
// create content and declare as record
repeatInTransactionBatches(new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
// create document
NodeRef docLib = siteService.getContainer(site.getShortName(), SiteService.DOCUMENT_LIBRARY);
NodeRef document = fileFolderService.create(docLib, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef();
recordService.createRecord(filePlan, document);
return null;
}
}, INPLACE_RECORD_COUNT);
return null;
}
}, AuthenticationUtil.getAdminUserName());
}
private void loadRMUsersAndGroups()
{
AuthenticationUtil.runAsSystem(new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
final NodeRef filePlan = filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID);
if (filePlan == null)
{
Assert.fail("The default RM site is not present.");
}
groups = new ArrayList<String>();
repeatInTransactionBatches(new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
String groupName = GUID.generate();
System.out.println("Creating group " + groupName);
groups.add("GROUP_" + authorityService.createAuthority(AuthorityType.GROUP, groupName));
filePlanRoleService.assignRoleToAuthority(filePlan, FilePlanRoleService.ROLE_RECORDS_MANAGER, groupName);
return null;
}
}, RM_GROUP_COUNT);
for (final String group : groups)
{
repeatInTransactionBatches(new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
String userName = GUID.generate();
System.out.println("Creating user " + userName + " and adding to group " + group);
createPerson(userName, true);
authorityService.addAuthority(group, userName);
return null;
}
}, RM_USER_COUNT);
}
return null;
}
});
}
private void loadFilePlanData()
{
AuthenticationUtil.runAsSystem(new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
final NodeRef filePlan = filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID);
if (filePlan == null)
{
Assert.fail("The default RM site is not present.");
}
// create root categories
recordCategories = new ArrayList<NodeRef>(ROOT_CATEGORY_COUNT);
repeatInTransactionBatches(new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
recordCategories.add(filePlanService.createRecordCategory(filePlan, GUID.generate()));
return null;
}
}, ROOT_CATEGORY_COUNT);
// create record folders
recordFolders = new ArrayList<NodeRef>(RECORD_FOLDER_COUNT);
for (final NodeRef recordCategory : recordCategories)
{
repeatInTransactionBatches(new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
recordFolders.add(recordFolderService.createRecordFolder(recordCategory, GUID.generate()));
return null;
}
}, RECORD_FOLDER_COUNT);
}
// create records
for (final NodeRef recordFolder : recordFolders)
{
repeatInTransactionBatches(new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null);
return null;
}
}, RECORD_COUNT);
}
return null;
}
});
}
private NodeRef createPerson(String userName, boolean createAuth)
{
if (createAuth)
{
authenticationService.createAuthentication(userName, "password".toCharArray());
}
Map<QName, Serializable> properties = new HashMap<QName, Serializable>();
properties.put(ContentModel.PROP_USERNAME, userName);
return personService.createPerson(properties);
}
private void repeatInTransactionBatches(final RunAsWork<Void> work, final int count) throws Exception
{
totalCount = 0;
while (totalCount < count)
{
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
int batchSize = count - totalCount;
if (batchSize >= BATCH_SIZE)
{
batchSize = BATCH_SIZE;
}
for (int i = 0; i < batchSize; i++)
{
// do it
work.doWork();
totalCount++;
}
System.out.println("Created " + totalCount + " of " + count);
return null;
}
},
false, true);
}
}
}