JPMFactory.java

package org.cyclopsgroup.jmxterm.cc;

import org.apache.commons.lang3.JavaVersion;
import org.apache.commons.lang3.SystemUtils;
import org.cyclopsgroup.jmxterm.JavaProcessManager;
import org.cyclopsgroup.jmxterm.jdk5.Jdk5JavaProcessManager;
import org.cyclopsgroup.jmxterm.jdk6.Jdk6JavaProcessManager;
import org.cyclopsgroup.jmxterm.jdk9.Jdk9JavaProcessManager;
import org.cyclopsgroup.jmxterm.pm.JConsoleClassLoaderFactory;
import org.cyclopsgroup.jmxterm.pm.UnsupportedJavaProcessManager;

/**
 * Internal factory class to create JPM instance
 *
 * @author <a href="mailto:jiaqi.guo@gmail.com">Jiaqi Guo</a>
 */
public class JPMFactory {
  private final JavaProcessManager jpm;

  /** Default constructor that figures out an implementation of JPM */
  public JPMFactory() {
    if (!SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_5)) {
      jpm =
          new UnsupportedJavaProcessManager(
              "JDK version " + SystemUtils.JAVA_RUNTIME_VERSION + " doesn't support this command");
      return;
    }
    JavaProcessManager j;
    try {
      ClassLoader cl = JConsoleClassLoaderFactory.getClassLoader();
      if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_9)) {
        j = new Jdk9JavaProcessManager(cl);
      } else if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_6)) {
        j = new Jdk6JavaProcessManager(cl);
      } else {
        j = new Jdk5JavaProcessManager(cl);
      }
    } catch (ClassNotFoundException e) {
      j =
          new UnsupportedJavaProcessManager(
              e.getMessage()
                  + ", operation on this JDK ("
                  + SystemUtils.JAVA_RUNTIME_VERSION
                  + ") isn't fully supported",
              e);
    } catch (Exception e) {
      j = new UnsupportedJavaProcessManager(e);
    }
    jpm = j;
  }

  /**
   * @return Java process manager instance
   */
  final JavaProcessManager getProcessManager() {
    return jpm;
  }
}