/* * 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 legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * 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 legal-notices/CDDLv1_0.txt. * 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-2015 ForgeRock AS. */ package org.opends.guitools.controlpanel; import static org.opends.messages.ToolMessages.*; import java.util.LinkedHashSet; import org.forgerock.i18n.LocalizableMessage; 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.core.DirectoryServer.DirectoryServerVersionHandler; import com.forgerock.opendj.cli.ArgumentException; import com.forgerock.opendj.cli.ArgumentParser; import com.forgerock.opendj.cli.BooleanArgument; import com.forgerock.opendj.cli.CommonArguments; import com.forgerock.opendj.cli.FileBasedArgument; import com.forgerock.opendj.cli.IntegerArgument; import com.forgerock.opendj.cli.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; /** The 'port' global argument. */ private IntegerArgument portArg; /** The 'bindDN' global argument. */ private StringArgument bindDnArg; /** The 'bindPasswordFile' global argument. */ private FileBasedArgument bindPasswordFileArg; /** The 'bindPassword' global argument. */ private StringArgument bindPasswordArg; /** The 'trustAllArg' global argument. */ private BooleanArgument trustAllArg; /** The 'remoteArg' global argument. */ private BooleanArgument remoteArg; /** Argument to specify the connect timeout. */ private IntegerArgument connectTimeoutArg; 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, LocalizableMessage msg) { super(mainClassName, msg, false); setShortToolDescription(REF_SHORT_DESC_CONTROL_PANEL.get()); setVersionHandler(new DirectoryServerVersionHandler()); } /** * 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 = CommonArguments.getHostName(UserData.getDefaultHostName()); addArgument(hostNameArg); portArg = CommonArguments.getPort(getDefaultAdministrationPort(), INFO_DESCRIPTION_ADMIN_PORT.get()); addArgument(portArg); bindDnArg = CommonArguments.getBindDN(getDefaultBindDN()); addArgument(bindDnArg); bindPasswordArg = CommonArguments.getBindPassword(); addArgument(bindPasswordArg); bindPasswordFileArg = CommonArguments.getBindPasswordFile(); addArgument(bindPasswordFileArg); trustAllArg = CommonArguments.getTrustAll(); addArgument(trustAllArg); remoteArg = CommonArguments.getRemote(); addArgument(remoteArg); connectTimeoutArg = CommonArguments.getConnectTimeOut(); connectTimeoutArg.setHidden(false); addArgument(connectTimeoutArg); showUsageArg = CommonArguments.getShowUsage(); addArgument(showUsageArg); setUsageArgument(showUsageArg); } /** {@inheritDoc} */ @Override public void parseArguments(String[] args) throws ArgumentException { LinkedHashSet<LocalizableMessage> errorMessages = new LinkedHashSet<>(); try { super.parseArguments(args); } catch (ArgumentException ae) { errorMessages.add(ae.getMessageObject()); } if (bindPasswordArg.isPresent() && bindPasswordFileArg.isPresent()) { LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get( bindPasswordArg.getLongIdentifier(), bindPasswordFileArg.getLongIdentifier()); errorMessages.add(message); } if (!errorMessages.isEmpty()) { throw new ArgumentException(ERR_CANNOT_INITIALIZE_ARGS.get( Utils.getMessageFromCollection(errorMessages, Constants.LINE_SEPARATOR))); } } /** * 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(); } }