1 /* 2 * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package sun.tools.jconsole; 27 28 import java.awt.*; 29 import java.awt.event.*; 30 import java.util.List; 31 import java.util.TreeSet; 32 import java.util.Comparator; 33 34 import javax.swing.*; 35 import javax.swing.Timer; 36 import javax.swing.border.*; 37 import javax.swing.event.*; 38 39 import javax.management.MBeanServerConnection; 40 import javax.management.ObjectName; 41 import javax.management.InstanceAlreadyExistsException; 42 import javax.management.InstanceNotFoundException; 43 44 import static sun.tools.jconsole.Resources.*; 45 import static sun.tools.jconsole.Utilities.*; 46 47 @SuppressWarnings("serial") 48 public class CreateMBeanDialog extends InternalDialog 49 implements ActionListener { 50 JConsole jConsole; 51 JComboBox connections; 52 JButton createMBeanButton, unregisterMBeanButton, cancelButton; 53 54 private static final String HOTSPOT_MBEAN = 55 "sun.management.HotspotInternal"; 56 private static final String HOTSPOT_MBEAN_OBJECTNAME = 57 "sun.management:type=HotspotInternal"; 58 public CreateMBeanDialog(JConsole jConsole) { 59 super(jConsole, "JConsole: Hotspot MBeans", true); 60 61 this.jConsole = jConsole; 62 setAccessibleDescription(this, 63 getText("Hotspot MBeans.dialog.accessibleDescription")); 64 Container cp = getContentPane(); 65 ((JComponent)cp).setBorder(new EmptyBorder(10, 10, 4, 10)); 66 67 JPanel centerPanel = new JPanel(new VariableGridLayout(0, 68 1, 69 4, 70 4, 71 false, 72 true)); 73 cp.add(centerPanel, BorderLayout.CENTER); 74 connections = new JComboBox(); 75 updateConnections(); 76 77 centerPanel.add(new LabeledComponent(Resources. 78 getText("Manage Hotspot MBeans "+ 79 "in: "), 80 connections)); 81 82 JPanel bottomPanel = new JPanel(new BorderLayout()); 83 cp.add(bottomPanel, BorderLayout.SOUTH); 84 85 JPanel buttonPanel = new JPanel(); 86 bottomPanel.add(buttonPanel, BorderLayout.NORTH); 87 buttonPanel.add(createMBeanButton = 88 new JButton(Resources.getText("Create"))); 89 buttonPanel.add(unregisterMBeanButton = 90 new JButton(Resources.getText("Unregister"))); 91 buttonPanel.add(cancelButton = 92 new JButton(Resources.getText("Cancel"))); 93 94 statusBar = new JLabel(" ", JLabel.CENTER); 95 bottomPanel.add(statusBar, BorderLayout.SOUTH); 96 97 createMBeanButton.addActionListener(this); 98 unregisterMBeanButton.addActionListener(this); 99 cancelButton.addActionListener(this); 100 101 LabeledComponent.layout(centerPanel); 102 pack(); 103 setLocationRelativeTo(jConsole); 104 } 105 106 private void updateConnections() { 107 List<VMInternalFrame> frames = jConsole.getInternalFrames(); 108 TreeSet<ProxyClient> data = 109 new TreeSet<ProxyClient>(new Comparator<ProxyClient>() { 110 public int compare(ProxyClient o1, ProxyClient o2) { 111 // TODO: Need to understand how this method being used? 112 return o1.connectionName().compareTo(o2.connectionName()); 113 } 114 }); 115 116 if (frames.size() == 0) { 117 JComponent cp = (JComponent)jConsole.getContentPane(); 118 Component comp = ((BorderLayout)cp.getLayout()). 119 getLayoutComponent(BorderLayout.CENTER); 120 if (comp instanceof VMPanel) { 121 VMPanel vmpanel = (VMPanel) comp; 122 ProxyClient client = vmpanel.getProxyClient(false); 123 if (client != null && client.hasPlatformMXBeans()) { 124 data.add(client); 125 } 126 } 127 } else { 128 for (VMInternalFrame f : frames) { 129 ProxyClient client = f.getVMPanel().getProxyClient(false); 130 if (client != null && client.hasPlatformMXBeans()) { 131 data.add(client); 132 } 133 } 134 } 135 connections.invalidate(); 136 connections.setModel(new DefaultComboBoxModel(data.toArray())); 137 connections.validate(); 138 } 139 140 public void actionPerformed(final ActionEvent ev) { 141 setVisible(false); 142 statusBar.setText(""); 143 if (ev.getSource() != cancelButton) { 144 new Thread("CreateMBeanDialog.actionPerformed") { 145 public void run() { 146 try { 147 StringBuffer buff = null; 148 Object c = connections.getSelectedItem(); 149 if(c == null) return; 150 if(ev.getSource() == createMBeanButton) { 151 MBeanServerConnection connection = 152 ((ProxyClient) c). 153 getMBeanServerConnection(); 154 connection.createMBean(HOTSPOT_MBEAN, null); 155 } else { 156 if(ev.getSource() == unregisterMBeanButton) { 157 MBeanServerConnection connection = 158 ((ProxyClient) c). 159 getMBeanServerConnection(); 160 connection.unregisterMBean(new 161 ObjectName(HOTSPOT_MBEAN_OBJECTNAME)); 162 } 163 } 164 return; 165 } catch(InstanceAlreadyExistsException e) { 166 statusBar.setText(Resources. 167 getText("Error: MBeans already " 168 + "exist")); 169 } catch(InstanceNotFoundException e) { 170 statusBar.setText(Resources. 171 getText("Error: MBeans do not " 172 + "exist")); 173 } catch(Exception e) { 174 statusBar.setText(e.toString()); 175 } 176 setVisible(true); 177 } 178 }.start(); 179 } 180 } 181 182 public void setVisible(boolean b) { 183 boolean wasVisible = isVisible(); 184 185 if(b) { 186 setLocationRelativeTo(jConsole); 187 invalidate(); 188 updateConnections(); 189 validate(); 190 repaint(); 191 } 192 193 super.setVisible(b); 194 195 196 if (b && !wasVisible) { 197 // Need to delay this to make focus stick 198 SwingUtilities.invokeLater(new Runnable() { 199 public void run() { 200 connections.requestFocus(); 201 } 202 }); 203 } 204 } 205 }