From 5ec0cb08889c9f1a24fd4cc8b139dcdb942dd92a Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Fri, 14 Aug 2009 12:37:19 +0000
Subject: [PATCH] Support for External change log compatible with draft-good-ldap-changelog-04.txt , March 2003

---
 opendj-sdk/opends/src/server/org/opends/server/replication/common/MultiDomainServerState.java |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/common/MultiDomainServerState.java b/opendj-sdk/opends/src/server/org/opends/server/replication/common/MultiDomainServerState.java
index 8ae6f2f..b010c21 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/common/MultiDomainServerState.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/common/MultiDomainServerState.java
@@ -26,9 +26,16 @@
  */
 package org.opends.server.replication.common;
 
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.TreeMap;
 
+import org.opends.messages.Category;
+import org.opends.messages.Message;
+import org.opends.messages.Severity;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.ResultCode;
+
 
 /**
  * This object is used to store a list of ServerState object, one by
@@ -106,7 +113,7 @@
    */
   public void update(String serviceId, ServerState serverState)
   {
-    list.put(serviceId,serverState);
+    list.put(serviceId,serverState.duplicate());
   }
 
   /**
@@ -208,11 +215,59 @@
     {
       ServerState state = list.get(serviceId);
       ServerState coveredState = covered.list.get(serviceId);
-      if ((coveredState == null) || (!state.cover(coveredState)))
+      if ((state==null)||(coveredState == null) || (!state.cover(coveredState)))
       {
         return false;
       }
     }
     return true;
   }
+
+  /**
+   * Splits the provided generalizedServerState being a String with the
+   * following syntax: "domain1:state1;domain2:state2;..."
+   * to a hashmap of (domain DN, domain ServerState).
+   * @param multidomainserverstate the provided state
+   * @exception DirectoryException when an error occurs
+   * @return the splited state.
+   */
+  public static HashMap<String,ServerState> splitGenStateToServerStates(
+      String multidomainserverstate)
+      throws DirectoryException
+  {
+    HashMap<String,ServerState> startStates = new HashMap<String,ServerState>();
+    try
+    {
+      // Split the provided multidomainserverstate into domains
+      String[] domains = multidomainserverstate.split(";");
+      for (String domain : domains)
+      {
+        // For each domain, split the changenumbers by server
+        // and build a server state (SHOULD BE OPTIMIZED)
+        ServerState serverStateByDomain = new ServerState();
+
+        String[] fields = domain.split(":");
+        String domainBaseDN = fields[0];
+        if (fields.length>1)
+        {
+          String strState = fields[1];
+          String[] strCN = strState.split(" ");
+          for (String sr : strCN)
+          {
+            ChangeNumber fromChangeNumber = new ChangeNumber(sr);
+            serverStateByDomain.update(fromChangeNumber);
+          }
+        }
+        startStates.put(domainBaseDN, serverStateByDomain);
+      }
+    }
+    catch(Exception e)
+    {
+      throw new DirectoryException(
+          ResultCode.OPERATIONS_ERROR,
+          Message.raw(Category.SYNC, Severity.INFORMATION,"Exception raised: "),
+          e);
+    }
+    return startStates;
+  }
 }

--
Gitblit v1.10.0