/* * Copyright 2003-2015 Yusuke Yamamoto * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package samurai.swing; import com.sun.tools.attach.AttachNotSupportedException; import samurai.remotedump.ProcessUtil; import samurai.remotedump.ThreadDumpUtil; import samurai.remotedump.VM; import samurai.util.Configuration; import sun.jvmstat.monitor.MonitorException; import javax.swing.*; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.*; import java.util.ArrayList; import java.util.List; public class LocalProcesses { private final FileHistory fileHistory; private final JMenu localProcessesMenu; public LocalProcesses(Configuration config, FileHistory fileHistory) { config.apply(this); this.fileHistory = fileHistory; localProcessesMenu = new JMenu(); localProcessesMenu.addMenuListener(new MenuListener() { @Override public void menuSelected(MenuEvent e) { updateChildMenuItems(); } @Override public void menuDeselected(MenuEvent e) { } @Override public void menuCanceled(MenuEvent e) { } }); // updateChildMenuItems(); } public JMenu getLocalProcessesMenu() { return this.localProcessesMenu; } private void updateChildMenuItems() { try { List<VM> currentVms = ProcessUtil.getVMs("localhost"); for (int i = 0; i < localProcessesMenu.getItemCount(); i++) { LocalProcessMenuItem item = (LocalProcessMenuItem) localProcessesMenu.getItem(i); boolean found = false; for (VM vm : currentVms) { if (item.getVm().getPid() == vm.getPid()) { found = true; break; } } if (!found) { localProcessesMenu.remove(item); } } for (VM vm : currentVms) { boolean found = false; for (int i = 0; i < localProcessesMenu.getItemCount(); i++) { LocalProcessMenuItem item = (LocalProcessMenuItem) localProcessesMenu.getItem(i); if (item.getVm().getPid() == vm.getPid()) { found = true; break; } } if (!found) { JMenuItem localProcess = new LocalProcessMenuItem(vm); localProcess.setToolTipText(vm.getFullCommandLine()); localProcessesMenu.add(localProcess); } } } catch (URISyntaxException | MonitorException e) { e.printStackTrace(); } } class LocalProcessMenuItem extends JMenuItem { VM vm; public LocalProcessMenuItem(VM vm) { super(String.format("%s %s", vm.getPid(), vm.getFqcn())); this.vm = vm; addActionListener(e -> { try { try { for (int i = 0; i < 3; i++) { Path path = Paths.get(String.valueOf(vm.getPid())); Files.write(path, ThreadDumpUtil.getThreadDump(vm.getPid()), StandardOpenOption.CREATE, StandardOpenOption.APPEND); fileHistory.open(path.toFile()); Thread.sleep(1000); } } catch (InterruptedException ignore) { } } catch (AttachNotSupportedException | IOException e1) { e1.printStackTrace(); } }); } public VM getVm() { return vm; } } }