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