mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

matthew_swift
05.42.2009 22094368c2865dcfb6daf8366425212b721a4657
opends/src/server/org/opends/server/protocols/ldap/LDAPStatistics.java
@@ -28,62 +28,52 @@
import static org.opends.messages.ProtocolMessages.*;
import static org.opends.server.protocols.ldap.LDAPConstants.*;
import static org.opends.server.types.OperationType.*;
import java.util.ArrayList;
import org.opends.messages.Message;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.ConnectionHandler;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.opends.server.config.ConfigException;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.core.DirectoryServer;
import org.opends.server.monitors.ClientConnectionMonitorProvider;
import org.opends.server.monitors.OperationMonitor;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
import org.opends.server.types.DebugLogLevel;
import static org.opends.messages.ProtocolMessages.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
import static org.opends.server.protocols.ldap.LDAPConstants.*;
import static org.opends.server.types.OperationType.*;
import org.opends.server.types.AttributeValues;
/**
 * This class defines a data structure that will be used to keep track of
 * various metrics related to LDAP communication that the server has conducted.
 * The statistics that will be tracked include:
 *
 * This class defines a data structure that will be used to keep track
 * of various metrics related to LDAP communication that the server has
 * conducted. The statistics that will be tracked include:
 * <UL>
 *   <LI>The total number of LDAP client connections accepted by the
 *       server.</LI>
 *   <LI>The total number of LDAP client connections that have been closed.</LI>
 *   <LI>The total number of LDAP messages read, both overall and broken down
 *       by message type.</LI>
 *   <LI>The total number of LDAP messages written, both overall and broken down
 *       by message type.</LI>
 *   <LI>The total number of bytes read from LDAP clients.</LI>
 *   <LI>The total number of bytes written to LDAP clients.</LI>
 * <LI>The total number of LDAP client connections accepted by the
 * server.</LI>
 * <LI>The total number of LDAP client connections that have been
 * closed.</LI>
 * <LI>The total number of LDAP messages read, both overall and broken
 * down by message type.</LI>
 * <LI>The total number of LDAP messages written, both overall and
 * broken down by message type.</LI>
 * <LI>The total number of bytes read from LDAP clients.</LI>
 * <LI>The total number of bytes written to LDAP clients.</LI>
 * </UL>
 *
 * <BR><BR>
 * This class may also be used in a hierarchical form if it is desirable to
 * get specific and general statistics at the same time (e.g., information
 * about the interaction with a specific client or aggregated for all clients).
 * <BR>
 * <BR>
 * This class may also be used in a hierarchical form if it is desirable
 * to get specific and general statistics at the same time (e.g.,
 * information about the interaction with a specific client or
 * aggregated for all clients).
 */
public class LDAPStatistics
       extends MonitorProvider<MonitorProviderCfg>
public class LDAPStatistics extends MonitorProvider<MonitorProviderCfg>
{
  /**
   * The tracer object for the debug logger.
   */
  private static final DebugTracer TRACER = getTracer();
  // The statistics maintained by this class.
  private long abandonRequests;
@@ -116,57 +106,58 @@
  private long searchResultsDone;
  private long unbindRequests;
  // The parent that should also be updated whenever statistics in this object
  // are updated.
  private LDAPStatistics parent;
  // The parent that should also be updated whenever statistics in this
  // object are updated.
  private final LDAPStatistics parent;
  // The locks used to provide threadsafe access to this class.  In this case,
  // read and write refer to the type of LDAP communication, not access to the
  // protected data.
  private Object abandonLock;
  private Object connectLock;
  private Object disconnectLock;
  private Object readLock;
  private Object writeLock;
  // The locks used to provide threadsafe access to this class. In this
  // case, read and write refer to the type of LDAP communication, not
  // access to the protected data.
  private final Object abandonLock;
  private final Object connectLock;
  private final Object disconnectLock;
  private final Object readLock;
  private final Object writeLock;
  // The instance name for this monitor provider instance.
  private String instanceName;
  private final String instanceName;
  // Connection Handler to which the statistics belong to.
  private ConnectionHandler handler;
  private final ConnectionHandler handler;
  // Monitor Objects : for Operations.
  private final OperationMonitor addRequestsMonitor =
      OperationMonitor.getOperationMonitor(ADD);
  private final OperationMonitor searchRequestsMonitor =
      OperationMonitor.getOperationMonitor(SEARCH);
  private final OperationMonitor delRequestsMonitor =
      OperationMonitor.getOperationMonitor(DELETE);
  private final OperationMonitor bindRequestsMonitor =
      OperationMonitor.getOperationMonitor(BIND);
  private final OperationMonitor unbindRequestsMonitor =
      OperationMonitor.getOperationMonitor(UNBIND);
  private final OperationMonitor compareRequestsMonitor =
      OperationMonitor.getOperationMonitor(COMPARE);
  private final OperationMonitor modRequestsMonitor =
      OperationMonitor.getOperationMonitor(MODIFY);
  private final OperationMonitor moddnRequestsMonitor =
      OperationMonitor.getOperationMonitor(MODIFY);
  private final OperationMonitor abandonRequestsMonitor =
      OperationMonitor.getOperationMonitor(ABANDON);
  private final OperationMonitor extendedRequestsMonitor =
      OperationMonitor.getOperationMonitor(EXTENDED);
    // Monitor Objects : for Operations.
    private OperationMonitor addRequestsMonitor =
            OperationMonitor.getOperationMonitor(ADD);
    private OperationMonitor searchRequestsMonitor =
            OperationMonitor.getOperationMonitor(SEARCH);
    private OperationMonitor delRequestsMonitor =
            OperationMonitor.getOperationMonitor(DELETE);
    private OperationMonitor bindRequestsMonitor =
            OperationMonitor.getOperationMonitor(BIND);
    private OperationMonitor unbindRequestsMonitor =
            OperationMonitor.getOperationMonitor(UNBIND);
    private OperationMonitor compareRequestsMonitor =
            OperationMonitor.getOperationMonitor(COMPARE);
    private OperationMonitor modRequestsMonitor =
            OperationMonitor.getOperationMonitor(MODIFY);
    private OperationMonitor moddnRequestsMonitor =
            OperationMonitor.getOperationMonitor(MODIFY);
    private OperationMonitor abandonRequestsMonitor =
            OperationMonitor.getOperationMonitor(ABANDON);
    private OperationMonitor extendedRequestsMonitor =
            OperationMonitor.getOperationMonitor(EXTENDED);
  /**
   * Creates a new instance of this class with no parent.
   *
   * @param handler to which the stats belong  to.
   * @param  instanceName  The name for this monitor provider instance.
   * @param handler
   *          to which the stats belong to.
   * @param instanceName
   *          The name for this monitor provider instance.
   */
  public LDAPStatistics(ConnectionHandler handler,
          String instanceName)
  public LDAPStatistics(ConnectionHandler handler, String instanceName)
  {
    this(handler, instanceName, null);
@@ -178,60 +169,62 @@
  /**
   * Creates a new instance of this class with the specified parent.
   *
   * @param  handler       the handler to which the stats belong to.
   * @param  instanceName  The name for this monitor provider instance.
   * @param  parent        The parent object that should also be updated
   *                       whenever this class is updated.  It may be null if
   *                       there should not be a parent.
   * @param handler
   *          the handler to which the stats belong to.
   * @param instanceName
   *          The name for this monitor provider instance.
   * @param parent
   *          The parent object that should also be updated whenever
   *          this class is updated. It may be null if there should not
   *          be a parent.
   */
  public LDAPStatistics(ConnectionHandler handler,
          String instanceName, LDAPStatistics parent)
  public LDAPStatistics(ConnectionHandler handler, String instanceName,
      LDAPStatistics parent)
  {
    super("LDAP Statistics Monitor Provider");
    this.instanceName = instanceName;
    this.parent       = parent;
    this.parent = parent;
    this.handler = handler;
    abandonLock    = new Object();
    connectLock    = new Object();
    abandonLock = new Object();
    connectLock = new Object();
    disconnectLock = new Object();
    readLock       = new Object();
    writeLock      = new Object();
    readLock = new Object();
    writeLock = new Object();
    abandonRequests        = 0;
    addRequests            = 0;
    addResponses           = 0;
    bindRequests           = 0;
    bindResponses          = 0;
    bytesRead              = 0;
    bytesWritten           = 0;
    compareRequests        = 0;
    compareResponses       = 0;
    connectionsClosed      = 0;
    abandonRequests = 0;
    addRequests = 0;
    addResponses = 0;
    bindRequests = 0;
    bindResponses = 0;
    bytesRead = 0;
    bytesWritten = 0;
    compareRequests = 0;
    compareResponses = 0;
    connectionsClosed = 0;
    connectionsEstablished = 0;
    deleteRequests         = 0;
    deleteResponses        = 0;
    extendedRequests       = 0;
    extendedResponses      = 0;
    messagesRead           = 0;
    messagesWritten        = 0;
    modifyRequests         = 0;
    modifyResponses        = 0;
    modifyDNRequests       = 0;
    modifyDNResponses      = 0;
    operationsAbandoned    = 0;
    operationsCompleted    = 0;
    operationsInitiated    = 0;
    searchRequests         = 0;
    searchResultEntries    = 0;
    deleteRequests = 0;
    deleteResponses = 0;
    extendedRequests = 0;
    extendedResponses = 0;
    messagesRead = 0;
    messagesWritten = 0;
    modifyRequests = 0;
    modifyResponses = 0;
    modifyDNRequests = 0;
    modifyDNResponses = 0;
    operationsAbandoned = 0;
    operationsCompleted = 0;
    operationsInitiated = 0;
    searchRequests = 0;
    searchResultEntries = 0;
    searchResultReferences = 0;
    searchResultsDone      = 0;
    unbindRequests         = 0;
    searchResultsDone = 0;
    unbindRequests = 0;
    ClientConnectionMonitorProvider connections =
                new ClientConnectionMonitorProvider(this.handler);
        new ClientConnectionMonitorProvider(this.handler);
    DirectoryServer.registerMonitorProvider(connections);
  }
@@ -241,26 +234,30 @@
  /**
   * {@inheritDoc}
   */
  @Override
  public void initializeMonitorProvider(MonitorProviderCfg configuration)
         throws ConfigException
      throws ConfigException
  {
    // Throw an exception, because this monitor is not intended to be
    // dynamically loaded from the configuration.  Rather, it should be
    // explicitly created and registered by the LDAP connection handler or an
    // LDAP client connection.
    Message message = ERR_LDAP_STATS_INVALID_MONITOR_INITIALIZATION.get(
        String.valueOf(configuration.dn()));
    // dynamically loaded from the configuration. Rather, it should be
    // explicitly created and registered by the LDAP connection handler
    // or an LDAP client connection.
    Message message =
        ERR_LDAP_STATS_INVALID_MONITOR_INITIALIZATION.get(String
            .valueOf(configuration.dn()));
    throw new ConfigException(message);
  }
  /**
   * Retrieves the name of this monitor provider.  It should be unique among all
   * monitor providers, including all instances of the same monitor provider.
   * Retrieves the name of this monitor provider. It should be unique
   * among all monitor providers, including all instances of the same
   * monitor provider.
   *
   * @return  The name of this monitor provider.
   * @return The name of this monitor provider.
   */
  @Override
  public String getMonitorInstanceName()
  {
    return instanceName;
@@ -269,14 +266,17 @@
  /**
   * Retrieves the length of time in milliseconds that should elapse between
   * calls to the <CODE>updateMonitorData()</CODE> method.  A negative or zero
   * return value indicates that the <CODE>updateMonitorData()</CODE> method
   * should not be periodically invoked.
   * Retrieves the length of time in milliseconds that should elapse
   * between calls to the <CODE>updateMonitorData()</CODE> method. A
   * negative or zero return value indicates that the
   * <CODE>updateMonitorData()</CODE> method should not be periodically
   * invoked.
   *
   * @return  The length of time in milliseconds that should elapse between
   *          calls to the <CODE>updateMonitorData()</CODE> method.
   * @return The length of time in milliseconds that should elapse
   *         between calls to the <CODE>updateMonitorData()</CODE>
   *         method.
   */
  @Override
  public long getUpdateInterval()
  {
    // This monitor should not run periodically.
@@ -286,27 +286,31 @@
  /**
   * Performs any processing periodic processing that may be desired to update
   * the information associated with this monitor.  Note that best-effort
   * attempts will be made to ensure that calls to this method come
   * <CODE>getUpdateInterval()</CODE> milliseconds apart, but no guarantees will
   * be made.
   * Performs any processing periodic processing that may be desired to
   * update the information associated with this monitor. Note that
   * best-effort attempts will be made to ensure that calls to this
   * method come <CODE>getUpdateInterval()</CODE> milliseconds apart,
   * but no guarantees will be made.
   */
  @Override
  public void updateMonitorData()
  {
    // No implementation is required since this does not do periodic updates.
    // No implementation is required since this does not do periodic
    // updates.
  }
  /**
   * Retrieves a set of attributes containing monitor data that should be
   * returned to the client if the corresponding monitor entry is requested.
   * Retrieves a set of attributes containing monitor data that should
   * be returned to the client if the corresponding monitor entry is
   * requested.
   *
   * @return  A set of attributes containing monitor data that should be
   *          returned to the client if the corresponding monitor entry is
   *          requested.
   * @return A set of attributes containing monitor data that should be
   *         returned to the client if the corresponding monitor entry
   *         is requested.
   */
  @Override
  public ArrayList<Attribute> getMonitorData()
  {
    ArrayList<Attribute> attrs = new ArrayList<Attribute>(29);
@@ -341,9 +345,10 @@
    long tmpSearchResultsDone;
    long tmpUnbindRequests;
    // Quickly grab the locks and store consistent copies of the information.
    // Note that when grabbing multiple locks, it is essential that they are all
    // acquired in the same order to prevent deadlocks.
    // Quickly grab the locks and store consistent copies of the
    // information. Note that when grabbing multiple locks, it is
    // essential that they are all acquired in the same order to prevent
    // deadlocks.
    synchronized (abandonLock)
    {
      synchronized (connectLock)
@@ -354,180 +359,177 @@
          {
            synchronized (readLock)
            {
              tmpAbandonRequests        = abandonRequests;
              tmpAddRequests            = addRequests;
              tmpAddResponses           = addResponses;
              tmpBindRequests           = bindRequests;
              tmpBindResponses          = bindResponses;
              tmpBytesRead              = bytesRead;
              tmpBytesWritten           = bytesWritten;
              tmpCompareRequests        = compareRequests;
              tmpCompareResponses       = compareResponses;
              tmpConnectionsClosed      = connectionsClosed;
              tmpAbandonRequests = abandonRequests;
              tmpAddRequests = addRequests;
              tmpAddResponses = addResponses;
              tmpBindRequests = bindRequests;
              tmpBindResponses = bindResponses;
              tmpBytesRead = bytesRead;
              tmpBytesWritten = bytesWritten;
              tmpCompareRequests = compareRequests;
              tmpCompareResponses = compareResponses;
              tmpConnectionsClosed = connectionsClosed;
              tmpConnectionsEstablished = connectionsEstablished;
              tmpDeleteRequests         = deleteRequests;
              tmpDeleteResponses        = deleteResponses;
              tmpExtendedRequests       = extendedRequests;
              tmpExtendedResponses      = extendedResponses;
              tmpMessagesRead           = messagesRead;
              tmpMessagesWritten        = messagesWritten;
              tmpModifyRequests         = modifyRequests;
              tmpModifyResponses        = modifyResponses;
              tmpModifyDNRequests       = modifyDNRequests;
              tmpModifyDNResponses      = modifyDNResponses;
              tmpOperationsAbandoned    = operationsAbandoned;
              tmpOperationsCompleted    = operationsCompleted;
              tmpOperationsInitiated    = operationsInitiated;
              tmpSearchRequests         = searchRequests;
              tmpSearchEntries          = searchResultEntries;
              tmpSearchReferences       = searchResultReferences;
              tmpSearchResultsDone      = searchResultsDone;
              tmpUnbindRequests         = unbindRequests;
              tmpDeleteRequests = deleteRequests;
              tmpDeleteResponses = deleteResponses;
              tmpExtendedRequests = extendedRequests;
              tmpExtendedResponses = extendedResponses;
              tmpMessagesRead = messagesRead;
              tmpMessagesWritten = messagesWritten;
              tmpModifyRequests = modifyRequests;
              tmpModifyResponses = modifyResponses;
              tmpModifyDNRequests = modifyDNRequests;
              tmpModifyDNResponses = modifyDNResponses;
              tmpOperationsAbandoned = operationsAbandoned;
              tmpOperationsCompleted = operationsCompleted;
              tmpOperationsInitiated = operationsInitiated;
              tmpSearchRequests = searchRequests;
              tmpSearchEntries = searchResultEntries;
              tmpSearchReferences = searchResultReferences;
              tmpSearchResultsDone = searchResultsDone;
              tmpUnbindRequests = unbindRequests;
            }
          }
        }
      }
    }
    // Construct the list of attributes to return.
    attrs.add(createAttribute("connectionsEstablished",
                              String.valueOf(tmpConnectionsEstablished)));
    attrs.add(createAttribute("connectionsClosed",
                              String.valueOf(tmpConnectionsClosed)));
    attrs.add(createAttribute("bytesRead", String.valueOf(tmpBytesRead)));
    attrs.add(createAttribute("bytesWritten", String.valueOf(tmpBytesWritten)));
    attrs.add(createAttribute("ldapMessagesRead",
                              String.valueOf(tmpMessagesRead)));
    attrs.add(createAttribute("ldapMessagesWritten",
                              String.valueOf(tmpMessagesWritten)));
    attrs.add(createAttribute("operationsAbandoned",
                              String.valueOf(tmpOperationsAbandoned)));
    attrs.add(createAttribute("operationsInitiated",
                              String.valueOf(tmpOperationsInitiated)));
    attrs.add(createAttribute("operationsCompleted",
                              String.valueOf(tmpOperationsCompleted)));
    attrs.add(createAttribute("abandonRequests",
                              String.valueOf(tmpAbandonRequests)));
    attrs.add(createAttribute("addRequests", String.valueOf(tmpAddRequests)));
    attrs.add(createAttribute("addResponses", String.valueOf(tmpAddResponses)));
    attrs.add(createAttribute("bindRequests", String.valueOf(tmpBindRequests)));
    attrs.add(createAttribute("bindResponses",
                              String.valueOf(tmpBindResponses)));
    attrs.add(createAttribute("compareRequests",
                              String.valueOf(tmpCompareRequests)));
    attrs.add(createAttribute("compareResponses",
                              String.valueOf(tmpCompareResponses)));
    attrs.add(createAttribute("deleteRequests",
                              String.valueOf(tmpDeleteRequests)));
    attrs.add(createAttribute("deleteResponses",
                              String.valueOf(tmpDeleteResponses)));
    attrs.add(createAttribute("extendedRequests",
                              String.valueOf(tmpExtendedRequests)));
    attrs.add(createAttribute("extendedResponses",
                              String.valueOf(tmpExtendedResponses)));
    attrs.add(createAttribute("modifyRequests",
                              String.valueOf(tmpModifyRequests)));
    attrs.add(createAttribute("modifyResponses",
                              String.valueOf(tmpModifyResponses)));
    attrs.add(createAttribute("modifyDNRequests",
                              String.valueOf(tmpModifyDNRequests)));
    attrs.add(createAttribute("modifyDNResponses",
                              String.valueOf(tmpModifyDNResponses)));
    attrs.add(createAttribute("searchRequests",
                              String.valueOf(tmpSearchRequests)));
    attrs.add(createAttribute("searchResultEntries",
                              String.valueOf(tmpSearchEntries)));
    attrs.add(createAttribute("searchResultReferences",
                              String.valueOf(tmpSearchReferences)));
    attrs.add(createAttribute("searchResultsDone",
                              String.valueOf(tmpSearchResultsDone)));
    attrs.add(createAttribute("unbindRequests",
                              String.valueOf(tmpUnbindRequests)));
    attrs.add(createAttribute("connectionsEstablished", String
        .valueOf(tmpConnectionsEstablished)));
    attrs.add(createAttribute("connectionsClosed", String
        .valueOf(tmpConnectionsClosed)));
    attrs
        .add(createAttribute("bytesRead", String.valueOf(tmpBytesRead)));
    attrs.add(createAttribute("bytesWritten", String
        .valueOf(tmpBytesWritten)));
    attrs.add(createAttribute("ldapMessagesRead", String
        .valueOf(tmpMessagesRead)));
    attrs.add(createAttribute("ldapMessagesWritten", String
        .valueOf(tmpMessagesWritten)));
    attrs.add(createAttribute("operationsAbandoned", String
        .valueOf(tmpOperationsAbandoned)));
    attrs.add(createAttribute("operationsInitiated", String
        .valueOf(tmpOperationsInitiated)));
    attrs.add(createAttribute("operationsCompleted", String
        .valueOf(tmpOperationsCompleted)));
    attrs.add(createAttribute("abandonRequests", String
        .valueOf(tmpAbandonRequests)));
    attrs.add(createAttribute("addRequests", String
        .valueOf(tmpAddRequests)));
    attrs.add(createAttribute("addResponses", String
        .valueOf(tmpAddResponses)));
    attrs.add(createAttribute("bindRequests", String
        .valueOf(tmpBindRequests)));
    attrs.add(createAttribute("bindResponses", String
        .valueOf(tmpBindResponses)));
    attrs.add(createAttribute("compareRequests", String
        .valueOf(tmpCompareRequests)));
    attrs.add(createAttribute("compareResponses", String
        .valueOf(tmpCompareResponses)));
    attrs.add(createAttribute("deleteRequests", String
        .valueOf(tmpDeleteRequests)));
    attrs.add(createAttribute("deleteResponses", String
        .valueOf(tmpDeleteResponses)));
    attrs.add(createAttribute("extendedRequests", String
        .valueOf(tmpExtendedRequests)));
    attrs.add(createAttribute("extendedResponses", String
        .valueOf(tmpExtendedResponses)));
    attrs.add(createAttribute("modifyRequests", String
        .valueOf(tmpModifyRequests)));
    attrs.add(createAttribute("modifyResponses", String
        .valueOf(tmpModifyResponses)));
    attrs.add(createAttribute("modifyDNRequests", String
        .valueOf(tmpModifyDNRequests)));
    attrs.add(createAttribute("modifyDNResponses", String
        .valueOf(tmpModifyDNResponses)));
    attrs.add(createAttribute("searchRequests", String
        .valueOf(tmpSearchRequests)));
    attrs.add(createAttribute("searchResultEntries", String
        .valueOf(tmpSearchEntries)));
    attrs.add(createAttribute("searchResultReferences", String
        .valueOf(tmpSearchReferences)));
    attrs.add(createAttribute("searchResultsDone", String
        .valueOf(tmpSearchResultsDone)));
    attrs.add(createAttribute("unbindRequests", String
        .valueOf(tmpUnbindRequests)));
     // adds
     attrs.add(createAttribute(
                "ds-mon-add-operations-total-count",
                String.valueOf(addRequestsMonitor.getCounter().getCount())));
     attrs.add(createAttribute(
                "ds-mon-resident-time-add-operations-total-time",
                String.valueOf(addRequestsMonitor.getTotalTime())));
    // adds
    attrs.add(createAttribute("ds-mon-add-operations-total-count",
        String.valueOf(addRequestsMonitor.getCounter().getCount())));
    attrs.add(createAttribute(
        "ds-mon-resident-time-add-operations-total-time", String
            .valueOf(addRequestsMonitor.getTotalTime())));
     // search
     attrs.add(createAttribute(
              "ds-mon-search-operations-total-count",
                String.valueOf(searchRequestsMonitor.getCounter().getCount())));
     attrs.add(createAttribute(
                "ds-mon-resident-time-search-operations-total-time",
                String.valueOf(searchRequestsMonitor.getTotalTime())));
    // search
    attrs.add(createAttribute("ds-mon-search-operations-total-count",
        String.valueOf(searchRequestsMonitor.getCounter().getCount())));
    attrs.add(createAttribute(
        "ds-mon-resident-time-search-operations-total-time", String
            .valueOf(searchRequestsMonitor.getTotalTime())));
     // bind
     attrs.add(createAttribute(
                "ds-mon-bind-operations-total-count",
                String.valueOf(bindRequestsMonitor.getCounter().getCount())));
     attrs.add(createAttribute(
                "ds-mon-resident-time-bind-operations-total-time",
                String.valueOf(bindRequestsMonitor.getTotalTime())));
    // bind
    attrs.add(createAttribute("ds-mon-bind-operations-total-count",
        String.valueOf(bindRequestsMonitor.getCounter().getCount())));
    attrs.add(createAttribute(
        "ds-mon-resident-time-bind-operations-total-time", String
            .valueOf(bindRequestsMonitor.getTotalTime())));
     // unbind
     attrs.add(createAttribute(
              "ds-mon-unbind-operations-total-count",
              String.valueOf(unbindRequestsMonitor.getCounter().getCount())));
     attrs.add(createAttribute(
                "ds-mon-resident-time-unbind-operations-total-time",
                String.valueOf(unbindRequestsMonitor.getTotalTime())));
    // unbind
    attrs.add(createAttribute("ds-mon-unbind-operations-total-count",
        String.valueOf(unbindRequestsMonitor.getCounter().getCount())));
    attrs.add(createAttribute(
        "ds-mon-resident-time-unbind-operations-total-time", String
            .valueOf(unbindRequestsMonitor.getTotalTime())));
     // compare
     attrs.add(createAttribute(
             "ds-mon-compare-operations-total-count",
             String.valueOf(
             compareRequestsMonitor.getCounter().getCount())));
     attrs.add(createAttribute(
             "ds-mon-resident-time-compare-operations-total-time",
             String.valueOf(compareRequestsMonitor.getTotalTime())));
     // del
     attrs.add(createAttribute(
             "ds-mon-delete-operations-total-count",
             String.valueOf(delRequestsMonitor.getCounter().getCount())));
     attrs.add(createAttribute(
             "ds-mon-resident-time-delete-operations-total-time",
             String.valueOf(delRequestsMonitor.getTotalTime())));
    // compare
    attrs
        .add(createAttribute("ds-mon-compare-operations-total-count",
            String.valueOf(compareRequestsMonitor.getCounter()
                .getCount())));
    attrs.add(createAttribute(
        "ds-mon-resident-time-compare-operations-total-time", String
            .valueOf(compareRequestsMonitor.getTotalTime())));
    // del
    attrs.add(createAttribute("ds-mon-delete-operations-total-count",
        String.valueOf(delRequestsMonitor.getCounter().getCount())));
    attrs.add(createAttribute(
        "ds-mon-resident-time-delete-operations-total-time", String
            .valueOf(delRequestsMonitor.getTotalTime())));
     // mod
     attrs.add(createAttribute(
             "ds-mon-mod-operations-total-count",
             String.valueOf(modRequestsMonitor.getCounter().getCount())));
     attrs.add(createAttribute(
            "ds-mon-resident-time-mod-operations-total-time",
            String.valueOf(modRequestsMonitor.getTotalTime())));
    // mod
    attrs.add(createAttribute("ds-mon-mod-operations-total-count",
        String.valueOf(modRequestsMonitor.getCounter().getCount())));
    attrs.add(createAttribute(
        "ds-mon-resident-time-mod-operations-total-time", String
            .valueOf(modRequestsMonitor.getTotalTime())));
     // moddn
     attrs.add(createAttribute(
            "ds-mon-moddn-operations-total-count",
            String.valueOf(moddnRequestsMonitor.getCounter().getCount())));
     attrs.add(createAttribute(
            "ds-mon-resident-time-moddn-operations-total-time",
            String.valueOf(moddnRequestsMonitor.getTotalTime())));
    // moddn
    attrs.add(createAttribute("ds-mon-moddn-operations-total-count",
        String.valueOf(moddnRequestsMonitor.getCounter().getCount())));
    attrs.add(createAttribute(
        "ds-mon-resident-time-moddn-operations-total-time", String
            .valueOf(moddnRequestsMonitor.getTotalTime())));
     // abandon
     attrs.add(createAttribute(
             "ds-mon-abandon-operations-total-count",
             String.valueOf(
             abandonRequestsMonitor.getCounter().getCount())));
     attrs.add(createAttribute(
             "ds-mon-resident-time-abandon-operations-total-time",
             String.valueOf(abandonRequestsMonitor.getTotalTime())));
    // abandon
    attrs
        .add(createAttribute("ds-mon-abandon-operations-total-count",
            String.valueOf(abandonRequestsMonitor.getCounter()
                .getCount())));
    attrs.add(createAttribute(
        "ds-mon-resident-time-abandon-operations-total-time", String
            .valueOf(abandonRequestsMonitor.getTotalTime())));
     // extended
     attrs.add(createAttribute(
             "ds-mon-extended-operations-total-count",
             String.valueOf(
             extendedRequestsMonitor.getCounter().getCount())));
     attrs.add(createAttribute(
             "ds-mon-resident-time-extended-operations-total-time",
             String.valueOf(extendedRequestsMonitor.getTotalTime())));
    // extended
    attrs
        .add(createAttribute("ds-mon-extended-operations-total-count",
            String.valueOf(extendedRequestsMonitor.getCounter()
                .getCount())));
    attrs.add(createAttribute(
        "ds-mon-resident-time-extended-operations-total-time", String
            .valueOf(extendedRequestsMonitor.getTotalTime())));
     return attrs;
    return attrs;
  }
@@ -537,9 +539,10 @@
   */
  public void clearStatistics()
  {
    // Quickly grab the locks and store consistent copies of the information.
    // Note that when grabbing multiple locks, it is essential that they are all
    // acquired in the same order to prevent deadlocks.
    // Quickly grab the locks and store consistent copies of the
    // information. Note that when grabbing multiple locks, it is
    // essential that they are all acquired in the same order to prevent
    // deadlocks.
    synchronized (abandonLock)
    {
      synchronized (connectLock)
@@ -550,35 +553,35 @@
          {
            synchronized (readLock)
            {
              abandonRequests        = 0;
              addRequests            = 0;
              addResponses           = 0;
              bindRequests           = 0;
              bindResponses          = 0;
              bytesRead              = 0;
              bytesWritten           = 0;
              compareRequests        = 0;
              compareResponses       = 0;
              connectionsClosed      = 0;
              abandonRequests = 0;
              addRequests = 0;
              addResponses = 0;
              bindRequests = 0;
              bindResponses = 0;
              bytesRead = 0;
              bytesWritten = 0;
              compareRequests = 0;
              compareResponses = 0;
              connectionsClosed = 0;
              connectionsEstablished = 0;
              deleteRequests         = 0;
              deleteResponses        = 0;
              extendedRequests       = 0;
              extendedResponses      = 0;
              messagesRead           = 0;
              messagesWritten        = 0;
              modifyRequests         = 0;
              modifyResponses        = 0;
              modifyDNRequests       = 0;
              modifyDNResponses      = 0;
              operationsAbandoned    = 0;
              operationsCompleted    = 0;
              operationsInitiated    = 0;
              searchRequests         = 0;
              searchResultEntries    = 0;
              deleteRequests = 0;
              deleteResponses = 0;
              extendedRequests = 0;
              extendedResponses = 0;
              messagesRead = 0;
              messagesWritten = 0;
              modifyRequests = 0;
              modifyResponses = 0;
              modifyDNRequests = 0;
              modifyDNResponses = 0;
              operationsAbandoned = 0;
              operationsCompleted = 0;
              operationsInitiated = 0;
              searchRequests = 0;
              searchResultEntries = 0;
              searchResultReferences = 0;
              searchResultsDone      = 0;
              unbindRequests         = 0;
              searchResultsDone = 0;
              unbindRequests = 0;
            }
          }
        }
@@ -589,8 +592,8 @@
  /**
   * Updates the appropriate set of counters to indicate that a new connection
   * has been established.
   * Updates the appropriate set of counters to indicate that a new
   * connection has been established.
   */
  public void updateConnect()
  {
@@ -609,8 +612,8 @@
  /**
   * Updates the appropriate set of counters to indicate that a connection has
   * been closed.
   * Updates the appropriate set of counters to indicate that a
   * connection has been closed.
   */
  public void updateDisconnect()
  {
@@ -629,10 +632,11 @@
  /**
   * Updates the appropriate set of counters to indicate that the specified
   * number of bytes have been read by the client.
   * Updates the appropriate set of counters to indicate that the
   * specified number of bytes have been read by the client.
   *
   * @param  bytesRead  The number of bytes read by the client.
   * @param bytesRead
   *          The number of bytes read by the client.
   */
  public void updateBytesRead(int bytesRead)
  {
@@ -651,10 +655,11 @@
  /**
   * Updates the appropriate set of counters based on the provided message that
   * has been read from the client.
   * Updates the appropriate set of counters based on the provided
   * message that has been read from the client.
   *
   * @param  message  The message that was read from the client.
   * @param message
   *          The message that was read from the client.
   */
  public void updateMessageRead(LDAPMessage message)
  {
@@ -665,36 +670,36 @@
      switch (message.getProtocolOp().getType())
      {
        case OP_TYPE_ABANDON_REQUEST:
          abandonRequests++;
          break;
        case OP_TYPE_ADD_REQUEST:
          addRequests++;
          break;
        case OP_TYPE_BIND_REQUEST:
          bindRequests++;
          break;
        case OP_TYPE_COMPARE_REQUEST:
          compareRequests++;
          break;
        case OP_TYPE_DELETE_REQUEST:
          deleteRequests++;
          break;
        case OP_TYPE_EXTENDED_REQUEST:
          extendedRequests++;
          break;
        case OP_TYPE_MODIFY_REQUEST:
          modifyRequests++;
          break;
        case OP_TYPE_MODIFY_DN_REQUEST:
          modifyDNRequests++;
          break;
        case OP_TYPE_SEARCH_REQUEST:
          searchRequests++;
          break;
        case OP_TYPE_UNBIND_REQUEST:
          unbindRequests++;
          break;
      case OP_TYPE_ABANDON_REQUEST:
        abandonRequests++;
        break;
      case OP_TYPE_ADD_REQUEST:
        addRequests++;
        break;
      case OP_TYPE_BIND_REQUEST:
        bindRequests++;
        break;
      case OP_TYPE_COMPARE_REQUEST:
        compareRequests++;
        break;
      case OP_TYPE_DELETE_REQUEST:
        deleteRequests++;
        break;
      case OP_TYPE_EXTENDED_REQUEST:
        extendedRequests++;
        break;
      case OP_TYPE_MODIFY_REQUEST:
        modifyRequests++;
        break;
      case OP_TYPE_MODIFY_DN_REQUEST:
        modifyDNRequests++;
        break;
      case OP_TYPE_SEARCH_REQUEST:
        searchRequests++;
        break;
      case OP_TYPE_UNBIND_REQUEST:
        unbindRequests++;
        break;
      }
    }
@@ -708,11 +713,13 @@
  /**
   * Updates the appropriate set of counters based on the provided message that
   * has been written to the client.
   * Updates the appropriate set of counters based on the provided
   * message that has been written to the client.
   *
   * @param  message       The message that was written to the client.
   * @param  bytesWritten  The size of the message written in bytes.
   * @param message
   *          The message that was written to the client.
   * @param bytesWritten
   *          The size of the message written in bytes.
   */
  public void updateMessageWritten(LDAPMessage message, int bytesWritten)
  {
@@ -723,50 +730,50 @@
      switch (message.getProtocolOp().getType())
      {
        case OP_TYPE_ADD_RESPONSE:
          addResponses++;
          operationsCompleted++;
          break;
        case OP_TYPE_BIND_RESPONSE:
          bindResponses++;
          operationsCompleted++;
          break;
        case OP_TYPE_COMPARE_RESPONSE:
          compareResponses++;
          operationsCompleted++;
          break;
        case OP_TYPE_DELETE_RESPONSE:
          deleteResponses++;
          operationsCompleted++;
          break;
        case OP_TYPE_EXTENDED_RESPONSE:
          extendedResponses++;
      case OP_TYPE_ADD_RESPONSE:
        addResponses++;
        operationsCompleted++;
        break;
      case OP_TYPE_BIND_RESPONSE:
        bindResponses++;
        operationsCompleted++;
        break;
      case OP_TYPE_COMPARE_RESPONSE:
        compareResponses++;
        operationsCompleted++;
        break;
      case OP_TYPE_DELETE_RESPONSE:
        deleteResponses++;
        operationsCompleted++;
        break;
      case OP_TYPE_EXTENDED_RESPONSE:
        extendedResponses++;
          // We don't want to include unsolicited notifications as "completed"
          // operations.
          if (message.getMessageID() > 0)
          {
            operationsCompleted++;
          }
          break;
        case OP_TYPE_MODIFY_RESPONSE:
          modifyResponses++;
        // We don't want to include unsolicited notifications as
        // "completed" operations.
        if (message.getMessageID() > 0)
        {
          operationsCompleted++;
          break;
        case OP_TYPE_MODIFY_DN_RESPONSE:
          modifyDNResponses++;
          operationsCompleted++;
          break;
        case OP_TYPE_SEARCH_RESULT_ENTRY:
          searchResultEntries++;
          break;
        case OP_TYPE_SEARCH_RESULT_REFERENCE:
          searchResultReferences++;
          break;
        case OP_TYPE_SEARCH_RESULT_DONE:
          searchResultsDone++;
          operationsCompleted++;
          break;
        }
        break;
      case OP_TYPE_MODIFY_RESPONSE:
        modifyResponses++;
        operationsCompleted++;
        break;
      case OP_TYPE_MODIFY_DN_RESPONSE:
        modifyDNResponses++;
        operationsCompleted++;
        break;
      case OP_TYPE_SEARCH_RESULT_ENTRY:
        searchResultEntries++;
        break;
      case OP_TYPE_SEARCH_RESULT_REFERENCE:
        searchResultReferences++;
        break;
      case OP_TYPE_SEARCH_RESULT_DONE:
        searchResultsDone++;
        operationsCompleted++;
        break;
      }
    }
@@ -780,8 +787,8 @@
  /**
   * Updates the appropriate set of counters to indicate that an operation was
   * abandoned without sending a response to the client.
   * Updates the appropriate set of counters to indicate that an
   * operation was abandoned without sending a response to the client.
   */
  public void updateAbandonedOperation()
  {
@@ -800,34 +807,22 @@
  /**
   * Constructs an attribute using the provided information.  It will have the
   * default syntax.
   * Constructs an attribute using the provided information. It will
   * have the default syntax.
   *
   * @param  name   The name to use for the attribute.
   * @param  value  The value to use for the attribute.
   *
   * @return  the constructed attribute.
   * @param name
   *          The name to use for the attribute.
   * @param value
   *          The value to use for the attribute.
   * @return the constructed attribute.
   */
  private Attribute createAttribute(String name, String value)
  {
    AttributeType attrType = DirectoryServer.getDefaultAttributeType(name);
    AttributeType attrType =
        DirectoryServer.getDefaultAttributeType(name);
    ASN1OctetString encodedValue = new ASN1OctetString(value);
    AttributeBuilder builder = new AttributeBuilder(attrType, name);
    try
    {
      builder.add(new AttributeValue(encodedValue, attrType
          .normalize(encodedValue)));
    }
    catch (Exception e)
    {
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, e);
      }
      builder.add(new AttributeValue(encodedValue, encodedValue));
    }
    builder.add(AttributeValues.create(attrType, value));
    return builder.toAttribute();
  }
@@ -854,7 +849,7 @@
  /**
   * Retrieves the number of client connections that have been closed.
   *
   * @return  The number of client connections that have been closed.
   * @return The number of client connections that have been closed.
   */
  public long getConnectionsClosed()
  {
@@ -869,7 +864,7 @@
  /**
   * Retrieves the number of bytes that have been received from clients.
   *
   * @return  The number of bytes that have been received from clients.
   * @return The number of bytes that have been received from clients.
   */
  public long getBytesRead()
  {
@@ -884,7 +879,7 @@
  /**
   * Retrieves the number of bytes that have been written to clients.
   *
   * @return  The number of bytes that have been written to clients.
   * @return The number of bytes that have been written to clients.
   */
  public long getBytesWritten()
  {
@@ -897,9 +892,11 @@
  /**
   * Retrieves the number of LDAP messages that have been received from clients.
   * Retrieves the number of LDAP messages that have been received from
   * clients.
   *
   * @return  The number of LDAP messages that have been received from clients.
   * @return The number of LDAP messages that have been received from
   *         clients.
   */
  public long getMessagesRead()
  {
@@ -912,9 +909,11 @@
  /**
   * Retrieves the number of LDAP messages that have been written to clients.
   * Retrieves the number of LDAP messages that have been written to
   * clients.
   *
   * @return  The number of LDAP messages that have been written to clients.
   * @return The number of LDAP messages that have been written to
   *         clients.
   */
  public long getMessagesWritten()
  {
@@ -927,9 +926,11 @@
  /**
   * Retrieves the number of operations that have been initiated by clients.
   * Retrieves the number of operations that have been initiated by
   * clients.
   *
   * @return  The number of operations that have been initiated by clients.
   * @return The number of operations that have been initiated by
   *         clients.
   */
  public long getOperationsInitiated()
  {
@@ -942,11 +943,11 @@
  /**
   * Retrieves the number of operations for which the server has completed
   * processing.
   * Retrieves the number of operations for which the server has
   * completed processing.
   *
   * @return  The number of operations for which the server has completed
   *          processing.
   * @return The number of operations for which the server has completed
   *         processing.
   */
  public long getOperationsCompleted()
  {
@@ -959,9 +960,11 @@
  /**
   * Retrieves the number of operations that have been abandoned by clients.
   * Retrieves the number of operations that have been abandoned by
   * clients.
   *
   * @return  The number of operations that have been abandoned by clients.
   * @return The number of operations that have been abandoned by
   *         clients.
   */
  public long getOperationsAbandoned()
  {
@@ -976,7 +979,7 @@
  /**
   * Retrieves the number of abandon requests that have been received.
   *
   * @return  The number of abandon requests that have been received.
   * @return The number of abandon requests that have been received.
   */
  public long getAbandonRequests()
  {
@@ -991,7 +994,7 @@
  /**
   * Retrieves the number of add requests that have been received.
   *
   * @return  The number of add requests that have been received.
   * @return The number of add requests that have been received.
   */
  public long getAddRequests()
  {
@@ -1006,7 +1009,7 @@
  /**
   * Retrieves the number of add responses that have been sent.
   *
   * @return  The number of add responses that have been sent.
   * @return The number of add responses that have been sent.
   */
  public long getAddResponses()
  {
@@ -1021,7 +1024,7 @@
  /**
   * Retrieves the number of bind requests that have been received.
   *
   * @return  The number of bind requests that have been received.
   * @return The number of bind requests that have been received.
   */
  public long getBindRequests()
  {
@@ -1036,7 +1039,7 @@
  /**
   * Retrieves the number of bind responses that have been sent.
   *
   * @return  The number of bind responses that have been sent.
   * @return The number of bind responses that have been sent.
   */
  public long getBindResponses()
  {
@@ -1051,7 +1054,7 @@
  /**
   * Retrieves the number of compare requests that have been received.
   *
   * @return  The number of compare requests that have been received.
   * @return The number of compare requests that have been received.
   */
  public long getCompareRequests()
  {
@@ -1066,7 +1069,7 @@
  /**
   * Retrieves the number of compare responses that have been sent.
   *
   * @return  The number of compare responses that have been sent.
   * @return The number of compare responses that have been sent.
   */
  public long getCompareResponses()
  {
@@ -1081,7 +1084,7 @@
  /**
   * Retrieves the number of delete requests that have been received.
   *
   * @return  The number of delete requests that have been received.
   * @return The number of delete requests that have been received.
   */
  public long getDeleteRequests()
  {
@@ -1096,7 +1099,7 @@
  /**
   * Retrieves the number of delete responses that have been sent.
   *
   * @return  The number of delete responses that have been sent.
   * @return The number of delete responses that have been sent.
   */
  public long getDeleteResponses()
  {
@@ -1111,7 +1114,7 @@
  /**
   * Retrieves the number of extended requests that have been received.
   *
   * @return  The number of extended requests that have been received.
   * @return The number of extended requests that have been received.
   */
  public long getExtendedRequests()
  {
@@ -1126,7 +1129,7 @@
  /**
   * Retrieves the number of extended responses that have been sent.
   *
   * @return  The number of extended responses that have been sent.
   * @return The number of extended responses that have been sent.
   */
  public long getExtendedResponses()
  {
@@ -1141,7 +1144,7 @@
  /**
   * Retrieves the number of modify requests that have been received.
   *
   * @return  The number of modify requests that have been received.
   * @return The number of modify requests that have been received.
   */
  public long getModifyRequests()
  {
@@ -1156,7 +1159,7 @@
  /**
   * Retrieves the number of modify responses that have been sent.
   *
   * @return  The number of modify responses that have been sent.
   * @return The number of modify responses that have been sent.
   */
  public long getModifyResponses()
  {
@@ -1171,7 +1174,7 @@
  /**
   * Retrieves the number of modify DN requests that have been received.
   *
   * @return  The number of modify DN requests that have been received.
   * @return The number of modify DN requests that have been received.
   */
  public long getModifyDNRequests()
  {
@@ -1186,7 +1189,7 @@
  /**
   * Retrieves the number of modify DN responses that have been sent.
   *
   * @return  The number of modify DN responses that have been sent.
   * @return The number of modify DN responses that have been sent.
   */
  public long getModifyDNResponses()
  {
@@ -1201,7 +1204,7 @@
  /**
   * Retrieves the number of search requests that have been received.
   *
   * @return  The number of search requests that have been received.
   * @return The number of search requests that have been received.
   */
  public long getSearchRequests()
  {
@@ -1216,7 +1219,7 @@
  /**
   * Retrieves the number of search result entries that have been sent.
   *
   * @return  The number of search result entries that have been sent.
   * @return The number of search result entries that have been sent.
   */
  public long getSearchResultEntries()
  {
@@ -1229,9 +1232,10 @@
  /**
   * Retrieves the number of search result references that have been sent.
   * Retrieves the number of search result references that have been
   * sent.
   *
   * @return  The number of search result references that have been sent.
   * @return The number of search result references that have been sent.
   */
  public long getSearchResultReferences()
  {
@@ -1244,9 +1248,11 @@
  /**
   * Retrieves the number of search result done messages that have been sent.
   * Retrieves the number of search result done messages that have been
   * sent.
   *
   * @return  The number of search result done messages that have been sent.
   * @return The number of search result done messages that have been
   *         sent.
   */
  public long getSearchResultsDone()
  {
@@ -1261,7 +1267,7 @@
  /**
   * Retrieves the number of unbind requests that have been received.
   *
   * @return  The number of unbind requests that have been received.
   * @return The number of unbind requests that have been received.
   */
  public long getUnbindRequests()
  {
@@ -1274,61 +1280,69 @@
  /**
   * Retrieves the parent statistics tracker that will also be updated whenever
   * this tracker is updated.
   * Retrieves the parent statistics tracker that will also be updated
   * whenever this tracker is updated.
   *
   * @return  The parent statistics tracker, or {@code null} if there is none.
   * @return The parent statistics tracker, or {@code null} if there is
   *         none.
   */
  public LDAPStatistics getParent()
  {
    return parent;
  }
   /**
     * Updates the monitor object.
     * @param opMonitor monitor object.
     */
    public void updateMonitor(OperationMonitor opMonitor) {
        synchronized (readLock) {
            switch (opMonitor.getType()) {
                case ABANDON:
                    this.abandonRequestsMonitor.add(opMonitor);
                    break;
                case ADD:
                    this.addRequestsMonitor.add(opMonitor);
                    break;
                case BIND:
                    this.bindRequestsMonitor.add(opMonitor);
                    break;
                case COMPARE:
                    this.compareRequestsMonitor.add(opMonitor);
                    break;
                case DELETE:
                    this.delRequestsMonitor.add(opMonitor);
                    break;
                case EXTENDED:
                    this.extendedRequestsMonitor.add(opMonitor);
                    break;
                case MODIFY:
                    this.modRequestsMonitor.add(opMonitor);
                    break;
                case MODIFY_DN:
                    this.moddnRequestsMonitor.add(opMonitor);
                    break;
                case SEARCH:
                    this.searchRequestsMonitor.add(opMonitor);
                    break;
                case UNBIND:
                    this.unbindRequestsMonitor.add(opMonitor);
                    break;
                default:
            }
            if (parent!=null) {
                parent.updateMonitor(opMonitor);
            }
            opMonitor.reset();
        }
  /**
   * Updates the monitor object.
   *
   * @param opMonitor
   *          monitor object.
   */
  public void updateMonitor(OperationMonitor opMonitor)
  {
    synchronized (readLock)
    {
      switch (opMonitor.getType())
      {
      case ABANDON:
        this.abandonRequestsMonitor.add(opMonitor);
        break;
      case ADD:
        this.addRequestsMonitor.add(opMonitor);
        break;
      case BIND:
        this.bindRequestsMonitor.add(opMonitor);
        break;
      case COMPARE:
        this.compareRequestsMonitor.add(opMonitor);
        break;
      case DELETE:
        this.delRequestsMonitor.add(opMonitor);
        break;
      case EXTENDED:
        this.extendedRequestsMonitor.add(opMonitor);
        break;
      case MODIFY:
        this.modRequestsMonitor.add(opMonitor);
        break;
      case MODIFY_DN:
        this.moddnRequestsMonitor.add(opMonitor);
        break;
      case SEARCH:
        this.searchRequestsMonitor.add(opMonitor);
        break;
      case UNBIND:
        this.unbindRequestsMonitor.add(opMonitor);
        break;
      default:
      }
      if (parent != null)
      {
        parent.updateMonitor(opMonitor);
      }
      opMonitor.reset();
    }
  }
}