/*
|
* 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
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
|
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
|
* 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
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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 Sun Microsystems, Inc.
|
*/
|
package org.opends.guitools.controlpanel.ui;
|
|
import static org.opends.messages.AdminToolMessages.*;
|
|
import java.awt.Component;
|
import java.awt.Dimension;
|
import java.awt.GridBagConstraints;
|
import java.awt.GridBagLayout;
|
import java.awt.Insets;
|
import java.awt.Window;
|
import java.util.HashMap;
|
|
import javax.swing.ImageIcon;
|
import javax.swing.JPanel;
|
import javax.swing.JScrollPane;
|
import javax.swing.JSplitPane;
|
import javax.swing.JTree;
|
import javax.swing.SwingUtilities;
|
import javax.swing.border.EmptyBorder;
|
import javax.swing.event.TreeSelectionEvent;
|
import javax.swing.event.TreeSelectionListener;
|
import javax.swing.tree.DefaultMutableTreeNode;
|
import javax.swing.tree.DefaultTreeModel;
|
import javax.swing.tree.TreePath;
|
|
import org.opends.guitools.controlpanel.browser.IconPool;
|
import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
|
import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
|
import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
|
import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
|
import org.opends.guitools.controlpanel.ui.components.TreePanel;
|
import org.opends.guitools.controlpanel.ui.nodes.GeneralMonitoringTreeNode;
|
import org.opends.guitools.controlpanel.ui.renderer.TreeCellRenderer;
|
import org.opends.guitools.controlpanel.util.Utilities;
|
import org.opends.guitools.controlpanel.util.ViewPositions;
|
import org.opends.messages.Message;
|
import org.opends.messages.MessageBuilder;
|
|
/**
|
* The pane that is displayed when the user clicks on 'General Monitoring'.
|
*
|
*/
|
public class BrowseGeneralMonitoringPanel extends StatusGenericPanel
|
{
|
private static final long serialVersionUID = 6462914563746678830L;
|
|
/**
|
* The panel containing the tree.
|
*/
|
private TreePanel treePane;
|
|
private JScrollPane treeScroll;
|
|
private ServerDescriptor lastServer;
|
|
private String lastServerName;
|
|
private boolean ignoreSelectionEvents;
|
|
private Message NO_ELEMENT_SELECTED =
|
INFO_CTRL_PANEL_GENERAL_MONITORING_NO_ITEM_SELECTED.get();
|
private Message MULTIPLE_ITEMS_SELECTED =
|
INFO_CTRL_PANEL_MULTIPLE_ITEMS_SELECTED_LABEL.get();
|
|
/**
|
* The enumeration used to define the different static nodes of the tree.
|
*
|
*/
|
protected enum NodeType
|
{
|
/**
|
* Root node.
|
*/
|
ROOT,
|
/**
|
* System information node.
|
*/
|
SYSTEM_INFORMATION,
|
/**
|
* Java information node.
|
*/
|
JAVA_INFORMATION,
|
/**
|
* Work queue node.
|
*/
|
WORK_QUEUE,
|
/**
|
* Entry caches node.
|
*/
|
ENTRY_CACHES,
|
/**
|
* Database environment node.
|
*/
|
DB_ENVIRONMENT
|
}
|
|
/**
|
* The panel displaying the informations about the selected node.
|
*/
|
protected GeneralMonitoringRightPanel entryPane;
|
|
/**
|
* Default constructor.
|
*
|
*/
|
public BrowseGeneralMonitoringPanel()
|
{
|
super();
|
createLayout();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public boolean requiresBorder()
|
{
|
return false;
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public boolean requiresScroll()
|
{
|
return false;
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public boolean callConfigurationChangedInBackground()
|
{
|
return true;
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public void toBeDisplayed(boolean visible)
|
{
|
Window w = Utilities.getParentDialog(this);
|
if (w instanceof GenericDialog)
|
{
|
((GenericDialog)w).getRootPane().setDefaultButton(null);
|
}
|
else if (w instanceof GenericFrame)
|
{
|
((GenericFrame)w).getRootPane().setDefaultButton(null);
|
}
|
}
|
|
/**
|
* Creates the layout of the panel (but the contents are not populated here).
|
*/
|
private void createLayout()
|
{
|
setBackground(ColorAndFontConstants.greyBackground);
|
GridBagConstraints gbc = new GridBagConstraints();
|
gbc.anchor = GridBagConstraints.WEST;
|
gbc.gridx = 0;
|
gbc.gridy = 0;
|
gbc.gridwidth = 1;
|
gbc.weightx = 1.0;
|
gbc.fill = GridBagConstraints.BOTH;
|
addErrorPane(gbc);
|
|
gbc.insets = new Insets(10, 0, 0, 0);
|
gbc.gridx = 0;
|
gbc.gridy ++;
|
gbc.weightx = 1.0;
|
gbc.weighty = 1.0;
|
gbc.fill = GridBagConstraints.BOTH;
|
gbc.gridwidth = 7;
|
add(createSplitPane(), gbc);
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public Message getTitle()
|
{
|
return INFO_CTRL_PANEL_GENERAL_MONITORING_TITLE.get();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public Component getPreferredFocusComponent()
|
{
|
return treePane;
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public void okClicked()
|
{
|
// No ok button
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public GenericDialog.ButtonType getButtonType()
|
{
|
return GenericDialog.ButtonType.CLOSE;
|
}
|
|
/**
|
* Creates the browser right panel.
|
* @return the created browser right panel.
|
*/
|
private GeneralMonitoringRightPanel createBrowserRightPanel()
|
{
|
return new GeneralMonitoringRightPanel();
|
}
|
|
private Component createSplitPane()
|
{
|
treePane = new TreePanel();
|
|
entryPane = createBrowserRightPanel();
|
|
JPanel p = new JPanel(new GridBagLayout());
|
p.setBackground(ColorAndFontConstants.background);
|
GridBagConstraints gbc = new GridBagConstraints();
|
gbc.gridx = 0;
|
gbc.gridy = 0;
|
gbc.gridwidth = 1;
|
gbc.anchor = GridBagConstraints.NORTHWEST;
|
gbc.fill = GridBagConstraints.BOTH;
|
gbc.weightx = 1.0;
|
gbc.weighty = 1.0;
|
Utilities.setBorder(treePane, new EmptyBorder(10, 0, 10, 0));
|
p.add(treePane, gbc);
|
treeScroll = Utilities.createScrollPane(p);
|
|
treePane.getTree().addTreeSelectionListener(new TreeSelectionListener()
|
{
|
/**
|
* {@inheritDoc}
|
*/
|
public void valueChanged(TreeSelectionEvent ev)
|
{
|
if (!ignoreSelectionEvents)
|
{
|
ignoreSelectionEvents = true;
|
updateEntryPane();
|
ignoreSelectionEvents = false;
|
}
|
}
|
});
|
JTree tree = treePane.getTree();
|
repopulateTree(tree, true);
|
tree.setRootVisible(true);
|
tree.setVisibleRowCount(20);
|
tree.expandPath(new TreePath(getRoot(tree)));
|
tree.setCellRenderer(new GeneralMonitoringTreeCellRenderer());
|
treeScroll.setPreferredSize(
|
new Dimension(treeScroll.getPreferredSize().width + 30,
|
3 * treeScroll.getPreferredSize().height));
|
entryPane.displayMessage(NO_ELEMENT_SELECTED);
|
entryPane.setBorder(getRightPanelBorder());
|
entryPane.setPreferredSize(
|
new Dimension(treeScroll.getPreferredSize().width * 2,
|
treeScroll.getPreferredSize().height));
|
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
|
pane.setOpaque(true); //content panes must be opaque
|
pane.setLeftComponent(treeScroll);
|
pane.setRightComponent(entryPane);
|
pane.setResizeWeight(0.0);
|
pane.setDividerLocation(treeScroll.getPreferredSize().width);
|
return pane;
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public void setInfo(ControlPanelInfo info)
|
{
|
super.setInfo(info);
|
treePane.setInfo(info);
|
entryPane.setInfo(info);
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public void configurationChanged(ConfigurationChangeEvent ev)
|
{
|
ServerDescriptor server = ev.getNewDescriptor();
|
if (serverChanged(server))
|
{
|
final boolean firstTimeCalled = lastServer == null;
|
lastServer = server;
|
|
SwingUtilities.invokeLater(new Runnable()
|
{
|
public void run()
|
{
|
String serverName = getServerName(lastServer);
|
// Repopulate the tree to display a root node with server information
|
if (!serverName.equals(lastServerName))
|
{
|
repopulateTree(treePane.getTree(), false);
|
lastServerName = serverName;
|
}
|
if (firstTimeCalled)
|
{
|
// Select the root
|
treePane.getTree().setSelectionInterval(0, 0);
|
}
|
else
|
{
|
// Reselect
|
updateEntryPane();
|
}
|
}
|
});
|
}
|
else
|
{
|
lastServer = server;
|
}
|
|
boolean displayErrorPane = false;
|
Message errorTitle = Message.EMPTY;
|
Message errorDetails = Message.EMPTY;
|
ServerDescriptor.ServerStatus status = server.getStatus();
|
if (status == ServerDescriptor.ServerStatus.STARTED)
|
{
|
if (!server.isAuthenticated())
|
{
|
MessageBuilder mb = new MessageBuilder();
|
mb.append(
|
INFO_CTRL_PANEL_AUTH_REQUIRED_TO_BROWSE_MONITORING_SUMMARY.
|
get());
|
mb.append("<br><br>"+getAuthenticateHTML());
|
errorDetails = mb.toMessage();
|
errorTitle = INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_SUMMARY.get();
|
|
displayErrorPane = true;
|
}
|
}
|
else if (status == ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE)
|
{
|
MessageBuilder mb = new MessageBuilder();
|
mb.append(INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(
|
server.getHostname()));
|
mb.append("<br><br>"+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();
|
MessageBuilder mb = new MessageBuilder();
|
mb.append(
|
INFO_CTRL_PANEL_SERVER_MUST_RUN_TO_BROWSE_MONITORING_SUMMARY.
|
get());
|
mb.append("<br><br>");
|
mb.append(getStartServerHTML());
|
errorDetails = mb.toMessage();
|
displayErrorPane = true;
|
}
|
final boolean fDisplayErrorPane = displayErrorPane;
|
final Message fErrorTitle = errorTitle;
|
final Message fErrorDetails = errorDetails;
|
SwingUtilities.invokeLater(new Runnable()
|
{
|
/**
|
* {@inheritDoc}
|
*/
|
public void run()
|
{
|
errorPane.setVisible(fDisplayErrorPane);
|
if (fDisplayErrorPane)
|
{
|
updateErrorPane(errorPane, fErrorTitle,
|
ColorAndFontConstants.errorTitleFont, fErrorDetails,
|
ColorAndFontConstants.defaultFont);
|
}
|
}
|
});
|
}
|
|
/**
|
* Populates the tree. Should be called only once since the tree in this
|
* panel is static.
|
* @param tree the tree to be repopulated.
|
* @param forceScroll whether the scroll must be reset or not.
|
*/
|
private void repopulateTree(JTree tree, boolean forceScroll)
|
{
|
ignoreSelectionEvents = true;
|
|
ViewPositions pos = Utilities.getViewPositions(treeScroll);
|
|
ServerDescriptor server = null;
|
if (getInfo() != null)
|
{
|
server = getInfo().getServerDescriptor();
|
}
|
GeneralMonitoringTreeNode root;
|
if (server == null)
|
{
|
root =
|
new GeneralMonitoringTreeNode(
|
INFO_CTRL_PANEL_GENERAL_MONITORING_ROOT.get().toString(),
|
NodeType.ROOT,
|
true);
|
}
|
else
|
{
|
root =
|
new GeneralMonitoringTreeNode(
|
getServerName(server),
|
NodeType.ROOT,
|
true);
|
}
|
|
Message[] messages = getNodeMessages();
|
NodeType[] identifiers = getNodeTypes();
|
for (int i=0; i < messages.length; i++)
|
{
|
root.add(new GeneralMonitoringTreeNode(messages[i].toString(),
|
identifiers[i], false));
|
}
|
|
DefaultTreeModel model = new DefaultTreeModel(root);
|
tree.setModel(model);
|
|
Utilities.updateViewPositions(pos);
|
ignoreSelectionEvents = false;
|
}
|
|
/**
|
* Updates the right entry panel.
|
*
|
*/
|
private void updateEntryPane()
|
{
|
ViewPositions pos = Utilities.getViewPositions(entryPane);
|
boolean canDisplayMonitorInformation = true;
|
if (getInfo() == null)
|
{
|
return;
|
}
|
ServerDescriptor server = getInfo().getServerDescriptor();
|
ServerDescriptor.ServerStatus status = server.getStatus();
|
if (status == ServerDescriptor.ServerStatus.STARTED)
|
{
|
if (!server.isAuthenticated())
|
{
|
canDisplayMonitorInformation = false;
|
entryPane.displayMessage(
|
INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_SUMMARY.get());
|
}
|
}
|
else
|
{
|
canDisplayMonitorInformation = false;
|
entryPane.displayMessage(
|
INFO_CTRL_PANEL_SERVER_NOT_RUNNING_SUMMARY.get());
|
}
|
|
if (canDisplayMonitorInformation)
|
{
|
TreePath[] paths = treePane.getTree().getSelectionPaths();
|
TreePath path = null;
|
if ((paths != null) && (paths.length == 1))
|
{
|
path = paths[0];
|
}
|
if (path != null)
|
{
|
GeneralMonitoringTreeNode node =
|
(GeneralMonitoringTreeNode)path.getLastPathComponent();
|
NodeType type = (NodeType)node.getIdentifier();
|
switch (type)
|
{
|
case ROOT:
|
entryPane.updateRoot();
|
break;
|
case SYSTEM_INFORMATION:
|
entryPane.updateSystemInformation();
|
break;
|
case WORK_QUEUE:
|
entryPane.updateWorkQueue();
|
break;
|
case ENTRY_CACHES:
|
entryPane.updateEntryCaches();
|
break;
|
case DB_ENVIRONMENT:
|
entryPane.updateDBEnvironment();
|
break;
|
case JAVA_INFORMATION:
|
entryPane.updateJavaInformation();
|
break;
|
default:
|
throw new RuntimeException("Unknown node type: "+type);
|
}
|
}
|
else
|
{
|
if ((paths != null) && (paths.length > 1))
|
{
|
entryPane.displayMessage(MULTIPLE_ITEMS_SELECTED);
|
}
|
else
|
{
|
entryPane.displayMessage(NO_ELEMENT_SELECTED);
|
}
|
}
|
}
|
Utilities.updateViewPositions(pos);
|
}
|
|
private DefaultMutableTreeNode getRoot(JTree tree)
|
{
|
return (DefaultMutableTreeNode)tree.getModel().getRoot();
|
}
|
|
private boolean serverChanged(ServerDescriptor desc)
|
{
|
boolean changed = false;
|
if (lastServer != null)
|
{
|
// Just compare the elements interesting for this panel
|
changed =
|
!desc.getBackends().equals(lastServer.getBackends());
|
if (!changed)
|
{
|
CustomSearchResult[] monitor1 =
|
{
|
lastServer.getEntryCachesMonitor(),
|
lastServer.getJvmMemoryUsageMonitor(),
|
lastServer.getRootMonitor(),
|
lastServer.getSystemInformationMonitor(),
|
lastServer.getWorkQueueMonitor()
|
};
|
CustomSearchResult[] monitor2 =
|
{
|
desc.getEntryCachesMonitor(),
|
desc.getJvmMemoryUsageMonitor(),
|
desc.getRootMonitor(),
|
desc.getSystemInformationMonitor(),
|
desc.getWorkQueueMonitor()
|
};
|
for (int i=0; i<monitor1.length && !changed; i++)
|
{
|
if (monitor1[i] == null)
|
{
|
changed = monitor2[i] != null;
|
}
|
else
|
{
|
changed = !monitor1[i].equals(monitor2[i]);
|
}
|
}
|
}
|
}
|
else
|
{
|
changed = true;
|
}
|
return changed;
|
}
|
|
private HashMap<Object, ImageIcon> hmImages =
|
new HashMap<Object, ImageIcon>();
|
{
|
NodeType[] identifiers = {
|
NodeType.ROOT,
|
NodeType.SYSTEM_INFORMATION,
|
NodeType.JAVA_INFORMATION,
|
NodeType.WORK_QUEUE,
|
NodeType.ENTRY_CACHES,
|
NodeType.DB_ENVIRONMENT
|
};
|
Message[] ocPaths = {
|
INFO_CTRL_PANEL_GENERAL_MONITORING_ROOT_TREE_NODE.get(),
|
INFO_CTRL_PANEL_SYSTEM_INFORMATION_TREE_NODE.get(),
|
INFO_CTRL_PANEL_JVM_MEMORY_USAGE_TREE_NODE.get(),
|
INFO_CTRL_PANEL_WORK_QUEUE_TREE_NODE.get(),
|
INFO_CTRL_PANEL_ENTRY_CACHES_TREE_NODE.get(),
|
INFO_CTRL_PANEL_DB_ENVIRONMENT_TREE_NODE.get()
|
};
|
for (int i=0; i<identifiers.length; i++)
|
{
|
hmImages.put(identifiers[i],
|
Utilities.createImageIcon(IconPool.IMAGE_PATH+"/"+ocPaths[i],
|
getClass().getClassLoader()));
|
}
|
};
|
|
private String getServerName(ServerDescriptor server)
|
{
|
String serverName = server.getHostname();
|
if (server.getAdminConnector() != null)
|
{
|
serverName +=":"+server.getAdminConnector().getPort();
|
}
|
return serverName;
|
}
|
|
/**
|
* Specific class used to render the nodes in the tree. It uses specific
|
* icons for the nodes.
|
*
|
*/
|
protected class GeneralMonitoringTreeCellRenderer extends TreeCellRenderer
|
{
|
private static final long serialVersionUID = -3390566664259441766L;
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public Component getTreeCellRendererComponent(JTree tree, Object value,
|
boolean isSelected, boolean isExpanded, boolean isLeaf, int row,
|
boolean hasFocus)
|
{
|
super.getTreeCellRendererComponent(tree, value, isSelected, isExpanded,
|
isLeaf, row, hasFocus);
|
setIcon(getIcon(value));
|
return this;
|
}
|
|
private ImageIcon getIcon(Object value)
|
{
|
ImageIcon icon = null;
|
if (value instanceof GeneralMonitoringTreeNode)
|
{
|
icon = hmImages.get(
|
((GeneralMonitoringTreeNode)value).getIdentifier());
|
}
|
else
|
{
|
throw new RuntimeException("Unexpected tree node: "+value);
|
}
|
return icon;
|
}
|
}
|
|
/**
|
* Returns the labels of the nodes to be displayed.
|
* @return the labels of the nodes to be displayed.
|
*/
|
protected Message[] getNodeMessages()
|
{
|
return new Message[] {
|
INFO_CTRL_PANEL_SYSTEM_INFORMATION.get(),
|
INFO_CTRL_PANEL_JAVA_INFORMATION.get(),
|
INFO_CTRL_PANEL_WORK_QUEUE.get(),
|
INFO_CTRL_PANEL_ENTRY_CACHES.get(),
|
INFO_CTRL_PANEL_DB_ENVIRONMENT.get()
|
};
|
}
|
|
/**
|
* Returns the node types to be displayed.
|
* @return the node types to be displayed.
|
*/
|
protected NodeType[] getNodeTypes()
|
{
|
return new NodeType[] {
|
NodeType.SYSTEM_INFORMATION,
|
NodeType.JAVA_INFORMATION,
|
NodeType.WORK_QUEUE,
|
NodeType.ENTRY_CACHES,
|
NodeType.DB_ENVIRONMENT
|
};
|
}
|
}
|