From a7412c11ea1e360d2b05629900cb617dc5d49f3e Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Sun, 08 Feb 2009 17:04:05 +0000
Subject: [PATCH] Add some UI to display global monitoring information (java memory usage, system startup time, database environment information, entry cache information etc.).
---
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BasicMonitoringAttributes.java | 399 +++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/SystemInformationMonitoringPanel.java | 163 +
opendj-sdk/opends/src/messages/messages/admin_tool.properties | 105 +
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlerDescriptor.java | 37
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseGeneralMonitoringPanel.java | 681 ++++++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/MonitoringAttributesViewPanel.java | 293 ++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaInformationMonitoringPanel.java | 424 ++++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java | 9
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GeneralMonitoringRightPanel.java | 276 ++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/DBEnvironmentMonitoringPanel.java | 273 ++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlersMonitoringTableModel.java | 335 +++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringTableModel.java | 534 +++++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/EntryCachesMonitoringPanel.java | 163 +
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/MainActionsPane.java | 48
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java | 258 ++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java | 13
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java | 137 +
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/RootMonitoringPanel.java | 211 ++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/ConnectionHandlerMonitoringPanel.java | 674 ++++++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GeneralMonitoringPanel.java | 76
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java | 61
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/nodes/GeneralMonitoringTreeNode.java | 92
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/DBEnvironmentMonitoringTableModel.java | 467 ++++
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringAttributes.java | 102
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/WorkQueueMonitoringPanel.java | 162 +
opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java | 155 +
26 files changed, 6,115 insertions(+), 33 deletions(-)
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BasicMonitoringAttributes.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BasicMonitoringAttributes.java
new file mode 100644
index 0000000..f8c82d3
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BasicMonitoringAttributes.java
@@ -0,0 +1,399 @@
+/*
+ * 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.datamodel;
+
+import static org.opends.messages.AdminToolMessages.*;
+
+import org.opends.messages.Message;
+import org.opends.server.monitors.TraditionalWorkQueueMonitor;
+import org.opends.server.util.ServerConstants;
+
+/**
+ * The enumeration containing the different monitoring attributes that can be
+ * displayed in the monitoring panels.
+ */
+public enum BasicMonitoringAttributes implements MonitoringAttributes
+{
+ /**
+ * Start Date.
+ */
+ START_DATE(Message.EMPTY, ServerConstants.ATTR_START_TIME),
+ /**
+ * Current Date.
+ */
+ CURRENT_DATE(Message.EMPTY, ServerConstants.ATTR_CURRENT_TIME),
+ /**
+ * Current Connections.
+ */
+ CURRENT_CONNECTIONS(Message.EMPTY, ServerConstants.ATTR_CURRENT_CONNS),
+ /**
+ * Maximum Connections.
+ */
+ MAX_CONNECTIONS(Message.EMPTY, ServerConstants.ATTR_MAX_CONNS),
+ /**
+ * Total Connections.
+ */
+ TOTAL_CONNECTIONS(Message.EMPTY, ServerConstants.ATTR_TOTAL_CONNS),
+ /**
+ * Average Request Backlog.
+ */
+ AVERAGE_REQUEST_BACKLOG(INFO_CTRL_PANEL_AVERAGE_REQUEST_BACKLOG.get(),
+ TraditionalWorkQueueMonitor.ATTR_AVERAGE_BACKLOG),
+ /**
+ * Max Request Backlog.
+ */
+ MAX_REQUEST_BACKLOG(INFO_CTRL_PANEL_MAX_REQUEST_BACKLOG.get(),
+ TraditionalWorkQueueMonitor.ATTR_MAX_BACKLOG),
+ /**
+ * Current Request Backlog.
+ */
+ CURRENT_REQUEST_BACKLOG(INFO_CTRL_PANEL_CURRENT_REQUEST_BACKLOG.get(),
+ TraditionalWorkQueueMonitor.ATTR_CURRENT_BACKLOG),
+ /**
+ * Requests submitted.
+ */
+ REQUESTS_SUBMITTED(INFO_CTRL_PANEL_REQUESTS_SUBMITTED.get(),
+ TraditionalWorkQueueMonitor.ATTR_OPS_SUBMITTED),
+ /**
+ * Requests rejected.
+ */
+ REQUESTS_REJECTED(INFO_CTRL_PANEL_REQUESTS_REJECTED.get(),
+ TraditionalWorkQueueMonitor.ATTR_OPS_REJECTED_QUEUE_FULL),
+ /**
+ * Entry cache Hits.
+ */
+ ENTRY_CACHE_HITS(INFO_CTRL_PANEL_ENTRY_CACHE_HITS.get(),
+ "entryCacheHits"),
+ /**
+ * Current entry cache count.
+ */
+ CURRENT_ENTRY_CACHE_COUNT(INFO_CTRL_PANEL_CURRENT_ENTRY_CACHE_COUNT.get(),
+ "currentEntryCacheCount"),
+ /**
+ * Entry cache tries.
+ */
+ ENTRY_CACHE_TRIES(INFO_CTRL_PANEL_ENTRY_CACHE_TRIES.get(),
+ "entryCacheTries"),
+ /**
+ * Entry cache hit ratio.
+ */
+ ENTRY_CACHE_HIT_RATIO(INFO_CTRL_PANEL_ENTRY_CACHE_HIT_RATIO.get(),
+ "entryCacheHitRatio"),
+ /**
+ * Entry cache current size.
+ */
+ CURRENT_ENTRY_CACHE_SIZE(INFO_CTRL_PANEL_CURRENT_ENTRY_CACHE_SIZE.get(),
+ "currentEntryCacheSize"),
+ /**
+ * Entry cache max size.
+ */
+ MAX_ENTRY_CACHE_SIZE(INFO_CTRL_PANEL_MAX_ENTRY_CACHE_SIZE.get(),
+ "maxEntryCacheSize"),
+ /**
+ * Entry cache max count.
+ */
+ MAX_ENTRY_CACHE_COUNT(INFO_CTRL_PANEL_MAX_ENTRY_CACHE_COUNT.get(),
+ "maxEntryCacheCount"),
+ /**
+ * Available CPUs.
+ */
+ AVAILABLE_CPUS(INFO_CTRL_PANEL_AVAILABLE_CPUS.get(),
+ "availableCPUs"),
+ /**
+ * System Name.
+ */
+ SYSTEM_NAME(INFO_CTRL_PANEL_SYSTEM_NAME.get(),
+ "systemName"),
+ /**
+ * Operating System.
+ */
+ OPERATING_SYSTEM(INFO_CTRL_PANEL_OPERATING_SYSTEM.get(),
+ "operatingSystem"),
+ /**
+ * Free used memory.
+ */
+ FREE_USED_MEMORY(INFO_CTRL_PANEL_FREE_USED_MEMORY.get(),
+ "freeUsedMemory"),
+ /**
+ * Max memory.
+ */
+ MAX_MEMORY(INFO_CTRL_PANEL_MAX_MEMORY.get(),
+ "maxMemory"),
+ /**
+ * Used memory.
+ */
+ USED_MEMORY(INFO_CTRL_PANEL_USED_MEMORY.get(),
+ "usedMemory"),
+ /**
+ * Class path.
+ */
+ CLASS_PATH(INFO_CTRL_PANEL_CLASS_PATH.get(),
+ "classPath"),
+ /**
+ * Java Vendor.
+ */
+ JAVA_VENDOR(INFO_CTRL_PANEL_JAVA_VENDOR.get(),
+ "javaVendor"),
+ /**
+ * JVM Vendor.
+ */
+ JVM_VENDOR(INFO_CTRL_PANEL_JVM_VENDOR.get(),
+ "javaVendor"),
+ /**
+ * Java Version.
+ */
+ JAVA_VERSION(INFO_CTRL_PANEL_JAVA_VERSION.get(),
+ "javaVersion"),
+ /**
+ * JVM Version.
+ */
+ JVM_VERSION(INFO_CTRL_PANEL_JVM_VERSION.get(),
+ "jvmVersion"),
+ /**
+ * JVM Architecture.
+ */
+ JVM_ARCHITECTURE(INFO_CTRL_PANEL_JVM_ARCHITECTURE.get(),
+ "jvmArchitecture"),
+ /**
+ * JVM Arguments.
+ */
+ JVM_ARGUMENTS(INFO_CTRL_PANEL_JVM_ARGUMENTS.get(),
+ "jvmArguments"),
+ /**
+ * Add Request.
+ */
+ ADD_REQUESTS(INFO_CTRL_PANEL_ADD_REQUESTS_LABEL.get(),
+ "addRequests"),
+ /**
+ * Add Responses.
+ */
+ ADD_RESPONSES(INFO_CTRL_PANEL_ADD_RESPONSES_LABEL.get(),
+ "addResponses"),
+ /**
+ * Bind Request.
+ */
+ BIND_REQUESTS(INFO_CTRL_PANEL_BIND_REQUESTS_LABEL.get(),
+ "bindRequests"),
+ /**
+ * Bind Responses.
+ */
+ BIND_RESPONSES(INFO_CTRL_PANEL_BIND_RESPONSES_LABEL.get(),
+ "bindResponses"),
+ /**
+ * Compare Requests.
+ */
+ COMPARE_REQUESTS(INFO_CTRL_PANEL_COMPARE_REQUESTS_LABEL.get(),
+ "compareRequests"),
+ /**
+ * Compare Responses.
+ */
+ COMPARE_RESPONSES(INFO_CTRL_PANEL_COMPARE_RESPONSES_LABEL.get(),
+ "compareResponses"),
+ /**
+ * Delete Request.
+ */
+ DELETE_REQUESTS(INFO_CTRL_PANEL_DELETE_REQUESTS_LABEL.get(),
+ "deleteRequests"),
+ /**
+ * Delete Responses.
+ */
+ DELETE_RESPONSES(INFO_CTRL_PANEL_DELETE_RESPONSES_LABEL.get(),
+ "deleteResponses"),
+ /**
+ * Extended Request.
+ */
+ EXTENDED_REQUESTS(INFO_CTRL_PANEL_EXTENDED_REQUESTS_LABEL.get(),
+ "extendedRequests"),
+ /**
+ * Extended Responses.
+ */
+ EXTENDED_RESPONSES(INFO_CTRL_PANEL_EXTENDED_RESPONSES_LABEL.get(),
+ "extendedResponses"),
+ /**
+ * Modify DN Request.
+ */
+ MOD_DN_REQUESTS(INFO_CTRL_PANEL_MOD_DN_REQUESTS_LABEL.get(),
+ "modifyDNRequests"),
+ /**
+ * Modify DN Responses.
+ */
+ MOD_DN_RESPONSES(INFO_CTRL_PANEL_MOD_DN_RESPONSES_LABEL.get(),
+ "modifyDNResponses"),
+ /**
+ * Modify Request.
+ */
+ MOD_REQUESTS(INFO_CTRL_PANEL_MOD_REQUESTS_LABEL.get(),
+ "modifyRequests"),
+ /**
+ * Modify Responses.
+ */
+ MOD_RESPONSES(INFO_CTRL_PANEL_MOD_RESPONSES_LABEL.get(),
+ "modifyResponses"),
+ /**
+ * Search Request.
+ */
+ SEARCH_REQUESTS(INFO_CTRL_PANEL_SEARCH_REQUESTS_LABEL.get(),
+ "searchRequests"),
+ /**
+ * Searches Done.
+ */
+ SEARCH_DONE(INFO_CTRL_PANEL_SEARCH_DONE_LABEL.get(),
+ "searchResultsDone"),
+ /**
+ * Unbind Request.
+ */
+ UNBIND_REQUESTS(INFO_CTRL_PANEL_UNBIND_REQUESTS_LABEL.get(),
+ "unbindRequests"),;
+
+ static
+ {
+ // Do this here, since static references do not work if this is done
+ // in the constructor.
+ for (BasicMonitoringAttributes attr : BasicMonitoringAttributes.values())
+ {
+ attr.calculateProperties();
+ }
+ }
+
+ private Message msg;
+ private String attributeName;
+ private boolean isAborted;
+ private boolean isNumeric;
+ private boolean isGMTDate;
+ private boolean isValueInBytes;
+ private boolean canHaveAverage;
+ private boolean isTime;
+
+ private BasicMonitoringAttributes(Message msg, String attributeName)
+ {
+ this.msg = msg;
+ this.attributeName = attributeName;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Message getMessage()
+ {
+ return msg;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getAttributeName()
+ {
+ return attributeName;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isAborted()
+ {
+ return isAborted;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isNumeric()
+ {
+ return isNumeric;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isTime()
+ {
+ return isTime;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isGMTDate()
+ {
+ return isGMTDate;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isValueInBytes()
+ {
+ return isValueInBytes;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean canHaveAverage()
+ {
+ return canHaveAverage;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isNumericDate()
+ {
+ return false;
+ }
+
+ private void calculateProperties()
+ {
+ isAborted = attributeName.indexOf("ds-mon-aborted-") == 0;
+
+ canHaveAverage = attributeName.endsWith("total-count") ||
+ attributeName.endsWith("Requests") ||
+ attributeName.endsWith("Responses") ||
+ this == SEARCH_DONE;
+
+ isGMTDate = this == START_DATE ||
+ this == CURRENT_DATE;
+
+ isValueInBytes = this == FREE_USED_MEMORY ||
+ this == MAX_MEMORY ||
+ this == USED_MEMORY;
+
+ isTime = attributeName.indexOf("time") != -1;
+
+ isNumeric =
+ !this.isGMTDate() &&
+ this != SYSTEM_NAME &&
+ this != OPERATING_SYSTEM &&
+ this != CLASS_PATH &&
+ this != JAVA_VENDOR &&
+ this != JVM_VENDOR &&
+ this != JAVA_VERSION &&
+ this != JVM_VERSION &&
+ this != JVM_ARCHITECTURE &&
+ this != JVM_ARGUMENTS;
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlerDescriptor.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlerDescriptor.java
index 487f481..4720f90 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlerDescriptor.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlerDescriptor.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2008 Sun Microsystems, Inc.
+ * Copyright 2008-2009 Sun Microsystems, Inc.
*/
package org.opends.guitools.controlpanel.datamodel;
@@ -31,6 +31,8 @@
import java.net.InetAddress;
import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -43,6 +45,8 @@
*/
public class ConnectionHandlerDescriptor
{
+ private Set<CustomSearchResult> monitoringEntries = Collections.emptySet();
+
/**
* Enumeration used to represent the state of the listener.
*/
@@ -149,15 +153,19 @@
* @param protocol the protocol of the listener.
* @param state the state of the connection handler (enabled, disabled, etc.).
* @param name the name of the listener.
+ * @param monitoringEntries the LDAP entries containing the monitoring
+ * information.
*/
public ConnectionHandlerDescriptor(Collection<InetAddress> addresses,
- int port, Protocol protocol, State state, String name)
+ int port, Protocol protocol, State state, String name,
+ Set<CustomSearchResult> monitoringEntries)
{
this.addresses.addAll(addresses);
this.port = port;
this.protocol = protocol;
this.state = state;
this.name = name;
+ this.monitoringEntries = Collections.unmodifiableSet(monitoringEntries);
StringBuilder builder = new StringBuilder();
builder.append(getProtocol() + " " + getState() + " ");
@@ -198,6 +206,24 @@
}
/**
+ * Returns the monitoring entries.
+ * @return the monitoring entries.
+ */
+ public Set<CustomSearchResult> getMonitoringEntries()
+ {
+ return monitoringEntries;
+ }
+
+ /**
+ * Sets the monitoring entries.
+ * @param monitoringEntries the monitoring entries.
+ */
+ public void setMonitoringEntries(Set<CustomSearchResult> monitoringEntries)
+ {
+ this.monitoringEntries = Collections.unmodifiableSet(monitoringEntries);
+ }
+
+ /**
* {@inheritDoc}
*/
public int hashCode()
@@ -226,6 +252,13 @@
else if (o instanceof ConnectionHandlerDescriptor)
{
equals = toString.equals(o.toString());
+ if (equals)
+ {
+ ConnectionHandlerDescriptor ch =
+ (ConnectionHandlerDescriptor)o;
+ // Compare monitoring entries
+ equals = (getMonitoringEntries().equals(ch.getMonitoringEntries()));
+ }
}
return equals;
}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlersMonitoringTableModel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlersMonitoringTableModel.java
new file mode 100644
index 0000000..7de4382
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlersMonitoringTableModel.java
@@ -0,0 +1,335 @@
+/*
+ * 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.datamodel;
+
+import static org.opends.messages.AdminToolMessages.*;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.opends.guitools.controlpanel.datamodel.ConnectionHandlerDescriptor.
+Protocol;
+import org.opends.messages.Message;
+
+/**
+ * The table model used to display the monitoring information of connection
+ * handlers.
+ *
+ */
+public class ConnectionHandlersMonitoringTableModel extends
+MonitoringTableModel<ConnectionHandlerDescriptor,
+AddressConnectionHandlerDescriptor>
+{
+ private static final long serialVersionUID = -8891998773191495L;
+
+ /**
+ * {@inheritDoc}
+ */
+ protected Set<AddressConnectionHandlerDescriptor> convertToInternalData(
+ Set<ConnectionHandlerDescriptor> newData)
+ {
+ Set<AddressConnectionHandlerDescriptor> newAddresses =
+ new HashSet<AddressConnectionHandlerDescriptor>();
+ for (ConnectionHandlerDescriptor ch : newData)
+ {
+ if (ch.getAddresses().isEmpty())
+ {
+ newAddresses.add(new AddressConnectionHandlerDescriptor(ch, null,
+ getMonitoringEntry(null, ch)));
+ }
+ else
+ {
+ for (InetAddress address : ch.getAddresses())
+ {
+ newAddresses.add(new AddressConnectionHandlerDescriptor(ch, address,
+ getMonitoringEntry(address, ch)));
+ }
+ }
+ }
+ return newAddresses;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int compare(AddressConnectionHandlerDescriptor desc1,
+ AddressConnectionHandlerDescriptor desc2)
+ {
+ int result;
+ ArrayList<Integer> possibleResults = new ArrayList<Integer>();
+
+ possibleResults.add(compareNames(desc1, desc2));
+ possibleResults.addAll(getMonitoringPossibleResults(
+ desc1.getMonitoringEntry(), desc2.getMonitoringEntry()));
+
+ result = possibleResults.get(getSortColumn());
+ if (result == 0)
+ {
+ for (int i : possibleResults)
+ {
+ if (i != 0)
+ {
+ result = i;
+ break;
+ }
+ }
+ }
+ if (!isSortAscending())
+ {
+ result = -result;
+ }
+ return result;
+ }
+
+ private int compareNames(AddressConnectionHandlerDescriptor ach1,
+ AddressConnectionHandlerDescriptor ach2)
+ {
+ int compare = 0;
+ boolean addressEqual = false;
+ if (ach1.getAddress() == null)
+ {
+ if (ach2.getAddress() == null)
+ {
+ addressEqual = true;
+ }
+ }
+ else if (ach2.getAddress() != null)
+ {
+ addressEqual = ach1.getAddress().equals(ach2.getAddress());
+ }
+ if (addressEqual)
+ {
+ Integer port1 = new Integer(ach1.getConnectionHandler().getPort());
+ Integer port2 = new Integer(ach2.getConnectionHandler().getPort());
+ compare = port1.compareTo(port2);
+ }
+ else
+ {
+ compare = getName(ach1).compareTo(getName(ach2));
+ }
+ return compare;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected CustomSearchResult getMonitoringEntry(
+ AddressConnectionHandlerDescriptor ach)
+ {
+ return ach.getMonitoringEntry();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String getName(AddressConnectionHandlerDescriptor ach)
+ {
+ StringBuilder sb = new StringBuilder();
+ ConnectionHandlerDescriptor ch = ach.getConnectionHandler();
+ if (ch.getProtocol() == Protocol.ADMINISTRATION_CONNECTOR)
+ {
+ sb.append(INFO_CTRL_PANEL_ADMINISTRATION_CONNECTOR_NAME.get(
+ ch.getPort()));
+ }
+ else
+ {
+ if (ach.getAddress() != null)
+ {
+ sb.append(ach.getAddress().getHostName()+":"+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().toString());
+ break;
+ }
+ }
+ return sb.toString();
+ }
+
+ private CustomSearchResult getMonitoringEntry(InetAddress address,
+ ConnectionHandlerDescriptor cch)
+ {
+ CustomSearchResult monitoringEntry = null;
+ for (CustomSearchResult sr : cch.getMonitoringEntries())
+ {
+ String cn = (String)getFirstMonitoringValue(sr, "cn");
+ if (cn != null)
+ {
+ if (address == null)
+ {
+ monitoringEntry = sr;
+ break;
+ }
+ else
+ {
+ if (cn.endsWith(
+ " "+address.getHostAddress()+" port "+cch.getPort()+
+ " Statistics") ||
+ cn.endsWith(
+ " "+address.getHostName()+" port "+cch.getPort()+
+ " Statistics"))
+ {
+ monitoringEntry = sr;
+ break;
+ }
+ }
+ }
+ }
+ return monitoringEntry;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected Message getNameHeader()
+ {
+ return INFO_CTRL_PANEL_CONNECTION_HANDLER_HEADER.get();
+ }
+}
+
+/**
+ * The table model has one line per address, this object represents that
+ * address and all the associated monitoring information.
+ *
+ */
+class AddressConnectionHandlerDescriptor
+{
+ private ConnectionHandlerDescriptor ch;
+ private InetAddress address;
+ private CustomSearchResult monitoringEntry;
+ private int hashCode;
+
+ /**
+ * Constructor of this data structure.
+ * @param ch the connection handler descriptor.
+ * @param address the address.
+ * @param monitoringEntry the monitoringEntry.
+ */
+ public AddressConnectionHandlerDescriptor(
+ ConnectionHandlerDescriptor ch,
+ InetAddress address,
+ CustomSearchResult monitoringEntry)
+ {
+ this.ch = ch;
+ this.address = address;
+ this.monitoringEntry = monitoringEntry;
+
+ if (address != null)
+ {
+ hashCode = ch.hashCode() + address.hashCode();
+ }
+ else
+ {
+ hashCode = ch.hashCode();
+ }
+ }
+
+ /**
+ * Returns the address.
+ * @return the address.
+ */
+ public InetAddress getAddress()
+ {
+ return address;
+ }
+
+ /**
+ * Returns the connection handler descriptor.
+ * @return the connection handler descriptor.
+ */
+ public ConnectionHandlerDescriptor getConnectionHandler()
+ {
+ return ch;
+ }
+
+ /**
+ * Returns the monitoring entry.
+ * @return the monitoring entry.
+ */
+ public CustomSearchResult getMonitoringEntry()
+ {
+ return monitoringEntry;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int hashCode()
+ {
+ return hashCode;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean equals(Object o)
+ {
+ boolean equals = false;
+ if (o != this)
+ {
+ if (o instanceof AddressConnectionHandlerDescriptor)
+ {
+ AddressConnectionHandlerDescriptor ach =
+ (AddressConnectionHandlerDescriptor)o;
+ if (ach.getAddress() == null)
+ {
+ equals = getAddress() == null;
+ }
+ else if (getAddress() == null)
+ {
+ equals = false;
+ }
+ else
+ {
+ equals = ach.getAddress().equals(getAddress());
+ }
+ if (equals)
+ {
+ equals = ach.getConnectionHandler().equals(getConnectionHandler());
+ }
+ }
+ }
+ else
+ {
+ equals = true;
+ }
+ return equals;
+ }
+}
\ No newline at end of file
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
index 6ae99d8..8df2b1e 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
@@ -596,6 +596,15 @@
desc.setAuthenticated(reader instanceof ConfigFromDirContext);
desc.setJavaVersion(reader.getJavaVersion());
desc.setOpenConnections(reader.getOpenConnections());
+ if (reader instanceof ConfigFromDirContext)
+ {
+ ConfigFromDirContext rCtx = (ConfigFromDirContext)reader;
+ desc.setRootMonitor(rCtx.getRootMonitor());
+ desc.setEntryCachesMonitor(rCtx.getEntryCaches());
+ desc.setJvmMemoryUsageMonitor(rCtx.getJvmMemoryUsage());
+ desc.setSystemInformationMonitor(rCtx.getSystemInformation());
+ desc.setWorkQueueMonitor(rCtx.getWorkQueue());
+ }
}
else
{
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/DBEnvironmentMonitoringTableModel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/DBEnvironmentMonitoringTableModel.java
new file mode 100644
index 0000000..d143a07
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/DBEnvironmentMonitoringTableModel.java
@@ -0,0 +1,467 @@
+/*
+ * 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.datamodel;
+
+import static org.opends.messages.AdminToolMessages.*;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.opends.guitools.controlpanel.util.Utilities;
+import org.opends.messages.Message;
+
+/**
+ * The abstract table model used to display all the network groups.
+ */
+public class DBEnvironmentMonitoringTableModel extends SortableTableModel
+implements Comparator<BackendDescriptor>
+{
+ private static final long serialVersionUID = 548035716525600536L;
+ private Set<BackendDescriptor> data = new HashSet<BackendDescriptor>();
+ private ArrayList<String[]> dataArray = new ArrayList<String[]>();
+ private ArrayList<BackendDescriptor> dataSourceArray =
+ new ArrayList<BackendDescriptor>();
+
+ private String[] columnNames = {};
+ private Message NO_VALUE_SET = INFO_CTRL_PANEL_NO_MONITORING_VALUE.get();
+ private Message NOT_IMPLEMENTED = INFO_CTRL_PANEL_NOT_IMPLEMENTED.get();
+
+
+ /**
+ * The operations to be displayed.
+ */
+ private LinkedHashSet<String> attributes = new LinkedHashSet<String>();
+ /**
+ * The sort column of the table.
+ */
+ private int sortColumn = 0;
+ /**
+ * Whether the sorting is ascending or descending.
+ */
+ private boolean sortAscending = true;
+
+ /**
+ * Sets the data for this table model.
+ * @param newData the data for this table model.
+ */
+ public void setData(Set<BackendDescriptor> newData)
+ {
+ if (!newData.equals(data))
+ {
+ data.clear();
+ data.addAll(newData);
+ updateDataArray();
+ fireTableDataChanged();
+ }
+ }
+
+ /**
+ * Updates the table model contents and sorts its contents depending on the
+ * sort options set by the user.
+ */
+ public void forceResort()
+ {
+ updateDataArray();
+ fireTableDataChanged();
+ }
+
+ /**
+ * Updates the table model contents, sorts its contents depending on the
+ * sort options set by the user and updates the column structure.
+ */
+ public void forceDataStructureChange()
+ {
+ updateDataArray();
+ fireTableStructureChanged();
+ fireTableDataChanged();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getColumnCount()
+ {
+ return columnNames.length;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getRowCount()
+ {
+ return dataArray.size();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Object getValueAt(int row, int col)
+ {
+ return dataArray.get(row)[col];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getColumnName(int col) {
+ return columnNames[col];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int compare(BackendDescriptor desc1, BackendDescriptor desc2)
+ {
+ int result;
+ ArrayList<Integer> possibleResults = new ArrayList<Integer>();
+
+ possibleResults.add(getName(desc1).compareTo(getName(desc2)));
+ for (String attrName : attributes)
+ {
+ int possibleResult;
+ if (desc1.getMonitoringEntry() == null)
+ {
+ if (desc2.getMonitoringEntry() == null)
+ {
+ possibleResult = 0;
+ }
+ else
+ {
+ possibleResult = -1;
+ }
+ }
+ else if (desc2.getMonitoringEntry() == null)
+ {
+ possibleResult = 1;
+ }
+ else
+ {
+ Object v1 = null;
+ Object v2 = null;
+
+ for (String attr : desc1.getMonitoringEntry().getAttributeNames())
+ {
+ if (attr.equalsIgnoreCase(attrName))
+ {
+ v1 = getFirstMonitoringValue(desc1.getMonitoringEntry(), attrName);
+ break;
+ }
+ }
+ for (String attr : desc2.getMonitoringEntry().getAttributeNames())
+ {
+ if (attr.equalsIgnoreCase(attrName))
+ {
+ v2 = getFirstMonitoringValue(desc2.getMonitoringEntry(), attrName);
+ break;
+ }
+ }
+
+ if (v1 == null)
+ {
+ if (v2 == null)
+ {
+ possibleResult = 0;
+ }
+ else
+ {
+ possibleResult = -1;
+ }
+ }
+ else if (v2 == null)
+ {
+ possibleResult = 1;
+ }
+ else
+ {
+ if (v1 instanceof Number)
+ {
+ if ((v1 instanceof Double) || (v2 instanceof Double))
+ {
+ double n1 = ((Number)v1).doubleValue();
+ double n2 = ((Number)v2).doubleValue();
+ if (n1 > n2)
+ {
+ possibleResult = 1;
+ }
+ else if (n1 < n2)
+ {
+ possibleResult = -1;
+ }
+ else
+ {
+ possibleResult = 0;
+ }
+ }
+ else
+ {
+ long n1 = ((Number)v1).longValue();
+ long n2 = ((Number)v2).longValue();
+ if (n1 > n2)
+ {
+ possibleResult = 1;
+ }
+ else if (n1 < n2)
+ {
+ possibleResult = -1;
+ }
+ else
+ {
+ possibleResult = 0;
+ }
+ }
+ }
+ else if (v2 instanceof Number)
+ {
+ possibleResult = -1;
+ }
+ else
+ {
+ possibleResult = v1.toString().compareTo(v2.toString());
+ }
+ }
+ }
+ possibleResults.add(possibleResult);
+ }
+
+ result = possibleResults.get(getSortColumn());
+ if (result == 0)
+ {
+ for (int i : possibleResults)
+ {
+ if (i != 0)
+ {
+ result = i;
+ break;
+ }
+ }
+ }
+ if (!isSortAscending())
+ {
+ result = -result;
+ }
+ return result;
+ }
+
+ /**
+ * Returns whether the sort is ascending or descending.
+ * @return <CODE>true</CODE> if the sort is ascending and <CODE>false</CODE>
+ * otherwise.
+ */
+ public boolean isSortAscending()
+ {
+ return sortAscending;
+ }
+
+ /**
+ * Sets whether to sort ascending of descending.
+ * @param sortAscending whether to sort ascending or descending.
+ */
+ public void setSortAscending(boolean sortAscending)
+ {
+ this.sortAscending = sortAscending;
+ }
+
+ /**
+ * Returns the column index used to sort.
+ * @return the column index used to sort.
+ */
+ public int getSortColumn()
+ {
+ return sortColumn;
+ }
+
+ /**
+ * Sets the column index used to sort.
+ * @param sortColumn column index used to sort..
+ */
+ public void setSortColumn(int sortColumn)
+ {
+ this.sortColumn = sortColumn;
+ }
+
+ /**
+ * Returns the operations displayed by this table model.
+ * @return the operations displayed by this table model.
+ */
+ public Collection<String> getAttributes()
+ {
+ return attributes;
+ }
+
+ /**
+ * Sets the operations displayed by this table model.
+ * @param operations the operations displayed by this table model.
+ */
+ public void setAttributes(LinkedHashSet<String> operations)
+ {
+ this.attributes.clear();
+ this.attributes.addAll(operations);
+ columnNames = new String[operations.size() + 1];
+ columnNames[0] = INFO_CTRL_PANEL_DB_HEADER.get().toString();
+ int i = 1;
+ for (String operation : operations)
+ {
+ columnNames[i] = operation;
+ i++;
+ }
+ }
+
+ /**
+ * Updates the array data. This includes resorting it.
+ */
+ private void updateDataArray()
+ {
+ TreeSet<BackendDescriptor> sortedSet = new TreeSet<BackendDescriptor>(this);
+ sortedSet.addAll(data);
+ dataArray.clear();
+ dataSourceArray.clear();
+ for (BackendDescriptor ach : sortedSet)
+ {
+ String[] s = getLine(ach);
+ dataArray.add(s);
+ dataSourceArray.add(ach);
+ }
+
+ // Add the total: always at the end
+
+ String[] line = new String[attributes.size() + 1];
+ line[0] = "<html><b>"+INFO_CTRL_PANEL_TOTAL_LABEL.get().toString()+
+ "</b>";
+ for (int i=1; i<line.length; i++)
+ {
+ boolean valueSet = false;
+ boolean notImplemented = false;
+ long totalValue = 0;
+ for (int j=0; j<dataArray.size(); j++)
+ {
+ String[] l = dataArray.get(j);
+ String value = l[i];
+ try
+ {
+ long v = Long.parseLong(value);
+ totalValue += v;
+ valueSet = true;
+ }
+ catch (Throwable t)
+ {
+ try
+ {
+ double v = Double.parseDouble(value);
+ totalValue += v;
+ valueSet = true;
+ }
+ catch (Throwable t2)
+ {
+ notImplemented = NOT_IMPLEMENTED.toString().equals(value);
+ }
+ }
+ }
+ if (notImplemented)
+ {
+ line[i] = NOT_IMPLEMENTED.toString();
+ }
+ else if (valueSet)
+ {
+ line[i] = String.valueOf(totalValue);
+ }
+ else
+ {
+ line[i] = NO_VALUE_SET.toString();
+ }
+ }
+ dataArray.add(line);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String[] getColumnNames()
+ {
+ return columnNames;
+ }
+
+ /**
+ * Returns the label to be used for the provided backend.
+ * @param backend the backend.
+ * @return the label to be used for the provided backend.
+ */
+ protected String getName(BackendDescriptor backend)
+ {
+ return backend.getBackendID();
+ }
+
+ /**
+ * Returns the monitoring entry associated with the provided backend.
+ * @param backend the backend.
+ * @return the monitoring entry associated with the provided backend. Returns
+ * <CODE>null</CODE> if there is no monitoring entry associated.
+ */
+ protected CustomSearchResult getMonitoringEntry(
+ BackendDescriptor backend)
+ {
+ return backend.getMonitoringEntry();
+ }
+
+ private String[] getLine(BackendDescriptor backend)
+ {
+ String[] line = new String[attributes.size() + 1];
+ line[0] = getName(backend);
+ int i = 1;
+ CustomSearchResult monitoringEntry = getMonitoringEntry(backend);
+ for (String attr : attributes)
+ {
+ Object o = getFirstMonitoringValue(monitoringEntry, attr);
+ if (o == null)
+ {
+ line[i] = NO_VALUE_SET.toString();
+ }
+ else
+ {
+ line[i] = o.toString();
+ }
+ i++;
+ }
+ return line;
+ }
+
+ /**
+ * Returns the first value for a given attribute in the provided entry.
+ * @param sr the entry.
+ * @param attrName the attribute name.
+ * @return the first value for a given attribute in the provided entry.
+ */
+ protected Object getFirstMonitoringValue(CustomSearchResult sr,
+ String attrName)
+ {
+ return Utilities.getFirstMonitoringValue(sr, attrName);
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringAttributes.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringAttributes.java
new file mode 100644
index 0000000..d794e63
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringAttributes.java
@@ -0,0 +1,102 @@
+/*
+ * 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 2008-2009 Sun Microsystems, Inc.
+ */
+package org.opends.guitools.controlpanel.datamodel;
+
+import org.opends.messages.Message;
+
+/**
+ * An interface defining the different methods required by the UI components
+ * to display monitoring attributes data.
+ *
+ */
+public interface MonitoringAttributes
+{
+ /**
+ * Returns the message associated with the attribute (basically is the
+ * localized name of the operation associated with the attribute).
+ * @return the message associated with the attribute.
+ */
+ public Message getMessage();
+
+ /**
+ * Returns the name of the attribute.
+ * @return the name of the attribute.
+ */
+ public String getAttributeName();
+
+ /**
+ * Tells whether this is the number of aborted operations.
+ * @return <CODE>true</CODE> if this corresponds to the number of aborted
+ * operations and <CODE>false</CODE> otherwise.
+ */
+ public boolean isAborted();
+
+ /**
+ * Return whether this attribute contains a numeric value or not.
+ * @return <CODE>true</CODE> if the value is numeric and <CODE>false</CODE>
+ * otherwise.
+ */
+ public boolean isNumeric();
+
+ /**
+ * Return whether this attribute contains a time value or not.
+ * @return <CODE>true</CODE> if the value is a time and <CODE>false</CODE>
+ * otherwise.
+ */
+ public boolean isTime();
+
+ /**
+ * Return whether this attribute contains a numeric date value or not.
+ * The date is a long value in miliseconds.
+ * @return <CODE>true</CODE> if the value is date and <CODE>false</CODE>
+ * otherwise.
+ */
+ public boolean isNumericDate();
+
+ /**
+ * Return whether this attribute contains a GMT date value or not. The date
+ * has a format of type ServerConstants.DATE_FORMAT_GMT_TIME.
+ * @return <CODE>true</CODE> if the value is a GMT date and <CODE>false</CODE>
+ * otherwise.
+ */
+ public boolean isGMTDate();
+
+ /**
+ * Return whether this attribute represents a value in bytes or not.
+ * @return <CODE>true</CODE> if the value represents a value in bytes and
+ * <CODE>false</CODE> otherwise.
+ */
+ public boolean isValueInBytes();
+
+ /**
+ * Returns <CODE>true</CODE> if the average for this attribute makes sense
+ * and <CODE>false</CODE> otherwise.
+ * @return <CODE>true</CODE> if the average for this attribute makes sense
+ * and <CODE>false</CODE> otherwise.
+ */
+ public boolean canHaveAverage();
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringTableModel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringTableModel.java
new file mode 100644
index 0000000..b5fe49c
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringTableModel.java
@@ -0,0 +1,534 @@
+/*
+ * 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.datamodel;
+
+import static org.opends.messages.AdminToolMessages.*;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.opends.guitools.controlpanel.util.Utilities;
+import org.opends.messages.Message;
+
+/**
+ * The abstract table model used to display all the network groups.
+ * @param <T> the type of the objects passed externally to the table model.
+ * @param <P> the type of the objects used internally by the table model.
+ */
+public abstract class MonitoringTableModel<T, P> extends SortableTableModel
+implements Comparator<P>
+{
+ private Set<P> data = new HashSet<P>();
+ private ArrayList<String[]> dataArray = new ArrayList<String[]>();
+ private ArrayList<P> dataSourceArray = new ArrayList<P>();
+ private boolean showAverages;
+ private long runningTime;
+
+ private String[] columnNames = {};
+ private Message NO_VALUE_SET = INFO_CTRL_PANEL_NO_MONITORING_VALUE.get();
+ private Message NOT_IMPLEMENTED = INFO_CTRL_PANEL_NOT_IMPLEMENTED.get();
+
+
+ /**
+ * The attributes to be displayed.
+ */
+ private LinkedHashSet<MonitoringAttributes> attributes =
+ new LinkedHashSet<MonitoringAttributes>();
+ /**
+ * The sort column of the table.
+ */
+ private int sortColumn = 0;
+ /**
+ * Whether the sorting is ascending or descending.
+ */
+ private boolean sortAscending = true;
+
+ /**
+ * Indicates whether a total row must be added or not. The default behavior
+ * is to add it.
+ * @return <CODE>true</CODE> if a total row must be added and
+ * <CODE>false</CODE> otherwise.
+ */
+ protected boolean addTotalRow()
+ {
+ return true;
+ }
+
+ /**
+ * Sets the data for this table model.
+ * @param newData the data for this table model.
+ * @param runningTime the running time of the server in miliseconds.
+ */
+ public void setData(Set<T> newData, long runningTime)
+ {
+ this.runningTime = runningTime;
+ Set<P> newInternalData = convertToInternalData(newData);
+
+ // When we show the averages, the data displayed changes (even if the
+ // monitoring data has not).
+ if (!newInternalData.equals(data) || showAverages)
+ {
+ data.clear();
+ data.addAll(newInternalData);
+ updateDataArray();
+ fireTableDataChanged();
+ }
+ }
+
+ /**
+ * Updates the table model contents and sorts its contents depending on the
+ * sort options set by the user.
+ */
+ public void forceResort()
+ {
+ updateDataArray();
+ fireTableDataChanged();
+ }
+
+ /**
+ * Updates the table model contents, sorts its contents depending on the
+ * sort options set by the user and updates the column structure.
+ */
+ public void forceDataStructureChange()
+ {
+ updateDataArray();
+ fireTableStructureChanged();
+ fireTableDataChanged();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getColumnCount()
+ {
+ return columnNames.length;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getRowCount()
+ {
+ return dataArray.size();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Object getValueAt(int row, int col)
+ {
+ return dataArray.get(row)[col];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getColumnName(int col) {
+ return columnNames[col];
+ }
+
+ /**
+ * Returns whether the sort is ascending or descending.
+ * @return <CODE>true</CODE> if the sort is ascending and <CODE>false</CODE>
+ * otherwise.
+ */
+ public boolean isSortAscending()
+ {
+ return sortAscending;
+ }
+
+ /**
+ * Sets whether to sort ascending of descending.
+ * @param sortAscending whether to sort ascending or descending.
+ */
+ public void setSortAscending(boolean sortAscending)
+ {
+ this.sortAscending = sortAscending;
+ }
+
+ /**
+ * Returns the column index used to sort.
+ * @return the column index used to sort.
+ */
+ public int getSortColumn()
+ {
+ return sortColumn;
+ }
+
+ /**
+ * Sets the column index used to sort.
+ * @param sortColumn column index used to sort..
+ */
+ public void setSortColumn(int sortColumn)
+ {
+ this.sortColumn = sortColumn;
+ }
+
+ /**
+ * Returns the attributes displayed by this table model.
+ * @return the attributes displayed by this table model.
+ */
+ public Collection<MonitoringAttributes> getAttributes()
+ {
+ return attributes;
+ }
+
+ /**
+ * Returns the header to be used for the name of the object.
+ * @return the header to be used for the name of the object.
+ */
+ protected abstract Message getNameHeader();
+
+ /**
+ * Sets the operations displayed by this table model.
+ * @param attributes the attributes displayed by this table model.
+ * @param showAverages whether the averages (when makes sense) should be
+ * displayed or not.
+ */
+ public void setAttributes(LinkedHashSet<MonitoringAttributes> attributes,
+ boolean showAverages)
+ {
+ this.showAverages = showAverages;
+ this.attributes.clear();
+ this.attributes.addAll(attributes);
+ int columnCount = attributes.size() + 1;
+ if (showAverages)
+ {
+ for (MonitoringAttributes attr : attributes)
+ {
+ if (attr.canHaveAverage())
+ {
+ columnCount ++;
+ }
+ }
+ }
+ columnNames = new String[columnCount];
+ columnNames[0] = getHeader(getNameHeader());
+ int i = 1;
+ for (MonitoringAttributes attribute : attributes)
+ {
+ columnNames[i] = getHeader(attribute.getMessage(), 15);
+ if (showAverages && attribute.canHaveAverage())
+ {
+ i++;
+ columnNames[i] = getAverageHeader(attribute);
+ }
+ i++;
+ }
+ }
+
+ /**
+ * Updates the array data. This includes resorting it.
+ */
+ private void updateDataArray()
+ {
+ TreeSet<P> sortedSet = new TreeSet<P>(this);
+ sortedSet.addAll(data);
+ dataArray.clear();
+ dataSourceArray.clear();
+ for (P ach : sortedSet)
+ {
+ String[] s = getLine(ach);
+ dataArray.add(s);
+ dataSourceArray.add(ach);
+ }
+
+ // Add the total: always at the end
+ if (addTotalRow())
+ {
+ String[] line = new String[columnNames.length];
+ line[0] = "<html><b>"+INFO_CTRL_PANEL_TOTAL_LABEL.get().toString()+
+ "</b>";
+ for (int i=1; i<line.length; i++)
+ {
+ boolean valueSet = false;
+ boolean notImplemented = false;
+ long totalValue = 0;
+ for (int j=0; j<dataArray.size(); j++)
+ {
+ String[] l = dataArray.get(j);
+ String value = l[i];
+ try
+ {
+ long v = Long.parseLong(value);
+ totalValue += v;
+ valueSet = true;
+ }
+ catch (Throwable t)
+ {
+ notImplemented = NOT_IMPLEMENTED.toString().equals(value);
+ }
+ }
+ if (notImplemented)
+ {
+ line[i] = NOT_IMPLEMENTED.toString();
+ }
+ else if (valueSet)
+ {
+ line[i] = String.valueOf(totalValue);
+ }
+ else
+ {
+ line[i] = NO_VALUE_SET.toString();
+ }
+ }
+ dataArray.add(line);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String[] getColumnNames()
+ {
+ return columnNames;
+ }
+
+ /**
+ * Converts the provided data into internal data to be used by the table
+ * model.
+ * @param o the set of objects to convert.
+ * @return the set of objects to be used by the table model.
+ */
+ protected abstract Set<P> convertToInternalData(Set<T> o);
+
+ /**
+ * Returns the label to be used for the provided internal object.
+ * @param o the internal object.
+ * @return the label to be used for the provided internal object.
+ */
+ protected abstract String getName(P o);
+
+ /**
+ * Returns the monitoring entry associated with the provided object.
+ * @param o the internal object.
+ * @return the monitoring entry associated with the provided object. Returns
+ * <CODE>null</CODE> if there is no monitoring entry associated.
+ */
+ protected abstract CustomSearchResult getMonitoringEntry(P o);
+
+ private String[] getLine(P o)
+ {
+ String[] line = new String[columnNames.length];
+ line[0] = getName(o);
+ int i = 1;
+ CustomSearchResult monitoringEntry = getMonitoringEntry(o);
+ for (MonitoringAttributes attribute : attributes)
+ {
+ line[i] = Utilities.getMonitoringValue(
+ attribute, monitoringEntry);
+ if (showAverages && attribute.canHaveAverage())
+ {
+ i++;
+ try
+ {
+ if (runningTime > 0)
+ {
+ long v = Long.parseLong(line[i - 1]);
+ long average = (1000 * v) / runningTime;
+ String s = String.valueOf(average);
+ int index = s.indexOf(".");
+ // Show a maximum of two decimals.
+ if ((index != -1) && ((index + 3) < s.length()))
+ {
+ s = s.substring(0, index + 3);
+ }
+ line[i] = s;
+ }
+ else
+ {
+ line[i] = NO_VALUE_SET.toString();
+ }
+ }
+ catch (Throwable t)
+ {
+ line[i] = NO_VALUE_SET.toString();
+ }
+ }
+ i++;
+ }
+ return line;
+ }
+
+ /**
+ * Returns the String to be used as header on the table to display the average
+ * for a given monitoring attribute.
+ * @param attr the monitoring attribute.
+ * @return the String to be used as header on the table to display the average
+ * for a given monitoring attribute.
+ */
+ private String getAverageHeader(MonitoringAttributes attr)
+ {
+ return getHeader(INFO_CTRL_PANEL_AVERAGE_HEADER.get(
+ attr.getMessage().toString()), 15);
+ }
+
+ /**
+ * Returns the first value for a given attribute in the provided entry.
+ * @param sr the entry.
+ * @param attrName the attribute name.
+ * @return the first value for a given attribute in the provided entry.
+ */
+ protected Object getFirstMonitoringValue(CustomSearchResult sr,
+ String attrName)
+ {
+ return Utilities.getFirstMonitoringValue(sr, attrName);
+ }
+
+ /**
+ * Returns a list of integer with all the values of two monitoring entries
+ * compared.
+ * @param monitor1 the first monitoring entry.
+ * @param monitor2 the second monitoring entry.
+ * @return a list of integer with all the values of two monitoring entries
+ * compared.
+ */
+ protected ArrayList<Integer> getMonitoringPossibleResults(
+ CustomSearchResult monitor1, CustomSearchResult monitor2)
+ {
+ ArrayList<Integer> possibleResults = new ArrayList<Integer>();
+ for (MonitoringAttributes operation : getAttributes())
+ {
+ int possibleResult;
+ if (monitor1 == null)
+ {
+ if (monitor2 == null)
+ {
+ possibleResult = 0;
+ }
+ else
+ {
+ possibleResult = -1;
+ }
+ }
+ else if (monitor2 == null)
+ {
+ possibleResult = 1;
+ }
+ else
+ {
+ Object v1 = null;
+ Object v2 = null;
+
+ for (String attrName : monitor1.getAttributeNames())
+ {
+ if (operation.getAttributeName().equalsIgnoreCase(attrName))
+ {
+ v1 = getFirstMonitoringValue(monitor1, attrName);
+ break;
+ }
+ }
+ for (String attrName : monitor2.getAttributeNames())
+ {
+ if (operation.getAttributeName().equalsIgnoreCase(attrName))
+ {
+ v2 = getFirstMonitoringValue(monitor2, attrName);
+ break;
+ }
+ }
+
+ if (v1 == null)
+ {
+ if (v2 == null)
+ {
+ possibleResult = 0;
+ }
+ else
+ {
+ possibleResult = -1;
+ }
+ }
+ else if (v2 == null)
+ {
+ possibleResult = 1;
+ }
+ else
+ {
+ if (v1 instanceof Number)
+ {
+ if (v2 instanceof Number)
+ {
+ if ((v1 instanceof Double) || (v2 instanceof Double))
+ {
+ double n1 = ((Number)v1).doubleValue();
+ double n2 = ((Number)v2).doubleValue();
+ if (n1 > n2)
+ {
+ possibleResult = 1;
+ }
+ else if (n1 < n2)
+ {
+ possibleResult = -1;
+ }
+ else
+ {
+ possibleResult = 0;
+ }
+ }
+ else
+ {
+ long n1 = ((Number)v1).longValue();
+ long n2 = ((Number)v2).longValue();
+ if (n1 > n2)
+ {
+ possibleResult = 1;
+ }
+ else if (n1 < n2)
+ {
+ possibleResult = -1;
+ }
+ else
+ {
+ possibleResult = 0;
+ }
+ }
+ }
+ else
+ {
+ possibleResult = 1;
+ }
+ }
+ else if (v2 instanceof Number)
+ {
+ possibleResult = -1;
+ }
+ else
+ {
+ possibleResult = v1.toString().compareTo(v2.toString());
+ }
+ }
+ }
+ possibleResults.add(possibleResult);
+ }
+ return possibleResults;
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
index 3a80912..16f4612 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2008 Sun Microsystems, Inc.
+ * Copyright 2008-2009 Sun Microsystems, Inc.
*/
package org.opends.guitools.controlpanel.datamodel;
@@ -31,11 +31,13 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.opends.guitools.controlpanel.util.ConfigFromDirContext;
import org.opends.guitools.controlpanel.util.Utilities;
import org.opends.server.types.AttributeType;
@@ -67,6 +69,18 @@
private boolean isSchemaEnabled;
private Schema schema;
+ private CustomSearchResult rootMonitor;
+
+ private CustomSearchResult jvmMemoryUsage;
+
+ private CustomSearchResult systemInformation;
+
+ private CustomSearchResult entryCaches;
+
+ private CustomSearchResult workQueue;
+
+ private long runningTime = -1;
+
private boolean isAuthenticated;
private static String hostName = "locahost";
@@ -758,5 +772,126 @@
public void setAdminConnector(ConnectionHandlerDescriptor adminConnector)
{
this.adminConnector = adminConnector;
+ }/**
+ * Sets the monitoring entry for the entry caches.
+ * @param entryCaches the monitoring entry for the entry caches.
+ */
+ public void setEntryCachesMonitor(CustomSearchResult entryCaches)
+ {
+ this.entryCaches = entryCaches;
+ }
+
+ /**
+ * Sets the monitoring entry for the JVM memory usage.
+ * @param jvmMemoryUsage the monitoring entry for the JVM memory usage.
+ */
+ public void setJvmMemoryUsageMonitor(CustomSearchResult jvmMemoryUsage)
+ {
+ this.jvmMemoryUsage = jvmMemoryUsage;
+ }
+
+ /**
+ * Sets the root entry of the monitoring tree.
+ * @param rootMonitor the root entry of the monitoring tree.
+ */
+ public void setRootMonitor(CustomSearchResult rootMonitor)
+ {
+ this.rootMonitor = rootMonitor;
+ if (rootMonitor != null)
+ {
+ try
+ {
+ String start = (String)Utilities.getFirstMonitoringValue(
+ rootMonitor,
+ BasicMonitoringAttributes.START_DATE.getAttributeName());
+ String current = (String)
+ Utilities.getFirstMonitoringValue(rootMonitor,
+ BasicMonitoringAttributes.CURRENT_DATE.getAttributeName());
+ Date startTime = ConfigFromDirContext.utcParser.parse(start);
+ Date currentTime = ConfigFromDirContext.utcParser.parse(current);
+ runningTime = currentTime.getTime() - startTime.getTime();
+ }
+ catch (Throwable t)
+ {
+ runningTime = -1;
+ }
+ }
+ else
+ {
+ runningTime = -1;
+ }
+ }
+
+ /**
+ * Returns the running time of the server in milliseconds. Returns -1 if
+ * no running time could be found.
+ * @return the running time of the server in milliseconds.
+ */
+ public long getRunningTime()
+ {
+ return runningTime;
+ }
+
+ /**
+ * Sets the monitoring entry for the system information.
+ * @param systemInformation entry for the system information.
+ */
+ public void setSystemInformationMonitor(CustomSearchResult systemInformation)
+ {
+ this.systemInformation = systemInformation;
+ }
+
+ /**
+ * Sets the monitoring entry of the work queue.
+ * @param workQueue entry of the work queue.
+ */
+ public void setWorkQueueMonitor(CustomSearchResult workQueue)
+ {
+ this.workQueue = workQueue;
+ }
+
+ /**
+ * Returns the monitoring entry for the entry caches.
+ * @return the monitoring entry for the entry caches.
+ */
+ public CustomSearchResult getEntryCachesMonitor()
+ {
+ return entryCaches;
+ }
+
+ /**
+ * Returns the monitoring entry for the JVM memory usage.
+ * @return the monitoring entry for the JVM memory usage.
+ */
+ public CustomSearchResult getJvmMemoryUsageMonitor()
+ {
+ return jvmMemoryUsage;
+ }
+
+ /**
+ * Returns the root entry of the monitoring tree.
+ * @return the root entry of the monitoring tree.
+ */
+ public CustomSearchResult getRootMonitor()
+ {
+ return rootMonitor;
+ }
+
+ /**
+ * Returns the monitoring entry for the system information.
+ * @return the monitoring entry for the system information.
+ */
+ public CustomSearchResult getSystemInformationMonitor()
+ {
+ return systemInformation;
+ }
+
+ /**
+ * Returns the monitoring entry for the work queue.
+ * @return the monitoring entry for the work queue.
+ */
+ public CustomSearchResult getWorkQueueMonitor()
+ {
+ return workQueue;
}
}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseGeneralMonitoringPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseGeneralMonitoringPanel.java
new file mode 100644
index 0000000..4970260
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseGeneralMonitoringPanel.java
@@ -0,0 +1,681 @@
+/*
+ * 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.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.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}
+ */
+ public boolean requiresBorder()
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean requiresScroll()
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean callConfigurationChangedInBackground()
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void toBeDisplayed(boolean visible)
+ {
+ ((GenericDialog)Utilities.getParentDialog(this)).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}
+ */
+ public Message getTitle()
+ {
+ return INFO_CTRL_PANEL_GENERAL_MONITORING_TITLE.get();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getPreferredFocusComponent()
+ {
+ return treePane;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void okClicked()
+ {
+ // No ok button
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ 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}
+ */
+ 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
+ {
+ 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 IllegalStateException("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()+":"+
+ 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}
+ */
+ 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 IllegalStateException("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
+ };
+ }
+}
+
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/ConnectionHandlerMonitoringPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/ConnectionHandlerMonitoringPanel.java
new file mode 100644
index 0000000..076f652
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/ConnectionHandlerMonitoringPanel.java
@@ -0,0 +1,674 @@
+/*
+ * 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.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.JList;
+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.StatusGenericPanel.
+ IgnoreItemListener;
+import org.opends.guitools.controlpanel.ui.renderer.CustomListCellRenderer;
+import org.opends.guitools.controlpanel.util.Utilities;
+import org.opends.guitools.controlpanel.util.ViewPositions;
+import org.opends.messages.Message;
+import org.opends.messages.MessageBuilder;
+
+/**
+ * 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 = false;
+
+ 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 Message 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 CustomComboBoxCellRenderer(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}
+ */
+ public Message getTitle()
+ {
+ return INFO_CTRL_PANEL_CONNECTION_HANDLER_MONITORING_TITLE.get();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ 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 = new Integer(desc1.getPort());
+ Integer port2 = new Integer(desc2.getPort());
+ compare = port1.compareTo(port2);
+ }
+ else
+ {
+ compare = getConnectionHandlerLabel(desc1).compareTo(
+ getConnectionHandlerLabel(desc2));
+ }
+ return compare;
+ }
+ });
+ for (ConnectionHandlerDescriptor ch : chs)
+ {
+ if (ch.getProtocol() != ConnectionHandlerDescriptor.Protocol.LDIF)
+ {
+ 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;
+ 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_SEE_TRAFFIC_MONITORING_SUMMARY.
+ get());
+ mb.append("<br><br>"+getAuthenticateHTML());
+ errorDetails = mb.toMessage();
+ errorTitle = INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_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_SEE_TRAFFIC_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()
+ {
+ 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}
+ */
+ public Component getPreferredFocusComponent()
+ {
+ return connectionHandlers;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void okClicked()
+ {
+ // No ok button
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public GenericDialog.ButtonType getButtonType()
+ {
+ return GenericDialog.ButtonType.CLOSE;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean requiresBorder()
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ 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().toString());
+ 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.isCancelled())
+ {
+ 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 (ch.getProtocol() != Protocol.LDIF)
+ {
+ cchs.add((ConnectionHandlerDescriptor)ch);
+ }
+ }
+ cchs.add(server.getAdminConnector());
+ }
+ else
+ {
+ String name = value.toString();
+ for (ConnectionHandlerDescriptor ch : server.getConnectionHandlers())
+ {
+ if (getConnectionHandlerLabel(ch).equals(name))
+ {
+ cchs.add((ConnectionHandlerDescriptor)ch);
+ break;
+ }
+ }
+ if (cchs.isEmpty())
+ {
+ ConnectionHandlerDescriptor adminCh =
+ server.getAdminConnector();
+ if (getConnectionHandlerLabel(adminCh).equals(name))
+ {
+ cchs.add(adminCh);
+ }
+ }
+ }
+ }
+ }
+ return cchs;
+ }
+
+ /**
+ * 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}
+ */
+ protected void addMenus()
+ {
+ add(createViewMenuBar());
+ add(createHelpMenuBar());
+ }
+
+ /**
+ * Creates the view menu bar.
+ * @return the view menu bar.
+ */
+ 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;
+ }
+ }
+
+ /**
+ * This class is used simply to avoid an inset on the left for the
+ * elements of the combo box.
+ * Since this item is a CategorizedComboBoxElement of type
+ * CategorizedComboBoxElement.Type.REGULAR, it has by default an inset on
+ * the left.
+ */
+ class CustomComboBoxCellRenderer extends CustomListCellRenderer
+ {
+ /**
+ * The constructor.
+ * @param combo the combo box to be rendered.
+ */
+ CustomComboBoxCellRenderer(JComboBox combo)
+ {
+ super(combo);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getListCellRendererComponent(JList list, Object value,
+ int index, boolean isSelected, boolean cellHasFocus)
+ {
+ Component comp = super.getListCellRendererComponent(list, value, index,
+ isSelected, cellHasFocus);
+ if (value instanceof CategorizedComboBoxElement)
+ {
+ CategorizedComboBoxElement element = (CategorizedComboBoxElement)value;
+ String name = getStringValue(element);
+ ((JLabel)comp).setText(name);
+ }
+ comp.setFont(defaultFont);
+ return comp;
+ }
+ }
+}
+
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/DBEnvironmentMonitoringPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/DBEnvironmentMonitoringPanel.java
new file mode 100644
index 0000000..f664349
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/DBEnvironmentMonitoringPanel.java
@@ -0,0 +1,273 @@
+/*
+ * 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.GridBagConstraints;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.SwingConstants;
+import javax.swing.table.DefaultTableCellRenderer;
+
+import org.opends.guitools.controlpanel.datamodel.BackendDescriptor;
+import org.opends.guitools.controlpanel.datamodel.
+ DBEnvironmentMonitoringTableModel;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
+import org.opends.guitools.controlpanel.util.Utilities;
+import org.opends.server.util.ServerConstants;
+
+/**
+ * The panel displaying the database environment monitor panel.
+ */
+public class DBEnvironmentMonitoringPanel extends GeneralMonitoringPanel
+{
+ private static final long serialVersionUID = 9031734563723229830L;
+
+ private JTable table;
+ private DBEnvironmentMonitoringTableModel tableModel;
+ private JScrollPane scroll;
+ private JLabel noDBsFound;
+ private JLabel noMonitoringFound;
+ private JButton showOperations;
+
+ private LinkedHashSet<String> attributes = new LinkedHashSet<String>();
+ private LinkedHashSet<String> allAttributes = new LinkedHashSet<String>();
+
+ private MonitoringAttributesViewPanel<String> operationViewPanel;
+ private GenericDialog operationViewDlg;
+
+ /**
+ * Default constructor.
+ */
+ public DBEnvironmentMonitoringPanel()
+ {
+ super();
+ createLayout();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getPreferredFocusComponent()
+ {
+ return table;
+ }
+
+ /**
+ * Creates the layout of the panel (but the contents are not populated here).
+ */
+ private void createLayout()
+ {
+ GridBagConstraints gbc = new GridBagConstraints();
+ JLabel lTitle = Utilities.createTitleLabel(
+ INFO_CTRL_PANEL_DB_ENVIRONMENT.get());
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 2;
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.insets.top = 5;
+ gbc.insets.bottom = 7;
+ add(lTitle, gbc);
+
+ gbc.insets.bottom = 0;
+ gbc.insets.top = 10;
+ gbc.gridy ++;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 1;
+ showOperations =
+ Utilities.createButton(INFO_CTRL_PANEL_OPERATIONS_VIEW.get());
+ showOperations.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent ev)
+ {
+ operationViewClicked();
+ }
+ });
+ showOperations.setVisible(false);
+ gbc.gridx = 0;
+ gbc.weightx = 1.0;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ add(Box.createHorizontalGlue(), gbc);
+ gbc.gridx ++;
+ gbc.weightx = 0.0;
+ add(showOperations, gbc);
+
+ gbc.gridx = 0;
+ gbc.gridy ++;
+ gbc.gridwidth = 2;
+ tableModel = new DBEnvironmentMonitoringTableModel();
+ tableModel.setAttributes(attributes);
+ table = Utilities.createSortableTable(tableModel,
+ new DefaultTableCellRenderer());
+ scroll = Utilities.createScrollPane(table);
+ updateTableSize();
+ gbc.fill = GridBagConstraints.BOTH;
+ gbc.weightx = 1.0;
+ gbc.weighty = 1.0;
+ add(scroll, gbc);
+ noDBsFound = Utilities.createDefaultLabel(
+ INFO_CTRL_PANEL_NO_DBS_FOUND.get());
+ noDBsFound.setHorizontalAlignment(SwingConstants.CENTER);
+ add(noDBsFound, gbc);
+ noMonitoringFound = Utilities.createDefaultLabel(
+ INFO_CTRL_PANEL_NO_DB_MONITORING_FOUND.get());
+ noMonitoringFound.setHorizontalAlignment(SwingConstants.CENTER);
+ add(noMonitoringFound, gbc);
+
+ setBorder(PANEL_BORDER);
+ }
+
+ /**
+ * Updates the contents of the panel. The code assumes that this is being
+ * called from the event thread.
+ *
+ */
+ public void updateContents()
+ {
+ boolean backendsFound = false;
+ ServerDescriptor server = null;
+ if (getInfo() != null)
+ {
+ server = getInfo().getServerDescriptor();
+ }
+ Set<BackendDescriptor> dbBackends = new HashSet<BackendDescriptor>();
+ boolean updateAttributes = allAttributes.isEmpty();
+ SortedSet<String> sortedAttrNames = new TreeSet<String>();
+ if (server != null)
+ {
+ for (BackendDescriptor backend : server.getBackends())
+ {
+ if (backend.getType() == BackendDescriptor.Type.LOCAL_DB)
+ {
+ dbBackends.add(backend);
+ if (updateAttributes)
+ {
+ sortedAttrNames.addAll(getMonitoringAttributes(backend));
+ }
+ }
+ }
+ backendsFound = !dbBackends.isEmpty();
+ }
+ if (updateAttributes)
+ {
+ allAttributes.addAll(sortedAttrNames);
+ for (String attrName : allAttributes)
+ {
+ attributes.add(attrName);
+ if (attributes.size() == 5)
+ {
+ break;
+ }
+ }
+ if (attributes.size() > 0)
+ {
+ setOperationsToDisplay(attributes);
+ updateTableSize();
+ }
+ }
+ tableModel.setData(dbBackends);
+ showOperations.setVisible(backendsFound);
+ scroll.setVisible(backendsFound && !allAttributes.isEmpty());
+ noDBsFound.setVisible(!backendsFound);
+ noMonitoringFound.setVisible(backendsFound && allAttributes.isEmpty());
+ showOperations.setVisible(allAttributes.size() > 0);
+ }
+
+
+ private void updateTableSize()
+ {
+ Utilities.updateTableSizes(table, 8);
+ Utilities.updateScrollMode(scroll, table);
+ }
+
+ /**
+ * Displays a dialog allowing the user to select which operations to display.
+ *
+ */
+ private void operationViewClicked()
+ {
+ if (operationViewDlg == null)
+ {
+ operationViewPanel = MonitoringAttributesViewPanel.createStringInstance(
+ allAttributes);
+ operationViewDlg = new GenericDialog(Utilities.getFrame(this),
+ operationViewPanel);
+ operationViewDlg.setModal(true);
+ Utilities.centerGoldenMean(operationViewDlg,
+ Utilities.getParentDialog(this));
+ }
+ operationViewPanel.setSelectedAttributes(attributes);
+ operationViewDlg.setVisible(true);
+ if (!operationViewPanel.isCancelled())
+ {
+ attributes = operationViewPanel.getAttributes();
+ setOperationsToDisplay(attributes);
+ updateTableSize();
+ }
+ }
+
+ private void setOperationsToDisplay(
+ LinkedHashSet<String> attributes)
+ {
+ this.attributes = attributes;
+ tableModel.setAttributes(attributes);
+ tableModel.forceDataStructureChange();
+ }
+
+ private Set<String> getMonitoringAttributes(BackendDescriptor backend)
+ {
+ Set<String> attrNames = new HashSet<String>();
+ if (backend.getMonitoringEntry() != null)
+ {
+ Set<String> allNames = backend.getMonitoringEntry().getAttributeNames();
+ for (String attrName : allNames)
+ {
+ if (!attrName.equalsIgnoreCase(
+ ServerConstants.OBJECTCLASS_ATTRIBUTE_TYPE_NAME) &&
+ !attrName.equalsIgnoreCase(ServerConstants.ATTR_COMMON_NAME))
+ {
+ attrNames.add(attrName);
+ }
+ }
+ }
+ return attrNames;
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/EntryCachesMonitoringPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/EntryCachesMonitoringPanel.java
new file mode 100644
index 0000000..81b86eb
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/EntryCachesMonitoringPanel.java
@@ -0,0 +1,163 @@
+/*
+ * 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.GridBagConstraints;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.Box;
+import javax.swing.JLabel;
+
+import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
+import org.opends.guitools.controlpanel.datamodel.BasicMonitoringAttributes;
+import org.opends.guitools.controlpanel.datamodel.MonitoringAttributes;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
+import org.opends.guitools.controlpanel.util.Utilities;
+/**
+ * The panel displaying the entry caches monitor panel.
+ */
+public class EntryCachesMonitoringPanel extends GeneralMonitoringPanel
+{
+ private static final long serialVersionUID = 9031734563700069830L;
+ static List<MonitoringAttributes> ngOperations =
+ new ArrayList<MonitoringAttributes>();
+ {
+ ngOperations.add(BasicMonitoringAttributes.ENTRY_CACHE_TRIES);
+ ngOperations.add(BasicMonitoringAttributes.ENTRY_CACHE_HITS);
+ ngOperations.add(BasicMonitoringAttributes.ENTRY_CACHE_HIT_RATIO);
+ ngOperations.add(BasicMonitoringAttributes.CURRENT_ENTRY_CACHE_SIZE);
+ ngOperations.add(BasicMonitoringAttributes.MAX_ENTRY_CACHE_SIZE);
+ ngOperations.add(BasicMonitoringAttributes.CURRENT_ENTRY_CACHE_COUNT);
+ ngOperations.add(BasicMonitoringAttributes.MAX_ENTRY_CACHE_COUNT);
+ }
+ private ArrayList<JLabel> monitoringLabels =
+ new ArrayList<JLabel>();
+ {
+ for (int i=0; i<ngOperations.size(); i++)
+ {
+ monitoringLabels.add(Utilities.createDefaultLabel());
+ }
+ }
+
+ /**
+ * Default constructor.
+ */
+ public EntryCachesMonitoringPanel()
+ {
+ super();
+ createLayout();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getPreferredFocusComponent()
+ {
+ return monitoringLabels.get(0);
+ }
+
+ /**
+ * Creates the layout of the panel (but the contents are not populated here).
+ */
+ private void createLayout()
+ {
+ GridBagConstraints gbc = new GridBagConstraints();
+ JLabel lTitle = Utilities.createTitleLabel(
+ INFO_CTRL_PANEL_ENTRY_CACHES.get());
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 2;
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.insets.top = 5;
+ gbc.insets.bottom = 7;
+ add(lTitle, gbc);
+
+ gbc.insets.bottom = 0;
+ gbc.insets.top = 10;
+ gbc.gridy ++;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 1;
+ for (int i=0; i<ngOperations.size(); i++)
+ {
+ JLabel l = Utilities.createPrimaryLabel(getLabel(ngOperations.get(i)));
+ gbc.gridy ++;
+ gbc.insets.left = 0;
+ gbc.gridx = 0;
+ gbc.weightx = 0.0;
+ gbc.gridwidth = 1;
+ add(l, gbc);
+ gbc.insets.left = 10;
+ gbc.gridx = 1;
+ gbc.gridwidth = 2;
+ add(monitoringLabels.get(i), gbc);
+ }
+
+ gbc.gridx = 0;
+ gbc.gridy ++;
+ gbc.fill = GridBagConstraints.BOTH;
+ gbc.weightx = 1.0;
+ gbc.weighty = 1.0;
+ gbc.gridwidth = 3;
+ add(Box.createGlue(), gbc);
+
+ setBorder(PANEL_BORDER);
+ }
+
+ /**
+ * Updates the contents of the panel.
+ *
+ */
+ public void updateContents()
+ {
+ ServerDescriptor server = null;
+ if (getInfo() != null)
+ {
+ server = getInfo().getServerDescriptor();
+ }
+ CustomSearchResult csr = null;
+ if (server != null)
+ {
+ csr = server.getEntryCachesMonitor();
+ }
+ if (csr != null)
+ {
+ updateMonitoringInfo(ngOperations, monitoringLabels, csr);
+ }
+ else
+ {
+ for (JLabel l : monitoringLabels)
+ {
+ l.setText(NO_VALUE_SET.toString());
+ }
+ }
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GeneralMonitoringPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GeneralMonitoringPanel.java
new file mode 100644
index 0000000..5d2d8c6
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GeneralMonitoringPanel.java
@@ -0,0 +1,76 @@
+/*
+ * 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 javax.swing.border.Border;
+import javax.swing.border.EmptyBorder;
+
+import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
+import org.opends.messages.Message;
+
+/**
+ * Abstract class used to refactor some code among the panels that display the
+ * contents of the global monitoring.
+ *
+ */
+public abstract class GeneralMonitoringPanel extends StatusGenericPanel
+{
+ /**
+ * The empty border shared by all the panels.
+ */
+ protected Border PANEL_BORDER = new EmptyBorder(10, 10, 10, 10);
+
+ /**
+ * The message to express that the value was not found.
+ */
+ protected static Message NO_VALUE_SET =
+ INFO_CTRL_PANEL_NO_MONITORING_VALUE.get();
+
+ /**
+ * {@inheritDoc}
+ */
+ public void configurationChanged(ConfigurationChangeEvent ev)
+ {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Message getTitle()
+ {
+ return Message.EMPTY;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void okClicked()
+ {
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GeneralMonitoringRightPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GeneralMonitoringRightPanel.java
new file mode 100644
index 0000000..a2f7e74
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/GeneralMonitoringRightPanel.java
@@ -0,0 +1,276 @@
+/*
+ * 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.CardLayout;
+import java.awt.Component;
+import java.awt.GridBagConstraints;
+
+import javax.swing.JPanel;
+
+import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
+import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
+import org.opends.guitools.controlpanel.util.Utilities;
+import org.opends.messages.Message;
+
+
+/**
+ * The panel on the right of the 'General Information' panel.
+ *
+ */
+public class GeneralMonitoringRightPanel extends StatusGenericPanel
+{
+ private static final long serialVersionUID = -4197460101279681042L;
+
+ /**
+ * The panel with a CardLayout that contains all the panels.
+ */
+ protected JPanel mainPanel;
+
+ private RootMonitoringPanel rootPanel = new RootMonitoringPanel();
+ private WorkQueueMonitoringPanel workQueuePanel =
+ new WorkQueueMonitoringPanel();
+ private EntryCachesMonitoringPanel entryCachesPanel =
+ new EntryCachesMonitoringPanel();
+ private DBEnvironmentMonitoringPanel dbEnvironmentPanel =
+ new DBEnvironmentMonitoringPanel();
+ private SystemInformationMonitoringPanel systemInformationPanel =
+ new SystemInformationMonitoringPanel();
+ private JavaInformationMonitoringPanel javaInformationPanel =
+ new JavaInformationMonitoringPanel();
+
+ /**
+ * The panel used to update messages.
+ */
+ protected NoItemSelectedPanel noEntryPanel = new NoItemSelectedPanel();
+
+ private final StatusGenericPanel[] panels =
+ {
+ rootPanel,
+ workQueuePanel,
+ entryCachesPanel,
+ dbEnvironmentPanel,
+ systemInformationPanel,
+ javaInformationPanel
+ };
+
+ /**
+ * Default constructor.
+ *
+ */
+ public GeneralMonitoringRightPanel()
+ {
+ super();
+ createLayout();
+ }
+
+ /**
+ * Displays a panel containing a message.
+ * @param msg the message.
+ *
+ */
+ public void displayMessage(Message msg)
+ {
+ noEntryPanel.setMessage(msg);
+ ((CardLayout)mainPanel.getLayout()).show(mainPanel, getTitle(noEntryPanel));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setInfo(ControlPanelInfo info)
+ {
+ super.setInfo(info);
+ for (StatusGenericPanel panel : panels)
+ {
+ panel.setInfo(info);
+ }
+ }
+
+ /**
+ * Creates the layout of the panel (but the contents are not populated here).
+ */
+ protected void createLayout()
+ {
+ GridBagConstraints gbc = new GridBagConstraints();
+ CardLayout cardLayout = new CardLayout();
+ mainPanel = new JPanel(cardLayout);
+ mainPanel.setOpaque(false);
+ noEntryPanel.setMessage(
+ INFO_CTRL_PANEL_GENERAL_MONITORING_NO_ITEM_SELECTED.get());
+ JPanel[] panelsWithScroll =
+ {
+ noEntryPanel,
+ rootPanel,
+ workQueuePanel,
+ entryCachesPanel,
+ systemInformationPanel,
+ javaInformationPanel
+ };
+ JPanel[] panelsWithNoScroll =
+ {
+ dbEnvironmentPanel
+ };
+ for (JPanel panel : panelsWithScroll)
+ {
+ mainPanel.add(Utilities.createBorderLessScrollBar(panel),
+ getTitle(panel));
+ }
+ for (JPanel panel : panelsWithNoScroll)
+ {
+ mainPanel.add(panel, getTitle(panel));
+ }
+ cardLayout.show(mainPanel, getTitle(noEntryPanel));
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.weightx = 1.0;
+ gbc.weighty = 1.0;
+ gbc.fill = GridBagConstraints.BOTH;
+ add(mainPanel, gbc);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void okClicked()
+ {
+ // No ok button
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public GenericDialog.ButtonType getButtonType()
+ {
+ return GenericDialog.ButtonType.NO_BUTTON;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Message getTitle()
+ {
+ return Message.EMPTY;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getPreferredFocusComponent()
+ {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void configurationChanged(ConfigurationChangeEvent ev)
+ {
+ }
+
+ /**
+ * Updates the contents of the panel with the root monitoring information.
+ *
+ */
+ public void updateRoot()
+ {
+ rootPanel.updateContents();
+ ((CardLayout)mainPanel.getLayout()).show(mainPanel,
+ getTitle(rootPanel));
+ }
+
+ /**
+ * Updates the contents of the panel with the system information monitoring.
+ *
+ */
+ public void updateSystemInformation()
+ {
+ systemInformationPanel.updateContents();
+ ((CardLayout)mainPanel.getLayout()).show(mainPanel,
+ getTitle(systemInformationPanel));
+ }
+
+ /**
+ * Updates the contents of the panel with the work queue monitoring
+ * information.
+ *
+ */
+ public void updateWorkQueue()
+ {
+ workQueuePanel.updateContents();
+ ((CardLayout)mainPanel.getLayout()).show(mainPanel,
+ getTitle(workQueuePanel));
+ }
+
+ /**
+ * Updates the contents of the panel with the entry caches monitoring
+ * information.
+ *
+ */
+ public void updateEntryCaches()
+ {
+ entryCachesPanel.updateContents();
+ ((CardLayout)mainPanel.getLayout()).show(mainPanel,
+ getTitle(entryCachesPanel));
+ }
+
+ /**
+ * Updates the contents of the panel with the database environment monitoring
+ * information.
+ *
+ */
+ public void updateDBEnvironment()
+ {
+ dbEnvironmentPanel.updateContents();
+ ((CardLayout)mainPanel.getLayout()).show(mainPanel,
+ getTitle(dbEnvironmentPanel));
+ }
+
+ /**
+ * Updates the contents of the panel with the JAVA information.
+ *
+ */
+ public void updateJavaInformation()
+ {
+ javaInformationPanel.updateContents();
+ ((CardLayout)mainPanel.getLayout()).show(mainPanel,
+ getTitle(javaInformationPanel));
+ }
+
+ /**
+ * Returns the title for a given panel. It will be used to update the
+ * CardLayout.
+ * @param panel the panel we want to get the title from.
+ * @return the title for a given panel.
+ */
+ protected String getTitle(JPanel panel)
+ {
+ return panel.getClass().toString();
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaInformationMonitoringPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaInformationMonitoringPanel.java
new file mode 100644
index 0000000..d95d171
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaInformationMonitoringPanel.java
@@ -0,0 +1,424 @@
+/*
+ * 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.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.swing.Box;
+import javax.swing.JComponent;
+import javax.swing.JEditorPane;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.text.JTextComponent;
+
+import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
+import org.opends.guitools.controlpanel.datamodel.BasicMonitoringAttributes;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
+import org.opends.guitools.controlpanel.ui.components.BasicExpander;
+import org.opends.guitools.controlpanel.util.Utilities;
+import org.opends.server.util.ServerConstants;
+
+/**
+ * The panel displaying the java monitoring information.
+ */
+public class JavaInformationMonitoringPanel extends GeneralMonitoringPanel
+{
+ private static final long serialVersionUID = 9031734563799969830L;
+ private List<BasicMonitoringAttributes> generalAttributes =
+ new ArrayList<BasicMonitoringAttributes>();
+ {
+ generalAttributes.add(BasicMonitoringAttributes.JVM_VERSION);
+ generalAttributes.add(BasicMonitoringAttributes.JVM_VENDOR);
+ generalAttributes.add(BasicMonitoringAttributes.JVM_ARCHITECTURE);
+ generalAttributes.add(BasicMonitoringAttributes.JVM_ARGUMENTS);
+ generalAttributes.add(BasicMonitoringAttributes.CLASS_PATH);
+ generalAttributes.add(BasicMonitoringAttributes.JAVA_VERSION);
+ generalAttributes.add(BasicMonitoringAttributes.JAVA_VENDOR);
+ }
+ private List<BasicMonitoringAttributes> extraAttributes =
+ new ArrayList<BasicMonitoringAttributes>();
+ {
+ extraAttributes.add(BasicMonitoringAttributes.CLASS_PATH);
+ extraAttributes.add(BasicMonitoringAttributes.JAVA_VERSION);
+ extraAttributes.add(BasicMonitoringAttributes.JAVA_VENDOR);
+ }
+ private ArrayList<JComponent> generalMonitoringComps =
+ new ArrayList<JComponent>();
+ {
+ for (int i=0; i<generalAttributes.size(); i++)
+ {
+ if ((generalAttributes.get(i) == BasicMonitoringAttributes.CLASS_PATH) ||
+ (generalAttributes.get(i) == BasicMonitoringAttributes.JVM_ARGUMENTS))
+ {
+ JEditorPane pane = new JEditorPane();
+ pane.setEditable(false);
+ pane.setBorder(new EmptyBorder(0, 0, 0, 0));
+ pane.setOpaque(false);
+ pane.setFocusCycleRoot(false);
+ generalMonitoringComps.add(pane);
+ }
+ else
+ {
+ generalMonitoringComps.add(Utilities.createDefaultLabel());
+ }
+ }
+ }
+
+ private List<String> memoryAttributes = new ArrayList<String>();
+ private List<JLabel> memoryLabels = new ArrayList<JLabel>();
+ private JPanel memoryPanel;
+
+ /**
+ * Default constructor.
+ */
+ public JavaInformationMonitoringPanel()
+ {
+ super();
+ createLayout();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getPreferredFocusComponent()
+ {
+ return generalMonitoringComps.get(0);
+ }
+
+ /**
+ * Creates the layout of the panel (but the contents are not populated here).
+ */
+ private void createLayout()
+ {
+ GridBagConstraints gbc = new GridBagConstraints();
+ JLabel lTitle = Utilities.createTitleLabel(
+ INFO_CTRL_PANEL_JAVA_INFORMATION.get());
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 2;
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.insets.top = 5;
+ gbc.insets.bottom = 7;
+ add(lTitle, gbc);
+
+ gbc.insets.bottom = 0;
+ gbc.insets.top = 10;
+ gbc.gridy ++;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 1;
+ for (int i=0; i<generalAttributes.size(); i++)
+ {
+ if (extraAttributes.contains(generalAttributes.get(i)))
+ {
+ continue;
+ }
+ JLabel l = Utilities.createPrimaryLabel(
+ getLabel(generalAttributes.get(i)));
+ gbc.gridy ++;
+ gbc.insets.left = 0;
+ gbc.insets.right = 0;
+ gbc.gridx = 0;
+ gbc.weightx = 0.0;
+ gbc.gridwidth = 1;
+ gbc.fill = GridBagConstraints.NONE;
+ boolean isTextComponent =
+ generalMonitoringComps.get(i) instanceof JTextComponent;
+ if (isTextComponent)
+ {
+ gbc.anchor = GridBagConstraints.NORTHWEST;
+ }
+ else
+ {
+ gbc.anchor = GridBagConstraints.WEST;
+ }
+ add(l, gbc);
+ gbc.insets.left = 10;
+ gbc.gridx = 1;
+ if (isTextComponent)
+ {
+ gbc.insets.right = 10;
+ gbc.weightx = 1.0;
+ gbc.fill = GridBagConstraints.BOTH;
+ add(generalMonitoringComps.get(i), gbc);
+ }
+ else
+ {
+ gbc.weightx = 0.0;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ add(generalMonitoringComps.get(i), gbc);
+ }
+ }
+
+ final BasicExpander extraExpander = new BasicExpander(
+ INFO_CTRL_PANEL_EXTRA_JAVA_ATTRIBUTES.get());
+ gbc.gridwidth = 2;
+ gbc.gridx = 0;
+ gbc.weighty = 0.0;
+ gbc.insets.left = 0;
+ gbc.weightx = 1.0;
+ gbc.fill = GridBagConstraints.BOTH;
+ gbc.gridy ++;
+ add(extraExpander, gbc);
+ final JPanel extraGeneralPanel = new JPanel(new GridBagLayout());
+ gbc.insets.left = 15;
+ gbc.gridy ++;
+ add(extraGeneralPanel, gbc);
+ extraGeneralPanel.setOpaque(false);
+ extraGeneralPanel.setVisible(false);
+
+ final BasicExpander memoryExpander = new BasicExpander(
+ INFO_CTRL_PANEL_JAVA_MEMORY_ATTRIBUTES.get());
+ gbc.gridy ++;
+ gbc.insets.left = 0;
+ add(memoryExpander, gbc);
+ memoryPanel = new JPanel(new GridBagLayout());
+ gbc.insets.left = 15;
+ gbc.gridy ++;
+ add(memoryPanel, gbc);
+ memoryPanel.setOpaque(false);
+ memoryPanel.setVisible(false);
+
+ GridBagConstraints gbc1 = new GridBagConstraints();
+ gbc1.fill = GridBagConstraints.HORIZONTAL;
+ gbc1.gridy = 0;
+ gbc1.gridx = 0;
+ gbc1.gridwidth = 1;
+
+ for (int i=0; i<extraAttributes.size(); i++)
+ {
+ int index = generalAttributes.indexOf(extraAttributes.get(i));
+ JLabel l = Utilities.createPrimaryLabel(
+ getLabel(extraAttributes.get(i)));
+ gbc1.insets.left = 0;
+ gbc1.insets.right = 0;
+ gbc1.gridx = 0;
+ gbc1.weightx = 0.0;
+ gbc1.gridwidth = 1;
+ gbc1.fill = GridBagConstraints.NONE;
+ boolean isTextComponent =
+ generalMonitoringComps.get(index) instanceof JTextComponent;
+ if (isTextComponent)
+ {
+ gbc1.anchor = GridBagConstraints.NORTHWEST;
+ }
+ else
+ {
+ gbc1.anchor = GridBagConstraints.WEST;
+ }
+ extraGeneralPanel.add(l, gbc1);
+ gbc1.insets.left = 10;
+ gbc1.gridx = 1;
+ if (isTextComponent)
+ {
+ gbc1.insets.right = 10;
+ gbc1.weightx = 1.0;
+ gbc1.fill = GridBagConstraints.BOTH;
+ extraGeneralPanel.add(generalMonitoringComps.get(index), gbc1);
+ }
+ else
+ {
+ gbc1.weightx = 1.0;
+ gbc1.fill = GridBagConstraints.HORIZONTAL;
+ extraGeneralPanel.add(generalMonitoringComps.get(index), gbc1);
+ }
+ gbc1.insets.top = 10;
+ gbc1.gridy ++;
+ }
+ ChangeListener changeListener = new ChangeListener()
+ {
+ /**
+ * {@inheritDoc}
+ */
+ public void stateChanged(ChangeEvent e)
+ {
+ extraGeneralPanel.setVisible(extraExpander.isSelected());
+ }
+ };
+ extraExpander.addChangeListener(changeListener);
+
+ changeListener = new ChangeListener()
+ {
+ /**
+ * {@inheritDoc}
+ */
+ public void stateChanged(ChangeEvent e)
+ {
+ memoryPanel.setVisible(memoryExpander.isSelected());
+ }
+ };
+ memoryExpander.addChangeListener(changeListener);
+
+ gbc.gridx = 0;
+ gbc.gridy ++;
+ gbc.fill = GridBagConstraints.BOTH;
+ gbc.weightx = 1.0;
+ gbc.weighty = 1.0;
+ gbc.gridwidth = 2;
+ add(Box.createGlue(), gbc);
+
+ setBorder(PANEL_BORDER);
+ }
+
+ /**
+ * Updates the contents of the panel.
+ *
+ */
+ public void updateContents()
+ {
+ ServerDescriptor server = null;
+ if (getInfo() != null)
+ {
+ server = getInfo().getServerDescriptor();
+ }
+ CustomSearchResult csrSystem = null;
+ CustomSearchResult csrMemory = null;
+ if (server != null)
+ {
+ csrSystem = server.getSystemInformationMonitor();
+ csrMemory = server.getJvmMemoryUsageMonitor();
+ }
+ if (csrSystem != null)
+ {
+ for (int i=0 ; i<generalAttributes.size(); i++)
+ {
+ String value =
+ getMonitoringValue(generalAttributes.get(i), csrSystem);
+ JComponent l = generalMonitoringComps.get(i);
+ if (l instanceof JLabel)
+ {
+ ((JLabel)l).setText(value);
+ }
+ else if (l instanceof JTextComponent)
+ {
+ ((JTextComponent)l).setText(value);
+ }
+ else
+ {
+ throw new IllegalStateException("Unexpected component: "+l);
+ }
+ }
+ }
+ else
+ {
+ for (JComponent l : generalMonitoringComps)
+ {
+ if (l instanceof JLabel)
+ {
+ ((JLabel)l).setText(NO_VALUE_SET.toString());
+ }
+ else if (l instanceof JTextComponent)
+ {
+ ((JTextComponent)l).setText(NO_VALUE_SET.toString());
+ }
+ else
+ {
+ throw new IllegalStateException("Unexpected component: "+l);
+ }
+ }
+ }
+ if (csrMemory != null)
+ {
+ if (memoryAttributes.isEmpty())
+ {
+ Set<String> allNames = csrMemory.getAttributeNames();
+ SortedSet<String> sortedNames = new TreeSet<String>();
+ for (String attrName : allNames)
+ {
+ if (!attrName.equalsIgnoreCase(
+ ServerConstants.OBJECTCLASS_ATTRIBUTE_TYPE_NAME) &&
+ !attrName.equalsIgnoreCase(ServerConstants.ATTR_COMMON_NAME))
+ {
+ sortedNames.add(attrName);
+ }
+ }
+ memoryAttributes.addAll(sortedNames);
+
+ GridBagConstraints gbc = new GridBagConstraints();
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 1;
+
+ for (String attrName : memoryAttributes)
+ {
+ JLabel l = Utilities.createPrimaryLabel(
+ INFO_CTRL_PANEL_OPERATION_NAME_AS_LABEL.get(attrName));
+ gbc.insets.left = 0;
+ gbc.insets.right = 0;
+ gbc.gridx = 0;
+ gbc.weightx = 0.0;
+ gbc.fill = GridBagConstraints.NONE;
+ memoryPanel.add(l, gbc);
+ gbc.insets.left = 10;
+ gbc.gridx = 1;
+ gbc.weightx = 1.0;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ JLabel valueLabel = Utilities.createDefaultLabel();
+ memoryLabels.add(valueLabel);
+ memoryPanel.add(valueLabel, gbc);
+ gbc.gridy ++;
+ gbc.insets.top = 10;
+ }
+ }
+
+ for (int i=0; i<memoryAttributes.size() ; i++)
+ {
+ Object value = Utilities.getFirstMonitoringValue(
+ csrMemory,
+ memoryAttributes.get(i));
+ if (value != null)
+ {
+ memoryLabels.get(i).setText(value.toString());
+ }
+ else
+ {
+ memoryLabels.get(i).setText(NO_VALUE_SET.toString());
+ }
+ }
+ }
+ else
+ {
+ for (JLabel l : memoryLabels)
+ {
+ l.setText(NO_VALUE_SET.toString());
+ }
+ }
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/MainActionsPane.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/MainActionsPane.java
index 6fb8ed0..b9aba61 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/MainActionsPane.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/MainActionsPane.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2008 Sun Microsystems, Inc.
+ * Copyright 2008-2009 Sun Microsystems, Inc.
*/
package org.opends.guitools.controlpanel.ui;
@@ -205,19 +205,24 @@
INFO_CTRL_PANEL_ACTION_RESTORE.get()
},
{
- INFO_CTRL_PANEL_CATEGORY_SCHEMA.get(),
- INFO_CTRL_PANEL_ACTION_MANAGE_SCHEMA.get()
+ INFO_CTRL_PANEL_CATEGORY_SCHEMA.get(),
+ INFO_CTRL_PANEL_ACTION_MANAGE_SCHEMA.get()
},
{
- INFO_CTRL_PANEL_CATEGORY_INDEXES.get(),
- INFO_CTRL_PANEL_ACTION_MANAGE_INDEXES.get(),
- INFO_CTRL_PANEL_ACTION_VERIFY_INDEXES.get(),
- INFO_CTRL_PANEL_ACTION_REBUILD_INDEXES.get()
+ INFO_CTRL_PANEL_CATEGORY_INDEXES.get(),
+ INFO_CTRL_PANEL_ACTION_MANAGE_INDEXES.get(),
+ INFO_CTRL_PANEL_ACTION_VERIFY_INDEXES.get(),
+ INFO_CTRL_PANEL_ACTION_REBUILD_INDEXES.get()
},
{
- INFO_CTRL_PANEL_CATEGORY_RUNTIME_OPTIONS.get(),
- INFO_CTRL_PANEL_ACTION_JAVA_SETTINGS.get(),
- INFO_CTRL_PANEL_ACTION_WINDOWS_SERVICE.get()
+ INFO_CTRL_PANEL_CATEGORY_MONITORING.get(),
+ INFO_CTRL_PANEL_BROWSE_GENERAL_MONITORING.get(),
+ INFO_CTRL_PANEL_CONNECTION_HANDLER_MONITORING.get()
+ },
+ {
+ INFO_CTRL_PANEL_CATEGORY_RUNTIME_OPTIONS.get(),
+ INFO_CTRL_PANEL_ACTION_JAVA_SETTINGS.get(),
+ INFO_CTRL_PANEL_ACTION_WINDOWS_SERVICE.get()
}
};
}
@@ -234,18 +239,23 @@
INFO_CTRL_PANEL_ACTION_RESTORE.get()
},
{
- INFO_CTRL_PANEL_CATEGORY_SCHEMA.get(),
- INFO_CTRL_PANEL_ACTION_MANAGE_SCHEMA.get()
+ INFO_CTRL_PANEL_CATEGORY_SCHEMA.get(),
+ INFO_CTRL_PANEL_ACTION_MANAGE_SCHEMA.get()
},
{
- INFO_CTRL_PANEL_CATEGORY_INDEXES.get(),
- INFO_CTRL_PANEL_ACTION_MANAGE_INDEXES.get(),
- INFO_CTRL_PANEL_ACTION_VERIFY_INDEXES.get(),
- INFO_CTRL_PANEL_ACTION_REBUILD_INDEXES.get()
+ INFO_CTRL_PANEL_CATEGORY_INDEXES.get(),
+ INFO_CTRL_PANEL_ACTION_MANAGE_INDEXES.get(),
+ INFO_CTRL_PANEL_ACTION_VERIFY_INDEXES.get(),
+ INFO_CTRL_PANEL_ACTION_REBUILD_INDEXES.get()
},
{
- INFO_CTRL_PANEL_CATEGORY_RUNTIME_OPTIONS.get(),
- INFO_CTRL_PANEL_ACTION_JAVA_SETTINGS.get()
+ INFO_CTRL_PANEL_CATEGORY_MONITORING.get(),
+ INFO_CTRL_PANEL_BROWSE_GENERAL_MONITORING.get(),
+ INFO_CTRL_PANEL_CONNECTION_HANDLER_MONITORING.get()
+ },
+ {
+ INFO_CTRL_PANEL_CATEGORY_RUNTIME_OPTIONS.get(),
+ INFO_CTRL_PANEL_ACTION_JAVA_SETTINGS.get()
}
};
}
@@ -261,6 +271,8 @@
classes.add(BrowseIndexPanel.class);
classes.add(VerifyIndexPanel.class);
classes.add(RebuildIndexPanel.class);
+ classes.add(BrowseGeneralMonitoringPanel.class);
+ classes.add(ConnectionHandlerMonitoringPanel.class);
classes.add(JavaPropertiesPanel.class);
if (Utilities.isWindows())
{
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/MonitoringAttributesViewPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/MonitoringAttributesViewPanel.java
new file mode 100644
index 0000000..6b52caa
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/MonitoringAttributesViewPanel.java
@@ -0,0 +1,293 @@
+/*
+ * 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.GridBagConstraints;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+
+import javax.swing.Box;
+import javax.swing.JCheckBox;
+
+import org.opends.guitools.controlpanel.datamodel.MonitoringAttributes;
+import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
+import org.opends.guitools.controlpanel.util.Utilities;
+import org.opends.messages.Message;
+
+/**
+ *
+ * The panel that allows the user to select which attributes must be displayed
+ * in the traffic monitoring tables.
+ *
+ * @param <T> the type of the objects that this panel manages. For now it only
+ * manages String and MonitoringAttribute objects.
+ */
+public class MonitoringAttributesViewPanel<T> extends StatusGenericPanel
+{
+ private static final long serialVersionUID = 6462932163745559L;
+
+ private LinkedHashSet<T> selectedAttributes = new LinkedHashSet<T>();
+
+ private LinkedHashSet<T> monitoringAttributes;
+
+ private boolean isCancelled = true;
+
+ // Note: the order of the checkboxes and the elements in the Attributes
+ // enumeration will be the same.
+ private JCheckBox[] checkboxes = {};
+
+ /**
+ * Creates an instance of this panel that uses String as attributes.
+ * @param attributes the list of possible attributes.
+ * @return an instance of this panel that uses String as attributes.
+ */
+ public static MonitoringAttributesViewPanel<String>
+ createStringInstance(LinkedHashSet<String> attributes)
+ {
+ return new MonitoringAttributesViewPanel<String>(attributes);
+ }
+
+ /**
+ * Creates an instance of this panel that uses MonitoringAttributes as
+ * attributes.
+ * @param attributes the list of possible attributes.
+ * @return an instance of this panel that uses String as attributes.
+ */
+ public static MonitoringAttributesViewPanel<MonitoringAttributes>
+ createMonitoringAttributesInstance(
+ LinkedHashSet<MonitoringAttributes> attributes)
+ {
+ return new MonitoringAttributesViewPanel<MonitoringAttributes>(attributes);
+ }
+
+ /**
+ * Default constructor.
+ * @param attributes the attributes that will be proposed to the user.
+ *
+ */
+ protected MonitoringAttributesViewPanel(
+ LinkedHashSet<T> attributes)
+ {
+ super();
+ monitoringAttributes = new LinkedHashSet<T>();
+ monitoringAttributes.addAll(attributes);
+ createLayout();
+ }
+
+ /**
+ * Sets the attributes that must be selected in this dialog.
+ * @param selectedAttributes the selected attributes.
+ */
+ public void setSelectedAttributes(
+ Collection<T> selectedAttributes)
+ {
+ int i = 0;
+ for (T attribute : monitoringAttributes)
+ {
+ checkboxes[i].setSelected(selectedAttributes.contains(attribute));
+ i++;
+ }
+ }
+
+ /**
+ * Creates the layout of the panel (but the contents are not populated here).
+ */
+ private void createLayout()
+ {
+ GridBagConstraints gbc = new GridBagConstraints();
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ gbc.gridy = 0;
+ int nCols = monitoringAttributes.size() > 30 ? 3 : 2;
+
+ gbc.gridwidth = nCols;
+ gbc.gridx = 0;
+ add(Utilities.createPrimaryLabel(
+ INFO_CTRL_PANEL_OPERATION_VIEW_LABEL.get()), gbc);
+ gbc.gridy ++;
+ gbc.gridwidth = 1;
+ gbc.insets.top = 10;
+
+ checkboxes = new JCheckBox[monitoringAttributes.size()];
+
+ int i = 0;
+ Iterator<T> ops = monitoringAttributes.iterator();
+ while (ops.hasNext())
+ {
+ T operation = ops.next();
+ Message m = getMessage(operation);
+
+ JCheckBox cb = Utilities.createCheckBox(m);
+ gbc.gridx = 0;
+ gbc.weightx = 0.0;
+ gbc.insets.left = 0;
+ checkboxes[i] = cb;
+ add(checkboxes[i], gbc);
+ gbc.weightx = 1.0;
+ gbc.insets.left = 40;
+ while (gbc.gridx + 1 < nCols)
+ {
+ gbc.gridx ++;
+ if (i + 1 >= checkboxes.length)
+ {
+ add(Box.createHorizontalGlue(), gbc);
+ }
+ else
+ {
+ operation = ops.next();
+ m = getMessage(operation);
+ cb = Utilities.createCheckBox(m);
+ checkboxes[i+1] = cb;
+ add(checkboxes[i+1], gbc);
+ i ++;
+ checkboxes[i].setSelected(true);
+ }
+ }
+ gbc.gridy ++;
+ i++;
+ }
+ gbc.gridx = 0;
+ gbc.gridwidth = nCols;
+ gbc.weighty = 1.0;
+ gbc.fill = GridBagConstraints.VERTICAL;
+ add(Box.createVerticalGlue(), gbc);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Message getTitle()
+ {
+ return INFO_CTRL_PANEL_ATTRIBUTE_VIEW_OPTIONS_TITLE.get();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void configurationChanged(ConfigurationChangeEvent ev)
+ {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getPreferredFocusComponent()
+ {
+ return checkboxes[0];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void toBeDisplayed(boolean visible)
+ {
+ if (visible)
+ {
+ isCancelled = true;
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void okClicked()
+ {
+ // Check that at least one checkbox is selected.
+ selectedAttributes.clear();
+ int i = 0;
+ for (T operation : monitoringAttributes)
+ {
+ if (checkboxes[i].isSelected())
+ {
+ selectedAttributes.add(operation);
+ }
+ i++;
+ }
+ if (selectedAttributes.isEmpty())
+ {
+ ArrayList<Message> errors = new ArrayList<Message>();
+ errors.add(INFO_CTRL_PANEL_NO_OPERATION_SELECTED.get());
+ super.displayErrorDialog(errors);
+ }
+ else
+ {
+ isCancelled = false;
+ super.closeClicked();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public GenericDialog.ButtonType getButtonType()
+ {
+ return GenericDialog.ButtonType.OK_CANCEL;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if the user closed the dialog by cancelling it
+ * and <CODE>false</CODE> otherwise.
+ * @return <CODE>true</CODE> if the user closed the dialog by cancelling it
+ * and <CODE>false</CODE> otherwise.
+ */
+ public boolean isCancelled()
+ {
+ return isCancelled;
+ }
+
+ /**
+ * Returns the list of attributes that the user selected.
+ * @return the list of attributes that the user selected.
+ */
+ public LinkedHashSet<T> getAttributes()
+ {
+ return selectedAttributes;
+ }
+
+ /**
+ * Returns the message for the provided operation.
+ * @param operation the operation.
+ * @return the message for the provided operation.
+ */
+ protected Message getMessage(T operation)
+ {
+ Message m;
+ if (operation instanceof MonitoringAttributes)
+ {
+ m = ((MonitoringAttributes)operation).getMessage();
+ }
+ else
+ {
+ m = Message.raw(operation.toString());
+ }
+ return m;
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/RootMonitoringPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/RootMonitoringPanel.java
new file mode 100644
index 0000000..a16fc0f
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/RootMonitoringPanel.java
@@ -0,0 +1,211 @@
+/*
+ * 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 static org.opends.messages.BackendMessages.INFO_MONITOR_UPTIME;
+
+import java.awt.Component;
+import java.awt.GridBagConstraints;
+import java.util.Date;
+
+import javax.swing.Box;
+import javax.swing.JLabel;
+
+import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
+import org.opends.guitools.controlpanel.datamodel.BasicMonitoringAttributes;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
+import org.opends.guitools.controlpanel.util.ConfigFromDirContext;
+import org.opends.guitools.controlpanel.util.Utilities;
+import org.opends.messages.Message;
+
+/**
+ * The panel displaying the root monitor panel.
+ */
+public class RootMonitoringPanel extends GeneralMonitoringPanel
+{
+ private static final long serialVersionUID = 9031734563746269830L;
+
+ private JLabel openConnections = Utilities.createDefaultLabel();
+ private JLabel maxConnections = Utilities.createDefaultLabel();
+ private JLabel totalConnections = Utilities.createDefaultLabel();
+ private JLabel startTime = Utilities.createDefaultLabel();
+ private JLabel upTime = Utilities.createDefaultLabel();
+ private JLabel version = Utilities.createDefaultLabel();
+
+ /**
+ * Default constructor.
+ */
+ public RootMonitoringPanel()
+ {
+ super();
+ createLayout();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getPreferredFocusComponent()
+ {
+ return openConnections;
+ }
+
+ /**
+ * Creates the layout of the panel (but the contents are not populated here).
+ */
+ private void createLayout()
+ {
+ GridBagConstraints gbc = new GridBagConstraints();
+ gbc.gridy ++;
+ JLabel lTitle = Utilities.createTitleLabel(
+ INFO_CTRL_PANEL_GENERAL_MONITORING_ROOT.get());
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 2;
+ gbc.gridy = 0;
+ gbc.insets.top = 5;
+ gbc.insets.bottom = 7;
+ add(lTitle, gbc);
+
+ gbc.insets.bottom = 0;
+ gbc.insets.top = 10;
+ Message[] labels = {
+ INFO_CTRL_PANEL_OPEN_CONNECTIONS_LABEL.get(),
+ INFO_CTRL_PANEL_MAX_CONNECTIONS_LABEL.get(),
+ INFO_CTRL_PANEL_TOTAL_CONNECTIONS_LABEL.get(),
+ INFO_CTRL_PANEL_START_TIME_LABEL.get(),
+ INFO_CTRL_PANEL_UP_TIME_LABEL.get(),
+ INFO_CTRL_PANEL_OPENDS_VERSION_LABEL.get()
+ };
+ JLabel[] values = {
+ openConnections,
+ maxConnections,
+ totalConnections,
+ startTime,
+ upTime,
+ version
+ };
+ gbc.gridy ++;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 1;
+ for (int i=0; i < labels.length; i++)
+ {
+ gbc.insets.left = 0;
+ gbc.gridx = 0;
+ JLabel l = Utilities.createPrimaryLabel(labels[i]);
+ add(l, gbc);
+ gbc.insets.left = 10;
+ gbc.gridx = 1;
+ add(values[i], gbc);
+ gbc.gridy ++;
+ }
+
+ gbc.gridwidth = 2;
+ gbc.gridx = 0;
+ gbc.gridy ++;
+ gbc.fill = GridBagConstraints.BOTH;
+ gbc.weightx = 1.0;
+ gbc.weighty = 1.0;
+ add(Box.createGlue(), gbc);
+
+ setBorder(PANEL_BORDER);
+ }
+
+ /**
+ * Updates the contents of the panel.
+ *
+ */
+ public void updateContents()
+ {
+ ServerDescriptor server = null;
+ if (getInfo() != null)
+ {
+ server = getInfo().getServerDescriptor();
+ }
+ CustomSearchResult csr = null;
+ if (server != null)
+ {
+ csr = server.getRootMonitor();
+ }
+ if (csr != null)
+ {
+ JLabel[] ls =
+ {
+ openConnections,
+ maxConnections,
+ totalConnections,
+ startTime
+ };
+ BasicMonitoringAttributes[] attrs =
+ {
+ BasicMonitoringAttributes.CURRENT_CONNECTIONS,
+ BasicMonitoringAttributes.MAX_CONNECTIONS,
+ BasicMonitoringAttributes.TOTAL_CONNECTIONS,
+ BasicMonitoringAttributes.START_DATE
+ };
+ for (int i=0; i<ls.length; i++)
+ {
+ ls[i].setText(getMonitoringValue(attrs[i], csr));
+ }
+ version.setText(server.getOpenDSVersion());
+ try
+ {
+ String start = (String)getFirstMonitoringValue(csr,
+ BasicMonitoringAttributes.START_DATE.getAttributeName());
+ String current = (String)getFirstMonitoringValue(csr,
+ BasicMonitoringAttributes.CURRENT_DATE.getAttributeName());
+ Date startTime = ConfigFromDirContext.utcParser.parse(start);
+ Date currentTime = ConfigFromDirContext.utcParser.parse(current);
+
+ long upSeconds = (currentTime.getTime() - startTime.getTime()) / 1000;
+ long upDays = (upSeconds / 86400);
+ upSeconds %= 86400;
+ long upHours = (upSeconds / 3600);
+ upSeconds %= 3600;
+ long upMinutes = (upSeconds / 60);
+ upSeconds %= 60;
+ Message upTimeStr =
+ INFO_MONITOR_UPTIME.get(upDays, upHours, upMinutes, upSeconds);
+
+ upTime.setText(upTimeStr.toString());
+ }
+ catch (Throwable t)
+ {
+ upTime.setText(NO_VALUE_SET.toString());
+ }
+ }
+ else
+ {
+ openConnections.setText(NO_VALUE_SET.toString());
+ maxConnections.setText(NO_VALUE_SET.toString());
+ totalConnections.setText(NO_VALUE_SET.toString());
+ startTime.setText(NO_VALUE_SET.toString());
+ upTime.setText(NO_VALUE_SET.toString());
+ version.setText(NO_VALUE_SET.toString());
+ }
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
index 45ec434..e46029d 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
@@ -47,6 +47,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
+import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -74,6 +75,8 @@
import org.opends.guitools.controlpanel.datamodel.BaseDNDescriptor;
import org.opends.guitools.controlpanel.datamodel.CategorizedComboBoxElement;
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.event.*;
import org.opends.guitools.controlpanel.task.RebuildIndexTask;
@@ -2035,4 +2038,62 @@
{
return ColorAndFontConstants.textAreaBorder;
}
+
+ /**
+ * Returns the monitoring value in a String form to be displayed to the user.
+ * @param attr the attribute to analyze.
+ * @param monitoringEntry the monitoring entry.
+ * @return the monitoring value in a String form to be displayed to the user.
+ */
+ public static String getMonitoringValue(MonitoringAttributes attr,
+ CustomSearchResult monitoringEntry)
+ {
+ return Utilities.getMonitoringValue(attr, monitoringEntry);
+ }
+
+ /**
+ * Updates the monitoring information writing it to a list of labels.
+ * @param monitoringAttrs the monitoring operations whose information we want
+ * to update.
+ * @param monitoringLabels the monitoring labels to be updated.
+ * @param monitoringEntry the monitoring entry containing the information to
+ * be displayed.
+ */
+ protected void updateMonitoringInfo(
+ List<MonitoringAttributes> monitoringAttrs,
+ List<JLabel> monitoringLabels, CustomSearchResult monitoringEntry)
+ {
+ for (int i=0 ; i<monitoringAttrs.size(); i++)
+ {
+ String value =
+ getMonitoringValue(monitoringAttrs.get(i), monitoringEntry);
+ JLabel l = monitoringLabels.get(i);
+ l.setText(value);
+ }
+ }
+
+ /**
+ * Returns the first value for a given attribute in the provided entry.
+ * @param sr the entry. It may be <CODE>null</CODE>.
+ * @param attrName the attribute name.
+ * @return the first value for a given attribute in the provided entry.
+ */
+ protected Object getFirstMonitoringValue(CustomSearchResult sr,
+ String attrName)
+ {
+ return Utilities.getFirstMonitoringValue(sr, attrName);
+ }
+
+ /**
+ * Returns the label to be used in panels (with ':') based on the definition
+ * of the monitoring attribute.
+ * @param attr the monitoring attribute.
+ * @return the label to be used in panels (with ':') based on the definition
+ * of the monitoring attribute.
+ */
+ protected static Message getLabel(MonitoringAttributes attr)
+ {
+ return INFO_CTRL_PANEL_OPERATION_NAME_AS_LABEL.get(
+ attr.getMessage().toString());
+ }
}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/SystemInformationMonitoringPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/SystemInformationMonitoringPanel.java
new file mode 100644
index 0000000..5f3e6b1
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/SystemInformationMonitoringPanel.java
@@ -0,0 +1,163 @@
+/*
+ * 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.GridBagConstraints;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.Box;
+import javax.swing.JLabel;
+
+import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
+import org.opends.guitools.controlpanel.datamodel.BasicMonitoringAttributes;
+import org.opends.guitools.controlpanel.datamodel.MonitoringAttributes;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
+import org.opends.guitools.controlpanel.util.Utilities;
+
+/**
+ * The panel displaying the system information monitoring panel.
+ */
+public class SystemInformationMonitoringPanel extends GeneralMonitoringPanel
+{
+ private static final long serialVersionUID = 9031734563298069830L;
+ static List<MonitoringAttributes> operations =
+ new ArrayList<MonitoringAttributes>();
+ {
+ operations.add(BasicMonitoringAttributes.SYSTEM_NAME);
+ operations.add(BasicMonitoringAttributes.OPERATING_SYSTEM);
+ operations.add(BasicMonitoringAttributes.AVAILABLE_CPUS);
+ operations.add(BasicMonitoringAttributes.USED_MEMORY);
+ operations.add(BasicMonitoringAttributes.FREE_USED_MEMORY);
+ operations.add(BasicMonitoringAttributes.MAX_MEMORY);
+ }
+ private ArrayList<JLabel> monitoringLabels =
+ new ArrayList<JLabel>();
+ {
+ for (int i=0; i<operations.size(); i++)
+ {
+ monitoringLabels.add(Utilities.createDefaultLabel());
+ }
+ }
+
+ /**
+ * Default constructor.
+ */
+ public SystemInformationMonitoringPanel()
+ {
+ super();
+ createLayout();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getPreferredFocusComponent()
+ {
+ return monitoringLabels.get(0);
+ }
+
+ /**
+ * Creates the layout of the panel (but the contents are not populated here).
+ */
+ private void createLayout()
+ {
+ GridBagConstraints gbc = new GridBagConstraints();
+ JLabel lTitle = Utilities.createTitleLabel(
+ INFO_CTRL_PANEL_SYSTEM_INFORMATION.get());
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 2;
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.insets.top = 5;
+ gbc.insets.bottom = 7;
+ add(lTitle, gbc);
+
+ gbc.insets.bottom = 0;
+ gbc.insets.top = 10;
+ gbc.gridy ++;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 1;
+ for (int i=0; i<operations.size(); i++)
+ {
+ JLabel l = Utilities.createPrimaryLabel(getLabel(operations.get(i)));
+ gbc.gridy ++;
+ gbc.insets.left = 0;
+ gbc.gridx = 0;
+ gbc.weightx = 0.0;
+ gbc.gridwidth = 1;
+ add(l, gbc);
+ gbc.insets.left = 10;
+ gbc.gridx = 1;
+ gbc.gridwidth = 2;
+ add(monitoringLabels.get(i), gbc);
+ }
+
+ gbc.gridx = 0;
+ gbc.gridy ++;
+ gbc.fill = GridBagConstraints.BOTH;
+ gbc.weightx = 1.0;
+ gbc.weighty = 1.0;
+ gbc.gridwidth = 3;
+ add(Box.createGlue(), gbc);
+
+ setBorder(PANEL_BORDER);
+ }
+
+ /**
+ * Updates the contents of the panel.
+ *
+ */
+ public void updateContents()
+ {
+ ServerDescriptor server = null;
+ if (getInfo() != null)
+ {
+ server = getInfo().getServerDescriptor();
+ }
+ CustomSearchResult csr = null;
+ if (server != null)
+ {
+ csr = server.getSystemInformationMonitor();
+ }
+ if (csr != null)
+ {
+ updateMonitoringInfo(operations, monitoringLabels, csr);
+ }
+ else
+ {
+ for (JLabel l : monitoringLabels)
+ {
+ l.setText(NO_VALUE_SET.toString());
+ }
+ }
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/WorkQueueMonitoringPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/WorkQueueMonitoringPanel.java
new file mode 100644
index 0000000..552c541
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/WorkQueueMonitoringPanel.java
@@ -0,0 +1,162 @@
+/*
+ * 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.GridBagConstraints;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.Box;
+import javax.swing.JLabel;
+
+import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
+import org.opends.guitools.controlpanel.datamodel.BasicMonitoringAttributes;
+import org.opends.guitools.controlpanel.datamodel.MonitoringAttributes;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
+import org.opends.guitools.controlpanel.util.Utilities;
+
+/**
+ * The panel displaying the work queue monitor panel.
+ */
+public class WorkQueueMonitoringPanel extends GeneralMonitoringPanel
+{
+ private static final long serialVersionUID = 9031734563700069830L;
+ static List<MonitoringAttributes> attributes =
+ new ArrayList<MonitoringAttributes>();
+ {
+ attributes.add(BasicMonitoringAttributes.AVERAGE_REQUEST_BACKLOG);
+ attributes.add(BasicMonitoringAttributes.MAX_REQUEST_BACKLOG);
+ attributes.add(BasicMonitoringAttributes.CURRENT_REQUEST_BACKLOG);
+ attributes.add(BasicMonitoringAttributes.REQUESTS_SUBMITTED);
+ attributes.add(BasicMonitoringAttributes.REQUESTS_REJECTED);
+ }
+ private ArrayList<JLabel> monitoringLabels =
+ new ArrayList<JLabel>();
+ {
+ for (int i=0; i<attributes.size(); i++)
+ {
+ monitoringLabels.add(Utilities.createDefaultLabel());
+ }
+ }
+
+ /**
+ * Default constructor.
+ */
+ public WorkQueueMonitoringPanel()
+ {
+ super();
+ createLayout();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getPreferredFocusComponent()
+ {
+ return monitoringLabels.get(0);
+ }
+
+ /**
+ * Creates the layout of the panel (but the contents are not populated here).
+ */
+ private void createLayout()
+ {
+ GridBagConstraints gbc = new GridBagConstraints();
+ JLabel lTitle = Utilities.createTitleLabel(
+ INFO_CTRL_PANEL_WORK_QUEUE.get());
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 2;
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.insets.top = 5;
+ gbc.insets.bottom = 7;
+ add(lTitle, gbc);
+
+ gbc.insets.bottom = 0;
+ gbc.insets.top = 10;
+ gbc.gridy ++;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.gridwidth = 1;
+ for (int i=0; i<attributes.size(); i++)
+ {
+ JLabel l = Utilities.createPrimaryLabel(getLabel(attributes.get(i)));
+ gbc.gridy ++;
+ gbc.insets.left = 0;
+ gbc.gridx = 0;
+ gbc.weightx = 0.0;
+ gbc.gridwidth = 1;
+ add(l, gbc);
+ gbc.insets.left = 10;
+ gbc.gridx = 1;
+ gbc.gridwidth = 2;
+ add(monitoringLabels.get(i), gbc);
+ }
+
+ gbc.gridx = 0;
+ gbc.gridy ++;
+ gbc.fill = GridBagConstraints.BOTH;
+ gbc.weightx = 1.0;
+ gbc.weighty = 1.0;
+ gbc.gridwidth = 3;
+ add(Box.createGlue(), gbc);
+
+ setBorder(PANEL_BORDER);
+ }
+
+ /**
+ * Updates the contents of the panel.
+ *
+ */
+ public void updateContents()
+ {
+ ServerDescriptor server = null;
+ if (getInfo() != null)
+ {
+ server = getInfo().getServerDescriptor();
+ }
+ CustomSearchResult csr = null;
+ if (server != null)
+ {
+ csr = server.getWorkQueueMonitor();
+ }
+ if (csr != null)
+ {
+ updateMonitoringInfo(attributes, monitoringLabels, csr);
+ }
+ else
+ {
+ for (JLabel l : monitoringLabels)
+ {
+ l.setText(NO_VALUE_SET.toString());
+ }
+ }
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/nodes/GeneralMonitoringTreeNode.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/nodes/GeneralMonitoringTreeNode.java
new file mode 100644
index 0000000..67c8efd
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/nodes/GeneralMonitoringTreeNode.java
@@ -0,0 +1,92 @@
+/*
+ * 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.nodes;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+
+/**
+ * Abstract class with some common methods for all the nodes in the
+ * 'General Information' tree.
+ *
+ */
+public class GeneralMonitoringTreeNode extends DefaultMutableTreeNode
+{
+ private static final long serialVersionUID = 7896765876669863639L;
+ private String displayName;
+ private Object identifier;
+ private boolean isRoot;
+
+ /**
+ * Constructor of the node.
+ * @param displayName the name of the node.
+ * @param identifier the identifier that is unique among all the nodes.
+ * @param isRoot whether the node is the root or not.
+ */
+ public GeneralMonitoringTreeNode(String displayName,
+ Object identifier,
+ boolean isRoot)
+ {
+ super(displayName);
+ this.displayName = displayName;
+ this.identifier = identifier;
+ this.isRoot = isRoot;
+ }
+
+ /**
+ * Returns the name of the node.
+ * @return the name of the node.
+ */
+ public String getDisplayName()
+ {
+ return displayName;
+ }
+
+ /**
+ * Returns the identifier that is unique among all the nodes.
+ * @return the identifier that is unique among all the nodes.
+ */
+ public Object getIdentifier()
+ {
+ return identifier;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isRoot()
+ {
+ return isRoot;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isLeaf()
+ {
+ return getChildCount() == 0;
+ }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java
index 3906779..6bc4545 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java
@@ -30,12 +30,17 @@
import static org.opends.messages.AdminToolMessages.*;
import java.net.InetAddress;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
+import java.util.TimeZone;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -64,6 +69,7 @@
import org.opends.server.admin.std.meta.LocalDBIndexCfgDefn.IndexType;
import org.opends.server.types.DN;
import org.opends.server.types.OpenDsException;
+import org.opends.server.util.ServerConstants;
/**
* A class that reads the configuration and monitoring information using a
@@ -77,6 +83,109 @@
private static final Logger LOG =
Logger.getLogger(ConfigFromDirContext.class.getName());
+ private CustomSearchResult rootMonitor;
+ private CustomSearchResult jvmMemoryUsage;
+ private CustomSearchResult systemInformation;
+ private CustomSearchResult entryCaches;
+ private CustomSearchResult workQueue;
+
+ private Map<String, CustomSearchResult> hmConnectionHandlersMonitor =
+ new HashMap<String, CustomSearchResult>();
+
+ /**
+ * The monitor root entry DN.
+ */
+ protected DN monitorDN = DN.nullDN();
+ /**
+ * The JVM memory usage monitoring entry DN.
+ */
+ protected DN jvmMemoryUsageDN = DN.nullDN();
+ /**
+ * The system information monitoring entry DN.
+ */
+ protected DN systemInformationDN = DN.nullDN();
+ /**
+ * The entry cache monitoring entry DN.
+ */
+ protected DN entryCachesDN = DN.nullDN();
+ /**
+ * The work queue monitoring entry DN.
+ */
+ protected DN workQueueDN = DN.nullDN();
+
+ {
+ try
+ {
+ monitorDN = DN.decode("cn=monitor");
+ jvmMemoryUsageDN = DN.decode("cn=JVM Memory Usage,cn=monitor");
+ systemInformationDN = DN.decode("cn=System Information,cn=monitor");
+ entryCachesDN = DN.decode("cn=Entry Caches,cn=monitor");
+ workQueueDN = DN.decode("cn=Work Queue,cn=monitor");
+ }
+ catch (Throwable t)
+ {
+ throw new IllegalStateException("Could not decode DNs: "+t, t);
+ }
+ }
+
+ /**
+ * The date formatter to be used to parse GMT dates.
+ */
+ public static final SimpleDateFormat utcParser = new SimpleDateFormat(
+ ServerConstants.DATE_FORMAT_GMT_TIME);
+ {
+ utcParser.setTimeZone(TimeZone.getTimeZone("UTC"));
+ }
+ /**
+ * The date formatter to be used to format dates.
+ */
+ public static final DateFormat formatter = DateFormat.getDateTimeInstance();
+
+ /**
+ * Returns the monitoring entry for the entry caches.
+ * @return the monitoring entry for the entry caches.
+ */
+ public CustomSearchResult getEntryCaches()
+ {
+ return entryCaches;
+ }
+
+ /**
+ * Returns the monitoring entry for the JVM memory usage.
+ * @return the monitoring entry for the JVM memory usage.
+ */
+ public CustomSearchResult getJvmMemoryUsage()
+ {
+ return jvmMemoryUsage;
+ }
+
+ /**
+ * Returns the root entry of the monitoring tree.
+ * @return the root entry of the monitoring tree.
+ */
+ public CustomSearchResult getRootMonitor()
+ {
+ return rootMonitor;
+ }
+
+ /**
+ * Returns the monitoring entry for the system information.
+ * @return the monitoring entry for the system information.
+ */
+ public CustomSearchResult getSystemInformation()
+ {
+ return systemInformation;
+ }
+
+ /**
+ * Returns the monitoring entry for the work queue.
+ * @return the monitoring entry for the work queue.
+ */
+ public CustomSearchResult getWorkQueue()
+ {
+ return workQueue;
+ }
+
/**
* Reads configuration and monitoring information using the provided
* connection.
@@ -90,6 +199,14 @@
Set<BackendDescriptor> bs = new HashSet<BackendDescriptor>();
Set<DN> as = new HashSet<DN>();
+ rootMonitor = null;
+ jvmMemoryUsage = null;
+ systemInformation = null;
+ entryCaches = null;
+ workQueue = null;
+
+ hmConnectionHandlersMonitor.clear();
+
try
{
// Get the Directory Server configuration handler and use it.
@@ -274,13 +391,15 @@
isReplicationSecure ?
ConnectionHandlerDescriptor.Protocol.REPLICATION_SECURE :
ConnectionHandlerDescriptor.Protocol.REPLICATION;
+ Set<CustomSearchResult> emptySet = Collections.emptySet();
ConnectionHandlerDescriptor connHandler =
new ConnectionHandlerDescriptor(
new HashSet<InetAddress>(),
replicationPort,
protocol,
ConnectionHandlerDescriptor.State.ENABLED,
- "Multimaster Synchronization");
+ "Multimaster Synchronization",
+ emptySet);
ls.add(connHandler);
}
}
@@ -364,8 +483,15 @@
ERR_READING_CONFIG_LDAP.get(t.toString()), t);
ex.add(oupe);
}
+ for (ConnectionHandlerDescriptor ch : getConnectionHandlers())
+ {
+ ch.setMonitoringEntries(getMonitoringEntries(ch));
+ }
+ if (adminConnector != null)
+ {
+ adminConnector.setMonitoringEntries(getMonitoringEntries(adminConnector));
+ }
exceptions = Collections.unmodifiableList(ex);
-
}
/**
@@ -375,9 +501,7 @@
protected String[] getMonitoringAttributes()
{
return new String[] {
- "approx-older-change-not-synchronized-millis", "missing-changes",
- "base-dn", "server-id", "javaVersion", "currentConnections",
- "ds-backend-id", "ds-backend-entry-count", "ds-base-dn-entry-count"
+ "*"
};
}
@@ -442,6 +566,7 @@
}
else
{
+ CustomSearchResult csr = new CustomSearchResult(sr, searchBaseDN);
String backendID = ConnectionUtils.getFirstValue(sr,
"ds-backend-id");
String entryCount = ConnectionUtils.getFirstValue(sr,
@@ -503,12 +628,49 @@
{
if (backend.getBackendID().equalsIgnoreCase(monitorBackendID))
{
- CustomSearchResult csr = new CustomSearchResult(sr, searchBaseDN);
backend.setMonitoringEntry(csr);
}
}
}
}
+ try
+ {
+ if ((rootMonitor == null) && isRootMonitor(csr))
+ {
+ rootMonitor = csr;
+ }
+ else if ((entryCaches == null) && isEntryCaches(csr))
+ {
+ entryCaches = csr;
+ }
+ else if ((workQueue == null) && isWorkQueue(csr))
+ {
+ workQueue = csr;
+ }
+ else if ((jvmMemoryUsage == null) && isJvmMemoryUsage(csr))
+ {
+ jvmMemoryUsage = csr;
+ }
+ else if ((systemInformation == null) && isSystemInformation(csr))
+ {
+ systemInformation = csr;
+ }
+ else if (isConnectionHandler(csr))
+ {
+ String statistics = " Statistics";
+ String cn = ConnectionUtils.getFirstValue(sr, "cn");
+ if (cn.endsWith(statistics))
+ {
+// Assume it is a connection handler
+ String name = cn.substring(0, cn.length() - statistics.length());
+ hmConnectionHandlersMonitor.put(getKey(name), csr);
+ }
+ }
+ }
+ catch (OpenDsException ode)
+ {
+ exceptions.add(ode);
+ }
}
}
@@ -614,8 +776,9 @@
protocol = ConnectionHandlerDescriptor.Protocol.OTHER;
port = -1;
}
+ Set<CustomSearchResult> emptySet = Collections.emptySet();
return new ConnectionHandlerDescriptor(addresses, port, protocol, state,
- name);
+ name, emptySet);
}
private ConnectionHandlerDescriptor getConnectionHandler(
@@ -638,7 +801,86 @@
}
int port = adminConnector.getListenPort();
+ Set<CustomSearchResult> emptySet = Collections.emptySet();
return new ConnectionHandlerDescriptor(addresses, port, protocol, state,
- INFO_CTRL_PANEL_CONN_HANDLER_ADMINISTRATION.get().toString());
+ INFO_CTRL_PANEL_CONN_HANDLER_ADMINISTRATION.get().toString(), emptySet);
+ }
+
+ private boolean isRootMonitor(CustomSearchResult csr)
+ throws OpenDsException
+ {
+ return monitorDN.equals(DN.decode(csr.getDN()));
+ }
+
+ private boolean isSystemInformation(CustomSearchResult csr)
+ throws OpenDsException
+ {
+ return systemInformationDN.equals(DN.decode(csr.getDN()));
+ }
+
+ private boolean isJvmMemoryUsage(CustomSearchResult csr)
+ throws OpenDsException
+ {
+ return jvmMemoryUsageDN.equals(DN.decode(csr.getDN()));
+ }
+
+ private boolean isWorkQueue(CustomSearchResult csr)
+ throws OpenDsException
+ {
+ return workQueueDN.equals(DN.decode(csr.getDN()));
+ }
+
+ private boolean isEntryCaches(CustomSearchResult csr)
+ throws OpenDsException
+ {
+ return entryCachesDN.equals(DN.decode(csr.getDN()));
+ }
+
+ private boolean isConnectionHandler(CustomSearchResult csr)
+ throws OpenDsException
+ {
+ boolean isConnectionHandler = false;
+ DN dn = DN.decode(csr.getDN());
+ DN parent = dn.getParent();
+ if ((parent != null) && parent.equals(monitorDN))
+ {
+ Set vs = csr.getAttributeValues("cn");
+ if ((vs != null) && !vs.isEmpty())
+ {
+ String cn = (String)vs.iterator().next();
+ String statistics = " Statistics";
+ if (cn.endsWith(statistics))
+ {
+ isConnectionHandler = true;
+ }
+ }
+ }
+ return isConnectionHandler;
+ }
+
+ /**
+ * Commodity method to get the string representation to be used in the
+ * hash maps as key.
+ * @param value the value to be transformed into a key for a hash map.
+ * @return the string representation to be used in the hash maps as key.
+ */
+ private String getKey(String value)
+ {
+ return value.toLowerCase();
+ }
+
+ private Set<CustomSearchResult>getMonitoringEntries(
+ ConnectionHandlerDescriptor ch)
+ {
+ Set<CustomSearchResult> monitorEntries = new HashSet<CustomSearchResult>();
+ for (String key : hmConnectionHandlersMonitor.keySet())
+ {
+ if (key.indexOf(getKey(ch.getName())) != -1)
+ {
+ monitorEntries.add(hmConnectionHandlersMonitor.get(key));
+ }
+ }
+
+ return monitorEntries;
}
}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java
index b353c52..1f4813d 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java
@@ -44,6 +44,7 @@
import org.opends.guitools.controlpanel.datamodel.BackendDescriptor;
import org.opends.guitools.controlpanel.datamodel.BaseDNDescriptor;
import org.opends.guitools.controlpanel.datamodel.ConnectionHandlerDescriptor;
+import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
import org.opends.guitools.controlpanel.datamodel.IndexDescriptor;
import org.opends.guitools.controlpanel.datamodel.VLVIndexDescriptor;
import org.opends.guitools.controlpanel.datamodel.VLVSortOrder;
@@ -284,13 +285,15 @@
isReplicationSecure ?
ConnectionHandlerDescriptor.Protocol.REPLICATION_SECURE :
ConnectionHandlerDescriptor.Protocol.REPLICATION;
+ Set<CustomSearchResult> emptySet = Collections.emptySet();
ConnectionHandlerDescriptor connHandler =
new ConnectionHandlerDescriptor(
new HashSet<InetAddress>(),
replicationPort,
protocol,
ConnectionHandlerDescriptor.State.ENABLED,
- "Multimaster Synchronization");
+ "Multimaster Synchronization",
+ emptySet);
ls.add(connHandler);
}
}
@@ -447,8 +450,9 @@
protocol = ConnectionHandlerDescriptor.Protocol.OTHER;
port = -1;
}
+ Set<CustomSearchResult> emptySet = Collections.emptySet();
return new ConnectionHandlerDescriptor(addresses, port, protocol, state,
- name);
+ name, emptySet);
}
private ConnectionHandlerDescriptor getConnectionHandler(
@@ -470,8 +474,9 @@
addresses.addAll(v);
}
int port = adminConnector.getListenPort();
-
+ Set<CustomSearchResult> emptySet = Collections.emptySet();
return new ConnectionHandlerDescriptor(addresses, port, protocol, state,
- INFO_CTRL_PANEL_CONN_HANDLER_ADMINISTRATION.get().toString());
+ INFO_CTRL_PANEL_CONN_HANDLER_ADMINISTRATION.get().toString(),
+ emptySet);
}
}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
index 81fdc94..94b7a2a 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
@@ -47,6 +47,8 @@
import java.text.StringCharacterIterator;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Date;
+import java.util.Set;
import javax.naming.CompositeName;
import javax.naming.InvalidNameException;
@@ -89,6 +91,8 @@
import org.opends.guitools.controlpanel.browser.IconPool;
import org.opends.guitools.controlpanel.datamodel.ConfigReadException;
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.SortableTableModel;
import org.opends.guitools.controlpanel.datamodel.VLVIndexDescriptor;
import org.opends.guitools.controlpanel.event.TextComponentFocusListener;
@@ -130,6 +134,12 @@
private static ImageIcon requiredIcon;
+
+ private static Message NO_VALUE_SET =
+ INFO_CTRL_PANEL_NO_MONITORING_VALUE.get();
+ private static Message NOT_IMPLEMENTED =
+ INFO_CTRL_PANEL_NOT_IMPLEMENTED.get();
+
/**
* Returns <CODE>true</CODE> if we are running Mac OS and <CODE>false</CODE>
* otherwise.
@@ -2182,4 +2192,149 @@
}
}
}
+
+
+
+ /**
+ * Returns the first value for a given attribute in the provided entry.
+ * @param sr the entry. It may be <CODE>null</CODE>.
+ * @param attrName the attribute name.
+ * @return the first value for a given attribute in the provided entry.
+ */
+ public static Object getFirstMonitoringValue(CustomSearchResult sr,
+ String attrName)
+ {
+ Object o = null;
+ if (sr != null)
+ {
+ Set<Object> values = sr.getAttributeValues(attrName);
+ if ((values != null) && (values.size() > 0))
+ {
+ o = values.iterator().next();
+ try
+ {
+ Long l = Long.parseLong(o.toString());
+ o = l;
+ }
+ catch (Throwable t1)
+ {
+ try
+ {
+ Double d = Double.parseDouble(o.toString());
+ o = d;
+ }
+ catch (Throwable t2)
+ {
+ }
+ }
+ }
+ }
+ return o;
+ }
+
+ /**
+ * Returns the monitoring value in a String form to be displayed to the user.
+ * @param attr the attribute to analyze.
+ * @param monitoringEntry the monitoring entry.
+ * @return the monitoring value in a String form to be displayed to the user.
+ */
+ public static String getMonitoringValue(MonitoringAttributes attr,
+ CustomSearchResult monitoringEntry)
+ {
+ String returnValue;
+ Object monitoringValue =
+ Utilities.getFirstMonitoringValue(monitoringEntry,
+ attr.getAttributeName());
+ if (monitoringValue == null)
+ {
+ returnValue = NO_VALUE_SET.toString();
+ }
+ else if (isNotImplemented(attr, monitoringEntry))
+ {
+ returnValue = NOT_IMPLEMENTED.toString();
+ }
+ else if (attr.isNumericDate())
+ {
+ if("0".equals(monitoringValue.toString()))
+ {
+ returnValue = NO_VALUE_SET.toString();
+ }
+ else
+ {
+ Long l = Long.parseLong(monitoringValue.toString());
+ Date date = new Date(l);
+ returnValue = ConfigFromDirContext.formatter.format(date);
+ }
+ }
+ else if (attr.isTime())
+ {
+ if("-1".equals(monitoringValue.toString()))
+ {
+ returnValue = NO_VALUE_SET.toString();
+ }
+ else
+ {
+ returnValue = monitoringValue.toString();
+ }
+ }
+ else if (attr.isGMTDate())
+ {
+ try
+ {
+ Date date = ConfigFromDirContext.utcParser.parse(
+ monitoringValue.toString());
+ returnValue = ConfigFromDirContext.formatter.format(date);
+ }
+ catch (Throwable t)
+ {
+ returnValue = monitoringValue.toString();
+ }
+ }
+ else if (attr.isValueInBytes())
+ {
+ Long l = Long.parseLong(monitoringValue.toString());
+ long mb = l / (1024 * 1024);
+ long kbs = (l - (mb * 1024 * 1024)) / 1024;
+ returnValue = INFO_CTRL_PANEL_MEMORY_VALUE.get(mb , kbs).toString();
+ }
+ else
+ {
+ returnValue = monitoringValue.toString();
+ }
+ return returnValue;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if the provided monitoring value represents the
+ * non implemented label and <CODE>false</CODE> otherwise.
+ * @param attr the attribute to analyze.
+ * @param monitoringEntry the monitoring entry.
+ * @return <CODE>true</CODE> if the provided monitoring value represents the
+ * non implemented label and <CODE>false</CODE> otherwise.
+ */
+ public static boolean isNotImplemented(MonitoringAttributes attr,
+ CustomSearchResult monitoringEntry)
+ {
+ boolean returnValue;
+ Object monitoringValue = Utilities.getFirstMonitoringValue(
+ monitoringEntry,
+ attr.getAttributeName());
+ if (attr.isNumeric() && (monitoringValue != null))
+ {
+ try
+ {
+ Long.parseLong(String.valueOf(monitoringValue));
+ returnValue = false;
+ }
+ catch (Throwable t)
+ {
+ returnValue = true;
+ }
+ }
+ else
+ {
+ returnValue = false;
+ }
+ return returnValue;
+ }
}
diff --git a/opendj-sdk/opends/src/messages/messages/admin_tool.properties b/opendj-sdk/opends/src/messages/messages/admin_tool.properties
index 2909369..92e1ef7 100644
--- a/opendj-sdk/opends/src/messages/messages/admin_tool.properties
+++ b/opendj-sdk/opends/src/messages/messages/admin_tool.properties
@@ -2324,3 +2324,108 @@
INFO_CTRL_PANEL_REFRESH_OPTIONS_LABEL=Refresh Period (sec):
INFO_CTRL_PANEL_INVALID_PERIOD_VALUE=The period time must be an integer \
positive value smaller than %d seconds.
+
+INFO_CTRL_PANEL_CATEGORY_MONITORING=Monitoring
+INFO_CTRL_PANEL_BROWSE_GENERAL_MONITORING=General Information
+INFO_CTRL_PANEL_GENERAL_MONITORING_NO_ITEM_SELECTED=-No Item Selected-
+INFO_CTRL_PANEL_MULTIPLE_ITEMS_SELECTED=-Multiple Items Selected-
+INFO_CTRL_PANEL_GENERAL_MONITORING_TITLE=General Information
+INFO_CTRL_PANEL_AUTH_REQUIRED_TO_BROWSE_MONITORING_SUMMARY=The server is \
+ running. You must provide authentication to see the monitoring data.
+INFO_CTRL_PANEL_SERVER_MUST_RUN_TO_BROWSE_MONITORING_SUMMARY=To see the \
+ monitoring data the server must be running and you must provide \
+ authentication.
+INFO_CTRL_PANEL_GENERAL_MONITORING_ROOT_TREE_NODE=ds-directory.png
+INFO_CTRL_PANEL_SYSTEM_INFORMATION_TREE_NODE=ds-generic.png
+INFO_CTRL_PANEL_JVM_MEMORY_USAGE_TREE_NODE=ds-generic.png
+INFO_CTRL_PANEL_WORK_QUEUE_TREE_NODE=ds-generic.png
+INFO_CTRL_PANEL_ENTRY_CACHES_TREE_NODE=ds-generic.png
+INFO_CTRL_PANEL_DB_ENVIRONMENT_TREE_NODE=ds-suffix.png
+INFO_CTRL_PANEL_GENERAL_MONITORING_ROOT=Monitoring Root
+INFO_CTRL_PANEL_SYSTEM_INFORMATION=System Information
+INFO_CTRL_PANEL_JAVA_INFORMATION=Java Information
+INFO_CTRL_PANEL_WORK_QUEUE=Work Queue
+INFO_CTRL_PANEL_ENTRY_CACHES=Entry Cache
+INFO_CTRL_PANEL_DB_ENVIRONMENT=Database Environment
+INFO_CTRL_PANEL_UP_TIME_LABEL=Up Time:
+INFO_CTRL_PANEL_MAX_CONNECTIONS_LABEL=Max Connections:
+INFO_CTRL_PANEL_TOTAL_CONNECTIONS_LABEL=Total Connections:
+INFO_CTRL_PANEL_START_TIME_LABEL=Start Time:
+INFO_CTRL_PANEL_AVERAGE_REQUEST_BACKLOG=Average Request Backlog
+INFO_CTRL_PANEL_MAX_REQUEST_BACKLOG=Maximum Request Backlog
+INFO_CTRL_PANEL_CURRENT_REQUEST_BACKLOG=Current Request Backlog
+INFO_CTRL_PANEL_REQUESTS_SUBMITTED=Requests Submitted
+INFO_CTRL_PANEL_REQUESTS_REJECTED=Requests Rejected Due To Full Queue
+INFO_CTRL_PANEL_ENTRY_CACHE_HITS=Entry Cache Hits
+INFO_CTRL_PANEL_CURRENT_ENTRY_CACHE_COUNT=Entry Cache Count
+INFO_CTRL_PANEL_ENTRY_CACHE_TRIES=Entry Cache Tries
+INFO_CTRL_PANEL_ENTRY_CACHE_HIT_RATIO=Entry Cache Hit Ratio
+INFO_CTRL_PANEL_CURRENT_ENTRY_CACHE_SIZE=Entry Cache Size
+INFO_CTRL_PANEL_MAX_ENTRY_CACHE_SIZE=Max Entry Cache Size
+INFO_CTRL_PANEL_MAX_ENTRY_CACHE_COUNT=Max Entry Cache Count
+INFO_CTRL_PANEL_NO_DBS_FOUND=-No Databases Found-
+INFO_CTRL_PANEL_DB_HEADER=Backend ID
+INFO_CTRL_PANEL_NO_DB_MONITORING_FOUND=-No Database Environment Data \
+Found-
+INFO_CTRL_PANEL_AVAILABLE_CPUS=Available CPUs
+INFO_CTRL_PANEL_SYSTEM_NAME=System Name
+INFO_CTRL_PANEL_OPERATING_SYSTEM=Operating System
+INFO_CTRL_PANEL_FREE_USED_MEMORY=Free Used Memory
+INFO_CTRL_PANEL_MAX_MEMORY=Max Memory
+INFO_CTRL_PANEL_USED_MEMORY=Used Memory
+INFO_CTRL_PANEL_CLASS_PATH=Class Path
+INFO_CTRL_PANEL_JAVA_VENDOR=Java Vendor
+INFO_CTRL_PANEL_JVM_VENDOR=JVM Vendor
+INFO_CTRL_PANEL_JAVA_VERSION=Java Version
+INFO_CTRL_PANEL_JVM_VERSION=JVM Version
+INFO_CTRL_PANEL_JVM_ARCHITECTURE=JVM Architecture
+INFO_CTRL_PANEL_JVM_ARGUMENTS=JVM Arguments
+INFO_CTRL_PANEL_MEMORY_VALUE=%d Mb, %d Kb
+INFO_CTRL_PANEL_EXTRA_JAVA_ATTRIBUTES=Other Attributes
+INFO_CTRL_PANEL_JAVA_MEMORY_ATTRIBUTES=Memory Attributes
+INFO_CTRL_PANEL_NOT_IMPLEMENTED=Not Implemented
+INFO_CTRL_PANEL_NO_MONITORING_VALUE=-
+INFO_CTRL_PANEL_TOTAL_LABEL=TOTAL
+INFO_CTRL_PANEL_ATTRIBUTE_VIEW_OPTIONS_TITLE=Attribute View Options
+INFO_CTRL_PANEL_NO_OPERATION_SELECTED=You must select at least one \
+ operation.
+INFO_CTRL_PANEL_OPERATION_VIEW_LABEL=Show Columns
+INFO_CTRL_PANEL_OPERATIONS_VIEW=Show Operations...
+INFO_CTRL_PANEL_OPERATION_NAME_AS_LABEL=%s:
+INFO_CTRL_PANEL_ADD_REQUESTS_LABEL=Add Requests
+INFO_CTRL_PANEL_ADD_RESPONSES_LABEL=Add Responses
+INFO_CTRL_PANEL_BIND_REQUESTS_LABEL=Bind Requests
+INFO_CTRL_PANEL_BIND_RESPONSES_LABEL=Bind Responses
+INFO_CTRL_PANEL_COMPARE_REQUESTS_LABEL=Compare Requests
+INFO_CTRL_PANEL_COMPARE_RESPONSES_LABEL=Compare Responses
+INFO_CTRL_PANEL_DELETE_REQUESTS_LABEL=Delete Requests
+INFO_CTRL_PANEL_DELETE_RESPONSES_LABEL=Delete Responses
+INFO_CTRL_PANEL_EXTENDED_REQUESTS_LABEL=Extended Requests
+INFO_CTRL_PANEL_EXTENDED_RESPONSES_LABEL=Extended Responses
+INFO_CTRL_PANEL_MOD_DN_REQUESTS_LABEL=Mod DN Requests
+INFO_CTRL_PANEL_MOD_DN_RESPONSES_LABEL=Mod DN Responses
+INFO_CTRL_PANEL_MOD_REQUESTS_LABEL=Modify Requests
+INFO_CTRL_PANEL_MOD_RESPONSES_LABEL=Modify Responses
+INFO_CTRL_PANEL_SEARCH_REQUESTS_LABEL=Search Requests
+INFO_CTRL_PANEL_SEARCH_DONE_LABEL=Searches Done
+INFO_CTRL_PANEL_UNBIND_REQUESTS_LABEL=Unbind Requests
+INFO_CTRL_PANEL_ALL_CONNECTION_HANDLERS=All
+INFO_CTRL_PANEL_CONNECTION_HANDLERS_LABEL=Connection Handlers:
+INFO_CTRL_PANEL_CONNECTION_HANDLER_MONITORING_TITLE=Connection Handler \
+ Monitoring
+INFO_CTRL_PANEL_AUTH_REQUIRED_TO_SEE_TRAFFIC_MONITORING_SUMMARY=The \
+ server is running. You must provide authentication to see the monitoring data.
+INFO_CTRL_PANEL_SERVER_MUST_RUN_TO_SEE_TRAFFIC_MONITORING_SUMMARY=To \
+ see the monitoring data the server must be running and you must provide \
+ authentication.
+INFO_CTRL_PANEL_ADMINISTRATION_CONNECTOR_NAME=%d - Administration \
+ Connector
+INFO_CTRL_PANEL_CONNECTION_HANDLER_VIEW_MENU=View
+INFO_CTRL_PANEL_CONNECTION_HANDLER_VIEW_MENU_DESCRIPTION=View options \
+ for the Connection Handler Monitoring
+INFO_CTRL_PANEL_SHOW_AVERAGES=Show Averages
+INFO_CTRL_PANEL_CONNECTION_HANDLER_HEADER=Connection Handler
+INFO_CTRL_PANEL_ADMINISTRATION_CONNECTOR_NAME=%d - Administration \
+ Connector
+INFO_CTRL_PANEL_CONNECTION_HANDLER_MONITORING=Connection Handler
+INFO_CTRL_PANEL_AVERAGE_HEADER=%s Avg per second
--
Gitblit v1.10.0