1/*
2 * Copyright (c) 2004, 2012, 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
26package sun.tools.jconsole;
27
28import java.awt.*;
29import java.awt.event.*;
30import java.util.List;
31import java.util.TreeSet;
32import java.util.Comparator;
33
34import javax.swing.*;
35import javax.swing.border.*;
36
37import javax.management.MBeanServerConnection;
38import javax.management.ObjectName;
39import javax.management.InstanceAlreadyExistsException;
40import javax.management.InstanceNotFoundException;
41
42
43import static sun.tools.jconsole.Utilities.*;
44
45@SuppressWarnings("serial")
46public class CreateMBeanDialog extends InternalDialog
47                implements ActionListener {
48    JConsole jConsole;
49    JComboBox<ProxyClient> 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<ProxyClient>();
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<ProxyClient>
133            (data.toArray(new ProxyClient[data.size()])));
134        connections.validate();
135    }
136
137    public void actionPerformed(final ActionEvent ev) {
138        setVisible(false);
139        statusBar.setText("");
140        if (ev.getSource() != cancelButton) {
141            new Thread("CreateMBeanDialog.actionPerformed") {
142                    public void run() {
143                        try {
144                            Object c = connections.getSelectedItem();
145                            if(c == null) return;
146                            if(ev.getSource() == createMBeanButton) {
147                                MBeanServerConnection connection =
148                                    ((ProxyClient) c).
149                                    getMBeanServerConnection();
150                                connection.createMBean(HOTSPOT_MBEAN, null);
151                            } else {
152                                if(ev.getSource() == unregisterMBeanButton) {
153                                    MBeanServerConnection connection =
154                                        ((ProxyClient) c).
155                                        getMBeanServerConnection();
156                                    connection.unregisterMBean(new
157                                        ObjectName(HOTSPOT_MBEAN_OBJECTNAME));
158                                }
159                            }
160                            return;
161                        } catch(InstanceAlreadyExistsException e) {
162                            statusBar.setText(Messages.ERROR_COLON_MBEANS_ALREADY_EXIST);
163                        } catch(InstanceNotFoundException e) {
164                            statusBar.setText(Messages.ERROR_COLON_MBEANS_DO_NOT_EXIST);
165                        } catch(Exception e) {
166                            statusBar.setText(e.toString());
167                        }
168                        setVisible(true);
169                    }
170                }.start();
171        }
172    }
173
174    public void setVisible(boolean b) {
175        boolean wasVisible = isVisible();
176
177        if(b) {
178            setLocationRelativeTo(jConsole);
179            invalidate();
180            updateConnections();
181            validate();
182            repaint();
183        }
184
185        super.setVisible(b);
186
187
188        if (b && !wasVisible) {
189            // Need to delay this to make focus stick
190            SwingUtilities.invokeLater(new Runnable() {
191                public void run() {
192                    connections.requestFocus();
193                }
194            });
195        }
196    }
197}
198