From b81610a9f3ba642aa8029503eb5f2ce12ebd169a Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sat, 12 Feb 2011 11:24:08 +0100 Subject: [PATCH] cache user search results --- .../api/rest/resources/SearchResource.java | 89 ++++++++++++++----- .../sonia/scm/user/xml/XmlUserManager.java | 5 ++ .../src/main/resources/config/ehcache.xml | 24 +++-- 3 files changed, 83 insertions(+), 35 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java index c4af39a38b..50b6f07efc 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SearchResource.java @@ -41,10 +41,17 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.HandlerEvent; import sonia.scm.api.rest.SearchResult; import sonia.scm.api.rest.SearchResults; +import sonia.scm.cache.Cache; +import sonia.scm.cache.CacheManager; import sonia.scm.search.SearchRequest; import sonia.scm.user.User; +import sonia.scm.user.UserListener; import sonia.scm.user.UserManager; import sonia.scm.util.SecurityUtil; import sonia.scm.util.Util; @@ -55,7 +62,6 @@ import sonia.scm.web.security.WebSecurityContext; import java.util.Collection; import javax.ws.rs.GET; -import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; @@ -67,26 +73,52 @@ import javax.ws.rs.core.Response.Status; */ @Singleton @Path("search") -public class SearchResource +public class SearchResource implements UserListener { + /** Field description */ + public static final String CACHE_USER = "sonia.cache.search.users"; + + /** the logger for SearchResource */ + private static final Logger logger = + LoggerFactory.getLogger(SearchResource.class); + + //~--- constructors --------------------------------------------------------- + /** * Constructs ... * * * @param securityContextProvider * @param userManager + * @param cacheManager */ @Inject public SearchResource(Provider securityContextProvider, - UserManager userManager) + UserManager userManager, CacheManager cacheManager) { this.securityContextProvider = securityContextProvider; this.userManager = userManager; + this.userManager.addListener(this); + this.userSearchCache = cacheManager.getCache(String.class, + SearchResults.class, CACHE_USER); } //~--- methods -------------------------------------------------------------- + /** + * Method description + * + * + * @param user + * @param event + */ + @Override + public void onEvent(User user, HandlerEvent event) + { + userSearchCache.clear(); + } + /** * Method description * @@ -106,28 +138,38 @@ public class SearchResource throw new WebApplicationException(Status.BAD_REQUEST); } - SearchRequest request = new SearchRequest(queryString, true); + SearchResults result = userSearchCache.get(queryString); - request.setMaxResults(5); - - Collection users = userManager.search(request); - SearchResults result = new SearchResults(); - - if (Util.isNotEmpty(users)) + if (result == null) { - Collection resultCollection = Collections2.transform(users, - new Function() - { - @Override - public SearchResult apply(User user) - { - return new SearchResult(user.getName(), user.getDisplayName()); - } - }); + SearchRequest request = new SearchRequest(queryString, true); - result.setSuccess(true); - result.setResults(resultCollection); + request.setMaxResults(5); + + Collection users = userManager.search(request); + + result = new SearchResults(); + + if (Util.isNotEmpty(users)) + { + Collection resultCollection = + Collections2.transform(users, new Function() + { + @Override + public SearchResult apply(User user) + { + return new SearchResult(user.getName(), user.getDisplayName()); + } + }); + + result.setSuccess(true); + result.setResults(resultCollection); + userSearchCache.put(queryString, result); + } + } + else if (logger.isDebugEnabled()) + { + logger.debug("return searchresults for {} from cache", queryString); } return result; @@ -140,4 +182,7 @@ public class SearchResource /** Field description */ private UserManager userManager; + + /** Field description */ + private Cache userSearchCache; } diff --git a/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java b/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java index 76dbceba06..bd65b54dbc 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java +++ b/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java @@ -335,6 +335,11 @@ public class XmlUserManager extends AbstractUserManager @Override public Collection search(final SearchRequest searchRequest) { + if (logger.isDebugEnabled()) + { + logger.debug("search user with query {}", searchRequest.getQuery()); + } + List users = new ArrayList(); int index = 0; int counter = 0; diff --git a/scm-webapp/src/main/resources/config/ehcache.xml b/scm-webapp/src/main/resources/config/ehcache.xml index f47b41bb79..34562f56ff 100644 --- a/scm-webapp/src/main/resources/config/ehcache.xml +++ b/scm-webapp/src/main/resources/config/ehcache.xml @@ -90,10 +90,10 @@ @@ -107,17 +107,6 @@ diskPersistent="false" /> - - + +