/* * Copyright 2008-2014 by Emeric Vernat * * This file is part of Java Melody. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.bull.javamelody; import java.awt.BorderLayout; import java.awt.Desktop; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.List; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JPanel; import net.bull.javamelody.swing.MButton; /** * Panel des boutons principaux. * @author Emeric Vernat */ class SystemInformationsButtonsPanel extends MelodyPanel { private static final ImageIcon CURRENT_REQUESTS_ICON = ImageIconCache.getScaledImageIcon( "hourglass.png", 20, 20); private static final ImageIcon XML_ICON = ImageIconCache.getScaledImageIcon("xml.png", 20, 20); private static final ImageIcon SESSIONS_ICON = ImageIconCache.getScaledImageIcon( "system-users.png", 20, 20); private static final ImageIcon HOTSPOTS_ICON = ImageIconCache.getScaledImageIcon("clock.png", 20, 20); private static final ImageIcon PROCESSES_ICON = ImageIconCache.getScaledImageIcon( "processes.png", 20, 20); private static final ImageIcon MBEANS_ICON = ImageIconCache.getScaledImageIcon("mbeans.png", 20, 20); private static final ImageIcon JNDI_ICON = ImageIconCache .getScaledImageIcon("jndi.png", 20, 20); private static final ImageIcon INVALIDATE_SESSION_ICON = ImageIconCache.getScaledImageIcon( "user-trash.png", 20, 20); private static final ImageIcon HEAP_HISTO_ICON = ImageIconCache.getScaledImageIcon( "memory.png", 20, 20); private static final ImageIcon HEAP_DUMP_ICON = ImageIconCache.getScaledImageIcon( "heapdump.png", 20, 20); private static final ImageIcon GC_ICON = ImageIconCache.getScaledImageIcon("broom.png", 20, 20); private static final ImageIcon DATABASE_ICON = ImageIconCache.getScaledImageIcon("db.png", 20, 20); private static final long serialVersionUID = 1L; @SuppressWarnings("all") private final List<JavaInformations> javaInformationsList; private final URL monitoringUrl; SystemInformationsButtonsPanel(RemoteCollector remoteCollector, URL monitoringUrl, boolean collectorServer) { super(remoteCollector); this.javaInformationsList = getJavaInformationsList(); this.monitoringUrl = monitoringUrl; if (collectorServer) { final JPanel currentRequestsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0)); currentRequestsPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 15, 0)); currentRequestsPanel.setOpaque(false); currentRequestsPanel.add(createCurrentRequestsButton()); add(currentRequestsPanel, BorderLayout.NORTH); } if (Parameters.isSystemActionsEnabled()) { final JPanel centerPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0)); centerPanel.setOpaque(false); final JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0)); southPanel.setOpaque(false); centerPanel.add(createGcButton()); centerPanel.add(createHeapDumpButton()); centerPanel.add(createHeapHistoButton()); if (isSessionsEnabled()) { centerPanel.add(createInvalidateSessionsButton()); centerPanel.add(createSessionsButton()); } centerPanel.add(createHotspotsButton()); if (doesWebXmlExists()) { // on n'affiche le lien web.xml que si le fichier existe (pour api servlet 3.0 par ex) southPanel.add(createWebXmlButton()); } southPanel.add(createMBeansButton()); southPanel.add(createProcessesButton()); final String serverInfo = javaInformationsList.get(0).getServerInfo(); if (serverInfo != null && !serverInfo.contains("Winstone")) { // on n'affiche pas le lien JNDI si serveur Winstone car cela n'a pas d'intérêt // pour Hudson/Jenkins sous Winstone, et surtout car (Winstone)Context.listBindings // renvoie une liste de NameClassPair au lieu d'une liste de Binding comme il le devrait southPanel.add(createJndiButton()); } if (isDatabaseEnabled()) { southPanel.add(createConnectionsButton()); southPanel.add(createDatabaseButton()); } add(centerPanel, BorderLayout.CENTER); add(southPanel, BorderLayout.SOUTH); } } private MButton createCurrentRequestsButton() { final MButton currentRequestsButton = new MButton(getString("Requetes_en_cours"), CURRENT_REQUESTS_ICON); currentRequestsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { final CurrentRequestsForCollectorServerPanel panel = new CurrentRequestsForCollectorServerPanel( getRemoteCollector()); addOnglet(panel); } catch (final IOException e1) { showException(e1); } } }); return currentRequestsButton; } private MButton createGcButton() { final MButton gcButton = new MButton(getString("ramasse_miette"), GC_ICON); gcButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (confirm(getString("confirm_ramasse_miette"))) { executeAction(Action.GC); } } }); return gcButton; } private MButton createHeapDumpButton() { final MButton heapDumpButton = new MButton(getString("heap_dump"), HEAP_DUMP_ICON); heapDumpButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (confirm(getString("confirm_heap_dump"))) { executeAction(Action.HEAP_DUMP); } } }); return heapDumpButton; } private MButton createHeapHistoButton() { final MButton heapHistoButton = new MButton(getString("heaphisto"), HEAP_HISTO_ICON); heapHistoButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { addOnglet(new HeapInformationsPanel(getRemoteCollector())); } catch (final IOException ex) { showException(ex); } } }); return heapHistoButton; } private MButton createInvalidateSessionsButton() { final MButton invalidateSessionsButton = new MButton(getString("invalidate_sessions"), INVALIDATE_SESSION_ICON); invalidateSessionsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (confirm(getString("confirm_invalidate_sessions"))) { executeAction(Action.INVALIDATE_SESSIONS); } } }); return invalidateSessionsButton; } private MButton createSessionsButton() { final MButton sessionsButton = new MButton(getString("sessions"), SESSIONS_ICON); sessionsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { addOnglet(new SessionInformationsPanel(getRemoteCollector())); } catch (final IOException ex) { showException(ex); } } }); return sessionsButton; } private MButton createHotspotsButton() { final MButton hotspotsButton = new MButton(getString("hotspots"), HOTSPOTS_ICON); hotspotsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { addOnglet(new HotspotsPanel(getRemoteCollector())); } catch (final IOException ex) { showException(ex); } } }); return hotspotsButton; } private MButton createWebXmlButton() { final MButton webXmlButton = new MButton(getString("web.xml"), XML_ICON); webXmlButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { Desktop.getDesktop().browse( new URI(getMonitoringUrl().toExternalForm() + "?part=web.xml")); } catch (final Exception ex) { showException(ex); } } }); return webXmlButton; } private MButton createMBeansButton() { final MButton mbeansButton = new MButton(getString("MBeans"), MBEANS_ICON); mbeansButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { addOnglet(new MBeansPanel(getRemoteCollector())); } catch (final IOException ex) { showException(ex); } } }); return mbeansButton; } private MButton createProcessesButton() { final MButton processesButton = new MButton(getString("processes"), PROCESSES_ICON); processesButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { addOnglet(new ProcessInformationsPanel(getRemoteCollector())); } catch (final IOException ex) { showException(ex); } } }); return processesButton; } private MButton createJndiButton() { final MButton jndiButton = new MButton(getString("Arbre_JNDI"), JNDI_ICON); jndiButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { addOnglet(new JndiBindingsPanel(getRemoteCollector())); } catch (final IOException ex) { showException(ex); } } }); return jndiButton; } private MButton createConnectionsButton() { final MButton connectionsButton = new MButton(getString("Connexions_jdbc_ouvertes"), DATABASE_ICON); connectionsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { addOnglet(new ConnectionInformationsPanel(getRemoteCollector())); } catch (final IOException ex) { showException(ex); } } }); return connectionsButton; } private MButton createDatabaseButton() { final MButton databaseButton = new MButton(getString("database"), DATABASE_ICON); databaseButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { addOnglet(new DatabaseInformationsPanel(getRemoteCollector())); } catch (final IOException ex) { showException(ex); } } }); return databaseButton; } private boolean isDatabaseEnabled() { return javaInformationsList.get(0).getDataBaseVersion() != null && !javaInformationsList.get(0).getDataBaseVersion().contains("Exception"); } private boolean doesWebXmlExists() { return javaInformationsList.get(0).doesWebXmlExists(); } private boolean isSessionsEnabled() { return javaInformationsList.get(0).getSessionCount() >= 0; } final void executeAction(Action action) { try { final String message = getRemoteCollector().executeActionAndCollectData(action, null, null, null, null, null); showMessage(message); MainPanel.refreshMainTabFromChild(this); } catch (final IOException ex) { showException(ex); } } final void addOnglet(JPanel panel) { MainPanel.addOngletFromChild(this, panel); } URL getMonitoringUrl() { return monitoringUrl; } }