ConnectionHandlerMonitoringPanel.java revision 998747bfaaa3c6b28bbfaf0e282e6c0ccbf46bc0
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* or http://forgerock.org/license/CDDLv1.0.html.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at legal-notices/CDDLv1_0.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2009-2010 Sun Microsystems, Inc.
* Portions Copyright 2014-2015 ForgeRock AS
*/
package org.opends.guitools.controlpanel.ui;
import static org.opends.messages.AdminToolMessages.*;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.net.InetAddress;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import org.opends.guitools.controlpanel.datamodel.BasicMonitoringAttributes;
import org.opends.guitools.controlpanel.datamodel.CategorizedComboBoxElement;
import org.opends.guitools.controlpanel.datamodel.ConnectionHandlerDescriptor;
import org.opends.guitools.controlpanel.datamodel.
ConnectionHandlersMonitoringTableModel;
import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
import org.opends.guitools.controlpanel.datamodel.MonitoringAttributes;
import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
import org.opends.guitools.controlpanel.datamodel.ConnectionHandlerDescriptor.
Protocol;
import org.opends.guitools.controlpanel.datamodel.ConnectionHandlerDescriptor.
State;
import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
import org.opends.guitools.controlpanel.ui.renderer.
NoLeftInsetCategoryComboBoxRenderer;
import org.opends.guitools.controlpanel.util.Utilities;
import org.opends.guitools.controlpanel.util.ViewPositions;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageBuilder;
/**
* Class that displays the monitoring information of connection handlers.
*
*/
public class ConnectionHandlerMonitoringPanel extends StatusGenericPanel
{
private static final long serialVersionUID = -6462932160985559830L;
private MonitoringAttributesViewPanel<MonitoringAttributes>
operationViewPanel;
private GenericDialog operationViewDlg;
private JComboBox connectionHandlers;
private JTable connectionHandlersTable;
private JScrollPane connectionHandlersScroll;
private ConnectionHandlersMonitoringTableModel connectionHandlersTableModel;
private JLabel lNoConnectionHandlers = Utilities.createPrimaryLabel(
INFO_CTRL_PANEL_NO_CONNECTION_HANDLER_FOUND.get());
private boolean firstRealDataSet;
private JCheckBoxMenuItem showAveragesMenu;
private ConnectionHandlerMonitoringMenuBar menuBar;
private LinkedHashSet<MonitoringAttributes> chOperations =
new LinkedHashSet<MonitoringAttributes>();
{
chOperations.add(BasicMonitoringAttributes.ADD_REQUESTS);
chOperations.add(BasicMonitoringAttributes.BIND_REQUESTS);
chOperations.add(BasicMonitoringAttributes.DELETE_REQUESTS);
chOperations.add(BasicMonitoringAttributes.MOD_REQUESTS);
chOperations.add(BasicMonitoringAttributes.MOD_DN_REQUESTS);
chOperations.add(BasicMonitoringAttributes.SEARCH_REQUESTS);
}
private LinkedHashSet<MonitoringAttributes> allowedChOperations =
new LinkedHashSet<MonitoringAttributes>();
{
allowedChOperations.addAll(chOperations);
allowedChOperations.add(BasicMonitoringAttributes.ADD_RESPONSES);
allowedChOperations.add(BasicMonitoringAttributes.BIND_RESPONSES);
allowedChOperations.add(BasicMonitoringAttributes.COMPARE_RESPONSES);
allowedChOperations.add(BasicMonitoringAttributes.DELETE_RESPONSES);
allowedChOperations.add(BasicMonitoringAttributes.EXTENDED_REQUESTS);
allowedChOperations.add(BasicMonitoringAttributes.EXTENDED_RESPONSES);
allowedChOperations.add(BasicMonitoringAttributes.MOD_DN_RESPONSES);
allowedChOperations.add(BasicMonitoringAttributes.MOD_RESPONSES);
allowedChOperations.add(BasicMonitoringAttributes.SEARCH_DONE);
allowedChOperations.add(BasicMonitoringAttributes.UNBIND_REQUESTS);
}
private LocalizableMessage ALL_CONNECTION_HANDLERS =
INFO_CTRL_PANEL_ALL_CONNECTION_HANDLERS.get();
/**
* Default constructor.
*
*/
public ConnectionHandlerMonitoringPanel()
{
super();
createLayout();
}
/**
* Creates the layout of the panel (but the contents are not populated here).
*/
private void createLayout()
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 1;
gbc.weightx = 1.0;
gbc.anchor = GridBagConstraints.NORTHWEST;
addErrorPane(gbc);
gbc.weighty = 1.0;
JPanel viewOptions = new JPanel(new GridBagLayout());
viewOptions.setBackground(ColorAndFontConstants.greyBackground);
viewOptions.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0,
ColorAndFontConstants.defaultBorderColor));
gbc.gridwidth = 1;
JLabel l = Utilities.createPrimaryLabel(
INFO_CTRL_PANEL_CONNECTION_HANDLERS_LABEL.get());
gbc.gridy = 0;
gbc.gridx = 0;
gbc.weightx = 0.0;
gbc.insets = new Insets(10, 10, 10, 0);
viewOptions.add(l, gbc);
gbc.insets.left = 5;
gbc.insets.right = 10;
connectionHandlers = new JComboBox(
new DefaultComboBoxModel(new String[]{"fakeconnectionhandlername"}));
connectionHandlers.addItemListener(
new IgnoreItemListener(connectionHandlers));
connectionHandlers.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent ev)
{
if (ev.getStateChange() == ItemEvent.SELECTED)
{
updateConnectionHandlersPanel(
getInfo().getServerDescriptor(),
errorPane.isVisible());
}
}
});
connectionHandlers.setRenderer(
new NoLeftInsetCategoryComboBoxRenderer(connectionHandlers));
gbc.gridx ++;
viewOptions.add(connectionHandlers, gbc);
gbc.gridx ++;
gbc.weightx = 1.0;
gbc.insets.left = 0;
gbc.insets.right = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
viewOptions.add(Box.createHorizontalGlue(), gbc);
gbc.gridy = 1;
gbc.gridx = 0;
gbc.gridwidth = 1;
gbc.insets.left = 0;
gbc.weighty = 0.0;
gbc.insets = new Insets(0, 0, 0, 0);
add(viewOptions, gbc);
connectionHandlersTableModel = new ConnectionHandlersMonitoringTableModel();
// Add some fake data.
String[] names = {"First Connection Handler", "Second Connection Handler",
"Third Connection Handler", "Fourth Connection Handler",
"Fifth Connection Handler", "Connection Handler with a long name"};
Set<ConnectionHandlerDescriptor> fakeData =
new HashSet<ConnectionHandlerDescriptor>();
connectionHandlersTableModel.setAttributes(chOperations, false);
try
{
Set<InetAddress> addresses = new HashSet<InetAddress>();
addresses.add(InetAddress.getLocalHost());
Set<CustomSearchResult> emptySet = Collections.emptySet();
for (String name : names)
{
fakeData.add(new ConnectionHandlerDescriptor(
addresses, 1389, Protocol.LDAP, State.ENABLED, name, emptySet));
}
connectionHandlersTableModel.setData(fakeData, 0);
}
catch (Throwable t)
{
// Ignore
}
connectionHandlersTable = Utilities.createSortableTable(
connectionHandlersTableModel,
new DefaultTableCellRenderer());
connectionHandlersScroll = Utilities.createScrollPane(
connectionHandlersTable);
gbc.insets = new Insets(10, 10, 10, 10);
gbc.gridy ++;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1.0;
gbc.fill = GridBagConstraints.BOTH;
add(connectionHandlersScroll, gbc);
gbc.fill = GridBagConstraints.VERTICAL;
gbc.anchor = GridBagConstraints.CENTER;
add(lNoConnectionHandlers, gbc);
updateTableSizes();
}
/**
* {@inheritDoc}
*/
@Override
public LocalizableMessage getTitle()
{
return INFO_CTRL_PANEL_CONNECTION_HANDLER_MONITORING_TITLE.get();
}
/**
* {@inheritDoc}
*/
@Override
public JMenuBar getMenuBar()
{
if (menuBar == null)
{
menuBar =
new ConnectionHandlerMonitoringMenuBar(getInfo());
}
return menuBar;
}
/**
* {@inheritDoc}
*/
public void configurationChanged(ConfigurationChangeEvent ev)
{
final ServerDescriptor server = ev.getNewDescriptor();
LinkedHashSet<Object> newElements = new LinkedHashSet<Object>();
newElements.add(new CategorizedComboBoxElement(ALL_CONNECTION_HANDLERS,
CategorizedComboBoxElement.Type.REGULAR));
Set<ConnectionHandlerDescriptor> chs = server.getConnectionHandlers();
SortedSet<ConnectionHandlerDescriptor> sortedChs =
new TreeSet<ConnectionHandlerDescriptor>(
new Comparator<ConnectionHandlerDescriptor>()
{
public int compare(ConnectionHandlerDescriptor desc1,
ConnectionHandlerDescriptor desc2)
{
int compare = 0;
if (desc1.getAddresses().equals(desc2.getAddresses()))
{
Integer port1 = Integer.valueOf(desc1.getPort());
Integer port2 = Integer.valueOf(desc2.getPort());
compare = port1.compareTo(port2);
}
else
{
compare = getConnectionHandlerLabel(desc1).compareTo(
getConnectionHandlerLabel(desc2));
}
return compare;
}
});
for (ConnectionHandlerDescriptor ch : chs)
{
if (protocolHasMonitoring(ch))
{
sortedChs.add(ch);
}
}
// Add the administration connector
sortedChs.add(server.getAdminConnector());
newElements.add(COMBO_SEPARATOR);
for (ConnectionHandlerDescriptor ch : sortedChs)
{
String connectionHandlerLabel = getConnectionHandlerLabel(ch);
newElements.add(new CategorizedComboBoxElement(
connectionHandlerLabel, CategorizedComboBoxElement.Type.REGULAR));
}
updateComboBoxModel(newElements,
(DefaultComboBoxModel)connectionHandlers.getModel());
boolean displayErrorPane = false;
LocalizableMessage errorTitle = LocalizableMessage.EMPTY;
LocalizableMessage errorDetails = LocalizableMessage.EMPTY;
ServerDescriptor.ServerStatus status = server.getStatus();
if (status == ServerDescriptor.ServerStatus.STARTED)
{
if (!server.isAuthenticated())
{
LocalizableMessageBuilder mb = new LocalizableMessageBuilder();
mb.append(
INFO_CTRL_PANEL_AUTH_REQUIRED_TO_SEE_TRAFFIC_MONITORING_SUMMARY.
get());
mb.append("<br><br>").append(getAuthenticateHTML());
errorDetails = mb.toMessage();
errorTitle = INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_SUMMARY.get();
displayErrorPane = true;
}
}
else if (status == ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE)
{
LocalizableMessageBuilder mb = new LocalizableMessageBuilder();
mb.append(INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(
server.getHostname()));
mb.append("<br><br>").append(getAuthenticateHTML());
errorDetails = mb.toMessage();
errorTitle = INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_SUMMARY.get();
displayErrorPane = true;
}
else
{
errorTitle = INFO_CTRL_PANEL_SERVER_NOT_RUNNING_SUMMARY.get();
LocalizableMessageBuilder mb = new LocalizableMessageBuilder();
mb.append(
INFO_CTRL_PANEL_SERVER_MUST_RUN_TO_SEE_TRAFFIC_MONITORING_SUMMARY.
get());
mb.append("<br><br>");
mb.append(getStartServerHTML());
errorDetails = mb.toMessage();
displayErrorPane = true;
}
final boolean fDisplayErrorPane = displayErrorPane;
final LocalizableMessage fErrorTitle = errorTitle;
final LocalizableMessage fErrorDetails = errorDetails;
SwingUtilities.invokeLater(new Runnable()
{
/**
* {@inheritDoc}
*/
public void run()
{
ViewPositions pos = Utilities.getViewPositions(
ConnectionHandlerMonitoringPanel.this);
errorPane.setVisible(fDisplayErrorPane);
if (fDisplayErrorPane)
{
updateErrorPane(errorPane, fErrorTitle,
ColorAndFontConstants.errorTitleFont, fErrorDetails,
ColorAndFontConstants.defaultFont);
}
// TODO: complete update the other table
if (!firstRealDataSet)
{
updateTableSizes();
firstRealDataSet = true;
}
updateConnectionHandlersPanel(server, fDisplayErrorPane);
Utilities.updateViewPositions(pos);
}
});
}
/**
* {@inheritDoc}
*/
@Override
public Component getPreferredFocusComponent()
{
return connectionHandlers;
}
/**
* {@inheritDoc}
*/
@Override
public void okClicked()
{
// No ok button
}
/**
* {@inheritDoc}
*/
@Override
public GenericDialog.ButtonType getButtonType()
{
return GenericDialog.ButtonType.CLOSE;
}
/**
* {@inheritDoc}
*/
@Override
public boolean requiresBorder()
{
return false;
}
/**
* {@inheritDoc}
*/
@Override
public boolean requiresScroll()
{
return false;
}
private void setChOperationsToDisplay(
LinkedHashSet<MonitoringAttributes> operations,
boolean showAverages)
{
connectionHandlersTableModel.setAttributes(operations, showAverages);
connectionHandlersTableModel.forceDataStructureChange();
}
private String getConnectionHandlerLabel(ConnectionHandlerDescriptor ch)
{
StringBuilder sb = new StringBuilder();
if (ch.getProtocol() == Protocol.ADMINISTRATION_CONNECTOR)
{
sb.append(INFO_CTRL_PANEL_ADMINISTRATION_CONNECTOR_NAME.get(
ch.getPort()));
}
else
{
sb.append(ch.getPort());
sb.append(" - ");
switch (ch.getProtocol())
{
case OTHER:
sb.append(ch.getName());
break;
default:
sb.append(ch.getProtocol().getDisplayMessage());
break;
}
}
return sb.toString();
}
/**
* Displays a dialog allowing the user to select which operations to display.
*
*/
private void operationViewClicked()
{
if (operationViewDlg == null)
{
operationViewPanel =
MonitoringAttributesViewPanel.createMonitoringAttributesInstance(
allowedChOperations);
operationViewDlg = new GenericDialog(Utilities.getFrame(this),
operationViewPanel);
Utilities.centerGoldenMean(operationViewDlg,
Utilities.getParentDialog(this));
operationViewDlg.setModal(true);
}
operationViewPanel.setSelectedAttributes(chOperations);
operationViewDlg.setVisible(true);
if (!operationViewPanel.isCanceled())
{
boolean showAverages = showAveragesMenu.isSelected();
chOperations = operationViewPanel.getAttributes();
setChOperationsToDisplay(chOperations, showAverages);
updateTableSizes();
}
}
/**
* Updates the contents of the tables depending on whether the averages
* must be displayed or not.
*
*/
private void showAverageClicked()
{
boolean showAverages = showAveragesMenu.isSelected();
setChOperationsToDisplay(chOperations, showAverages);
updateTableSizes();
}
private void updateTableSizes()
{
Utilities.updateTableSizes(connectionHandlersTable, 8);
Utilities.updateScrollMode(connectionHandlersScroll,
connectionHandlersTable);
}
private void updateConnectionHandlersPanel(ServerDescriptor server,
boolean errorOccurred)
{
Set<ConnectionHandlerDescriptor> cch =
getFilteredConnectionHandlers(server);
connectionHandlersTableModel.setData(cch, server.getRunningTime());
connectionHandlersScroll.setVisible(!cch.isEmpty() && !errorOccurred);
lNoConnectionHandlers.setVisible(cch.isEmpty() && !errorOccurred);
}
private Set<ConnectionHandlerDescriptor> getFilteredConnectionHandlers(
ServerDescriptor server)
{
Set<ConnectionHandlerDescriptor> cchs =
new HashSet<ConnectionHandlerDescriptor>();
if (server != null)
{
Object o = connectionHandlers.getSelectedItem();
if (o instanceof CategorizedComboBoxElement)
{
Object value = ((CategorizedComboBoxElement)o).getValue();
if (value.equals(ALL_CONNECTION_HANDLERS))
{
for (ConnectionHandlerDescriptor ch : server.getConnectionHandlers())
{
if (protocolHasMonitoring(ch))
{
cchs.add(ch);
}
}
cchs.add(server.getAdminConnector());
}
else
{
String name = value.toString();
for (ConnectionHandlerDescriptor ch : server.getConnectionHandlers())
{
if (getConnectionHandlerLabel(ch).equals(name))
{
cchs.add(ch);
break;
}
}
if (cchs.isEmpty())
{
ConnectionHandlerDescriptor adminCh =
server.getAdminConnector();
if (getConnectionHandlerLabel(adminCh).equals(name))
{
cchs.add(adminCh);
}
}
}
}
}
return cchs;
}
private boolean protocolHasMonitoring(ConnectionHandlerDescriptor ch)
{
if (ch.getState() == State.DISABLED)
return false;
return ch.getProtocol() == Protocol.LDAP ||
ch.getProtocol() == Protocol.LDAPS ||
ch.getProtocol() == Protocol.LDAP_STARTTLS ||
ch.getProtocol() == Protocol.OTHER;
}
/**
* The specific menu bar of this panel.
*
*/
class ConnectionHandlerMonitoringMenuBar extends MainMenuBar
{
private static final long serialVersionUID = 505187831116443370L;
/**
* Constructor.
* @param info the control panel info.
*/
public ConnectionHandlerMonitoringMenuBar(ControlPanelInfo info)
{
super(info);
}
/**
* {@inheritDoc}
*/
@Override
protected void addMenus()
{
add(createViewMenuBar());
add(createHelpMenuBar());
}
/**
* Creates the view menu bar.
* @return the view menu bar.
*/
@Override
protected JMenu createViewMenuBar()
{
JMenu menu = Utilities.createMenu(
INFO_CTRL_PANEL_CONNECTION_HANDLER_VIEW_MENU.get(),
INFO_CTRL_PANEL_CONNECTION_HANDLER_VIEW_MENU_DESCRIPTION.get());
menu.setMnemonic(KeyEvent.VK_V);
final JMenuItem viewOperations = Utilities.createMenuItem(
INFO_CTRL_PANEL_OPERATIONS_VIEW.get());
menu.add(viewOperations);
viewOperations.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ev)
{
operationViewClicked();
}
});
showAveragesMenu = new JCheckBoxMenuItem(
INFO_CTRL_PANEL_SHOW_AVERAGES.get().toString());
showAveragesMenu.setSelected(false);
menu.add(showAveragesMenu);
showAveragesMenu.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ev)
{
showAverageClicked();
}
});
return menu;
}
}
}