Jdk9JavaProcess.java

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 <a href="https://github.com/nyg">nyg</a>
 */
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, vm, 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;
  }
}