a37d24d06e3d85017b59997302b89bc2017b0970jvergara * CDDL HEADER START
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * The contents of this file are subject to the terms of the
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Common Development and Distribution License, Version 1.0 only
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * (the "License"). You may not use this file except in compliance
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * with the License.
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * or http://forgerock.org/license/CDDLv1.0.html.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * See the License for the specific language governing permissions
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * and limitations under the License.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * When distributing Covered Code, include this CDDL HEADER in each
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * file and include the License file at legal-notices/CDDLv1_0.txt.
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * If applicable, add the following below this CDDL HEADER, with the
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * fields enclosed by brackets "[]" replaced with your own identifying
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * information:
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Portions Copyright [yyyy] [name of copyright owner]
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * CDDL HEADER END
37867092eb9f5796a0dabbb51ff918585421eb01jvergara * Copyright 2008-2010 Sun Microsystems, Inc.
a5b9f8fb834b1b2208e59a2fa76714bd91a5f147violette * Portions copyright 2011-2013 ForgeRock AS.
a37d24d06e3d85017b59997302b89bc2017b0970jvergaraimport static org.opends.server.tools.ToolConstants.*;
92bd137769a071d6992c3a01c14c0b2bf044b293ludovicpimport org.opends.server.admin.AdministrationConnector;
a37d24d06e3d85017b59997302b89bc2017b0970jvergaraimport org.opends.server.util.args.ArgumentException;
a37d24d06e3d85017b59997302b89bc2017b0970jvergaraimport org.opends.server.util.args.FileBasedArgument;
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Class used to parse the arguments of the setup command-line and to check
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * that there are not conflicting arguments (nor missing arguments in no prompt
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Note that this class does not perform checks involving network (like if
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * a given port is free) nor the validity of the certificate information
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * provided.
b26e36d8a08a1c775531659c04abc3d4ed504139jvergarapublic class InstallDSArgumentParser extends ArgumentParser
a37d24d06e3d85017b59997302b89bc2017b0970jvergara private static final Logger LOG = Logger.getLogger(
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * The default constructor for this class.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * @param mainClassName the class name of the main class for the command-line
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * that is being used.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara public InstallDSArgumentParser(String mainClassName)
a37d24d06e3d85017b59997302b89bc2017b0970jvergara super(mainClassName, INFO_INSTALLDS_TOOL_DESCRIPTION.get(), false);
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Initializes the arguments without parsing them.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * @throws ArgumentException if there was an error creating or adding the
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * arguments. If this occurs is likely to be a bug.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara public void initializeArguments() throws ArgumentException
a37d24d06e3d85017b59997302b89bc2017b0970jvergara defaultProgName = Installation.WINDOWS_SETUP_FILE_NAME;
a37d24d06e3d85017b59997302b89bc2017b0970jvergara defaultProgName = Installation.UNIX_SETUP_FILE_NAME;
7855b07c34797e1650c83f4038ced2dade3a8109jvergara "programName".toLowerCase(), 'P', "programName", false,
fbbcdae277f66a56a2e5450858b249f82470dc56jvergara false, true, INFO_PROGRAM_NAME_PLACEHOLDER.get(), defaultProgName,
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara "programName", INFO_INSTALLDS_DESCRIPTION_PROGNAME.get());
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara noPromptArg.setPropertyName(OPTION_LONG_NO_PROMPT);
7855b07c34797e1650c83f4038ced2dade3a8109jvergara OPTION_LONG_QUIET.toLowerCase(), OPTION_SHORT_QUIET,
7855b07c34797e1650c83f4038ced2dade3a8109jvergara verboseArg = new BooleanArgument(OPTION_LONG_VERBOSE.toLowerCase(),
cdc00d2b7899dbd1d090f7f68d562b43fc944a90jvergara OPTION_LONG_VERBOSE, INFO_DESCRIPTION_VERBOSE.get());
7855b07c34797e1650c83f4038ced2dade3a8109jvergara false, true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null,
7855b07c34797e1650c83f4038ced2dade3a8109jvergara OPTION_LONG_NO_PROP_FILE.toLowerCase(), null, OPTION_LONG_NO_PROP_FILE,
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara setNoPropertiesFileArgument(noPropertiesFileArgument);
7855b07c34797e1650c83f4038ced2dade3a8109jvergara OPTION_LONG_BASEDN.toLowerCase(), OPTION_SHORT_BASEDN,
a37d24d06e3d85017b59997302b89bc2017b0970jvergara OPTION_LONG_BASEDN, false, true, true,
7855b07c34797e1650c83f4038ced2dade3a8109jvergara OPTION_LONG_LDIF_FILE.toLowerCase(), OPTION_SHORT_LDIF_FILE,
7855b07c34797e1650c83f4038ced2dade3a8109jvergara "rejectFile".toLowerCase(), 'R', "rejectFile", false, false,
fbbcdae277f66a56a2e5450858b249f82470dc56jvergara true, INFO_REJECT_FILE_PLACEHOLDER.get(), null, "rejectFile",
7855b07c34797e1650c83f4038ced2dade3a8109jvergara "skipFile".toLowerCase(), null, "skipFile", false, false,
fbbcdae277f66a56a2e5450858b249f82470dc56jvergara true, INFO_SKIP_FILE_PLACEHOLDER.get(), null, "skipFile",
7855b07c34797e1650c83f4038ced2dade3a8109jvergara "sampleData".toLowerCase(), 'd', "sampleData", false,
fbbcdae277f66a56a2e5450858b249f82470dc56jvergara false, true, INFO_NUM_ENTRIES_PLACEHOLDER.get(), 0, "sampleData",
a37d24d06e3d85017b59997302b89bc2017b0970jvergara "ldapPort", false, false,
5a0b86da603b0b2fd3353e891464400af7ab5533jvergara true, INFO_PORT_PLACEHOLDER.get(), defaultLdapPort,
5a0b86da603b0b2fd3353e891464400af7ab5533jvergara int defaultAdminPort = UserData.getDefaultAdminConnectorPort();
92bd137769a071d6992c3a01c14c0b2bf044b293ludovicp AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT;
d25372dc8e65a9ed019a88fdf659ca61313f1b31jcduff "adminConnectorPort", false, false,
5a0b86da603b0b2fd3353e891464400af7ab5533jvergara true, INFO_PORT_PLACEHOLDER.get(), defaultAdminPort,
d25372dc8e65a9ed019a88fdf659ca61313f1b31jcduff INFO_INSTALLDS_DESCRIPTION_ADMINCONNECTORPORT.get());
7855b07c34797e1650c83f4038ced2dade3a8109jvergara "jmxPort".toLowerCase(), 'x', "jmxPort", false, false,
7855b07c34797e1650c83f4038ced2dade3a8109jvergara "skipPortCheck".toLowerCase(), 'S', "skipPortCheck",
7855b07c34797e1650c83f4038ced2dade3a8109jvergara OPTION_LONG_ROOT_USER_DN.toLowerCase(), OPTION_SHORT_ROOT_USER_DN,
a37d24d06e3d85017b59997302b89bc2017b0970jvergara "cn=Directory Manager",
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara OPTION_LONG_ROOT_USER_DN, INFO_INSTALLDS_DESCRIPTION_ROOTDN.get());
7855b07c34797e1650c83f4038ced2dade3a8109jvergara "rootUserPassword".toLowerCase(), OPTION_SHORT_BINDPWD,
a37d24d06e3d85017b59997302b89bc2017b0970jvergara "rootUserPassword",
a37d24d06e3d85017b59997302b89bc2017b0970jvergara false, false, true,
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara "rootUserPassword",
a37d24d06e3d85017b59997302b89bc2017b0970jvergara directoryManagerPwdFileArg = new FileBasedArgument(
a37d24d06e3d85017b59997302b89bc2017b0970jvergara "rootUserPasswordFile", false, false,
a37d24d06e3d85017b59997302b89bc2017b0970jvergara "enableWindowsService",
a37d24d06e3d85017b59997302b89bc2017b0970jvergara INFO_INSTALLDS_DESCRIPTION_ENABLE_WINDOWS_SERVICE.get());
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara enableWindowsServiceArg.setPropertyName("enableWindowsService");
7855b07c34797e1650c83f4038ced2dade3a8109jvergara "enableStartTLS".toLowerCase(), OPTION_SHORT_START_TLS,
7855b07c34797e1650c83f4038ced2dade3a8109jvergara "enableStartTLS",
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara enableStartTLSArg.setPropertyName("enableStartTLS");
5a0b86da603b0b2fd3353e891464400af7ab5533jvergara int defaultSecurePort = UserData.getDefaultSslPort(defaultLdapPort);
a37d24d06e3d85017b59997302b89bc2017b0970jvergara "ldapsPort", false, false,
fbbcdae277f66a56a2e5450858b249f82470dc56jvergara true, INFO_PORT_PLACEHOLDER.get(), defaultSecurePort,
a37d24d06e3d85017b59997302b89bc2017b0970jvergara generateSelfSignedCertificateArg = new BooleanArgument(
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara "generateSelfSignedCertificate");
95c63d5c79b97d5f353c7512e6193c4dba66a6fcjvergara hostNameArg = new StringArgument(OPTION_LONG_HOST.toLowerCase(),
95c63d5c79b97d5f353c7512e6193c4dba66a6fcjvergara OPTION_LONG_HOST, false, false, true, INFO_HOST_PLACEHOLDER.get(),
7855b07c34797e1650c83f4038ced2dade3a8109jvergara usePkcs11Arg = new BooleanArgument("usePkcs11Keystore".toLowerCase(),
7855b07c34797e1650c83f4038ced2dade3a8109jvergara useJavaKeyStoreArg = new StringArgument("useJavaKeystore".toLowerCase(),
fbbcdae277f66a56a2e5450858b249f82470dc56jvergara true, INFO_KEYSTOREPATH_PLACEHOLDER.get(), null, "useJavaKeystore",
a37d24d06e3d85017b59997302b89bc2017b0970jvergara INFO_INSTALLDS_DESCRIPTION_USE_JAVAKEYSTORE.get());
ddafbeb2ae1c18db9aea2af918290d3b06097f1fjvergara useJCEKSArg = new StringArgument("useJCEKS".toLowerCase(),
ddafbeb2ae1c18db9aea2af918290d3b06097f1fjvergara true, INFO_KEYSTOREPATH_PLACEHOLDER.get(), null, "useJCEKS",
7855b07c34797e1650c83f4038ced2dade3a8109jvergara usePkcs12Arg = new StringArgument("usePkcs12keyStore".toLowerCase(),
fbbcdae277f66a56a2e5450858b249f82470dc56jvergara true, INFO_KEYSTOREPATH_PLACEHOLDER.get(), null, "usePkcs12keyStore",
a37d24d06e3d85017b59997302b89bc2017b0970jvergara OPTION_LONG_KEYSTORE_PWD, false, false, true,
fbbcdae277f66a56a2e5450858b249f82470dc56jvergara INFO_KEYSTORE_PWD_PLACEHOLDER.get(), null, OPTION_LONG_KEYSTORE_PWD,
a37d24d06e3d85017b59997302b89bc2017b0970jvergara INFO_INSTALLDS_DESCRIPTION_KEYSTOREPASSWORD.get());
a37d24d06e3d85017b59997302b89bc2017b0970jvergara OPTION_SHORT_KEYSTORE_PWD_FILE, OPTION_LONG_KEYSTORE_PWD_FILE, false,
fbbcdae277f66a56a2e5450858b249f82470dc56jvergara false, INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get(), null,
a37d24d06e3d85017b59997302b89bc2017b0970jvergara INFO_INSTALLDS_DESCRIPTION_KEYSTOREPASSWORD_FILE.get());
a37d24d06e3d85017b59997302b89bc2017b0970jvergara OPTION_SHORT_CERT_NICKNAME, OPTION_LONG_CERT_NICKNAME,
fbbcdae277f66a56a2e5450858b249f82470dc56jvergara false, false, true, INFO_NICKNAME_PLACEHOLDER.get(), null,
b138eb36479de1170a91322a845ad9e977c3af56ludovicp int defaultTimeout = ConnectionUtils.getDefaultLDAPTimeout();
b138eb36479de1170a91322a845ad9e977c3af56ludovicp connectTimeoutArg = new IntegerArgument(OPTION_LONG_CONNECT_TIMEOUT,
b138eb36479de1170a91322a845ad9e977c3af56ludovicp false, false, true, INFO_TIMEOUT_PLACEHOLDER.get(),
b138eb36479de1170a91322a845ad9e977c3af56ludovicp connectTimeoutArg.setPropertyName(OPTION_LONG_CONNECT_TIMEOUT);
a201fb0f51e2e2d392d60b2dd96a21e16a324b88violette acceptLicense = new BooleanArgument(OPTION_LONG_ACCEPT_LICENSE, null,
a201fb0f51e2e2d392d60b2dd96a21e16a324b88violette OPTION_LONG_ACCEPT_LICENSE, INFO_OPTION_ACCEPT_LICENSE.get());
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara * Returns whether the command was launched in CLI mode or not.
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara * @return <CODE>true</CODE> if the command was launched to use CLI mode and
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara * <CODE>false</CODE> otherwise.
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara public boolean isCli()
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * {@inheritDoc}
a37d24d06e3d85017b59997302b89bc2017b0970jvergara public void parseArguments(String[] args) throws ArgumentException
a37d24d06e3d85017b59997302b89bc2017b0970jvergara LinkedHashSet<Message> errorMessages = new LinkedHashSet<Message>();
a37d24d06e3d85017b59997302b89bc2017b0970jvergara LOG.log(Level.SEVERE, "Error parsing arguments: "+ae, ae);
bf7236c96ba10b04b60169ee7c84327b4998ffc9jvergara if (!isUsageArgumentPresent() && !isVersionArgumentPresent())
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Returns the directory manager password provided by the user. This method
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * should be called after a call to parseArguments.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * @return the directory manager password provided by the user.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Returns the key store password provided by the user. This method should be
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * called after a call to parseArguments.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * @return the key store password provided by the user.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Checks that there are no conflicts with the directory manager passwords.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * If we are in no prompt mode, check that the password was provided.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * @param errorMessages the list of messages to which we add the error
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * messages describing the problems encountered during the execution of the
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * checking.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara private void checkServerPassword(Collection<Message> errorMessages)
a37d24d06e3d85017b59997302b89bc2017b0970jvergara Message message = ERR_INSTALLDS_TWO_CONFLICTING_ARGUMENTS.get(
a37d24d06e3d85017b59997302b89bc2017b0970jvergara if (noPromptArg.isPresent() && !directoryManagerPwdStringArg.isPresent() &&
a37d24d06e3d85017b59997302b89bc2017b0970jvergara Message message = ERR_INSTALLDS_NO_ROOT_PASSWORD.get(
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Checks that there are no conflicts with the provided ports (like if the
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * user provided the same port for different protocols).
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * @param errorMessages the list of messages to which we add the error
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * messages describing the problems encountered during the execution of the
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * checking.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara private void checkProvidedPorts(Collection<Message> errorMessages)
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Check that the provided ports do not match.
d25372dc8e65a9ed019a88fdf659ca61313f1b31jcduff if (ports.contains(adminConnectorPortArg.getIntValue()))
d25372dc8e65a9ed019a88fdf659ca61313f1b31jcduff Message message = ERR_CONFIGDS_PORT_ALREADY_SPECIFIED.get(
d25372dc8e65a9ed019a88fdf659ca61313f1b31jcduff String.valueOf(adminConnectorPortArg.getIntValue()));
a37d24d06e3d85017b59997302b89bc2017b0970jvergara Message message = ERR_CONFIGDS_PORT_ALREADY_SPECIFIED.get(
a37d24d06e3d85017b59997302b89bc2017b0970jvergara Message message = ERR_CONFIGDS_PORT_ALREADY_SPECIFIED.get(
a37d24d06e3d85017b59997302b89bc2017b0970jvergara "Assuming that it is caused by a previous parsing issue: "+ae, ae);
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Checks that there are no conflicts with the import data arguments.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * @param errorMessages the list of messages to which we add the error
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * messages describing the problems encountered during the execution of the
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * checking.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara private void checkImportDataArguments(Collection<Message> errorMessages)
a37d24d06e3d85017b59997302b89bc2017b0970jvergara // Make sure that the user didn't provide conflicting arguments.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara else if (importLDIFArg.isPresent() && sampleDataArg.isPresent())
665c725aa5d38e054c9816f9edf5c8253f3f093ejvergara if (rejectedImportFileArg.isPresent() && addBaseEntryArg.isPresent())
665c725aa5d38e054c9816f9edf5c8253f3f093ejvergara else if (rejectedImportFileArg.isPresent() && sampleDataArg.isPresent())
665c725aa5d38e054c9816f9edf5c8253f3f093ejvergara if (skippedImportFileArg.isPresent() && addBaseEntryArg.isPresent())
665c725aa5d38e054c9816f9edf5c8253f3f093ejvergara else if (skippedImportFileArg.isPresent() && sampleDataArg.isPresent())
f8ea2d869a77e63e54a80666bb47f0b2af03ee9fjvergara if (noPromptArg.isPresent() && !baseDNArg.isPresent() &&
6af3eb301687826075597a054f455ce76f5349eejvergara Argument[] args = {importLDIFArg, addBaseEntryArg, sampleDataArg};
6af3eb301687826075597a054f455ce76f5349eejvergara errorMessages.add(ERR_INSTALLDS_NO_BASE_DN_AND_CONFLICTING_ARG.get(
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * Checks that there are no conflicts with the security arguments.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * If we are in no prompt mode, check that all the information required has
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * been provided (but not if this information is valid: we do not try to
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * open the keystores or to check that the LDAPS port is in use).
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * @param errorMessages the list of messages to which we add the error
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * messages describing the problems encountered during the execution of the
a37d24d06e3d85017b59997302b89bc2017b0970jvergara * checking.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara private void checkSecurityArguments(Collection<Message> errorMessages)
a37d24d06e3d85017b59997302b89bc2017b0970jvergara boolean certificateRequired = ldapsPortArg.isPresent() ||
a37d24d06e3d85017b59997302b89bc2017b0970jvergara errorMessages.add(ERR_INSTALLDS_SEVERAL_CERTIFICATE_TYPE_SPECIFIED.get());
a37d24d06e3d85017b59997302b89bc2017b0970jvergara if (certificateRequired && noPromptArg.isPresent() &&
a37d24d06e3d85017b59997302b89bc2017b0970jvergara ERR_INSTALLDS_CERTIFICATE_REQUIRED_FOR_SSL_OR_STARTTLS.get());
a37d24d06e3d85017b59997302b89bc2017b0970jvergara // Check that we have only a password.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara Message message = ERR_INSTALLDS_TWO_CONFLICTING_ARGUMENTS.get(
a37d24d06e3d85017b59997302b89bc2017b0970jvergara // Check that we have one password in no prompt mode.
a37d24d06e3d85017b59997302b89bc2017b0970jvergara if (noPromptArg.isPresent() && !keyStorePasswordArg.isPresent() &&
a37d24d06e3d85017b59997302b89bc2017b0970jvergara Message message = ERR_INSTALLDS_NO_KEYSTORE_PASSWORD.get(
a37d24d06e3d85017b59997302b89bc2017b0970jvergara if (noPromptArg.isPresent() && !ldapsPortArg.isPresent() &&
a37d24d06e3d85017b59997302b89bc2017b0970jvergara Message message = ERR_INSTALLDS_SSL_OR_STARTTLS_REQUIRED.get(
b138eb36479de1170a91322a845ad9e977c3af56ludovicp * Returns the timeout to be used to connect in milliseconds. The method
b138eb36479de1170a91322a845ad9e977c3af56ludovicp * must be called after parsing the arguments.
b138eb36479de1170a91322a845ad9e977c3af56ludovicp * @return the timeout to be used to connect in milliseconds. Returns
b138eb36479de1170a91322a845ad9e977c3af56ludovicp * {@code 0} if there is no timeout.
478bdb76ac1f981022ff6e54aec2045be9403ef0ludovicp * @throws IllegalStateException if the method is called before
b138eb36479de1170a91322a845ad9e977c3af56ludovicp * parsing the arguments.
478bdb76ac1f981022ff6e54aec2045be9403ef0ludovicp public int getConnectTimeout() throws IllegalStateException
b138eb36479de1170a91322a845ad9e977c3af56ludovicp throw new IllegalStateException("Argument parser is not parsed: "+ae, ae);