/* * The contents of this file are subject to the terms of the Common Development and * Distribution License (the License). You may not use this file except in compliance with the * License. * * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the * specific language governing permission and limitations under the License. * * When distributing Covered Software, include this CDDL Header Notice in each file and include * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL * Header, with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions Copyright [year] [name of copyright owner]". * * Copyright 2009-2010 Sun Microsystems, Inc. * Portions Copyright 2011-2016 ForgeRock AS. */ package org.opends.guitools.controlpanel; import static com.forgerock.opendj.cli.Utils.addErrorMessageIfArgumentsConflict; import static org.opends.messages.ToolMessages.*; import static com.forgerock.opendj.cli.CommonArguments.*; 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.config.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.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 = hostNameArgument(UserData.getDefaultHostName()); addArgument(hostNameArg); portArg = portArgument(getDefaultAdministrationPort(), INFO_DESCRIPTION_ADMIN_PORT.get()); addArgument(portArg); bindDnArg = bindDNArgument(getDefaultBindDN()); addArgument(bindDnArg); bindPasswordArg = bindPasswordArgument(); addArgument(bindPasswordArg); bindPasswordFileArg = bindPasswordFileArgument(); addArgument(bindPasswordFileArg); trustAllArg = trustAllArgument(); addArgument(trustAllArg); remoteArg = remoteArgument(); addArgument(remoteArg); connectTimeoutArg = connectTimeOutArgument(); addArgument(connectTimeoutArg); showUsageArg = showUsageArgument(); addArgument(showUsageArg); setUsageArgument(showUsageArg); } @Override public void parseArguments(String[] args) throws ArgumentException { LinkedHashSet errorMessages = new LinkedHashSet<>(); try { super.parseArguments(args); } catch (ArgumentException ae) { errorMessages.add(ae.getMessageObject()); } addErrorMessageIfArgumentsConflict(errorMessages, bindPasswordArg, bindPasswordFileArg); 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} if no bind DN was explicitly provided. */ public String getExplicitHostName() { return hostNameArg.isPresent() ? hostNameArg.getValue() : null; } /** * 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() { if (portArg.isPresent()) { try { return portArg.getIntValue(); } catch (ArgumentException ae) { throw new IllegalStateException("Error parsing data: "+ae, ae); } } return -1; } /** * Returns the bind DN explicitly provided in the command-line. * @return the bind DN explicitly provided in the command-line. * Returns {@code null} if no bind DN was explicitly provided. */ public String getExplicitBindDn() { return bindDnArg.isPresent() ? bindDnArg.getValue() : null; } /** * Get the password which has to be used for the command without prompting * the user. If no password was specified, return {@code null}. * * @return The password stored into the specified file on by the * command line argument, or {@code null} 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. * @throws IllegalStateException if the method is called before * parsing the arguments. */ public int getConnectTimeout() throws IllegalStateException { 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(); } }