From 4a17c7f153f4912f376b5976eea7caa501187442 Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Thu, 02 Jun 2016 10:15:13 +0000
Subject: [PATCH] OPENDJ-3046 Cleanup server offline tools environment

---
 opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java |  222 ++++++++++++++++++++++++++++++-------------------------
 1 files changed, 120 insertions(+), 102 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
index 2730fcf..3aba0c6 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
@@ -110,6 +110,17 @@
                                       PrintStream err);
 
   /**
+   * Cleanup task environment after offline run.
+   * Default implementation does nothing.
+   * Tasks which initialize some static part of the DirectoryServer instance (e.g admin data local backends) must
+   * override this method to shutdown all needed component to prevent JVM environment alteration.
+   */
+  protected void cleanup()
+  {
+    // Do nothing by default.
+  }
+
+  /**
    * Creates an argument parser prepopulated with arguments for processing
    * input for scheduling tasks with the task backend.
    *
@@ -170,7 +181,7 @@
    */
   protected void validateTaskArgs() throws ArgumentException, ClientException
   {
-    if (processAsTask())
+    if (isRemoteTask())
     {
       taskScheduleArgs.validateArgs();
     }
@@ -232,11 +243,9 @@
   protected int process(LDAPConnectionArgumentParser argParser,
                         boolean initializeServer,
                         PrintStream out, PrintStream err) {
-    int ret;
-
     if (testIfOffline())
     {
-      if (!processAsTask())
+      if (!isRemoteTask())
       {
         return RUN_OFFLINE;
       }
@@ -246,115 +255,124 @@
       }
     }
 
-    if (processAsTask())
+    if (!isRemoteTask())
     {
-      if (initializeServer)
+      try
       {
-        try
-        {
-          DirectoryServer.bootstrapClient();
-          DirectoryServer.initializeJMX();
-        }
-        catch (Exception e)
-        {
-          printWrappedText(err, ERR_SERVER_BOOTSTRAP_ERROR.get(getExceptionMessage(e)));
-          return 1;
-        }
-      }
-
-      LDAPConnection conn = null;
-      try {
-        conn = argParser.connect(out, err);
-        TaskClient tc = new TaskClient(conn);
-        TaskEntry taskEntry = tc.schedule(this);
-        LocalizableMessage startTime = taskEntry.getScheduledStartTime();
-        if (taskEntry.getTaskState() == TaskState.RECURRING) {
-          printWrappedText(out, INFO_TASK_TOOL_RECURRING_TASK_SCHEDULED.get(taskEntry.getType(), taskEntry.getId()));
-        } else if (startTime == null || startTime.length() == 0) {
-          printWrappedText(out, INFO_TASK_TOOL_TASK_SCHEDULED_NOW.get(taskEntry.getType(), taskEntry.getId()));
-        } else {
-          printWrappedText(out, INFO_TASK_TOOL_TASK_SCHEDULED_FUTURE.get(
-              taskEntry.getType(), taskEntry.getId(), taskEntry.getScheduledStartTime()));
-        }
-        if (!taskScheduleArgs.startArg.isPresent()) {
-
-          // Poll the task printing log messages until finished
-          String taskId = taskEntry.getId();
-          Set<LocalizableMessage> printedLogMessages = new HashSet<>();
-          do {
-            taskEntry = tc.getTaskEntry(taskId);
-            List<LocalizableMessage> logs = taskEntry.getLogMessages();
-            for (LocalizableMessage log : logs) {
-              if (printedLogMessages.add(log)) {
-                out.println(log);
-              }
-            }
-
-            try {
-              Thread.sleep(SYNCHRONOUS_TASK_POLL_INTERVAL);
-            } catch (InterruptedException e) {
-              // ignore
-            }
-
-          } while (!taskEntry.isDone());
-          if (TaskState.isSuccessful(taskEntry.getTaskState())) {
-            if (taskEntry.getTaskState() != TaskState.RECURRING) {
-              printWrappedText(out, INFO_TASK_TOOL_TASK_SUCESSFULL.get(taskEntry.getType(), taskEntry.getId()));
-            }
-            return 0;
-          } else {
-            printWrappedText(out, INFO_TASK_TOOL_TASK_NOT_SUCESSFULL.get(taskEntry.getType(), taskEntry.getId()));
-            return 1;
-          }
-        }
-        ret = 0;
-      } catch (LDAPConnectionException e) {
-        if (isWrongPortException(e,
-            Integer.valueOf(argParser.getArguments().getPort())))
-        {
-          printWrappedText(err, ERR_TASK_LDAP_FAILED_TO_CONNECT_WRONG_PORT.get(
-              argParser.getArguments().getHostName(), argParser.getArguments().getPort()));
-        } else {
-          printWrappedText(err, ERR_TASK_TOOL_START_TIME_NO_LDAP.get(e.getMessage()));
-        }
-        ret = 1;
-      } catch (DecodeException ae) {
-        printWrappedText(err, ERR_TASK_TOOL_DECODE_ERROR.get(ae.getMessage()));
-        ret = 1;
-      } catch (IOException ioe) {
-        printWrappedText(err, ERR_TASK_TOOL_IO_ERROR.get(ioe));
-        ret = 1;
-      } catch (LDAPException le) {
-        printWrappedText(err, ERR_TASK_TOOL_LDAP_ERROR.get(le.getMessage()));
-        ret = 1;
-      } catch (OpenDsException e) {
-        printWrappedText(err, e.getMessageObject());
-        ret = 1;
-      } catch (ArgumentException e) {
-        argParser.displayMessageAndUsageReference(err, e.getMessageObject());
-        ret = 1;
+        return processLocal(initializeServer, out, err);
       }
       finally
       {
-        if (conn != null)
+        if (initializeServer)
         {
-          try
-          {
-            conn.close(null);
-          }
-          catch (Throwable t)
-          {
-            // Ignore.
-          }
+          cleanup();
         }
       }
-    } else {
-      ret = processLocal(initializeServer, out, err);
     }
-    return ret;
+
+    if (initializeServer)
+    {
+      try
+      {
+        DirectoryServer.bootstrapClient();
+        DirectoryServer.initializeJMX();
+      }
+      catch (Exception e)
+      {
+        printWrappedText(err, ERR_SERVER_BOOTSTRAP_ERROR.get(getExceptionMessage(e)));
+        return 1;
+      }
+    }
+
+    LDAPConnection conn = null;
+    try {
+      conn = argParser.connect(out, err);
+      TaskClient tc = new TaskClient(conn);
+      TaskEntry taskEntry = tc.schedule(this);
+      LocalizableMessage startTime = taskEntry.getScheduledStartTime();
+      if (taskEntry.getTaskState() == TaskState.RECURRING) {
+        printWrappedText(out, INFO_TASK_TOOL_RECURRING_TASK_SCHEDULED.get(taskEntry.getType(), taskEntry.getId()));
+      } else if (startTime == null || startTime.length() == 0) {
+        printWrappedText(out, INFO_TASK_TOOL_TASK_SCHEDULED_NOW.get(taskEntry.getType(), taskEntry.getId()));
+      } else {
+        printWrappedText(out, INFO_TASK_TOOL_TASK_SCHEDULED_FUTURE.get(
+            taskEntry.getType(), taskEntry.getId(), taskEntry.getScheduledStartTime()));
+      }
+      if (!taskScheduleArgs.startArg.isPresent()) {
+
+        // Poll the task printing log messages until finished
+        String taskId = taskEntry.getId();
+        Set<LocalizableMessage> printedLogMessages = new HashSet<>();
+        do {
+          taskEntry = tc.getTaskEntry(taskId);
+          List<LocalizableMessage> logs = taskEntry.getLogMessages();
+          for (LocalizableMessage log : logs) {
+            if (printedLogMessages.add(log)) {
+              out.println(log);
+            }
+          }
+
+          try {
+            Thread.sleep(SYNCHRONOUS_TASK_POLL_INTERVAL);
+          } catch (InterruptedException e) {
+            // ignore
+          }
+
+        } while (!taskEntry.isDone());
+        if (TaskState.isSuccessful(taskEntry.getTaskState())) {
+          if (taskEntry.getTaskState() != TaskState.RECURRING) {
+            printWrappedText(out, INFO_TASK_TOOL_TASK_SUCESSFULL.get(taskEntry.getType(), taskEntry.getId()));
+          }
+          return 0;
+        } else {
+          printWrappedText(out, INFO_TASK_TOOL_TASK_NOT_SUCESSFULL.get(taskEntry.getType(), taskEntry.getId()));
+          return 1;
+        }
+      }
+      return 0;
+    } catch (LDAPConnectionException e) {
+      if (isWrongPortException(e,
+          Integer.valueOf(argParser.getArguments().getPort())))
+      {
+        printWrappedText(err, ERR_TASK_LDAP_FAILED_TO_CONNECT_WRONG_PORT.get(
+            argParser.getArguments().getHostName(), argParser.getArguments().getPort()));
+      } else {
+        printWrappedText(err, ERR_TASK_TOOL_START_TIME_NO_LDAP.get(e.getMessage()));
+      }
+      return 1;
+    } catch (DecodeException ae) {
+      printWrappedText(err, ERR_TASK_TOOL_DECODE_ERROR.get(ae.getMessage()));
+      return 1;
+    } catch (IOException ioe) {
+      printWrappedText(err, ERR_TASK_TOOL_IO_ERROR.get(ioe));
+      return 1;
+    } catch (LDAPException le) {
+      printWrappedText(err, ERR_TASK_TOOL_LDAP_ERROR.get(le.getMessage()));
+      return 1;
+    } catch (OpenDsException e) {
+      printWrappedText(err, e.getMessageObject());
+      return 1;
+    } catch (ArgumentException e) {
+      argParser.displayMessageAndUsageReference(err, e.getMessageObject());
+      return 1;
+    }
+    finally
+    {
+      if (conn != null)
+      {
+        try
+        {
+          conn.close(null);
+        }
+        catch (Throwable t)
+        {
+          // Ignore.
+        }
+      }
+    }
   }
 
-  private boolean processAsTask() {
+  private boolean isRemoteTask() {
     return argParser.connectionArgumentsPresent();
   }
 

--
Gitblit v1.10.0