diff --git a/source/java/org/alfresco/repo/jscript/People.java b/source/java/org/alfresco/repo/jscript/People.java index 5f26f6f328..27586fc819 100644 --- a/source/java/org/alfresco/repo/jscript/People.java +++ b/source/java/org/alfresco/repo/jscript/People.java @@ -36,6 +36,7 @@ import org.alfresco.repo.security.authority.AuthorityDAO; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.search.LimitBy; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchService; @@ -304,6 +305,11 @@ public final class People extends BaseScopableProcessorExtension params.setLanguage(SearchService.LANGUAGE_LUCENE); params.addStore(this.storeRef); params.setQuery(query.toString()); + if (maxResults > 0) + { + params.setLimitBy(LimitBy.FINAL_SIZE); + params.setLimit(maxResults); + } ResultSet results = null; try @@ -325,12 +331,6 @@ public final class People extends BaseScopableProcessorExtension { people = new Object[0]; } - else if (maxResults > 0 && people.length > maxResults) - { - Object[] copy = new Object[maxResults]; - System.arraycopy(people, 0, copy, 0, maxResults); - people = copy; - } return Context.getCurrentContext().newArray(getScope(), people); } diff --git a/source/java/org/alfresco/repo/site/SiteServiceImpl.java b/source/java/org/alfresco/repo/site/SiteServiceImpl.java index e6b1ff9751..3e65560f3f 100644 --- a/source/java/org/alfresco/repo/site/SiteServiceImpl.java +++ b/source/java/org/alfresco/repo/site/SiteServiceImpl.java @@ -82,6 +82,9 @@ public class SiteServiceImpl implements SiteService, SiteModel /** Activity tool */ private static final String ACTIVITY_TOOL = "siteService"; + + private static final String SITE_PREFIX = "site_"; + private static final int GROUP_PREFIX_LENGTH = SITE_PREFIX.length() + PermissionService.GROUP_PREFIX.length(); private String sitesXPath; @@ -402,8 +405,7 @@ public class SiteServiceImpl implements SiteService, SiteModel /** * Helper method to get the name of the site group * - * @param shortName - * site short name + * @param shortName site short name * @return String site group name */ public String getSiteGroup(String shortName, boolean withGroupPrefix) @@ -413,7 +415,7 @@ public class SiteServiceImpl implements SiteService, SiteModel { sb.append(PermissionService.GROUP_PREFIX); } - sb.append("site_"); + sb.append(SITE_PREFIX); sb.append(shortName); return sb.toString(); } @@ -421,14 +423,11 @@ public class SiteServiceImpl implements SiteService, SiteModel /** * Helper method to get the name of the site permission group * - * @param shortName - * site short name - * @param permission - * permission name + * @param shortName site short name + * @param permission permission name * @return String site permission group name */ - public String getSiteRoleGroup(String shortName, String permission, - boolean withGroupPrefix) + public String getSiteRoleGroup(String shortName, String permission, boolean withGroupPrefix) { return getSiteGroup(shortName, withGroupPrefix) + "_" + permission; } @@ -436,8 +435,7 @@ public class SiteServiceImpl implements SiteService, SiteModel /** * Gets a sites parent folder based on it's short name ] * - * @param shortName - * site short name + * @param shortName site short name * @return NodeRef the site's parent */ private NodeRef getSiteParent(String shortName) @@ -739,17 +737,17 @@ public class SiteServiceImpl implements SiteService, SiteModel } /** - * @see org.alfresco.service.cmr.site.SiteService#listMembers(java.lang.String, java.lang.String, java.lang.String) + * @see org.alfresco.service.cmr.site.SiteService#listMembers(java.lang.String, java.lang.String, java.lang.String, int) */ - public Map listMembers(String shortName, String nameFilter, String roleFilter) + public Map listMembers(String shortName, String nameFilter, String roleFilter, int size) { - return listMembers(shortName, nameFilter, roleFilter, false); + return listMembers(shortName, nameFilter, roleFilter, size, false); } /** - * @see org.alfresco.service.cmr.site.SiteService#listMembers(String, String, String, boolean) + * @see org.alfresco.service.cmr.site.SiteService#listMembers(String, String, String, int, boolean) */ - public Map listMembers(String shortName, final String nameFilter, final String roleFilter, final boolean collapseGroups) + public Map listMembers(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)) @@ -761,17 +759,17 @@ public class SiteServiceImpl implements SiteService, SiteModel { public Map doWork() throws Exception { - return listMembersImpl(sName, nameFilter, roleFilter, collapseGroups); + return listMembersImpl(sName, nameFilter, roleFilter, size, collapseGroups); } }, tenantService.getDomainUser(AuthenticationUtil.getSystemUserName(), tenantDomain)); } else { - return listMembersImpl(shortName, nameFilter, roleFilter, collapseGroups); + return listMembersImpl(shortName, nameFilter, roleFilter, size, collapseGroups); } } - private Map listMembersImpl(String shortName, String nameFilter, String roleFilter, boolean collapseGroups) + private Map listMembersImpl(String shortName, String nameFilter, String roleFilter, int size, boolean collapseGroups) { NodeRef siteNodeRef = getSiteNodeRef(shortName); if (siteNodeRef == null) @@ -779,74 +777,101 @@ public class SiteServiceImpl implements SiteService, SiteModel throw new SiteServiceException(MSG_SITE_NO_EXIST, new Object[]{shortName}); } - Map members = new HashMap(23); + Map members = new HashMap(32); - Set permissions = permissionService.getSettablePermissions(SiteModel.TYPE_SITE); + Set permissions = this.permissionService.getSettablePermissions(SiteModel.TYPE_SITE); for (String permission : permissions) { - if (filterMatch(roleFilter, permission) == true) + if (roleFilter == null || roleFilter.length() == 0 || roleFilter.equals(permission)) { String groupName = getSiteRoleGroup(shortName, permission, true); Set users = this.authorityService.getContainedAuthorities(AuthorityType.USER, groupName, true); for (String user : users) { - if (filterMatch(nameFilter, user) == true) + boolean addUser = true; + if (nameFilter != null && nameFilter.length() != 0 && !nameFilter.equals(user)) + { + // found a filter - does it match person first/last name? + addUser = matchPerson(nameFilter, user); + } + if (addUser) { // Add the user and their permission to the returned map members.put(user, permission); + + // break on max size limit reached + if (members.size() == size) break; } } + Set groups = this.authorityService.getContainedAuthorities(AuthorityType.GROUP, groupName, true); for (String group : groups) { if (collapseGroups == false) - { - if (filterMatch(nameFilter, group) == true) + { + boolean addGroup = true; + if (nameFilter != null && nameFilter.length() != 0) { - // Add the group and their permission to the returned map - members.put(group, permission); - } + // found a filter - does it match Group name part? + if (group.substring(GROUP_PREFIX_LENGTH).toLowerCase().contains(nameFilter.toLowerCase())) + { + members.put(group, permission); + } + } } else { Set subUsers = this.authorityService.getContainedAuthorities(AuthorityType.USER, group, false); for (String subUser : subUsers) { - if (filterMatch(nameFilter, subUser) == true) + boolean addUser = true; + if (nameFilter != null && nameFilter.length() != 0 && !nameFilter.equals(subUser)) + { + // found a filter - does it match person first/last name? + addUser = matchPerson(nameFilter, subUser); + } + if (addUser) { // Add the collapsed user into the members list if they do not already appear in the list if (members.containsKey(subUser) == false) { members.put(subUser, permission); } + + // break on max size limit reached + if (members.size() == size) break; } } } - } } } return members; } - + /** - * Helper method to calculate whether a value matches a filter or not - * - * @param filter filter - * @param value value - * @return boolean true if the value matches the filter, false otherwise + * Helper to + * @param filter + * @param username + * @return */ - private boolean filterMatch(String filter, String value) + private boolean matchPerson(String filter, String username) { - boolean result = false; - if (filter == null || - filter.length() == 0 || - filter.equals(value) == true) + boolean addUser = false; + NodeRef personRef = this.personService.getPerson(username); + Map props = this.nodeService.getProperties(personRef); + String firstName = (String)props.get(ContentModel.PROP_FIRSTNAME); + String lastName = (String)props.get(ContentModel.PROP_LASTNAME); + if (firstName != null && firstName.toLowerCase().indexOf(filter.toLowerCase()) != -1) { - result = true; + addUser = true; } - return result; + else if (lastName != null && lastName.toLowerCase().indexOf(filter.toLowerCase()) != -1) + { + addUser = true; + } + return addUser; } /** diff --git a/source/java/org/alfresco/repo/site/SiteServiceImplTest.java b/source/java/org/alfresco/repo/site/SiteServiceImplTest.java index abfd21e73a..ff2432a40e 100644 --- a/source/java/org/alfresco/repo/site/SiteServiceImplTest.java +++ b/source/java/org/alfresco/repo/site/SiteServiceImplTest.java @@ -381,7 +381,7 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest this.siteService.createSite(TEST_SITE_PRESET, "testMembership", TEST_TITLE, TEST_DESCRIPTION, SiteVisibility.PRIVATE); // Get the members of the site and check that user one is a manager - Map members = this.siteService.listMembers("testMembership", null, null); + Map members = this.siteService.listMembers("testMembership", null, null, 0); assertNotNull(members); assertEquals(1, members.size()); assertTrue(members.containsKey(USER_ONE)); @@ -392,7 +392,7 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest this.siteService.setMembership("testMembership", USER_THREE, SiteModel.SITE_COLLABORATOR); // Get the members of the site - members = this.siteService.listMembers("testMembership", null, null); + members = this.siteService.listMembers("testMembership", null, null, 0); assertNotNull(members); assertEquals(3, members.size()); assertTrue(members.containsKey(USER_ONE)); @@ -403,14 +403,14 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest assertEquals(SiteModel.SITE_COLLABORATOR, members.get(USER_THREE)); // Get only the site managers - members = this.siteService.listMembers("testMembership", null, SiteModel.SITE_MANAGER); + members = this.siteService.listMembers("testMembership", null, SiteModel.SITE_MANAGER, 0); assertNotNull(members); assertEquals(1, members.size()); assertTrue(members.containsKey(USER_ONE)); assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE)); // Get only user two - members = this.siteService.listMembers("testMembership", USER_TWO, null); + members = this.siteService.listMembers("testMembership", USER_TWO, null, 0); assertNotNull(members); assertEquals(1, members.size()); assertTrue(members.containsKey(USER_TWO)); @@ -420,7 +420,7 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest this.siteService.setMembership("testMembership", USER_TWO, SiteModel.SITE_COLLABORATOR); // Check the members of the site - members = this.siteService.listMembers("testMembership", null, null); + members = this.siteService.listMembers("testMembership", null, null, 0); assertNotNull(members); assertEquals(3, members.size()); assertTrue(members.containsKey(USER_ONE)); @@ -434,7 +434,7 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest this.siteService.removeMembership("testMembership", USER_TWO); // Check the members of the site - members = this.siteService.listMembers("testMembership", null, null); + members = this.siteService.listMembers("testMembership", null, null, 0); assertNotNull(members); assertEquals(2, members.size()); assertTrue(members.containsKey(USER_ONE)); @@ -677,7 +677,7 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest this.siteService.createSite(TEST_SITE_PRESET, "testMembership", TEST_TITLE, TEST_DESCRIPTION, SiteVisibility.PRIVATE); // Get the members of the site and check that user one is a manager - Map members = this.siteService.listMembers("testMembership", null, null); + Map members = this.siteService.listMembers("testMembership", null, null, 0); assertNotNull(members); assertEquals(1, members.size()); assertTrue(members.containsKey(USER_ONE)); @@ -686,7 +686,7 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest // Add a group this.siteService.setMembership("testMembership", this.groupTwo, SiteModel.SITE_CONSUMER); // - is the group in the list of all members? - members = this.siteService.listMembers("testMembership", null, null); + members = this.siteService.listMembers("testMembership", null, null, 0); assertNotNull(members); assertEquals(2, members.size()); assertTrue(members.containsKey(USER_ONE)); @@ -694,7 +694,7 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest assertTrue(members.containsKey(this.groupTwo)); assertEquals(SiteModel.SITE_CONSUMER, members.get(this.groupTwo)); // - is the user in the expanded list? - members = this.siteService.listMembers("testMembership", null, null, true); + members = this.siteService.listMembers("testMembership", null, null, 0, true); assertNotNull(members); assertEquals(3, members.size()); assertTrue(members.containsKey(USER_ONE)); @@ -718,7 +718,7 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest // Add a group member as an explicit member this.siteService.setMembership("testMembership", USER_THREE, SiteModel.SITE_COLLABORATOR); // - check the explicit members list - members = this.siteService.listMembers("testMembership", null, null); + members = this.siteService.listMembers("testMembership", null, null, 0); assertNotNull(members); assertEquals(3, members.size()); assertTrue(members.containsKey(USER_ONE)); @@ -728,7 +728,7 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest assertTrue(members.containsKey(this.groupTwo)); assertEquals(SiteModel.SITE_CONSUMER, members.get(this.groupTwo)); // - check the expanded members list - members = this.siteService.listMembers("testMembership", null, null, true); + members = this.siteService.listMembers("testMembership", null, null, 0, true); assertNotNull(members); assertEquals(3, members.size()); assertTrue(members.containsKey(USER_ONE)); diff --git a/source/java/org/alfresco/repo/site/script/Site.java b/source/java/org/alfresco/repo/site/script/Site.java index 37e9c2b203..274ca67b0d 100644 --- a/source/java/org/alfresco/repo/site/script/Site.java +++ b/source/java/org/alfresco/repo/site/script/Site.java @@ -299,11 +299,13 @@ public class Site implements Serializable * * @param nameFilter user name filter * @param roleFilter user role filter + * @param size max results size crop if >0 + * * @return ScriptableHashMap list of members of site with their roles */ - public ScriptableHashMap listMembers(String nameFilter, String roleFilter) + public ScriptableHashMap listMembers(String nameFilter, String roleFilter, int size) { - Map members = this.siteService.listMembers(getShortName(), nameFilter, roleFilter); + Map members = this.siteService.listMembers(getShortName(), nameFilter, roleFilter, size); ScriptableHashMap result = new ScriptableHashMap(); result.putAll(members); diff --git a/source/java/org/alfresco/service/cmr/site/SiteService.java b/source/java/org/alfresco/service/cmr/site/SiteService.java index 77664bb6a1..a5e812c70b 100644 --- a/source/java/org/alfresco/service/cmr/site/SiteService.java +++ b/source/java/org/alfresco/service/cmr/site/SiteService.java @@ -92,9 +92,10 @@ public interface SiteService * @param shortName site short name * @param nameFilter name filter * @param roleFilter role filter + * @param size max results size crop if >0 * @return Map the authority name and their role */ - Map listMembers(String shortName, String nameFilter, String roleFilter); + Map listMembers(String shortName, String nameFilter, String roleFilter, int size); /** * List the members of the site. This includes both users and groups if collapseGroups is set to false, otherwise all @@ -103,10 +104,11 @@ public interface SiteService * @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 Map the authority name and their role */ - Map listMembers(String shortName, String nameFilter, String roleFilter, boolean collapseGroups); + Map listMembers(String shortName, String nameFilter, String roleFilter, int size, boolean collapseGroups); /** * Gets the role of the specified user.