From 0138b5924ff14ef709398bf878dbb9bf2a0b7c33 Mon Sep 17 00:00:00 2001
From: Valery Kharseko <vharseko@3a-systems.ru>
Date: Wed, 23 Sep 2026 13:05:17 +0000
Subject: [PATCH] [#1030] Keep the setup log out of the way of start-ds, and say when it is gone (#1032)

---
 opendj-server-legacy/src/main/java/org/opends/quicksetup/Application.java |   49 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/quicksetup/Application.java b/opendj-server-legacy/src/main/java/org/opends/quicksetup/Application.java
index 0a6faf1..4d7745a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/quicksetup/Application.java
+++ b/opendj-server-legacy/src/main/java/org/opends/quicksetup/Application.java
@@ -26,6 +26,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizableMessageBuilder;
@@ -76,9 +77,17 @@
   private final ErrorPrintStream err = new ErrorPrintStream();
   private final OutputPrintStream out = new OutputPrintStream();
 
-  /** Temporary log file where messages will be logged. */
+  /**
+   * Temporary log file where messages will be logged, once {@link #openTempLogFile()} has
+   * asked for it. It stays {@code null} until then: creating it costs a file - and the
+   * directory it lives in - that nothing removes unless the operation succeeds, so the roads
+   * which attempt nothing must not create one (issue #1030).
+   */
   protected TempLogFile tempLogFile;
 
+  /** Supplies the temporary log file, see {@link #openTempLogFile()}. */
+  private Supplier<TempLogFile> tempLogFileSupplier;
+
   /**
    * Creates an application by instantiating the Application class
    * denoted by the System property
@@ -685,14 +694,44 @@
   }
 
   /**
-   * Sets the temporary log file where messages will be logged.
+   * Sets where the temporary log file of this application comes from, without creating it.
+   * <p>
+   * The wizard and the CLI hand the supplier over as they start: the file itself is created by
+   * {@link #openTempLogFile()}, on the road that runs the operation, so that a run which does
+   * nothing - a quit at any step of the wizard, a server which turns out to be installed
+   * already - leaves no log behind (issue #1030).
+   * <p>
+   * There is deliberately no setter taking the file itself: a caller holding a supplier could
+   * then resolve it on the spot, and the log would be created before anything is attempted
+   * again.
    *
    * @param tempLogFile
-   *            temporary log file where messages will be logged.
+   *            supplies the temporary log file where messages will be logged.
    */
-  public void setTempLogFile(final TempLogFile tempLogFile)
+  public void setTempLogFile(final Supplier<TempLogFile> tempLogFile)
   {
-    this.tempLogFile = tempLogFile;
+    this.tempLogFile = null;
+    this.tempLogFileSupplier = tempLogFile;
+  }
+
+  /**
+   * Creates the temporary log file of this application, unless it has one already.
+   * <p>
+   * Called where the operation begins and not before: from that point on the log is worth
+   * keeping, because there is something which can fail and be reported.
+   * <p>
+   * An application nobody handed a supplier to has no log of its own: the command line
+   * uninstaller is built that way, and its launcher creates the log before running it.
+   *
+   * @return the temporary log file of this application, or {@code null} if it was given none.
+   */
+  protected TempLogFile openTempLogFile()
+  {
+    if (tempLogFile == null && tempLogFileSupplier != null)
+    {
+      tempLogFile = tempLogFileSupplier.get();
+    }
+    return tempLogFile;
   }
 
   /**

--
Gitblit v1.10.0