mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-30 18:15:39 +00:00
30342: Dev branch for Site performance issues (including rework of AuthorityService.getAuthorities() to use a 'lazy' set and DM indexing rework) ALF-9899 Huge share site migration, add group to site and user access site related performance issue. ALF-9208 Performance issue, during load tests /share/page/user/user-sites is showing to be the most expensive. ALF-9692 Performance: General performance of Alfresco degrades when there are 1000s of sites present - ancestor-preloading - hasAuthority - huge site test 30370: - Save changed to do with adding childAuthorityCache to AuthorityDAOImpl - Increase aspectsTransactionalCache size as it blows up 30387: Experimental solution to 'cascading reindex' performance problem - Now only Lucene container documents for a single subtree are reprocessed on addition / removal of a secondary child association - No need to delete and re-evaluate ALL the paths to all the nodes in the subtree - just the paths within the subtree - Lucene deltas now store the IDs of ANCESTORs to mask out as well as documents to reindex - Merge handles deletion of these efficiently - Node service cycle checks changed from getPaths to recursive cycleCheck method - Adding a group to 60,000 sites might not require all paths to all sites to be re-evaluated on every change! 30389: Missed files from last checkin 30390: Optimizations / fixes to Alan's test! 30393: Bug fix - wasn't adding new documents into the index! 30397: Fixed a problem with bulk loading trying to bulk load zero parent associations Also tweaked reindex calls 30399: Correction - don't cascade below containers during path cascading 30400: Another optimization - no need to trigger node bulk loading during path cascading - pass false for the preload flag 30404: Further optimizations - On creation of a secondary child association, make a decision on whether it is cheaper to cascade reindex the parent or the child, based on the number of parent associations to the child - Assumes that if there are more than 5 parent associations, it's cheaper to cascade reindex the parent - Add a new authority to a zone (containing 60,000 authorities) - cascade reindex the authority, not the zone - Add a group (in 60,000 sites) to a site - cascade reindex the site, not the group - Caching of child associations already traversed during cascade reindexing - Site creation time much reduced! 30407: Logic fix: Use 'delete only nodes' behaviour on DM index filtering and merging, now we are managing container deletions separately 30408: Small correction related to last change. 30409: Correction to deletion reindex behaviour (no need to regenerate masked out containers) - Site CRUD operations now all sub-second with 60,000 sites! 30410: Stop the heartbeat from trying to load and count all site groups - Too expensive, as we might have 60,000 sites, each with 4 groups - Now just counts the groups in the default zone (the UI visible ones) 30411: Increased lucene parameters to allow for 'path explosion' - 9 million lucene documents in my index after creating 60,000 Share sites (most of them probably paths) resulting in sluggish index write performance - Set lucene.indexer.mergerTargetIndexCount=8 (142 documents in smallest index) - Increased lucene.indexer.maxDocsForInMemoryMerge, lucene.indexer.maxDocsForInMemoryIndex 30412: Test fixes 30413: Revert 'parent association batch loading' changes (as it was a bad idea and is no longer necessary!) - Retain a few caching bug fixes however 30416: Moved UserAuthoritySet (lazy load authority set) from PermissionServiceImpl to AuthorityServiceImpl 30418: - Remove 'new' hasAuthority from authorityService so it is back to where we started. - SiteServiceHugeTest minor changes 30421: Prevent creation of a duplicate root node on updating the root - Use the ANCESTOR field rather than ISCONTAINER to detect a node document, as the root node is both a container and a node! 30447: Pulled new indexing behaviour into ADMLuceneIndexerImpl and restored old behaviour to AVMLuceneIndexerImpl to restore normal AVM behaviour 30448: - Cache in PermissionServiceImpl cleared if an authority container has an association added or removed Supports the generateKey method which includes the username Supports changes in group structures - Moved logic to do with ROLE_GUEST from PermissionServiceImpl to AuthorityServiceImpl 30465: - Tidy up tests in SiteServiceTestHuge 30532: - Added getContainingAuthoritiesInZone to AuthorityService - Dave Changed PeopleService.getContainerGroups to only return groups in the DEFAULT zone - Fixed RM code to use getAuthoritiesForUser method with just the username again. 30558: Build fixes - Fixed cycleCheck to throw a CyclicChildRelationshipException - More tidy up of AVM / ADM indexer split - Properly control when path generation is cascaded (not required on a full reindex or a tracker transaction) - Support indexing of a 'fake root' parent. Ouch my head hurts! 30588: Build fixes - StringIndexOutOfBoundsException in NodeMonitor - Corrections to 'node only' delete behaviour - Use the PATH field to detect non-leaf nodes (it's the only stored field with which we can recognize the root) - Moved DOD5015Test.testVitalRecords() to the end - the only way I could work out how to get the full TestCase to run 30600: More build fixes - Broadcast ALL node deletions to indexer (even those from cascade deletion of primary associations) - Allows indexer to wipe out all affected documents from the delta even if some have already been flushed under different parents by an intricate DOD unit test! - Pause FTS in DOD5015Test to prevent intermittent test failures (FTS can temporarily leave deleted documents in the index until it catches up) - More tidy up of ADMLuceneIndexerImpl - flushPending optimized and some unnecessary member variables removed - correction to cascade deletion behaviour (leave behind containers of unaffected secondary references) - unused MOVE action removed - further legacy logic moved into AVMLuceneIndexerImpl 30620: More build fixes - Cope with a node morphing from a 'leaf' to a container during its lifetime - Container documents now created lazily in index as and when necessary - Blank out 'nth sibling' field of synthesized paths - ADMLuceneTest now passes! - TaggingServiceImplTest also passes - more special treatment for categories 30627: Multi tenancy fixes 30629: Possible build fix - retrying transaction in ReplicationServiceIntegrationTest.tearDown() 30632: Build fix - lazy container generation after a move 30636: Build fix: authority comparisons are case sensitive, even when that authority corresponds to a user (PermissionServiceTest.testPermissionCase()) 30638: Run SiteServiceTestHuge form a cmd line set SITE_CPATH=%TOMCAT_HOME%/lib/*;%TOMCAT_HOME%/endorsed/*;%TOMCAT_HOME%/webapps/alfresco/WEB-INF/lib/*;\ %TOMCAT_HOME%/webapps/alfresco/WEB-INF/classes;%TOMCAT_HOME%/shared/classes; java -Xmx2048m -XX:MaxPermSize=512M -classpath %SITE_CPATH% org.alfresco.repo.site.SiteServiceTestHuge ... Usage: -Daction=usersOnly -Dfrom=<fromSiteId> -Dto=<toSiteId> -Dfrom=<fromSiteId> -Dto=<toSiteId> -Daction=sites -Drestart=<restartAtSiteId> -Dfrom=<fromSiteId> -Dto=<toSiteId> -Daction=groups -Drestart=<restartAtSiteId> 30639: Minor changes to commented out command line code for SiteServiceTestHuge 30643: Round of improvements to MySites dashlet relating to huge DB testing: - 10,000 site database, user is a member of ~2000 sites - Improvements to site.lib.ftl and related SiteService methods - To return MySites dashlet for the user, order of magnitude improvement from 7562ms to 618ms in the profiler (now ~350ms in the browser) 30644: Fixed performance regression - too much opening and closing of the delta reader and writer 30661: More reader opening / closing 30668: Performance improvements to Site Finder and My Sites in user profile page. - faster to bring back lists and site memberships (used by the Site Finder) - related further improvements to APIs used by this and My Sites on dashboard 30713: Configuration for MySites dashlet maximum list size 30725: Merged V3.4-BUG-FIX to DEV/ALAN/SITE_PERF 30708: ALF-10040: Added missing ReferenceCountingReadOnlyIndexReaderFactory wrapper to IndexInfo.getMainIndexReferenceCountingReadOnlyIndexReader() to make it consistent with IndexInfo.getMainIndexReferenceCountingReadOnlyIndexReader(String, Set<String>, boolean) and allow SingleFieldSelectors to make it through from LeafScorer to the path caches! Affects ALL Lucene queries that run OUTSIDE of a transaction. 30729: Use getAuthoritiesForUser rather than getContainingAuthorities if possible. SiteServiceTestHuge: command line version 30733: Performance improves to user dashboard relating to User Calendar - converted web-tier calendar dashlet to Ajax client-side rendering - faster user experience and also less load on the web-tier - improvements to query from Andy - maximum sites/list size to query now configurable (default 100 instead of previously 1000) 30743: Restore site CRUD performance from cold caches - Introduced NodeService.getAllRootNodes(), returning all nodes in a store with the root aspect, backed by a transactional cache and invalidated at key points - Means indexing doesn't have to load all parent nodes just to check for 'fake roots' - Site CRUD performance now back to sub-second with 60,000 nodes 30747: Improvement to previous checkin - prevent cross cluster invalidation of every store root when a single store drops out of the cache 30748: User dashboard finally loading within seconds with 60,000 sites, 60 groups, 100 users (thanks mostly to Kev's UI changes) - post-process IBatis mapped statements with MySQL dialect to apply fetchSize=Integer.MIN_VALUE to all _Limited statements - Means we can stream first 10,000 site groups without the MySQL JDBC driver reading all 240,000 into memory - New NodeService getChildAssocs method with a maxResults argument (makes use of the above) - Perfected getContainingAuthoritiesInZone implementation, adding a cutoff parameter, allowing only the first 1000 site memberships to be returned quickly and caches to be warmed for ACL evaluations - New cache of first 10,000 groups in APP.SHARE zone - Cache sizes tuned for 60,000 site scenario - Site service warms caches on bootstrap - PreferencesService applies ASPECT_IGNORE_INHERITED_RULES to person node to prevent the rule service trying to crawl the group hierarchy on a preference save - WorkflowServiceImpl.getPooledTasks only looks in APP.DEFAULT zone (thus avoiding site group noise) 30749: Fix compilation errors 30761: Minor change to SiteServiceTestHuge 30762: Derek code review: Reworked fetchSize specification for select_ChildAssocsOfParent_Limited statement for MySQL - Now fetchSize stated explicitly in a MySQL specific config file resolved by the HierarchicalResourceLoader - No need for any Java-based post processing 30763: Build fix: don't add a user into its own authorities (until specifically asked to) 30767: Build fix - IBatis / MySQL needs a streaming result statement to be run in an isolation transaction (because it doesn't release PreparedStatements until the end) 30771: Backed out previous change which was fundamentally flawed - Resolved underlying problem which was that the select_ChildAssocsOfParent_Limited SQL string needs to be unique in order to not cause confusion in the prepared statement cache 30772: Backed out previous change which was fundamentally flawed - Resolved underlying problem which was that the select_ChildAssocsOfParent_Limited SQL string needs to be unique in order to not cause confusion in the prepared statement cache git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@30797 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
1109 lines
40 KiB
Java
1109 lines
40 KiB
Java
/*
|
|
* 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.repo.site;
|
|
|
|
import static org.junit.Assert.fail;
|
|
|
|
import java.io.File;
|
|
import java.io.PrintStream;
|
|
import java.util.Set;
|
|
|
|
import javax.transaction.SystemException;
|
|
import javax.transaction.UserTransaction;
|
|
|
|
import org.alfresco.model.ContentModel;
|
|
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
|
import org.alfresco.service.cmr.repository.DuplicateChildNodeNameException;
|
|
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.SiteService;
|
|
import org.alfresco.service.cmr.site.SiteVisibility;
|
|
import org.alfresco.service.transaction.TransactionService;
|
|
import org.alfresco.util.ApplicationContextHelper;
|
|
import org.alfresco.util.PropertyMap;
|
|
import org.junit.After;
|
|
import org.junit.AfterClass;
|
|
import org.junit.Before;
|
|
import org.junit.BeforeClass;
|
|
import org.junit.Test;
|
|
import org.springframework.context.ApplicationContext;
|
|
|
|
/**
|
|
* Site service unit test that targets HUGE numbers of sites
|
|
*
|
|
* @author Alan Davis
|
|
*/
|
|
public class SiteServiceTestHuge
|
|
{
|
|
private enum Allocation
|
|
{
|
|
/**
|
|
* Allocate source (groups) to target (sites) on a round robin basis
|
|
* until all targets (sites) have been allocated a single source (group).
|
|
*
|
|
* Some source (groups) might have been allocated to more than one target
|
|
* (site) or none at all.
|
|
**/
|
|
ROUND_ROBIN_TO_TARGET,
|
|
|
|
/**
|
|
* Allocate source (users) to target (groups) on a round robin basis
|
|
* until all source (users) have been allocated a target (group).
|
|
*
|
|
* Some target (groups) might have been allocated to more than one source
|
|
* (user) or none at all.
|
|
**/
|
|
ROUND_ROBIN_FROM_SOURCE,
|
|
|
|
/**
|
|
* Allocate source (users) to target (groups) on a round robin basis
|
|
* until all source (users) AND all target (groups) have been allocated
|
|
* to at least one a target (group) or one source (user).
|
|
*
|
|
* If there are more target (groups) than source (users)
|
|
* then some source (users) will be in more than one target (group).
|
|
*
|
|
* If there are more source (users) than target (groups) then some
|
|
* target (groups) will contain more than one source (user).
|
|
**/
|
|
ROUND_ROBIN_BOTH,
|
|
|
|
/**
|
|
* Allocate all source (users) to each target (group).
|
|
* OR
|
|
* Allocate all source (users) to each target (site).
|
|
* OR
|
|
* Allocate all source (groups) to each target (site).
|
|
**/
|
|
ALL_TO_EACH,
|
|
|
|
/** No allocation **/
|
|
NONE
|
|
}
|
|
|
|
private enum OnFailure
|
|
{
|
|
GIVE_UP,
|
|
KEEP_GOING
|
|
}
|
|
|
|
// Standard numbers of users, groups and sites
|
|
private static final int NUM_USERS = 100;
|
|
private static final int NUM_GROUPS = 60;
|
|
private static int NUM_SITES = 60000;
|
|
|
|
private static final String ADMIN_USER = "admin";
|
|
|
|
// Max times in ms for various activities
|
|
private static final long SECOND = 1000;
|
|
private static final long FIVE_SECONDS = SECOND * 5;
|
|
|
|
private static final long MAX_CREATE_USER_MS = FIVE_SECONDS;
|
|
private static final long MAX_CREATE_GROUP_MS = FIVE_SECONDS;
|
|
private static final long MAX_CREATE_SITE_MS = FIVE_SECONDS;
|
|
|
|
private static final long MAX_DELETE_USER_MS = FIVE_SECONDS;
|
|
private static final long MAX_DELETE_GROUP_MS = FIVE_SECONDS;
|
|
private static final long MAX_DELETE_SITE_MS = FIVE_SECONDS;
|
|
|
|
private static final long MAX_USER_TO_GROUP_MS = FIVE_SECONDS;
|
|
private static final long MAX_USER_TO_SITE_MS = FIVE_SECONDS;
|
|
private static final long MAX_GROUP_TO_SITE_MS = FIVE_SECONDS;
|
|
|
|
// Used to save having to check if users, groups and sites exist if already created by this test.
|
|
private static int usersCreated = 0;
|
|
private static int groupsCreated = 0;
|
|
private static int sitesCreated = 0;
|
|
|
|
private static ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();
|
|
private static TransactionService transactionService = (TransactionService)ctx.getBean("TransactionService");
|
|
private static AuthenticationComponent authenticationComponent = (AuthenticationComponent)ctx.getBean("authenticationComponent");
|
|
private static MutableAuthenticationService authenticationService = (MutableAuthenticationService)ctx.getBean("authenticationService");
|
|
private static PersonService personService = (PersonService)ctx.getBean("PersonService");
|
|
private static AuthorityService authorityService = (AuthorityService)ctx.getBean("AuthorityService");
|
|
private static SiteService siteService = (SiteService)ctx.getBean("SiteService"); // Big 'S'
|
|
|
|
private static String logFilename;
|
|
private static PrintStream log;
|
|
|
|
@BeforeClass
|
|
public static void setUpBeforeClass() throws Exception
|
|
{
|
|
logFilename = "sites.log";
|
|
}
|
|
|
|
@AfterClass
|
|
public static void tearDownClass()
|
|
{
|
|
if (log != null)
|
|
{
|
|
log.close();
|
|
}
|
|
}
|
|
|
|
@Before
|
|
public void setUp() throws Exception
|
|
{
|
|
authenticationComponent.setCurrentUser(AuthenticationUtil.getAdminUserName());
|
|
}
|
|
|
|
@After
|
|
public void tearDown() throws Exception
|
|
{
|
|
authenticationComponent.clearCurrentSecurityContext();
|
|
}
|
|
|
|
private void log(String msg) throws Exception
|
|
{
|
|
System.out.println(msg);
|
|
if (logFilename != null)
|
|
{
|
|
if (log == null)
|
|
{
|
|
log = new PrintStream(new File(logFilename));
|
|
}
|
|
log.println(msg);
|
|
}
|
|
}
|
|
|
|
// ------------------ main test helper methods --------------------
|
|
|
|
private void createAndAllocate(int userCount, int groupCount, int siteCount,
|
|
Allocation usersToGroups, Allocation usersToSites, Allocation groupsToSites)
|
|
throws Exception
|
|
{
|
|
createUsersGroupsAndSites(userCount, groupCount, siteCount);
|
|
allocateUsersToGroupsAndSites(userCount, groupCount, siteCount, usersToGroups,
|
|
usersToSites, groupsToSites);
|
|
}
|
|
|
|
private void createUsersGroupsAndSites(int userCount, int groupCount, int siteCount)
|
|
throws Exception
|
|
{
|
|
createUsers(userCount);
|
|
createGroups(groupCount);
|
|
createSites(siteCount, userCount, 0, OnFailure.GIVE_UP);
|
|
}
|
|
|
|
private void allocateUsersToGroupsAndSites(int userCount, int groupCount, int siteCount,
|
|
Allocation usersToGroups, Allocation usersToSites, Allocation groupsToSites)
|
|
throws Exception
|
|
{
|
|
if ((usersToGroups == Allocation.ALL_TO_EACH &&
|
|
usersToSites == Allocation.NONE &&
|
|
groupsToSites == Allocation.ROUND_ROBIN_TO_TARGET)
|
|
||
|
|
(usersToGroups == Allocation.NONE &&
|
|
usersToSites == Allocation.ALL_TO_EACH &&
|
|
groupsToSites == Allocation.NONE))
|
|
{
|
|
allocateUsersToGroups(userCount, groupCount, usersToGroups);
|
|
allocateUsersToSites(userCount, siteCount, usersToSites);
|
|
allocateGroupsToSites(groupCount, siteCount, groupsToSites, userCount, 0, OnFailure.GIVE_UP);
|
|
}
|
|
else
|
|
{
|
|
fail("Users are not able to see all sites or can see a site directly and via a group");
|
|
}
|
|
}
|
|
|
|
private void addMoreSites(int sitesToAdd, OnFailure onFailureAction) throws Exception
|
|
{
|
|
log("\n\n ADD "+sitesToAdd+" MORE SITES AND ADD A GROUP TO EACH");
|
|
Allocation groupsToSites = Allocation.ROUND_ROBIN_TO_TARGET;
|
|
int sitesAlreadyCreated = sitesCreated;
|
|
int siteCount = sitesAlreadyCreated + sitesToAdd;
|
|
|
|
long ms = System.currentTimeMillis();
|
|
createSites(siteCount, NUM_USERS, sitesAlreadyCreated, OnFailure.GIVE_UP);
|
|
allocateGroupsToSites(NUM_GROUPS, siteCount, groupsToSites, NUM_USERS, sitesAlreadyCreated, OnFailure.KEEP_GOING);
|
|
assertTime("Add more sites", sitesAlreadyCreated+1, sitesToAdd, ms, MAX_CREATE_SITE_MS+MAX_GROUP_TO_SITE_MS, onFailureAction, sitesToAdd);
|
|
}
|
|
|
|
private void assertTime(String what, int id1, int id2, long start, long max) throws Exception
|
|
{
|
|
assertTime(what, id1, id2, start, max, OnFailure.GIVE_UP, 1);
|
|
}
|
|
|
|
private void assertTime(String what, int id1, int id2, long start, long max, OnFailure onFailureAction, int blockSize) throws Exception
|
|
{
|
|
long ms = (System.currentTimeMillis() - start)/blockSize;
|
|
|
|
String msg = what+","+id1+(id2 > 0 ? ","+id2 : "")+","+ms+",ms"+((blockSize == 1) ? "" : " average for,"+blockSize);
|
|
log(msg);
|
|
if (ms > max && onFailureAction == OnFailure.GIVE_UP)
|
|
{
|
|
fail(msg+" is longer than "+max);
|
|
}
|
|
}
|
|
|
|
// ------------------ create N --------------------
|
|
|
|
// Creates users and removes extra ones
|
|
private void createUsers(int userCount) throws Exception
|
|
{
|
|
for (int userId=1; ; userId++)
|
|
{
|
|
String userName = getUserName(userId);
|
|
boolean exists = (userId <= usersCreated) || personService.personExists(userName);
|
|
|
|
if (userId <= userCount)
|
|
{
|
|
if (!exists)
|
|
{
|
|
long ms = System.currentTimeMillis();
|
|
createUser(userName);
|
|
assertTime("Create user", userId, -1, ms, MAX_CREATE_USER_MS);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!exists)
|
|
{
|
|
break;
|
|
}
|
|
long ms = System.currentTimeMillis();
|
|
deleteUser(userName);
|
|
assertTime("Delete user", userId, -1, ms, MAX_DELETE_USER_MS);
|
|
}
|
|
}
|
|
usersCreated = userCount;
|
|
}
|
|
|
|
// Creates groups and removes extra ones
|
|
private void createGroups(int groupCount) throws Exception
|
|
{
|
|
for (int groupId=1; ; groupId++)
|
|
{
|
|
String groupName = getGroupName(groupId);
|
|
String groupAuthorityName = authorityService.getName(AuthorityType.GROUP, groupName);
|
|
boolean exists = (groupId <= groupsCreated) || authorityService.authorityExists(groupAuthorityName);
|
|
|
|
if (groupId <= groupCount)
|
|
{
|
|
if (!exists)
|
|
{
|
|
long ms = System.currentTimeMillis();
|
|
createGroup(groupName);
|
|
assertTime("Create group", groupId, -1, ms, MAX_CREATE_GROUP_MS);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!exists)
|
|
{
|
|
break;
|
|
}
|
|
long ms = System.currentTimeMillis();
|
|
deleteGroup(groupName);
|
|
assertTime("Delete group", groupId, -1, ms, MAX_DELETE_GROUP_MS);
|
|
}
|
|
}
|
|
groupsCreated = groupCount;
|
|
}
|
|
|
|
// Creates sites and removes extra ones
|
|
private void createSites(int siteCount, int userCount, int sitesAlreadyCreated, OnFailure onFailureAction) throws Exception
|
|
{
|
|
for (int siteId=sitesAlreadyCreated+1; ; siteId++)
|
|
{
|
|
String siteName = getSiteName(siteId);
|
|
boolean exists = (siteId <= sitesCreated) || siteService.getSite(siteName) != null;
|
|
|
|
if (siteId <= siteCount)
|
|
{
|
|
if (!exists)
|
|
{
|
|
String siteOwnerUserName = getSiteOwnerUserName(siteId, userCount);
|
|
creatSite(siteId, siteOwnerUserName, onFailureAction);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!exists)
|
|
{
|
|
if (siteId >= siteCount + 1)
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
long ms = System.currentTimeMillis();
|
|
deleteSite(siteName, null);
|
|
assertTime("Delete site", siteId, -1, ms, MAX_DELETE_SITE_MS);
|
|
}
|
|
}
|
|
}
|
|
sitesCreated = siteCount;
|
|
}
|
|
|
|
private void deleteSites(int fromSiteId, int toSiteId, OnFailure onFailureAction) throws Exception
|
|
{
|
|
log("\n\n TIDY UP: DELETE SITES "+fromSiteId+" TO "+toSiteId);
|
|
for (int siteId = fromSiteId; siteId <= toSiteId; siteId++)
|
|
{
|
|
try
|
|
{
|
|
deleteSite(siteId, null, onFailureAction);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
// move on
|
|
}
|
|
}
|
|
sitesCreated = fromSiteId-1;
|
|
}
|
|
|
|
// ------------------ create 1 --------------------
|
|
|
|
private void createUser(String userName) throws Exception
|
|
{
|
|
UserTransaction txn = transactionService.getUserTransaction();
|
|
try
|
|
{
|
|
txn.begin();
|
|
|
|
authenticationService.createAuthentication(userName, userName.toCharArray());
|
|
|
|
PropertyMap ppOne = new PropertyMap(4);
|
|
ppOne.put(ContentModel.PROP_USERNAME, userName);
|
|
ppOne.put(ContentModel.PROP_FIRSTNAME, userName.substring(0, userName.length()-4));
|
|
ppOne.put(ContentModel.PROP_LASTNAME, "user");
|
|
ppOne.put(ContentModel.PROP_EMAIL, userName + "@email.com");
|
|
ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle");
|
|
|
|
personService.createPerson(ppOne);
|
|
|
|
txn.commit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
txn.rollback();
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
private void createGroup(String groupName) throws Exception
|
|
{
|
|
UserTransaction txn = transactionService.getUserTransaction();
|
|
try
|
|
{
|
|
txn.begin();
|
|
|
|
authorityService.createAuthority(AuthorityType.GROUP, groupName);
|
|
|
|
txn.commit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
txn.rollback();
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
private void creatSite(int siteId, String doAsUser, OnFailure onFailureAction) throws Exception
|
|
{
|
|
String siteName = getSiteName(siteId);
|
|
long ms = System.currentTimeMillis();
|
|
creatSite(siteName, doAsUser);
|
|
assertTime("Create site", siteId, -1, ms, MAX_CREATE_SITE_MS, onFailureAction, 1);
|
|
}
|
|
|
|
private void creatSite(String siteName, String doAsUser) throws Exception
|
|
{
|
|
String currentUser = authenticationComponent.getCurrentUserName();
|
|
UserTransaction txn = transactionService.getUserTransaction();
|
|
try
|
|
{
|
|
if (doAsUser != null)
|
|
authenticationComponent.setCurrentUser(doAsUser);
|
|
txn.begin();
|
|
|
|
if (siteService.getSite(siteName) == null)
|
|
{
|
|
String sitePreset = "site-dashboard";
|
|
siteService.createSite(sitePreset, siteName, "Title for " + siteName, "Description for "
|
|
+ siteName, SiteVisibility.PUBLIC);
|
|
|
|
// TODO Should do the following rather than the createContainers - not sure how
|
|
// Map<String, String> tokens = new HashMap<String, String>();
|
|
// tokens.put("siteid", siteName);
|
|
// presetsManager.constructPreset(tokens, tokens);
|
|
siteService.createContainer(siteName, "documentLibrary", ContentModel.TYPE_FOLDER, null);
|
|
siteService.createContainer(siteName, "links", ContentModel.TYPE_FOLDER, null);
|
|
}
|
|
|
|
txn.commit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
try
|
|
{
|
|
txn.rollback();
|
|
}
|
|
catch (Exception e2)
|
|
{
|
|
}
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
authenticationComponent.setCurrentUser(currentUser);
|
|
}
|
|
}
|
|
|
|
// ------------------ delete 1 --------------------
|
|
|
|
private void deleteUser(String userName) throws Exception
|
|
{
|
|
UserTransaction txn = transactionService.getUserTransaction();
|
|
try
|
|
{
|
|
txn.begin();
|
|
|
|
personService.deletePerson(userName);
|
|
|
|
txn.commit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
txn.rollback();
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
private void deleteGroup(String groupName) throws Exception
|
|
{
|
|
UserTransaction txn = transactionService.getUserTransaction();
|
|
try
|
|
{
|
|
txn.begin();
|
|
|
|
String groupAuthorityName = authorityService.getName(AuthorityType.GROUP, groupName);
|
|
authorityService.deleteAuthority(groupAuthorityName, true);
|
|
|
|
txn.commit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
txn.rollback();
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
private void deleteSite(int siteId, String doAsUser, OnFailure onFailureAction) throws Exception
|
|
{
|
|
String siteName = getSiteName(siteId);
|
|
long ms = System.currentTimeMillis();
|
|
deleteSite(siteName, doAsUser);
|
|
assertTime("Delete site", siteId, -1, ms, MAX_DELETE_SITE_MS, onFailureAction, 1);
|
|
}
|
|
|
|
private void deleteSite(String siteName, String doAsUser) throws Exception
|
|
{
|
|
String currentUser = authenticationComponent.getCurrentUserName();
|
|
UserTransaction txn = transactionService.getUserTransaction();
|
|
try
|
|
{
|
|
if (doAsUser != null)
|
|
authenticationComponent.setCurrentUser(doAsUser);
|
|
txn.begin();
|
|
|
|
siteService.deleteSite(siteName);
|
|
|
|
txn.commit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
try
|
|
{
|
|
txn.rollback();
|
|
}
|
|
catch (Exception e2)
|
|
{
|
|
}
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
authenticationComponent.setCurrentUser(currentUser);
|
|
}
|
|
}
|
|
|
|
// ------------------ allocate N --------------------
|
|
|
|
private void allocateUsersToGroups(int userCount, int groupCount, Allocation allocation)
|
|
throws Exception
|
|
{
|
|
if (allocation == Allocation.ALL_TO_EACH)
|
|
{
|
|
for (int userId = 1; userId <= userCount; userId++)
|
|
{
|
|
UserTransaction txn = transactionService.getUserTransaction();
|
|
try
|
|
{
|
|
txn.begin();
|
|
Set<String> existingAuthorities = authorityService.getContainingAuthoritiesInZone(AuthorityType.GROUP,
|
|
getUserName(userId), AuthorityService.ZONE_APP_DEFAULT, null, -1);
|
|
for (int groupId = 1; groupId <= groupCount; groupId++)
|
|
{
|
|
if (!existingAuthorities.contains(authorityService.getName(AuthorityType.GROUP,
|
|
getGroupName(groupId))))
|
|
{
|
|
allocateUserToGroup(userId, groupId);
|
|
}
|
|
}
|
|
txn.commit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
txn.rollback();
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int iterations, groupIncrement;
|
|
if (allocation == Allocation.ROUND_ROBIN_FROM_SOURCE)
|
|
{
|
|
iterations = userCount;
|
|
groupIncrement = 1;
|
|
}
|
|
else
|
|
{
|
|
iterations = groupCount;
|
|
groupIncrement = userCount;
|
|
}
|
|
int i=0;
|
|
OUTER: while (i < iterations)
|
|
{
|
|
for (int userId = 1; userId <= userCount; userId++)
|
|
{
|
|
UserTransaction txn = transactionService.getUserTransaction();
|
|
try
|
|
{
|
|
txn.begin();
|
|
Set<String> existingAuthorities = authorityService.getContainingAuthoritiesInZone(AuthorityType.GROUP,
|
|
getUserName(userId), AuthorityService.ZONE_APP_DEFAULT, null, -1);
|
|
for (int groupId = userId; groupId <= groupCount; groupId += groupIncrement)
|
|
{
|
|
if (!existingAuthorities.contains(authorityService.getName(AuthorityType.GROUP,
|
|
getGroupName(groupId))))
|
|
{
|
|
allocateUserToGroup(userId, groupId);
|
|
}
|
|
if (++i >= iterations)
|
|
{
|
|
txn.commit();
|
|
break OUTER;
|
|
}
|
|
}
|
|
txn.commit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
txn.rollback();
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void allocateUsersToSites(int userCount, int siteCount, Allocation allocation)
|
|
throws Exception
|
|
{
|
|
if (allocation == Allocation.ALL_TO_EACH)
|
|
{
|
|
for (int userId = 1; userId <= userCount; userId++)
|
|
{
|
|
for (int siteId = 1; siteId <= siteCount; siteId++)
|
|
{
|
|
allocateUserToSite(userId, siteId, userCount);
|
|
}
|
|
}
|
|
}
|
|
else if (allocation == Allocation.ROUND_ROBIN_TO_TARGET)
|
|
{
|
|
boolean sourceEnd = (allocation == Allocation.ROUND_ROBIN_TO_TARGET);
|
|
boolean targetEnd = (allocation == Allocation.ROUND_ROBIN_FROM_SOURCE);
|
|
for (int siteId = 1, userId = 1; ; siteId++, userId++)
|
|
{
|
|
if (userId > userCount)
|
|
{
|
|
if (targetEnd)
|
|
break;
|
|
sourceEnd = true;
|
|
userId = 1;
|
|
}
|
|
if (siteId > siteCount)
|
|
{
|
|
if (sourceEnd)
|
|
break;
|
|
targetEnd = true;
|
|
siteId = 1;
|
|
}
|
|
allocateUserToSite(userId, siteId, userCount);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void allocateGroupsToSites(int groupCount, int siteCount, Allocation allocation, int userCount,
|
|
int sitesAlreadyCreated, OnFailure onFailureAction) throws Exception
|
|
{
|
|
if (allocation == Allocation.ALL_TO_EACH)
|
|
{
|
|
for (int groupId = 1; groupId <= groupCount; groupId++)
|
|
{
|
|
for (int siteId = sitesAlreadyCreated+1; siteId <= siteCount; siteId++)
|
|
{
|
|
String doAsUser = getSiteOwnerUserName(siteId, userCount);
|
|
allocateGroupToSite(groupId, siteId, userCount, doAsUser, onFailureAction);
|
|
}
|
|
}
|
|
}
|
|
else if (allocation == Allocation.ROUND_ROBIN_TO_TARGET)
|
|
{
|
|
boolean sourceEnd = (allocation == Allocation.ROUND_ROBIN_TO_TARGET);
|
|
boolean targetEnd = (allocation == Allocation.ROUND_ROBIN_FROM_SOURCE);
|
|
int startGroupId = sitesAlreadyCreated % groupCount + 1;
|
|
for (int siteId = sitesAlreadyCreated+1, groupId = startGroupId; ; siteId++, groupId++)
|
|
{
|
|
if (groupId > groupCount)
|
|
{
|
|
if (targetEnd)
|
|
break;
|
|
sourceEnd = true;
|
|
groupId = 1;
|
|
}
|
|
if (siteId > siteCount)
|
|
{
|
|
if (sourceEnd)
|
|
break;
|
|
targetEnd = true;
|
|
siteId = 1;
|
|
}
|
|
String doAsUser = getSiteOwnerUserName(siteId, userCount);
|
|
allocateGroupToSite(groupId, siteId, userCount, doAsUser, onFailureAction);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void allocateUserToGroup(int userId, int groupId) throws Exception
|
|
{
|
|
String userName = getUserName(userId);
|
|
String groupName = getGroupName(groupId);
|
|
|
|
long ms = System.currentTimeMillis();
|
|
allocateUserToGroup(userName, groupName);
|
|
assertTime("Adding a user to a group", userId, groupId, ms, MAX_USER_TO_GROUP_MS);
|
|
}
|
|
|
|
private void allocateUserToSite(int userId, int siteId, int userCount) throws Exception
|
|
{
|
|
try
|
|
{
|
|
String userName = getUserName(userId);
|
|
String siteName = getSiteName(siteId);
|
|
String siteOwnerUserName = getSiteOwnerUserName(siteId, userCount);
|
|
|
|
long ms = System.currentTimeMillis();
|
|
allocateUserToSite(userName, siteName, siteOwnerUserName);
|
|
assertTime("Adding a user to a site", userId, siteId, ms, MAX_USER_TO_SITE_MS);
|
|
}
|
|
catch (DuplicateChildNodeNameException e)
|
|
{
|
|
// Already allocated.
|
|
}
|
|
}
|
|
|
|
private int getNextSiteToAddGroupTo(int firstSiteIdToCheck) throws Exception
|
|
{
|
|
String userName = getUserName(1);
|
|
Set<String> existingAuthorities = authorityService.getAuthoritiesForUser(userName);
|
|
int siteId = firstSiteIdToCheck;
|
|
for (; siteId <= NUM_SITES; siteId++)
|
|
{
|
|
String siteName = getSiteName(siteId);
|
|
String groupName = "GROUP_site_"+siteName;
|
|
if (!existingAuthorities.contains(groupName))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
log("Next site to add group to is "+siteId);
|
|
return siteId;
|
|
}
|
|
|
|
private void allocateGroupToSite(int firstSiteId, int userCount, String doAsUser, OnFailure onFailureAction, int blockSize) throws Exception
|
|
{
|
|
String currentUser = authenticationComponent.getCurrentUserName();
|
|
UserTransaction txn = transactionService.getUserTransaction();
|
|
long ms1 = System.currentTimeMillis();
|
|
|
|
try
|
|
{
|
|
if (doAsUser != null)
|
|
authenticationComponent.setCurrentUser(doAsUser);
|
|
txn.begin();
|
|
for (int siteId = firstSiteId; siteId < firstSiteId+blockSize; siteId++)
|
|
{
|
|
try
|
|
{
|
|
int groupId = (siteId - 1) % NUM_GROUPS + 1;
|
|
String groupName = getGroupName(groupId);
|
|
String siteName = getSiteName(siteId);
|
|
|
|
long ms2 = System.currentTimeMillis();
|
|
String groupAuthorityName = authorityService.getName(AuthorityType.GROUP,
|
|
groupName);
|
|
siteService.setMembership(siteName, groupAuthorityName, SiteModel.SITE_COLLABORATOR);
|
|
assertTime("Adding a group to a site", groupId, siteId, ms2, MAX_GROUP_TO_SITE_MS, onFailureAction, 1);
|
|
}
|
|
catch (DuplicateChildNodeNameException e)
|
|
{
|
|
// Already allocated.
|
|
}
|
|
}
|
|
txn.commit();
|
|
assertTime(" Block Add", firstSiteId, 0, ms1, MAX_GROUP_TO_SITE_MS, onFailureAction, blockSize);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
txn.rollback();
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
authenticationComponent.setCurrentUser(currentUser);
|
|
}
|
|
}
|
|
|
|
private void allocateGroupToSite(int siteId, int userCount, String doAsUser, OnFailure onFailureAction) throws Exception
|
|
{
|
|
int groupId = (siteId-1) % NUM_GROUPS + 1;
|
|
allocateGroupToSite(groupId, siteId, userCount, doAsUser, onFailureAction);
|
|
}
|
|
|
|
private void allocateGroupToSite(int groupId, int siteId, int userCount, String doAsUser, OnFailure onFailureAction) throws Exception
|
|
{
|
|
try
|
|
{
|
|
String groupName = getGroupName(groupId);
|
|
String siteName = getSiteName(siteId);
|
|
|
|
long ms = System.currentTimeMillis();
|
|
allocateGroupToSite(groupName, siteName, doAsUser);
|
|
assertTime("Adding a group to a site", groupId, siteId, ms, MAX_GROUP_TO_SITE_MS, onFailureAction, 1);
|
|
}
|
|
catch (DuplicateChildNodeNameException e)
|
|
{
|
|
// Already allocated.
|
|
}
|
|
}
|
|
|
|
// ------------------ allocate 1 --------------------
|
|
|
|
private void allocateUserToGroup(String userName, String groupName) throws Exception
|
|
{
|
|
String groupAuthorityName = authorityService.getName(AuthorityType.GROUP, groupName);
|
|
authorityService.addAuthority(groupAuthorityName, userName);
|
|
}
|
|
|
|
private void allocateUserToSite(String userName, String siteName, String doAsUser)
|
|
throws Exception
|
|
{
|
|
setSiteMembership(userName, siteName, doAsUser);
|
|
}
|
|
|
|
private void allocateGroupToSite(String groupName, String siteName, String doAsUser)
|
|
throws Exception
|
|
{
|
|
String groupAuthorityName = authorityService.getName(AuthorityType.GROUP, groupName);
|
|
setSiteMembership(groupAuthorityName, siteName, doAsUser);
|
|
}
|
|
|
|
private void setSiteMembership(String authority, String siteName, String doAsUser)
|
|
throws SystemException, Exception
|
|
{
|
|
String currentUser = authenticationComponent.getCurrentUserName();
|
|
UserTransaction txn = transactionService.getUserTransaction();
|
|
try
|
|
{
|
|
if (doAsUser != null)
|
|
authenticationComponent.setCurrentUser(doAsUser);
|
|
txn.begin();
|
|
|
|
siteService.setMembership(siteName, authority, SiteModel.SITE_COLLABORATOR);
|
|
|
|
txn.commit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
txn.rollback();
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
authenticationComponent.setCurrentUser(currentUser);
|
|
}
|
|
}
|
|
|
|
// ------------------ names --------------------
|
|
|
|
private String getUserName(int userId)
|
|
{
|
|
return getName("user", userId);
|
|
}
|
|
|
|
private String getGroupName(int groupId)
|
|
{
|
|
return getName("group", groupId);
|
|
}
|
|
|
|
private String getSiteName(int siteId)
|
|
{
|
|
return getName("site", siteId);
|
|
}
|
|
|
|
private String getName(String prefix, int id)
|
|
{
|
|
return new StringBuilder(prefix).append(id).toString();
|
|
}
|
|
|
|
private String getSiteOwnerUserName(int siteId, int userCount)
|
|
{
|
|
int ownerId = (siteId-1)%userCount+1;
|
|
return getUserName(ownerId);
|
|
}
|
|
|
|
// ------------------ Original Tests --------------------
|
|
|
|
// @Test
|
|
// public void testSingleGroup() throws Exception
|
|
// {
|
|
// Allocation usersToGroups = Allocation.ALL_TO_EACH;
|
|
// Allocation usersToSites = Allocation.NONE;
|
|
// Allocation groupsToSites = Allocation.ROUND_ROBIN_TO_TARGET;
|
|
//
|
|
// createAndAllocate(NUM_USERS, NUM_GROUPS, NUM_SITES, usersToGroups, usersToSites, groupsToSites);
|
|
// }
|
|
|
|
// @Test
|
|
// public void testMultipleGroups() throws Exception
|
|
// {
|
|
// Allocation usersToGroups = Allocation.ALL_TO_EACH;
|
|
// Allocation usersToSites = Allocation.NONE;
|
|
// Allocation groupsToSites = Allocation.ROUND_ROBIN_TO_TARGET;
|
|
//
|
|
// createAndAllocate(NUM_USERS, NUM_GROUPS, NUM_SITES, usersToGroups, usersToSites, groupsToSites);
|
|
// }
|
|
|
|
// @Test
|
|
// public void testNoGroups() throws Exception
|
|
// {
|
|
// Allocation usersToGroups = Allocation.NONE;
|
|
// Allocation usersToSites = Allocation.ALL_TO_EACH;
|
|
// Allocation groupsToSites = Allocation.NONE;
|
|
//
|
|
// createAndAllocate(NUM_USERS, NUM_GROUPS, NUM_SITES, usersToGroups, usersToSites, groupsToSites);
|
|
// }
|
|
|
|
// ------------------ Initial Data Load Tests --------------------
|
|
|
|
// @Test
|
|
// public void testInitClearDownAll() throws Exception
|
|
// {
|
|
// createUsersGroupsAndSites(0, 0, 0);
|
|
// }
|
|
|
|
// @Test
|
|
// public void testInitCreateUsersAndGroups() throws Exception
|
|
// {
|
|
// createUsers(NUM_USERS);
|
|
// createGroups(NUM_GROUPS);
|
|
// allocateUsersToGroups(NUM_USERS, NUM_GROUPS, Allocation.ALL_TO_EACH);
|
|
// }
|
|
|
|
// @Test
|
|
// public void testInit() throws Exception
|
|
// {
|
|
// createUsers(NUM_USERS);
|
|
// createGroups(NUM_GROUPS);
|
|
// allocateUsersToGroups(NUM_USERS, NUM_GROUPS, Allocation.ALL_TO_EACH);
|
|
//
|
|
// createSites(NUM_SITES, NUM_USERS, 0, OnFailure.KEEP_GOING);
|
|
//
|
|
// int blockSize = 10;
|
|
// for (int siteId = getNextSiteToAddGroupTo(1); siteId <= NUM_SITES; siteId += blockSize)
|
|
// {
|
|
// allocateGroupToSite(siteId, NUM_USERS, ADMIN_USER, OnFailure.KEEP_GOING, blockSize);
|
|
// }
|
|
// }
|
|
|
|
// ------------------ Test to load data from cmd line --------------------
|
|
|
|
@Test
|
|
public void commandLine() throws Exception
|
|
{
|
|
String from = System.getProperty("from");
|
|
String to = System.getProperty("to");
|
|
String restart = System.getProperty("restart");
|
|
String action = System.getProperty("action");
|
|
logFilename = System.getProperty("log", "sites.log");
|
|
|
|
boolean usersOnly = "usersOnly".equalsIgnoreCase(action);
|
|
boolean sites = "sites".equalsIgnoreCase(action);
|
|
boolean groups = "groups".equalsIgnoreCase(action);
|
|
boolean test = "test".equalsIgnoreCase(action);
|
|
|
|
if ((usersOnly && (from != null || to != null || restart != null)) ||
|
|
(!usersOnly && (from == null || to == null || (action != null && !sites && !groups && !test))))
|
|
{
|
|
System.err.println(
|
|
"Usage: -Dfrom=<fromSiteId> -Dto=<toSiteId> [ -Dlog=<logFilename> ]\n" +
|
|
" -Daction=usersOnly [ -Dlog=<logFilename> ]\n" +
|
|
" -Daction=sites -Dfrom=<fromSiteId> -Dto=<toSiteId> [ -Dlog=<logFilename> ] [ -Drestart=<restartAtSiteId> ]\n" +
|
|
" -Daction=groups -Dfrom=<fromSiteId> -Dto=<toSiteId> [ -Dlog=<logFilename> ] [ -Drestart=<restartAtSiteId> ]" +
|
|
" -Daction=test -Dfrom=<fromSiteId> -Dto=<toSiteId> [ -Dlog=<logFilename> ] ");
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
int fromId = (from == null) ? 0 : Integer.parseInt(from);
|
|
NUM_SITES = (to == null) ? 0 : Integer.parseInt(to);
|
|
int restartFromId = (restart == null) ? fromId : Integer.parseInt(restart);
|
|
|
|
if (test)
|
|
{
|
|
testAddingSitesAndDelete(fromId, NUM_SITES);
|
|
}
|
|
else
|
|
{
|
|
if (action == null || usersOnly)
|
|
{
|
|
createUsers(NUM_USERS);
|
|
createGroups(NUM_GROUPS);
|
|
allocateUsersToGroups(NUM_USERS, NUM_GROUPS, Allocation.ALL_TO_EACH);
|
|
if (action == null)
|
|
{
|
|
sites = true;
|
|
}
|
|
}
|
|
|
|
if (sites)
|
|
{
|
|
createSites(NUM_SITES, NUM_USERS, restartFromId - 1, OnFailure.KEEP_GOING);
|
|
restartFromId = fromId;
|
|
groups = true;
|
|
}
|
|
|
|
if (groups)
|
|
{
|
|
int blockSize = 10;
|
|
for (int siteId = getNextSiteToAddGroupTo(restartFromId); siteId <= NUM_SITES; siteId += blockSize)
|
|
{
|
|
int size = Math.min(blockSize, NUM_SITES - siteId + 1);
|
|
allocateGroupToSite(siteId, NUM_USERS, ADMIN_USER, OnFailure.KEEP_GOING, size);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
e.printStackTrace();
|
|
}
|
|
finally
|
|
{
|
|
log("\n\n DONE");
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Simplify running unit test from the command line.
|
|
*
|
|
* set SITE_CPATH=%TOMCAT_HOME%/lib/*;%TOMCAT_HOME%/endorsed/*;%TOMCAT_HOME%/webapps/alfresco/WEB-INF/lib/*;%TOMCAT_HOME%/webapps/alfresco/WEB-INF/classes;%TOMCAT_HOME%/shared/classes;
|
|
* java -Xmx2048m -XX:MaxPermSize=512M -classpath %SITE_CPATH% org.alfresco.repo.site.SiteServiceTestHuge ...
|
|
*/
|
|
public static void main(String args[])
|
|
{
|
|
org.junit.runner.JUnitCore.main(SiteServiceTestHuge.class.getName());
|
|
}
|
|
|
|
// ------------------ Tests Once Data Is Loaded --------------------
|
|
|
|
// @Test
|
|
// public void testAdding1000SitesInBlocksOf100() throws Exception
|
|
// {
|
|
// usersCreated = NUM_USERS;
|
|
// groupsCreated = NUM_GROUPS;
|
|
// sitesCreated = NUM_SITES;
|
|
//
|
|
// deleteSites(NUM_SITES+1, NUM_SITES+1000, OnFailure.KEEP_GOING);
|
|
//
|
|
// for (int i=1; i<=10; i++)
|
|
// {
|
|
// addMoreSites(100, OnFailure.GIVE_UP);
|
|
// }
|
|
//
|
|
// deleteSites(NUM_SITES+1, NUM_SITES+1000, OnFailure.KEEP_GOING);
|
|
// }
|
|
|
|
// @Test
|
|
// public void testAdding4SitesAndDelete() throws Exception
|
|
// {
|
|
// testAddingSitesAndDelete(NUM_SITES + 1, NUM_SITES + 100);
|
|
// }
|
|
|
|
public void testAddingSitesAndDelete(int fromSiteId, int toSiteId) throws Exception
|
|
{
|
|
usersCreated = NUM_USERS;
|
|
groupsCreated = NUM_GROUPS;
|
|
sitesCreated = fromSiteId - 1;
|
|
|
|
deleteSites(fromSiteId, toSiteId, OnFailure.KEEP_GOING);
|
|
|
|
log("\n\n CREATE SITES");
|
|
for (int siteId = fromSiteId; siteId <= toSiteId; siteId++)
|
|
{
|
|
String siteCreatorUser = getSiteOwnerUserName(siteId, NUM_USERS);
|
|
creatSite(siteId, siteCreatorUser, OnFailure.KEEP_GOING);
|
|
}
|
|
|
|
log("\n\n ADD GROUPS");
|
|
for (int siteId = fromSiteId; siteId <= toSiteId; siteId++)
|
|
{
|
|
String siteCreatorUser = getSiteOwnerUserName(siteId, NUM_USERS);
|
|
allocateGroupToSite(siteId, NUM_USERS, siteCreatorUser, OnFailure.KEEP_GOING);
|
|
}
|
|
|
|
log("\n\n DELETE");
|
|
for (int siteId = fromSiteId; siteId <= toSiteId; siteId++)
|
|
{
|
|
String siteCreatorUser = getSiteOwnerUserName(siteId, NUM_USERS);
|
|
deleteSite(siteId, siteCreatorUser, OnFailure.KEEP_GOING);
|
|
}
|
|
}
|
|
}
|