From d58d3ef7f2bdfb919d69f6def467a29c69111135 Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Wed, 08 Jul 2009 14:16:25 +0000
Subject: [PATCH] add the changenumber attribute to the changelog entry and fix the schema

---
 opends/src/server/org/opends/server/workflowelement/externalchangelog/ECLSearchOperation.java |   94 +++++++++++++++++++++++++++++++++++------------
 1 files changed, 70 insertions(+), 24 deletions(-)

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 0d7a971..0ed7354 100644
--- a/opends/src/server/org/opends/server/workflowelement/externalchangelog/ECLSearchOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/externalchangelog/ECLSearchOperation.java
@@ -647,7 +647,12 @@
         if (update!=null)
         {
           if (phase==INITIAL)
-            buildAndReturnEntry(update);
+            if (!buildAndReturnEntry(update))
+            {
+              // Abandon, Size limit reached
+              eclSession.close();
+              break;
+            }
         }
         else
         {
@@ -678,9 +683,13 @@
   /**
    * Build an ECL entry from a provided ECL msg and return it.
    * @param eclmsg The provided ECL msg.
+   * @return  <CODE>true</CODE> if the caller should continue processing the
+   *          search request and sending additional entries and references, or
+   *          <CODE>false</CODE> if not for some reason (e.g., the size limit
+   *          has been reached or the search has been abandoned).
    * @throws DirectoryException When an errors occurs.
    */
-  private void buildAndReturnEntry(ECLUpdateMsg eclmsg)
+  private boolean buildAndReturnEntry(ECLUpdateMsg eclmsg)
   throws DirectoryException
   {
     Entry entry = null;
@@ -695,12 +704,9 @@
       = new EntryChangelogNotificationControl(
           true,eclmsg.getCookie().toString());
       controls.add(clrc);
-      boolean entryReturned = returnEntry(entry, controls);
-      if (entryReturned==false)
-      {
-        // FIXME:ECL Handle the error case where returnEntry fails
-      }
+      return returnEntry(entry, controls);
     }
+    return true;
   }
 
   /**
@@ -749,7 +755,7 @@
           null, // real time current entry
           null, // real time attrs names
           null, // hist entry attributes
-          0,    // TODO:ECL G Good changelog draft compat. addMsg.getSeqnum()
+          -1,    // TODO:ECL G Good changelog draft compat. addMsg.getSeqnum()
       "add");
 
     } else
@@ -778,7 +784,7 @@
             null, // real time current entry
             null, // real time attrs names
             null, // hist entry attributes
-            0,    // TODO:ECL G Good changelog draft compat. modMsg.getSeqnum()
+            -1,    // TODO:ECL G Good changelog draft compat. modMsg.getSeqnum()
         "modify");
 
       }
@@ -801,7 +807,7 @@
           null, // real time current entry
           null, // real time attrs names
           null, // hist entry attributes
-          0,    // TODO:ECL G Good changelog draft compat. modDNMsg.getSeqnum()
+          -1,    // TODO:ECL G Good changelog draft compat. modDNMsg.getSeqnum()
           "modrdn");
 
       Attribute a = Attributes.create("newrdn", modDNMsg.getNewRDN());
@@ -835,7 +841,7 @@
           null,
           null,
           null, //rattributes,
-          0, // TODO:ECL G Good changelog draft compat. delMsg.getSeqnum()
+          -1, // TODO:ECL G Good changelog draft compat. delMsg.getSeqnum()
          "delete");
     }
     return clEntry;
@@ -890,7 +896,7 @@
    * @param targetAttrNames The provided list of attributes names that should
    *                        be read from the entry (real time values)
    * @param histEntryAttributes TODO:ECL Adress hist entry attributes
-   * @param seqnum          The provided RCL int change number.
+   * @param draftChangenumber The provided draft change number (integer)
    * @param changetype      The provided change type (add, ...)
    * @return                The created ECL entry.
    * @throws DirectoryException
@@ -906,7 +912,7 @@
       Entry entry,
       List<String> targetAttrNames,
       List<RawAttribute> histEntryAttributes,
-      int seqnum,
+      int draftChangenumber,
       String changetype)
   throws DirectoryException
   {
@@ -930,17 +936,11 @@
 
     ArrayList<Attribute> attrList = new ArrayList<Attribute>(1);
 
-    // TODO:ECL G Good changelog compat.
-    if (seqnum>0)
-    {
-      Attribute a = Attributes.create("changeNumber", String.valueOf(seqnum));
-      attrList = new ArrayList<Attribute>(1);
-      attrList.add(a);
-      uAttrs.put(a.getAttributeType(), attrList);
-    }
+    // MUST attributes
 
-    //
-    Attribute a = Attributes.create("replicationCSN", changeNumber.toString());
+    // ECL Changelog draft change number
+    Attribute a = Attributes.create("changeNumber",
+        String.valueOf(draftChangenumber));
     attrList = new ArrayList<Attribute>(1);
     attrList.add(a);
     uAttrs.put(a.getAttributeType(), attrList);
@@ -978,12 +978,19 @@
     attrList.add(a);
     uAttrs.put(a.getAttributeType(), attrList);
 
+    // MAY attributes
+
+    a = Attributes.create("replicationCSN", changeNumber.toString());
+    attrList = new ArrayList<Attribute>(1);
+    attrList.add(a);
+    operationalAttrs.put(a.getAttributeType(), attrList);
+
     //
     a = Attributes.create("replicaIdentifier",
         Short.toString(changeNumber.getServerId()));
     attrList = new ArrayList<Attribute>(1);
     attrList.add(a);
-    uAttrs.put(a.getAttributeType(), attrList);
+    operationalAttrs.put(a.getAttributeType(), attrList);
 
     if (clearLDIFchanges != null)
     {
@@ -1014,6 +1021,15 @@
     attrList = new ArrayList<Attribute>(1);
     attrList.add(a);
     operationalAttrs.put(a.getAttributeType(), attrList);
+    if (draftChangenumber>0)
+    {
+      // compat mode
+      a = Attributes.create("targetuniqueid",
+          ECLSearchOperation.openDsToSunDseeNsUniqueId(targetUUID));
+      attrList = new ArrayList<Attribute>(1);
+      attrList.add(a);
+      operationalAttrs.put(a.getAttributeType(), attrList);
+    }
 
     a = Attributes.create("cookie", cookie);
     attrList = new ArrayList<Attribute>(1);
@@ -1309,5 +1325,35 @@
     }
     return super.cancel(cancelRequest);
   }
+
+  /**
+  * The unique identifier used in DSEE is named nsUniqueId and its format is
+  * HHHHHHHH-HHHHHHHH-HHHHHHHH-HHHHHHHH where H is a hex digit.
+  * An nsUniqueId value is for example 3970de28-08b311d9-8095b9bf-c4d9231c
+  * The unique identifier used in OpenDS is named entryUUID.
+  * Its value is for example entryUUID: 50dd9673-71e1-4478-b13c-dba387c4d7e1
+  * @param entryUid the OpenDS entry UID
+  * @return the Dsee format for the entry UID
+  */
+  private static String openDsToSunDseeNsUniqueId(String entryUid)
+  {
+
+    if (entryUid == null)
+      return null;
+
+    //  the conversion from one unique identifier to an other is
+    //  a question of formating : the last “-” is placed
+    StringBuffer buffer = new StringBuffer(entryUid);
+    //  Delete a "-" at 13 to get something like
+    buffer.deleteCharAt(13);
+
+    //  Delete a "-" at 23 to get something like
+    buffer.deleteCharAt(22);
+
+    //  Add the last "-" to get something like
+    buffer.insert(26,'-');
+
+    return buffer.toString();
+  }
 }
 

--
Gitblit v1.10.0