| | |
| | | |
| | | package org.opends.quicksetup.uninstaller; |
| | | |
| | | import java.io.ByteArrayOutputStream; |
| | | import java.io.PrintStream; |
| | | |
| | | import org.opends.quicksetup.SplashScreen; |
| | | import org.opends.quicksetup.i18n.ResourceProvider; |
| | | import org.opends.quicksetup.CliApplication; |
| | | import org.opends.quicksetup.Launcher; |
| | | import org.opends.quicksetup.util.Utils; |
| | | |
| | | /** |
| | |
| | | * of the Directory Server. It just checks the command line arguments and the |
| | | * environment and determines whether the graphical or the command line |
| | | * based uninstall much be launched. |
| | | * |
| | | */ |
| | | public class UninstallLauncher |
| | | { |
| | | public class UninstallLauncher extends Launcher { |
| | | |
| | | /** |
| | | * The main method which is called by the uninstall command lines. |
| | | * The main method which is called by the setup command lines. |
| | | * |
| | | * @param args the arguments passed by the command lines. In the case |
| | | * we want to launch the cli setup they are basically the arguments that we |
| | | * will pass to the org.opends.server.tools.InstallDS class. |
| | | */ |
| | | public static void main(String[] args) { |
| | | new UninstallLauncher(args).launch(); |
| | | } |
| | | |
| | | /** |
| | | * Creates a launcher. |
| | | * |
| | | * @param args the arguments passed by the command lines. |
| | | */ |
| | | public static void main(String[] args) |
| | | { |
| | | boolean printUsage = false; |
| | | boolean useCli = false; |
| | | if ((args != null) && (args.length > 0)) |
| | | { |
| | | for (int i = 0; i < args.length; i++) |
| | | { |
| | | if (args[i].equalsIgnoreCase("--cli")) |
| | | { |
| | | useCli = true; |
| | | } |
| | | else if (args[i].equalsIgnoreCase("-H") || |
| | | args[i].equalsIgnoreCase("--help")) |
| | | { |
| | | printUsage = true; |
| | | } |
| | | } |
| | | |
| | | if (!useCli) |
| | | { |
| | | if (args.length > 0) |
| | | { |
| | | printUsage = true; |
| | | } |
| | | } |
| | | } |
| | | if (printUsage) |
| | | { |
| | | printUsage(); |
| | | System.exit(1); |
| | | } else if (useCli) |
| | | { |
| | | int exitCode = launchCliUninstall(args); |
| | | if (exitCode != 0) |
| | | { |
| | | System.exit(exitCode); |
| | | } |
| | | } else |
| | | { |
| | | System.setProperty("org.opends.quicksetup.uninstall", "true"); |
| | | System.setProperty("org.opends.quicksetup.Application.class", |
| | | "org.opends.quicksetup.uninstaller.Uninstaller"); |
| | | int exitCode = launchGuiUninstall(args); |
| | | if (exitCode != 0) |
| | | { |
| | | System.err.println(getMsg("uninstall-launcher-gui-launched-failed")); |
| | | exitCode = launchCliUninstall(args); |
| | | if (exitCode != 0) |
| | | { |
| | | System.exit(exitCode); |
| | | } |
| | | } |
| | | } |
| | | public UninstallLauncher(String[] args) { |
| | | super(args); |
| | | } |
| | | |
| | | /** |
| | | * Launches the command line based uninstall. |
| | | * @param args the arguments passed |
| | | * @return 0 if everything worked fine, and an error code if something wrong |
| | | * occurred. |
| | | * {@inheritDoc} |
| | | */ |
| | | private static int launchCliUninstall(String[] args) |
| | | { |
| | | System.setProperty("org.opends.quicksetup.cli", "true"); |
| | | |
| | | UninstallCli cli = new UninstallCli(args); |
| | | int returnValue = cli.run(); |
| | | if (returnValue == UninstallCli.USER_DATA_ERROR) |
| | | { |
| | | printUsage(); |
| | | } |
| | | // Add an extra space systematically |
| | | System.out.println(); |
| | | |
| | | return returnValue; |
| | | protected void guiLaunchFailed() { |
| | | System.err.println(getMsg("uninstall-launcher-gui-launched-failed")); |
| | | } |
| | | |
| | | /** |
| | | * Launches the graphical uninstall. The graphical uninstall is launched in a |
| | | * different thread that the main thread because if we have a problem with the |
| | | * graphical system (for instance the DISPLAY environment variable is not |
| | | * correctly set) the native libraries will call exit. However if we launch |
| | | * this from another thread, the thread will just be killed. |
| | | * |
| | | * This code also assumes that if the call to SplashWindow.main worked (and |
| | | * the splash screen was displayed) we will never get out of it (we will call |
| | | * a System.exit() when we close the graphical uninstall dialog). |
| | | * |
| | | * @params String[] args the arguments used to call the SplashWindow main |
| | | * method |
| | | * @return 0 if everything worked fine, or 1 if we could not display properly |
| | | * the SplashWindow. |
| | | * {@inheritDoc} |
| | | */ |
| | | private static int launchGuiUninstall(final String[] args) |
| | | { |
| | | protected void willLaunchGui() { |
| | | System.out.println(getMsg("uninstall-launcher-launching-gui")); |
| | | final int[] returnValue = |
| | | { -1 }; |
| | | Thread t = new Thread(new Runnable() |
| | | { |
| | | public void run() |
| | | { |
| | | // Setup MacOSX native menu bar before AWT is loaded. |
| | | Utils.setMacOSXMenuBar(getMsg("frame-uninstall-title")); |
| | | SplashScreen.main(args); |
| | | returnValue[0] = 0; |
| | | } |
| | | }); |
| | | /* |
| | | * This is done to avoid displaying the stack that might occur if there are |
| | | * problems with the display environment. |
| | | */ |
| | | PrintStream printStream = System.err; |
| | | System.setErr(new EmptyPrintStream()); |
| | | t.start(); |
| | | try |
| | | { |
| | | t.join(); |
| | | } |
| | | catch (InterruptedException ie) |
| | | { |
| | | /* An error occurred, so the return value will be -1. We got nothing to |
| | | do with this exception. */ |
| | | } |
| | | System.setErr(printStream); |
| | | return returnValue[0]; |
| | | System.setProperty("org.opends.quicksetup.uninstall", "true"); |
| | | System.setProperty("org.opends.quicksetup.Application.class", |
| | | "org.opends.quicksetup.uninstaller.Uninstaller"); |
| | | } |
| | | |
| | | private static void printUsage() |
| | | { |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | protected CliApplication createCliApplication() { |
| | | return new Uninstaller(); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | protected String getFrameTitle() { |
| | | return getMsg("frame-uninstall-title"); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | protected void printUsage() { |
| | | String arg; |
| | | if (Utils.isWindows()) |
| | | { |
| | | if (Utils.isWindows()) { |
| | | arg = Utils.getWindowsUninstallFileName(); |
| | | } else |
| | | { |
| | | } else { |
| | | arg = Utils.getUnixUninstallFileName(); |
| | | } |
| | | String msg = getMsg("uninstall-launcher-usage"); |
| | | /* |
| | | * This is required because the usage message contains '{' characters that |
| | | * mess up the MessageFormat.format method. |
| | | */ |
| | | String msg = getMsg("uninstall-launcher-usage"); |
| | | msg = msg.replace("{0}", arg); |
| | | System.err.println(msg); |
| | | printUsage(msg); |
| | | } |
| | | |
| | | /** |
| | | * The following three methods are just commodity methods to get localized |
| | | * messages. |
| | | */ |
| | | private static String getMsg(String key) |
| | | { |
| | | return org.opends.server.util.StaticUtils.wrapText(getI18n().getMsg(key), |
| | | Utils.getCommandLineMaxLineWidth()); |
| | | } |
| | | |
| | | private static ResourceProvider getI18n() |
| | | { |
| | | return ResourceProvider.getInstance(); |
| | | } |
| | | |
| | | /** |
| | | * This class is used to avoid displaying the error message related to display |
| | | * problems that we might have when trying to display the SplashWindow. |
| | | * |
| | | */ |
| | | static class EmptyPrintStream extends PrintStream |
| | | { |
| | | /** |
| | | * Default constructor. |
| | | * |
| | | */ |
| | | public EmptyPrintStream() |
| | | { |
| | | super(new ByteArrayOutputStream(), true); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | public void println(String msg) |
| | | { |
| | | } |
| | | } |
| | | } |