mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-09 06:55:47 +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.Provider;
|
||||||
import com.google.inject.Singleton;
|
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.SearchResult;
|
||||||
import sonia.scm.api.rest.SearchResults;
|
import sonia.scm.api.rest.SearchResults;
|
||||||
|
import sonia.scm.cache.Cache;
|
||||||
|
import sonia.scm.cache.CacheManager;
|
||||||
import sonia.scm.search.SearchRequest;
|
import sonia.scm.search.SearchRequest;
|
||||||
import sonia.scm.user.User;
|
import sonia.scm.user.User;
|
||||||
|
import sonia.scm.user.UserListener;
|
||||||
import sonia.scm.user.UserManager;
|
import sonia.scm.user.UserManager;
|
||||||
import sonia.scm.util.SecurityUtil;
|
import sonia.scm.util.SecurityUtil;
|
||||||
import sonia.scm.util.Util;
|
import sonia.scm.util.Util;
|
||||||
@@ -55,7 +62,6 @@ import sonia.scm.web.security.WebSecurityContext;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.QueryParam;
|
import javax.ws.rs.QueryParam;
|
||||||
import javax.ws.rs.WebApplicationException;
|
import javax.ws.rs.WebApplicationException;
|
||||||
@@ -67,26 +73,52 @@ import javax.ws.rs.core.Response.Status;
|
|||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
@Path("search")
|
@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 ...
|
* Constructs ...
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @param securityContextProvider
|
* @param securityContextProvider
|
||||||
* @param userManager
|
* @param userManager
|
||||||
|
* @param cacheManager
|
||||||
*/
|
*/
|
||||||
@Inject
|
@Inject
|
||||||
public SearchResource(Provider<WebSecurityContext> securityContextProvider,
|
public SearchResource(Provider<WebSecurityContext> securityContextProvider,
|
||||||
UserManager userManager)
|
UserManager userManager, CacheManager cacheManager)
|
||||||
{
|
{
|
||||||
this.securityContextProvider = securityContextProvider;
|
this.securityContextProvider = securityContextProvider;
|
||||||
this.userManager = userManager;
|
this.userManager = userManager;
|
||||||
|
this.userManager.addListener(this);
|
||||||
|
this.userSearchCache = cacheManager.getCache(String.class,
|
||||||
|
SearchResults.class, CACHE_USER);
|
||||||
}
|
}
|
||||||
|
|
||||||
//~--- methods --------------------------------------------------------------
|
//~--- methods --------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method description
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param user
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onEvent(User user, HandlerEvent event)
|
||||||
|
{
|
||||||
|
userSearchCache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method description
|
* Method description
|
||||||
*
|
*
|
||||||
@@ -106,28 +138,38 @@ public class SearchResource
|
|||||||
throw new WebApplicationException(Status.BAD_REQUEST);
|
throw new WebApplicationException(Status.BAD_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchRequest request = new SearchRequest(queryString, true);
|
SearchResults result = userSearchCache.get(queryString);
|
||||||
|
|
||||||
request.setMaxResults(5);
|
if (result == null)
|
||||||
|
|
||||||
Collection<User> users = userManager.search(request);
|
|
||||||
SearchResults result = new SearchResults();
|
|
||||||
|
|
||||||
if (Util.isNotEmpty(users))
|
|
||||||
{
|
{
|
||||||
Collection<SearchResult> resultCollection = Collections2.transform(users,
|
SearchRequest request = new SearchRequest(queryString, true);
|
||||||
new Function<User,
|
|
||||||
SearchResult>()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public SearchResult apply(User user)
|
|
||||||
{
|
|
||||||
return new SearchResult(user.getName(), user.getDisplayName());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
result.setSuccess(true);
|
request.setMaxResults(5);
|
||||||
result.setResults(resultCollection);
|
|
||||||
|
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;
|
return result;
|
||||||
@@ -140,4 +182,7 @@ public class SearchResource
|
|||||||
|
|
||||||
/** Field description */
|
/** Field description */
|
||||||
private UserManager userManager;
|
private UserManager userManager;
|
||||||
|
|
||||||
|
/** Field description */
|
||||||
|
private Cache<String, SearchResults> userSearchCache;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -335,6 +335,11 @@ public class XmlUserManager extends AbstractUserManager
|
|||||||
@Override
|
@Override
|
||||||
public Collection<User> search(final SearchRequest searchRequest)
|
public Collection<User> search(final SearchRequest searchRequest)
|
||||||
{
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
{
|
||||||
|
logger.debug("search user with query {}", searchRequest.getQuery());
|
||||||
|
}
|
||||||
|
|
||||||
List<User> users = new ArrayList<User>();
|
List<User> users = new ArrayList<User>();
|
||||||
int index = 0;
|
int index = 0;
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
|
|||||||
@@ -90,10 +90,10 @@
|
|||||||
<defaultCache
|
<defaultCache
|
||||||
maxElementsInMemory="20000"
|
maxElementsInMemory="20000"
|
||||||
eternal="false"
|
eternal="false"
|
||||||
overflowToDisk="true"
|
overflowToDisk="false"
|
||||||
timeToIdleSeconds="1200"
|
timeToIdleSeconds="1200"
|
||||||
timeToLiveSeconds="2400"
|
timeToLiveSeconds="2400"
|
||||||
diskPersistent="true"
|
diskPersistent="false"
|
||||||
diskExpiryThreadIntervalSeconds="2400"
|
diskExpiryThreadIntervalSeconds="2400"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@@ -107,17 +107,6 @@
|
|||||||
diskPersistent="false"
|
diskPersistent="false"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<cache
|
|
||||||
name="sonia.cache.repository"
|
|
||||||
maxElementsInMemory="20000"
|
|
||||||
eternal="false"
|
|
||||||
overflowToDisk="true"
|
|
||||||
timeToIdleSeconds="1200"
|
|
||||||
timeToLiveSeconds="2400"
|
|
||||||
diskPersistent="false"
|
|
||||||
diskExpiryThreadIntervalSeconds="2400"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<cache
|
<cache
|
||||||
name="sonia.cache.plugins"
|
name="sonia.cache.plugins"
|
||||||
maxElementsInMemory="10"
|
maxElementsInMemory="10"
|
||||||
@@ -127,4 +116,13 @@
|
|||||||
diskPersistent="false"
|
diskPersistent="false"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<cache
|
||||||
|
name="sonia.cache.search.users"
|
||||||
|
maxElementsInMemory="10000"
|
||||||
|
eternal="false"
|
||||||
|
overflowToDisk="false"
|
||||||
|
timeToLiveSeconds="5400"
|
||||||
|
diskPersistent="false"
|
||||||
|
/>
|
||||||
|
|
||||||
</ehcache>
|
</ehcache>
|
||||||
|
|||||||
Reference in New Issue
Block a user