mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

jvergara
17.06.2007 0d7f526c8bd275c9874877a7d9e54fa78ba593ed
Add some code in order the code of the setup to be able to be more reactive to the Cancel operation.  Now the user does not have to wait until the end of the download to stop the setup process nor to the end of the replication initialization.

However there is one thing that is missing: currently there is no mechanism to stop the offline import that we propose. The code has been modified in order to have a placeholder to implement the code once that the stop of the offline import is allowed.
6 files modified
248 ■■■■ changed files
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java 208 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/offline/OfflineInstaller.java 1 ●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/webstart/WebStartInstaller.java 26 ●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java 6 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetup.java 5 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ZipExtractor.java 2 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
@@ -855,7 +855,7 @@
    argList.add("-R");
    argList.add(getInstallation().getRootDirectory().getAbsolutePath());
    String[] args = new String[argList.size()];
    final String[] args = new String[argList.size()];
    argList.toArray(args);
    StringBuilder cmd = new StringBuilder();
    for (String s : argList)
@@ -867,23 +867,37 @@
      cmd.append(s);
    }
    LOG.log(Level.INFO, "configure DS cmd: "+cmd);
    final InstallerHelper helper = new InstallerHelper();
    InvokeThread thread = new InvokeThread()
    {
      public void run()
      {
        int result = -1;
    try
    {
      InstallerHelper helper = new InstallerHelper();
      int result = helper.invokeConfigureServer(args);
          result = helper.invokeConfigureServer(args);
      if (result != 0)
      {
        throw new ApplicationException(
            ae = new ApplicationException(
            ReturnCode.CONFIGURATION_ERROR,
            INFO_ERROR_CONFIGURING.get(), null);
      }
    } catch (Throwable t)
    {
      throw new ApplicationException(
          ae = new ApplicationException(
          ReturnCode.CONFIGURATION_ERROR,
          getThrowableMsg(INFO_ERROR_CONFIGURING.get(), t), t);
    }
        isOver = true;
      }
      public void abort()
      {
        // TODO: implement the abort
      }
    };
    invokeLongOperation(thread);
    checkAbort();
    try
    {
@@ -1013,7 +1027,7 @@
          INFO_PROGRESS_CREATING_BASE_ENTRIES.get()));
    }
    InstallerHelper helper = new InstallerHelper();
    final InstallerHelper helper = new InstallerHelper();
    LinkedList<File> ldifFiles = new LinkedList<File>();
@@ -1021,6 +1035,8 @@
    {
      ldifFiles.add(helper.createBaseEntryTempFile(baseDn));
    }
    checkAbort();
    ArrayList<String> argList = new ArrayList<String>();
    argList.add("-C");
    argList.add(getConfigurationClassName());
@@ -1041,24 +1057,29 @@
    argList.add("-Q");
    String[] args = new String[argList.size()];
    final String[] args = new String[argList.size()];
    argList.toArray(args);
    getApplicationOutputStream().setNotifyListeners(false);
    getApplicationErrorStream().setNotifyListeners(false);
    InvokeThread thread = new InvokeThread()
    {
      public void run()
      {
    try
    {
      int result = helper.invokeImportLDIF(args);
      if (result != 0)
      {
        throw new ApplicationException(
            ae = new ApplicationException(
            ReturnCode.CONFIGURATION_ERROR,
            INFO_ERROR_CREATING_BASE_ENTRY.get(), null);
      }
    } catch (Throwable t)
    {
      throw new ApplicationException(
          ae = new ApplicationException(
          ReturnCode.CONFIGURATION_ERROR,
          getThrowableMsg(INFO_ERROR_CREATING_BASE_ENTRY.get(), t), t);
    }
@@ -1067,6 +1088,14 @@
      getApplicationOutputStream().setNotifyListeners(true);
      getApplicationErrorStream().setNotifyListeners(true);
    }
        isOver = true;
      }
      public void abort()
      {
        // TODO: implement the abort
      }
    };
    invokeLongOperation(thread);
    notifyListeners(getFormattedDone());
  }
@@ -1106,9 +1135,13 @@
      argList.add(ldifPath);
    }
    argList.add("-F");
    String[] args = new String[argList.size()];
    final String[] args = new String[argList.size()];
    argList.toArray(args);
    InvokeThread thread = new InvokeThread()
    {
      public void run()
      {
    try
    {
      InstallerHelper helper = new InstallerHelper();
@@ -1116,16 +1149,24 @@
      if (result != 0)
      {
        throw new ApplicationException(
            ae = new ApplicationException(
            ReturnCode.CONFIGURATION_ERROR,
            INFO_ERROR_IMPORTING_LDIF.get(), null);
      }
    } catch (Throwable t)
    {
      throw new ApplicationException(
          ae = new ApplicationException(
          ReturnCode.CONFIGURATION_ERROR,
          getThrowableMsg(INFO_ERROR_IMPORTING_LDIF.get(), t), t);
    }
        isOver = true;
      }
      public void abort()
      {
        // TODO: implement the abort
      }
    };
    invokeLongOperation(thread);
  }
  /**
@@ -1145,7 +1186,7 @@
    for (File templatePath : templatePaths)
    {
      ArrayList<String> argList = new ArrayList<String>();
      final ArrayList<String> argList = new ArrayList<String>();
      argList.add("-C");
      argList.add(getConfigurationClassName());
@@ -1161,9 +1202,13 @@
      // append: each file contains data for each base DN.
      argList.add("-a");
      String[] args = new String[argList.size()];
      final String[] args = new String[argList.size()];
      argList.toArray(args);
      InvokeThread thread = new InvokeThread()
      {
        public void run()
        {
      try
      {
        InstallerHelper helper = new InstallerHelper();
@@ -1171,18 +1216,27 @@
        if (result != 0)
        {
          throw new ApplicationException(
              ae = new ApplicationException(
              ReturnCode.CONFIGURATION_ERROR,
              INFO_ERROR_IMPORT_LDIF_TOOL_RETURN_CODE.get(
                  Integer.toString(result)), null);
        }
      } catch (Throwable t)
      {
        throw new ApplicationException(
            ae = new ApplicationException(
            ReturnCode.CONFIGURATION_ERROR,
            getThrowableMsg(INFO_ERROR_IMPORT_AUTOMATICALLY_GENERATED.get(
                listToString(argList, " "), t.getLocalizedMessage()), t), t);
                    listToString(argList, " "), t.getLocalizedMessage()), t),
                    t);
      }
          isOver = true;
        }
        public void abort()
        {
          // TODO: implement the abort
        }
      };
      invokeLongOperation(thread);
    }
  }
@@ -1642,7 +1696,7 @@
   *
   * @throws ApplicationException thrown if <code>canceled</code>
   */
  protected void checkAbort() throws ApplicationException {
  public void checkAbort() throws ApplicationException {
    if (canceled) {
      setCurrentProgressStep(InstallProgressStep.CANCELING);
      notifyListeners(null);
@@ -3819,6 +3873,7 @@
        String.valueOf(replicaId));
    while (!taskCreated)
    {
      checkAbort();
      String id = "quicksetup-initialize"+i;
      dn = "ds-task-id="+id+",cn=Scheduled Tasks,cn=Tasks";
      attrs.put("ds-task-id", id);
@@ -3864,6 +3919,13 @@
    int totalEntries = 0;
    while (!isOver)
    {
      if (canceled)
      {
        // TODO: we should try to cleanly abort the initialize.  As we have
        // aborted the install, the server will be stopped and the remote
        // server will receive a connect error.
        checkAbort();
      }
      try
      {
        Thread.sleep(500);
@@ -3871,6 +3933,13 @@
      catch (Throwable t)
      {
      }
      if (canceled)
      {
        // TODO: we should try to cleanly abort the initialize.  As we have
        // aborted the install, the server will be stopped and the remote
        // server will receive a connect error.
        checkAbort();
      }
      try
      {
        NamingEnumeration res = ctx.search(dn, filter, searchControls);
@@ -4115,6 +4184,7 @@
    attrs.put("ds-task-reset-generation-id-domain-base-dn", suffixDn);
    while (!taskCreated)
    {
      checkAbort();
      String id = "quicksetup-reset-generation-id-"+i;
      dn = "ds-task-id="+id+",cn=Scheduled Tasks,cn=Tasks";
      attrs.put("ds-task-id", id);
@@ -4194,11 +4264,13 @@
          if (helper.isCompletedWithErrors(state))
          {
            LOG.log(Level.WARNING, "Completed with error: "+errorMsg);
            notifyListeners(getFormattedWarning(errorMsg));
          }
          else if (!helper.isSuccessful(state) ||
              helper.isStoppedByError(state))
          {
            LOG.log(Level.WARNING, "Error: "+errorMsg);
            ApplicationException ae = new ApplicationException(
                ReturnCode.APPLICATION_ERROR, errorMsg,
                null);
@@ -4220,4 +4292,102 @@
      }
    }
  }
  /**
   * Invokes a long operation in a separate thread and checks whether the user
   * canceled the operation or not.
   * @param thread the Thread that must be launched.
   * @throws ApplicationException if there was an error executing the task or
   * if the user canceled the installer.
   */
  private void invokeLongOperation(InvokeThread thread)
  throws ApplicationException
  {
    try
    {
      thread.start();
      while (!thread.isOver() && thread.isAlive())
      {
        if (canceled)
        {
          // Try to abort the thread
          try
          {
            thread.abort();
          }
          catch (Throwable t)
          {
            LOG.log(Level.WARNING, "Error cancelling thread: "+t, t);
          }
        }
        else if (thread.getException() != null)
        {
          throw thread.getException();
        }
        else
        {
          try
          {
            Thread.sleep(100);
          }
          catch (Throwable t)
          {
          }
        }
      }
      if (canceled)
      {
        checkAbort();
      }
    }
    catch (ApplicationException e)
    {
      throw e;
    }
    catch (Throwable t)
    {
      LOG.log(Level.SEVERE, "Error: "+t, t);
      throw new ApplicationException(ReturnCode.BUG,
          Utils.getThrowableMsg(INFO_BUG_MSG.get(), t), t);
    }
  }
}
/**
 * Class used to be able to cancel long operations.
 */
abstract class InvokeThread extends Thread implements Runnable
{
  protected boolean isOver = false;
  protected ApplicationException ae;
  /**
   * Returns <CODE>true</CODE> if the thread is over and <CODE>false</CODE>
   * otherwise.
   * @return  <CODE>true</CODE> if the thread is over and <CODE>false</CODE>
   * otherwise.
   */
  public boolean isOver()
  {
    return isOver;
  }
  /**
   * Returns the exception that was encountered running the thread.
   * @return the exception that was encountered running the thread.
   */
  public ApplicationException getException()
  {
    return ae;
  }
  /**
   * Runnable implementation.
   */
  public abstract void run();
  /**
   * Abort this thread.
   */
  public abstract void abort();
}
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/offline/OfflineInstaller.java
@@ -162,6 +162,7 @@
    } catch (ApplicationException ex)
    {
      LOG.log(Level.SEVERE, "Caught exception: "+ex, ex);
      if (ReturnCode.CANCELLED.equals(ex.getType())) {
        uninstall();
        setCurrentProgressStep(InstallProgressStep.FINISHED_CANCELED);
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/webstart/WebStartInstaller.java
@@ -105,6 +105,7 @@
    initMaps();
    PrintStream origErr = System.err;
    PrintStream origOut = System.out;
    boolean downloadedBits = false;
    try
    {
      System.setErr(getApplicationErrorStream());
@@ -125,6 +126,7 @@
      createParentDirectoryIfRequired();
      extractZipFiles(in, getRatio(InstallProgressStep.EXTRACTING),
          getRatio(InstallProgressStep.CONFIGURING_SERVER));
      downloadedBits = true;
      try
      {
@@ -212,7 +214,8 @@
    } catch (ApplicationException ex)
    {
      if (ReturnCode.CANCELLED.equals(ex.getType())) {
        uninstall();
        uninstall(downloadedBits);
        setCurrentProgressStep(InstallProgressStep.FINISHED_CANCELED);
        notifyListeners(null);
      } else {
@@ -515,10 +518,12 @@
  /**
   * Uninstall what has already been installed.
   * @param downloadedBits whether the bits were downloaded or not.
   */
  private void uninstall() {
  private void uninstall(boolean downloadedBits) {
    if (downloadedBits)
    {
    notifyListeners(getTaskSeparator());
    Installation installation = getInstallation();
    FileManager fm = new FileManager(this);
@@ -540,6 +545,21 @@
      LOG.log(Level.INFO, "error deleting files", e);
    }
  }
    else
    {
      File serverRoot = new File(getUserData().getServerLocation());
      if (serverRoot.exists())
      {
        FileManager fm = new FileManager(this);
        try {
          fm.deleteRecursively(serverRoot, null,
              FileManager.DeletionPolicy.DELETE_ON_EXIT_IF_UNSUCCESSFUL);
        } catch (ApplicationException e) {
          LOG.log(Level.INFO, "error deleting files", e);
        }
      }
    }
  }
  /**
   * {@inheritDoc}
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java
@@ -496,6 +496,7 @@
      WebStartDownloader.Status.DOWNLOADING;
    while (!loader.isFinished() && (loader.getException() == null))
    {
      checkAbort();
      // Pool until is over
      int perc = loader.getDownloadPercentage();
      WebStartDownloader.Status downloadStatus = loader.getStatus();
@@ -521,7 +522,8 @@
        }
        loader.setSummary(summary);
        notifyListeners(ratio, summary, null);
      }
      checkAbort();
        try
        {
          Thread.sleep(300);
@@ -530,7 +532,7 @@
          // do nothing;
        }
      }
    }
    checkAbort();
    if (loader.getException() != null)
    {
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetup.java
@@ -695,8 +695,9 @@
    {
      progressDetails.append(additionalDetails);
    }
    // Note: progressDetails might have lot of messages and since the fix for
    // issue 2142 was committed there is a limitation in this area.  So here
    // Note: progressDetails might have a certain number of characters that
    // break Message Formatter (for instance percentages).  When fix for
    // issue 2142 was committed it broke this code.  So here
    // we use Message.raw instead of calling directly progressDetails.toMessage
    return new ProgressDescriptor(status, ratio, newProgressLabel,
        Message.raw(progressDetails.toString()));
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ZipExtractor.java
@@ -180,8 +180,10 @@
        new HashMap<String, ArrayList<String>>();
    try {
      application.checkAbort();
      ZipEntry entry = zipIn.getNextEntry();
      while (entry != null) {
        application.checkAbort();
        int ratioBeforeCompleted = minRatio
                + ((nEntries - 1) * (maxRatio - minRatio) / numberZipEntries);
        int ratioWhenCompleted =