/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.cli;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Map;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.ldaptive.Connection;
import org.ldaptive.ConnectionConfig;
import org.ldaptive.ConnectionFactory;
import org.ldaptive.Response;
import org.ldaptive.SearchOperation;
import org.ldaptive.SearchRequest;
import org.ldaptive.SearchResult;
import org.ldaptive.io.Dsmlv1Writer;
import org.ldaptive.io.LdifWriter;
import org.ldaptive.io.SearchResultWriter;
import org.ldaptive.props.BindConnectionInitializerPropertySource;
import org.ldaptive.props.ConnectionConfigPropertySource;
import org.ldaptive.props.PropertySource.PropertyDomain;
import org.ldaptive.props.SearchRequestPropertySource;
import org.ldaptive.props.SslConfigPropertySource;
import org.ldaptive.ssl.SslConfig;
/**
* Command line interface for {@link SearchOperation}.
*
* @author Middleware Services
*/
public class SearchOperationCli extends AbstractCli
{
/** option for dsmlv1 output. */
private static final String OPT_DSMLV1 = "dsmlv1";
/** name of operation provided by this class. */
private static final String COMMAND_NAME = "ldapsearch";
/**
* CLI entry point method.
*
* @param args command line arguments.
*/
public static void main(final String[] args)
{
final SearchOperationCli cli = new SearchOperationCli();
final int status = cli.performAction(args);
System.exit(status);
}
@Override
protected void initOptions()
{
options.addOption(new Option(OPT_DSMLV1, false, "output results in DSML v1"));
final Map<String, String> desc = getArgDesc(ConnectionConfig.class, SslConfig.class, SearchRequest.class);
for (String s : ConnectionConfigPropertySource.getProperties()) {
options.addOption(new Option(s, true, desc.get(s)));
}
for (String s : SslConfigPropertySource.getProperties()) {
options.addOption(new Option(s, true, desc.get(s)));
}
for (String s : BindConnectionInitializerPropertySource.getProperties()) {
options.addOption(new Option(s, true, desc.get(s)));
}
for (String s : SearchRequestPropertySource.getProperties()) {
options.addOption(new Option(s, true, desc.get(s)));
}
super.initOptions();
}
/**
* Initialize a search request with command line options.
*
* @param line parsed command line arguments
*
* @return search request that has been initialized
*/
protected SearchRequest initSearchRequest(final CommandLine line)
{
final SearchRequest request = new SearchRequest();
final SearchRequestPropertySource srSource = new SearchRequestPropertySource(
request,
getPropertiesFromOptions(PropertyDomain.LDAP.value(), line));
srSource.initialize();
return request;
}
@Override
protected int dispatch(final CommandLine line)
throws Exception
{
if (line.hasOption(OPT_DSMLV1)) {
outputDsmlv1 = true;
}
if (line.hasOption(OPT_HELP)) {
printHelp();
} else {
return search(initConnectionFactory(line), initSearchRequest(line));
}
return -1;
}
/**
* Executes the ldap search operation.
*
* @param cf connection factory
* @param request search request
*
* @return status code
*
* @throws Exception on any LDAP search error
*/
protected int search(final ConnectionFactory cf, final SearchRequest request)
throws Exception
{
final Connection conn = cf.getConnection();
conn.open();
final SearchOperation op = new SearchOperation(conn);
final Response<SearchResult> response = op.execute(request);
final SearchResult result = response.getResult();
SearchResultWriter writer;
if (outputDsmlv1) {
writer = new Dsmlv1Writer(new BufferedWriter(new OutputStreamWriter(System.out)));
} else {
writer = new LdifWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
}
writer.write(result);
conn.close();
return response.getResultCode().value();
}
@Override
protected String getCommandName()
{
return COMMAND_NAME;
}
}