/* * 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 2008-2010 Sun Microsystems, Inc. * Portions Copyright 2014-2015 ForgeRock AS. */ package org.opends.guitools.uninstaller; import static com.forgerock.opendj.cli.ArgumentConstants.*; import static com.forgerock.opendj.cli.CliMessages.*; import static com.forgerock.opendj.cli.Utils.*; import java.io.OutputStream; import java.util.ArrayList; import java.util.LinkedHashSet; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.i18n.LocalizableMessageBuilder; import org.opends.quicksetup.UserData; import org.opends.server.admin.client.cli.SecureConnectionCliArgs; import org.opends.server.admin.client.cli.SecureConnectionCliParser; import org.opends.server.core.DirectoryServer.DirectoryServerVersionHandler; import com.forgerock.opendj.cli.Argument; import com.forgerock.opendj.cli.ArgumentException; import com.forgerock.opendj.cli.BooleanArgument; import com.forgerock.opendj.cli.CommonArguments; import com.forgerock.opendj.cli.ReturnCode; import com.forgerock.opendj.cli.StringArgument; /** Class used to parse and populate the arguments of the Uninstaller. */ public class UninstallerArgumentParser extends SecureConnectionCliParser { private BooleanArgument cliArg; private BooleanArgument noPromptArg; BooleanArgument forceOnErrorArg; private BooleanArgument quietArg; private BooleanArgument removeAllArg; private BooleanArgument removeServerLibrariesArg; private BooleanArgument removeDatabasesArg; private BooleanArgument removeLogFilesArg; private BooleanArgument removeConfigurationFilesArg; private BooleanArgument removeBackupFilesArg; private BooleanArgument removeLDIFFilesArg; private StringArgument referencedHostNameArg; /** This CLI is always using the administration connector with SSL. */ private final boolean alwaysSSL = true; /** * Creates a new instance of this argument parser with no arguments. * * @param mainClassName * The fully-qualified name of the Java class that should * be invoked to launch the program with which this * argument parser is associated. * @param toolDescription * A human-readable description for the tool, which will be * included when displaying usage information. * @param longArgumentsCaseSensitive * Indicates whether subcommand and long argument names * should be treated in a case-sensitive manner. */ public UninstallerArgumentParser(String mainClassName, LocalizableMessage toolDescription, boolean longArgumentsCaseSensitive) { super(mainClassName, toolDescription, longArgumentsCaseSensitive); setShortToolDescription(REF_SHORT_DESC_UNINSTALL.get()); setVersionHandler(new DirectoryServerVersionHandler()); } /** * Initialize Global option. * * @param outStream * The output stream used for the usage. * @throws ArgumentException * If there is a problem with any of the parameters used * to create this argument. */ public void initializeGlobalArguments(OutputStream outStream) throws ArgumentException { LinkedHashSet<Argument> args = new LinkedHashSet<>(); cliArg = CommonArguments.getCLI(); args.add(cliArg); removeAllArg = new BooleanArgument( "remove-all", 'a', "remove-all", INFO_UNINSTALLDS_DESCRIPTION_REMOVE_ALL.get() ); args.add(removeAllArg); removeServerLibrariesArg = new BooleanArgument( "server-libraries", 'l', "server-libraries", INFO_UNINSTALLDS_DESCRIPTION_REMOVE_SERVER_LIBRARIES.get() ); args.add(removeServerLibrariesArg); removeDatabasesArg = new BooleanArgument( "databases", 'd', "databases", INFO_UNINSTALLDS_DESCRIPTION_REMOVE_DATABASES.get() ); args.add(removeDatabasesArg); removeLogFilesArg = new BooleanArgument( "log-files", 'L', "log-files", INFO_UNINSTALLDS_DESCRIPTION_REMOVE_LOG_FILES.get() ); args.add(removeLogFilesArg); removeConfigurationFilesArg = new BooleanArgument( "configuration-files", 'c', "configuration-files", INFO_UNINSTALLDS_DESCRIPTION_REMOVE_CONFIGURATION_FILES.get() ); args.add(removeConfigurationFilesArg); removeBackupFilesArg = new BooleanArgument( "backup-files", 'b', "backup-files", INFO_UNINSTALLDS_DESCRIPTION_REMOVE_BACKUP_FILES.get() ); args.add(removeBackupFilesArg); removeLDIFFilesArg = new BooleanArgument( "ldif-files", 'e', "ldif-files", INFO_UNINSTALLDS_DESCRIPTION_REMOVE_LDIF_FILES.get() ); args.add(removeLDIFFilesArg); noPromptArg = CommonArguments.getNoPrompt(); args.add(noPromptArg); forceOnErrorArg = new BooleanArgument( "forceOnError", 'f', "forceOnError", INFO_UNINSTALLDS_DESCRIPTION_FORCE.get( "--"+noPromptArg.getLongIdentifier())); args.add(forceOnErrorArg); quietArg = CommonArguments.getQuiet(); args.add(quietArg); for (Argument arg : args) { arg.setPropertyName(arg.getLongIdentifier()); } ArrayList<Argument> defaultArgs = new ArrayList<>(createGlobalArguments(outStream, alwaysSSL)); int index = defaultArgs.indexOf(secureArgsList.bindDnArg); if (index != -1) { defaultArgs.add(index, secureArgsList.adminUidArg); defaultArgs.remove(secureArgsList.bindDnArg); } else { defaultArgs.add(secureArgsList.adminUidArg); } secureArgsList.adminUidArg.setHidden(false); defaultArgs.remove(secureArgsList.hostNameArg); defaultArgs.remove(secureArgsList.portArg); referencedHostNameArg = new StringArgument("referencedHostName", OPTION_SHORT_HOST, OPTION_LONG_REFERENCED_HOST_NAME, false, false, true, INFO_HOST_PLACEHOLDER.get(), UserData.getDefaultHostName(), OPTION_LONG_REFERENCED_HOST_NAME, INFO_DESCRIPTION_REFERENCED_HOST.get()); defaultArgs.add(referencedHostNameArg); args.addAll(defaultArgs); initializeGlobalArguments(args); } /** * Tells whether the user specified to have an interactive uninstall or not. * This method must be called after calling parseArguments. * @return <CODE>true</CODE> if the user specified to have an interactive * uninstall and <CODE>false</CODE> otherwise. */ public boolean isInteractive() { return !noPromptArg.isPresent(); } /** * Tells whether the user specified to force on non critical error in the non * interactive mode. * @return <CODE>true</CODE> if the user specified to force the uninstall in * non critical error and <CODE>false</CODE> otherwise. */ public boolean isForceOnError() { return forceOnErrorArg.isPresent(); } /** * Tells whether the user specified to have a quiet uninstall or not. * This method must be called after calling parseArguments. * @return <CODE>true</CODE> if the user specified to have a quiet * uninstall and <CODE>false</CODE> otherwise. */ public boolean isQuiet() { return quietArg.isPresent(); } /** * Tells whether the user specified to have a verbose uninstall or not. * This method must be called after calling parseArguments. * @return <CODE>true</CODE> if the user specified to have a verbose * uninstall and <CODE>false</CODE> otherwise. */ @Override public boolean isVerbose() { return verboseArg.isPresent(); } /** * Tells whether the user specified to remove all files. * This method must be called after calling parseArguments. * @return <CODE>true</CODE> if the user specified to remove all files and * <CODE>false</CODE> otherwise. */ public boolean removeAll() { return removeAllArg.isPresent(); } /** * Tells whether the user specified to remove library files. * This method must be called after calling parseArguments. * @return <CODE>true</CODE> if the user specified to remove library files and * <CODE>false</CODE> otherwise. */ public boolean removeServerLibraries() { return removeServerLibrariesArg.isPresent(); } /** * Tells whether the user specified to remove database files. * This method must be called after calling parseArguments. * @return <CODE>true</CODE> if the user specified to remove database files * and <CODE>false</CODE> otherwise. */ public boolean removeDatabases() { return removeDatabasesArg.isPresent(); } /** * Tells whether the user specified to remove configuration files. * This method must be called after calling parseArguments. * @return <CODE>true</CODE> if the user specified to remove configuration * files and <CODE>false</CODE> otherwise. */ public boolean removeConfigurationFiles() { return removeConfigurationFilesArg.isPresent(); } /** * Tells whether the user specified to remove backup files. * This method must be called after calling parseArguments. * @return <CODE>true</CODE> if the user specified to remove backup files and * <CODE>false</CODE> otherwise. */ public boolean removeBackupFiles() { return removeBackupFilesArg.isPresent(); } /** * Tells whether the user specified to remove LDIF files. * This method must be called after calling parseArguments. * @return <CODE>true</CODE> if the user specified to remove LDIF files and * <CODE>false</CODE> otherwise. */ public boolean removeLDIFFiles() { return removeLDIFFilesArg.isPresent(); } /** * Tells whether the user specified to remove log files. * This method must be called after calling parseArguments. * @return <CODE>true</CODE> if the user specified to remove log files and * <CODE>false</CODE> otherwise. */ public boolean removeLogFiles() { return removeLogFilesArg.isPresent(); } /** * Returns the default Administrator UID value. * @return the default Administrator UID value. */ public String getDefaultAdministratorUID() { return secureArgsList.adminUidArg.getDefaultValue(); } /** * Returns the Host name to update remote references as provided in the * command-line. * @return the Host name to update remote references as provided in the * command-line. */ public String getReferencedHostName() { if (referencedHostNameArg.isPresent()) { return referencedHostNameArg.getValue(); } return null; } /** * Returns the default value for the Host name to update remote references as * provided in the command-line. * @return the default value for the Host name to update remote references as * provided in the command-line. */ public String getDefaultReferencedHostName() { return referencedHostNameArg.getDefaultValue(); } /** * Indication if provided global options are validate. * * @param buf the LocalizableMessageBuilder to write the error messages. * @return return code. */ @Override public int validateGlobalOptions(LocalizableMessageBuilder buf) { if (!noPromptArg.isPresent() && forceOnErrorArg.isPresent()) { final LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(forceOnErrorArg.getLongIdentifier(), noPromptArg.getLongIdentifier()); if (buf.length() > 0) { buf.append(LINE_SEPARATOR); } buf.append(message); } if (removeAllArg.isPresent()) { BooleanArgument[] removeArgs = { removeServerLibrariesArg, removeDatabasesArg, removeLogFilesArg, removeConfigurationFilesArg, removeBackupFilesArg, removeLDIFFilesArg }; for (BooleanArgument removeArg : removeArgs) { if (removeArg.isPresent()) { LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get( removeAllArg.getLongIdentifier(), removeArg.getLongIdentifier()); if (buf.length() > 0) { buf.append(LINE_SEPARATOR); } buf.append(message); } } } super.validateGlobalOptions(buf); if (buf.length() > 0) { return ReturnCode.CONFLICTING_ARGS.get(); } return ReturnCode.SUCCESS.get(); } /** * Returns whether the command was launched in CLI mode or not. * @return <CODE>true</CODE> if the command was launched to use CLI mode and * <CODE>false</CODE> otherwise. */ public boolean isCli() { return cliArg.isPresent(); } /** * Returns the SecureConnectionCliArgs object containing the arguments * of this parser. * @return the SecureConnectionCliArgs object containing the arguments * of this parser. */ SecureConnectionCliArgs getSecureArgsList() { return secureArgsList; } }