From 5a495b5d64f7a94ccb0e4973decaf0c1e762f88c Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Fri, 23 Oct 2009 19:44:22 +0000
Subject: [PATCH] Fix for issue 4313 (Control-panel stop triggers authentication pop-up) After getting the return code from stop-ds, verify that the server released its lock on the file used to test that it is running.

---
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GenericDialog.java           |    6 +
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/task/StartStopTask.java         |   29 ++++++---
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/task/StopServerTask.java        |   55 ++++++++++++++++++
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java |    1 
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GenericFrame.java            |    2 
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java      |   14 ++++
 opendj-sdk/opends/src/messages/messages/admin_tool.properties                                   |   14 ++--
 7 files changed, 101 insertions(+), 20 deletions(-)

diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
index c1cb3c8..1962553 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
@@ -105,7 +105,6 @@
   private LinkedHashSet<ConfigChangeListener> configListeners =
     new LinkedHashSet<ConfigChangeListener>();
 
-
   private LinkedHashSet<BackupCreatedListener> backupListeners =
     new LinkedHashSet<BackupCreatedListener>();
 
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/task/StartStopTask.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/task/StartStopTask.java
index 69d182a..00be3e0 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/task/StartStopTask.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/task/StartStopTask.java
@@ -38,7 +38,7 @@
 import org.opends.messages.Message;
 
 /**
- * An abstract class used to refactor some code between the start, stop and
+ * An abstract class used to re-factor some code between the start, stop and
  * restart tasks.
  *
  */
@@ -98,8 +98,8 @@
     // To display new status
     try
     {
-      getInfo().regenerateDescriptor();
       getInfo().stopPooling();
+      getInfo().regenerateDescriptor();
 
       ArrayList<String> arguments = getCommandLineArguments();
 
@@ -108,14 +108,7 @@
       arguments.toArray(args);
       returnCode = executeCommandLine(getCommandLinePath(), args);
 
-      if (returnCode != 0)
-      {
-        state = State.FINISHED_WITH_ERROR;
-      }
-      else
-      {
-        state = State.FINISHED_SUCCESSFULLY;
-      }
+      postCommandLine();
     }
     catch (Throwable t)
     {
@@ -133,4 +126,20 @@
     ArrayList<String> args = new ArrayList<String>();
     return args;
   }
+
+  /**
+   * Method called just after calling the command-line.  To be overwritten
+   * by the inheriting classes.
+   */
+  protected void postCommandLine()
+  {
+    if (returnCode != 0)
+    {
+      state = State.FINISHED_WITH_ERROR;
+    }
+    else
+    {
+      state = State.FINISHED_SUCCESSFULLY;
+    }
+  }
 }
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/task/StopServerTask.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/task/StopServerTask.java
index ece3aef..5545896 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/task/StopServerTask.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/task/StopServerTask.java
@@ -29,6 +29,8 @@
 
 import static org.opends.messages.AdminToolMessages.*;
 
+import java.io.File;
+
 import javax.swing.SwingUtilities;
 
 import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
@@ -79,6 +81,7 @@
     super.runTask();
     if (state == State.FINISHED_SUCCESSFULLY)
     {
+      // Verify that the server is actually stopped
       SwingUtilities.invokeLater(new Runnable()
       {
         public void run()
@@ -98,4 +101,56 @@
   {
     return getCommandLinePath("stop-ds");
   }
+
+  /**
+   * Method called just after calling the command-line.  To be overwritten
+   * by the inheriting classes.
+   */
+  protected void postCommandLine()
+  {
+    if (returnCode != 0)
+    {
+      state = State.FINISHED_WITH_ERROR;
+    }
+    else
+    {
+      File f = new File(getInfo().getServerDescriptor().getInstancePath());
+      // Check that the server is actually stopped.
+      boolean stopped = !Utilities.isServerRunning(f);
+      int nTries = 20;
+      while (!stopped && nTries > 0)
+      {
+        try
+        {
+          Thread.sleep(700);
+        }
+        catch (Throwable t)
+        {
+        }
+        stopped = !Utilities.isServerRunning(f);
+        nTries --;
+      }
+      if (!stopped)
+      {
+        SwingUtilities.invokeLater(new Runnable()
+        {
+          public void run()
+          {
+            getProgressDialog().appendProgressHtml(
+                Utilities.applyFont(
+                    "<br>"+
+                    ERR_CTRL_PANEL_STOPPING_SERVER_POST_CMD_LINE.get(
+                        getCommandLinePath("stop-ds"))+"<br>",
+                        ColorAndFontConstants.progressFont));
+          }
+        });
+        returnCode = -1;
+        state = State.FINISHED_WITH_ERROR;
+      }
+      else
+      {
+        state = State.FINISHED_SUCCESSFULLY;
+      }
+    }
+  }
 }
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GenericDialog.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GenericDialog.java
index 6f35209..9cc3a47 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GenericDialog.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GenericDialog.java
@@ -234,13 +234,17 @@
    */
   public void setVisible(boolean visible)
   {
-    if (lastComponentWithFocus == null)
+    if (visible && lastComponentWithFocus == null)
     {
       lastComponentWithFocus = panel.getPreferredFocusComponent();
     }
     if (visible && (lastComponentWithFocus != null) &&
         lastComponentWithFocus.isVisible())
     {
+      if (lastComponentWithFocus == null)
+      {
+        lastComponentWithFocus = panel.getPreferredFocusComponent();
+      }
       lastComponentWithFocus.requestFocusInWindow();
     }
     updateDefaultButton(panel);
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GenericFrame.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GenericFrame.java
index 89693e4..6fdda91 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GenericFrame.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GenericFrame.java
@@ -210,7 +210,7 @@
    */
   public void setVisible(boolean visible)
   {
-    if (lastComponentWithFocus == null)
+    if (visible && lastComponentWithFocus == null)
     {
       lastComponentWithFocus = panel.getPreferredFocusComponent();
     }
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java
index fe35e15..8ab5a40 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java
@@ -261,7 +261,14 @@
    */
   public Component getPreferredFocusComponent()
   {
-    return pwd;
+    if (pwd.isVisible())
+    {
+      return pwd;
+    }
+    else
+    {
+      return combo;
+    }
   }
 
   /**
@@ -302,6 +309,11 @@
         {
           updateComponentState();
           displayMainPanel();
+          Component comp = getPreferredFocusComponent();
+          if (comp != null)
+          {
+            comp.requestFocusInWindow();
+          }
         }
       };
       displayMessage(INFO_CTRL_PANEL_LOADING_PANEL_SUMMARY.get());
diff --git a/opendj-sdk/opends/src/messages/messages/admin_tool.properties b/opendj-sdk/opends/src/messages/messages/admin_tool.properties
index bfb7558..c2ad5e5 100644
--- a/opendj-sdk/opends/src/messages/messages/admin_tool.properties
+++ b/opendj-sdk/opends/src/messages/messages/admin_tool.properties
@@ -1206,23 +1206,25 @@
 INFO_CTRL_PANEL_STARTING_SERVER_SUCCESSFUL_DETAILS=The server started \
  successfully
 MILD_ERR_CTRL_PANEL_STARTING_SERVER_ERROR_SUMMARY=Error during server start
-MILD_ERR_CTRL_PANEL_STARTING_SERVER_ERROR_DETAILS=An error starting the \
- server.  Error code: %d
+MILD_ERR_CTRL_PANEL_STARTING_SERVER_ERROR_DETAILS=An error occurred starting \
+ the server.  Error code: %d
 
 INFO_CTRL_PANEL_RESTARTING_SERVER_SUCCESSFUL_SUMMARY=Restart Complete
 INFO_CTRL_PANEL_RESTARTING_SERVER_SUCCESSFUL_DETAILS=The server restarted \
  successfully
 MILD_ERR_CTRL_PANEL_RESTARTING_SERVER_ERROR_SUMMARY=Error during server restart
-MILD_ERR_CTRL_PANEL_RESTARTING_SERVER_ERROR_DETAILS=An error restarting the \
- server.  Error code: %d
+MILD_ERR_CTRL_PANEL_RESTARTING_SERVER_ERROR_DETAILS=An error occurred \
+ restarting the server.  Error code: %d
 
 INFO_CTRL_PANEL_STOPPING_SERVER_SUMMARY=Stopping Server...
 INFO_CTRL_PANEL_STOPPING_SERVER_SUCCESSFUL_SUMMARY=Stop Complete
 INFO_CTRL_PANEL_STOPPING_SERVER_SUCCESSFUL_DETAILS=The server stopped \
  successfully
 MILD_ERR_CTRL_PANEL_STOPPING_SERVER_ERROR_SUMMARY=Error during Server Stop
-MILD_ERR_CTRL_PANEL_STOPPING_SERVER_ERROR_DETAILS=An error stopping the \
- server.  Error code: %d
+MILD_ERR_CTRL_PANEL_STOPPING_SERVER_ERROR_DETAILS=An error occurred stopping \
+ the server.  Error code: %d
+MILD_ERR_CTRL_PANEL_STOPPING_SERVER_POST_CMD_LINE=The command-line %s returned \
+ successfully but the server appears to be running.
 
 INFO_CTRL_PANEL_CLOSE_WINDOW_WHEN_OPERATION_COMPLETES_LABEL=Close window when \
  operation completes

--
Gitblit v1.10.0