mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-09 15:05:44 +01:00
cache user search results
This commit is contained in:
@@ -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<WebSecurityContext> 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<User> users = userManager.search(request);
|
||||
SearchResults result = new SearchResults();
|
||||
|
||||
if (Util.isNotEmpty(users))
|
||||
if (result == null)
|
||||
{
|
||||
Collection<SearchResult> resultCollection = Collections2.transform(users,
|
||||
new Function<User,
|
||||
SearchResult>()
|
||||
{
|
||||
@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<User> users = userManager.search(request);
|
||||
|
||||
result = new SearchResults();
|
||||
|
||||
if (Util.isNotEmpty(users))
|
||||
{
|
||||
Collection<SearchResult> resultCollection =
|
||||
Collections2.transform(users, new Function<User, SearchResult>()
|
||||
{
|
||||
@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<String, SearchResults> userSearchCache;
|
||||
}
|
||||
|
||||
@@ -335,6 +335,11 @@ public class XmlUserManager extends AbstractUserManager
|
||||
@Override
|
||||
public Collection<User> search(final SearchRequest searchRequest)
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("search user with query {}", searchRequest.getQuery());
|
||||
}
|
||||
|
||||
List<User> users = new ArrayList<User>();
|
||||
int index = 0;
|
||||
int counter = 0;
|
||||
|
||||
@@ -90,10 +90,10 @@
|
||||
<defaultCache
|
||||
maxElementsInMemory="20000"
|
||||
eternal="false"
|
||||
overflowToDisk="true"
|
||||
overflowToDisk="false"
|
||||
timeToIdleSeconds="1200"
|
||||
timeToLiveSeconds="2400"
|
||||
diskPersistent="true"
|
||||
diskPersistent="false"
|
||||
diskExpiryThreadIntervalSeconds="2400"
|
||||
/>
|
||||
|
||||
@@ -107,17 +107,6 @@
|
||||
diskPersistent="false"
|
||||
/>
|
||||
|
||||
<cache
|
||||
name="sonia.cache.repository"
|
||||
maxElementsInMemory="20000"
|
||||
eternal="false"
|
||||
overflowToDisk="true"
|
||||
timeToIdleSeconds="1200"
|
||||
timeToLiveSeconds="2400"
|
||||
diskPersistent="false"
|
||||
diskExpiryThreadIntervalSeconds="2400"
|
||||
/>
|
||||
|
||||
<cache
|
||||
name="sonia.cache.plugins"
|
||||
maxElementsInMemory="10"
|
||||
@@ -127,4 +116,13 @@
|
||||
diskPersistent="false"
|
||||
/>
|
||||
|
||||
<cache
|
||||
name="sonia.cache.search.users"
|
||||
maxElementsInMemory="10000"
|
||||
eternal="false"
|
||||
overflowToDisk="false"
|
||||
timeToLiveSeconds="5400"
|
||||
diskPersistent="false"
|
||||
/>
|
||||
|
||||
</ehcache>
|
||||
|
||||
Reference in New Issue
Block a user