/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.servlets;
import java.io.IOException;
import java.util.Arrays;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Queries an LDAP and returns the result in the servlet response. The following init params can be set for this
* servlet:
*
* <ul>
* <li>poolType - BLOCKING or SOFTLIMIT</li>
* <li>searchExecutorClass - fully qualified class name that implements ServletSearchExecutor</li>
* </ul>
*
* <p>All other init params will set properties on:</p>
*
* <ul>
* <li>{@link org.ldaptive.SearchRequest}</li>
* <li>{@link org.ldaptive.ConnectionConfig}</li>
* <li>{@link org.ldaptive.pool.PoolConfig}</li>
* </ul>
*
* <p>Example: http://www.server.com/Search?query=uid=dfisher If you need to pass complex queries, such as
* (&(cn=daniel*)(surname=fisher)), then the query must be form encoded. If you only want to receive a subset of
* attributes those can be specified. Example:
* http://www.server.com/Search?query=uid=dfisher&attrs=givenname&attrs=surname</p>
*
* @author Middleware Services
*/
public final class SearchServlet extends HttpServlet
{
/** Custom search executor implementation, value is {@value}. */
private static final String SEARCH_EXECUTOR_CLASS = "searchExecutorClass";
/** serial version uid. */
private static final long serialVersionUID = 3437252581014900696L;
/** Logger for this class. */
protected final Logger logger = LoggerFactory.getLogger(getClass());
/** Parses servlet requests and performs search operations. */
private ServletSearchExecutor searchExecutor;
@Override
public void init(final ServletConfig config)
throws ServletException
{
super.init(config);
final String searchExecutorClass = config.getInitParameter(SEARCH_EXECUTOR_CLASS);
if (searchExecutorClass != null) {
try {
logger.debug("Creating search executor: {}", searchExecutorClass);
searchExecutor = (ServletSearchExecutor) Class.forName(searchExecutorClass).newInstance();
} catch (Exception e) {
logger.error("Error instantiating {}", searchExecutorClass, e);
throw new IllegalStateException(e);
}
} else {
searchExecutor = new Dsmlv1ServletSearchExecutor();
}
searchExecutor.initialize(config);
}
@Override
public void service(final HttpServletRequest request, final HttpServletResponse response)
throws ServletException, IOException
{
logger.info(
"search={} for attributes={}",
request.getParameter("query"),
Arrays.toString(request.getParameterValues("attrs")));
try {
searchExecutor.search(request, response);
} catch (Exception e) {
logger.error("Error performing search", e);
throw new ServletException(e);
}
}
@Override
public void destroy()
{
try {
searchExecutor.close();
} finally {
super.destroy();
}
}
}