static int jInjectionsTable_updateInterval = 3000; static JTable jInjectionsTable() { final JTable tbl = sexyTable(); tablePopupMenu(tbl, voidfunc(JPopupMenu menu, final int row) { final int port = parseIntOpt(str(getTableLineAsMap(tbl, row).get("VM"))); if (port != 0) { addMenuItem(menu, "Kill VM", r { killVM(port) }); addMenuItem(menu, "Show VM Output", r { thread "Show VM Output" { showText("Output of VM " + port, unquote(sendToLocalBot(port, "get output"))); } }); addMenuItem(menu, "Dump heap...", r { inputFilePath("Dump heap to where?", voidfunc(File f) { pcall-messagebox { assertOK(send(port, "dump heap to *", f2s(f))); infoBox("Heap dumped to " + fileNamePlusMSize(f)); } }); }); } }); awtCalcRegularly(tbl, jInjectionsTable_updateInterval, 0, r { long time = sysNow(); new L l; for (DialogIO vm : talkToAllVMs()) { pcall { int vmPort = vm.getPort(); S x = vm.ask("get injections"); S mem = dropUntilColon(vm.ask("how much memory are you consuming")); //print("VM " + vmPort + " injections: " + x); L injections = cast safeUnstructure(x); for (O inj : injections) { S progID = formatSnippetID((S) get(inj, "progID")); l.add(litorderedmap( "Program name", getSnippetTitle(progID), "Program ID", progID, "VM Size (Java)", mem, "VM", vmPort, "More info", isTrue(get(inj, "mainDone")) ? "main done" : "main running", "Injection ID", get(inj, "injectionID"))); } } vm.close(); } done2(time, "Scanned " + n(l, "VMs")); dataToTable(tbl, l); }); ret tbl; }