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

Jean-Noël Rouvignac
03.43.2016 09484dd10bba52e2bc2c7bc2ce742e4a8e58a8be
Added MonitorData class to simplify writing monitored objects
1 files added
37 files modified
1936 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/api/EntryCache.java 3 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/api/MonitorData.java 226 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/api/MonitorProvider.java 9 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/MonitorBackend.java 20 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/JEMonitor.java 58 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pdb/PDBMonitor.java 68 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendMonitor.java 54 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/config/JMXMBean.java 48 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/DefaultEntryCache.java 10 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/DiskSpaceMonitor.java 22 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/EntryCacheCommon.java 69 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/FIFOEntryCache.java 23 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/SoftReferenceEntryCache.java 13 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/monitors/BackendMonitor.java 72 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/monitors/ClientConnectionMonitorProvider.java 45 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/monitors/ConnectionHandlerMonitor.java 63 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/monitors/EntryCacheMonitorProvider.java 17 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/monitors/MemoryUsageMonitorProvider.java 30 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/monitors/ParallelWorkQueueMonitor.java 40 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/monitors/StackTraceMonitorProvider.java 73 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/monitors/SystemInfoMonitorProvider.java 76 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/monitors/TraditionalWorkQueueMonitor.java 45 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/monitors/VersionMonitorProvider.java 39 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/protocols/http/HTTPStatistics.java 33 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPStatistics.java 194 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/LDAPReplicationDomain.java 31 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/server/DataServerHandler.java 67 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/server/LightweightServerHandler.java 62 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/server/MessageHandler.java 18 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServerDomain.java 29 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServerHandler.java 34 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/server/ServerHandler.java 77 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDB.java 20 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileReplicaDB.java 23 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/service/ReplicationDomain.java 37 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/service/ReplicationMonitor.java 118 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/monitors/TestMonitorProvider.java 18 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/replication/StressTest.java 52 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/api/EntryCache.java
@@ -26,7 +26,6 @@
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.EntryCacheCfg;
import org.opends.server.monitors.EntryCacheMonitorProvider;
import org.opends.server.types.Attribute;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
@@ -348,7 +347,7 @@
   *          be returned to the client if the corresponding monitor
   *          entry is requested.
   */
  public abstract List<Attribute> getMonitorData();
  public abstract MonitorData getMonitorData();
  /**
   * Retrieves the current number of entries stored within the cache.
opendj-server-legacy/src/main/java/org/opends/server/api/MonitorData.java
New file
@@ -0,0 +1,226 @@
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2016 ForgeRock AS.
 */
package org.opends.server.api;
import static org.opends.server.core.DirectoryServer.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.GeneralizedTime;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.ldap.schema.CoreSchema;
import org.forgerock.opendj.ldap.schema.Syntax;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.Attributes;
import org.opends.server.types.PublicAPI;
import org.opends.server.types.StabilityLevel;
/**
 * This class is used to hold monitoring data, i.e. a list of attributes. It provides convenient
 * methods to easily build such data.
 * <p>
 * <strong>Note:</strong> <br>
 * Creating monitor entries may become a lot easier once we've migrated to the SDK Entry class:
 *
 * <pre>
 * Entry entry = ...;
 * entry.addAttribute("stringStat", "aString")
 *       .addAttribute("integerStat", 12345)
 *       .addAttribute("dnStat", DN.valueOf("dc=aDN");
 * </pre>
 *
 * We could also envisage an annotation based approach where we determine the monitor content from
 * annotated fields/methods in an object.
 */
@PublicAPI(stability = StabilityLevel.PRIVATE)
public final class MonitorData implements Iterable<Attribute>
{
  private final List<Attribute> attrs;
  /** Constructor to use when the number of attributes to create is unknown. */
  public MonitorData()
  {
    attrs = new ArrayList<>();
  }
  /**
   * Constructor that accepts the number of attributes to create.
   *
   * @param expectedAttributesCount
   *          number of attributes that will be added
   */
  public MonitorData(int expectedAttributesCount)
  {
    attrs = new ArrayList<>(expectedAttributesCount);
  }
  /**
   * Adds an attribute with the provided name and value.
   *
   * @param attrName
   *          the attribute name
   * @param attrValue
   *          the attribute value
   */
  public void add(String attrName, Object attrValue)
  {
    Syntax syntax;
    if (attrValue instanceof String
        || attrValue instanceof ByteString
        || attrValue instanceof Float
        || attrValue instanceof Double)
    {
      // coming first because they are the most common types
      syntax = getDefaultStringSyntax();
    }
    else if (attrValue instanceof Number)
    {
      syntax = getDefaultIntegerSyntax();
    }
    else if (attrValue instanceof Boolean)
    {
      syntax = getDefaultBooleanSyntax();
    }
    else if (attrValue instanceof DN)
    {
      syntax = getDefaultDNSyntax();
    }
    else if (attrValue instanceof Date)
    {
      syntax = CoreSchema.getGeneralizedTimeSyntax();
      attrValue = GeneralizedTime.valueOf((Date) attrValue);
    }
    else if (attrValue instanceof Calendar)
    {
      syntax = CoreSchema.getGeneralizedTimeSyntax();
      attrValue = GeneralizedTime.valueOf((Calendar) attrValue);
    }
    else if (attrValue instanceof UUID)
    {
      syntax = CoreSchema.getUUIDSyntax();
    }
    else
    {
      syntax = getDefaultStringSyntax();
    }
    add(attrName, syntax, attrValue);
  }
  private void add(String attrName, Syntax syntax, Object attrValue)
  {
    AttributeType attrType = getAttributeType(attrName, syntax);
    attrs.add(Attributes.create(attrType, String.valueOf(attrValue)));
  }
  /**
   * Adds an attribute with the provided name and value if the value is not null.
   *
   * @param attrName
   *          the attribute name
   * @param attrValue
   *          the attribute value
   */
  public void addIfNotNull(String attrName, Object attrValue)
  {
    if (attrValue != null)
    {
      add(attrName, attrValue);
    }
  }
  /**
   * Adds an attribute with the provided name and values.
   *
   * @param attrName
   *          the attribute name
   * @param attrValues
   *          the attribute values
   */
  public void add(String attrName, Collection<?> attrValues)
  {
    AttributeBuilder builder = new AttributeBuilder(attrName);
    builder.addAllStrings(attrValues);
    attrs.add(builder.toAttribute());
  }
  /**
   * Adds all the properties from the provided bean as attributes, prepending the provided prefix.
   *
   * @param bean
   *          the bean from which to read the properties
   * @param attributesPrefix
   *          the prefix to prepend to the attributes read from the bean
   * @throws ReflectiveOperationException
   *           if a problem occurs while reading the properties of the bean
   */
  public void addBean(Object bean, String attributesPrefix) throws ReflectiveOperationException
  {
    for (Method method : bean.getClass().getMethods())
    {
      if (method.getName().startsWith("get"))
      {
        Class<?> returnType = method.getReturnType();
        if (returnType.equals(int.class) || returnType.equals(long.class) || returnType.equals(String.class))
        {
          addStatAttribute(attributesPrefix, bean, method, 3);
        }
      }
      else if (method.getName().startsWith("is") && method.getReturnType().equals(boolean.class))
      {
        addStatAttribute(attributesPrefix, bean, method, 2);
      }
    }
  }
  private void addStatAttribute(String attrPrefix, Object stats, Method method, int skipNameLen)
      throws ReflectiveOperationException
  {
    String attrName = attrPrefix + method.getName().substring(skipNameLen);
    add(attrName, method.invoke(stats));
  }
  @Override
  public Iterator<Attribute> iterator()
  {
    return attrs.iterator();
  }
  /**
   * Returns the number of attributes.
   *
   * @return the number of attributes
   */
  public int size()
  {
    return attrs.size();
  }
  @Override
  public String toString()
  {
    return getClass().getName() + attrs;
  }
}
opendj-server-legacy/src/main/java/org/opends/server/api/MonitorProvider.java
@@ -12,10 +12,12 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2006-2010 Sun Microsystems, Inc.
 * Portions Copyright 2014-2015 ForgeRock AS.
 * Portions Copyright 2014-2016 ForgeRock AS.
 */
package org.opends.server.api;
import static org.opends.server.util.ServerConstants.*;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -26,13 +28,10 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.types.Attribute;
import org.opends.server.types.DirectoryConfig;
import org.opends.server.types.InitializationException;
import org.opends.server.types.ObjectClass;
import static org.opends.server.util.ServerConstants.*;
/**
 * This class defines the set of methods and structures that must be
 * implemented by a Directory Server module that can provide usage,
@@ -197,6 +196,6 @@
   *          be returned to the client if the corresponding monitor
   *          entry is requested.
   */
  public abstract List<Attribute> getMonitorData();
  public abstract MonitorData getMonitorData();
}
opendj-server-legacy/src/main/java/org/opends/server/backends/MonitorBackend.java
@@ -51,6 +51,7 @@
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.MonitorBackendCfg;
import org.opends.server.api.Backend;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.config.ConfigEntry;
import org.opends.server.core.AddOperation;
@@ -781,31 +782,34 @@
    final ObjectClass monitorOC = monitorProvider.getMonitorObjectClass();
    final HashMap<ObjectClass, String> monitorClasses = newObjectClasses(monitorOC, monitorOC.getPrimaryName());
    final List<Attribute> monitorAttrs = monitorProvider.getMonitorData();
    final HashMap<AttributeType, List<Attribute>> attrMap = new LinkedHashMap<>(monitorAttrs.size() + 1);
    final MonitorData monitorAttrs = monitorProvider.getMonitorData();
    final Map<AttributeType, List<Attribute>> attrMap = asMap(monitorAttrs);
    // Make sure to include the RDN attribute.
    final AVA ava = entryDN.rdn().getFirstAVA();
    final AttributeType rdnType = ava.getAttributeType();
    final ByteString rdnValue = ava.getAttributeValue();
    attrMap.put(rdnType, Attributes.createAsList(rdnType, rdnValue));
    // Take the rest of the information from the monitor data.
    return newEntry(entryDN, monitorClasses, attrMap, new HashMap<AttributeType, List<Attribute>>(0));
  }
  private Map<AttributeType, List<Attribute>> asMap(MonitorData monitorAttrs)
  {
    final Map<AttributeType, List<Attribute>> results = new LinkedHashMap<>(monitorAttrs.size() + 1);
    for (final Attribute a : monitorAttrs)
    {
      final AttributeType type = a.getAttributeDescription().getAttributeType();
      List<Attribute> attrs = attrMap.get(type);
      List<Attribute> attrs = results.get(type);
      if (attrs == null)
      {
        attrs = new ArrayList<>();
        attrMap.put(type, attrs);
        results.put(type, attrs);
      }
      attrs.add(a);
    }
    return newEntry(entryDN, monitorClasses, attrMap, new HashMap<AttributeType, List<Attribute>>(0));
    return results;
  }
  private HashMap<ObjectClass, String> newObjectClasses(ObjectClass objectClass, String objectClassName)
opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/JEMonitor.java
@@ -18,19 +18,10 @@
import static org.opends.server.util.StaticUtils.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.ldap.schema.Syntax;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import com.sleepycat.je.Environment;
import com.sleepycat.je.JEVersion;
@@ -59,54 +50,25 @@
  }
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    try
    {
      List<Attribute> monitorAttrs = new ArrayList<>();
      final StatsConfig statsConfig = new StatsConfig();
      monitorAttrs.add(Attributes.create("JEVersion", JEVersion.CURRENT_VERSION.getVersionString()));
      StatsConfig statsConfig = new StatsConfig();
      addAttributesForStatsObject(monitorAttrs, "Environment", env.getStats(statsConfig));
      addAttributesForStatsObject(monitorAttrs, "Transaction", env.getTransactionStats(statsConfig));
      final MonitorData monitorAttrs = new MonitorData();
      monitorAttrs.add("JEVersion", JEVersion.CURRENT_VERSION.getVersionString());
      monitorAttrs.addBean(env.getStats(statsConfig), "Environment");
      monitorAttrs.addBean(env.getTransactionStats(statsConfig), "Transaction");
      return monitorAttrs;
    }
    catch (Exception e)
    {
      logger.traceException(e);
      return Collections.singletonList(Attributes.create("JEInfo", stackTraceToSingleLineString(e)));
    }
  }
  private void addAttributesForStatsObject(List<Attribute> monitorAttrs, String attrPrefix, Object stats)
  {
    for (Method method : stats.getClass().getMethods())
    {
      final Class<?> returnType = method.getReturnType();
      if (method.getName().startsWith("get")
          && (returnType.equals(int.class) || returnType.equals(long.class)))
      {
        addStatAttribute(monitorAttrs, attrPrefix, stats, method);
      }
    }
  }
  private void addStatAttribute(List<Attribute> monitorAttrs, String attrPrefix, Object stats, Method method)
  {
    final Syntax integerSyntax = DirectoryServer.getDefaultIntegerSyntax();
    try
    {
      // Remove the 'get' from the method name and add the prefix.
      String attrName = attrPrefix + method.getName().substring(3);
      AttributeType attrType = DirectoryServer.getAttributeType(attrName, integerSyntax);
      monitorAttrs.add(Attributes.create(attrType, String.valueOf(method.invoke(stats))));
    }
    catch (Exception e)
    {
      logger.traceException(e);
      MonitorData monitorAttrs = new MonitorData(1);
      monitorAttrs.add("JEInfo", stackTraceToSingleLineString(e));
      return monitorAttrs;
    }
  }
}
opendj-server-legacy/src/main/java/org/opends/server/backends/pdb/PDBMonitor.java
@@ -11,27 +11,21 @@
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2015 ForgeRock AS.
 * Copyright 2015-2016 ForgeRock AS.
 */
package org.opends.server.backends.pdb;
import static org.opends.server.util.StaticUtils.*;
import java.lang.reflect.Method;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import com.persistit.Management.BufferPoolInfo;
import com.persistit.Management.TreeInfo;
import com.persistit.Management.VolumeInfo;
import com.persistit.Management.WrappedRemoteException;
import com.persistit.Persistit;
/** Monitoring class for PDB, populating cn=monitor statistics using reflection on objects methods. */
@@ -53,71 +47,39 @@
  }
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    try
    {
      List<Attribute> monitorAttrs = new ArrayList<>();
      monitorAttrs.add(Attributes.create("PDBVersion", db.getManagement().getVersion()));
      MonitorData monitorAttrs = new MonitorData();
      monitorAttrs.add("PDBVersion", db.getManagement().getVersion());
      for(BufferPoolInfo bufferInfo : db.getManagement().getBufferPoolInfoArray())
      {
        addAttributesForStatsObject(monitorAttrs, "PDBBuffer", bufferInfo);
        monitorAttrs.addBean(bufferInfo, "PDBBuffer");
      }
      addAttributesForStatsObject(monitorAttrs, "PDBJournal", db.getManagement().getJournalInfo());
      addAttributesForStatsObject(monitorAttrs, "PDBTransaction", db.getManagement().getTransactionInfo());
      monitorAttrs.addBean(db.getManagement().getJournalInfo(), "PDBJournal");
      monitorAttrs.addBean(db.getManagement().getTransactionInfo(), "PDBTransaction");
      for (VolumeInfo vol : db.getManagement().getVolumeInfoArray())
      {
        addAttributesForStatsObject(monitorAttrs, "PDBVolume", vol);
        monitorAttrs.addBean(vol, "PDBVolume");
        for (TreeInfo tree : db.getManagement().getTreeInfoArray(vol.getName()))
        {
          // For the time being, depth is not reported.
          monitorAttrs.add(Attributes.create("PDBVolumeTree", vol.getName() + tree.getName()
          monitorAttrs.add("PDBVolumeTree", vol.getName() + tree.getName()
              + ", traverse=" + tree.getTraverseCounter()
              + ", fetch=" + tree.getFetchCounter()
              + ", store=" + tree.getStoreCounter()
              + ", remove=" + tree.getRemoveCounter()));
              + ", remove=" + tree.getRemoveCounter());
        }
      }
      return monitorAttrs;
    }
    catch (RemoteException e)
    catch (ReflectiveOperationException | RemoteException e)
    {
      return Collections.singletonList(Attributes.create("PDBInfo", stackTraceToSingleLineString(e)));
    }
  }
  private void addAttributesForStatsObject(List<Attribute> monitorAttrs, String attrPrefix, Object stats)
    throws RemoteException
  {
    for (Method method : stats.getClass().getMethods())
    {
      if (method.getName().startsWith("get"))
      {
        Class<?> returnType = method.getReturnType();
        if (returnType.equals(int.class) || returnType.equals(long.class) || returnType.equals(String.class))
        {
          addStatAttribute(monitorAttrs, attrPrefix, stats, method, 3);
        }
      }
      else if (method.getName().startsWith("is") && method.getReturnType().equals(boolean.class))
      {
        addStatAttribute(monitorAttrs, attrPrefix, stats, method, 2);
      }
    }
  }
  private void addStatAttribute(List<Attribute> monitorAttrs, String attrPrefix, Object stats,
      Method method, int skipNameLen) throws WrappedRemoteException
  {
    try
    {
      String attrName = attrPrefix + method.getName().substring(skipNameLen);
      monitorAttrs.add(Attributes.create(attrName, String.valueOf(method.invoke(stats))));
    }
    catch (Exception e)
    {
      throw new WrappedRemoteException(e);
      MonitorData monitorAttrs = new MonitorData(1);
      monitorAttrs.add("PDBInfo", stackTraceToSingleLineString(e));
      return monitorAttrs;
    }
  }
}
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendMonitor.java
@@ -12,11 +12,12 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2006-2010 Sun Microsystems, Inc.
 * Portions Copyright 2014-2015 ForgeRock AS.
 * Portions Copyright 2014-2016 ForgeRock AS.
 */
package org.opends.server.backends.pluggable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -25,10 +26,8 @@
import org.forgerock.i18n.LocalizableMessage;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.Attributes;
import org.opends.server.types.SearchFilter;
import org.opends.server.util.TimeThread;
@@ -100,55 +99,47 @@
    return name;
  }
  /**
   * 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.
   */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    List<Attribute> monitorAttrs = new ArrayList<>();
    MonitorData monitorAttrs = new MonitorData(5);
    AttributeBuilder needReindex = createNeedReindex("need-reindex");
    if (needReindex.size() > 0)
    Collection<String> needReindexValues = createNeedReindexValues();
    if (needReindexValues.size() > 0)
    {
      monitorAttrs.add(needReindex.toAttribute());
      monitorAttrs.add("need-reindex", needReindexValues);
    }
    if (filterUseEnabled)
    {
      monitorAttrs.add(createAttribute("filter-use-startTime", startTimeStamp));
      monitorAttrs.add(createFilterUse("filter-use"));
      monitorAttrs.add(createAttribute("filter-use-indexed", indexedSearchCount));
      monitorAttrs.add(createAttribute("filter-use-unindexed", unindexedSearchCount));
      monitorAttrs.add("filter-use-startTime", startTimeStamp);
      monitorAttrs.add("filter-use", createFilterUseValues());
      monitorAttrs.add("filter-use-indexed", indexedSearchCount);
      monitorAttrs.add("filter-use-unindexed", unindexedSearchCount);
    }
    return monitorAttrs;
  }
  private AttributeBuilder createNeedReindex(String attrName)
  private Collection<String> createNeedReindexValues()
  {
    AttributeBuilder needReindex = new AttributeBuilder(attrName);
    Collection<String> values = new ArrayList<>();
    for (EntryContainer ec : rootContainer.getEntryContainers())
    {
      for (Tree tree : ec.listTrees())
      {
        if (tree instanceof Index && !((Index) tree).isTrusted())
        {
          needReindex.add(tree.getName().toString());
          values.add(tree.getName().toString());
        }
      }
    }
    return needReindex;
    return values;
  }
  private Attribute createFilterUse(String attrName)
  private List<String> createFilterUseValues()
  {
    AttributeBuilder builder = new AttributeBuilder(attrName);
    List<String> values = new ArrayList<>();
    StringBuilder value = new StringBuilder();
    synchronized (filterToStats)
    {
@@ -158,16 +149,11 @@
        value.append(" hits:").append(entry.getValue().hits.get());
        value.append(" maxmatches:").append(entry.getValue().maxMatchingEntries);
        value.append(" message:").append(entry.getValue().failureReason);
        builder.add(value.toString());
        values.add(value.toString());
        value.setLength(0);
      }
    }
    return builder.toAttribute();
  }
  private Attribute createAttribute(String attrName, Object value)
  {
    return Attributes.create(attrName, String.valueOf(value));
    return values;
  }
  /**
opendj-server-legacy/src/main/java/org/opends/server/config/JMXMBean.java
@@ -42,6 +42,7 @@
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchScope;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.AlertGenerator;
import org.opends.server.api.ClientConnection;
@@ -54,7 +55,6 @@
import org.opends.server.protocols.internal.SearchRequest;
import org.opends.server.protocols.jmx.Credential;
import org.opends.server.protocols.jmx.JmxClientConnection;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.InvokableMethod;
@@ -413,8 +413,7 @@
              stringValues.add(value.toString());
            }
            String[] valueArray = new String[stringValues.size()];
            stringValues.toArray(valueArray);
            String[] valueArray = stringValues.toArray(new String[stringValues.size()]);
            return new Attribute(name, valueArray);
          }
          else
@@ -568,47 +567,10 @@
      {
        logger.traceException(e);
      }
      // It's possible that this is a monitor attribute rather than a
      // configurable one. Check all of those.
      AttributeType attrType = DirectoryServer.getAttributeType(name);
monitorLoop:
      for (MonitorProvider<? extends MonitorProviderCfg> monitor :
           monitorProviders)
      Attribute attr = getJmxAttribute(name);
      if (attr != null)
      {
        for (org.opends.server.types.Attribute a : monitor.getMonitorData())
        {
          if (attrType.equals(a.getAttributeDescription().getAttributeType()))
          {
            if (a.isEmpty())
            {
              continue;
            }
            Iterator<ByteString> iterator = a.iterator();
            ByteString value = iterator.next();
            if (iterator.hasNext())
            {
              List<String> stringValues = newArrayList(value.toString());
              while (iterator.hasNext())
              {
                value = iterator.next();
                stringValues.add(value.toString());
              }
              String[] valueArray = new String[stringValues.size()];
              stringValues.toArray(valueArray);
              attrList.add(new Attribute(name, valueArray));
            }
            else
            {
              attrList.add(new Attribute(name, value.toString()));
            }
            break monitorLoop;
          }
        }
        attrList.add(attr);
      }
    }
opendj-server-legacy/src/main/java/org/opends/server/extensions/DefaultEntryCache.java
@@ -16,21 +16,20 @@
 */
package org.opends.server.extensions;
import java.util.Collections;
import java.util.List;
import java.util.SortedMap;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.EntryCacheCfg;
import org.opends.server.api.Backend;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.EntryCache;
import org.opends.server.api.MonitorData;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.Attribute;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
@@ -276,9 +275,8 @@
    return new ConfigChangeResult();
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    // The sum of cache hits of all active entry cache implementations.
    long entryCacheHits = 0;
@@ -304,7 +302,7 @@
        );
    } catch (Exception e) {
      logger.traceException(e);
      return Collections.emptyList();
      return new MonitorData(0);
    }
  }
opendj-server-legacy/src/main/java/org/opends/server/extensions/DiskSpaceMonitor.java
@@ -17,7 +17,6 @@
package org.opends.server.extensions;
import static org.opends.messages.CoreMessages.*;
import static org.opends.server.core.DirectoryServer.*;
import static org.opends.server.util.CollectionUtils.*;
import static org.opends.server.util.ServerConstants.*;
@@ -45,6 +44,7 @@
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.AlertGenerator;
import org.opends.server.api.DiskSpaceMonitorHandler;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.api.ServerShutdownListener;
import org.opends.server.core.DirectoryServer;
@@ -96,13 +96,13 @@
        throws ConfigException, InitializationException {
    }
    /** {@inheritDoc} */
    @Override
    public List<Attribute> getMonitorData() {
      final List<Attribute> monitorAttrs = new ArrayList<>();
      monitorAttrs.add(attr("disk-dir", getDefaultStringSyntax(), directory.getPath()));
      monitorAttrs.add(attr("disk-free", getDefaultIntegerSyntax(), getFreeSpace()));
      monitorAttrs.add(attr("disk-state", getDefaultStringSyntax(), getState()));
    public MonitorData getMonitorData()
    {
      final MonitorData monitorAttrs = new MonitorData(3);
      monitorAttrs.add("disk-dir", directory.getPath());
      monitorAttrs.add("disk-free", getFreeSpace());
      monitorAttrs.add("disk-state", getState());
      return monitorAttrs;
    }
@@ -353,19 +353,17 @@
    // Not used...
  }
  /** {@inheritDoc} */
  @Override
  public String getMonitorInstanceName() {
    return INSTANCENAME;
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData() {
    return new ArrayList<>();
  public MonitorData getMonitorData()
  {
    return new MonitorData(0);
  }
  /** {@inheritDoc} */
  @Override
  public void run()
  {
opendj-server-legacy/src/main/java/org/opends/server/extensions/EntryCacheCommon.java
@@ -16,11 +16,8 @@
 */
package org.opends.server.extensions;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import static org.opends.server.util.StaticUtils.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -28,18 +25,14 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageDescriptor;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.DirectoryException;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.api.MonitorData;
import org.opends.server.types.SearchFilter;
/**
 * This class provides some common tools to all entry cache implementations.
 */
/** This class provides some common tools to all entry cache implementations. */
public class EntryCacheCommon
{
@@ -53,19 +46,11 @@
   */
  public static enum ConfigPhase
  {
    /**
     * Indicates that entry cache is in initialization check phase.
     */
    /** Indicates that entry cache is in initialization check phase. */
    PHASE_INIT,
    /**
     * Indicates that entry cache is in configuration check phase.
     */
    /** Indicates that entry cache is in configuration check phase. */
    PHASE_ACCEPTABLE,
    /**
     * Indicates that entry cache is applying its configuration.
     */
    /** Indicates that entry cache is applying its configuration. */
    PHASE_APPLY
  }
@@ -360,7 +345,7 @@
   *
   * @return  A set of generic attributes containing monitor data.
   */
  public static List<Attribute> getGenericMonitorData(
  public static MonitorData getGenericMonitorData(
    Long cacheHits,
    Long cacheMisses,
    Long cacheSize,
@@ -368,54 +353,30 @@
    Long cacheCount,
    Long maxCacheCount)
  {
    List<Attribute> attrs = new ArrayList<>();
    MonitorData attrs = new MonitorData();
    if (cacheHits != null)
    {
      attrs
          .add(Attributes.create("entryCacheHits", cacheHits.toString()));
      attrs.add("entryCacheHits", cacheHits);
      // Cache misses is required to get cache tries and hit ratio.
      if (cacheMisses != null)
      {
        Long cacheTries = cacheHits + cacheMisses;
        attrs.add(Attributes.create("entryCacheTries", cacheTries
            .toString()));
        attrs.add("entryCacheTries", cacheTries);
        Double hitRatioRaw = cacheTries > 0 ? cacheHits.doubleValue()
            / cacheTries.doubleValue() : cacheHits.doubleValue() / 1;
        Double hitRatio = hitRatioRaw * 100D;
        attrs.add(Attributes.create("entryCacheHitRatio", Long
            .toString(hitRatio.longValue())));
        attrs.add("entryCacheHitRatio", hitRatio);
      }
    }
    if (cacheSize != null)
    {
      attrs.add(Attributes.create("currentEntryCacheSize", cacheSize
          .toString()));
    }
    if (maxCacheSize != null)
    {
      attrs.add(Attributes.create("maxEntryCacheSize", maxCacheSize
          .toString()));
    }
    if (cacheCount != null)
    {
      attrs.add(Attributes.create("currentEntryCacheCount", cacheCount
          .toString()));
    }
    if (maxCacheCount != null)
    {
      attrs.add(Attributes.create("maxEntryCacheCount", maxCacheCount
          .toString()));
    }
    attrs.addIfNotNull("currentEntryCacheSize", cacheSize);
    attrs.addIfNotNull("maxEntryCacheSize", maxCacheSize);
    attrs.addIfNotNull("currentEntryCacheCount", cacheCount);
    attrs.addIfNotNull("maxEntryCacheCount", maxCacheCount);
    return attrs;
  }
}
opendj-server-legacy/src/main/java/org/opends/server/extensions/FIFOEntryCache.java
@@ -18,7 +18,13 @@
import static org.opends.messages.ExtensionMessages.*;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
@@ -26,18 +32,18 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.util.Utils;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.EntryCacheCfg;
import org.opends.server.admin.std.server.FIFOEntryCacheCfg;
import org.opends.server.api.Backend;
import org.opends.server.api.EntryCache;
import org.opends.server.api.MonitorData;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.Attribute;
import org.opends.server.types.CacheEntry;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
import org.opends.server.types.SearchFilter;
@@ -893,25 +899,24 @@
    return errorHandler.getIsAcceptable();
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    try {
      return EntryCacheCommon.getGenericMonitorData(
        Long.valueOf(cacheHits.longValue()),
        cacheHits.longValue(),
        // If cache misses is maintained by default cache
        // get it from there and if not point to itself.
        DirectoryServer.getEntryCache().getCacheMisses(),
        null,
        Long.valueOf(maxAllowedMemory),
        maxAllowedMemory,
        Long.valueOf(dnMap.size()),
        Long.valueOf(
            (maxEntries != Integer.MAX_VALUE && maxEntries != Long.MAX_VALUE) ? maxEntries : 0)
        );
    } catch (Exception e) {
      logger.traceException(e);
      return Collections.emptyList();
      return new MonitorData(0);
    }
  }
opendj-server-legacy/src/main/java/org/opends/server/extensions/SoftReferenceEntryCache.java
@@ -22,7 +22,6 @@
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -31,6 +30,7 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.util.Utils;
import org.opends.server.admin.server.ConfigurationChangeListener;
@@ -39,10 +39,9 @@
import org.opends.server.api.Backend;
import org.opends.server.api.DirectoryThread;
import org.opends.server.api.EntryCache;
import org.opends.server.api.MonitorData;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.Attribute;
import org.opends.server.types.CacheEntry;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
@@ -530,13 +529,12 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    try {
      return EntryCacheCommon.getGenericMonitorData(
        Long.valueOf(cacheHits.longValue()),
        cacheHits.longValue(),
        // If cache misses is maintained by default cache
        // get it from there and if not point to itself.
        DirectoryServer.getEntryCache().getCacheMisses(),
@@ -547,11 +545,10 @@
        );
    } catch (Exception e) {
      logger.traceException(e);
      return Collections.emptyList();
      return new MonitorData(0);
    }
  }
  /** {@inheritDoc} */
  @Override
  public Long getCacheCount()
  {
opendj-server-legacy/src/main/java/org/opends/server/monitors/BackendMonitor.java
@@ -18,19 +18,18 @@
import static org.opends.server.util.ServerConstants.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Collection;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.Backend;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.opends.server.schema.BooleanSyntax;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.*;
import org.opends.server.types.DirectoryConfig;
import org.opends.server.types.ObjectClass;
/**
 * This class implements a monitor provider that will report generic information
@@ -40,19 +39,6 @@
public class BackendMonitor
       extends MonitorProvider<MonitorProviderCfg>
{
  /** The attribute type that will be used to report the backend ID. */
  private AttributeType backendIDType;
  /** The attribute type that will be used to report the set of base DNs. */
  private AttributeType baseDNType;
  /** The attribute type that will be used to report the number of entries. */
  private AttributeType entryCountType;
  /** The attribute type that will be used to report the number of entries per base DN. */
  private AttributeType baseDNEntryCountType;
  /** The attribute type that will be used to indicate if a backend is private. */
  private AttributeType isPrivateType;
  /** The attribute type that will be used to report the writability mode. */
  private AttributeType writabilityModeType;
  /** The backend with which this monitor is associated. */
  private Backend<?> backend;
@@ -76,13 +62,6 @@
  public void initializeMonitorProvider(MonitorProviderCfg configuration)
  {
    monitorName = backend.getBackendID() + " Backend";
    backendIDType = DirectoryServer.getAttributeType(ATTR_MONITOR_BACKEND_ID);
    baseDNType = DirectoryServer.getAttributeType(ATTR_MONITOR_BACKEND_BASE_DN);
    entryCountType = DirectoryServer.getAttributeType(ATTR_MONITOR_BACKEND_ENTRY_COUNT);
    baseDNEntryCountType = DirectoryServer.getAttributeType(ATTR_MONITOR_BASE_DN_ENTRY_COUNT);
    isPrivateType = DirectoryServer.getAttributeType(ATTR_MONITOR_BACKEND_IS_PRIVATE);
    writabilityModeType = DirectoryServer.getAttributeType(ATTR_MONITOR_BACKEND_WRITABILITY_MODE);
  }
  @Override
@@ -105,26 +84,23 @@
  }
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    LinkedList<Attribute> attrs = new LinkedList<>();
    attrs.add(Attributes.create(backendIDType, backend.getBackendID()));
    DN[] baseDNs = backend.getBaseDNs();
    AttributeBuilder builder = new AttributeBuilder(baseDNType);
    builder.addAllStrings(Arrays.asList(baseDNs));
    attrs.add(builder.toAttribute());
    MonitorData attrs = new MonitorData(6);
    attrs.add(ATTR_MONITOR_BACKEND_ID, backend.getBackendID());
    attrs.add(ATTR_MONITOR_BACKEND_BASE_DN, Arrays.asList(baseDNs));
    attrs.add(ATTR_MONITOR_BACKEND_IS_PRIVATE, backend.isPrivateBackend());
    attrs.add(ATTR_MONITOR_BACKEND_ENTRY_COUNT, backend.getEntryCount());
    attrs.add(ATTR_MONITOR_BASE_DN_ENTRY_COUNT, getBackendEntryCounts(baseDNs));
    attrs.add(ATTR_MONITOR_BACKEND_WRITABILITY_MODE, backend.getWritabilityMode());
    return attrs;
  }
    attrs.add(Attributes.create(isPrivateType, BooleanSyntax
        .createBooleanValue(backend.isPrivateBackend())));
    long backendCount = backend.getEntryCount();
    attrs.add(Attributes.create(entryCountType, String
        .valueOf(backendCount)));
    builder = new AttributeBuilder(baseDNEntryCountType);
  private Collection<String> getBackendEntryCounts(DN[] baseDNs)
  {
    Collection<String> results = new ArrayList<>();
    if (baseDNs.length != 1)
    {
      for (DN dn : baseDNs)
@@ -138,7 +114,7 @@
        {
          logger.traceException(ex);
        }
        builder.add(entryCount + " " + dn);
        results.add(entryCount + " " + dn);
      }
    }
    else
@@ -146,14 +122,8 @@
      // This is done to avoid recalculating the number of entries
      // using the numSubordinates method in the case where the
      // backend has a single base DN.
      builder.add(backendCount + " " + baseDNs[0]);
      results.add(backend.getEntryCount() + " " + baseDNs[0]);
    }
    attrs.add(builder.toAttribute());
    attrs.add(Attributes.create(writabilityModeType, String
        .valueOf(backend.getWritabilityMode())));
    return attrs;
    return results;
  }
}
opendj-server-legacy/src/main/java/org/opends/server/monitors/ClientConnectionMonitorProvider.java
@@ -12,21 +12,21 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2006-2010 Sun Microsystems, Inc.
 * Portions Copyright 2014-2015 ForgeRock AS.
 * Portions Copyright 2014-2016 ForgeRock AS.
 */
package org.opends.server.monitors;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.TreeMap;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.ClientConnectionMonitorProviderCfg;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.ConnectionHandler;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.InitializationException;
/**
@@ -105,24 +105,20 @@
    }
  }
  /**
   * 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.
   */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    // Re-order the connections by connection ID.
    TreeMap<Long, ClientConnection> connMap = new TreeMap<>();
    if (handler == null)
    if (handler != null)
    {
      for (ClientConnection conn : handler.getClientConnections())
      {
        connMap.put(conn.getConnectionID(), conn);
      }
    }
    else
    {
      // Get information about all the available connections.
      for (ConnectionHandler<?> hdl : DirectoryServer.getConnectionHandlers())
@@ -134,19 +130,14 @@
        }
      }
    }
    else
    {
      for (ClientConnection conn : handler.getClientConnections())
      {
        connMap.put(conn.getConnectionID(), conn);
      }
    }
    AttributeBuilder builder = new AttributeBuilder("connection");
    Collection<String> connectionSummaries = new ArrayList<>(connMap.values().size());
    for (ClientConnection conn : connMap.values())
    {
      builder.add(conn.getMonitorSummary());
      connectionSummaries.add(conn.getMonitorSummary());
    }
    return builder.toAttributeList();
    MonitorData result = new MonitorData(1);
    result.add("connection", connectionSummaries);
    return result;
  }
}
opendj-server-legacy/src/main/java/org/opends/server/monitors/ConnectionHandlerMonitor.java
@@ -18,17 +18,19 @@
import static org.opends.server.util.ServerConstants.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.opends.server.admin.std.server.ConnectionHandlerCfg;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.ConnectionHandler;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.*;
import org.opends.server.types.DirectoryConfig;
import org.opends.server.types.HostPort;
import org.opends.server.types.ObjectClass;
/**
 * This class implements a monitor provider that will report generic information
@@ -38,24 +40,6 @@
public class ConnectionHandlerMonitor
       extends MonitorProvider<MonitorProviderCfg>
{
  /** The attribute type that will be used to report the established connections. */
  private AttributeType connectionsType;
  /** The attribute type that will be used to report the listeners. */
  private AttributeType listenerType;
  /**
   * The attribute type that will be used to report the number of established
   * client connections.
   */
  private AttributeType numConnectionsType;
  /** The attribute type that will be used to report the protocol. */
  private AttributeType protocolType;
  /** The attribute type that will be used to report the config dn . */
  private AttributeType configDnType;
  /** The connection handler with which this monitor is associated. */
  private ConnectionHandler<?> connectionHandler;
@@ -80,17 +64,10 @@
  /** {@inheritDoc} */
  @Override
  public void initializeMonitorProvider(MonitorProviderCfg configuration)
  {
    monitorName = connectionHandler.getConnectionHandlerName();
    connectionsType = DirectoryServer.getAttributeType(ATTR_MONITOR_CONNHANDLER_CONNECTION);
    listenerType = DirectoryServer.getAttributeType(ATTR_MONITOR_CONNHANDLER_LISTENER);
    numConnectionsType = DirectoryServer.getAttributeType(ATTR_MONITOR_CONNHANDLER_NUMCONNECTIONS);
    protocolType = DirectoryServer.getAttributeType(ATTR_MONITOR_CONNHANDLER_PROTOCOL);
    configDnType = DirectoryServer.getAttributeType(ATTR_MONITOR_CONFIG_DN);
  }
@@ -119,42 +96,32 @@
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    LinkedList<Attribute> attrs = new LinkedList<>();
    // Configuration DN
    attrs.add(Attributes.create(configDnType, connectionHandler.getComponentEntryDN().toString()));
    int numConnections = 0;
    LinkedList<ClientConnection> conns = new LinkedList<>(connectionHandler.getClientConnections());
    LinkedList<HostPort> listeners = new LinkedList<>(connectionHandler.getListeners());
    attrs.add(Attributes.create(protocolType, connectionHandler.getProtocol()));
    final MonitorData attrs = new MonitorData(5);
    attrs.add(ATTR_MONITOR_CONFIG_DN, connectionHandler.getComponentEntryDN());
    attrs.add(ATTR_MONITOR_CONNHANDLER_PROTOCOL, connectionHandler.getProtocol());
    if (!listeners.isEmpty())
    {
      AttributeBuilder builder = new AttributeBuilder(listenerType);
      builder.addAllStrings(listeners);
      attrs.add(builder.toAttribute());
      attrs.add(ATTR_MONITOR_CONNHANDLER_LISTENER, listeners);
    }
    attrs.add(ATTR_MONITOR_CONNHANDLER_NUMCONNECTIONS, conns.size());
    if (!conns.isEmpty())
    {
      AttributeBuilder builder = new AttributeBuilder(connectionsType);
      Collection<String> connectionSummaries = new ArrayList<>();
      for (ClientConnection c : conns)
      {
        numConnections++;
        builder.add(c.getMonitorSummary());
        connectionSummaries.add(c.getMonitorSummary());
      }
      attrs.add(builder.toAttribute());
      attrs.add(ATTR_MONITOR_CONNHANDLER_CONNECTION, connectionSummaries);
    }
    attrs.add(Attributes.create(numConnectionsType, String
        .valueOf(numConnections)));
    return attrs;
  }
}
opendj-server-legacy/src/main/java/org/opends/server/monitors/EntryCacheMonitorProvider.java
@@ -12,25 +12,22 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2008-2010 Sun Microsystems, Inc.
 * Portions Copyright 2014-2015 ForgeRock AS.
 * Portions Copyright 2014-2016 ForgeRock AS.
 */
package org.opends.server.monitors;
import java.util.Collections;
import java.util.List;
import static org.opends.messages.ConfigMessages.*;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.EntryCacheCfg;
import org.opends.server.admin.std.server.EntryCacheMonitorProviderCfg;
import org.opends.server.api.EntryCache;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.config.ConfigConstants;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.Attribute;
import static org.opends.messages.ConfigMessages.*;
/**
 * This class defines a Directory Server monitor provider that can be used to
@@ -106,16 +103,14 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public String getMonitorInstanceName()
  {
    return monitorName;
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    if (entryCache != null &&
        monitorConfiguration != null &&
@@ -123,6 +118,6 @@
      // Get monitor data from the cache.
      return entryCache.getMonitorData();
    }
    return Collections.emptyList();
    return new MonitorData(0);
  }
}
opendj-server-legacy/src/main/java/org/opends/server/monitors/MemoryUsageMonitorProvider.java
@@ -12,7 +12,7 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2008-2010 Sun Microsystems, Inc.
 * Portions Copyright 2014-2015 ForgeRock AS.
 * Portions Copyright 2014-2016 ForgeRock AS.
 */
package org.opends.server.monitors;
@@ -22,16 +22,13 @@
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.MemoryUsageMonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.opends.server.types.InitializationException;
/**
@@ -104,9 +101,9 @@
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    ArrayList<Attribute> attrs = new ArrayList<>();
    MonitorData attrs = new MonitorData();
    for (GarbageCollectorMXBean gc :
         ManagementFactory.getGarbageCollectorMXBeans())
@@ -134,10 +131,10 @@
        gcSafeNames.put(gcName, safeName);
      }
      attrs.add(createAttribute(safeName + "-total-collection-count", gcCount));
      attrs.add(createAttribute(safeName + "-total-collection-duration", gcTime));
      attrs.add(createAttribute(safeName + "-average-collection-duration", avgGCDuration));
      attrs.add(createAttribute(safeName + "-recent-collection-duration", recentGCDuration));
      attrs.add(safeName + "-total-collection-count", gcCount);
      attrs.add(safeName + "-total-collection-duration", gcTime);
      attrs.add(safeName + "-average-collection-duration", avgGCDuration);
      attrs.add(safeName + "-recent-collection-duration", recentGCDuration);
    }
    for (MemoryPoolMXBean mp : ManagementFactory.getMemoryPoolMXBeans())
@@ -154,22 +151,15 @@
      }
      long currentBytesUsed = currentUsage != null ? currentUsage.getUsed() : 0;
      attrs.add(createAttribute(safeName + "-current-bytes-used", currentBytesUsed));
      attrs.add(safeName + "-current-bytes-used", currentBytesUsed);
      long collectionBytesUsed = collectionUsage != null ? collectionUsage.getUsed() : 0;
      attrs.add(createAttribute(safeName + "-bytes-used-after-last-collection", collectionBytesUsed));
      attrs.add(safeName + "-bytes-used-after-last-collection", collectionBytesUsed);
    }
    return attrs;
  }
  private Attribute createAttribute(String name, Object value)
  {
    return Attributes.create(name, String.valueOf(value));
  }
  /**
   * Creates a "safe" version of the provided name, which is acceptable for
   * use as part of an attribute name.
opendj-server-legacy/src/main/java/org/opends/server/monitors/ParallelWorkQueueMonitor.java
@@ -16,18 +16,13 @@
 */
package org.opends.server.monitors;
import static org.opends.server.core.DirectoryServer.*;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.extensions.ParallelWorkQueue;
import org.opends.server.types.Attribute;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.Attributes;
import org.opends.server.types.InitializationException;
/**
@@ -105,8 +100,6 @@
    return "Work Queue";
  }
  /** {@inheritDoc} */
  @Override
  public void run()
  {
@@ -120,18 +113,8 @@
    }
  }
  /**
   * 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.
   */
  @Override
  public ArrayList<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    int backlog = workQueue.size();
    totalBacklog += backlog;
@@ -142,21 +125,12 @@
    }
    long averageBacklog = (long) (1.0 * totalBacklog / numPolls);
    long opsSubmitted = workQueue.getOpsSubmitted();
    ArrayList<Attribute> monitorAttrs = new ArrayList<>();
    putAttribute(monitorAttrs, ATTR_CURRENT_BACKLOG, backlog);
    putAttribute(monitorAttrs, ATTR_AVERAGE_BACKLOG, averageBacklog);
    putAttribute(monitorAttrs, ATTR_MAX_BACKLOG, maxBacklog);
    // The total number of operations submitted.
    putAttribute(monitorAttrs, ATTR_OPS_SUBMITTED, opsSubmitted);
    final MonitorData monitorAttrs = new MonitorData(4);
    monitorAttrs.add(ATTR_CURRENT_BACKLOG, backlog);
    monitorAttrs.add(ATTR_AVERAGE_BACKLOG, averageBacklog);
    monitorAttrs.add(ATTR_MAX_BACKLOG, maxBacklog);
    monitorAttrs.add(ATTR_OPS_SUBMITTED, workQueue.getOpsSubmitted());
    return monitorAttrs;
  }
  private void putAttribute(ArrayList<Attribute> monitorAttrs, String attrName, Object value)
  {
    AttributeType attrType = getAttributeType(attrName, getDefaultIntegerSyntax());
    monitorAttrs.add(Attributes.create(attrType, String.valueOf(value)));
  }
}
opendj-server-legacy/src/main/java/org/opends/server/monitors/StackTraceMonitorProvider.java
@@ -12,21 +12,19 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2006-2010 Sun Microsystems, Inc.
 * Portions Copyright 2014-2015 ForgeRock AS.
 * Portions Copyright 2014-2016 ForgeRock AS.
 */
package org.opends.server.monitors;
import static org.opends.server.util.CollectionUtils.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.StackTraceMonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.InitializationException;
/**
@@ -52,7 +50,7 @@
  }
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    Map<Thread,StackTraceElement[]> threadStacks = Thread.getAllStackTraces();
@@ -63,48 +61,51 @@
      orderedStacks.put(e.getKey().getId(), e);
    }
    AttributeBuilder builder = new AttributeBuilder("jvmThread");
    Collection<String> jvmThreads = new ArrayList<>();
    for (Map.Entry<Thread,StackTraceElement[]> e : orderedStacks.values())
    {
      Thread t                          = e.getKey();
      StackTraceElement[] stackElements = e.getValue();
      long id = t.getId();
      builder.add("id=" + id + " ---------- " + t.getName() + " ----------");
      long tid = t.getId();
      jvmThreads.add("id=" + tid + " ---------- " + t.getName() + " ----------");
      // Create an attribute for the stack trace.
      if (stackElements != null)
      {
        for (int j=0; j < stackElements.length; j++)
        for (int j = 0; j < stackElements.length; j++)
        {
          StringBuilder buffer = new StringBuilder();
          buffer.append("id=");
          buffer.append(id);
          buffer.append(" frame[");
          buffer.append(j);
          buffer.append("]=");
          buffer.append(stackElements[j].getClassName());
          buffer.append(".");
          buffer.append(stackElements[j].getMethodName());
          buffer.append("(");
          buffer.append(stackElements[j].getFileName());
          buffer.append(":");
          if (stackElements[j].isNativeMethod())
          {
            buffer.append("native");
          }
          else
          {
            buffer.append(stackElements[j].getLineNumber());
          }
          buffer.append(")");
          builder.add(buffer.toString());
          jvmThreads.add(toString(tid, j, stackElements[j]));
        }
      }
    }
    return newArrayList(builder.toAttribute());
    MonitorData result = new MonitorData(1);
    result.add("jvmThread", jvmThreads);
    return result;
  }
  private String toString(long tid, int frame, StackTraceElement stackElement)
  {
    StringBuilder buffer = new StringBuilder();
    buffer.append("id=").append(tid);
    buffer.append(" frame[").append(frame).append("]=");
    buffer.append(stackElement.getClassName());
    buffer.append(".");
    buffer.append(stackElement.getMethodName());
    buffer.append("(");
    buffer.append(stackElement.getFileName());
    buffer.append(":");
    if (stackElement.isNativeMethod())
    {
      buffer.append("native");
    }
    else
    {
      buffer.append(stackElement.getLineNumber());
    }
    buffer.append(")");
    return buffer.toString();
  }
}
opendj-server-legacy/src/main/java/org/opends/server/monitors/SystemInfoMonitorProvider.java
@@ -12,7 +12,7 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2006-2010 Sun Microsystems, Inc.
 * Portions Copyright 2012-2015 ForgeRock AS.
 * Portions Copyright 2012-2016 ForgeRock AS.
 */
package org.opends.server.monitors;
@@ -21,9 +21,7 @@
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -33,11 +31,9 @@
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.SystemInfoMonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.Attributes;
import org.opends.server.types.InitializationException;
/**
@@ -65,22 +61,22 @@
  }
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    ArrayList<Attribute> attrs = new ArrayList<>(13);
    MonitorData attrs = new MonitorData(13);
    attrs.add(createAttribute("javaVersion", System.getProperty("java.version")));
    attrs.add(createAttribute("javaVendor", System.getProperty("java.vendor")));
    attrs.add(createAttribute("jvmVersion", System.getProperty("java.vm.version")));
    attrs.add(createAttribute("jvmVendor", System.getProperty("java.vm.vendor")));
    attrs.add(createAttribute("javaHome", System.getProperty("java.home")));
    attrs.add(createAttribute("classPath", System.getProperty("java.class.path")));
    attrs.add(createAttribute("workingDirectory", System.getProperty("user.dir")));
    attrs.add("javaVersion", System.getProperty("java.version"));
    attrs.add("javaVendor", System.getProperty("java.vendor"));
    attrs.add("jvmVersion", System.getProperty("java.vm.version"));
    attrs.add("jvmVendor", System.getProperty("java.vm.vendor"));
    attrs.add("javaHome", System.getProperty("java.home"));
    attrs.add("classPath", System.getProperty("java.class.path"));
    attrs.add("workingDirectory", System.getProperty("user.dir"));
    String osInfo = System.getProperty("os.name") + " " +
                    System.getProperty("os.version") + " " +
                    System.getProperty("os.arch");
    attrs.add(createAttribute("operatingSystem", osInfo));
    attrs.add("operatingSystem", osInfo);
    String sunOsArchDataModel = System.getProperty("sun.arch.data.model");
    if (sunOsArchDataModel != null)
    {
@@ -89,17 +85,16 @@
      {
        jvmArch += "-bit";
      }
      attrs.add(createAttribute("jvmArchitecture", jvmArch));
      attrs.add("jvmArchitecture", jvmArch);
    }
    else
    {
      attrs.add(createAttribute("jvmArchitecture","unknown"));
      attrs.add("jvmArchitecture", "unknown");
    }
    try
    {
      attrs.add(createAttribute("systemName",
                     InetAddress.getLocalHost().getCanonicalHostName()));
      attrs.add("systemName", InetAddress.getLocalHost().getCanonicalHostName());
    }
    catch (Exception e)
    {
@@ -108,19 +103,19 @@
    Runtime runtime = Runtime.getRuntime();
    attrs.add(createAttribute("availableCPUs", runtime.availableProcessors()));
    attrs.add(createAttribute("maxMemory", runtime.maxMemory()));
    attrs.add(createAttribute("usedMemory", runtime.totalMemory()));
    attrs.add(createAttribute("freeUsedMemory", runtime.freeMemory()));
    attrs.add("availableCPUs", runtime.availableProcessors());
    attrs.add("maxMemory", runtime.maxMemory());
    attrs.add("usedMemory", runtime.totalMemory());
    attrs.add("freeUsedMemory", runtime.freeMemory());
    String installPath = DirectoryServer.getServerRoot();
    if (installPath != null)
    {
      attrs.add(createAttribute("installPath", installPath));
      attrs.add("installPath", installPath);
    }
    String instancePath = DirectoryServer.getInstanceRoot();
    if (instancePath != null)
    {
      attrs.add(createAttribute("instancePath", instancePath));
      attrs.add("instancePath", instancePath);
    }
    // Get the JVM input arguments.
@@ -141,42 +136,23 @@
        argList.append("\"");
      }
      attrs.add(createAttribute("jvmArguments", argList.toString()));
      attrs.add("jvmArguments", argList);
    }
    // Get the list of supported SSL protocols and ciphers.
    Collection<String> supportedTlsProtocols;
    Collection<String> supportedTlsCiphers;
    try
    {
      final SSLContext context = SSLContext.getDefault();
      final SSLParameters parameters = context.getSupportedSSLParameters();
      supportedTlsProtocols = Arrays.asList(parameters.getProtocols());
      supportedTlsCiphers = Arrays.asList(parameters.getCipherSuites());
      attrs.add(ATTR_SUPPORTED_TLS_PROTOCOLS, Arrays.asList(parameters.getProtocols()));
      attrs.add(ATTR_SUPPORTED_TLS_CIPHERS, Arrays.asList(parameters.getCipherSuites()));
    }
    catch (Exception e)
    {
      // A default SSL context should always be available.
      supportedTlsProtocols = Collections.emptyList();
      supportedTlsCiphers = Collections.emptyList();
      attrs.add(ATTR_SUPPORTED_TLS_PROTOCOLS, Collections.emptyList());
      attrs.add(ATTR_SUPPORTED_TLS_CIPHERS, Collections.emptyList());
    }
    addAttribute(attrs, ATTR_SUPPORTED_TLS_PROTOCOLS, supportedTlsProtocols);
    addAttribute(attrs, ATTR_SUPPORTED_TLS_CIPHERS, supportedTlsCiphers);
    return attrs;
  }
  private void addAttribute(ArrayList<Attribute> attrs, String attrName, Collection<String> values)
  {
    AttributeBuilder builder = new AttributeBuilder(attrName);
    builder.addAllStrings(values);
    attrs.add(builder.toAttribute());
  }
  private Attribute createAttribute(String name, Object value)
  {
    return Attributes.create(name, String.valueOf(value));
  }
}
opendj-server-legacy/src/main/java/org/opends/server/monitors/TraditionalWorkQueueMonitor.java
@@ -16,18 +16,13 @@
 */
package org.opends.server.monitors;
import static org.opends.server.core.DirectoryServer.*;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.extensions.TraditionalWorkQueue;
import org.opends.server.types.Attribute;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.Attributes;
import org.opends.server.types.InitializationException;
/**
@@ -109,8 +104,6 @@
    return "Work Queue";
  }
  /** {@inheritDoc} */
  @Override
  public void run()
  {
@@ -124,18 +117,8 @@
    }
  }
  /**
   * 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.
   */
  @Override
  public ArrayList<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    int backlog = workQueue.size();
    totalBacklog += backlog;
@@ -144,26 +127,14 @@
    {
      maxBacklog = backlog;
    }
    long averageBacklog = (long) (1.0 * totalBacklog / numPolls);
    long opsSubmitted = workQueue.getOpsSubmitted();
    long rejectedQueueFull = workQueue.getOpsRejectedDueToQueueFull();
    ArrayList<Attribute> monitorAttrs = new ArrayList<>();
    putAttribute(monitorAttrs, ATTR_CURRENT_BACKLOG, backlog);
    putAttribute(monitorAttrs, ATTR_AVERAGE_BACKLOG, averageBacklog);
    putAttribute(monitorAttrs, ATTR_MAX_BACKLOG, maxBacklog);
    // The total number of operations submitted.
    putAttribute(monitorAttrs, ATTR_OPS_SUBMITTED, opsSubmitted);
    // The total number of operations rejected due to a full work queue.
    putAttribute(monitorAttrs, ATTR_OPS_REJECTED_QUEUE_FULL, rejectedQueueFull);
    final MonitorData monitorAttrs = new MonitorData(5);
    monitorAttrs.add(ATTR_CURRENT_BACKLOG, backlog);
    monitorAttrs.add(ATTR_AVERAGE_BACKLOG, averageBacklog);
    monitorAttrs.add(ATTR_MAX_BACKLOG, maxBacklog);
    monitorAttrs.add(ATTR_OPS_SUBMITTED, workQueue.getOpsSubmitted());
    monitorAttrs.add(ATTR_OPS_REJECTED_QUEUE_FULL, workQueue.getOpsRejectedDueToQueueFull());
    return monitorAttrs;
  }
  private void putAttribute(ArrayList<Attribute> monitorAttrs, String attrName, Object value)
  {
    AttributeType attrType = getAttributeType(attrName, getDefaultIntegerSyntax());
    monitorAttrs.add(Attributes.create(attrType, String.valueOf(value)));
  }
}
opendj-server-legacy/src/main/java/org/opends/server/monitors/VersionMonitorProvider.java
@@ -16,14 +16,10 @@
 */
package org.opends.server.monitors;
import java.util.ArrayList;
import java.util.List;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.VersionMonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.opends.server.types.InitializationException;
import org.opends.server.util.DynamicConstants;
@@ -70,44 +66,39 @@
  }
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    ArrayList<Attribute> attrs = new ArrayList<>(12);
    MonitorData attrs = new MonitorData(12);
    attrs.add(createAttribute(ATTR_PRODUCT_NAME, DynamicConstants.PRODUCT_NAME));
    attrs.add(createAttribute(ATTR_SHORT_NAME, DynamicConstants.SHORT_NAME));
    attrs.add(createAttribute(ATTR_MAJOR_VERSION, DynamicConstants.MAJOR_VERSION));
    attrs.add(createAttribute(ATTR_MINOR_VERSION, DynamicConstants.MINOR_VERSION));
    attrs.add(createAttribute(ATTR_POINT_VERSION, DynamicConstants.POINT_VERSION));
    attrs.add(ATTR_PRODUCT_NAME, DynamicConstants.PRODUCT_NAME);
    attrs.add(ATTR_SHORT_NAME, DynamicConstants.SHORT_NAME);
    attrs.add(ATTR_MAJOR_VERSION, DynamicConstants.MAJOR_VERSION);
    attrs.add(ATTR_MINOR_VERSION, DynamicConstants.MINOR_VERSION);
    attrs.add(ATTR_POINT_VERSION, DynamicConstants.POINT_VERSION);
    String versionQualifier = DynamicConstants.VERSION_QUALIFIER;
    if (versionQualifier != null && versionQualifier.length() > 0)
    {
      attrs.add(createAttribute(ATTR_VERSION_QUALIFIER, versionQualifier));
      attrs.add(ATTR_VERSION_QUALIFIER, versionQualifier);
    }
    int buildNumber = DynamicConstants.BUILD_NUMBER;
    if (buildNumber > 0)
    {
      attrs.add(createAttribute(ATTR_BUILD_NUMBER, buildNumber));
      attrs.add(ATTR_BUILD_NUMBER, buildNumber);
    }
    String fixIDs = DynamicConstants.FIX_IDS;
    if (fixIDs != null && fixIDs.length() > 0)
    {
      attrs.add(createAttribute(ATTR_FIX_IDS, fixIDs));
      attrs.add(ATTR_FIX_IDS, fixIDs);
    }
    attrs.add(createAttribute(ATTR_REVISION, DynamicConstants.REVISION));
    attrs.add(createAttribute(ATTR_BUILD_ID, DynamicConstants.BUILD_ID));
    attrs.add(createAttribute(ATTR_COMPACT_VERSION, DynamicConstants.COMPACT_VERSION_STRING));
    attrs.add(createAttribute(ATTR_FULL_VERSION, DynamicConstants.FULL_VERSION_STRING));
    attrs.add(ATTR_REVISION, DynamicConstants.REVISION);
    attrs.add(ATTR_BUILD_ID, DynamicConstants.BUILD_ID);
    attrs.add(ATTR_COMPACT_VERSION, DynamicConstants.COMPACT_VERSION_STRING);
    attrs.add(ATTR_FULL_VERSION, DynamicConstants.FULL_VERSION_STRING);
    return attrs;
  }
  private Attribute createAttribute(String name, Object value)
  {
    return Attributes.create(name, String.valueOf(value));
  }
}
opendj-server-legacy/src/main/java/org/opends/server/protocols/http/HTTPStatistics.java
@@ -11,7 +11,7 @@
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2013-2015 ForgeRock AS.
 * Copyright 2013-2016 ForgeRock AS.
 */
package org.opends.server.protocols.http;
@@ -23,8 +23,8 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import org.opends.server.api.MonitorData;
import org.opends.server.protocols.ldap.LDAPStatistics;
import org.opends.server.types.Attribute;
/**
 * Collects statistics for HTTP. This class inherits from {@link LDAPStatistics}
@@ -93,39 +93,24 @@
    super.clearStatistics();
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    // first take a snapshot of all the data as fast as possible
    final int totalCount = this.requestsTotalCount.get();
    final Map<String, Integer> totalCountsSnapshot = new HashMap<>();
    for (Entry<String, AtomicInteger> entry : requestMethodsTotalCount.entrySet())
    {
      totalCountsSnapshot.put(entry.getKey(), entry.getValue().get());
    }
    final Map<String, Long> totalTimesSnapshot = new HashMap<>();
    for (Entry<String, AtomicLong> entry1 : requestMethodsTotalTime.entrySet())
    {
      totalTimesSnapshot.put(entry1.getKey(), entry1.getValue().get());
    }
    // do the same with the underlying data
    final List<Attribute> results = super.getMonitorData();
    addAll(results, totalCountsSnapshot, "ds-mon-http-", "-requests-total-count");
    addAll(results, totalTimesSnapshot, "ds-mon-resident-time-http-", "-requests-total-time");
    results.add(createAttribute("ds-mon-http-requests-total-count", Integer.toString(totalCount)));
    final MonitorData results = super.getMonitorData();
    addAll(results, requestMethodsTotalCount, "ds-mon-http-", "-requests-total-count");
    addAll(results, requestMethodsTotalTime, "ds-mon-resident-time-http-", "-requests-total-time");
    results.add("ds-mon-http-requests-total-count", requestsTotalCount.get());
    return results;
  }
  private void addAll(final List<Attribute> results,
  private void addAll(final MonitorData results,
      final Map<String, ?> toOutput, String prefix, String suffix)
  {
    for (Entry<String, ?> entry : toOutput.entrySet())
    {
      final String httpMethod = entry.getKey();
      final String nb = entry.getValue().toString();
      results.add(createAttribute(prefix + httpMethod + suffix, nb));
      results.add(prefix + httpMethod + suffix, nb);
    }
  }
opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPStatistics.java
@@ -20,16 +20,13 @@
import static org.opends.server.protocols.ldap.LDAPConstants.*;
import static org.opends.server.util.ServerConstants.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.opends.server.types.DirectoryConfig;
import org.opends.server.types.ObjectClass;
import org.opends.server.types.OperationType;
@@ -170,150 +167,86 @@
      return DirectoryConfig.getObjectClass(OC_MONITOR_CONNHANDLERSTATS, true);
  }
  /**
   * 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.
   */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
      List<Attribute> attrs = new ArrayList<>();
      long tmpAbandonRequests = abandonRequests.get();
      long tmpAddRequests = addRequests.get();
      long tmpAddResponses = addResponses.get();
      long tmpBindRequests = bindRequests.get();
      long tmpBindResponses = bindResponses.get();
      long tmpBytesRead = bytesRead.get();
      long tmpBytesWritten = bytesWritten.get();
      long tmpCompareRequests = compareRequests.get();
      long tmpCompareResponses = compareResponses.get();
      long tmpConnectionsClosed = connectionsClosed.get();
      long tmpConnectionsEstablished = connectionsEstablished.get();
      long tmpDeleteRequests = deleteRequests.get();
      long tmpDeleteResponses = deleteResponses.get();
      long tmpExtendedRequests = extendedRequests.get();
      long tmpExtendedResponses = extendedResponses.get();
      long tmpMessagesRead = messagesRead.get();
      long tmpMessagesWritten = messagesWritten.get();
      long tmpModifyRequests = modifyRequests.get();
      long tmpModifyResponses = modifyResponses.get();
      long tmpModifyDNRequests = modifyDNRequests.get();
      long tmpModifyDNResponses = modifyDNResponses.get();
      long tmpOperationsAbandoned = operationsAbandoned.get();
      long tmpOperationsCompleted = operationsCompleted.get();
      long tmpOperationsInitiated = operationsInitiated.get();
      long tmpSearchRequests = searchRequests.get();
      long tmpSearchOneRequests = searchOneRequests.get();
      long tmpSearchSubRequests = searchSubRequests.get();
      long tmpSearchEntries = searchResultEntries.get();
      long tmpSearchReferences = searchResultReferences.get();
      long tmpSearchResultsDone = searchResultsDone.get();
      long tmpUnbindRequests = unbindRequests.get();
      long tmpAddOperationCount = addOperationCount.get();
      long tmpAddOperationTime = addOperationTime.get();
      long tmpSearchOperationCount = searchOperationCount.get();
      long tmpSearchOperationTime = searchOperationTime.get();
      long tmpDelOperationCount = delOperationCount.get();
      long tmpDelOperationTime = delOperationTime.get();
      long tmpBindOperationCount = bindOperationCount.get();
      long tmpBindOperationTime = bindOperationTime.get();
      long tmpUnbindOperationCount = unbindOperationCount.get();
      long tmpUnbindOperationTime = unbindOperationTime.get();
      long tmpCompOperationCount = compOperationCount.get();
      long tmpCompOperationTime = compOperationTime.get();
      long tmpModOperationCount = modOperationCount.get();
      long tmpModOperationTime = modOperationTime.get();
      long tmpModdnOperationCount = moddnOperationCount.get();
      long tmpModdnOperationTime = moddnOperationTime.get();
      long tmpAbandonOperationCount = abandonOperationCount.get();
      long tmpAbandonOperationTime = abandonOperationTime.get();
      long tmpExtOperationCount = extOperationCount.get();
      long tmpExtOperationTime = extOperationTime.get();
    // Construct the list of attributes to return.
    /* TODO : the attribute names should be constant (in ServerConstants.java
     *        and associated with their objectclass
     *        OC_MONITOR_CONNHANDLERSTATS
     */
    attrs.add(createAttribute("connectionsEstablished", tmpConnectionsEstablished));
    attrs.add(createAttribute("connectionsClosed", tmpConnectionsClosed));
    attrs.add(createAttribute("bytesRead", tmpBytesRead));
    attrs.add(createAttribute("bytesWritten", tmpBytesWritten));
    attrs.add(createAttribute("ldapMessagesRead", tmpMessagesRead));
    attrs.add(createAttribute("ldapMessagesWritten", tmpMessagesWritten));
    attrs.add(createAttribute("operationsAbandoned", tmpOperationsAbandoned));
    attrs.add(createAttribute("operationsInitiated", tmpOperationsInitiated));
    attrs.add(createAttribute("operationsCompleted", tmpOperationsCompleted));
    attrs.add(createAttribute("abandonRequests", tmpAbandonRequests));
    attrs.add(createAttribute("addRequests", tmpAddRequests));
    attrs.add(createAttribute("addResponses", tmpAddResponses));
    attrs.add(createAttribute("bindRequests", tmpBindRequests));
    attrs.add(createAttribute("bindResponses", tmpBindResponses));
    attrs.add(createAttribute("compareRequests", tmpCompareRequests));
    attrs.add(createAttribute("compareResponses", tmpCompareResponses));
    attrs.add(createAttribute("deleteRequests", tmpDeleteRequests));
    attrs.add(createAttribute("deleteResponses", tmpDeleteResponses));
    attrs.add(createAttribute("extendedRequests", tmpExtendedRequests));
    attrs.add(createAttribute("extendedResponses", tmpExtendedResponses));
    attrs.add(createAttribute("modifyRequests", tmpModifyRequests));
    attrs.add(createAttribute("modifyResponses", tmpModifyResponses));
    attrs.add(createAttribute("modifyDNRequests", tmpModifyDNRequests));
    attrs.add(createAttribute("modifyDNResponses", tmpModifyDNResponses));
    attrs.add(createAttribute("searchRequests", tmpSearchRequests));
    attrs.add(createAttribute("searchOneRequests", tmpSearchOneRequests));
    attrs.add(createAttribute("searchSubRequests", tmpSearchSubRequests));
    attrs.add(createAttribute("searchResultEntries", tmpSearchEntries));
    attrs.add(createAttribute("searchResultReferences", tmpSearchReferences));
    attrs.add(createAttribute("searchResultsDone", tmpSearchResultsDone));
    attrs.add(createAttribute("unbindRequests", tmpUnbindRequests));
    final MonitorData attrs = new MonitorData(31 + 10 * 2);
    attrs.add("connectionsEstablished", connectionsEstablished);
    attrs.add("connectionsClosed", connectionsClosed);
    attrs.add("bytesRead", bytesRead);
    attrs.add("bytesWritten", bytesWritten);
    attrs.add("ldapMessagesRead", messagesRead);
    attrs.add("ldapMessagesWritten", messagesWritten);
    attrs.add("operationsAbandoned", operationsAbandoned);
    attrs.add("operationsInitiated", operationsInitiated);
    attrs.add("operationsCompleted", operationsCompleted);
    attrs.add("abandonRequests", abandonRequests);
    attrs.add("addRequests", addRequests);
    attrs.add("addResponses", addResponses);
    attrs.add("bindRequests", bindRequests);
    attrs.add("bindResponses", bindResponses);
    attrs.add("compareRequests", compareRequests);
    attrs.add("compareResponses", compareResponses);
    attrs.add("deleteRequests", deleteRequests);
    attrs.add("deleteResponses", deleteResponses);
    attrs.add("extendedRequests", extendedRequests);
    attrs.add("extendedResponses", extendedResponses);
    attrs.add("modifyRequests", modifyRequests);
    attrs.add("modifyResponses", modifyResponses);
    attrs.add("modifyDNRequests", modifyDNRequests);
    attrs.add("modifyDNResponses", modifyDNResponses);
    attrs.add("searchRequests", searchRequests);
    attrs.add("searchOneRequests", searchOneRequests);
    attrs.add("searchSubRequests", searchSubRequests);
    attrs.add("searchResultEntries", searchResultEntries);
    attrs.add("searchResultReferences", searchResultReferences);
    attrs.add("searchResultsDone", searchResultsDone);
    attrs.add("unbindRequests", unbindRequests);
    // adds
    attrs.add(createAttribute("ds-mon-add-operations-total-count", tmpAddOperationCount));
    attrs.add(createAttribute("ds-mon-resident-time-add-operations-total-time", tmpAddOperationTime));
    attrs.add("ds-mon-add-operations-total-count", addOperationCount);
    attrs.add("ds-mon-resident-time-add-operations-total-time", addOperationTime);
    // search
    attrs.add(createAttribute("ds-mon-search-operations-total-count", tmpSearchOperationCount));
    attrs.add(createAttribute("ds-mon-resident-time-search-operations-total-time", tmpSearchOperationTime));
    attrs.add("ds-mon-search-operations-total-count", searchOperationCount);
    attrs.add("ds-mon-resident-time-search-operations-total-time", searchOperationTime);
    // bind
    attrs.add(createAttribute("ds-mon-bind-operations-total-count", tmpBindOperationCount));
    attrs.add(createAttribute("ds-mon-resident-time-bind-operations-total-time", tmpBindOperationTime));
    attrs.add("ds-mon-bind-operations-total-count", bindOperationCount);
    attrs.add("ds-mon-resident-time-bind-operations-total-time", bindOperationTime);
    // unbind
    attrs.add(createAttribute("ds-mon-unbind-operations-total-count", tmpUnbindOperationCount));
    attrs.add(createAttribute("ds-mon-resident-time-unbind-operations-total-time", tmpUnbindOperationTime));
    attrs.add("ds-mon-unbind-operations-total-count", unbindOperationCount);
    attrs.add("ds-mon-resident-time-unbind-operations-total-time", unbindOperationTime);
    // compare
    attrs.add(createAttribute("ds-mon-compare-operations-total-count", tmpCompOperationCount));
    attrs.add(createAttribute("ds-mon-resident-time-compare-operations-total-time", tmpCompOperationTime));
    attrs.add("ds-mon-compare-operations-total-count", compOperationCount);
    attrs.add("ds-mon-resident-time-compare-operations-total-time", compOperationTime);
    // del
    attrs.add(createAttribute("ds-mon-delete-operations-total-count", tmpDelOperationCount));
    attrs.add(createAttribute("ds-mon-resident-time-delete-operations-total-time", tmpDelOperationTime));
    attrs.add("ds-mon-delete-operations-total-count", delOperationCount);
    attrs.add("ds-mon-resident-time-delete-operations-total-time", delOperationTime);
    // mod
    attrs.add(createAttribute("ds-mon-mod-operations-total-count", tmpModOperationCount));
    attrs.add(createAttribute("ds-mon-resident-time-mod-operations-total-time", tmpModOperationTime));
    attrs.add("ds-mon-mod-operations-total-count", modOperationCount);
    attrs.add("ds-mon-resident-time-mod-operations-total-time", modOperationTime);
    // moddn
    attrs.add(createAttribute("ds-mon-moddn-operations-total-count", tmpModdnOperationCount));
    attrs.add(createAttribute("ds-mon-resident-time-moddn-operations-total-time", tmpModdnOperationTime));
    attrs.add("ds-mon-moddn-operations-total-count", moddnOperationCount);
    attrs.add("ds-mon-resident-time-moddn-operations-total-time", moddnOperationTime);
    // abandon
    attrs.add(createAttribute("ds-mon-abandon-operations-total-count", tmpAbandonOperationCount));
    attrs.add(createAttribute("ds-mon-resident-time-abandon-operations-total-time", tmpAbandonOperationTime));
    attrs.add("ds-mon-abandon-operations-total-count", abandonOperationCount);
    attrs.add("ds-mon-resident-time-abandon-operations-total-time", abandonOperationTime);
    // extended
    attrs.add(createAttribute("ds-mon-extended-operations-total-count", tmpExtOperationCount));
    attrs.add(createAttribute("ds-mon-resident-time-extended-operations-total-time", tmpExtOperationTime));
    attrs.add("ds-mon-extended-operations-total-count", extOperationCount);
    attrs.add("ds-mon-resident-time-extended-operations-total-time", extOperationTime);
    return attrs;
  }
@@ -568,25 +501,6 @@
      operationsAbandoned.getAndIncrement();
  }
  /**
   * Constructs an attribute using the provided information. It will
   * use the server's schema definitions.
   *
   * @param name
   *          The name to use for the attribute.
   * @param value
   *          The value to use for the attribute.
   * @return the constructed attribute.
   */
  protected Attribute createAttribute(String name, Object value)
  {
    return Attributes.create(name, String.valueOf(value));
  }
  /**
   * Retrieves the number of client connections that have been
   * established.
opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -23,7 +23,6 @@
import static org.opends.server.protocols.internal.Requests.*;
import static org.opends.server.replication.plugin.EntryHistorical.*;
import static org.opends.server.replication.protocol.OperationContext.*;
import static org.opends.server.replication.service.ReplicationMonitor.*;
import static org.opends.server.util.CollectionUtils.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
@@ -80,6 +79,7 @@
import org.opends.server.api.Backend.BackendOperation;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.DirectoryThread;
import org.opends.server.api.MonitorData;
import org.opends.server.api.ServerShutdownListener;
import org.opends.server.api.SynchronizationProvider;
import org.opends.server.backends.task.Task;
@@ -4282,28 +4282,17 @@
    return true;
  }
  /**
   * Monitoring information for the LDAPReplicationDomain.
   *
   * @return Monitoring attributes specific to the LDAPReplicationDomain.
   */
  @Override
  public Collection<Attribute> getAdditionalMonitoring()
  public void addAdditionalMonitoring(MonitorData attributes)
  {
    List<Attribute> attributes = new ArrayList<>();
    // number of updates in the pending list
    addMonitorData(attributes, "pending-updates", pendingChanges.size());
    addMonitorData(attributes, "replayed-updates-ok", numReplayedPostOpCalled.get());
    addMonitorData(attributes, "resolved-modify-conflicts", numResolvedModifyConflicts.get());
    addMonitorData(attributes, "resolved-naming-conflicts", numResolvedNamingConflicts.get());
    addMonitorData(attributes, "unresolved-naming-conflicts", numUnresolvedNamingConflicts.get());
    addMonitorData(attributes, "remote-pending-changes-size", remotePendingChanges.getQueueSize());
    addMonitorData(attributes, "dependent-changes-size", remotePendingChanges.getDependentChangesSize());
    addMonitorData(attributes, "changes-in-progress-size", remotePendingChanges.changesInProgressSize());
    return attributes;
    attributes.add("pending-updates", pendingChanges.size());
    attributes.add("replayed-updates-ok", numReplayedPostOpCalled);
    attributes.add("resolved-modify-conflicts", numResolvedModifyConflicts);
    attributes.add("resolved-naming-conflicts", numResolvedNamingConflicts);
    attributes.add("unresolved-naming-conflicts", numUnresolvedNamingConflicts);
    attributes.add("remote-pending-changes-size", remotePendingChanges.getQueueSize());
    attributes.add("dependent-changes-size", remotePendingChanges.getDependentChangesSize());
    attributes.add("changes-in-progress-size", remotePendingChanges.changesInProgressSize());
  }
  /**
opendj-server-legacy/src/main/java/org/opends/server/replication/server/DataServerHandler.java
@@ -12,7 +12,7 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2006-2010 Sun Microsystems, Inc.
 * Portions Copyright 2011-2015 ForgeRock AS.
 * Portions Copyright 2011-2016 ForgeRock AS.
 */
package org.opends.server.replication.server;
@@ -22,14 +22,33 @@
import static org.opends.server.replication.protocol.ProtocolVersion.*;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.replication.common.*;
import org.opends.server.replication.protocol.*;
import org.opends.server.types.*;
import org.opends.server.api.MonitorData;
import org.opends.server.replication.common.AssuredMode;
import org.opends.server.replication.common.DSInfo;
import org.opends.server.replication.common.ServerState;
import org.opends.server.replication.common.ServerStatus;
import org.opends.server.replication.common.StatusMachine;
import org.opends.server.replication.common.StatusMachineEvent;
import org.opends.server.replication.protocol.ChangeStatusMsg;
import org.opends.server.replication.protocol.ProtocolVersion;
import org.opends.server.replication.protocol.ReplServerStartDSMsg;
import org.opends.server.replication.protocol.ReplicationMsg;
import org.opends.server.replication.protocol.ServerStartMsg;
import org.opends.server.replication.protocol.Session;
import org.opends.server.replication.protocol.StartMsg;
import org.opends.server.replication.protocol.StartSessionMsg;
import org.opends.server.replication.protocol.StopMsg;
import org.opends.server.replication.protocol.TopologyMsg;
import org.opends.server.types.DirectoryException;
/**
 * This class defines a server handler, which handles all interaction with a
@@ -213,54 +232,38 @@
    return newStatus;
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    // Get the generic ones
    List<Attribute> attributes = super.getMonitorData();
    MonitorData attributes = super.getMonitorData();
    // Add the specific DS ones
    attributes.add(Attributes.create("replica", serverURL));
    attributes.add(Attributes.create("connected-to",
        this.replicationServer.getMonitorInstanceName()));
    attributes.add("replica", serverURL);
    attributes.add("connected-to", replicationServer.getMonitorInstanceName());
    ReplicationDomainMonitorData md =
        replicationServerDomain.getDomainMonitorData();
    ReplicationDomainMonitorData md = replicationServerDomain.getDomainMonitorData();
    // Oldest missing update
    long approxFirstMissingDate = md.getApproxFirstMissingDate(serverId);
    if (approxFirstMissingDate > 0)
    {
      Date date = new Date(approxFirstMissingDate);
      attributes.add(Attributes.create(
          "approx-older-change-not-synchronized", date.toString()));
      attributes.add(Attributes.create(
          "approx-older-change-not-synchronized-millis", String
          .valueOf(approxFirstMissingDate)));
      attributes.add("approx-older-change-not-synchronized", new Date(approxFirstMissingDate));
      attributes.add("approx-older-change-not-synchronized-millis", approxFirstMissingDate);
    }
    // Missing changes
    attributes.add(Attributes.create("missing-changes",
        String.valueOf(md.getMissingChanges(serverId))));
    attributes.add("missing-changes", md.getMissingChanges(serverId));
    // Replication delay
    attributes.add(Attributes.create("approximate-delay",
        String.valueOf(md.getApproxDelay(serverId))));
    attributes.add("approximate-delay", md.getApproxDelay(serverId));
    /* get the Server State */
    ServerState state = md.getLDAPServerState(serverId);
    if (state != null)
    {
      AttributeBuilder builder = new AttributeBuilder("server-state");
      builder.addAllStrings(state.toStringSet());
      attributes.add(builder.toAttribute());
      attributes.add("server-state", state.toStringSet());
    }
    return attributes;
  }
  /** {@inheritDoc} */
  @Override
  public String getMonitorInstanceName()
  {
@@ -278,7 +281,6 @@
    return status;
  }
  /** {@inheritDoc} */
  @Override
  public boolean isDataServer()
  {
@@ -510,7 +512,6 @@
        refUrls, eclIncludes, eclIncludesForDeletes, getProtocolVersion());
  }
  /** {@inheritDoc} */
  @Override
  public String toString()
  {
opendj-server-legacy/src/main/java/org/opends/server/replication/server/LightweightServerHandler.java
@@ -12,24 +12,21 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2008-2010 Sun Microsystems, Inc.
 * Portions Copyright 2011-2015 ForgeRock AS.
 * Portions Copyright 2011-2016 ForgeRock AS.
 */
package org.opends.server.replication.server;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.opends.server.replication.common.DSInfo;
import org.opends.server.replication.common.ServerState;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.Attributes;
import org.opends.server.types.InitializationException;
/**
@@ -149,26 +146,16 @@
        + ",cn=" + replServerHandler.getMonitorInstanceName();
  }
  /**
   * 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.
   */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    List<Attribute> attributes = new ArrayList<>();
    MonitorData attributes = new MonitorData(8);
    final int serverId = dsInfo.getDsId();
    final ReplicationServerDomain domain = replServerHandler.getDomain();
    attributes.add(Attributes.create("server-id", String.valueOf(serverId)));
    attributes.add(Attributes.create("domain-name",
        domain.getBaseDN().toString()));
    attributes.add(Attributes.create("connected-to",
        replServerHandler.getMonitorInstanceName()));
    attributes.add("server-id", serverId);
    attributes.add("domain-name", domain.getBaseDN());
    attributes.add("connected-to", replServerHandler.getMonitorInstanceName());
    // Retrieves the topology counters
    final ReplicationDomainMonitorData md = domain.getDomainMonitorData();
@@ -178,36 +165,25 @@
      remoteState = new ServerState();
    }
    // get the Server State
    AttributeBuilder builder = new AttributeBuilder("server-state");
    builder.addAllStrings(remoteState.toStringSet());
    if (builder.size() == 0)
    Set<String> serverState = remoteState.toStringSet();
    if (serverState.isEmpty())
    {
      builder.add("unknown");
      attributes.add("server-state", "unknown");
    }
    attributes.add(builder.toAttribute());
    else
    {
      attributes.add("server-state", serverState);
    }
    // Oldest missing update
    long approxFirstMissingDate = md.getApproxFirstMissingDate(serverId);
    if (approxFirstMissingDate > 0)
    {
      Date date = new Date(approxFirstMissingDate);
      attributes.add(Attributes.create(
          "approx-older-change-not-synchronized", date.toString()));
      attributes.add(Attributes.create(
          "approx-older-change-not-synchronized-millis", String
          .valueOf(approxFirstMissingDate)));
      attributes.add("approx-older-change-not-synchronized", new Date(approxFirstMissingDate));
      attributes.add("approx-older-change-not-synchronized-millis", approxFirstMissingDate);
    }
    // Missing changes
    long missingChanges = md.getMissingChanges(serverId);
    attributes.add(Attributes.create("missing-changes",
        String.valueOf(missingChanges)));
    // Replication delay
    long delay = md.getApproxDelay(serverId);
    attributes.add(Attributes.create("approximate-delay",
        String.valueOf(delay)));
    attributes.add("missing-changes", md.getMissingChanges(serverId));
    attributes.add("approximate-delay", md.getApproxDelay(serverId));
    return attributes;
  }
opendj-server-legacy/src/main/java/org/opends/server/replication/server/MessageHandler.java
@@ -17,10 +17,7 @@
package org.opends.server.replication.server;
import static org.opends.messages.ReplicationMessages.*;
import static org.opends.server.types.Attributes.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import org.forgerock.i18n.LocalizableMessage;
@@ -28,6 +25,7 @@
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.opends.server.replication.common.CSN;
@@ -35,7 +33,6 @@
import org.opends.server.replication.protocol.UpdateMsg;
import org.opends.server.replication.server.changelog.api.ChangelogException;
import org.opends.server.replication.server.changelog.api.DBCursor;
import org.opends.server.types.Attribute;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.InitializationException;
@@ -198,15 +195,14 @@
    return inCount;
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    List<Attribute> attributes = new ArrayList<>();
    attributes.add(create("handler", getMonitorInstanceName()));
    attributes.add(create("queue-size", String.valueOf(msgQueue.count())));
    attributes.add(create("queue-size-bytes", String.valueOf(msgQueue.bytesCount())));
    attributes.add(create("following", String.valueOf(following)));
    MonitorData attributes = new MonitorData(4);
    attributes.add("handler", getMonitorInstanceName());
    attributes.add("queue-size", msgQueue.count());
    attributes.add("queue-size-bytes", msgQueue.bytesCount());
    attributes.add("following", following);
    return attributes;
  }
opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServerDomain.java
@@ -38,6 +38,7 @@
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.opends.server.replication.common.CSN;
@@ -61,8 +62,6 @@
import org.opends.server.replication.server.changelog.api.DBCursor;
import org.opends.server.replication.server.changelog.api.DBCursor.CursorOptions;
import org.opends.server.replication.server.changelog.api.ReplicationDomainDB;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.HostPort;
@@ -2273,27 +2272,17 @@
        + ",cn=Replication";
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    // publish the server id and the port number.
    List<Attribute> attributes = new ArrayList<>();
    attributes.add(Attributes.create("replication-server-id",
        String.valueOf(localReplicationServer.getServerId())));
    attributes.add(Attributes.create("replication-server-port",
        String.valueOf(localReplicationServer.getReplicationPort())));
    attributes.add(Attributes.create("domain-name",
        baseDN.toString()));
    attributes.add(Attributes.create("generation-id",
        baseDN + " " + generationId));
    int serverId = localReplicationServer.getServerId();
    // Missing changes
    long missingChanges = getDomainMonitorData().getMissingChangesRS(
        localReplicationServer.getServerId());
    attributes.add(Attributes.create("missing-changes",
        String.valueOf(missingChanges)));
    final MonitorData attributes = new MonitorData(5);
    attributes.add("replication-server-id", serverId);
    attributes.add("replication-server-port", localReplicationServer.getReplicationPort());
    attributes.add("domain-name", baseDN);
    attributes.add("generation-id", baseDN + " " + generationId);
    attributes.add("missing-changes", getDomainMonitorData().getMissingChangesRS(serverId));
    return attributes;
  }
opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServerHandler.java
@@ -29,12 +29,19 @@
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.api.MonitorData;
import org.opends.server.replication.common.DSInfo;
import org.opends.server.replication.common.RSInfo;
import org.opends.server.replication.common.ServerState;
import org.opends.server.replication.common.ServerStatus;
import org.opends.server.replication.protocol.*;
import org.opends.server.types.*;
import org.opends.server.replication.protocol.ProtocolVersion;
import org.opends.server.replication.protocol.ReplServerStartMsg;
import org.opends.server.replication.protocol.ReplicationMsg;
import org.opends.server.replication.protocol.Session;
import org.opends.server.replication.protocol.StopMsg;
import org.opends.server.replication.protocol.TopologyMsg;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.HostPort;
/**
 * This class defines a server handler, which handles all interaction with a
@@ -643,30 +650,19 @@
        + ",cn=" + replicationServerDomain.getMonitorInstanceName();
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    // Get the generic ones
    List<Attribute> attributes = super.getMonitorData();
    MonitorData attributes = super.getMonitorData();
    // Add the specific RS ones
    attributes.add(Attributes.create("Replication-Server", serverURL));
    ReplicationDomainMonitorData md = replicationServerDomain.getDomainMonitorData();
    attributes.add("Replication-Server", serverURL);
    attributes.add("missing-changes", md.getMissingChangesRS(serverId));
    ReplicationDomainMonitorData md =
        replicationServerDomain.getDomainMonitorData();
    // Missing changes
    attributes.add(Attributes.create("missing-changes",
        String.valueOf(md.getMissingChangesRS(serverId))));
    // get the Server State
    ServerState state = md.getRSStates(serverId);
    if (state != null)
    {
      AttributeBuilder builder = new AttributeBuilder("server-state");
      builder.addAllStrings(state.toStringSet());
      attributes.add(builder.toAttribute());
      attributes.add("server-state", state.toStringSet());
    }
    return attributes;
opendj-server-legacy/src/main/java/org/opends/server/replication/server/ServerHandler.java
@@ -12,14 +12,13 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2006-2010 Sun Microsystems, Inc.
 * Portions Copyright 2011-2015 ForgeRock AS.
 * Portions Copyright 2011-2016 ForgeRock AS.
 */
package org.opends.server.replication.server;
import static org.opends.messages.ReplicationMessages.*;
import java.io.IOException;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -30,15 +29,29 @@
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.core.DirectoryServer;
import org.opends.server.replication.common.AssuredMode;
import org.opends.server.replication.common.CSN;
import org.opends.server.replication.common.RSInfo;
import org.opends.server.replication.common.ServerStatus;
import org.opends.server.replication.protocol.*;
import org.opends.server.replication.protocol.AckMsg;
import org.opends.server.replication.protocol.ChangeTimeHeartbeatMsg;
import org.opends.server.replication.protocol.HeartbeatThread;
import org.opends.server.replication.protocol.MonitorMsg;
import org.opends.server.replication.protocol.MonitorRequestMsg;
import org.opends.server.replication.protocol.ProtocolVersion;
import org.opends.server.replication.protocol.ReplServerStartMsg;
import org.opends.server.replication.protocol.ReplicationMsg;
import org.opends.server.replication.protocol.ResetGenerationIdMsg;
import org.opends.server.replication.protocol.RoutableMsg;
import org.opends.server.replication.protocol.Session;
import org.opends.server.replication.protocol.StartMsg;
import org.opends.server.replication.protocol.StartSessionMsg;
import org.opends.server.replication.protocol.TopologyMsg;
import org.opends.server.replication.protocol.UpdateMsg;
import org.opends.server.replication.protocol.WindowMsg;
import org.opends.server.replication.server.changelog.api.ChangelogException;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.InitializationException;
@@ -472,58 +485,46 @@
    return heartbeatInterval;
  }
  /** {@inheritDoc} */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    // Get the generic ones
    List<Attribute> attributes = super.getMonitorData();
    MonitorData attributes = super.getMonitorData();
    attributes.add(Attributes.create("server-id", String.valueOf(serverId)));
    attributes.add(Attributes.create("domain-name", String.valueOf(getBaseDN())));
    attributes.add("server-id", serverId);
    attributes.add("domain-name", getBaseDN());
    // Deprecated
    attributes.add(Attributes.create("max-waiting-changes", String
        .valueOf(maxQueueSize)));
    attributes.add(Attributes.create("sent-updates", String
        .valueOf(getOutCount())));
    attributes.add(Attributes.create("received-updates", String
        .valueOf(getInCount())));
    attributes.add("max-waiting-changes", maxQueueSize);
    attributes.add("sent-updates", getOutCount());
    attributes.add("received-updates", getInCount());
    // Assured counters
    attributes.add(Attributes.create("assured-sr-received-updates", String
        .valueOf(getAssuredSrReceivedUpdates())));
    attributes.add(Attributes.create("assured-sr-received-updates-timeout",
        String .valueOf(getAssuredSrReceivedUpdatesTimeout())));
    attributes.add(Attributes.create("assured-sr-sent-updates", String
        .valueOf(getAssuredSrSentUpdates())));
    attributes.add(Attributes.create("assured-sr-sent-updates-timeout", String
        .valueOf(getAssuredSrSentUpdatesTimeout())));
    attributes.add(Attributes.create("assured-sd-received-updates", String
        .valueOf(getAssuredSdReceivedUpdates())));
    attributes.add("assured-sr-received-updates", getAssuredSrReceivedUpdates());
    attributes.add("assured-sr-received-updates-timeout", getAssuredSrReceivedUpdatesTimeout());
    attributes.add("assured-sr-sent-updates", getAssuredSrSentUpdates());
    attributes.add("assured-sr-sent-updates-timeout", getAssuredSrSentUpdatesTimeout());
    attributes.add("assured-sd-received-updates", getAssuredSdReceivedUpdates());
    if (!isDataServer())
    {
      attributes.add(Attributes.create("assured-sd-sent-updates",
          String.valueOf(getAssuredSdSentUpdates())));
      attributes.add(Attributes.create("assured-sd-sent-updates-timeout",
          String.valueOf(getAssuredSdSentUpdatesTimeout())));
      attributes.add("assured-sd-sent-updates", getAssuredSdSentUpdates());
      attributes.add("assured-sd-sent-updates-timeout", getAssuredSdSentUpdatesTimeout());
    } else
    {
      attributes.add(Attributes.create("assured-sd-received-updates-timeout",
          String.valueOf(getAssuredSdReceivedUpdatesTimeout())));
      attributes.add("assured-sd-received-updates-timeout", getAssuredSdReceivedUpdatesTimeout());
    }
    // Window stats
    attributes.add(Attributes.create("max-send-window", String.valueOf(sendWindowSize)));
    attributes.add(Attributes.create("current-send-window", String.valueOf(sendWindow.availablePermits())));
    attributes.add(Attributes.create("max-rcv-window", String.valueOf(maxRcvWindow)));
    attributes.add(Attributes.create("current-rcv-window", String.valueOf(rcvWindow)));
    attributes.add("max-send-window", sendWindowSize);
    attributes.add("current-send-window", sendWindow.availablePermits());
    attributes.add("max-rcv-window", maxRcvWindow);
    attributes.add("current-rcv-window", rcvWindow);
    // Encryption
    attributes.add(Attributes.create("ssl-encryption", String.valueOf(session.isEncrypted())));
    attributes.add("ssl-encryption", session.isEncrypted());
    // Data generation
    attributes.add(Attributes.create("generation-id", String.valueOf(generationId)));
    attributes.add("generation-id", generationId);
    return attributes;
  }
opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDB.java
@@ -17,8 +17,6 @@
import static org.opends.messages.ReplicationMessages.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -29,6 +27,7 @@
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.opends.server.replication.common.CSN;
@@ -36,8 +35,6 @@
import org.opends.server.replication.server.changelog.api.ChangeNumberIndexRecord;
import org.opends.server.replication.server.changelog.api.ChangelogException;
import org.opends.server.replication.server.changelog.api.DBCursor;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.InitializationException;
@@ -288,24 +285,19 @@
  private class DbMonitorProvider extends MonitorProvider<MonitorProviderCfg>
  {
    @Override
    public List<Attribute> getMonitorData()
    public MonitorData getMonitorData()
    {
      long firstCN = readChangeNumber(ChangeNumberType.FIRST);
      long lastCN = readChangeNumber(ChangeNumberType.LAST);
      long numberOfChanges = lastCN == NO_KEY ? 0 : lastCN - firstCN + 1;
      final List<Attribute> attributes = new ArrayList<>();
      attributes.add(toAttribute(ChangeNumberType.FIRST, firstCN));
      attributes.add(toAttribute(ChangeNumberType.LAST, lastCN));
      attributes.add(Attributes.create("count", Long.toString(numberOfChanges)));
      final MonitorData attributes = new MonitorData(3);
      attributes.add(ChangeNumberType.FIRST.getAttributeName(), firstCN);
      attributes.add(ChangeNumberType.LAST.getAttributeName(), lastCN);
      attributes.add("count", numberOfChanges);
      return attributes;
    }
    private Attribute toAttribute(final ChangeNumberType cnType, long changeNumber)
    {
      return Attributes.create(cnType.getAttributeName(), String.valueOf(changeNumber));
    }
    private long readChangeNumber(final ChangeNumberType type)
    {
      try
opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileReplicaDB.java
@@ -17,9 +17,7 @@
import static org.opends.messages.ReplicationMessages.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import net.jcip.annotations.Immutable;
@@ -27,6 +25,7 @@
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.DirectoryServer;
import org.opends.server.replication.common.CSN;
@@ -39,8 +38,6 @@
import org.opends.server.replication.server.changelog.api.DBCursor.KeyMatchingStrategy;
import org.opends.server.replication.server.changelog.api.DBCursor.PositionStrategy;
import org.opends.server.replication.server.changelog.file.Log.RepositionableCursor;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.InitializationException;
@@ -250,30 +247,24 @@
   */
  private class DbMonitorProvider extends MonitorProvider<MonitorProviderCfg>
  {
    /** {@inheritDoc} */
    @Override
    public List<Attribute> getMonitorData()
    public MonitorData getMonitorData()
    {
      final List<Attribute> attributes = new ArrayList<>();
      create(attributes, "replicationServer-database",String.valueOf(serverId));
      create(attributes, "domain-name", baseDN.toString());
      final MonitorData attributes = new MonitorData(4);
      attributes.add("replicationServer-database", serverId);
      attributes.add("domain-name", baseDN);
      final CSNLimits limits = csnLimits;
      if (limits.oldestCSN != null)
      {
        create(attributes, "first-change", encode(limits.oldestCSN));
        attributes.add("first-change", encode(limits.oldestCSN));
      }
      if (limits.newestCSN != null)
      {
        create(attributes, "last-change", encode(limits.newestCSN));
        attributes.add("last-change", encode(limits.newestCSN));
      }
      return attributes;
    }
    private void create(final List<Attribute> attributes, final String name, final String value)
    {
      attributes.add(Attributes.create(name, value));
    }
    private String encode(final CSN csn)
    {
      return csn + " " + new Date(csn.getTime());
opendj-server-legacy/src/main/java/org/opends/server/replication/service/ReplicationDomain.java
@@ -26,9 +26,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
@@ -51,12 +49,35 @@
import org.opends.server.admin.std.meta.ReplicationDomainCfgDefn.AssuredType;
import org.opends.server.admin.std.server.ReplicationDomainCfg;
import org.opends.server.api.DirectoryThread;
import org.opends.server.api.MonitorData;
import org.opends.server.backends.task.Task;
import org.opends.server.replication.common.*;
import org.opends.server.replication.protocol.*;
import org.opends.server.replication.common.AssuredMode;
import org.opends.server.replication.common.CSN;
import org.opends.server.replication.common.CSNGenerator;
import org.opends.server.replication.common.DSInfo;
import org.opends.server.replication.common.RSInfo;
import org.opends.server.replication.common.ServerState;
import org.opends.server.replication.common.ServerStatus;
import org.opends.server.replication.common.StatusMachine;
import org.opends.server.replication.common.StatusMachineEvent;
import org.opends.server.replication.protocol.AckMsg;
import org.opends.server.replication.protocol.ChangeStatusMsg;
import org.opends.server.replication.protocol.DoneMsg;
import org.opends.server.replication.protocol.EntryMsg;
import org.opends.server.replication.protocol.ErrorMsg;
import org.opends.server.replication.protocol.HeartbeatMsg;
import org.opends.server.replication.protocol.InitializeRcvAckMsg;
import org.opends.server.replication.protocol.InitializeRequestMsg;
import org.opends.server.replication.protocol.InitializeTargetMsg;
import org.opends.server.replication.protocol.ProtocolVersion;
import org.opends.server.replication.protocol.ReplSessionSecurity;
import org.opends.server.replication.protocol.ReplicationMsg;
import org.opends.server.replication.protocol.ResetGenerationIdMsg;
import org.opends.server.replication.protocol.RoutableMsg;
import org.opends.server.replication.protocol.TopologyMsg;
import org.opends.server.replication.protocol.UpdateMsg;
import org.opends.server.tasks.InitializeTargetTask;
import org.opends.server.tasks.InitializeTask;
import org.opends.server.types.Attribute;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.DirectoryException;
@@ -3430,12 +3451,10 @@
   * Subclasses should use this method to add additional monitoring information
   * in the ReplicationDomain.
   *
   * @return Additional monitoring attributes that will be added in the
   *         ReplicationDomain monitoring entry.
   * @param monitorData where to additional monitoring attributes
   */
  public Collection<Attribute> getAdditionalMonitoring()
  public void addAdditionalMonitoring(MonitorData monitorData)
  {
    return new ArrayList<>();
  }
  /**
opendj-server-legacy/src/main/java/org/opends/server/replication/service/ReplicationMonitor.java
@@ -12,21 +12,19 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2006-2010 Sun Microsystems, Inc.
 * Portions copyright 2013-2015 ForgeRock AS.
 * Portions copyright 2013-2016 ForgeRock AS.
 */
package org.opends.server.replication.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.replication.service.ReplicationDomain.ImportExportContext;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.Attributes;
/**
 * Class used to generate monitoring information for the replication.
@@ -66,111 +64,83 @@
        + ",cn=Replication";
  }
  /**
   * 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.
   */
  @Override
  public List<Attribute> getMonitorData()
  public MonitorData getMonitorData()
  {
    List<Attribute> attributes = new ArrayList<>();
    final MonitorData attributes = new MonitorData(41);
    addMonitorData(attributes, "domain-name", domain.getBaseDN());
    addMonitorData(attributes, "connected-to", domain.getReplicationServer());
    addMonitorData(attributes, "lost-connections", domain.getNumLostConnections());
    addMonitorData(attributes, "received-updates", domain.getNumRcvdUpdates());
    addMonitorData(attributes, "sent-updates", domain.getNumSentUpdates());
    attributes.add("domain-name", domain.getBaseDN());
    attributes.add("server-id", domain.getServerId());
    attributes.add("connected-to", domain.getReplicationServer());
    attributes.add("lost-connections", domain.getNumLostConnections());
    // get number of changes replayed
    addMonitorData(attributes, "replayed-updates", domain.getNumProcessedUpdates());
    addMonitorData(attributes, "server-id", domain.getServerId());
    attributes.add("received-updates", domain.getNumRcvdUpdates());
    attributes.add("sent-updates", domain.getNumSentUpdates());
    attributes.add("replayed-updates", domain.getNumProcessedUpdates());
    // get window information
    addMonitorData(attributes, "max-rcv-window", domain.getMaxRcvWindow());
    addMonitorData(attributes, "current-rcv-window", domain.getCurrentRcvWindow());
    addMonitorData(attributes, "max-send-window", domain.getMaxSendWindow());
    addMonitorData(attributes, "current-send-window", domain.getCurrentSendWindow());
    attributes.add("max-rcv-window", domain.getMaxRcvWindow());
    attributes.add("current-rcv-window", domain.getCurrentRcvWindow());
    attributes.add("max-send-window", domain.getMaxSendWindow());
    attributes.add("current-send-window", domain.getCurrentSendWindow());
    // get the Server State
    final String ATTR_SERVER_STATE = "server-state";
    AttributeBuilder builder = new AttributeBuilder(ATTR_SERVER_STATE);
    builder.addAllStrings(domain.getServerState().toStringSet());
    attributes.add(builder.toAttribute());
    addMonitorData(attributes, "ssl-encryption", domain.isSessionEncrypted());
    addMonitorData(attributes, "generation-id", domain.getGenerationID());
    attributes.add("server-state", domain.getServerState().toStringSet());
    attributes.add("ssl-encryption", domain.isSessionEncrypted());
    attributes.add("generation-id", domain.getGenerationID());
    // Add import/export monitoring attributes
    final ImportExportContext ieContext = domain.getImportExportContext();
    if (ieContext != null)
    {
      addMonitorData(attributes, "total-update", ieContext.importInProgress() ? "import" : "export");
      addMonitorData(attributes, "total-update-entry-count", ieContext.getTotalEntryCount());
      addMonitorData(attributes, "total-update-entry-left", ieContext.getLeftEntryCount());
      attributes.add("total-update", ieContext.importInProgress() ? "import" : "export");
      attributes.add("total-update-entry-count", ieContext.getTotalEntryCount());
      attributes.add("total-update-entry-left", ieContext.getLeftEntryCount());
    }
    // Add the concrete Domain attributes
    attributes.addAll(domain.getAdditionalMonitoring());
    domain.addAdditionalMonitoring(attributes);
    /*
     * Add assured replication related monitoring fields
     * (see domain.getXXX() method comment for field meaning)
     */
    addMonitorData(attributes, "assured-sr-sent-updates", domain.getAssuredSrSentUpdates());
    addMonitorData(attributes, "assured-sr-acknowledged-updates", domain.getAssuredSrAcknowledgedUpdates());
    addMonitorData(attributes, "assured-sr-not-acknowledged-updates", domain.getAssuredSrNotAcknowledgedUpdates());
    addMonitorData(attributes, "assured-sr-timeout-updates", domain.getAssuredSrTimeoutUpdates());
    addMonitorData(attributes, "assured-sr-wrong-status-updates", domain.getAssuredSrWrongStatusUpdates());
    addMonitorData(attributes, "assured-sr-replay-error-updates", domain.getAssuredSrReplayErrorUpdates());
    addMonitorData(attributes, "assured-sr-server-not-acknowledged-updates", domain
        .getAssuredSrServerNotAcknowledgedUpdates());
    addMonitorData(attributes, "assured-sr-received-updates", domain.getAssuredSrReceivedUpdates());
    addMonitorData(attributes, "assured-sr-received-updates-acked", domain.getAssuredSrReceivedUpdatesAcked());
    addMonitorData(attributes, "assured-sr-received-updates-not-acked", domain.getAssuredSrReceivedUpdatesNotAcked());
    addMonitorData(attributes, "assured-sd-sent-updates", domain.getAssuredSdSentUpdates());
    addMonitorData(attributes, "assured-sd-acknowledged-updates", domain.getAssuredSdAcknowledgedUpdates());
    addMonitorData(attributes, "assured-sd-timeout-updates", domain.getAssuredSdTimeoutUpdates());
    attributes.add("assured-sr-sent-updates", domain.getAssuredSrSentUpdates());
    attributes.add("assured-sr-acknowledged-updates", domain.getAssuredSrAcknowledgedUpdates());
    attributes.add("assured-sr-not-acknowledged-updates", domain.getAssuredSrNotAcknowledgedUpdates());
    attributes.add("assured-sr-timeout-updates", domain.getAssuredSrTimeoutUpdates());
    attributes.add("assured-sr-wrong-status-updates", domain.getAssuredSrWrongStatusUpdates());
    attributes.add("assured-sr-replay-error-updates", domain.getAssuredSrReplayErrorUpdates());
    addMonitorData(attributes,
        "assured-sr-server-not-acknowledged-updates",
        domain.getAssuredSrServerNotAcknowledgedUpdates());
    attributes.add("assured-sr-received-updates", domain.getAssuredSrReceivedUpdates());
    attributes.add("assured-sr-received-updates-acked", domain.getAssuredSrReceivedUpdatesAcked());
    attributes.add("assured-sr-received-updates-not-acked", domain.getAssuredSrReceivedUpdatesNotAcked());
    attributes.add("assured-sd-sent-updates", domain.getAssuredSdSentUpdates());
    attributes.add("assured-sd-acknowledged-updates", domain.getAssuredSdAcknowledgedUpdates());
    attributes.add("assured-sd-timeout-updates", domain.getAssuredSdTimeoutUpdates());
    addMonitorData(attributes, "assured-sd-server-timeout-updates", domain.getAssuredSdServerTimeoutUpdates());
    // Status related monitoring fields
    addMonitorData(attributes, "last-status-change-date", domain.getLastStatusChangeDate());
    addMonitorData(attributes, "status", domain.getStatus());
    attributes.add("last-status-change-date", domain.getLastStatusChangeDate());
    attributes.add("status", domain.getStatus());
    return attributes;
  }
  private void addMonitorData(List<Attribute> attributes, String attrName,
      Map<Integer, Integer> serverIdToNb)
  private void addMonitorData(MonitorData attributes, String attrName, Map<Integer, Integer> serverIdToNb)
  {
    if (!serverIdToNb.isEmpty())
    {
      final AttributeBuilder builder = new AttributeBuilder(attrName);
      Collection<String> values = new ArrayList<>();
      for (Entry<Integer, Integer> entry : serverIdToNb.entrySet())
      {
        final Integer serverId = entry.getKey();
        final Integer nb = entry.getValue();
        builder.add(serverId + ":" + nb);
        values.add(serverId + ":" + nb);
      }
      attributes.add(builder.toAttribute());
      attributes.add(attrName, values);
    }
  }
  /**
   * Adds an attribute with a value to the list of monitoring attributes.
   *
   * @param attributes the list of monitoring attributes
   * @param attrName the name of the attribute to add.
   * @param value The value of he attribute to add.
   */
  public static void addMonitorData(List<Attribute> attributes, String attrName, Object value)
  {
    attributes.add(Attributes.create(attrName, String.valueOf(value)));
  }
}
opendj-server-legacy/src/test/java/org/opends/server/monitors/TestMonitorProvider.java
@@ -12,38 +12,38 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2006-2010 Sun Microsystems, Inc.
 * Portions Copyright 2014 ForgeRock AS.
 * Portions Copyright 2014-2016 ForgeRock AS.
 */
package org.opends.server.monitors;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorProvider;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.types.InitializationException;
import org.opends.server.types.Attribute;
import java.util.List;
import java.util.Collections;
/**
 * This test monitor provider has a DN embedded in its instance name.
 */
class TestMonitorProvider extends MonitorProvider<MonitorProviderCfg>
{
  @Override
  public void initializeMonitorProvider(MonitorProviderCfg configuration)
       throws ConfigException, InitializationException
  {
    // No implementation required.
  }
  @Override
  public String getMonitorInstanceName()
  {
    return "Test monitor for dc=example,dc=com";
  }
  public List<Attribute> getMonitorData()
  @Override
  public MonitorData getMonitorData()
  {
    return Collections.emptyList();
    return new MonitorData(0);
  }
}
opendj-server-legacy/src/test/java/org/opends/server/replication/StressTest.java
@@ -30,6 +30,7 @@
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.TestCaseUtils;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.api.MonitorData;
import org.opends.server.api.MonitorProvider;
import org.opends.server.core.AddOperation;
import org.opends.server.core.DirectoryServer;
@@ -38,34 +39,29 @@
import org.opends.server.replication.protocol.AddMsg;
import org.opends.server.replication.protocol.ReplicationMsg;
import org.opends.server.replication.service.ReplicationBroker;
import org.opends.server.types.*;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
import org.opends.server.types.Modification;
import org.opends.server.types.Operation;
import org.opends.server.types.OperationType;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
 * Stress test for the synchronization code using the ReplicationBroker API.
 */
/** Stress test for the synchronization code using the ReplicationBroker API. */
@SuppressWarnings("javadoc")
public class StressTest extends ReplicationTestCase
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
  private static final String REPLICATION_STRESS_TEST =
    "Replication Stress Test";
  private static final String REPLICATION_STRESS_TEST = "Replication Stress Test";
  private BrokerReader reader;
  /** A "person" entry. */
  private Entry personEntry;
  private int replServerPort;
  /**
   * Stress test from LDAP server to client using the ReplicationBroker API.
   */
  /** Stress test from LDAP server to client using the ReplicationBroker API. */
  @Test(enabled=false, groups="slow")
  public void fromServertoBroker() throws Exception
  {
@@ -210,7 +206,6 @@
      this.count = count;
    }
    /** {@inheritDoc} */
    @Override
    public void run()
    {
@@ -236,17 +231,14 @@
  {
    private ReplicationBroker broker;
    private int count;
    private Boolean finished = false;
    private boolean finished;
    /**
     * Creates a new Stress Test Reader.
     */
    /** Creates a new Stress Test Reader. */
    public BrokerReader(ReplicationBroker broker)
    {
      this.broker = broker;
    }
    /** {@inheritDoc} */
    @Override
    public void run()
    {
@@ -307,13 +299,19 @@
  private class Monitor extends MonitorProvider<MonitorProviderCfg>
  {
    @Override
    public List<Attribute> getMonitorData()
    public MonitorData getMonitorData()
    {
      String value = reader != null ? String.valueOf(reader.getCurrentCount()) : "not yet started";
      List<Attribute> list = new LinkedList<>();
      list.add(Attributes.create("received-messages", value));
      list.add(Attributes.create("base-dn", "ou=People," + TEST_ROOT_DN_STRING));
      return list;
      MonitorData attrs = new MonitorData(2);
      if (reader != null)
      {
        attrs.add("received-messages", reader.getCurrentCount());
      }
      else
      {
        attrs.add("received-messages", "not yet started");
      }
      attrs.add("base-dn", "ou=People," + TEST_ROOT_DN_STRING);
      return attrs;
    }
    @Override
@@ -327,10 +325,6 @@
    throws ConfigException, InitializationException
    {
      // nothing to do
    }
  }
}