1 21 22 package org.armedbear.j.jdb; 23 24 import com.sun.jdi.Bootstrap; 25 import com.sun.jdi.VMDisconnectedException; 26 import com.sun.jdi.VirtualMachine; 27 import com.sun.jdi.VirtualMachineManager; 28 import com.sun.jdi.connect.Connector.Argument; 29 import com.sun.jdi.connect.Connector; 30 import com.sun.jdi.connect.LaunchingConnector; 31 import java.util.Map ; 32 import org.armedbear.j.Debug; 33 import org.armedbear.j.FastStringBuffer; 34 import org.armedbear.j.Log; 35 36 public final class VMConnection 37 { 38 private final Connector connector; 39 private final Map map; 40 41 public VMConnection(Connector connector, Map map) 42 { 43 this.connector = connector; 44 this.map = map; 45 } 46 47 public static VMConnection getConnection(Jdb jdb) 48 { 49 VirtualMachineManager vmm = Bootstrap.virtualMachineManager(); 50 LaunchingConnector connector = vmm.defaultConnector(); 51 Map map = connector.defaultArguments(); 52 String javaHome = jdb.getJavaHome(); 53 ((Connector.Argument)map.get("home")).setValue(javaHome); 54 String javaExecutable = jdb.getJavaExecutable(); 55 ((Connector.Argument)map.get("vmexec")).setValue(javaExecutable); 56 57 FastStringBuffer sb = new FastStringBuffer(jdb.getMainClass()); 59 String mainClassArgs = jdb.getMainClassArgs(); 60 if (mainClassArgs != null && mainClassArgs.length() > 0) { 61 sb.append(' '); 62 sb.append(mainClassArgs); 63 } 64 ((Connector.Argument)map.get("main")).setValue(sb.toString()); 65 66 sb.setLength(0); 68 String vmArgs = jdb.getVMArgs(); 69 if (vmArgs != null) { 70 vmArgs = vmArgs.trim(); 71 if (vmArgs.length() > 0) { 72 sb.append(vmArgs); 73 sb.append(' '); 74 } 75 } 76 String classPath = jdb.getClassPath(); 77 if (classPath != null) { 78 classPath = classPath.trim(); 79 if (classPath.length() > 0) { 80 sb.append("-classpath "); 81 sb.append(classPath); 82 } 83 } 84 ((Connector.Argument)map.get("options")).setValue(sb.toString()); 85 86 ((Connector.Argument)map.get("suspend")).setValue("true"); 87 return new VMConnection(connector, map); 88 } 89 90 public VirtualMachine open(Jdb jdb) 91 { 92 if (connector instanceof LaunchingConnector) 93 return launchTarget(jdb); 94 Debug.bug(); 96 return null; 97 } 98 99 private VirtualMachine launchTarget(Jdb jdb) 100 { 101 VirtualMachine vm = null; 102 try { 103 vm = ((LaunchingConnector)connector).launch(map); 104 } 105 catch (VMDisconnectedException disconnected) { 106 return null; 107 } 108 catch (Exception e) { 109 Log.error(e); 110 return null; 111 } 112 Process process = vm.process(); 113 jdb.displayRemoteOutput(process.getErrorStream()); 114 jdb.displayRemoteOutput(process.getInputStream()); 115 vm.suspend(); 116 jdb.setSuspended(true); 117 jdb.setVM(vm); 118 new EventHandler(jdb); 119 jdb.fireContextChanged(); 120 return vm; 121 } 122 } 123 | Popular Tags |