Files
alfresco-community-repo/source/test-java/org/alfresco/rest/api/tests/RepoService.java
Raluca Munteanu 1eba269df5 REPO-1543: Refactor tests for list site filtering
- site are now created with a default site preset
   - refactored tests

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@132587 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2016-11-09 09:20:07 +00:00

2023 lines
66 KiB
Java

/*
* #%L
* Alfresco Remote API
* %%
* 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.rest.api.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import java.sql.SQLException;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import org.alfresco.model.ContentModel;
import org.alfresco.opencmis.CMISConnector;
import org.alfresco.opencmis.CMISNodeInfoImpl;
import org.alfresco.query.PageDetails;
import org.alfresco.query.PagingRequest;
import org.alfresco.query.PagingResults;
import org.alfresco.repo.activities.feed.FeedGenerator;
import org.alfresco.repo.activities.feed.cleanup.FeedCleaner;
import org.alfresco.repo.activities.post.lookup.PostLookup;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.cleanup.ContentStoreCleaner;
import org.alfresco.repo.domain.activities.ActivityFeedEntity;
import org.alfresco.repo.domain.activities.ActivityPostDAO;
import org.alfresco.repo.forum.CommentService;
import org.alfresco.repo.invitation.InvitationSearchCriteriaImpl;
import org.alfresco.repo.management.subsystems.ChildApplicationContextFactory;
import org.alfresco.repo.model.filefolder.HiddenAspect;
import org.alfresco.repo.model.filefolder.HiddenAspect.Visibility;
import org.alfresco.repo.node.index.NodeIndexer;
import org.alfresco.repo.security.authentication.AuthenticationException;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.site.SiteDoesNotExistException;
import org.alfresco.repo.tenant.Network;
import org.alfresco.repo.tenant.NetworksService;
import org.alfresco.repo.tenant.TenantAdminService;
import org.alfresco.repo.tenant.TenantService;
import org.alfresco.repo.tenant.TenantUtil;
import org.alfresco.repo.tenant.TenantUtil.TenantRunAsWork;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.repo.version.VersionModel;
import org.alfresco.repo.web.scripts.invitation.InvitationWebScriptTest;
import org.alfresco.rest.api.Activities;
import org.alfresco.rest.api.impl.node.ratings.RatingScheme;
import org.alfresco.rest.api.tests.client.data.Activity;
import org.alfresco.rest.api.tests.client.data.Comment;
import org.alfresco.rest.api.tests.client.data.Company;
import org.alfresco.rest.api.tests.client.data.FavouriteDocument;
import org.alfresco.rest.api.tests.client.data.FavouriteFolder;
import org.alfresco.rest.api.tests.client.data.FavouriteSite;
import org.alfresco.rest.api.tests.client.data.MemberOfSite;
import org.alfresco.rest.api.tests.client.data.NetworkImpl;
import org.alfresco.rest.api.tests.client.data.NodeRating;
import org.alfresco.rest.api.tests.client.data.NodeRating.Aggregate;
import org.alfresco.rest.api.tests.client.data.Person;
import org.alfresco.rest.api.tests.client.data.PersonNetwork;
import org.alfresco.rest.api.tests.client.data.SiteContainer;
import org.alfresco.rest.api.tests.client.data.SiteImpl;
import org.alfresco.rest.api.tests.client.data.SiteMember;
import org.alfresco.rest.api.tests.client.data.SiteRole;
import org.alfresco.rest.api.tests.client.data.Tag;
import org.alfresco.service.cmr.activities.ActivityService;
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.favourites.FavouritesService;
import org.alfresco.service.cmr.invitation.Invitation;
import org.alfresco.service.cmr.invitation.InvitationSearchCriteria.InvitationType;
import org.alfresco.service.cmr.invitation.InvitationService;
import org.alfresco.service.cmr.lock.LockService;
import org.alfresco.service.cmr.lock.LockType;
import org.alfresco.service.cmr.model.FileExistsException;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.model.FileNotFoundException;
import org.alfresco.service.cmr.preference.PreferenceService;
import org.alfresco.service.cmr.rating.Rating;
import org.alfresco.service.cmr.rating.RatingService;
import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.security.MutableAuthenticationService;
import org.alfresco.service.cmr.security.PersonService;
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.service.cmr.version.Version;
import org.alfresco.service.cmr.version.VersionHistory;
import org.alfresco.service.cmr.version.VersionService;
import org.alfresco.service.cmr.version.VersionType;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.FileFilterMode.Client;
import org.alfresco.util.GUID;
import org.alfresco.util.Pair;
import org.alfresco.util.registry.NamedObjectRegistry;
import org.apache.chemistry.opencmis.commons.data.CmisExtensionElement;
import org.apache.chemistry.opencmis.commons.data.Properties;
import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringImpl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.JobDetailBean;
import com.google.common.collect.AbstractIterator;
/**
* A convenient proxy into the repository services to support the tests.
*
* @author steveglover
*
*/
public class RepoService
{
private static final Log logger = LogFactory.getLog(RepoService.class);
protected static final String TEST_SITE_PRESET = "testSitePreset";
private static final String FAVOURITE_SITES_PREFIX = "org.alfresco.share.sites.favourites.";
private static final int FAVOURITE_SITES_PREFIX_LENGTH = FAVOURITE_SITES_PREFIX.length();
protected ApplicationContext applicationContext;
protected MutableAuthenticationService authenticationService;
protected DictionaryService dictionaryService;
protected SiteService siteService;
protected ActivityService activityService;
protected PostLookup postLookup;
protected FeedGenerator feedGenerator;
protected FileFolderService fileFolderService;
protected ContentService contentService;
protected CommentService commentService;
protected NodeService nodeService;
protected PreferenceService preferenceService;
protected TaggingService taggingService;
protected RatingService ratingService;
protected TenantService tenantService;
protected TenantAdminService tenantAdminService;
protected ActivityPostDAO postDAO;
protected JobDetailBean feedGeneratorJobDetail;
protected JobDetailBean postLookupJobDetail;
protected JobDetailBean feedCleanerJobDetail;
protected JobDetailBean postCleanerJobDetail;
protected JobDetailBean feedNotifierJobDetail;
protected ContentStoreCleaner contentStoreCleaner;
protected FeedCleaner feedCleaner;
protected PersonService personService;
protected NamedObjectRegistry<RatingScheme> nodeRatingSchemeRegistry;
protected VersionService versionService;
protected CheckOutCheckInService cociService;
protected FavouritesService favouritesService;
protected InvitationService invitationService;
protected LockService lockService;
protected CMISConnector cmisConnector;
protected NodeIndexer nodeIndexer;
protected HiddenAspect hiddenAspect;
protected NetworksService networksService;
protected NamespaceService namespaceService;
protected RetryingTransactionHelper transactionHelper;
protected Activities activities;
protected PublicApiTestContext publicApiContext;
protected Random random = new Random(System.currentTimeMillis());
protected static int numNetworks = 0;
/*
* Represents the "system" tenant/network
*/
protected TestNetwork systemNetwork;
/*
* A map of user names (stored in the map in lower case) and TestPersons
*/
protected Map<String, TestPerson> allPeople = new HashMap<String, TestPerson>();
// Needed for CGLIB to create proxy, see CloudRepoService
public RepoService()
{
}
@SuppressWarnings("unchecked")
public RepoService(ApplicationContext applicationContext) throws Exception
{
this.applicationContext = applicationContext;
this.publicApiContext = new PublicApiTestContext(applicationContext);
this.authenticationService = (MutableAuthenticationService)applicationContext.getBean("AuthenticationService");
this.siteService = (SiteService)applicationContext.getBean("SiteService");
this.activityService = (ActivityService)applicationContext.getBean("activityService");
this.fileFolderService = (FileFolderService)applicationContext.getBean("FileFolderService");
this.contentService = (ContentService)applicationContext.getBean("ContentService");
this.commentService = (CommentService)applicationContext.getBean("CommentService");
this.nodeService = (NodeService)applicationContext.getBean("NodeService");
this.preferenceService = (PreferenceService)applicationContext.getBean("PreferenceService");
this.taggingService = (TaggingService)applicationContext.getBean("TaggingService");
this.ratingService = (RatingService)applicationContext.getBean("RatingService");
this.tenantService = (TenantService)applicationContext.getBean("tenantService");
this.tenantAdminService = (TenantAdminService)applicationContext.getBean("tenantAdminService");
this.personService = (PersonService)applicationContext.getBean("PersonService");
this.contentStoreCleaner = (ContentStoreCleaner)applicationContext.getBean("contentStoreCleaner");
this.postDAO = (ActivityPostDAO)applicationContext.getBean("postDAO");
this.nodeRatingSchemeRegistry = (NamedObjectRegistry<RatingScheme>)applicationContext.getBean("nodeRatingSchemeRegistry");
this.cociService = (CheckOutCheckInService)applicationContext.getBean("CheckoutCheckinService");
this.favouritesService = (FavouritesService)applicationContext.getBean("FavouritesService");
this.dictionaryService = (DictionaryService)applicationContext.getBean("dictionaryService");
this.invitationService = (InvitationService)applicationContext.getBean("InvitationService");
this.lockService = (LockService)applicationContext.getBean("LockService");
this.cmisConnector = (CMISConnector)applicationContext.getBean("CMISConnector");
this.nodeIndexer = (NodeIndexer)applicationContext.getBean("nodeIndexer");
this.activities = (Activities)applicationContext.getBean("activities");
this.hiddenAspect = (HiddenAspect)applicationContext.getBean("hiddenAspect");
this.networksService = (NetworksService)applicationContext.getBean("networksService");
this.namespaceService = (NamespaceService)applicationContext.getBean("namespaceService");
this.transactionHelper = (RetryingTransactionHelper)applicationContext.getBean("retryingTransactionHelper");
Scheduler scheduler = (Scheduler)applicationContext.getBean("schedulerFactory");
JobDetailBean contentStoreCleanerJobDetail = (JobDetailBean)applicationContext.getBean("contentStoreCleanerJobDetail");
scheduler.pauseJob(contentStoreCleanerJobDetail.getName(), contentStoreCleanerJobDetail.getGroup());
ChildApplicationContextFactory activitiesFeed = (ChildApplicationContextFactory)applicationContext.getBean("ActivitiesFeed");
ApplicationContext activitiesFeedCtx = activitiesFeed.getApplicationContext();
this.postLookup = (PostLookup)activitiesFeedCtx.getBean("postLookup");
this.feedGenerator = (FeedGenerator)activitiesFeedCtx.getBean("feedGenerator");
this.feedGeneratorJobDetail = (JobDetailBean)activitiesFeedCtx.getBean("feedGeneratorJobDetail");
this.postLookupJobDetail = (JobDetailBean)activitiesFeedCtx.getBean("postLookupJobDetail");
this.feedCleanerJobDetail = (JobDetailBean)activitiesFeedCtx.getBean("feedCleanerJobDetail");
this.postCleanerJobDetail = (JobDetailBean)activitiesFeedCtx.getBean("postCleanerJobDetail");
this.feedNotifierJobDetail = (JobDetailBean)activitiesFeedCtx.getBean("feedNotifierJobDetail");
this.feedCleaner = (FeedCleaner)activitiesFeedCtx.getBean("feedCleaner");
// Pause activities jobs so that we aren't competing with their scheduled versions
scheduler.pauseJob(feedGeneratorJobDetail.getName(), feedGeneratorJobDetail.getGroup());
scheduler.pauseJob(postLookupJobDetail.getName(), postLookupJobDetail.getGroup());
scheduler.pauseJob(feedCleanerJobDetail.getName(), feedCleanerJobDetail.getGroup());
scheduler.pauseJob(postCleanerJobDetail.getName(), postCleanerJobDetail.getGroup());
scheduler.pauseJob(feedNotifierJobDetail.getName(), feedNotifierJobDetail.getGroup());
this.systemNetwork = new TestNetwork(TenantService.DEFAULT_DOMAIN, true);
}
public TestNetwork getSystemNetwork()
{
return systemNetwork;
}
public PublicApiTestContext getPublicApiContext()
{
return publicApiContext;
}
public void addPerson(TestPerson person)
{
allPeople.put(person.getId().toLowerCase(), person);
}
public NodeService getNodeService()
{
return nodeService;
}
public TestPerson getPerson(String username)
{
return allPeople.get(username.toLowerCase());
}
public void disableInTxnIndexing()
{
nodeIndexer.setDisabled(true);
}
public int getClientVisibilityMask(Client client, Visibility visibility)
{
return hiddenAspect.getClientVisibilityMask(client, visibility);
}
public ApplicationContext getApplicationContext()
{
return applicationContext;
}
public AssociationRef createAssociation(NodeRef sourceRef, NodeRef targetRef, QName assocTypeQName)
{
return nodeService.createAssociation(sourceRef, targetRef, assocTypeQName);
}
public String toPrefixString(QName qname)
{
return qname.toPrefixString(namespaceService);
}
public Invitation approveSiteInvitation(String personId, String siteId)
{
Invitation ret = null;
List<Invitation> invitations = invitationService.listPendingInvitationsForInvitee(personId);
for(Invitation invitation : invitations)
{
if(invitation.getResourceName().equals(siteId))
{
ret = invitationService.approve(invitation.getInviteId(), "I accept you");
}
}
return ret;
}
public void moveNode(NodeRef nodeToMoveRef, NodeRef newParentNodeRef) throws FileExistsException, FileNotFoundException
{
fileFolderService.move(nodeToMoveRef, newParentNodeRef, GUID.generate());
}
public void deleteNode(NodeRef nodeRef)
{
nodeService.deleteNode(nodeRef);
}
//
// TODO replace with V1 REST API to Lock/Unlock - except calls to includeChildren (which may not be exposed, initially
//
public void lockNode(NodeRef nodeRef)
{
lockNode(nodeRef, LockType.NODE_LOCK, 0, false);
}
public void lockNode(NodeRef nodeRef, LockType lockType, int timeToExpire, boolean includeChildren)
{
lockService.lock(nodeRef, lockType, timeToExpire, includeChildren);
}
public void unlockNode(NodeRef nodeRef)
{
unlockNode(nodeRef, false);
}
public void unlockNode(NodeRef nodeRef, boolean includeChildren)
{
lockService.unlock(nodeRef, true, false);
}
public NodeRef addUserDescription(final String personId, final TestNetwork network, final String personDescription)
{
return AuthenticationUtil.runAsSystem(new RunAsWork<NodeRef>()
{
//@Override
public NodeRef doWork() throws Exception
{
NodeRef userRef = personService.getPersonOrNull(personId);
if (userRef == null)
{
throw new AuthenticationException("User name does not exist: " + personId);
}
ContentWriter writer = contentService.getWriter(userRef, ContentModel.PROP_PERSONDESC, true);
writer.setMimetype(MimetypeMap.MIMETYPE_HTML);
writer.putContent(personDescription);
log("Updated person description " + personId + (network != null ? " in network " + network : ""));
return userRef;
}
});
}
public TestPerson createUser(final PersonInfo personInfo, final String username, final TestNetwork network)
{
return getOrCreateUser(personInfo, username, network, true);
}
public TestPerson getOrCreateUser(final PersonInfo personInfo, final String username, final TestNetwork network)
{
return getOrCreateUser(personInfo, username, network, false);
}
public final static String DEFAULT_ADMIN = "admin";
public final static String DEFAULT_ADMIN_PWD = "admin";
// TODO improve admin-related API tests (including ST vs MT)
private boolean isDefaultAdmin(String username, TestNetwork network)
{
if ((network == null) || (TenantService.DEFAULT_DOMAIN.equals(network.getId())))
{
return (DEFAULT_ADMIN.equalsIgnoreCase(username));
}
else
{
return ((DEFAULT_ADMIN+"@"+network.getId()).equalsIgnoreCase(username));
}
}
// TODO review delete person
public TestPerson getOrCreateUser(final PersonInfo personInfo, final String username, final TestNetwork network, final boolean deletePerson)
{
return AuthenticationUtil.runAsSystem(new RunAsWork<TestPerson>()
{
@Override
public TestPerson doWork() throws Exception
{
final TestPerson testPerson = new TestPerson(personInfo.getFirstName(), personInfo.getLastName(), username, personInfo.getPassword(),
personInfo.getCompany(), network, personInfo.getSkype(), personInfo.getLocation(), personInfo.getTel(),
personInfo.getMob(), personInfo.getInstantmsg(), personInfo.getGoogle());
final Map<QName, Serializable> props = testPerson.toProperties();
// short-circuit for default/tenant "admin"
if (! isDefaultAdmin(username, network))
{
NodeRef personNodeRef = personService.getPersonOrNull(username);
if ((personNodeRef != null) && deletePerson)
{
AuthenticationUtil.runAsSystem(new RunAsWork<Void>()
{
@Override
public Void doWork() throws Exception
{
personService.deletePerson(testPerson.getId());
return null;
}
});
}
if (personNodeRef == null)
{
personNodeRef = personService.createPerson(props);
// create authentication to represent user
authenticationService.createAuthentication(username, personInfo.getPassword().toCharArray());
if (EnterpriseTestFixture.WITH_AVATAR.equals(personInfo.getInstantmsg()))
{
InvitationWebScriptTest.makeAvatar(nodeService, personNodeRef);
log("Made avatar for " + testPerson.getId() + (network != null ? " in network " + network : ""));
}
}
}
log("Username " + testPerson.getId() + (network != null ? " in network " + network : ""));
publicApiContext.addUser(testPerson.getId());
addPerson(testPerson);
return testPerson;
}
});
}
protected void deleteUser(final String username, final TestNetwork network)
{
AuthenticationUtil.runAsSystem(new RunAsWork<TestPerson>()
{
@Override
public TestPerson doWork() throws Exception
{
if (personService.personExists(username))
{
authenticationService.deleteAuthentication(username);
personService.deletePerson(username);
}
return null;
}
});
}
/**
* @deprecated
*/
public TestSite createSite(TestNetwork network, final SiteInformation siteInfoIn)
{
SiteInfo siteInfoOut = siteService.createSite(siteInfoIn.getSitePreset() != null ? siteInfoIn.getSitePreset() : TEST_SITE_PRESET, siteInfoIn.getShortName(), siteInfoIn.getTitle(), siteInfoIn.getDescription(), siteInfoIn.getSiteVisibility());
siteService.createContainer(siteInfoIn.getShortName(), "documentLibrary", ContentModel.TYPE_FOLDER, null);
final TestSite testSite = new TestSite(network, siteInfoOut);
log("Created site " + testSite + (network != null ? " in network " + network : ""));
return testSite;
}
public Invitation rejectSiteInvitation(String personId, String siteId)
{
Invitation ret = null;
List<Invitation> invitations = invitationService.listPendingInvitationsForInvitee(personId);
for(Invitation invitation : invitations)
{
if(invitation.getResourceName().equals(siteId))
{
ret = invitationService.reject(invitation.getInviteId(), "I reject you");
}
}
return ret;
}
public List<Invitation> getModeratedSiteInvitations(String networkId, String runAsUserId, final String inviteeId, final String siteId)
{
List<Invitation> invitations = TenantUtil.runAsUserTenant(new TenantRunAsWork<List<Invitation>>()
{
@Override
public List<Invitation> doWork() throws Exception
{
InvitationSearchCriteriaImpl searchCriteria = new InvitationSearchCriteriaImpl();
searchCriteria.setInvitee(inviteeId);
if(siteId != null)
{
searchCriteria.setResourceName(siteId);
}
searchCriteria.setResourceType(Invitation.ResourceType.WEB_SITE);
searchCriteria.setInvitationType(InvitationType.MODERATED);
List<Invitation> invitations = invitationService.searchInvitation(searchCriteria);
return invitations;
}
}, runAsUserId, networkId);
return invitations;
}
public Version getCurrentVersion(NodeRef nodeRef)
{
return versionService.getCurrentVersion(nodeRef);
}
protected void log(String msg)
{
if(logger.isDebugEnabled())
{
logger.debug(msg);
}
}
public SiteInfo getSiteInfo(String siteId)
{
return siteService.getSite(siteId);
}
public boolean isCheckedOut(NodeRef nodeRef)
{
return cociService.isCheckedOut(nodeRef);
}
public Serializable getProperty(NodeRef nodeRef, QName propertyName)
{
Serializable value = nodeService.getProperty(nodeRef, propertyName);
return value;
}
public Set<QName> getAspects(NodeRef nodeRef)
{
Set<QName> aspects = nodeService.getAspects(nodeRef);
return aspects;
}
public ContentReader getContent(NodeRef nodeRef, QName propertyQName)
{
ContentReader reader = contentService.getReader(nodeRef, propertyQName);
return reader;
}
private void cleanupContent()
{
// eagerCleaner.setEagerOrphanCleanup(false);
log("Cleaning up feeds...");
// fire the cleaner
feedCleaner.setMaxAgeMins(1);
feedCleaner.setMaxFeedSize(1);
try
{
feedCleaner.execute();
}
catch(JobExecutionException e)
{
// TODO
}
log("...done");
log("Cleaning up content...");
// fire the cleaner
contentStoreCleaner.setProtectDays(0);
contentStoreCleaner.execute();
log("...done");
}
public void shutdown()
{
cleanupContent();
publicApiContext.cleanup();
}
public Version createVersion(NodeRef nodeRef, String history, boolean majorVersion)
{
Map<String, Serializable> props = new HashMap<String, Serializable>(2, 1.0f);
props.put(Version.PROP_DESCRIPTION, history);
props.put(VersionModel.PROP_VERSION_TYPE, majorVersion ? VersionType.MAJOR : VersionType.MINOR);
return versionService.createVersion(nodeRef, props);
}
public VersionHistory getVersionHistory(NodeRef nodeRef)
{
return versionService.getVersionHistory(nodeRef);
}
public Pair<String, String> splitSiteNetwork(String siteNetwork)
{
int idx = siteNetwork.indexOf("@");
String siteId = siteNetwork;
String networkId = null;
if(idx > -1)
{
siteId = siteNetwork.substring(0, idx - 1);
networkId = siteNetwork.substring(idx + 1);
}
return new Pair<String, String>(siteId, networkId);
}
private Map<String, Object> parseActivitySummary(ActivityFeedEntity entity)
{
String activityType = entity.getActivityType();
String activitySummary = entity.getActivitySummary();
JSONObject json = (JSONObject)JSONValue.parse(activitySummary);
return Activity.getActivitySummary(json, activityType);
}
public List<Activity> getActivities(String personId, String siteId, boolean excludeUser, boolean excludeOthers)
{
List<ActivityFeedEntity> feedEntities = activityService.getUserFeedEntries(personId, siteId, excludeUser, excludeOthers, 0);
List<Activity> activities = new ArrayList<Activity>(feedEntities.size());
for(ActivityFeedEntity entity : feedEntities)
{
String siteNetwork = entity.getSiteNetwork();
Pair<String, String> pair = splitSiteNetwork(siteNetwork);
siteId = pair.getFirst();
String networkId = pair.getSecond();
String postDateStr = PublicApiDateFormat.getDateFormat().format(entity.getPostDate());
Activity activity = new Activity(entity.getId(), networkId, siteId, entity.getFeedUserId(), entity.getPostUserId(), postDateStr, entity.getActivityType(), parseActivitySummary(entity));
activities.add(activity);
}
return activities;
}
public Rating getRating(NodeRef targetNode, String scheme)
{
return ratingService.getRatingByCurrentUser(targetNode, scheme);
}
public List<Rating> getRatings(NodeRef targetNode)
{
return ratingService.getRatingsByCurrentUser(targetNode);
}
public RatingScheme getApiRatingScheme(String ratingSchemeName)
{
return nodeRatingSchemeRegistry.getNamedObject(ratingSchemeName);
}
@SuppressWarnings("unchecked")
public Map<String, Object> getActivitySummary(ActivityFeedEntity entity) throws JSONException
{
Map<String, Object> activitySummary = activities.getActivitySummary(entity);
JSONObject json = new JSONObject();
for(String key : activitySummary.keySet())
{
Object value = activitySummary.get(key);
if(value instanceof NodeRef)
{
value = ((NodeRef)value).getId();
}
json.put(key, value);
}
return json;
}
public void checkSiteMember(final TestPerson person, final TestSite site, SiteRole siteRole) throws Exception
{
assertTrue(siteService.isMember(site.getSiteId(), person.getId()));
assertEquals(siteRole.toString(), siteService.getMembersRole(site.getSiteId(), person.getId()));
}
public void addFavouriteSite(final String username, final String siteShortName)
{
SiteInfo siteInfo = siteService.getSite(siteShortName);
if(siteInfo != null)
{
favouritesService.addFavourite(username, siteInfo.getNodeRef());
}
else
{
throw new SiteDoesNotExistException(siteShortName);
}
}
private PagingResults<SiteInfo> getFavouriteSites(String userName, PagingRequest pagingRequest)
{
final Collator collator = Collator.getInstance();
final Set<SiteInfo> sortedFavouriteSites = new TreeSet<SiteInfo>(new Comparator<SiteInfo>()
{
@Override
public int compare(SiteInfo o1, SiteInfo o2)
{
return collator.compare(o1.getTitle(), o2.getTitle());
}
});
Map<String, Serializable> prefs = preferenceService.getPreferences(userName, FAVOURITE_SITES_PREFIX);
for(String key : prefs.keySet())
{
boolean isFavourite = false;
Serializable s = prefs.get(key);
if(s instanceof Boolean)
{
isFavourite = (Boolean)s;
}
if(isFavourite)
{
String siteShortName = key.substring(FAVOURITE_SITES_PREFIX_LENGTH);
SiteInfo siteInfo = siteService.getSite(siteShortName);
if(siteInfo != null)
{
sortedFavouriteSites.add(siteInfo);
}
}
}
int totalSize = sortedFavouriteSites.size();
final PageDetails pageDetails = PageDetails.getPageDetails(pagingRequest, totalSize);
final List<SiteInfo> page = new ArrayList<SiteInfo>(pageDetails.getPageSize());
Iterator<SiteInfo> it = sortedFavouriteSites.iterator();
for(int counter = 0; counter < pageDetails.getEnd() && it.hasNext(); counter++)
{
SiteInfo favouriteSite = it.next();
if(counter < pageDetails.getSkipCount())
{
continue;
}
if(counter > pageDetails.getEnd() - 1)
{
break;
}
page.add(favouriteSite);
}
return new PagingResults<SiteInfo>()
{
@Override
public List<SiteInfo> getPage()
{
return page;
}
@Override
public boolean hasMoreItems()
{
return pageDetails.hasMoreItems();
}
@Override
public Pair<Integer, Integer> getTotalResultCount()
{
Integer total = Integer.valueOf(sortedFavouriteSites.size());
return new Pair<Integer, Integer>(total, total);
}
@Override
public String getQueryExecutionId()
{
return null;
}
};
}
public List<FavouriteSite> getFavouriteSites(TestPerson user)
{
List<FavouriteSite> favouriteSites = new ArrayList<FavouriteSite>();
PagingResults<SiteInfo> pagingResults = getFavouriteSites(user.getId(), new PagingRequest(0, Integer.MAX_VALUE));
for(SiteInfo siteInfo : pagingResults.getPage())
{
String siteId = siteInfo.getShortName();
String siteGuid = siteInfo.getNodeRef().getId();
TestSite site = user.getDefaultAccount().getSite(siteId);
FavouriteSite favouriteSite = null;
if(site.isMember(user.getId()))
{
favouriteSite = new FavouriteSite(site);
}
else
{
favouriteSite = new FavouriteSite(null, siteId, siteGuid, null, null, null, null, null);
}
favouriteSites.add(favouriteSite);
}
return favouriteSites;
}
public void addPreference(final String username, final String Key, final Serializable value)
{
Map<String, Serializable> preferences = new HashMap<String, Serializable>(1);
preferences.put(Key, value);
preferenceService.setPreferences(username, preferences);
}
public List<MemberOfSite> getSiteMemberships(String personId)
{
List<SiteInfo> sites = siteService.listSites(personId);
List<MemberOfSite> memberships = new ArrayList<MemberOfSite>();
for(SiteInfo siteInfo : sites)
{
String roleStr = siteService.getMembersRole(siteInfo.getShortName(), personId);
SiteRole role = SiteRole.valueOf(roleStr);
SiteImpl site = new SiteImpl(siteInfo, role, true);
memberships.add(new MemberOfSite(site, role));
}
return memberships;
}
public void generateFeed() throws JobExecutionException, SQLException
{
// process all outstanding activity posts
transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
postLookup.execute();
return null;
}
}, false, true);
Long maxSequence = getMaxActivitySeq();
while(maxSequence != null)
{
feedGenerator.execute();
maxSequence = getMaxActivitySeq();
}
}
private Long getMaxActivitySeq() throws SQLException
{
Long maxSequence = transactionHelper.doInTransaction(new RetryingTransactionCallback<Long>()
{
@Override
public Long execute() throws Throwable
{
return postDAO.getMaxActivitySeq();
}
}, true, true);
return maxSequence;
}
public Tag addTag(NodeRef nodeRef, String tag)
{
NodeRef tagNodeRef = taggingService.addTag(nodeRef, tag);
return new Tag(nodeRef.getId(), tagNodeRef.getId(), tag);
}
public List<Tag> getTags()
{
Set<Tag> tags = new TreeSet<Tag>();
for(String tag : taggingService.getTags(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE))
{
tags.add(new Tag(null, taggingService.getTagNodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, tag).getId(), tag));
}
return new ArrayList<Tag>(tags);
}
public List<Tag> getTags(NodeRef nodeRef)
{
Set<Tag> tags = new TreeSet<Tag>();
for(String tag : taggingService.getTags(nodeRef))
{
tags.add(new Tag(null, taggingService.getTagNodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, tag).getId(), tag));
}
return new ArrayList<Tag>(tags);
}
/*
* Get (CMIS) node properties
*/
private Properties getProperties(NodeRef nodeRef)
{
CMISNodeInfoImpl nodeInfo = cmisConnector.createNodeInfo(nodeRef);
final Properties properties = cmisConnector.getNodeProperties(nodeInfo, null);
// fake the title property, which CMIS doesn't give us
String title = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_TITLE);
final PropertyStringImpl titleProp = new PropertyStringImpl(ContentModel.PROP_TITLE.toString(), title);
Properties wrapProperties = new Properties()
{
@Override
public List<CmisExtensionElement> getExtensions()
{
return properties.getExtensions();
}
@Override
public void setExtensions(List<CmisExtensionElement> extensions)
{
properties.setExtensions(extensions);
}
@Override
public Map<String, PropertyData<?>> getProperties()
{
Map<String, PropertyData<?>> updatedProperties = new HashMap<String, PropertyData<?>>(properties.getProperties());
updatedProperties.put(titleProp.getId(), titleProp);
return updatedProperties;
}
@Override
public List<PropertyData<?>> getPropertyList()
{
List<PropertyData<?>> propertyList = new ArrayList<PropertyData<?>>(properties.getPropertyList());
propertyList.add(titleProp);
return propertyList;
}
};
return wrapProperties;
}
public FavouriteDocument getDocument(String networkId, final NodeRef nodeRef)
{
return TenantUtil.runAsSystemTenant(new TenantRunAsWork<FavouriteDocument>()
{
@Override
public FavouriteDocument doWork() throws Exception
{
FavouriteDocument document = null;
QName type = nodeService.getType(nodeRef);
if(dictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT))
{
Properties properties = getProperties(nodeRef);
document = FavouriteDocument.getDocument(nodeRef.getId(), nodeRef.getId(), properties);
}
else
{
throw new IllegalArgumentException("Not a document node");
}
return document;
}
}, networkId);
}
public FavouriteFolder getFolder(String networkId, final NodeRef nodeRef)
{
return TenantUtil.runAsSystemTenant(new TenantRunAsWork<FavouriteFolder>()
{
@Override
public FavouriteFolder doWork() throws Exception
{
FavouriteFolder folder = null;
QName type = nodeService.getType(nodeRef);
if(dictionaryService.isSubClass(type, ContentModel.TYPE_FOLDER))
{
Properties properties = getProperties(nodeRef);
folder = FavouriteFolder.getFolder(nodeRef.getId(), nodeRef.getId(), properties);
}
else
{
throw new IllegalArgumentException("Not a folder node");
}
return folder;
}
}, networkId);
}
public List<NodeRating> getNodeRatings(String personId, String networkId, final NodeRef nodeRef)
{
List<NodeRating> ratings = TenantUtil.runAsUserTenant(new TenantRunAsWork<List<NodeRating>>()
{
@Override
public List<NodeRating> doWork() throws Exception
{
List<NodeRating> ratings = new ArrayList<NodeRating>();
{
Rating likesRating = ratingService.getRatingByCurrentUser(nodeRef, "likesRatingScheme");
Object myRating = null;
String ratedAt = null;
if(likesRating != null)
{
myRating = likesRating.getScore() == 1.0f ? Boolean.TRUE : Boolean.FALSE;
Date rateTime = likesRating.getAppliedAt();
ratedAt = PublicApiDateFormat.getDateFormat().format(rateTime);
}
int ratingsCount = ratingService.getRatingsCount(nodeRef, "likesRatingScheme");
Aggregate aggregate = new Aggregate(ratingsCount, null);
ratings.add(new NodeRating(nodeRef.getId(), "likes", ratedAt, myRating, aggregate));
}
{
Rating fiveStarRating = ratingService.getRatingByCurrentUser(nodeRef, "fiveStarRatingScheme");
Object myRating = null;
String ratedAt = null;
if(fiveStarRating != null)
{
myRating = fiveStarRating.getScore();
Date rateTime = fiveStarRating.getAppliedAt();
ratedAt = PublicApiDateFormat.getDateFormat().format(rateTime);
}
int ratingsCount = ratingService.getRatingsCount(nodeRef, "fiveStarRatingScheme");
float averageRating = ratingService.getAverageRating(nodeRef, "fiveStarRatingScheme");
Aggregate aggregate = new Aggregate(ratingsCount, averageRating == -1 ? null : averageRating);
ratings.add(new NodeRating(nodeRef.getId(), "fiveStar", ratedAt, myRating, aggregate));
}
return ratings;
}
}, personId, networkId);
Collections.sort(ratings);
return ratings;
}
public int numRatingSchemes()
{
return ratingService.getRatingSchemes().size();
}
public NodeRef addToDocumentLibrary(TestSite site, String name, QName type)
{
NodeRef documentLibraryContainerNodeRef = siteService.getContainer(site.getSiteId(), "documentLibrary");
NodeRef nodeRef = fileFolderService.create(documentLibraryContainerNodeRef, name, type).getNodeRef();
return nodeRef;
}
public String getSiteNetwork(final String siteShortName, String tenantDomain)
{
return TenantUtil.runAsTenant(new TenantRunAsWork<String>()
{
@Override
public String doWork() throws Exception
{
return tenantService.getName(siteShortName);
}
}, tenantDomain);
}
public void postActivity(final String activityType, final String siteId, final JSONObject activityData) throws JobExecutionException
{
activityService.postActivity(activityType, siteId, "documentlibrary", activityData.toString());
}
public NodeRef createDocument(final NodeRef parentNodeRef, final String name, final String content)
{
NodeRef nodeRef = fileFolderService.create(parentNodeRef, name, ContentModel.TYPE_CONTENT).getNodeRef();
ContentWriter writer = contentService.getWriter(nodeRef, ContentModel.PROP_CONTENT, true);
writer.putContent(content);
return nodeRef;
}
public NodeRef createDocument(final NodeRef parentNodeRef, final String name, final String title, final String description, final String content)
{
NodeRef nodeRef = fileFolderService.create(parentNodeRef, name, ContentModel.TYPE_CONTENT).getNodeRef();
ContentWriter writer = contentService.getWriter(nodeRef, ContentModel.PROP_CONTENT, true);
writer.putContent(content);
nodeService.setProperty(nodeRef, ContentModel.PROP_TITLE, title);
nodeService.setProperty(nodeRef, ContentModel.PROP_DESCRIPTION, description);
return nodeRef;
}
public NodeRef createFolder(final NodeRef parentNodeRef, final String name)
{
NodeRef nodeRef = fileFolderService.create(parentNodeRef, name, ContentModel.TYPE_FOLDER).getNodeRef();
return nodeRef;
}
public NodeRef createFolder(final NodeRef parentNodeRef, final String name, final String title, final String description)
{
NodeRef nodeRef = fileFolderService.create(parentNodeRef, name, ContentModel.TYPE_FOLDER).getNodeRef();
nodeService.setProperty(nodeRef, ContentModel.PROP_TITLE, title);
nodeService.setProperty(nodeRef, ContentModel.PROP_DESCRIPTION, description);
return nodeRef;
}
public NodeRef createCmObject(final NodeRef parentNodeRef, final String name)
{
QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(name));
NodeRef nodeRef = nodeService.createNode(parentNodeRef, ContentModel.ASSOC_CONTAINS, assocQName, ContentModel.TYPE_CMOBJECT).getChildRef();
return nodeRef;
}
public NodeRef createObjectOfCustomType(final NodeRef parentNodeRef, final String name, final String typeName)
{
QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(name));
QName typeQName = QName.createQName(typeName);
NodeRef nodeRef = nodeService.createNode(parentNodeRef, ContentModel.ASSOC_CONTAINS, assocQName, typeQName).getChildRef();
return nodeRef;
}
public Visibility getVisibility(Client client, NodeRef nodeRef)
{
return hiddenAspect.getVisibility(client, nodeRef);
}
public void addAspect(NodeRef nodeRef, QName aspectTypeQName, Map<QName, Serializable> aspectProperties)
{
nodeService.addAspect(nodeRef, aspectTypeQName, aspectProperties);
}
public NodeRef createComment(NodeRef nodeRef, final Comment comment)
{
NodeRef commentNodeRef = commentService.createComment(nodeRef, comment.getTitle(), comment.getContent(), false);
comment.setId(commentNodeRef.getId());
Date created = (Date)nodeService.getProperty(commentNodeRef, ContentModel.PROP_CREATED);
comment.setCreatedAt(PublicApiDateFormat.getDateFormat().format(created));
TestPerson person = getPerson((String)nodeService.getProperty(commentNodeRef, ContentModel.PROP_CREATOR));
comment.setCreatedBy(person);
return commentNodeRef;
}
public TestNetwork createNetworkWithAlias(String alias, boolean enabled)
{
String networkId = alias + "-" + System.currentTimeMillis();
TestNetwork network = new TestNetwork(networkId, enabled);
return network;
}
public TestNetwork createNetwork(String networkId, boolean enabled)
{
TestNetwork network = new TestNetwork(networkId, enabled);
return network;
}
public class TestSite extends SiteImpl
{
private static final long serialVersionUID = 5317623044880374281L;
private TestNetwork account;
private SiteInfo siteInfo;
public TestSite(TestNetwork account, SiteInfo siteInfo)
{
this(account, siteInfo.getShortName(), siteInfo.getNodeRef().getId(), siteInfo.getTitle(), siteInfo.getDescription(), siteInfo.getVisibility());
this.account = account;
this.siteInfo = siteInfo;
}
public TestSite(TestNetwork account, String siteId, String guid, String title, String description, SiteVisibility siteVisibility)
{
super((account == null ? null : account.getId()), siteId, guid);
setTitle(title);
setDescription(description);
setVisibility(siteVisibility.toString());
this.siteInfo = siteService.getSite(siteId);
}
public SiteInfo getSiteInfo()
{
return siteInfo;
}
public NodeRef getContainerNodeRef(String containerId)
{
return siteService.getContainer(siteId, containerId);
}
public NodeRef createContainer(String containerName)
{
return siteService.createContainer(getSiteId(), containerName, ContentModel.TYPE_FOLDER, null);
}
public void inviteToSite(final String toInvite, final SiteRole siteRole)
{
siteService.setMembership(getSiteId(), toInvite, siteRole.toString());
log(toInvite + " invited to site " + getSiteId());
}
public TestNetwork getAccount()
{
return account;
}
public Map<String, String> getMembers(final String roleFilter)
{
Map<String, String> members = TenantUtil.runAsSystemTenant(new TenantRunAsWork<Map<String, String>>()
{
@Override
public Map<String, String> doWork() throws Exception
{
Map<String, String> members = siteService.listMembers(getSiteId(), null, roleFilter, 0);
return members;
}
}, getAccount().getId());
return members;
}
public List<SiteMember> getMembers()
{
Map<String, String> members = TenantUtil.runAsSystemTenant(new TenantRunAsWork<Map<String, String>>()
{
@Override
public Map<String, String> doWork() throws Exception
{
// get all site members
Map<String, String> members = siteService.listMembers(getSiteId(), null, null, 0);
return members;
}
}, getAccount().getId());
List<SiteMember> ret = new ArrayList<SiteMember>(members.size());
for(String userId : members.keySet())
{
String role = members.get(userId);
TestPerson person = RepoService.this.getPerson(userId);
SiteMember sm = new SiteMember(userId, person, getSiteId(), role);
ret.add(sm);
}
Collections.sort(ret);
return ret;
}
public boolean isMember(final String personId)
{
Boolean isMember = TenantUtil.runAsSystemTenant(new TenantRunAsWork<Boolean>()
{
@Override
public Boolean doWork() throws Exception
{
return siteService.isMember(getSiteId(), personId);
}
}, getAccount().getId());
return isMember;
}
public SiteRole getMember(String personId)
{
return SiteRole.valueOf(siteService.getMembersRole(getSiteId(), personId));
}
public void updateMember(String personId, SiteRole role)
{
siteService.setMembership(getSiteId(), personId, role.toString());
}
public void removeMember(String personId)
{
if(siteService.isMember(getSiteId(), personId))
{
siteService.removeMembership(getSiteId(), personId);
}
}
public void setSiteVisibility(SiteVisibility siteVisibility)
{
this.visibility = siteVisibility.toString();
siteInfo.setVisibility(siteVisibility);
siteService.updateSite(siteInfo);
}
@Override
public String toString() {
return "TestSite [siteid=" + getSiteId() + ", title=" + getTitle()
+ ", description=" + getDescription() + ", siteVisibility="
+ getVisibility() + "]";
}
}
public static <T extends Object> Iterator<T> getWrappingIterator(final int startIdx, final List<T> list)
{
return new AbstractIterator<T>()
{
private int idx = Math.max(0, Math.min(startIdx, list.size() - 1));
@Override
protected T computeNext()
{
T o = list.get(idx);
idx++;
if(idx >= list.size())
{
idx = 0;
}
return o;
}
};
}
public class TestNetwork extends NetworkImpl implements Comparable<TestNetwork>
{
private static final long serialVersionUID = -107881141652228471L;
protected Map<String, TestPerson> people = new TreeMap<String, TestPerson>();
protected TreeMap<String, TestSite> sites = new TreeMap<String, TestSite>();
protected Set<TestSite> publicSites = new TreeSet<TestSite>();
public TestNetwork(String domain, boolean enabled)
{
super(domain, enabled);
}
public void create()
{
if(!getId().equals(TenantService.DEFAULT_DOMAIN) && !tenantAdminService.existsTenant(getId()))
{
tenantAdminService.createTenant(getId(), DEFAULT_ADMIN_PWD.toCharArray());
numNetworks++;
log("Created network " + getId());
}
}
public TestSite createSite(String siteRootName, SiteVisibility siteVisibility)
{
String shortName = "TESTSITE" + (siteRootName != null ? siteRootName : "") + GUID.generate();
SiteInformation siteInfo = new SiteInformation(shortName, shortName, shortName, siteVisibility);
return createSite(siteInfo);
}
public TestSite createSite(String id, String title, String description, String sitePreset, SiteVisibility visibility)
{
SiteInformation siteInfo = new SiteInformation(id, title, description, sitePreset, visibility);
// Used deprecated createSite method until will be allowed creating a site with sitePreset
return createSite(siteInfo);
}
public TestSite createSite(SiteVisibility siteVisibility)
{
return createSite(null, siteVisibility);
}
/**
* @deprecated replace with AbstractBaseApiTest.createSite (or PublicApiClient.sites.createSite)
*/
public TestSite createSite(final SiteInformation site)
{
TestSite testSite = RepoService.this.createSite(this, site);
addSite(testSite);
return testSite;
}
public TestPerson createUser()
{
long timeMillis = System.currentTimeMillis();
String firstname = "first" + timeMillis;
String lastname = "last" + timeMillis;
String username = "user" + timeMillis;
PersonInfo personInfo = new PersonInfo(firstname, lastname, username, "password", null, "skype", "location",
"telephone", "mob", "instant", "google");
TestPerson person = createUser(personInfo);
return person;
}
public NodeRef addUserDescription(final String personId, final String personDescription)
{
NodeRef personRef = TenantUtil.runAsTenant(new TenantRunAsWork<NodeRef>()
{
public NodeRef doWork() throws Exception
{
return RepoService.this.addUserDescription(personId, TestNetwork.this, personDescription);
}
}, getId());
return personRef;
}
public TestPerson createUser(final PersonInfo personInfo)
{
final String username = publicApiContext.createUserName(personInfo.getUsername(), getId());
TestPerson testPerson = TenantUtil.runAsTenant(new TenantRunAsWork<TestPerson>()
{
public TestPerson doWork() throws Exception
{
TestPerson person = RepoService.this.createUser(personInfo, username, TestNetwork.this);
return person;
}
}, getId());
addPerson(testPerson);
return testPerson;
}
public List<String> peopleSample(int sampleSize)
{
final List<String> p = new ArrayList<String>();
if(sampleSize < 0)
{
p.addAll(people.keySet());
}
else
{
int startIdx = random.nextInt(people.size());
List<String> peopleList = new ArrayList<String>(people.keySet());
Iterator<String> it = getWrappingIterator(startIdx, peopleList);
for(int i = 0; i < sampleSize && it.hasNext(); i++)
{
p.add(it.next());
}
}
return p;
}
// Return a site of which person is not a member
public TestSite getSiteNonMember(final String personId)
{
return TenantUtil.runAsSystemTenant(new TenantRunAsWork<TestSite>()
{
@Override
public TestSite doWork() throws Exception
{
TestSite ret = null;
SiteInfo match = null;
for(SiteInfo info : siteService.listSites(null, null))
{
boolean isMember = siteService.isMember(info.getShortName(), personId);
if(!isMember)
{
match = info;
break;
}
}
if(match != null)
{
ret = new TestSite(TestNetwork.this, match);
}
return ret;
}
}, getId());
}
public void addSite(TestSite site)
{
sites.put(site.getSiteId(), site);
if(site.getVisibility().equals(SiteVisibility.PUBLIC.toString()))
{
publicSites.add(site);
}
}
public Set<TestSite> getPublicSites()
{
return publicSites;
}
public TestSite getSite(final String siteShortName)
{
TestSite site = TenantUtil.runAsTenant(new TenantRunAsWork<TestSite>()
{
@Override
public TestSite doWork() throws Exception
{
SiteInfo siteInfo = siteService.getSite(siteShortName);
return new TestSite(TestNetwork.this, siteInfo);
}
}, getId());
return site;
}
/*
* List sites in this account that person can see
*/
public List<TestSite> getSites(String personId)
{
List<TestSite> sites = TenantUtil.runAsUserTenant(new TenantRunAsWork<List<TestSite>>()
{
@Override
public List<TestSite> doWork() throws Exception
{
List<SiteInfo> results = siteService.listSites(null, null);
TreeMap<String, TestSite> ret = new TreeMap<String, TestSite>();
for(SiteInfo siteInfo : results)
{
TestSite site = new TestSite(TestNetwork.this, siteInfo/*, null*/);
ret.put(site.getSiteId(), site);
}
return new ArrayList<TestSite>(ret.values());
}
}, personId, getId());
return sites;
}
public List<TestSite> getAllSites()
{
List<TestSite> sites = TenantUtil.runAsSystemTenant(new TenantRunAsWork<List<TestSite>>()
{
@Override
public List<TestSite> doWork() throws Exception
{
List<SiteInfo> results = siteService.listSites(null, null);
TreeMap<String, TestSite> ret = new TreeMap<String, TestSite>();
for(SiteInfo siteInfo : results)
{
TestSite site = new TestSite(TestNetwork.this, siteInfo/*, null*/);
ret.put(site.getSiteId(), site);
}
return new ArrayList<TestSite>(ret.values());
}
}, getId());
return sites;
}
public List<SiteContainer> getSiteContainers(final String siteId, TestPerson runAs)
{
List<SiteContainer> siteContainers = TenantUtil.runAsUserTenant(new TenantRunAsWork<List<SiteContainer>>()
{
@Override
public List<SiteContainer> doWork() throws Exception
{
PagingResults<FileInfo> results = siteService.listContainers(siteId, new PagingRequest(0, Integer.MAX_VALUE));
List<SiteContainer> ret = new ArrayList<SiteContainer>(results.getPage().size());
for(FileInfo fileInfo : results.getPage())
{
SiteContainer siteContainer = new SiteContainer(siteId, fileInfo.getName(), fileInfo.getNodeRef().getId());
ret.add(siteContainer);
}
return ret;
}
}, runAs.getId(), getId());
return siteContainers;
}
public Map<String, TestSite> getSitesForUser(String username)
{
if(username == null)
{
username = AuthenticationUtil.getAdminUserName();
}
List<SiteInfo> sites = TenantUtil.runAsUserTenant(new TenantRunAsWork<List<SiteInfo>>()
{
@Override
public List<SiteInfo> doWork() throws Exception
{
List<SiteInfo> results = siteService.listSites(null, null);
return results;
}
}, username, getId());
TreeMap<String, TestSite> ret = new TreeMap<String, TestSite>();
for(SiteInfo siteInfo : sites)
{
TestSite site = new TestSite(TestNetwork.this, siteInfo/*, null*/);
ret.put(site.getSiteId(), site);
}
return ret;
}
public List<MemberOfSite> getSiteMemberships(String username)
{
if(username == null)
{
username = AuthenticationUtil.getAdminUserName();
}
final String userId = username;
List<MemberOfSite> sites = TenantUtil.runAsUserTenant(new TenantRunAsWork<List<MemberOfSite>>()
{
@Override
public List<MemberOfSite> doWork() throws Exception
{
List<SiteInfo> sites = siteService.listSites(userId);
Set<MemberOfSite> personSites = new TreeSet<MemberOfSite>();
for(SiteInfo siteInfo : sites)
{
TestSite site = getSite(siteInfo.getShortName());
String role = siteService.getMembersRole(siteInfo.getShortName(), userId);
MemberOfSite ms = new MemberOfSite(site, SiteRole.valueOf(role));
personSites.add(ms);
}
return new ArrayList<MemberOfSite>(personSites);
}
}, userId, getId());
return sites;
}
public Map<String, TestSite> getSites(SiteVisibility siteVisibility)
{
Map<String, TestSite> ret = new HashMap<String, TestSite>();
for(String key : getSitesForUser(null).keySet())
{
TestSite site = getSitesForUser(null).get(key);
if(site.getVisibility().equals(siteVisibility.toString()))
{
ret.put(key, site);
}
}
return ret;
}
public void addPerson(TestPerson person)
{
people.put(person.getId(), person);
}
public List<String> getPersonIds()
{
return new ArrayList<String>(people.keySet());
}
public List<TestPerson> getPeople()
{
return new ArrayList<TestPerson>(people.values());
}
public int compareTo(TestNetwork o)
{
return getId().compareTo(o.getId());
}
public void addExternalUser(String personId)
{
throw new UnsupportedOperationException();
}
public TestSite homeSite(TestPerson person)
{
throw new UnsupportedOperationException();
}
public void inviteUser(final String user)
{
throw new UnsupportedOperationException();
}
public Collection<TestSite> getHomeSites()
{
throw new UnsupportedOperationException();
}
public Long getAccountId()
{
throw new UnsupportedOperationException();
}
public void setAccountId(Long accountId)
{
throw new UnsupportedOperationException();
}
public int getType()
{
throw new UnsupportedOperationException();
}
public void addNetworkAdmin(String email)
{
throw new UnsupportedOperationException();
}
public Set<String> getNetworkAdmins()
{
throw new UnsupportedOperationException();
}
public Set<String> getNonNetworkAdmins()
{
throw new UnsupportedOperationException();
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result
+ ((getId() == null) ? 0 : getId().hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
{
return true;
}
if(obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
TestNetwork other = (TestNetwork) obj;
return getId().equals(other.getId());
}
public TestSite getSite(SiteVisibility siteVisibility)
{
TestSite ret = null;
for(TestSite site : getSitesForUser(null).values())
{
if(site.getVisibility().equals(siteVisibility))
{
ret = site;
break;
}
}
return ret;
}
@Override
public String toString()
{
return "TestNetwork [people=" + people + ", sites=" + sites
+ ", publicSites=" + publicSites + "]";
}
}
public static class SiteMembership implements Comparable<SiteMembership>
{
private TestSite site;
private SiteRole role;
public SiteMembership(TestSite site, SiteRole role)
{
super();
if(site == null)
{
throw new IllegalArgumentException();
}
if(role == null)
{
throw new IllegalArgumentException();
}
this.site = site;
this.role = role;
}
public TestSite getSite()
{
return site;
}
public SiteRole getRole()
{
return role;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((role == null) ? 0 : role.hashCode());
result = prime * result + ((site == null) ? 0 : site.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
SiteMembership other = (SiteMembership) obj;
if (role != other.role)
{
return false;
}
return site.equals(other.site);
}
@Override
public int compareTo(SiteMembership siteMembership)
{
int ret = site.getSiteId().compareTo(siteMembership.getSite().getSiteId());
if(ret == 0)
{
// arbitrary sorting on site role
ret = role.compareTo(siteMembership.getRole());
}
return ret;
}
}
// order by last name, first name, role
public class TestPerson extends Person
{
private static final long serialVersionUID = 4038390056182705588L;
protected boolean enabled;
protected String password;
protected TestNetwork defaultAccount;
protected TreeMap<TestSite, SiteRole> siteMemberships = new TreeMap<TestSite, SiteRole>();
public TestPerson(String firstName, String lastName, String username, String password, Company company, TestNetwork defaultAccount, String skype, String location, String tel,
String mob, String instantmsg, String google)
{
super(username, username, true, firstName, lastName, company, skype, location, tel, mob, instantmsg, google, null);
this.password = password;
this.enabled = true;
this.defaultAccount = defaultAccount;
}
public boolean isNetworkAdmin()
{
return false; // cloud only
}
public String getDefaultDomain()
{
return defaultAccount == null ? null : defaultAccount.getId();
}
public Boolean isEnabled()
{
return enabled;
}
public void addSiteMembership(TestSite site, SiteRole siteRole)
{
siteMemberships.put(site, siteRole);
}
public TestNetwork getDefaultAccount()
{
return defaultAccount;
}
public String getPassword()
{
return password;
}
public List<PersonNetwork> getNetworkMemberships()
{
String personId = getId();
String runAsNetworkId = Person.getNetworkId(personId);
return TenantUtil.runAsUserTenant(new TenantRunAsWork<List<PersonNetwork>>()
{
@Override
public List<PersonNetwork> doWork() throws Exception
{
List<PersonNetwork> members = new ArrayList<PersonNetwork>();
PagingResults<Network> networks = networksService.getNetworks(new PagingRequest(0, Integer.MAX_VALUE));
for(Network network : networks.getPage())
{
NetworkImpl restNetwork = new NetworkImpl(network);
PersonNetwork personNetwork = new PersonNetwork(network.getIsHomeNetwork(), restNetwork);
members.add(personNetwork);
}
return members;
}
}, personId, runAsNetworkId);
}
@Override
public String toString()
{
return "TestPerson [enabled=" + enabled + ", password=" + password
+ ", defaultAccount=" + defaultAccount.getId() + ", siteMemberships=" + siteMemberships
+ ", getId()=" + getId() + ", getFirstName()="
+ getFirstName() + ", getCompany()=" + getCompany()
+ ", getLastName()=" + getLastName() + "]";
}
}
public static class SiteInformation implements Comparable<SiteInformation>
{
private String shortName;
private String title;
private String sitePreset;
private String description;
private SiteVisibility siteVisibility;
public SiteInformation(String shortName, String title, String description, SiteVisibility siteVisibility)
{
super();
if(shortName == null)
{
throw new IllegalArgumentException();
}
this.shortName = shortName;
this.title = title;
this.description = description;
this.siteVisibility = siteVisibility;
}
public SiteInformation(String shortName, String title, String description, String sitePreset, SiteVisibility siteVisibility)
{
this(shortName, title, description, siteVisibility);
this.sitePreset = sitePreset;
}
public String getShortName()
{
return shortName;
}
public String getTitle()
{
return title;
}
public String getSitePreset()
{
return sitePreset;
}
public String getDescription()
{
return description;
}
public SiteVisibility getSiteVisibility()
{
return siteVisibility;
}
public boolean equals(Object other)
{
if(this == other)
{
return true;
}
if(!(other instanceof SiteInformation))
{
return false;
}
SiteInformation site = (SiteInformation)other;
return shortName == site.getShortName();
}
@Override
public int compareTo(SiteInformation site)
{
return shortName.compareTo(site.getShortName());
}
public int hashCode()
{
return getShortName().hashCode();
}
}
}