/* Undo updatetool configuration and post-installation setups.*/
  public void unconfigureUpdatetool() throws Exception {
    /* Try to shutdown the notifer. Don't do this on Mac, the notifier command
    does not work on Mac, refer to Issue #7348. */
    if (!OSUtils.isMac() && !OSUtils.isAix()) {
      try {
        String shutdownCommand;
        if (OSUtils.isWindows()) {
          shutdownCommand = productRef.getInstallLocation() + "\\updatetool\\bin\\updatetool.exe";
        } else {
          shutdownCommand = productRef.getInstallLocation() + "/updatetool/bin/updatetool";
        }
        String[] shutdownCommandArray = {shutdownCommand, "--notifier", "--shutdown"};
        LOGGER.log(Level.INFO, Msg.get("SHUTDOWN_NOTIFIER", null));
        ExecuteCommand shutdownExecuteCommand = new ExecuteCommand(shutdownCommandArray);
        shutdownExecuteCommand.setOutputType(ExecuteCommand.ERRORS | ExecuteCommand.NORMAL);
        shutdownExecuteCommand.setCollectOutput(true);
        LOGGER.log(
            Level.FINEST,
            shutdownExecuteCommand.expandCommand(shutdownExecuteCommand.getCommand()));
        shutdownExecuteCommand.execute();
      } catch (Exception e) {
        LOGGER.log(Level.FINEST, e.getMessage());
        // Its okay to ignore this for now.
      }
    } /* End, conditional code for Mac and Aix. */

    /* Now unregister notifer. */
    try {
      String configCommand;
      if (OSUtils.isWindows()) {
        configCommand = productRef.getInstallLocation() + "\\updatetool\\bin\\updatetoolconfig.bat";
      } else {
        configCommand = productRef.getInstallLocation() + "/updatetool/bin/updatetoolconfig";
      }
      String[] configCommandArray = {configCommand, "--unregister"};
      LOGGER.log(Level.INFO, Msg.get("UNREGISTER_NOTIFIER", null));
      ExecuteCommand configExecuteCommand = new ExecuteCommand(configCommandArray);
      configExecuteCommand.setOutputType(ExecuteCommand.ERRORS | ExecuteCommand.NORMAL);
      configExecuteCommand.setCollectOutput(true);
      LOGGER.log(
          Level.FINEST, configExecuteCommand.expandCommand(configExecuteCommand.getCommand()));

      configExecuteCommand.execute();
    } catch (Exception e) {
      LOGGER.log(Level.FINEST, e.getMessage());
      // Its okay to ignore this for now.

    }
  }
  /*create updatetool wrapper script used by shortcut items */
  private void setupUpdateToolScripts() {
    LOGGER.log(Level.INFO, Msg.get("SETUP_UPDATETOOL_SCRIPT", null));
    org.glassfish.installer.util.FileUtils.createDirectory(
        productRef.getInstallLocation() + File.separator + "updatetool" + File.separator + "lib");
    try {
      if (OSUtils.isWindows()) {
        FileIOUtils updateToolScript = new FileIOUtils();
        updateToolScript.openFile(
            productRef.getInstallLocation() + "\\updatetool\\lib\\updatetool-start.bat");
        updateToolScript.appendLine(GlassFishUtils.windowsCopyRightNoticeText);
        updateToolScript.appendLine("setlocal");
        updateToolScript.appendLine(
            "cd \"" + productRef.getInstallLocation() + "\\updatetool\\bin\"");
        updateToolScript.appendLine("call updatetool.exe");
        updateToolScript.appendLine("endlocal");
        updateToolScript.saveFile();
        updateToolScript.closeFile();
      } else {
        FileIOUtils updateToolScript = new FileIOUtils();
        updateToolScript.openFile(
            productRef.getInstallLocation() + "/updatetool/lib/updatetool-start");
        updateToolScript.appendLine(GlassFishUtils.unixCopyRightNoticeText);
        updateToolScript.appendLine(
            "cd \"" + productRef.getInstallLocation() + "/updatetool/bin\"");
        updateToolScript.appendLine("./updatetool");
        updateToolScript.saveFile();
        updateToolScript.closeFile();
        org.glassfish.installer.util.FileUtils.setExecutable(
            productRef.getInstallLocation() + "/updatetool/lib/updatetool-start");
      }

    } catch (Exception ex) {
      LOGGER.log(Level.FINEST, ex.getMessage());
    }
  }
  private void setupUnixDomainScripts() {
    LOGGER.log(Level.INFO, Msg.get("SETUP_STARTSTOP_SCRIPTS", null));
    try {
      FileIOUtils startFile = new FileIOUtils();
      startFile.openFile(productRef.getInstallLocation() + "/glassfish/lib/asadmin-start-domain");
      startFile.appendLine(GlassFishUtils.unixCopyRightNoticeText);
      startFile.appendLine(
          "\"" + productRef.getInstallLocation() + "/glassfish/bin/asadmin\" start-domain domain1");
      startFile.saveFile();
      startFile.closeFile();

      FileIOUtils stopFile = new FileIOUtils();
      stopFile.openFile(productRef.getInstallLocation() + "/glassfish/lib/asadmin-stop-domain");
      stopFile.appendLine(GlassFishUtils.unixCopyRightNoticeText);
      stopFile.appendLine(
          "\"" + productRef.getInstallLocation() + "/glassfish/bin/asadmin\" stop-domain domain1");
      stopFile.saveFile();
      stopFile.closeFile();

      org.glassfish.installer.util.FileUtils.setExecutable(
          new File(productRef.getInstallLocation() + "/glassfish/lib/asadmin-start-domain")
              .getAbsolutePath());
      org.glassfish.installer.util.FileUtils.setExecutable(
          new File(productRef.getInstallLocation() + "/glassfish/lib/asadmin-stop-domain")
              .getAbsolutePath());
    } catch (Exception ex) {
      LOGGER.log(Level.FINEST, ex.getMessage());
    }
  }
  /* Create wrappers for asadmin start/stop on Windows.
   * This also should include copyright, that is currently taken from OSUtils.
   */
  private void setupWindowsDomainScripts() {
    LOGGER.log(Level.INFO, Msg.get("SETUP_STARTSTOP_SCRIPTS", null));
    try {
      FileIOUtils startFile = new FileIOUtils();
      startFile.openFile(
          productRef.getInstallLocation() + "\\glassfish\\lib\\asadmin-start-domain.bat");
      startFile.appendLine(GlassFishUtils.windowsCopyRightNoticeText);
      startFile.appendLine("setlocal");
      startFile.appendLine(
          "call \""
              + productRef.getInstallLocation()
              + "\\glassfish\\bin\\asadmin\" start-domain domain1\n");
      startFile.appendLine("pause");
      startFile.appendLine("endlocal");
      startFile.saveFile();
      startFile.closeFile();

      FileIOUtils stopFile = new FileIOUtils();
      stopFile.openFile(
          productRef.getInstallLocation() + "\\glassfish\\lib\\asadmin-stop-domain.bat");
      stopFile.appendLine(GlassFishUtils.windowsCopyRightNoticeText);
      stopFile.appendLine("setlocal");
      stopFile.appendLine(
          "call \""
              + productRef.getInstallLocation()
              + "\\glassfish\\bin\\asadmin\" stop-domain domain1\n");
      stopFile.appendLine("pause");
      stopFile.appendLine("endlocal");
      stopFile.saveFile();
      stopFile.closeFile();
    } catch (Exception ex) {
      LOGGER.log(Level.FINEST, ex.getMessage());
      // OK to ignore this for now.
    }
  }
  /*
   * OI hook to call individual product configurations.
   */
  public ResultReport unConfigure(final PropertySheet propSheet, final boolean validateFlag) {

    try {
      if (productRef.getProductName().equals("Domain")) {
        LOGGER.log(Level.INFO, Msg.get("UNCONFIGURING_GLASSFISH", null));
        unconfigureGlassfish();
      }

      if (productRef.getProductName().equals("UpdateTool")) {
        LOGGER.log(Level.INFO, Msg.get("UNCONFIGURING_UPDATETOOL", null));
        unconfigureUpdatetool();
        org.glassfish.installer.util.FileUtils.deleteDirectory(
            new File(productRef.getInstallLocation() + File.separator + "updatetool"));
        org.glassfish.installer.util.FileUtils.deleteDirectory(
            new File(productRef.getInstallLocation() + File.separator + "pkg"));
      }
      /* Delete the newly created folder, on windows. No incremental uninstallation, so delete everything.*/
      String folderName = (String) TemplateProcessor.getInstance().getFromDataModel("PRODUCT_NAME");
      if (OSUtils.isWindows()) {
        WindowsShortcutManager wsShortMgr = new WindowsShortcutManager();
        wsShortMgr.deleteFolder(folderName);
      }
    } catch (Exception e) {
      LOGGER.log(Level.FINEST, e.getMessage());
    }

    return new ResultReport(
        ResultReport.ResultStatus.SUCCESS,
        "http://www.oracle.com/pls/topic/lookup?ctx=821-2427&id=sjsaseeig",
        "http://www.oracle.com/pls/topic/lookup?ctx=821-2427&id=sjsaseeig",
        null,
        productError);
  }
  private void updateConfigFile() throws EnhancedException {

    // for SDK cobundles with JDK - see if cobundled JDK exists and use that
    // checks for jdk7 directory since we only have JDK 7 cobundles

    if (org.glassfish.installer.util.FileUtils.isFileExist(
        productRef.getInstallLocation() + File.separator + "jdk7")) {
      jdkHome = productRef.getInstallLocation() + File.separator + "jdk7";

      // on Unix, set executable permissions to jdk7/bin/* and jdk7/jre/bin/*
      if (!OSUtils.isWindows()) {
        org.glassfish.installer.util.FileUtils.setAllFilesExecutable(
            productRef.getInstallLocation() + File.separator + "jdk7" + File.separator + "bin");
        org.glassfish.installer.util.FileUtils.setAllFilesExecutable(
            productRef.getInstallLocation()
                + File.separator
                + "jdk7"
                + File.separator
                + "jre"
                + File.separator
                + "bin");
      }
    } else {

      // For all installation modes, fetch JAVA_HOME from panel;
      // on MacOS and AIX use java.home property since panel is skipped

      try {
        if (OSUtils.isMac() || OSUtils.isAix()) {
          jdkHome = System.getProperty("java.home");
        } else {
          jdkHome = ConfigHelper.getStringValue("JDKSelection.directory.SELECTED_JDK");
        }
      } catch (Exception e) {
        jdkHome = new File(System.getProperty("java.home")).getParent();
        if (OSUtils.isMac() || OSUtils.isAix()) {
          jdkHome = System.getProperty("java.home");
        }
      }
    }
    LOGGER.log(Level.INFO, Msg.get("UPDATE_CONFIG_HEADER", null));
    LOGGER.log(Level.INFO, Msg.get("JDK_HOME", new String[] {jdkHome}));
    // write jdkHome value to asenv.bat on Windows, asenv.conf on non-Windows platform...
    try {
      FileIOUtils configFile = new FileIOUtils();
      configFile.openFile(productRef.getConfigFilePath());
      /* Add AS_JAVA to end of buffer and file. */
      if (OSUtils.isWindows()) {
        configFile.appendLine("set AS_JAVA=" + jdkHome);
      } else {
        configFile.appendLine("AS_JAVA=" + jdkHome);
      }
      configFile.saveFile();
      configFile.closeFile();
    } catch (Exception ex) {
      LOGGER.log(Level.FINEST, ex.getMessage());
    }
  }
  /*
   * OI hook to call individual product configurations.
   */
  public ResultReport configure(final PropertySheet propSheet, final boolean validateFlag)
      throws EnhancedException {

    configSuccessful = true;
    /* Storing a reference of Property Sheet to a local Hash, so that other
     * parts of this class can access the configuration data anytime needed.
     */
    setConfigData(propSheet.getAllProps());
    try {
      if (productRef.getProductName().equals("Domain")) {
        LOGGER.log(Level.INFO, Msg.get("CONFIGURING_GLASSFISH", null));
        configureGlassfish();
      }
    } catch (Exception e) {
      // Don't do anything as major error detection is handled throughout
      // this class where appropriate and fatal.
      LOGGER.log(Level.FINEST, e.getMessage());
    }

    try {
      if (productRef.getProductName().equals("UpdateTool")) {
        LOGGER.log(Level.INFO, Msg.get("CONFIGURING_UPDATETOOL", null));
        configureUpdatetool();
      }
    } catch (Exception e) {
      LOGGER.log(Level.FINEST, e.getMessage());
      configSuccessful = false;
    }

    ResultReport.ResultStatus status =
        configSuccessful ? ResultReport.ResultStatus.SUCCESS : ResultReport.ResultStatus.FAIL;
    return new ResultReport(
        status,
        "http://www.oracle.com/pls/topic/lookup?ctx=821-2427&id=sjsaseeig ",
        "http://www.oracle.com/pls/topic/lookup?ctx=821-2427&id=sjsaseeig",
        null,
        productError);
  }
  /* Undo GlassFish configuration and post-installation setups.*/
  public void unconfigureGlassfish() {
    // Try to stop domain.
    stopDomain();
    LOGGER.log(Level.INFO, Msg.get("CLEANINGUP_DIRECTORIES", null));
    try {
      // Cleanup list includes both windows and non-windows files.
      // FileUtils does check for the file before deleting.
      String dirList[] = {
        productRef.getInstallLocation() + File.separator + "glassfish" + File.separator + "domains",
        productRef.getInstallLocation() + File.separator + "glassfish" + File.separator + "modules",
        productRef.getInstallLocation() + File.separator + "glassfish" + File.separator + "nodes",
        productRef.getInstallLocation() + File.separator + "glassfish" + File.separator + "lib"
      };
      for (int i = 0; i < dirList.length; i++) {
        LOGGER.log(Level.FINEST, dirList[i]);
        org.glassfish.installer.util.FileUtils.deleteDirectory(new File(dirList[i]));
      }

    } catch (Exception e) {
      LOGGER.log(Level.FINEST, e.getMessage() + "\n");
    }
  }
  /* Run configuration steps for update tool component. */
  public void configureUpdatetool() throws Exception {

    // set execute permissions for UC utilities
    if (!OSUtils.isWindows()) {
      LOGGER.log(Level.INFO, Msg.get("SETTING_EXECUTE_PERMISSIONS_FOR_UPDATETOOL", null));
      org.glassfish.installer.util.FileUtils.setExecutable(
          productRef.getInstallLocation() + "/bin/pkg");
      org.glassfish.installer.util.FileUtils.setExecutable(
          productRef.getInstallLocation() + "/bin/updatetool");
    }

    setupUpdateToolScripts();

    // check whether to bootstrap at all
    if (!ConfigHelper.getBooleanValue("UpdateTool.Configuration.BOOTSTRAP_UPDATETOOL")) {
      LOGGER.log(Level.INFO, Msg.get("SKIPPING_UPDATETOOL_BOOTSTRAP", null));
    } else {
      boolean allowUpdateCheck =
          ConfigHelper.getBooleanValue("UpdateTool.Configuration.ALLOW_UPDATE_CHECK");
      String proxyHost = configData.get("PROXY_HOST");
      String proxyPort = configData.get("PROXY_PORT");
      // populate bootstrap properties
      Properties props = new Properties();
      if (OSUtils.isWindows()) {
        props.setProperty("image.path", productRef.getInstallLocation().replace('\\', '/'));
      } else {
        props.setProperty("image.path", productRef.getInstallLocation());
      }
      props.setProperty("install.pkg", "true");
      if (!OSUtils.isAix()) {
        props.setProperty("install.updatetool", "true");
      } else {
        props.setProperty("install.updatetool", "false");
      }
      props.setProperty("optin.update.notification", allowUpdateCheck ? "true" : "false");

      props.setProperty("optin.usage.reporting", allowUpdateCheck ? "true" : "false");
      if ((proxyHost.length() > 0) && (proxyPort.length() > 0)) {
        props.setProperty("proxy.URL", "http://" + proxyHost + ":" + proxyPort);
      }
      LOGGER.log(Level.INFO, Msg.get("BOOTSTRAPPING_UPDATETOOL", null));
      LOGGER.log(Level.FINEST, props.toString());

      // explicitly refreshing catalogs, workaround for bootstrap issue
      // proceed to bootstrap if there is an exception
      try {
        SystemInfo.initUpdateToolProps(props);
        Image img = new Image(productRef.getInstallLocation());
        img.refreshCatalogs();
      } catch (Exception e) {
        LOGGER.log(Level.FINEST, e.getMessage());
      }

      // invoke bootstrap
      Bootstrap.main(props, LOGGER);
    }
    // Create the required windows start->menu shortcuts for updatetool.
    if (OSUtils.isWindows()) {
      createUpdatetoolShortCuts();
    }
  }