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

Jean-Noel Rouvignac
02.03.2014 16bc17a5dec28b9bbcc211c9a6b7859b5b668848
opendj3-server-dev/src/server/org/opends/server/replication/server/ChangelogBaseDNVirtualAttributeProvider.java
File was renamed from opendj3-server-dev/src/server/org/opends/server/replication/common/ChangelogBaseDNVirtualAttributeProvider.java
@@ -24,14 +24,16 @@
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions Copyright 2011-2014 ForgeRock AS
 */
package org.opends.server.replication.common;
package org.opends.server.replication.server;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
import org.opends.server.api.VirtualAttributeProvider;
import org.opends.server.core.SearchOperation;
import org.opends.server.types.*;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.opends.server.types.Entry;
import org.opends.server.types.VirtualAttributeRule;
import org.opends.server.util.ServerConstants;
import static org.opends.messages.ExtensionMessages.*;
@@ -40,8 +42,7 @@
 * This class implements a virtual attribute provider that specifies the
 * changelog attribute of the root DSE entry that contain the baseDn of the ECL.
 */
public class ChangelogBaseDNVirtualAttributeProvider
       extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
class ChangelogBaseDNVirtualAttributeProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
{
  /**
@@ -61,14 +62,14 @@
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public boolean isMultiValued()
  {
    return false;
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public Attribute getValues(Entry entry, VirtualAttributeRule rule)
  {
    if (values == null)
@@ -80,7 +81,7 @@
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public boolean isSearchable(VirtualAttributeRule rule,
                              SearchOperation searchOperation,
                              boolean isPreIndexed)
@@ -90,14 +91,12 @@
  }
  /** {@inheritDoc} */
  @Override()
  public void processSearch(VirtualAttributeRule rule,
                            SearchOperation searchOperation)
  @Override
  public void processSearch(VirtualAttributeRule rule, SearchOperation searchOperation)
  {
    searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
    final LocalizableMessage message = ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE.get(
            rule.getAttributeType().getNameOrOID());
    searchOperation.appendErrorMessage(message);
    searchOperation.appendErrorMessage(ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE.get(
            rule.getAttributeType().getNameOrOID()));
  }
}
opendj3-server-dev/src/server/org/opends/server/replication/server/FirstChangeNumberVirtualAttributeProvider.java
File was renamed from opendj3-server-dev/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java
@@ -24,24 +24,24 @@
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions Copyright 2011-2014 ForgeRock AS
 */
package org.opends.server.replication.common;
package org.opends.server.replication.server;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
import org.opends.server.api.VirtualAttributeProvider;
import org.opends.server.core.SearchOperation;
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.types.*;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.opends.server.types.Entry;
import org.opends.server.types.VirtualAttributeRule;
import static org.opends.messages.ExtensionMessages.*;
/**
 * Virtual attribute returning the oldest change number from the changelogDB.
 */
public class FirstChangeNumberVirtualAttributeProvider
       extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
class FirstChangeNumberVirtualAttributeProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
{
  /** The tracer object for the debug logger. */
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
@@ -56,12 +56,11 @@
   */
  public FirstChangeNumberVirtualAttributeProvider(ReplicationServer replicationServer)
  {
    super();
    this.replicationServer = replicationServer;
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public boolean isMultiValued()
  {
    return false;
@@ -76,7 +75,7 @@
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public Attribute getValues(Entry entry,VirtualAttributeRule rule)
  {
    String value = "0";
@@ -84,8 +83,7 @@
    {
      if (replicationServer != null)
      {
        final long[] limits = replicationServer.getECLChangeNumberLimits();
        value = String.valueOf(limits[0]);
        value = String.valueOf(replicationServer.getOldestChangeNumber());
      }
    }
    catch(Exception e)
@@ -100,7 +98,7 @@
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public boolean isSearchable(VirtualAttributeRule rule,
                              SearchOperation searchOperation,
                              boolean isPreIndexed)
@@ -111,14 +109,12 @@
  }
  /** {@inheritDoc} */
  @Override()
  public void processSearch(VirtualAttributeRule rule,
                            SearchOperation searchOperation)
  @Override
  public void processSearch(VirtualAttributeRule rule, SearchOperation searchOperation)
  {
    searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
    final LocalizableMessage message = ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE.get(
            rule.getAttributeType().getNameOrOID());
    searchOperation.appendErrorMessage(message);
    searchOperation.appendErrorMessage(ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE.get(
            rule.getAttributeType().getNameOrOID()));
  }
}
opendj3-server-dev/src/server/org/opends/server/replication/server/LastChangeNumberVirtualAttributeProvider.java
File was renamed from opendj3-server-dev/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java
@@ -24,24 +24,24 @@
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions Copyright 2011-2014 ForgeRock AS
 */
package org.opends.server.replication.common;
package org.opends.server.replication.server;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
import org.opends.server.api.VirtualAttributeProvider;
import org.opends.server.core.SearchOperation;
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.types.*;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.opends.server.types.Entry;
import org.opends.server.types.VirtualAttributeRule;
import static org.opends.messages.ExtensionMessages.*;
/**
 * Virtual attribute returning the newest change number from the changelogDB.
 */
public class LastChangeNumberVirtualAttributeProvider
       extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
class LastChangeNumberVirtualAttributeProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
{
  /** The tracer object for the debug logger. */
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
@@ -56,12 +56,11 @@
   */
  public LastChangeNumberVirtualAttributeProvider(ReplicationServer replicationServer)
  {
    super();
    this.replicationServer = replicationServer;
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public boolean isMultiValued()
  {
    return false;
@@ -76,7 +75,7 @@
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public Attribute getValues(Entry entry,VirtualAttributeRule rule)
  {
    String value = "0";
@@ -84,8 +83,7 @@
    {
      if (replicationServer != null)
      {
        final long[] limits = replicationServer.getECLChangeNumberLimits();
        value = String.valueOf(limits[1]);
        value = String.valueOf(replicationServer.getNewestChangeNumber());
      }
    }
    catch(Exception e)
@@ -100,7 +98,7 @@
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public boolean isSearchable(VirtualAttributeRule rule,
                              SearchOperation searchOperation,
                              boolean isPreIndexed)
@@ -111,14 +109,12 @@
  }
  /** {@inheritDoc} */
  @Override()
  public void processSearch(VirtualAttributeRule rule,
                            SearchOperation searchOperation)
  @Override
  public void processSearch(VirtualAttributeRule rule, SearchOperation searchOperation)
  {
    searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
    final LocalizableMessage message = ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE.get(
            rule.getAttributeType().getNameOrOID());
    searchOperation.appendErrorMessage(message);
    searchOperation.appendErrorMessage(ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE.get(rule.getAttributeType()
        .getNameOrOID()));
  }
}
opendj3-server-dev/src/server/org/opends/server/replication/server/LastCookieVirtualProvider.java
File was renamed from opendj3-server-dev/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java
@@ -24,15 +24,13 @@
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions Copyright 2011-2014 ForgeRock AS
 */
package org.opends.server.replication.common;
package org.opends.server.replication.server;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
import org.opends.server.api.VirtualAttributeProvider;
import org.opends.server.core.SearchOperation;
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.opends.server.types.Entry;
@@ -46,8 +44,7 @@
 * that contains the last (newest) cookie (cross domain state)
 * available in the server.
 */
public class LastCookieVirtualProvider
   extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
class LastCookieVirtualProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
@@ -61,28 +58,26 @@
   */
  public LastCookieVirtualProvider(ReplicationServer replicationServer)
  {
    super();
    this.replicationServer = replicationServer;
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public boolean hasValue(Entry entry, VirtualAttributeRule rule)
  {
    // There's only a value for the rootDSE, i.e. the Null DN.
    return entry.getName().isRootDN();
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public boolean isMultiValued()
  {
    return false;
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public Attribute getValues(Entry entry, VirtualAttributeRule rule)
  {
    try
@@ -101,7 +96,7 @@
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public boolean isSearchable(VirtualAttributeRule rule,
                              SearchOperation searchOperation,
                              boolean isPreIndexed)
@@ -112,14 +107,13 @@
  }
  /** {@inheritDoc} */
  @Override()
  @Override
  public void processSearch(VirtualAttributeRule rule,
                            SearchOperation searchOperation)
  {
    searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
    final LocalizableMessage message = ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE.get(
            rule.getAttributeType().getNameOrOID());
    searchOperation.appendErrorMessage(message);
    searchOperation.appendErrorMessage(ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE.get(
            rule.getAttributeType().getNameOrOID()));
  }
}
opendj3-server-dev/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -38,14 +38,16 @@
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchScope;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.meta.VirtualAttributeCfgDefn.ConflictBehavior;
import org.opends.server.admin.std.meta.ReplicationServerCfgDefn.ReplicationDBImplementation;
import org.opends.server.admin.std.meta.VirtualAttributeCfgDefn.ConflictBehavior;
import org.opends.server.admin.std.server.ReplicationServerCfg;
import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
import org.opends.server.api.VirtualAttributeProvider;
import org.opends.server.backends.ChangelogBackend;
import org.opends.server.core.DirectoryServer;
import org.opends.server.replication.common.*;
import org.opends.server.replication.common.CSN;
import org.opends.server.replication.common.MultiDomainServerState;
import org.opends.server.replication.common.ServerState;
import org.opends.server.replication.plugin.MultimasterReplication;
import org.opends.server.replication.protocol.*;
import org.opends.server.replication.server.changelog.api.ChangeNumberIndexDB;
@@ -1225,38 +1227,50 @@
  }
  /**
   * Get the oldest and newest change numbers.
   * Returns the oldest change number in the change number index DB.
   *
   * @return an array of size 2 holding the oldest and newest change numbers at
   *         indexes 0 and 1.
   * @return the oldest change number in the change number index DB
   * @throws DirectoryException
   *           When it happens.
   *           When a problem happens
   */
  public long[] getECLChangeNumberLimits() throws DirectoryException
  public long getOldestChangeNumber() throws DirectoryException
  {
    try
    {
      final ChangeNumberIndexDB cnIndexDB = getChangeNumberIndexDB();
      final ChangeNumberIndexRecord oldestRecord = cnIndexDB.getOldestRecord();
      if (oldestRecord == null)
      if (oldestRecord != null)
      {
        // The database is empty, just keep increasing numbers since last time
        // we generated one change number.
        final long lastGeneratedCN = cnIndexDB.getLastGeneratedChangeNumber();
        return new long[] { lastGeneratedCN, lastGeneratedCN };
        return oldestRecord.getChangeNumber();
      }
      // database is empty
      return cnIndexDB.getLastGeneratedChangeNumber();
    }
    catch (ChangelogException e)
    {
      throw new DirectoryException(ResultCode.OPERATIONS_ERROR, e);
    }
  }
  /**
   * Returns the newest change number in the change number index DB.
   *
   * @return the newest change number in the change number index DB
   * @throws DirectoryException
   *           When a problem happens
   */
  public long getNewestChangeNumber() throws DirectoryException
  {
    try
    {
      final ChangeNumberIndexDB cnIndexDB = getChangeNumberIndexDB();
      final ChangeNumberIndexRecord newestRecord = cnIndexDB.getNewestRecord();
      if (newestRecord == null)
      if (newestRecord != null)
      {
        // Edge case: DB was cleaned (or purged) in between calls to
        // getOldest*() and getNewest*().
        // The only remaining solution is to fail fast.
        throw new DirectoryException(ResultCode.OPERATIONS_ERROR,
            ERR_READING_OLDEST_THEN_NEWEST_IN_CHANGENUMBER_DATABASE.get());
        return newestRecord.getChangeNumber();
      }
      return new long[] { oldestRecord.getChangeNumber(),
        newestRecord.getChangeNumber() };
      // database is empty
      return cnIndexDB.getLastGeneratedChangeNumber();
    }
    catch (ChangelogException e)
    {