From f937f4ffbe4950e2050f1695cf0320476ffb4977 Mon Sep 17 00:00:00 2001
From: Myst <1592048+LeMyst@users.noreply.github.com>
Date: Wed, 19 Jun 2024 11:34:54 +0200
Subject: [PATCH] Avoid usage of jdk.jconsole module in Java 9+
Copied from PR https://github.com/jiaqi/jmxterm/pull/113
Co-Authored-By: nyg <784863+nyg@users.noreply.github.com>
---
.../jmxterm/jdk9/Jdk9JavaProcess.java | 63 +++++++++++++++++++
.../jmxterm/jdk9/Jdk9JavaProcessManager.java | 63 +++++++++++++++++++
.../jmxterm/jdk9/StaticVirtualMachine.java | 16 +++++
.../jmxterm/jdk9/VirtualMachine.java | 25 ++++++++
.../jdk9/VirtualMachineDescriptor.java | 17 +++++
.../jmxterm/jdk9/package-info.java | 6 ++
.../jmxterm/utils/WeakCastUtils.java | 33 ++++++++--
.../jdk9/Jdk9JavaProcessManagerTest.java | 29 +++++++++
8 files changed, 246 insertions(+), 6 deletions(-)
create mode 100644 src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcess.java
create mode 100644 src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManager.java
create mode 100644 src/main/java/org/cyclopsgroup/jmxterm/jdk9/StaticVirtualMachine.java
create mode 100644 src/main/java/org/cyclopsgroup/jmxterm/jdk9/VirtualMachine.java
create mode 100644 src/main/java/org/cyclopsgroup/jmxterm/jdk9/VirtualMachineDescriptor.java
create mode 100644 src/main/java/org/cyclopsgroup/jmxterm/jdk9/package-info.java
create mode 100644 src/test/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManagerTest.java
diff --git a/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcess.java b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcess.java
new file mode 100644
index 0000000..a621982
--- /dev/null
+++ b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcess.java
@@ -0,0 +1,63 @@
+package org.cyclopsgroup.jmxterm.jdk9;
+
+import java.io.IOException;
+import org.apache.commons.lang3.Validate;
+import org.cyclopsgroup.jmxterm.JavaProcess;
+import org.cyclopsgroup.jmxterm.utils.WeakCastUtils;
+
+/**
+ * JDK9 specific implementation of {@link JavaProcess}
+ *
+ * @author nyg
+ */
+public class Jdk9JavaProcess implements JavaProcess {
+
+ private final StaticVirtualMachine staticVirtualMachine;
+ private final VirtualMachineDescriptor vmd;
+ private final String address;
+
+ /**
+ * @param staticVm Static VirtualMachine proxy
+ * @param vmd Local VM
+ * @param address Connector address, if any
+ */
+ Jdk9JavaProcess(StaticVirtualMachine staticVm, VirtualMachineDescriptor vmd, String address) {
+ Validate.notNull(vmd, "StaticVirtualMachine can't be NULL");
+ Validate.notNull(vmd, "VirtualMachineDescriptor can't be NULL");
+ this.staticVirtualMachine = staticVm;
+ this.vmd = vmd;
+ this.address = address;
+ }
+
+ @Override
+ public String getDisplayName() {
+ return vmd.displayName();
+ }
+
+ @Override
+ public int getProcessId() {
+ return Integer.parseInt(vmd.id());
+ }
+
+ @Override
+ public boolean isManageable() {
+ return address != null;
+ }
+
+ @Override
+ public void startManagementAgent() throws IOException {
+ Object vm = staticVirtualMachine.attach(vmd.id());
+ try {
+ Class> originalVirtualMachine = Class.forName(VirtualMachine.ORIGINAL_CLASS_NAME);
+ VirtualMachine vmProxy = WeakCastUtils.cast(originalVirtualMachine, VirtualMachine.class);
+ vmProxy.startLocalManagementAgent();
+ } catch (ClassNotFoundException | SecurityException | NoSuchMethodException e) {
+ throw new RuntimeException("Can't cast " + vm + " to VirtualMachineDescriptor", e);
+ }
+ }
+
+ @Override
+ public String toUrl() {
+ return address;
+ }
+}
diff --git a/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManager.java b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManager.java
new file mode 100644
index 0000000..2f61353
--- /dev/null
+++ b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManager.java
@@ -0,0 +1,63 @@
+package org.cyclopsgroup.jmxterm.jdk9;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import org.apache.commons.lang3.Validate;
+import org.cyclopsgroup.jmxterm.JavaProcess;
+import org.cyclopsgroup.jmxterm.JavaProcessManager;
+import org.cyclopsgroup.jmxterm.utils.WeakCastUtils;
+
+/**
+ * JDK9 specific java process manager
+ *
+ * @author nyg
+ */
+public class Jdk9JavaProcessManager extends JavaProcessManager {
+ private final StaticVirtualMachine staticVirtualMachine;
+ private final Class> originalVirtualMachine;
+
+ public Jdk9JavaProcessManager(ClassLoader classLoader)
+ throws SecurityException, NoSuchMethodException, ClassNotFoundException {
+ Validate.notNull(classLoader, "ClassLoader can't be NULL");
+ originalVirtualMachine = classLoader.loadClass(VirtualMachine.ORIGINAL_CLASS_NAME);
+ staticVirtualMachine =
+ WeakCastUtils.staticCast(originalVirtualMachine, StaticVirtualMachine.class);
+ }
+
+ @Override
+ public JavaProcess get(int pid) {
+ return list().stream().filter(process -> process.getProcessId() == pid).findAny().orElse(null);
+ }
+
+ @Override
+ public List list() {
+ List