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.border.*; 36 37 import javax.management.MBeanServerConnection; 38 import javax.management.ObjectName; 39 import javax.management.InstanceAlreadyExistsException; 40 import javax.management.InstanceNotFoundException; 41 42 43 import static sun.tools.jconsole.Utilities.*; 44 45 @SuppressWarnings("serial") 46 public class CreateMBeanDialog extends InternalDialog 47 implements ActionListener { 48 JConsole jConsole; 49 JComboBox connections; 50 JButton createMBeanButton, unregisterMBeanButton, cancelButton; 51 52 private static final String HOTSPOT_MBEAN = 53 "sun.management.HotspotInternal"; 54 private static final String HOTSPOT_MBEAN_OBJECTNAME = 55 "sun.management:type=HotspotInternal"; 56 public CreateMBeanDialog(JConsole jConsole) { 57 super(jConsole, "JConsole: Hotspot MBeans", true); 58 59 this.jConsole = jConsole; 60 setAccessibleDescription(this, 61 Messages.HOTSPOT_MBEANS_DIALOG_ACCESSIBLE_DESCRIPTION); 62 Container cp = getContentPane(); 63 ((JComponent)cp).setBorder(new EmptyBorder(10, 10, 4, 10)); 64 65 JPanel centerPanel = new JPanel(new VariableGridLayout(0, 66 1, 67 4, 68 4, 69 false, 70 true)); 71 cp.add(centerPanel, BorderLayout.CENTER); 72 connections = new JComboBox(); 73 updateConnections(); 74 75 centerPanel.add(new LabeledComponent(Resources.format(Messages.MANAGE_HOTSPOT_MBEANS_IN_COLON_), 76 connections)); 77 78 JPanel bottomPanel = new JPanel(new BorderLayout()); 79 cp.add(bottomPanel, BorderLayout.SOUTH); 80 81 JPanel buttonPanel = new JPanel(); 82 bottomPanel.add(buttonPanel, BorderLayout.NORTH); 83 buttonPanel.add(createMBeanButton = 84 new JButton(Messages.CREATE)); 85 buttonPanel.add(unregisterMBeanButton = 86 new JButton(Messages.UNREGISTER)); 87 buttonPanel.add(cancelButton = 88 new JButton(Messages.CANCEL)); 89 90 statusBar = new JLabel(" ", JLabel.CENTER); 91 bottomPanel.add(statusBar, BorderLayout.SOUTH); 92 93 createMBeanButton.addActionListener(this); 94 unregisterMBeanButton.addActionListener(this); 95 cancelButton.addActionListener(this); 96 97 LabeledComponent.layout(centerPanel); 98 pack(); 99 setLocationRelativeTo(jConsole); 100 } 101 102 private void updateConnections() { 103 List<VMInternalFrame> frames = jConsole.getInternalFrames(); 104 TreeSet<ProxyClient> data = 105 new TreeSet<ProxyClient>(new Comparator<ProxyClient>() { 106 public int compare(ProxyClient o1, ProxyClient o2) { 107 // TODO: Need to understand how this method being used? 108 return o1.connectionName().compareTo(o2.connectionName()); 109 } 110 }); 111 112 if (frames.size() == 0) { 113 JComponent cp = (JComponent)jConsole.getContentPane(); 114 Component comp = ((BorderLayout)cp.getLayout()). 115 getLayoutComponent(BorderLayout.CENTER); 116 if (comp instanceof VMPanel) { 117 VMPanel vmpanel = (VMPanel) comp; 118 ProxyClient client = vmpanel.getProxyClient(false); 119 if (client != null && client.hasPlatformMXBeans()) { 120 data.add(client); 121 } 122 } 123 } else { 124 for (VMInternalFrame f : frames) { 125 ProxyClient client = f.getVMPanel().getProxyClient(false); 126 if (client != null && client.hasPlatformMXBeans()) { 127 data.add(client); 128 } 129 } 130 } 131 connections.invalidate(); 132 connections.setModel(new DefaultComboBoxModel(data.toArray())); 133 connections.validate(); 134 } 135 136 public void actionPerformed(final ActionEvent ev) { 137 setVisible(false); 138 statusBar.setText(""); 139 if (ev.getSource() != cancelButton) { 140 new Thread("CreateMBeanDialog.actionPerformed") { 141 public void run() { 142 try { 143 Object c = connections.getSelectedItem(); 144 if(c == null) return; 145 if(ev.getSource() == createMBeanButton) { 146 MBeanServerConnection connection = 147 ((ProxyClient) c). 148 getMBeanServerConnection(); 149 connection.createMBean(HOTSPOT_MBEAN, null); 150 } else { 151 if(ev.getSource() == unregisterMBeanButton) { 152 MBeanServerConnection connection = 153 ((ProxyClient) c). 154 getMBeanServerConnection(); 155 connection.unregisterMBean(new 156 ObjectName(HOTSPOT_MBEAN_OBJECTNAME)); 157 } 158 } 159 return; 160 } catch(InstanceAlreadyExistsException e) { 161 statusBar.setText(Messages.ERROR_COLON_MBEANS_ALREADY_EXIST); 162 } catch(InstanceNotFoundException e) { 163 statusBar.setText(Messages.ERROR_COLON_MBEANS_DO_NOT_EXIST); 164 } catch(Exception e) { 165 statusBar.setText(e.toString()); 166 } 167 setVisible(true); 168 } 169 }.start(); 170 } 171 } 172 173 public void setVisible(boolean b) { 174 boolean wasVisible = isVisible(); 175 176 if(b) { 177 setLocationRelativeTo(jConsole); 178 invalidate(); 179 updateConnections(); 180 validate(); 181 repaint(); 182 } 183 184 super.setVisible(b); 185 186 187 if (b && !wasVisible) { 188 // Need to delay this to make focus stick 189 SwingUtilities.invokeLater(new Runnable() { 190 public void run() { 191 connections.requestFocus(); 192 } 193 }); 194 } 195 } 196 }