From b1ae3d652cc31c837721fd750623cec531b94d93 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 04 Sep 2013 10:57:18 +0000
Subject: [PATCH] OPENDJ-1116 Introduce abstraction for the changelog DB

---
 opends/src/server/org/opends/server/replication/server/MessageHandler.java                                            |    4 
 opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java                            |   10 ++
 opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java                  |   12 +-
 opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDraftCNKey.java                        |   15 +--
 opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java                         |   16 ++--
 opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbIterator.java                            |    4 
 opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDBCursor.java                   |    2 
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandlerTest.java |    2 
 /dev/null                                                                                                             |   58 --------------
 opends/src/server/org/opends/server/replication/server/ReplicationServer.java                                         |   16 ++--
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java                    |    2 
 opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java                 |   12 +-
 opends/src/server/org/opends/server/replication/protocol/ECLUpdateMsg.java                                            |   11 +-
 opends/src/server/org/opends/server/workflowelement/externalchangelog/ECLSearchOperation.java                         |    2 
 opends/src/server/org/opends/server/replication/server/ECLServerHandler.java                                          |   10 +-
 opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDB.java                                    |    8 +-
 opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandler.java                             |   20 ++--
 opends/src/server/org/opends/server/replication/server/changelog/api/ReplicaDBCursor.java                             |    2 
 18 files changed, 78 insertions(+), 128 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java b/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java
index 7e7a969..8bd4a1b 100644
--- a/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java
@@ -27,9 +27,6 @@
  */
 package org.opends.server.replication.common;
 
-import static org.opends.messages.ExtensionMessages.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -48,7 +45,8 @@
 import org.opends.server.util.ServerConstants;
 import org.opends.server.workflowelement.externalchangelog.ECLWorkflowElement;
 
-
+import static org.opends.messages.ExtensionMessages.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
 
 /**
  * This class implements a virtual attribute provider that allows administrators
@@ -61,7 +59,7 @@
        extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
        implements ConfigurationChangeListener<UserDefinedVirtualAttributeCfg>
 {
-  // The tracer object for the debug logger.
+  /** The tracer object for the debug logger. */
   private static final DebugTracer TRACER = getTracer();
 
   /**
@@ -128,7 +126,7 @@
   @Override()
   public Set<AttributeValue> getValues(Entry entry,VirtualAttributeRule rule)
   {
-    String first="0";
+    String first = "0";
     try
     {
       ECLWorkflowElement eclwe = (ECLWorkflowElement)
@@ -142,7 +140,7 @@
 
         ReplicationServer rs = eclwe.getReplicationServer();
         rs.disableEligibility(excludedDomains);
-        int[] limits = rs.getECLChangeNumberLimits(
+        long[] limits = rs.getECLChangeNumberLimits(
             rs.getEligibleCSN(), excludedDomains);
 
         first = String.valueOf(limits[0]);
diff --git a/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java b/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java
index bae52ea..577c8fb 100644
--- a/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java
@@ -27,9 +27,6 @@
  */
 package org.opends.server.replication.common;
 
-import static org.opends.messages.ExtensionMessages.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -48,7 +45,8 @@
 import org.opends.server.util.ServerConstants;
 import org.opends.server.workflowelement.externalchangelog.ECLWorkflowElement;
 
-
+import static org.opends.messages.ExtensionMessages.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
 
 /**
  * This class implements a virtual attribute provider that allows administrators
@@ -61,7 +59,9 @@
        extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
        implements ConfigurationChangeListener<UserDefinedVirtualAttributeCfg>
 {
+  /** The tracer object for the debug logger. */
   private static final DebugTracer TRACER = getTracer();
+
   /**
    * Creates a new instance of this member virtual attribute provider.
    */
@@ -109,7 +109,6 @@
   }
 
 
-
   /**
    *  {@inheritDoc}
    */
@@ -121,7 +120,6 @@
   }
 
 
-
   /**
    * {@inheritDoc}
    */
@@ -142,7 +140,7 @@
 
         ReplicationServer rs = eclwe.getReplicationServer();
         rs.disableEligibility(excludedDomains);
-        int[] limits = rs.getECLChangeNumberLimits(
+        long[] limits = rs.getECLChangeNumberLimits(
             rs.getEligibleCSN(), excludedDomains);
 
         last = String.valueOf(limits[1]);
diff --git a/opends/src/server/org/opends/server/replication/protocol/ECLUpdateMsg.java b/opends/src/server/org/opends/server/replication/protocol/ECLUpdateMsg.java
index 8736254..c053665 100644
--- a/opends/src/server/org/opends/server/replication/protocol/ECLUpdateMsg.java
+++ b/opends/src/server/org/opends/server/replication/protocol/ECLUpdateMsg.java
@@ -49,7 +49,7 @@
   private MultiDomainServerState cookie;
 
   /** The changeNumber as specified by draft-good-ldap-changelog. */
-  private int changeNumber;
+  private long changeNumber;
 
   /**
    * Creates a new message.
@@ -184,7 +184,10 @@
   {
     byte[] byteCookie = String.valueOf(cookie).getBytes("UTF-8");
     byte[] byteBaseDN = String.valueOf(baseDN).getBytes("UTF-8");
-    byte[] byteChangeNumber = Integer.toString(changeNumber).getBytes("UTF-8");
+    // FIXME JNR Changing line below to use long would require a protocol
+    // version change. Leave it like this for now until the need arises.
+    byte[] byteChangeNumber =
+        Integer.toString((int) changeNumber).getBytes("UTF-8");
     byte[] byteUpdateMsg = updateMsg.getBytes(protocolVersion);
 
     int length = 1 + byteCookie.length +
@@ -211,7 +214,7 @@
    * Setter for the changeNumber of this change.
    * @param changeNumber the provided changeNumber for this change.
    */
-  public void setChangeNumber(int changeNumber)
+  public void setChangeNumber(long changeNumber)
   {
     this.changeNumber = changeNumber;
   }
@@ -220,7 +223,7 @@
    * Getter for the changeNumber of this change.
    * @return the changeNumber of this change.
    */
-  public int getChangeNumber()
+  public long getChangeNumber()
   {
     return this.changeNumber;
   }
diff --git a/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java b/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
index ff7da17..168a69d 100644
--- a/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
@@ -581,7 +581,7 @@
         return null;
       }
 
-      final int firstChangeNumber = cnIndexDB.getFirstChangeNumber();
+      final long firstChangeNumber = cnIndexDB.getFirstChangeNumber();
       final String crossDomainStartState =
           cnIndexDB.getPreviousCookie(firstChangeNumber);
       cnIndexDBCursor = cnIndexDB.getCursorFrom(firstChangeNumber);
@@ -606,10 +606,10 @@
      * Get the draftLimits (from the eligibleCSN got at the beginning of the
      * operation) in order to have the first and possible last change number.
      */
-    final int[] limits = replicationServer.getECLChangeNumberLimits(
+    final long[] limits = replicationServer.getECLChangeNumberLimits(
         eligibleCSN, excludedBaseDNs);
-    final int firstChangeNumber = limits[0];
-    final int lastChangeNumber = limits[1];
+    final long firstChangeNumber = limits[0];
+    final long lastChangeNumber = limits[1];
 
     // If the startChangeNumber provided is lower than the firstChangeNumber in
     // the DB, let's use the lower limit.
@@ -636,7 +636,7 @@
         return null;
       }
 
-      final int lastKey = cnIndexDB.getLastChangeNumber();
+      final long lastKey = cnIndexDB.getLastChangeNumber();
       crossDomainStartState = cnIndexDB.getPreviousCookie(lastKey);
       cnIndexDBCursor = cnIndexDB.getCursorFrom(lastKey);
       return crossDomainStartState;
diff --git a/opends/src/server/org/opends/server/replication/server/MessageHandler.java b/opends/src/server/org/opends/server/replication/server/MessageHandler.java
index c1aa9e0..9df5c26 100644
--- a/opends/src/server/org/opends/server/replication/server/MessageHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/MessageHandler.java
@@ -39,7 +39,7 @@
 import org.opends.server.replication.common.CSN;
 import org.opends.server.replication.common.ServerState;
 import org.opends.server.replication.protocol.UpdateMsg;
-import org.opends.server.replication.server.changelog.api.*;
+import org.opends.server.replication.server.changelog.api.ReplicaDBCursor;
 import org.opends.server.types.*;
 
 import static org.opends.messages.ReplicationMessages.*;
@@ -497,7 +497,7 @@
   private NavigableSet<ReplicaDBCursor> collectAllCursorsWithChanges()
   {
     final NavigableSet<ReplicaDBCursor> results =
-        new TreeSet<ReplicaDBCursor>(new ReplicaDBCursorComparator());
+        new TreeSet<ReplicaDBCursor>();
     for (int serverId : replicationServerDomain.getServerIds())
     {
       // get the last already sent CN from that server to get a cursor
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index 1a4208e..59ce757 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -157,7 +157,7 @@
    * <p>
    * Guarded by cnIndexDBLock
    **/
-  private int lastGeneratedChangeNumber = 0;
+  private long lastGeneratedChangeNumber = 0;
 
   /** Used for protecting {@link ChangeNumberIndexDB} related state. */
   private final Object cnIndexDBLock = new Object();
@@ -1658,7 +1658,7 @@
    *
    * @return the first value.
    */
-  public int getFirstChangeNumber()
+  public long getFirstChangeNumber()
   {
     synchronized (cnIndexDBLock)
     {
@@ -1675,7 +1675,7 @@
    *
    * @return the last value.
    */
-  public int getLastChangeNumber()
+  public long getLastChangeNumber()
   {
     synchronized (cnIndexDBLock)
     {
@@ -1692,7 +1692,7 @@
    *
    * @return The generated change number
    */
-  public int getNewChangeNumber()
+  public long getNewChangeNumber()
   {
     synchronized (cnIndexDBLock)
     {
@@ -1712,7 +1712,7 @@
    * @throws DirectoryException
    *           When it happens.
    */
-  public int[] getECLChangeNumberLimits(CSN crossDomainEligibleCSN,
+  public long[] getECLChangeNumberLimits(CSN crossDomainEligibleCSN,
       Set<String> excludedBaseDNs) throws DirectoryException
   {
     /* The content of the DraftCNdb depends on the SEARCH operations done before
@@ -1735,11 +1735,11 @@
      *     (this diff is done domain by domain)
      */
 
-    int lastChangeNumber;
+    long lastChangeNumber;
     boolean dbEmpty = false;
     final ChangeNumberIndexDB cnIndexDB = getChangeNumberIndexDB();
 
-    int firstChangeNumber = cnIndexDB.getFirstChangeNumber();
+    long firstChangeNumber = cnIndexDB.getFirstChangeNumber();
     Map<String, ServerState> domainsServerStateForLastCN = null;
     CSN csnForLastCN = null;
     String domainForLastCN = null;
@@ -1821,7 +1821,7 @@
       firstChangeNumber += lastGeneratedChangeNumber;
       lastChangeNumber += lastGeneratedChangeNumber;
     }
-    return new int[]{firstChangeNumber, lastChangeNumber};
+    return new long[] { firstChangeNumber, lastChangeNumber };
   }
 
   /**
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java b/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java
index 54d7639..57faad5 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java
@@ -40,7 +40,7 @@
  * @see <a href= "http://tools.ietf.org/html/draft-good-ldap-changelog-04"
  * >OpenDJ Domain Names</a> for more information about the changeNumber.
  */
-public interface ChangeNumberIndexDB extends Runnable
+public interface ChangeNumberIndexDB
 {
 
   /**
@@ -50,7 +50,7 @@
    *          the provided change number.
    * @return the associated CSN, null when none.
    */
-  public CSN getCSN(int changeNumber);
+  public CSN getCSN(long changeNumber);
 
   /**
    * Get the baseDN associated to a provided change number.
@@ -59,7 +59,7 @@
    *          the provided change number.
    * @return the baseDN, null when none.
    */
-  public String getBaseDN(int changeNumber);
+  public String getBaseDN(long changeNumber);
 
   /**
    * Get the previous cookie associated to a provided change number.
@@ -68,21 +68,21 @@
    *          the provided change number.
    * @return the previous cookie, null when none.
    */
-  String getPreviousCookie(int changeNumber);
+  String getPreviousCookie(long changeNumber);
 
   /**
    * Get the first change number stored in this DB.
    *
    * @return Returns the first change number in this DB.
    */
-  int getFirstChangeNumber();
+  long getFirstChangeNumber();
 
   /**
    * Get the last change number stored in this DB.
    *
    * @return Returns the last change number in this DB
    */
-  int getLastChangeNumber();
+  long getLastChangeNumber();
 
   /**
    * Add an update to the list of messages that must be saved to this DB managed
@@ -100,7 +100,7 @@
    * @param csn
    *          The associated replication CSN.
    */
-  void add(int changeNumber, String previousCookie, String baseDN, CSN csn);
+  void add(long changeNumber, String previousCookie, String baseDN, CSN csn);
 
   /**
    * Generate a new {@link ChangeNumberIndexDBCursor} that allows to browse the
@@ -115,7 +115,7 @@
    * @throws ChangelogException
    *           if a database problem happened.
    */
-  ChangeNumberIndexDBCursor getCursorFrom(int startChangeNumber)
+  ChangeNumberIndexDBCursor getCursorFrom(long startChangeNumber)
       throws ChangelogException;
 
   /**
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDBCursor.java b/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDBCursor.java
index 89b45a2..dcbbd8a 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDBCursor.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDBCursor.java
@@ -57,7 +57,7 @@
    *
    * @return The change number field.
    */
-  int getChangeNumber();
+  long getChangeNumber();
 
   /**
    * Skip to the next record of the database.
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicaDBCursor.java b/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicaDBCursor.java
index d2dcfa0..c3a0c31 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicaDBCursor.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicaDBCursor.java
@@ -34,7 +34,7 @@
  * This cursor allows to iterate through the changes received from a given
  * replica (Directory Server) in the topology.
  */
-public interface ReplicaDBCursor extends Closeable
+public interface ReplicaDBCursor extends Closeable, Comparable<ReplicaDBCursor>
 {
 
   /**
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicaDBCursorComparator.java b/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicaDBCursorComparator.java
deleted file mode 100644
index 3db370c..0000000
--- a/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicaDBCursorComparator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE
- * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying information:
- *      Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
- *      Portions copyright 2013 ForgeRock AS
- */
-package org.opends.server.replication.server.changelog.api;
-
-import java.util.Comparator;
-
-import org.opends.server.replication.common.CSN;
-
-/**
- * This class defines a {@link Comparator} that allows to know which
- * {@link ReplicaDBCursor} contain the next {@link UpdateMsg} in the order
- * defined by the {@link CSN} of the {@link UpdateMsg}.
- */
-public class ReplicaDBCursorComparator implements Comparator<ReplicaDBCursor>
-{
-  /**
-   * Compare the {@link CSN} of the {@link ReplicaDBCursor}.
-   *
-   * @param o1
-   *          first cursor.
-   * @param o2
-   *          second cursor.
-   * @return result of the comparison.
-   */
-  @Override
-  public int compare(ReplicaDBCursor o1, ReplicaDBCursor o2)
-  {
-    CSN csn1 = o1.getChange().getCSN();
-    CSN csn2 = o2.getChange().getCSN();
-
-    return CSN.compare(csn1, csn2);
-  }
-}
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDB.java b/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDB.java
index 440c6ad..e95fa04 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDB.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDB.java
@@ -92,7 +92,7 @@
    * @param csn the provided replication CSN to be
    *                     stored associated with this change number.
    */
-  public void addEntry(int changeNumber, String value, String domainBaseDN,
+  public void addEntry(long changeNumber, String value, String domainBaseDN,
       CSN csn)
   {
     try
@@ -187,7 +187,7 @@
    *                           creation.
    * @return The ReplServerDBCursor.
    */
-  public DraftCNDBCursor openReadCursor(int changeNumber)
+  public DraftCNDBCursor openReadCursor(long changeNumber)
       throws ChangelogException
   {
     return new DraftCNDBCursor(changeNumber);
@@ -362,7 +362,7 @@
      * @throws ChangelogException
      *           when the startChangeNumber does not exist.
      */
-    private DraftCNDBCursor(int startChangeNumber) throws ChangelogException
+    private DraftCNDBCursor(long startChangeNumber) throws ChangelogException
     {
       this.key = new ReplicationDraftCNKey(startChangeNumber);
       this.entry = new DatabaseEntry();
@@ -392,7 +392,7 @@
             // We could not move the cursor to the expected startChangeNumber
             if (localCursor.getSearchKeyRange(key, entry, DEFAULT) != SUCCESS)
             {
-              // We could not even move the cursor closed to it => failure
+              // We could not even move the cursor close to it => failure
               throw new ChangelogException(
                   Message.raw("ChangeLog Change Number " + startChangeNumber
                       + " is not available"));
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandler.java b/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandler.java
index 8e958c2..3d57e71 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandler.java
@@ -65,7 +65,7 @@
  * This class publishes some monitoring information below <code>
  * cn=monitor</code>.
  */
-public class DraftCNDbHandler implements ChangeNumberIndexDB
+public class DraftCNDbHandler implements ChangeNumberIndexDB, Runnable
 {
   /**
    * The tracer object for the debug logger.
@@ -136,7 +136,7 @@
 
   /** {@inheritDoc} */
   @Override
-  public synchronized void add(int changeNumber, String previousCookie,
+  public synchronized void add(long changeNumber, String previousCookie,
       String baseDN, CSN csn)
   {
     db.addEntry(changeNumber, previousCookie, baseDN, csn);
@@ -152,14 +152,14 @@
 
   /** {@inheritDoc} */
   @Override
-  public int getFirstChangeNumber()
+  public long getFirstChangeNumber()
   {
     return db.readFirstChangeNumber();
   }
 
   /** {@inheritDoc} */
   @Override
-  public int getLastChangeNumber()
+  public long getLastChangeNumber()
   {
     return db.readLastChangeNumber();
   }
@@ -207,7 +207,7 @@
    * @throws ChangelogException
    *           if a database problem occurs.
    */
-  DraftCNDBCursor getReadCursor(int startChangeNumber)
+  DraftCNDBCursor getReadCursor(long startChangeNumber)
       throws ChangelogException
   {
     return db.openReadCursor(startChangeNumber);
@@ -215,7 +215,7 @@
 
   /** {@inheritDoc} */
   @Override
-  public ChangeNumberIndexDBCursor getCursorFrom(int startChangeNumber)
+  public ChangeNumberIndexDBCursor getCursorFrom(long startChangeNumber)
       throws ChangelogException
   {
     return new DraftCNDbIterator(db, startChangeNumber);
@@ -516,7 +516,7 @@
 
   /** {@inheritDoc} */
   @Override
-  public String getPreviousCookie(int changeNumber)
+  public String getPreviousCookie(long changeNumber)
   {
     DraftCNDBCursor cursor = null;
     try
@@ -537,7 +537,7 @@
 
   /** {@inheritDoc} */
   @Override
-  public CSN getCSN(int changeNumber)
+  public CSN getCSN(long changeNumber)
   {
     DraftCNDBCursor cursor = null;
     try
@@ -558,7 +558,7 @@
 
   /**{@inheritDoc}*/
   @Override
-  public String getBaseDN(int changeNumber)
+  public String getBaseDN(long changeNumber)
   {
     DraftCNDBCursor cursor = null;
     try
@@ -577,7 +577,7 @@
     }
   }
 
-  private void debugException(String methodName, int changeNumber, Exception e)
+  private void debugException(String methodName, long changeNumber, Exception e)
   {
     if (debugEnabled())
       TRACER.debugInfo("In DraftCNDbHandler." + methodName + "(), read: "
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbIterator.java b/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbIterator.java
index 8243aca..18ecd5d 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbIterator.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbIterator.java
@@ -56,7 +56,7 @@
    * @throws ChangelogException
    *           If a database problem happened.
    */
-  public DraftCNDbIterator(DraftCNDB db, int startChangeNumber)
+  public DraftCNDbIterator(DraftCNDB db, long startChangeNumber)
       throws ChangelogException
   {
     draftCNDbCursor = db.openReadCursor(startChangeNumber);
@@ -98,7 +98,7 @@
 
   /** {@inheritDoc} */
   @Override
-  public int getChangeNumber()
+  public long getChangeNumber()
   {
     return ((ReplicationDraftCNKey) draftCNDbCursor.getKey()).getChangeNumber();
   }
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java b/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java
index 852a20b..f06a43d 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java
@@ -160,4 +160,14 @@
   {
     close();
   }
+
+  /** {@inheritDoc} */
+  @Override
+  public int compareTo(ReplicaDBCursor o)
+  {
+    final CSN csn1 = getChange().getCSN();
+    final CSN csn2 = o.getChange().getCSN();
+
+    return CSN.compare(csn1, csn2);
+  }
 }
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDraftCNKey.java b/opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDraftCNKey.java
index 8d01875..e01c4a4 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDraftCNKey.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDraftCNKey.java
@@ -42,16 +42,14 @@
    * Creates a new ReplicationKey from the given change number.
    * @param changeNumber The change number to use.
    */
-  public ReplicationDraftCNKey(int changeNumber)
+  public ReplicationDraftCNKey(long changeNumber)
   {
     try
     {
-      String s = String.valueOf(changeNumber);
-      int a = 16-s.length();
-      String sscn = "0000000000000000".substring(0, a) + s;
       // Should it use StaticUtils.getBytes() to increase performances?
-      setData(sscn.getBytes("UTF-8"));
-    } catch (UnsupportedEncodingException e)
+      setData(String.format("%016d", changeNumber).getBytes("UTF-8"));
+    }
+    catch (UnsupportedEncodingException e)
     {
       // Should never happens, UTF-8 is always supported
       // TODO : add better logging
@@ -60,10 +58,11 @@
 
   /**
    * Getter for the change number associated with this key.
+   *
    * @return the change number associated with this key.
    */
-  public int getChangeNumber()
+  public long getChangeNumber()
   {
-    return Integer.valueOf(new String(getData()));
+    return Long.valueOf(new String(getData()));
   }
 }
diff --git a/opends/src/server/org/opends/server/workflowelement/externalchangelog/ECLSearchOperation.java b/opends/src/server/org/opends/server/workflowelement/externalchangelog/ECLSearchOperation.java
index acd1dc2..470fc12 100644
--- a/opends/src/server/org/opends/server/workflowelement/externalchangelog/ECLSearchOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/externalchangelog/ECLSearchOperation.java
@@ -1007,7 +1007,7 @@
       String clearLDIFchanges,
       String targetUUID,
       List<RawAttribute> includedAttributes,
-      int changenumber,
+      long changenumber,
       String changetype,
       String changeInitiatorsName)
   throws DirectoryException
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java
index d52279f..f1f606a 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java
@@ -2924,7 +2924,7 @@
       ReplicationServer rs = eclwe.getReplicationServer();
       rs.disableEligibility(excludedDomains);
       long t1 = TimeThread.getTime();
-      int[] limits = replicationServer.getECLChangeNumberLimits(
+      long[] limits = replicationServer.getECLChangeNumberLimits(
           replicationServer.getEligibleCSN(), excludedDomains);
       assertEquals(limits[1], maxMsg);
       long t2 = TimeThread.getTime();
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandlerTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandlerTest.java
index 75bc78b..e577e28 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandlerTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandlerTest.java
@@ -110,7 +110,7 @@
       handler.add(cn3, value3, baseDN3, csn3);
 
       // The ChangeNumber should not get purged
-      final int firstChangeNumber = handler.getFirstChangeNumber();
+      final long firstChangeNumber = handler.getFirstChangeNumber();
       assertEquals(firstChangeNumber, cn1);
       assertEquals(handler.getLastChangeNumber(), cn3);
 

--
Gitblit v1.10.0