/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.servlets;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.ldaptive.LdapException;
import org.ldaptive.SearchExecutor;
import org.ldaptive.SearchResult;
import org.ldaptive.pool.ConnectionPoolType;
import org.ldaptive.pool.PooledConnectionFactory;
import org.ldaptive.props.PooledConnectionFactoryPropertySource;
import org.ldaptive.props.PropertySource.PropertyDomain;
import org.ldaptive.props.SearchRequestPropertySource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Uses {@link PooledConnectionFactory} and {@link SearchExecutor} to perform search operations. These objects are
* configured from properties found in the servlet configuration.
*
* @author Middleware Services
*/
public abstract class AbstractServletSearchExecutor implements ServletSearchExecutor
{
/** Type of pool used, value is {@value}. */
private static final String POOL_TYPE = "poolType";
/** Logger for this class. */
protected final Logger logger = LoggerFactory.getLogger(getClass());
/** Connections for searching. */
private PooledConnectionFactory connectionFactory;
/** Search executor for storing search properties. */
private SearchExecutor searchExecutor;
@Override
public void initialize(final ServletConfig config)
{
searchExecutor = new SearchExecutor();
final SearchRequestPropertySource srSource = new SearchRequestPropertySource(
searchExecutor,
createProperties(config));
srSource.initialize();
logger.debug("searchExecutor = {}", searchExecutor);
connectionFactory = new PooledConnectionFactory();
final PooledConnectionFactoryPropertySource cfPropSource = new PooledConnectionFactoryPropertySource(
connectionFactory,
createProperties(config));
cfPropSource.setPoolType(ConnectionPoolType.valueOf(config.getInitParameter(POOL_TYPE)));
cfPropSource.initialize();
logger.debug("connectionFactory = {}", connectionFactory);
}
/**
* Returns context specific properties based on the supplied JAAS options.
*
* @param config to read properties from
*
* @return properties
*/
protected static Properties createProperties(final ServletConfig config)
{
final Properties p = new Properties();
final Enumeration<?> e = config.getInitParameterNames();
while (e.hasMoreElements()) {
final String name = (String) e.nextElement();
// if property name contains a dot, it isn't an ldaptive property
// else add the domain to the ldaptive properties
if (name.contains(".")) {
p.setProperty(name, config.getInitParameter(name));
} else {
p.setProperty(PropertyDomain.LDAP.value() + name, config.getInitParameter(name));
}
}
return p;
}
@Override
public void search(final HttpServletRequest request, final HttpServletResponse response)
throws LdapException, IOException
{
final String queryString = request.getParameter("query");
if (queryString == null || queryString.isEmpty()) {
logger.info("Ignoring empty query");
} else {
final SearchResult result = searchExecutor.search(
connectionFactory,
queryString,
request.getParameterValues("attrs")).getResult();
writeResponse(result, response);
}
}
/**
* Writes the supplied search result to the servlet response output stream.
*
* @param result search result to write
* @param response to write to
*
* @throws IOException if an error occurs writing to the response
*/
protected abstract void writeResponse(final SearchResult result, final HttpServletResponse response)
throws IOException;
@Override
public void close()
{
connectionFactory.getConnectionPool().close();
}
}