mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged HEAD-BUG-FIX (5.1/Cloud) to HEAD (5.1/Cloud)
98720: Merged 5.0.N (5.0.2) to HEAD-BUG-FIX (5.1/Cloud) 98568: Merged V4.2-BUG-FIX (4.2.5) to 5.0.N (5.0.2) 98334: Merged DEV (4.2.5) to V4.2-BUG-FIX (4.2.5) 98326: MNT-13198: BM-0012: Run v420b1494_01: (CMIS) GetSites is Slow - Changed the PersonSitesRelation to use a faster API (SiteServiceImpl.listSiteMemberships(String, int)). 98452: MNT-13198: BM-0012: Run v420b1494_01: (CMIS) GetSites is Slow - Corrected the solution to fix the build failures. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@98811 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -1011,6 +1011,7 @@
|
||||
org.alfresco.service.cmr.site.SiteService.listMembers=ACL_ALLOW
|
||||
org.alfresco.service.cmr.site.SiteService.listMembersInfo=ACL_ALLOW
|
||||
org.alfresco.service.cmr.site.SiteService.listMembersPaged=ACL_ALLOW
|
||||
org.alfresco.service.cmr.site.SiteService.listSiteMemberships=ACL_ALLOW
|
||||
org.alfresco.service.cmr.site.SiteService.listSites=ACL_ALLOW,AFTER_ACL_NODE.sys:base.ReadProperties
|
||||
org.alfresco.service.cmr.site.SiteService.listSitesPaged=ACL_ALLOW,AFTER_ACL_NODE.sys:base.ReadProperties
|
||||
org.alfresco.service.cmr.site.SiteService.removeMembership=ACL_ALLOW
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2014 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2015 Alfresco Software Limited.
|
||||
*
|
||||
* This file is part of Alfresco
|
||||
*
|
||||
@@ -1180,13 +1180,6 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the {@link SiteInfo siteInfos} for sites to which the specified user has access.
|
||||
* Note that if the user has access to more than 1000 sites, the list will be truncated to 1000 entries.
|
||||
*
|
||||
* @param userName the username
|
||||
* @return a list of {@link SiteInfo site infos}.
|
||||
*/
|
||||
public String resolveSite(String group)
|
||||
{
|
||||
// purge non Site related Groups and strip the group name down to the site "shortName" it relates too
|
||||
@@ -1206,48 +1199,20 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the {@link SiteInfo siteInfos} for sites to which the specified user has access.
|
||||
* Note that if the user has access to more than 1000 sites, the list will be truncated to 1000 entries.
|
||||
*
|
||||
* @param userName the username
|
||||
* @return a list of {@link SiteInfo site infos}.
|
||||
*/
|
||||
private List<SiteInfo> listSitesImpl(final String userName, int size)
|
||||
{
|
||||
final int maxResults = size > 0 ? size : 1000;
|
||||
final Set<String> siteNames = new TreeSet<String>();
|
||||
|
||||
// MNT-13198 - use the bridge table
|
||||
String actualUserName = personService.getUserIdentifier(userName);
|
||||
if(actualUserName != null)
|
||||
List<SiteMembership> siteMemberships = listSiteMemberships(userName, size);
|
||||
List<SiteInfo> result = new ArrayList<SiteInfo>(siteMemberships.size());
|
||||
for (SiteMembership membership : siteMemberships)
|
||||
{
|
||||
Set<String> containingAuthorities = authorityService.getContainingAuthorities(AuthorityType.GROUP, actualUserName, false);
|
||||
for(String authority : containingAuthorities)
|
||||
{
|
||||
if (siteNames.size() < maxResults)
|
||||
{
|
||||
String siteName = resolveSite(authority);
|
||||
// MNT-10836 fix, after MNT-10109 we should also check site existence
|
||||
// A simple exists check would be better than getting the site properties etc - profiling suggests x2 faster
|
||||
if ((siteName != null) && hasSite(siteName))
|
||||
{
|
||||
siteNames.add(siteName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (siteNames.isEmpty())
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<ChildAssociationRef> assocs = this.nodeService.getChildrenByName(
|
||||
getSiteRoot(),
|
||||
ContentModel.ASSOC_CONTAINS,
|
||||
siteNames);
|
||||
List<SiteInfo> result = new ArrayList<SiteInfo>(assocs.size());
|
||||
for (ChildAssociationRef assoc : assocs)
|
||||
{
|
||||
// Ignore any node that is not a "site" type
|
||||
NodeRef site = assoc.getChildRef();
|
||||
QName siteClassName = this.directNodeService.getType(site);
|
||||
if (this.dictionaryService.isSubClass(siteClassName, SiteModel.TYPE_SITE))
|
||||
{
|
||||
result.add(createSiteInfo(site));
|
||||
}
|
||||
result.add(membership.getSiteInfo());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -3049,6 +3014,82 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic
|
||||
return result;
|
||||
}
|
||||
|
||||
private String resolveRole(String group)
|
||||
{
|
||||
// purge non Site related Groups and strip the group name down to the role
|
||||
if (group.startsWith(GROUP_SITE_PREFIX))
|
||||
{
|
||||
int roleIndex = group.lastIndexOf('_');
|
||||
if (roleIndex + 1 <= GROUP_SITE_PREFIX_LENGTH)
|
||||
{
|
||||
// There is no role associated
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
return group.substring(roleIndex + 1);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SiteMembership> listSiteMemberships (String userName, int size)
|
||||
{
|
||||
final int maxResults = size > 0 ? size : 1000;
|
||||
final Set<String> siteNames = new TreeSet<String>();
|
||||
Map<String, String> roleSitePairs = new HashMap<String, String>();
|
||||
// MNT-13198 - use the bridge table
|
||||
String actualUserName = personService.getUserIdentifier(userName);
|
||||
if(actualUserName != null)
|
||||
{
|
||||
Set<String> containingAuthorities = authorityService.getContainingAuthorities(AuthorityType.GROUP, actualUserName, false);
|
||||
for(String authority : containingAuthorities)
|
||||
{
|
||||
if (siteNames.size() < maxResults)
|
||||
{
|
||||
String siteName = resolveSite(authority);
|
||||
// MNT-10836 fix, after MNT-10109 we should also check site existence
|
||||
// A simple exists check would be better than getting the site properties etc - profiling suggests x2 faster
|
||||
if ((siteName != null) && hasSite(siteName))
|
||||
{
|
||||
String role = resolveRole(authority);
|
||||
if (role != null)
|
||||
{
|
||||
siteNames.add(siteName);
|
||||
roleSitePairs.put(siteName, role);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (siteNames.isEmpty())
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<ChildAssociationRef> assocs = this.nodeService.getChildrenByName(
|
||||
getSiteRoot(),
|
||||
ContentModel.ASSOC_CONTAINS,
|
||||
siteNames);
|
||||
List<SiteMembership> result = new ArrayList<SiteMembership>(assocs.size());
|
||||
for (ChildAssociationRef assoc : assocs)
|
||||
{
|
||||
// Ignore any node that is not a "site" type
|
||||
NodeRef site = assoc.getChildRef();
|
||||
QName siteClassName = this.directNodeService.getType(site);
|
||||
if (this.dictionaryService.isSubClass(siteClassName, SiteModel.TYPE_SITE))
|
||||
{
|
||||
SiteInfo siteInfo = createSiteInfo(site);
|
||||
result.add(new SiteMembership(siteInfo, userName, roleSitePairs.get(siteInfo.getShortName())));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public PagingResults<SiteMembership> listSitesPaged(final String userName, List<Pair<SiteService.SortFields, Boolean>> sortProps, final PagingRequest pagingRequest)
|
||||
{
|
||||
SiteMembershipCannedQueryFactory sitesCannedQueryFactory = (SiteMembershipCannedQueryFactory)cannedQueryRegistry.getNamedObject("sitesCannedQueryFactory");
|
||||
|
@@ -222,6 +222,16 @@ public interface SiteService
|
||||
@NotAuditable
|
||||
PagingResults<SiteInfo> listSites(List<FilterProp> filterProps, List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
||||
|
||||
/**
|
||||
* Lists all the memberships in sites that the specified user is in.
|
||||
*
|
||||
* @param userName
|
||||
* @param size
|
||||
* @return a list of SiteMembership objects
|
||||
*/
|
||||
@NotAuditable
|
||||
List<SiteMembership> listSiteMemberships (String userName, int size);
|
||||
|
||||
/**
|
||||
* List all the sites that the specified user has a explicit membership to.
|
||||
*
|
||||
|
@@ -1135,6 +1135,46 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest
|
||||
}
|
||||
}
|
||||
|
||||
public void testListSiteMemberships()
|
||||
{
|
||||
String siteName1 = "testMembership1";
|
||||
String siteName2 = "testMembership2";
|
||||
String siteName3 = "testMembership3";
|
||||
// Create a site as user one
|
||||
this.siteService.createSite(TEST_SITE_PRESET, siteName1, TEST_TITLE, TEST_DESCRIPTION, SiteVisibility.PRIVATE);
|
||||
|
||||
// Get the members of the site and check that user one is a manager
|
||||
List<SiteMembership> members = this.siteService.listSiteMemberships(USER_ONE, 0);
|
||||
assertNotNull(members);
|
||||
assertEquals(1, members.size());
|
||||
assertEquals(USER_ONE, members.get(0).getPersonId());
|
||||
assertEquals(SiteModel.SITE_MANAGER, members.get(0).getRole());
|
||||
|
||||
// Create a site as user two and add user one
|
||||
this.authenticationComponent.setCurrentUser(USER_TWO);
|
||||
this.siteService.createSite(TEST_SITE_PRESET, siteName2, TEST_TITLE, TEST_DESCRIPTION, SiteVisibility.PRIVATE);
|
||||
this.siteService.setMembership("testMembership2", USER_ONE, SiteModel.SITE_CONSUMER);
|
||||
|
||||
// Create a site as user three and add user one
|
||||
this.authenticationComponent.setCurrentUser(USER_THREE);
|
||||
this.siteService.createSite(TEST_SITE_PRESET, siteName3, TEST_TITLE, TEST_DESCRIPTION, SiteVisibility.PRIVATE);
|
||||
this.siteService.setMembership("testMembership3", USER_ONE, SiteModel.SITE_COLLABORATOR);
|
||||
|
||||
this.authenticationComponent.setCurrentUser(USER_ONE);
|
||||
members = this.siteService.listSiteMemberships(USER_ONE, 0);
|
||||
assertNotNull(members);
|
||||
assertEquals(3, members.size());
|
||||
assertEquals(USER_ONE, members.get(0).getPersonId());
|
||||
assertEquals(SiteModel.SITE_MANAGER, members.get(0).getRole());
|
||||
assertEquals(siteName1, members.get(0).getSiteInfo().getShortName());
|
||||
assertEquals(USER_ONE, members.get(1).getPersonId());
|
||||
assertEquals(SiteModel.SITE_CONSUMER, members.get(1).getRole());
|
||||
assertEquals(siteName2, members.get(1).getSiteInfo().getShortName());
|
||||
assertEquals(USER_ONE, members.get(2).getPersonId());
|
||||
assertEquals(SiteModel.SITE_COLLABORATOR, members.get(2).getRole());
|
||||
assertEquals(siteName3, members.get(2).getSiteInfo().getShortName());
|
||||
}
|
||||
|
||||
public void testJoinLeave()
|
||||
{
|
||||
// Create a site as user one
|
||||
|
Reference in New Issue
Block a user