From 61dac86bceb9d727e1bd707982c41ab9467c6d5a Mon Sep 17 00:00:00 2001
From: Maxim Thomas <maxim.thomas@gmail.com>
Date: Mon, 03 Nov 2025 06:30:05 +0000
Subject: [PATCH] Switch from sun.security.x509 to Bouncy Castle API (#560)

---
 opendj-server-legacy/src/test/java/org/opends/server/TestCaseUtils.java |   94 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 79 insertions(+), 15 deletions(-)

diff --git a/opendj-server-legacy/src/test/java/org/opends/server/TestCaseUtils.java b/opendj-server-legacy/src/test/java/org/opends/server/TestCaseUtils.java
index 1e4763c..c7a835b 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/TestCaseUtils.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/TestCaseUtils.java
@@ -45,11 +45,12 @@
 import java.io.OutputStream;
 import java.io.PrintStream;
 import java.io.StringReader;
+import java.lang.management.LockInfo;
 import java.lang.management.ManagementFactory;
+import java.lang.management.MonitorInfo;
 import java.lang.management.ThreadInfo;
 import java.lang.management.ThreadMXBean;
 import java.net.BindException;
-import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
@@ -542,6 +543,9 @@
     ErrorLogger.getInstance().addLogPublisher(
             (ErrorLogPublisher) getServerStartupTextErrorPublisher(ERROR_TEXT_WRITER));
 
+  }
+
+  public static void setupTrace() {
     DebugLogger.getInstance().addPublisherIfRequired(DEBUG_TEXT_WRITER);
   }
 
@@ -742,11 +746,20 @@
   {
 	  for (; port > 1024;)
 	  {
+         ServerSocket res=null;
 	     try
 	     {
-	       return bindPort(port--);
+           res=bindPort(port--);
+	       return res;
 	     }
-	     catch (BindException e){}		
+	     catch (BindException e){
+             if (res!=null) {
+                 try {
+                     res.close();
+                 } catch (IOException ex) {}
+             }
+             res=null;
+         }
 	  }
 	  throw new BindException("Unable to bind to a free port");
   }
@@ -1927,20 +1940,71 @@
   public static String generateThreadDump() {
     final StringBuilder dump = new StringBuilder();
     final ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
-    final ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds(), 100);
+    ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(true, true);
     for (ThreadInfo threadInfo : threadInfos) {
-        dump.append('"');
-        dump.append(threadInfo.getThreadName());
-        dump.append("\" ");
-        final Thread.State state = threadInfo.getThreadState();
-        dump.append("\n   java.lang.Thread.State: ");
-        dump.append(state);
-        final StackTraceElement[] stackTraceElements = threadInfo.getStackTrace();
-        for (final StackTraceElement stackTraceElement : stackTraceElements) {
-            dump.append("\n        at ");
-            dump.append(stackTraceElement);
+      dump.append("\"" + threadInfo.getThreadName() + "\"" +
+              (threadInfo.isDaemon() ? " daemon" : "") +
+              " prio=" + threadInfo.getPriority() +
+              " Id=" + threadInfo.getThreadId() + " " +
+              threadInfo.getThreadState());
+      if (threadInfo.getLockName() != null) {
+        dump.append(" on " + threadInfo.getLockName());
+      }
+      if (threadInfo.getLockOwnerName() != null) {
+        dump.append(" owned by \"" + threadInfo.getLockOwnerName() +
+                "\" Id=" + threadInfo.getLockOwnerId());
+      }
+      if (threadInfo.isSuspended()) {
+        dump.append(" (suspended)");
+      }
+      if (threadInfo.isInNative()) {
+        dump.append(" (in native)");
+      }
+      dump.append('\n');
+      StackTraceElement[] stackTrace = threadInfo.getStackTrace();
+      int i = 0;
+      for (; i < stackTrace.length; i++) {
+        StackTraceElement ste = stackTrace[i];
+        dump.append("\tat " + ste.toString());
+        dump.append('\n');
+        if (i == 0 && threadInfo.getLockInfo() != null) {
+          Thread.State ts = threadInfo.getThreadState();
+          switch (ts) {
+            case BLOCKED:
+              dump.append("\t-  blocked on " + threadInfo.getLockInfo());
+              dump.append('\n');
+              break;
+            case WAITING:
+            case TIMED_WAITING:
+              dump.append("\t-  waiting on " + threadInfo.getLockInfo());
+              dump.append('\n');
+              break;
+            default:
+          }
         }
-        dump.append("\n\n");
+
+        for (MonitorInfo mi : threadInfo.getLockedMonitors()) {
+          if (mi.getLockedStackDepth() == i) {
+            dump.append("\t-  locked " + mi);
+            dump.append('\n');
+          }
+        }
+      }
+      if (i < stackTrace.length) {
+        dump.append("\t...");
+        dump.append('\n');
+      }
+
+      LockInfo[] locks = threadInfo.getLockedSynchronizers();
+      if (locks.length > 0) {
+        dump.append("\n\tNumber of locked synchronizers = " + locks.length);
+        dump.append('\n');
+        for (LockInfo li : locks) {
+          dump.append("\t- " + li);
+          dump.append('\n');
+        }
+      }
+      dump.append('\n');
     }
     return dump.toString();
   }

--
Gitblit v1.10.0