/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2009-2010 Sun Microsystems, Inc.
* Portions Copyright 2011 ForgeRock AS
*/
package org.opends.guitools.controlpanel;
import static org.opends.messages.ToolMessages.*;
import static org.opends.server.tools.ToolConstants.*;
import java.util.LinkedHashSet;
import org.opends.admin.ads.util.ConnectionUtils;
import org.opends.messages.Message;
import org.opends.quicksetup.Constants;
import org.opends.quicksetup.UserData;
import org.opends.quicksetup.util.Utils;
import org.opends.server.admin.AdministrationConnector;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.ArgumentParser;
import org.opends.server.util.args.BooleanArgument;
import org.opends.server.util.args.FileBasedArgument;
import org.opends.server.util.args.IntegerArgument;
import org.opends.server.util.args.StringArgument;
/**
* Class used to parse the arguments of the control panel command-line.
*/
public class ControlPanelArgumentParser extends ArgumentParser
{
/**
* The 'hostName' global argument.
*/
private StringArgument hostNameArg = null;
/**
* The 'port' global argument.
*/
private IntegerArgument portArg = null;
/**
* The 'bindDN' global argument.
*/
private StringArgument bindDnArg = null;
/**
* The 'bindPasswordFile' global argument.
*/
private FileBasedArgument bindPasswordFileArg = null;
/**
* The 'bindPassword' global argument.
*/
private StringArgument bindPasswordArg = null;
/**
* The 'trustAllArg' global argument.
*/
private BooleanArgument trustAllArg = null;
/**
* The 'remoteArg' global argument.
*/
private BooleanArgument remoteArg = null;
/**
* Argument to specify the connect timeout.
*/
private IntegerArgument connectTimeoutArg = null;
private BooleanArgument showUsageArg;
/**
* The default constructor for this class.
* @param mainClassName the class name of the main class for the command-line
* that is being used.
* @param msg the usage message.
*/
public ControlPanelArgumentParser(String mainClassName,
Message msg)
{
super(mainClassName, msg, false);
}
/**
* Returns the default value for the administration port.
* @return the default value for the administration port.
*/
public static int getDefaultAdministrationPort()
{
return AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT;
}
/**
* Returns the default bind DN.
* @return the default bind DN.
*/
public static String getDefaultBindDN()
{
return "cn=Directory Manager";
}
/**
* Initializes the arguments without parsing them.
* @throws ArgumentException if there was an error creating or adding the
* arguments. If this occurs is likely to be a bug.
*/
public void initializeArguments() throws ArgumentException
{
hostNameArg = new StringArgument("host", OPTION_SHORT_HOST,
OPTION_LONG_HOST, false, false, true, INFO_HOST_PLACEHOLDER.get(),
UserData.getDefaultHostName(),
null, INFO_DESCRIPTION_HOST.get());
hostNameArg.setPropertyName(OPTION_LONG_HOST);
addArgument(hostNameArg);
portArg = new IntegerArgument("port", OPTION_SHORT_PORT, OPTION_LONG_PORT,
false, false, true, INFO_PORT_PLACEHOLDER.get(),
getDefaultAdministrationPort(), null,
true, 1, true, 65535,
INFO_DESCRIPTION_ADMIN_PORT.get());
portArg.setPropertyName(OPTION_LONG_PORT);
addArgument(portArg);
bindDnArg = new StringArgument("bindDN", OPTION_SHORT_BINDDN,
OPTION_LONG_BINDDN, false, false, true, INFO_BINDDN_PLACEHOLDER.get(),
getDefaultBindDN(), null, INFO_DESCRIPTION_BINDDN.get());
bindDnArg.setPropertyName(OPTION_LONG_BINDDN);
addArgument(bindDnArg);
bindPasswordArg = new StringArgument("bindPassword",
OPTION_SHORT_BINDPWD, OPTION_LONG_BINDPWD, false, false, true,
INFO_BINDPWD_PLACEHOLDER.get(), null, null,
INFO_DESCRIPTION_BINDPASSWORD.get());
bindPasswordArg.setPropertyName(OPTION_LONG_BINDPWD);
addArgument(bindPasswordArg);
bindPasswordFileArg = new FileBasedArgument("bindPasswordFile",
OPTION_SHORT_BINDPWD_FILE, OPTION_LONG_BINDPWD_FILE, false, false,
INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
INFO_DESCRIPTION_BINDPASSWORDFILE.get());
bindPasswordFileArg.setPropertyName(OPTION_LONG_BINDPWD_FILE);
addArgument(bindPasswordFileArg);
trustAllArg = new BooleanArgument("trustAll", OPTION_SHORT_TRUSTALL,
OPTION_LONG_TRUSTALL, INFO_DESCRIPTION_TRUSTALL.get());
trustAllArg.setPropertyName(OPTION_LONG_TRUSTALL);
addArgument(trustAllArg);
remoteArg = new BooleanArgument("remote", OPTION_SHORT_REMOTE,
OPTION_LONG_REMOTE, INFO_DESCRIPTION_REMOTE.get());
remoteArg.setPropertyName(OPTION_LONG_REMOTE);
addArgument(remoteArg);
int defaultTimeout = ConnectionUtils.getDefaultLDAPTimeout();
connectTimeoutArg = new IntegerArgument(OPTION_LONG_CONNECT_TIMEOUT,
null, OPTION_LONG_CONNECT_TIMEOUT,
false, false, true, INFO_TIMEOUT_PLACEHOLDER.get(),
defaultTimeout, null,
true, 0, false, Integer.MAX_VALUE,
INFO_DESCRIPTION_CONNECTION_TIMEOUT.get());
connectTimeoutArg.setPropertyName(OPTION_LONG_CONNECT_TIMEOUT);
addArgument(connectTimeoutArg);
showUsageArg = new BooleanArgument("help", OPTION_SHORT_HELP,
OPTION_LONG_HELP,
INFO_DESCRIPTION_USAGE.get());
addArgument(showUsageArg);
setUsageArgument(showUsageArg);
}
/**
* {@inheritDoc}
*/
@Override()
public void parseArguments(String[] args) throws ArgumentException
{
LinkedHashSet<Message> errorMessages = new LinkedHashSet<Message>();
try
{
super.parseArguments(args);
}
catch (ArgumentException ae)
{
errorMessages.add(ae.getMessageObject());
}
if (bindPasswordArg.isPresent() && bindPasswordFileArg.isPresent())
{
Message message = ERR_TOOL_CONFLICTING_ARGS.get(
bindPasswordArg.getLongIdentifier(),
bindPasswordFileArg.getLongIdentifier());
errorMessages.add(message);
}
if (errorMessages.size() > 0)
{
Message message = ERR_CANNOT_INITIALIZE_ARGS.get(
Utils.getMessageFromCollection(errorMessages,
Constants.LINE_SEPARATOR));
throw new ArgumentException(message);
}
}
/**
* Returns the host name explicitly provided in the command-line.
* @return the host name bind DN explicitly provided in the command-line.
* Returns <CODE>null</CODE> if no bind DN was explicitly provided.
*/
public String getExplicitHostName()
{
String hostName = null;
if (hostNameArg.isPresent())
{
hostName = hostNameArg.getValue();
}
return hostName;
}
/**
* Returns the administration port explicitly provided in the command-line.
* @return the administration port explicitly provided in the command-line.
* Returns -1 if no port was explicitly provided.
*/
public int getExplicitPort()
{
int port = -1;
if (portArg.isPresent())
{
try
{
port = portArg.getIntValue();
}
catch (ArgumentException ae)
{
throw new IllegalStateException("Error parsing data: "+ae, ae);
}
}
return port;
}
/**
* Returns the bind DN explicitly provided in the command-line.
* @return the bind DN explicitly provided in the command-line.
* Returns <CODE>null</CODE> if no bind DN was explicitly provided.
*/
public String getExplicitBindDn()
{
String dn = null;
if (bindDnArg.isPresent())
{
dn = bindDnArg.getValue();
}
return dn;
}
/**
* Get the password which has to be used for the command without prompting
* the user. If no password was specified, return <CODE>null</CODE>.
*
* @return The password stored into the specified file on by the
* command line argument, or <CODE>null</CODE> it if not specified.
*/
public String getBindPassword()
{
return getBindPassword(bindPasswordArg, bindPasswordFileArg);
}
/**
* Returns whether the user specified to trust all certificates or not.
* @return whether the user specified to trust all certificates or not.
*/
public boolean isTrustAll()
{
return trustAllArg.isPresent();
}
/**
* Returns the timeout to be used to connect in milliseconds. The method
* must be called after parsing the arguments.
* @return the timeout to be used to connect in milliseconds. Returns
* {@code 0} if there is no timeout.
* @throw {@code IllegalStateException} if the method is called before
* parsing the arguments.
*/
public int getConnectTimeout()
{
try
{
return connectTimeoutArg.getIntValue();
}
catch (ArgumentException ae)
{
throw new IllegalStateException("Argument parser is not parsed: "+ae, ae);
}
}
/**
* Returns whether the user specified to connect to a remote server.
* @return whether the user specified to connect to a remote server.
*/
public boolean isRemote()
{
return remoteArg.isPresent();
}
}