/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive;
import org.ldaptive.cache.Cache;
import org.ldaptive.handler.OperationExceptionHandler;
import org.ldaptive.handler.OperationResponseHandler;
import org.ldaptive.handler.SearchEntryHandler;
/**
* Helper class which encapsulates the try, finally idiom used to execute a {@link SearchOperation}. This is a
* convenience class for searching if you don't need to manage individual connections. In addition, this class provides
* a way to hold common search request properties constant while changing properties that tend to be more dynamic.
*
* @author Middleware Services
*/
public class SearchExecutor extends SearchRequest
{
/** Handler to handle search exceptions. */
private OperationExceptionHandler<SearchRequest, SearchResult> searchExceptionHandler;
/** Handlers to handle search responses. */
private OperationResponseHandler<SearchRequest, SearchResult>[] searchResponseHandlers;
/** Cache to use when performing searches. */
private Cache<SearchRequest> searchCache;
/**
* Returns the search exception handler.
*
* @return search exception handler
*/
public OperationExceptionHandler<SearchRequest, SearchResult> getSearchExceptionHandler()
{
return searchExceptionHandler;
}
/**
* Sets the search exception handler.
*
* @param handler search exception handler
*/
public void setSearchExceptionHandler(final OperationExceptionHandler<SearchRequest, SearchResult> handler)
{
searchExceptionHandler = handler;
}
/**
* Returns the search response handlers.
*
* @return search response handlers
*/
public OperationResponseHandler<SearchRequest, SearchResult>[] getSearchResponseHandlers()
{
return searchResponseHandlers;
}
/**
* Sets the search response handlers.
*
* @param handlers search response handlers
*/
@SuppressWarnings("unchecked")
public void setSearchResponseHandlers(final OperationResponseHandler<SearchRequest, SearchResult>... handlers)
{
searchResponseHandlers = handlers;
}
/**
* Returns the search cache.
*
* @return cache
*/
public Cache<SearchRequest> getSearchCache()
{
return searchCache;
}
/**
* Sets the search cache.
*
* @param cache to set
*/
public void setSearchCache(final Cache<SearchRequest> cache)
{
searchCache = cache;
}
/**
* Performs a search operation with the supplied connection factory.
*
* @param factory to get a connection from
*
* @return search result
*
* @throws LdapException if the search fails
*/
public Response<SearchResult> search(final ConnectionFactory factory)
throws LdapException
{
return search(factory, null, null, (SearchEntryHandler[]) null);
}
/**
* Performs a search operation with the supplied connection factory.
*
* @param factory to get a connection from
* @param filter to search with
*
* @return search result
*
* @throws LdapException if the search fails
*/
public Response<SearchResult> search(final ConnectionFactory factory, final String filter)
throws LdapException
{
return search(factory, new SearchFilter(filter), null, (SearchEntryHandler[]) null);
}
/**
* Performs a search operation with the supplied connection factory.
*
* @param factory to get a connection from
* @param filter to search with
*
* @return search result
*
* @throws LdapException if the search fails
*/
public Response<SearchResult> search(final ConnectionFactory factory, final SearchFilter filter)
throws LdapException
{
return search(factory, filter, null, (SearchEntryHandler[]) null);
}
/**
* Performs a search operation with the supplied connection factory.
*
* @param factory to get a connection from
* @param filter to search with
* @param attrs to return
*
* @return search result
*
* @throws LdapException if the search fails
*/
public Response<SearchResult> search(final ConnectionFactory factory, final String filter, final String... attrs)
throws LdapException
{
return search(factory, new SearchFilter(filter), attrs, (SearchEntryHandler[]) null);
}
/**
* Performs a search operation with the supplied connection factory.
*
* @param factory to get a connection from
* @param filter to search with
* @param attrs to return
*
* @return search result
*
* @throws LdapException if the search fails
*/
public Response<SearchResult> search(
final ConnectionFactory factory,
final SearchFilter filter,
final String... attrs)
throws LdapException
{
return search(factory, filter, attrs, (SearchEntryHandler[]) null);
}
/**
* Performs a search operation with the supplied connection factory.
*
* @param factory to get a connection from
* @param filter to search with
* @param attrs to return
* @param handlers entry handlers
*
* @return search result
*
* @throws LdapException if the search fails
*/
public Response<SearchResult> search(
final ConnectionFactory factory,
final SearchFilter filter,
final String[] attrs,
final SearchEntryHandler... handlers)
throws LdapException
{
Response<SearchResult> response;
try (Connection conn = factory.getConnection()) {
conn.open();
final SearchOperation op = new SearchOperation(conn);
if (searchExceptionHandler != null) {
op.setOperationExceptionHandler(searchExceptionHandler);
}
if (searchResponseHandlers != null) {
op.setOperationResponseHandlers(searchResponseHandlers);
}
if (searchCache != null) {
op.setCache(searchCache);
}
final SearchRequest sr = newSearchRequest(this);
if (filter != null) {
sr.setSearchFilter(filter);
}
if (attrs != null) {
sr.setReturnAttributes(attrs);
}
if (handlers != null) {
sr.setSearchEntryHandlers(handlers);
}
response = op.execute(sr);
}
return response;
}
}