ALF-11378: REST API has been modified to return extra information about a user whether s/he belongs to a group or not.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@41906 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jamal Kaabi-Mofrad
2012-09-24 15:36:02 +00:00
parent f67f4919f9
commit 0789d8d01d
7 changed files with 326 additions and 65 deletions

View File

@@ -0,0 +1,89 @@
package org.alfresco.repo.site;
import java.io.Serializable;
import org.alfresco.service.cmr.site.SiteMemberInfo;
/**
* Site member's information class
*
* @author Jamal Kaabi-Mofrad
* @since Odin
*/
public class SiteMemberInfoImpl implements SiteMemberInfo, Serializable
{
private static final long serialVersionUID = -5902865692214513762L;
private String memberName;
private String memberRole;
private boolean memberOfGroup;
/**
* Constructor
*
* @param memberName The name of an individual or a group
* @param memberRole The role of the individual or group
* @param isMemberOfGroup Whether a member belongs to a group with access
* rights to the site or not
*/
public SiteMemberInfoImpl(String memberName, String memberRole, boolean isMemberOfGroup)
{
this.memberName = memberName;
this.memberRole = memberRole;
this.memberOfGroup = isMemberOfGroup;
}
/**
* @see org.alfresco.service.cmr.site.SiteMemberInfo#getMemberName()
*/
@Override
public String getMemberName()
{
return this.memberName;
}
/**
* @see org.alfresco.service.cmr.site.SiteMemberInfo#getMemberRole()
*/
@Override
public String getMemberRole()
{
return memberRole;
}
/**
* @see org.alfresco.service.cmr.site.SiteMemberInfo#isMemberOfGroup()
*/
@Override
public boolean isMemberOfGroup()
{
return memberOfGroup;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((this.memberName == null) ? 0 : this.memberName.hashCode());
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj) { return true; }
if (obj == null) { return false; }
if (!(obj instanceof SiteMemberInfoImpl)) { return false; }
SiteMemberInfoImpl other = (SiteMemberInfoImpl) obj;
if (this.memberName == null)
{
if (other.memberName != null) { return false; }
}
else if (!this.memberName.equals(other.memberName)) { return false; }
return true;
}
}

View File

@@ -47,9 +47,9 @@ import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.node.NodeServicePolicies.OnRestoreNodePolicy;
import org.alfresco.repo.node.getchildren.FilterProp;
import org.alfresco.repo.node.getchildren.FilterPropString;
import org.alfresco.repo.node.getchildren.FilterPropString.FilterTypeString;
import org.alfresco.repo.node.getchildren.GetChildrenCannedQuery;
import org.alfresco.repo.node.getchildren.GetChildrenCannedQueryFactory;
import org.alfresco.repo.node.getchildren.FilterPropString.FilterTypeString;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
@@ -78,13 +78,14 @@ import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.AccessPermission;
import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityService.AuthorityFilter;
import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.security.NoSuchPersonException;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.security.PublicServiceAccessService;
import org.alfresco.service.cmr.security.AuthorityService.AuthorityFilter;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteMemberInfo;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.site.SiteVisibility;
import org.alfresco.service.cmr.tagging.TaggingService;
@@ -1511,36 +1512,77 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic
}
}
/**
* @see org.alfresco.service.cmr.site.SiteService#listMembersInfo(String,
* String, String, int, boolean)
*/
public List<SiteMemberInfo> listMembersInfo(String shortName, final String nameFilter, final String roleFilter, final int size, final boolean collapseGroups)
{
// MT share - for activity service system callback
if (tenantService.isEnabled()
&& (AuthenticationUtil.SYSTEM_USER_NAME.equals(AuthenticationUtil
.getRunAsUser())) && tenantService.isTenantName(shortName))
{
final String tenantDomain = tenantService.getDomain(shortName);
final String sName = tenantService.getBaseName(shortName, true);
return AuthenticationUtil.runAs(
new AuthenticationUtil.RunAsWork<List<SiteMemberInfo>>()
{
public List<SiteMemberInfo> doWork() throws Exception
{
return listMembersInfoImpl(sName, nameFilter, roleFilter, size,
collapseGroups);
}
}, tenantService.getDomainUser(AuthenticationUtil.getSystemUserName(),
tenantDomain));
}
else
{
return listMembersInfoImpl(shortName, nameFilter, roleFilter, size, collapseGroups);
}
}
private Map<String, String> listMembersImpl(String shortName, String nameFilter, String roleFilter, int size, boolean collapseGroups)
{
Map<String, String> members = new HashMap<String, String>(32);
List<SiteMemberInfo> list = listMembersInfoImpl(shortName, nameFilter, roleFilter, size,
collapseGroups);
for (SiteMemberInfo info : list)
members.put(info.getMemberName(), info.getMemberRole());
return members;
}
private List<SiteMemberInfo> listMembersInfoImpl(String shortName, String nameFilter,
String roleFilter, int size, boolean collapseGroups)
{
NodeRef siteNodeRef = getSiteNodeRef(shortName);
if (siteNodeRef == null)
{
throw new SiteDoesNotExistException(shortName);
}
if (siteNodeRef == null) { throw new SiteDoesNotExistException(shortName); }
// Build an array of name filter tokens pre lowercased to test against person properties
// We require that matching people have at least one match against one of these on
// either their firstname or last name
// either their firstname or last name
String nameFilterLower = null;
String[] nameFilters = new String[0];
if (nameFilter != null && nameFilter.length() != 0)
{
StringTokenizer t = new StringTokenizer(nameFilter, " ");
nameFilters = new String[t.countTokens()];
for (int i=0; t.hasMoreTokens(); i++)
for (int i = 0; t.hasMoreTokens(); i++)
{
nameFilters[i] = t.nextToken().toLowerCase();
}
nameFilterLower = nameFilter.toLowerCase();
}
Map<String, String> members = new HashMap<String, String>(32);
List<SiteMemberInfo> members = new ArrayList<SiteMemberInfo>(32);
QName siteType = directNodeService.getType(siteNodeRef);
Set<String> permissions = this.permissionService.getSettablePermissions(siteType);
Map<String, String> groupsToExpand = new HashMap<String, String>(32);
AUTHORITY_FIND: for (String permission : permissions)
{
if (roleFilter == null || roleFilter.length() == 0 || roleFilter.equals(permission))
@@ -1551,68 +1593,68 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic
{
switch (AuthorityType.getAuthorityType(authority))
{
case USER:
boolean addUser = true;
if (nameFilter != null && nameFilter.length() != 0 && !nameFilter.equals(authority))
{
// found a filter - does it match person first/last name?
addUser = matchPerson(nameFilters, authority);
}
if (addUser)
{
// Add the user and their permission to the returned map
members.put(authority, permission);
// break on max size limit reached
if (members.size() == size) break AUTHORITY_FIND;
}
break;
case GROUP:
if (collapseGroups)
{
if (!groupsToExpand.containsKey(authority))
case USER:
boolean addUser = true;
if (nameFilter != null && nameFilter.length() != 0 && !nameFilter.equals(authority))
{
groupsToExpand.put(authority, permission);
// found a filter - does it match person first/last name?
addUser = matchPerson(nameFilters, authority);
}
}
else
{
if (nameFilter != null && nameFilter.length() != 0)
if (addUser)
{
// found a filter - does it match Group name part?
if (matchByFilter(authority.substring(GROUP_PREFIX_LENGTH).toLowerCase(), nameFilterLower))
// Add the user and their permission to the returned map
members.add(new SiteMemberInfoImpl(authority, permission, false));
// break on max size limit reached
if (members.size() == size) break AUTHORITY_FIND;
}
break;
case GROUP:
if (collapseGroups)
{
if (!groupsToExpand.containsKey(authority))
{
members.put(authority, permission);
}
else
{
// Does it match on the Group Display Name part instead?
String displayName = authorityService.getAuthorityDisplayName(authority);
if(displayName != null && matchByFilter(displayName.toLowerCase(), nameFilterLower))
{
members.put(authority, permission);
}
groupsToExpand.put(authority, permission);
}
}
else
{
// No name filter add this group
members.put(authority, permission);
if (nameFilter != null && nameFilter.length() != 0)
{
// found a filter - does it match Group name part?
if (matchByFilter(authority.substring(GROUP_PREFIX_LENGTH).toLowerCase(), nameFilterLower))
{
members.add(new SiteMemberInfoImpl(authority, permission, false));
}
else
{
// Does it match on the Group Display Name part instead?
String displayName = authorityService.getAuthorityDisplayName(authority);
if (displayName != null && matchByFilter(displayName.toLowerCase(), nameFilterLower))
{
members.add(new SiteMemberInfoImpl(authority, permission, false));
}
}
}
else
{
// No name filter add this group
members.add(new SiteMemberInfoImpl(authority, permission, false));
}
// break on max size limit reached
if (members.size() == size) break AUTHORITY_FIND;
}
// break on max size limit reached
if (members.size() == size) break AUTHORITY_FIND;
}
break;
break;
}
}
}
}
if (collapseGroups)
{
for (Map.Entry<String,String> entry : groupsToExpand.entrySet())
{
for (Map.Entry<String, String> entry : groupsToExpand.entrySet())
{
Set<String> subUsers = this.authorityService.getContainedAuthorities(AuthorityType.USER, entry.getKey(), false);
for (String subUser : subUsers)
{
@@ -1624,19 +1666,19 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic
}
if (addUser)
{
// Add the collapsed user into the members list if they do not already appear in the list
if (members.containsKey(subUser) == false)
SiteMemberInfo memberInfo = new SiteMemberInfoImpl(subUser,entry.getValue(), true);
// Add the collapsed user into the members list if they do not already appear in the list
if (members.contains(memberInfo) == false)
{
members.put(subUser, entry.getValue());
members.add(memberInfo);
}
// break on max size limit reached
if (members.size() == size) break;
}
}
}
}
}
return members;
}

View File

@@ -61,6 +61,7 @@ import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteMemberInfo;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.site.SiteVisibility;
import org.alfresco.service.cmr.tagging.TaggingService;
@@ -2180,4 +2181,59 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest
this.scriptService.executeScript(location, model);
}
public void testListMembersInfo()
{
String siteShortName = "testMemberInfo";
// Create a site as user one
this.siteService.createSite(TEST_SITE_PRESET, siteShortName, TEST_TITLE, TEST_DESCRIPTION,
SiteVisibility.PRIVATE);
// Get the members of the site and check that user one is a manager
List<SiteMemberInfo> members = this.siteService.listMembersInfo(siteShortName, null, null, 0, false);
assertNotNull(members);
assertEquals(1, members.size());
SiteMemberInfo user = members.get(0);
assertNotNull(user);
assertTrue(user.getMemberName().equals(USER_ONE));
assertEquals(SiteModel.SITE_MANAGER, user.getMemberRole());
assertFalse("USER_ONE is NOT member of any group", user.isMemberOfGroup());
// GROUP_TWO - USER_TWO, USER_THREE
this.siteService.setMembership(siteShortName, this.groupTwo, SiteModel.SITE_COLLABORATOR);
this.siteService.setMembership(siteShortName, USER_FOUR, SiteModel.SITE_CONSUMER);
// Get the members of the site in expanded list
members = this.siteService.listMembersInfo(siteShortName, null, null, 0, true);
assertNotNull(members);
assertEquals(4, members.size());
// Get USER_TWO who is a member of group two
user = lookupMemberInfoByUserName(members, USER_TWO);
assertNotNull(user);
assertEquals(SiteModel.SITE_COLLABORATOR, user.getMemberRole());
assertTrue("USER_TWO is member of group two", user.isMemberOfGroup());
// Get USER_THREE who is a member of group two
user = lookupMemberInfoByUserName(members, USER_THREE);
assertNotNull(user);
assertEquals(SiteModel.SITE_COLLABORATOR, user.getMemberRole());
assertTrue("USER_THREE is member of group two", user.isMemberOfGroup());
// Get USER_FOUR
user = lookupMemberInfoByUserName(members, USER_FOUR);
assertNotNull(user);
assertEquals(SiteModel.SITE_CONSUMER, user.getMemberRole());
assertFalse("USER_FOUR is NOT member of any group", user.isMemberOfGroup());
}
private SiteMemberInfo lookupMemberInfoByUserName(List<SiteMemberInfo> members, String name)
{
for (SiteMemberInfo info : members)
{
if (name.equals(info.getMemberName()))
{
return info;
}
}
return null;
}
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.service.cmr.site;
/**
* Site member's information. The member can either be an individual or a group.
*
* @author Jamal Kaabi-Mofrad
* @since odin
*/
public interface SiteMemberInfo
{
/**
* Get the member's name. The name can either be the name of an individual
* or a group
*
* @return String member's name
*/
public String getMemberName();
/**
* Get the member's role
*
* @return String member's role
*/
public String getMemberRole();
/**
* Indicates whether a member belongs to a group with access rights to the
* site or not
*
* @return <tt>true</tt> if the member belongs to a group with access
* rights, otherwise <tt>false</tt>
*/
public boolean isMemberOfGroup();
}

View File

@@ -246,6 +246,21 @@ public interface SiteService
@NotAuditable
Map<String, String> listMembers(String shortName, String nameFilter, String roleFilter, int size, boolean collapseGroups);
/**
* List the members of the site. This includes both users and groups if collapseGroups is set to false, otherwise all
* groups that are members are collapsed into their component users and listed.
*
*
* @param shortName site short name
* @param nameFilter name filter
* @param roleFilter role filter
* @param size max results size crop if >0
* @param collapseGroups true if collapse member groups into user list, false otherwise
* @return List of site authorities information objects
*/
@NotAuditable
List<SiteMemberInfo> listMembersInfo(String shortName, String nameFilter, String roleFilter, int size, boolean collapseGroups);
/**
* Gets the role of the specified user.
*