From 90288dc278771356aa6dfa3832cb4a4bb19e9fab Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Wed, 04 Jul 2007 16:48:57 +0000
Subject: [PATCH] This commit's design changes have been reviewed and approved by Brian Ehret.

---
 opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java |  319 ++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 220 insertions(+), 99 deletions(-)

diff --git a/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java b/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
index 03b0f9a..106efa4 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
@@ -106,6 +106,10 @@
   /** When true indicates that the user has canceled this operation. */
   protected boolean canceled = false;
 
+  /** Map containing information about what has been configured remotely. */
+  Map<ServerDescriptor, ConfiguredReplication> hmConfiguredRemoteReplication =
+    new HashMap<ServerDescriptor, ConfiguredReplication>();
+
   // Constants used to do checks
   private static final int MIN_DIRECTORY_MANAGER_PWD = 1;
 
@@ -135,9 +139,7 @@
   {
     SUBSTEPS.add(Step.CREATE_GLOBAL_ADMINISTRATOR);
     SUBSTEPS.add(Step.SUFFIXES_OPTIONS);
-    // TODO: remove this comment once we want to display the replication options
-    // in setup.
-    //SUBSTEPS.add(Step.NEW_SUFFIX_OPTIONS);
+    SUBSTEPS.add(Step.NEW_SUFFIX_OPTIONS);
     SUBSTEPS.add(Step.REMOTE_REPLICATION_PORTS);
   }
 
@@ -146,6 +148,10 @@
 
   private char[] selfSignedCertPw = null;
 
+  private boolean registeredNewServerOnRemote;
+  private boolean createdAdministrator;
+  private boolean createdRemoteAds;
+
   /**
    * An static String that contains the class name of ConfigFileHandler.
    */
@@ -161,17 +167,14 @@
   public Installer() {
     lstSteps.add(WELCOME);
     lstSteps.add(SERVER_SETTINGS);
-    // TODO: remove this comment once we want to display the replication options
-    // in setup.
-    /*
     lstSteps.add(REPLICATION_OPTIONS);
     lstSteps.add(CREATE_GLOBAL_ADMINISTRATOR);
     lstSteps.add(SUFFIXES_OPTIONS);
     lstSteps.add(REMOTE_REPLICATION_PORTS);
-    */
     lstSteps.add(NEW_SUFFIX_OPTIONS);
     lstSteps.add(REVIEW);
     lstSteps.add(PROGRESS);
+    lstSteps.add(FINISHED);
     try {
       if (!QuickSetupLog.isInitialized())
         QuickSetupLog.initLogFileHandler(
@@ -211,7 +214,8 @@
    */
   public boolean canGoBack(WizardStep step) {
     return step != WELCOME &&
-            step != PROGRESS;
+            step != PROGRESS &&
+            step != FINISHED;
   }
 
   /**
@@ -219,7 +223,8 @@
    */
   public boolean canGoForward(WizardStep step) {
     return step != REVIEW &&
-            step != PROGRESS;
+            step != PROGRESS &&
+            step != FINISHED;
   }
 
   /**
@@ -233,7 +238,8 @@
    * {@inheritDoc}
    */
   public boolean canQuit(WizardStep step) {
-    return step != PROGRESS;
+    return step != PROGRESS &&
+    step != FINISHED;
   }
 
   /**
@@ -294,9 +300,6 @@
     {
       isVisible = true;
     }
-    // TODO: remove this line once we want to display the replication options
-    // in setup.
-    isVisible = true;
     return isVisible;
   }
 
@@ -325,6 +328,9 @@
           "Cannot click on next from progress step");
     } else if (cStep == REVIEW) {
       throw new IllegalStateException("Cannot click on next from review step");
+    } else if (cStep == FINISHED) {
+      throw new IllegalStateException(
+          "Cannot click on next from finished step");
     }
   }
 
@@ -338,6 +344,10 @@
               getMsg("confirm-close-install-title"))) {
         qs.quit();
       }
+    }
+    else if (cStep == FINISHED)
+    {
+      qs.quit();
     } else {
       throw new IllegalStateException(
               "Close only can be clicked on PROGRESS step");
@@ -358,7 +368,7 @@
    * {@inheritDoc}
    */
   public void cancel() {
-    setStatus(InstallProgressStep.WAITING_TO_CANCEL);
+    setCurrentProgressStep(InstallProgressStep.WAITING_TO_CANCEL);
     notifyListeners(null);
     this.canceled = true;
   }
@@ -367,7 +377,11 @@
    * {@inheritDoc}
    */
   public void quitClicked(WizardStep cStep, QuickSetup qs) {
-    if (cStep == PROGRESS) {
+    if (cStep == FINISHED)
+    {
+      qs.quit();
+    }
+    else if (cStep == PROGRESS) {
       throw new IllegalStateException(
               "Cannot click on quit from progress step");
     } else if (installStatus.isInstalled()) {
@@ -443,6 +457,8 @@
         p = new InstallReviewPanel(this);
     } else if (step == PROGRESS) {
         p = new ProgressPanel(this);
+    } else if (step == FINISHED) {
+        p = new FinishedPanel(this);
     }
     return p;
   }
@@ -504,6 +520,9 @@
     } else if (cStep == PROGRESS) {
       throw new IllegalStateException(
           "Cannot click on previous from progress step");
+    } else if (cStep == FINISHED) {
+      throw new IllegalStateException(
+          "Cannot click on previous from finished step");
     }
   }
 
@@ -515,13 +534,13 @@
   }
 
   /** Indicates the current progress step. */
-  private InstallProgressStep status =
+  private InstallProgressStep currentProgressStep =
           InstallProgressStep.NOT_STARTED;
 
   /**
    * {@inheritDoc}
    */
-  protected void setWizardDialogState(QuickSetupDialog dlg,
+  public void setWizardDialogState(QuickSetupDialog dlg,
                                       UserData userData,
                                       WizardStep step) {
     if (!installStatus.isInstalled() || forceToDisplaySetup) {
@@ -532,8 +551,9 @@
       } else if (step == WELCOME) {
         dlg.setDefaultButton(ButtonName.NEXT);
         dlg.setFocusOnButton(ButtonName.NEXT);
-      } else if (step == REVIEW) {
-        dlg.setDefaultButton(ButtonName.NEXT);
+      } else if ((step == PROGRESS) || (step == FINISHED)) {
+        dlg.setDefaultButton(ButtonName.CLOSE);
+        dlg.setFocusOnButton(ButtonName.CLOSE);
       } else {
         dlg.setDefaultButton(ButtonName.NEXT);
       }
@@ -545,7 +565,7 @@
    */
   public ProgressStep getCurrentProgressStep()
   {
-    return status;
+    return currentProgressStep;
   }
 
   /**
@@ -627,17 +647,14 @@
     LinkedHashSet<WizardStep> orderedSteps = new LinkedHashSet<WizardStep>();
     orderedSteps.add(WELCOME);
     orderedSteps.add(SERVER_SETTINGS);
-    // TODO: remove this comment once we want to display the replication options
-    // in setup.
-    /*
     orderedSteps.add(REPLICATION_OPTIONS);
     orderedSteps.add(CREATE_GLOBAL_ADMINISTRATOR);
     orderedSteps.add(SUFFIXES_OPTIONS);
     orderedSteps.add(REMOTE_REPLICATION_PORTS);
-    */
     orderedSteps.add(NEW_SUFFIX_OPTIONS);
     orderedSteps.add(REVIEW);
     orderedSteps.add(PROGRESS);
+    orderedSteps.add(FINISHED);
     return orderedSteps;
   }
 
@@ -659,6 +676,13 @@
   }
 
   /**
+   * {@inheritDoc}
+   */
+  public WizardStep getFinishedStep() {
+    return Step.FINISHED;
+  }
+
+  /**
    * Uninstalls installed services.  This is to be used when the user
    * has elected to cancel an installation.
    */
@@ -672,10 +696,7 @@
       }
     }
 
-    if (completedProgress.contains(
-            InstallProgressStep.CONFIGURING_REPLICATION)) {
-      // TODO:  undo replication
-    }
+    unconfigureRemote();
   }
 
   /**
@@ -1085,6 +1106,112 @@
   }
 
   /**
+   * This method undoes the modifications made in other servers in terms of
+   * replication.  This method assumes that we are aborting the Installer and
+   * that is why it does not call checkAbort.
+   */
+  private void unconfigureRemote()
+  {
+    InitialLdapContext ctx = null;
+    if (registeredNewServerOnRemote || createdAdministrator ||
+    createdRemoteAds)
+    {
+      // Try to connect
+      DataReplicationOptions repl = getUserData().getReplicationOptions();
+      AuthenticationData auth = repl.getAuthenticationData();
+      String ldapUrl = getLdapUrl(auth);
+      String dn = auth.getDn();
+      String pwd = auth.getPwd();
+      notifyListeners(getFormattedWithPoints(
+          getMsg("progress-unconfiguring-ads-on-remote",
+              getHostDisplay(auth))));
+      try
+      {
+        if (auth.useSecureConnection())
+        {
+          ApplicationTrustManager trustManager = getTrustManager();
+          trustManager.setHost(auth.getHostName());
+          ctx = Utils.createLdapsContext(ldapUrl, dn, pwd,
+              Utils.getDefaultLDAPTimeout(), null, trustManager);
+        }
+        else
+        {
+          ctx = Utils.createLdapContext(ldapUrl, dn, pwd,
+              Utils.getDefaultLDAPTimeout(), null);
+        }
+
+        ADSContext adsContext = new ADSContext(ctx);
+        if (createdRemoteAds)
+        {
+          adsContext.removeAdminData();
+        }
+        else
+        {
+          if (registeredNewServerOnRemote)
+          {
+            adsContext.unregisterServer(getNewServerAdsProperties());
+          }
+          if (createdAdministrator)
+          {
+            adsContext.deleteAdministrator(getAdministratorProperties());
+          }
+        }
+        notifyListeners(getFormattedDone());
+        notifyListeners(getLineBreak());
+      }
+      catch (Throwable t)
+      {
+        String html = getFormattedError(t, true);
+        notifyListeners(html);
+      }
+      finally
+      {
+        if (ctx != null)
+        {
+          try
+          {
+            ctx.close();
+          }
+          catch (Throwable t)
+          {
+          }
+        }
+      }
+    }
+    InstallerHelper helper = new InstallerHelper();
+    for (ServerDescriptor server : hmConfiguredRemoteReplication.keySet())
+    {
+      notifyListeners(getFormattedWithPoints(
+          getMsg("progress-unconfiguring-replication-remote",
+              server.getHostPort(true))));
+      try
+      {
+        ctx = getRemoteConnection(server, getTrustManager());
+        helper.unconfigureReplication(ctx,
+            hmConfiguredRemoteReplication.get(server),
+            server.getHostPort(true));
+      }
+      catch (ApplicationException ae)
+      {
+        String html = getFormattedError(ae, true);
+        notifyListeners(html);
+      }
+      if (ctx != null)
+      {
+        try
+        {
+          ctx.close();
+        }
+        catch (Throwable t)
+        {
+        }
+      }
+      notifyListeners(getFormattedDone());
+      notifyListeners(getLineBreak());
+    }
+  }
+
+  /**
    * This method creates the replication configuration for the suffixes on the
    * the local server (and eventually in the remote servers) to synchronize
    * things.
@@ -1208,6 +1335,8 @@
       }
     }
     notifyListeners(getFormattedDone());
+    notifyListeners(getLineBreak());
+    checkAbort();
 
     if (rep.getType() == DataReplicationOptions.Type.IN_EXISTING_TOPOLOGY)
     {
@@ -1229,7 +1358,6 @@
       }
       for (ServerDescriptor server : hm.keySet())
       {
-        notifyListeners(getLineBreak());
         notifyListeners(getFormattedWithPoints(
             getMsg("progress-configuring-replication-remote",
                 server.getHostPort(true))));
@@ -1252,9 +1380,11 @@
         }
 
         ctx = getRemoteConnection(server, getTrustManager());
-        helper.configureReplication(ctx, dns, replicationServers,
-            replicationPort, server.getHostPort(true),
-            knownReplicationServerIds, knownServerIds);
+        ConfiguredReplication repl =
+          helper.configureReplication(ctx, dns, replicationServers,
+              replicationPort, server.getHostPort(true),
+              knownReplicationServerIds, knownServerIds);
+        hmConfiguredRemoteReplication.put(server, repl);
 
         try
         {
@@ -1264,6 +1394,8 @@
         {
         }
         notifyListeners(getFormattedDone());
+        notifyListeners(getLineBreak());
+        checkAbort();
       }
     }
   }
@@ -1344,7 +1476,7 @@
    */
   protected void checkAbort() throws ApplicationException {
     if (canceled) {
-      setStatus(InstallProgressStep.CANCELING);
+      setCurrentProgressStep(InstallProgressStep.CANCELING);
       notifyListeners(null);
       throw new ApplicationException(
             ApplicationException.Type.CANCEL,
@@ -1422,15 +1554,16 @@
   }
 
   /**
-   * Sets the current status of the installation process.
-   * @param status the current status of the installation process.
+   * Sets the current progress step of the installation process.
+   * @param currentProgressStep the current progress step of the installation
+   * process.
    */
-  protected void setStatus(InstallProgressStep status)
+  protected void setCurrentProgressStep(InstallProgressStep currentProgressStep)
   {
-    if (status != null) {
-      this.completedProgress.add(status);
+    if (currentProgressStep != null) {
+      this.completedProgress.add(currentProgressStep);
     }
-    this.status = status;
+    this.currentProgressStep = currentProgressStep;
   }
 
   /**
@@ -1445,17 +1578,18 @@
       switch (getUserData().getNewSuffixOptions().getType())
       {
       case CREATE_BASE_ENTRY:
-        status = InstallProgressStep.CREATING_BASE_ENTRY;
+        currentProgressStep = InstallProgressStep.CREATING_BASE_ENTRY;
         notifyListeners(getTaskSeparator());
         createBaseEntry();
         break;
       case IMPORT_FROM_LDIF_FILE:
-        status = InstallProgressStep.IMPORTING_LDIF;
+        currentProgressStep = InstallProgressStep.IMPORTING_LDIF;
         notifyListeners(getTaskSeparator());
         importLDIF();
         break;
       case IMPORT_AUTOMATICALLY_GENERATED_DATA:
-        status = InstallProgressStep.IMPORTING_AUTOMATICALLY_GENERATED;
+        currentProgressStep =
+          InstallProgressStep.IMPORTING_AUTOMATICALLY_GENERATED;
         notifyListeners(getTaskSeparator());
         importAutomaticallyGenerated();
         break;
@@ -1545,6 +1679,11 @@
             }
           }
         }
+        try
+        {
+          Thread.sleep(3000);
+        }
+        catch (Throwable t) {}
         int nTries = 4;
         boolean initDone = false;
         while (!initDone)
@@ -1593,6 +1732,7 @@
         notifyListeners(getLineBreak());
       }
       i++;
+      checkAbort();
     }
   }
 
@@ -1648,8 +1788,10 @@
               notifyListeners(getFormattedWithPoints(
                   getMsg("progress-creating-administrator", arg)));
               adsContext.createAdministrator(getAdministratorProperties());
+              createdAdministrator = true;
               notifyListeners(getFormattedDone());
               notifyListeners(getLineBreak());
+              checkAbort();
             }
             catch (ADSContextException ade)
             {
@@ -1676,9 +1818,10 @@
           adsContext.registerServer(
               getRemoteServerProperties(auth.getHostName(),
                   adsContext.getDirContext()));
-
+          createdRemoteAds = true;
           notifyListeners(getFormattedDone());
           notifyListeners(getLineBreak());
+          checkAbort();
         }
         /* Configure local server to have an ADS */
         notifyListeners(getFormattedWithPoints(
@@ -1694,9 +1837,10 @@
           throw new ApplicationException(
               ApplicationException.Type.CONFIGURATION_ERROR, failedMsg, t);
         }
-        createLocalAds(localCtx);
+        createLocalAds(localCtx, false);
         notifyListeners(getFormattedDone());
         notifyListeners(getLineBreak());
+        checkAbort();
 
         lastLoadedCache = new TopologyCache(adsContext, getTrustManager());
         lastLoadedCache.reloadTopology();
@@ -1771,12 +1915,15 @@
         try
         {
           adsContext.registerServer(getNewServerAdsProperties());
+          registeredNewServerOnRemote = true;
         }
         catch (ADSContextException adse)
         {
           if (adse.getError() ==
             ADSContextException.ErrorType.ALREADY_REGISTERED)
           {
+            LOG.log(Level.WARNING, "Server already registered. Unregistering "+
+                "and registering server");
             /* This might occur after registering and unregistering a server */
             adsContext.unregisterServer(getNewServerAdsProperties());
             adsContext.registerServer(getNewServerAdsProperties());
@@ -1803,52 +1950,15 @@
                 getMsg("progress-initializing-ads")));
 
             int replicationId = replica.getReplicationId();
-            if (replicationId == -1)
-            {
-              /**
-               * This occurs if the remote server had not replication
-               * configured.
-               */
-              InitialLdapContext rCtx = null;
-              try
-              {
-                rCtx = getRemoteConnection(server, getTrustManager());
-                ServerDescriptor s = ServerDescriptor.createStandalone(rCtx);
-                for (ReplicaDescriptor r : s.getReplicas())
-                {
-                  if (Utils.areDnsEqual(r.getSuffix().getDN(), dn))
-                  {
-                    replicationId = r.getReplicationId();
-                  }
-                }
-              }
-              catch (NamingException ne)
-              {
-                String[] arg = {server.getHostPort(true)};
-                throw new ApplicationException(
-                    ApplicationException.Type.CONFIGURATION_ERROR,
-                    getMsg("cannot-connect-to-remote-generic", arg), ne);
-              }
-              finally
-              {
-                try
-                {
-                  rCtx.close();
-                }
-                catch (Throwable t)
-                {
-                }
-              }
-            }
-            int nTries = 4;
+            int nTries = 1;
             boolean initDone = false;
             while (!initDone)
             {
               try
               {
-                initializeSuffix(localCtx, replica.getReplicationId(),
+                initializeSuffix(localCtx, replicationId,
                     ADSContext.getAdministrationSuffixDN(),
-                    true, server.getHostPort(true));
+                    false, server.getHostPort(true));
                 initDone = true;
               }
               catch (PeerNotFoundException pnfe)
@@ -1872,6 +1982,7 @@
             }
             notifyListeners(getFormattedDone());
             notifyListeners(getLineBreak());
+            checkAbort();
             break;
           }
         }
@@ -1947,7 +2058,7 @@
           throw new ApplicationException(
               ApplicationException.Type.CONFIGURATION_ERROR, failedMsg, t);
         }
-        createLocalAds(localCtx);
+        createLocalAds(localCtx, true);
         int replicationPort =
           getUserData().getReplicationOptions().getReplicationPort();
         Set<String> dns = new HashSet<String>();
@@ -2688,6 +2799,7 @@
     trustManager.resetLastRefusedItems();
     try
     {
+      effectiveDn[0] = dn;
       try
       {
         if (isSecure)
@@ -2707,6 +2819,7 @@
         {
           // Try using a global administrator
           dn = ADSContext.getAdministratorDN(dn);
+          effectiveDn[0] = dn;
           if (isSecure)
           {
             ctx = Utils.createLdapsContext(ldapUrl, dn, pwd,
@@ -2753,8 +2866,11 @@
                 isCertificateException(e.getCause()))
             {
               UserDataCertificateException.Type excType;
-              ApplicationTrustManager.Cause cause =
-                trustManager.getLastRefusedCause();
+              ApplicationTrustManager.Cause cause = null;
+              if (e.getTrustManager() != null)
+              {
+                cause = e.getTrustManager().getLastRefusedCause();
+              }
               LOG.log(Level.INFO, "Certificate exception cause: "+cause);
               if (cause == ApplicationTrustManager.Cause.NOT_TRUSTED)
               {
@@ -2790,7 +2906,7 @@
                     getMsg("certificate-exception", h, String.valueOf(p)),
                     e.getCause(), h, p,
                     e.getTrustManager().getLastRefusedChain(),
-                    trustManager.getLastRefusedAuthType(), excType);
+                    e.getTrustManager().getLastRefusedAuthType(), excType);
               }
             }
           }
@@ -2900,7 +3016,6 @@
         }
       }
     }
-    effectiveDn[0] = dn;
   }
 
   /**
@@ -3607,24 +3722,32 @@
 
   private InitialLdapContext createLocalContext() throws NamingException
   {
-    String ldapUrl = "ldap://"+getUserData().getHostName()+":"+
+    String ldapUrl = "ldap://"+
+    Utils.getHostNameForLdapUrl(getUserData().getHostName())+":"+
     getUserData().getServerPort();
     String dn = getUserData().getDirectoryManagerDn();
     String pwd = getUserData().getDirectoryManagerPwd();
     return Utils.createLdapContext(ldapUrl, dn, pwd,
         Utils.getDefaultLDAPTimeout(), null);
   }
-  private void createLocalAds(InitialLdapContext ctx)
+  private void createLocalAds(InitialLdapContext ctx, boolean addData)
   throws ApplicationException, ADSContextException
   {
     try
     {
       ADSContext adsContext = new ADSContext(ctx);
-      adsContext.createAdminData(null);
-      adsContext.registerServer(getNewServerAdsProperties());
-      if (getUserData().mustCreateAdministrator())
+      if (addData)
       {
-        adsContext.createAdministrator(getAdministratorProperties());
+        adsContext.createAdminData(null);
+        adsContext.registerServer(getNewServerAdsProperties());
+        if (getUserData().mustCreateAdministrator())
+        {
+          adsContext.createAdministrator(getAdministratorProperties());
+        }
+      }
+      else
+      {
+        adsContext.createAdministrationSuffix(null);
       }
     }
     catch (ADSContextException ace)
@@ -3686,9 +3809,6 @@
     }
     catch (NamingException ne)
     {
-      System.out.println("dn: "+auth.getDn());
-      System.out.println("dn: "+auth.getDn());
-
       String errorMessage = getMsg("cannot-connect-to-remote-generic",
           server.getHostPort(true), ne.toString(true));
       throw new ApplicationException(
@@ -3840,7 +3960,8 @@
               minRefreshPeriod = 10000;
             }
             if (!msg.equals(lastDisplayedMsg) &&
-                ((currentTime - minRefreshPeriod) > lastTimeMsgDisplayed))
+            ((currentTime - minRefreshPeriod) > lastTimeMsgDisplayed))
+            if (!msg.equals(lastDisplayedMsg))
             {
               notifyListeners(getFormattedProgress(msg));
               lastDisplayedMsg = msg;

--
Gitblit v1.10.0