From 292af56c15e22cc194e0358dfb19109084f8c5e0 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 13 Jun 2011 14:13:37 +0000 Subject: [PATCH] ALF-8968 - De-Lucene DeleteUser, Users and AddUsers JSF dialogs, which now use the person service finder git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@28368 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../web/bean/groups/AddUsersDialog.java | 31 ++++------- .../web/bean/users/DeleteUserDialog.java | 52 ++++++++----------- .../alfresco/web/bean/users/UsersDialog.java | 39 +++++--------- .../org/alfresco/web/ui/common/Utils.java | 45 ++++++++++++++++ 4 files changed, 92 insertions(+), 75 deletions(-) diff --git a/source/java/org/alfresco/web/bean/groups/AddUsersDialog.java b/source/java/org/alfresco/web/bean/groups/AddUsersDialog.java index 45915e6537..c1e1d1df84 100644 --- a/source/java/org/alfresco/web/bean/groups/AddUsersDialog.java +++ b/source/java/org/alfresco/web/bean/groups/AddUsersDialog.java @@ -31,14 +31,13 @@ import javax.faces.model.SelectItem; import javax.transaction.UserTransaction; import org.alfresco.model.ContentModel; -import org.alfresco.repo.search.impl.lucene.AbstractLuceneQueryParser; +import org.alfresco.query.PagingRequest; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.search.ResultSet; -import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.AuthorityService; +import org.alfresco.service.cmr.security.PagingPersonResults; import org.alfresco.service.cmr.security.PersonService; import org.alfresco.web.app.Application; import org.alfresco.web.bean.dialog.BaseDialogBean; @@ -203,25 +202,17 @@ public class AddUsersDialog extends BaseDialogBean { SelectItem[] items = new SelectItem[0]; - // Use lucene search to retrieve user details - String term = AbstractLuceneQueryParser.escape(contains.trim()); + // Use the Person Service to retrieve user details + String term = contains.trim(); if (term.length() != 0) { - StringBuilder query = new StringBuilder(128); - Utils.generatePersonSearch(query, term); - List nodes; - ResultSet resultSet = Repository.getServiceRegistry(context).getSearchService().query( - Repository.getStoreRef(), - SearchService.LANGUAGE_LUCENE, - query.toString()); - try - { - nodes = resultSet.getNodeRefs(); - } - finally - { - resultSet.close(); - } + PagingPersonResults people = getPersonService().getPeople( + Utils.generatePersonFilter(contains.trim()), + true, + Utils.generatePersonSort(), + new PagingRequest(Utils.getPersonMaxResults(), null) + ); + List nodes = people.getPage(); ArrayList itemList = new ArrayList(nodes.size()); for (NodeRef personRef : nodes) diff --git a/source/java/org/alfresco/web/bean/users/DeleteUserDialog.java b/source/java/org/alfresco/web/bean/users/DeleteUserDialog.java index f5cd90c607..b88e7aea9a 100644 --- a/source/java/org/alfresco/web/bean/users/DeleteUserDialog.java +++ b/source/java/org/alfresco/web/bean/users/DeleteUserDialog.java @@ -28,14 +28,16 @@ import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; import javax.transaction.UserTransaction; +import org.alfresco.model.ContentModel; +import org.alfresco.query.PagingRequest; import org.alfresco.service.cmr.repository.InvalidNodeRefException; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.search.ResultSet; -import org.alfresco.service.cmr.search.SearchParameters; -import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.AuthenticationService; +import org.alfresco.service.cmr.security.PagingPersonResults; import org.alfresco.service.cmr.security.PersonService; +import org.alfresco.service.namespace.QName; import org.alfresco.util.ISO9075; +import org.alfresco.util.Pair; import org.alfresco.web.app.Application; import org.alfresco.web.bean.dialog.BaseDialogBean; import org.alfresco.web.bean.repository.MapNode; @@ -122,36 +124,28 @@ public class DeleteUserDialog extends BaseDialogBean // define the query to find people by their first or last name String search = ISO9075.encode(this.searchCriteria); - String query = "( TYPE:\"{http://www.alfresco.org/model/content/1.0}person\") AND " + "((@\\{http\\://www.alfresco.org/model/content/1.0\\}firstName:" + search - + "*) OR (@\\{http\\://www.alfresco.org/model/content/1.0\\}lastName:" + search + "*) OR (@\\{http\\://www.alfresco.org/model/content/1.0\\}userName:" + search - + "*)))"; - - if (logger.isDebugEnabled()) - logger.debug("Query: " + query); - - // define the search parameters - SearchParameters params = new SearchParameters(); - params.setLanguage(SearchService.LANGUAGE_LUCENE); - params.addStore(Repository.getStoreRef()); - params.setQuery(query); - - ResultSet results = this.getSearchService().query(params); - List people; - try - { - people = results.getNodeRefs(); - } - finally - { - results.close(); - } + List> filter = new ArrayList>(); + filter.add(new Pair(ContentModel.PROP_FIRSTNAME, search)); + filter.add(new Pair(ContentModel.PROP_LASTNAME, search)); if (logger.isDebugEnabled()) - logger.debug("Found " + people.size() + " users"); + logger.debug("Query filter: " + filter); - this.users = new ArrayList(people.size()); + // Perform the search + PagingPersonResults people = getPersonService().getPeople( + filter, + true, + Utils.generatePersonSort(), + new PagingRequest(Utils.getPersonMaxResults(), null) + ); + List nodes = people.getPage(); + + if (logger.isDebugEnabled()) + logger.debug("Found " + nodes.size() + " users"); - for (NodeRef nodeRef : people) + this.users = new ArrayList(nodes.size()); + + for (NodeRef nodeRef : nodes) { // create our Node representation MapNode node = new MapNode(nodeRef); diff --git a/source/java/org/alfresco/web/bean/users/UsersDialog.java b/source/java/org/alfresco/web/bean/users/UsersDialog.java index f08f6d1555..ad87b52fdc 100644 --- a/source/java/org/alfresco/web/bean/users/UsersDialog.java +++ b/source/java/org/alfresco/web/bean/users/UsersDialog.java @@ -30,11 +30,10 @@ import javax.faces.event.ActionEvent; import javax.transaction.UserTransaction; import org.alfresco.model.ContentModel; +import org.alfresco.query.PagingRequest; import org.alfresco.service.cmr.repository.InvalidNodeRefException; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.search.ResultSet; -import org.alfresco.service.cmr.search.SearchParameters; -import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.service.cmr.security.PagingPersonResults; import org.alfresco.service.namespace.QName; import org.alfresco.web.app.Application; import org.alfresco.web.app.context.IContextListener; @@ -296,35 +295,23 @@ public class UsersDialog extends BaseDialogBean implements IContextListener, Cha // define the query to find people by their first or last name String search = properties.getSearchCriteria(); - StringBuilder query = new StringBuilder(128); - Utils.generatePersonSearch(query, search); - if (logger.isDebugEnabled()) - logger.debug("Query: " + query.toString()); + logger.debug("Query term: " + search); - // define the search parameters - SearchParameters params = new SearchParameters(); - params.setLanguage(SearchService.LANGUAGE_LUCENE); - params.addStore(Repository.getStoreRef()); - params.setQuery(query.toString()); - - ResultSet results = properties.getSearchService().query(params); - List people; - try - { - people = results.getNodeRefs(); - } - finally - { - results.close(); - } + PagingPersonResults people = properties.getPersonService().getPeople( + Utils.generatePersonFilter(search), + true, + Utils.generatePersonSort(), + new PagingRequest(Utils.getPersonMaxResults(), null) + ); + List nodes = people.getPage(); if (logger.isDebugEnabled()) - logger.debug("Found " + people.size() + " users"); + logger.debug("Found " + nodes.size() + " users"); - this.users = new ArrayList(people.size()); + this.users = new ArrayList(nodes.size()); - for (NodeRef nodeRef : people) + for (NodeRef nodeRef : nodes) { // create our Node representation MapNode node = new MapNode(nodeRef); diff --git a/source/java/org/alfresco/web/ui/common/Utils.java b/source/java/org/alfresco/web/ui/common/Utils.java index a550c17f8d..6cabefce9a 100644 --- a/source/java/org/alfresco/web/ui/common/Utils.java +++ b/source/java/org/alfresco/web/ui/common/Utils.java @@ -21,6 +21,7 @@ package org.alfresco.web.ui.common; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.Enumeration; @@ -61,7 +62,10 @@ import org.alfresco.service.cmr.repository.InvalidNodeRefException; import org.alfresco.service.cmr.repository.NoTransformerException; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.alfresco.util.Pair; import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.DownloadContentServlet; import org.alfresco.web.app.servlet.ExternalAccessServlet; @@ -1046,12 +1050,53 @@ public final class Utils extends StringUtils return ""; } + /** + * Generate the QName sort for a standard Person lookup. The filter is + * standardised across multiple JSF components and beans, and used with + * {@link PersonService#getPeople(List, boolean, List, org.alfresco.query.PagingRequest)} + */ + public static List> generatePersonSort() + { + List> sort = new ArrayList>(); + sort.add(new Pair(ContentModel.PROP_FIRSTNAME, true)); + sort.add(new Pair(ContentModel.PROP_LASTNAME, true)); + sort.add(new Pair(ContentModel.PROP_USERNAME, true)); + return sort; + } + + /** + * Generate the QName filter for a standard Person lookup. The filter is + * standardised across multiple JSF components and beans, and used with + * {@link PersonService#getPeople(List, boolean, List, org.alfresco.query.PagingRequest)} + * + * @param term Search term + */ + public static List> generatePersonFilter(String term) + { + List> filter = new ArrayList>(); + filter.add(new Pair(ContentModel.PROP_FIRSTNAME, term)); + filter.add(new Pair(ContentModel.PROP_LASTNAME, term)); + filter.add(new Pair(ContentModel.PROP_USERNAME, term)); + return filter; + } + + /** + * How many results should a person search return up to? This is needed + * because the JSF components do paging differently. + * For now, hard coded at 1000, may be configurable later + */ + public static int getPersonMaxResults() + { + return 1000; + } + /** * Generate the Lucene query for a standard Person search. The query used is standardised * across multiple JSF components and beans. * * @param query Buffer for the query * @param term Search term + * @deprecated Use {@link #generatePersonFilter(String)} and {@link PersonService#getPeople(List, boolean, List, org.alfresco.query.PagingRequest)} instead */ public static void generatePersonSearch(StringBuilder query, String term) {