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 }