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 }