From 3f27a7ede5ca9df06137254aa32d41d023ac105d Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Tue, 16 Sep 2014 15:05:25 +0000
Subject: [PATCH] OPENDJ-1444 CR-4537 Remove previous cookie from storage of ChangeNumberIndexDB

---
 opends/src/server/org/opends/server/replication/server/changelog/je/ECLMultiDomainDBCursor.java |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/ECLMultiDomainDBCursor.java b/opends/src/server/org/opends/server/replication/server/changelog/je/ECLMultiDomainDBCursor.java
index 97a1806..daf442a 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/ECLMultiDomainDBCursor.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/ECLMultiDomainDBCursor.java
@@ -24,11 +24,17 @@
  */
 package org.opends.server.replication.server.changelog.je;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.opends.server.replication.common.MultiDomainServerState;
 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.DN;
 
+import com.forgerock.opendj.util.Pair;
+
 /**
  * Multi domain DB cursor that only returns updates for the domains which have
  * been enabled for the external changelog.
@@ -110,4 +116,46 @@
   {
     return getClass().getSimpleName() + " cursor=[" + cursor + ']';
   }
+
+  /**
+   * Returns a snapshot of this cursor.
+   *
+   * @return a list of (DN, UpdateMsg) pairs, containing all base DNs enabled
+   *         for the external changelog. The update message may be {@code null}.
+   */
+  List<Pair<DN, UpdateMsg>> getSnapshot()
+  {
+    final List<Pair<DN, UpdateMsg>> snapshot = cursor.getSnapshot();
+    final List<Pair<DN, UpdateMsg>> eclSnapshot = new ArrayList<Pair<DN,UpdateMsg>>();
+    for (Pair<DN, UpdateMsg> pair : snapshot)
+    {
+      DN baseDN = pair.getFirst();
+      if (predicate.isECLEnabledDomain(baseDN))
+      {
+        eclSnapshot.add(pair);
+      }
+    }
+    return eclSnapshot;
+  }
+
+  /**
+   * Returns the cookie corresponding to the state of this cursor.
+   *
+   * @return a valid cookie taking into account only the base DNs enabled for
+   *         the external changelog
+   */
+  public MultiDomainServerState toCookie()
+  {
+    List<Pair<DN, UpdateMsg>> snapshot = getSnapshot();
+    MultiDomainServerState cookie = new MultiDomainServerState();
+    for (Pair<DN, UpdateMsg> pair : snapshot)
+    {
+      // only put base DNs where a CSN is available in the cookie
+      if (pair.getSecond() != null)
+      {
+        cookie.update(pair.getFirst(), pair.getSecond().getCSN());
+      }
+    }
+    return cookie;
+  }
 }

--
Gitblit v1.10.0