/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.concurrent; import java.util.Collection; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.ldaptive.Connection; import org.ldaptive.ConnectionFactory; import org.ldaptive.LdapException; import org.ldaptive.Response; import org.ldaptive.SearchFilter; import org.ldaptive.SearchOperation; import org.ldaptive.SearchRequest; import org.ldaptive.SearchResult; import org.ldaptive.handler.SearchEntryHandler; /** * Executes a list of search filters in parallel. This implementation executes each search on the same connection in * separate threads. If you need parallel searches over a pool of connections see {@link ParallelPooledSearchExecutor}. * A cached thread pool is used by default. * * @author Middleware Services */ public class ParallelSearchExecutor extends AbstractParallelSearchExecutor<ConnectionFactory> { /** Default constructor. */ public ParallelSearchExecutor() { this(Executors.newCachedThreadPool()); } /** * Creates a new parallel search executor. * * @param es executor service */ public ParallelSearchExecutor(final ExecutorService es) { super(es); } @Override public Collection<Response<SearchResult>> search( final ConnectionFactory factory, final SearchFilter[] filters, final String[] attrs, final SearchEntryHandler... handlers) throws LdapException { Collection<Response<SearchResult>> response; try (Connection conn = factory.getConnection()) { conn.open(); final SearchOperation op = createSearchOperation(conn); final SearchOperationWorker worker = new SearchOperationWorker(op, getExecutorService()); final SearchRequest[] sr = new SearchRequest[filters.length]; for (int i = 0; i < filters.length; i++) { sr[i] = newSearchRequest(this); if (filters[i] != null) { sr[i].setSearchFilter(filters[i]); } if (attrs != null) { sr[i].setReturnAttributes(attrs); } if (handlers != null) { sr[i].setSearchEntryHandlers(handlers); } } response = worker.executeToCompletion(sr); } return response; } }