From 573db50463f3d2c409782b22232d9182734bf5c9 Mon Sep 17 00:00:00 2001
From: jdemendi <jdemendi@localhost>
Date: Tue, 10 Jul 2007 16:12:08 +0000
Subject: [PATCH] Fix for issue #1368, need to set matched DN for search operation.

---
 opends/src/server/org/opends/server/backends/jeb/EntryContainer.java |   61 +++++++++++++++++++++++++-----
 1 files changed, 50 insertions(+), 11 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java b/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
index 692682c..d01b39e 100644
--- a/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
@@ -635,8 +635,9 @@
 
         int messageID = MSGID_JEB_SEARCH_NO_SUCH_OBJECT;
         String message = getMessage(messageID, baseDN.toString());
+        DN matchedDN = getMatchedDN(baseDN);
         throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
-                                     message, messageID);
+            message, messageID, matchedDN, null);
       }
 
       if (!isManageDsaITOperation(searchOperation))
@@ -686,8 +687,9 @@
       {
         int messageID = MSGID_JEB_SEARCH_NO_SUCH_OBJECT;
         String message = getMessage(messageID, baseDN.toString());
+        DN matchedDN = getMatchedDN(baseDN);
         throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
-                                     message, messageID);
+            message, messageID, matchedDN, null);
       }
       DatabaseEntry baseIDData = baseID.getDatabaseEntry();
 
@@ -875,8 +877,9 @@
 
         int messageID = MSGID_JEB_SEARCH_NO_SUCH_OBJECT;
         String message = getMessage(messageID, baseDN.toString());
+        DN matchedDN = getMatchedDN(baseDN);
         throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
-                                     message, messageID);
+            message, messageID, matchedDN, null);
       }
 
       if (!manageDsaIT)
@@ -1335,8 +1338,9 @@
       {
         int messageID = MSGID_JEB_SEARCH_NO_SUCH_OBJECT;
         String message = getMessage(messageID, baseDN.toString());
+        DN matchedDN = getMatchedDN(baseDN);
         throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
-                                     message, messageID);
+            message, messageID, matchedDN, null);
       }
     }
 
@@ -1561,8 +1565,9 @@
         {
           int msgID = MSGID_JEB_ADD_NO_SUCH_OBJECT;
           String message = getMessage(msgID, entry.getDN().toString());
+          DN matchedDN = getMatchedDN(baseDN);
           throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
-                                       message, msgID);
+              message, msgID, matchedDN, null);
         }
       }
 
@@ -1731,8 +1736,9 @@
       // Do not expect to ever come through here.
       int msgID = MSGID_JEB_DELETE_NO_SUCH_OBJECT;
       String message = getMessage(msgID, leafDN.toString());
+      DN matchedDN = getMatchedDN(baseDN);
       throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
-                                   message, msgID);
+          message, msgID, matchedDN, null);
     }
 
     // Update the referral database.
@@ -1836,8 +1842,9 @@
     {
       int msgID = MSGID_JEB_DELETE_NO_SUCH_OBJECT;
       String message = getMessage(msgID, leafDN.toString());
+      DN matchedDN = getMatchedDN(baseDN);
       throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
-                                   message, msgID);
+          message, msgID, matchedDN, null);
     }
 
     // Check that the entry exists in id2entry and read its contents.
@@ -1860,8 +1867,9 @@
       // Do not expect to ever come through here.
       int msgID = MSGID_JEB_DELETE_NO_SUCH_OBJECT;
       String message = getMessage(msgID, leafDN.toString());
+      DN matchedDN = getMatchedDN(baseDN);
       throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
-                                   message, msgID);
+          message, msgID, matchedDN, null);
     }
 
     // Update the referral database.
@@ -2524,7 +2532,9 @@
         // The entry does not exist.
         int msgID = MSGID_JEB_MODIFY_NO_SUCH_OBJECT;
         String message = getMessage(msgID, entry.getDN().toString());
-        throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message, msgID);
+        DN matchedDN = getMatchedDN(baseDN);
+        throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
+            message, msgID, matchedDN, null);
       }
 
       // Read id2entry for the original entry.
@@ -2717,8 +2727,9 @@
 
         int messageID = MSGID_JEB_MODIFYDN_NO_SUCH_OBJECT;
         String message = getMessage(messageID, oldApexDN.toString());
+        DN matchedDN = getMatchedDN(baseDN);
         throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
-                                     message, messageID);
+            message, messageID, matchedDN, null);
       }
 
       Entry oldApexEntry = id2entry.get(txn, oldApexID);
@@ -2750,7 +2761,9 @@
         {
           int msgID = MSGID_JEB_NEW_SUPERIOR_NO_SUCH_OBJECT;
           String msg = getMessage(msgID, newSuperiorDN.toString());
-          throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, msg, msgID);
+          DN matchedDN = getMatchedDN(baseDN);
+          throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
+              msg, msgID, matchedDN, null);
         }
 
         if (newSuperiorID.compareTo(oldApexID) > 0)
@@ -3921,4 +3934,30 @@
     }
     return count;
   }
+
+
+  /**
+   * Finds an existing entry whose DN is the closest ancestor of a given baseDN.
+   *
+   * @param baseDN  the DN for which we are searching a matched DN
+   * @return the DN of the closest ancestor of the baseDN
+   * @throws DirectoryException If an error prevented the check of an
+   * existing entry from being performed
+   */
+  private DN getMatchedDN(DN baseDN)
+    throws DirectoryException
+  {
+    DN matchedDN = null;
+    DN parentDN  = baseDN.getParentDNInSuffix();
+    while ((parentDN != null) && parentDN.isDescendantOf(getBaseDN()))
+    {
+      if (entryExists(parentDN))
+      {
+        matchedDN = parentDN;
+        break;
+      }
+      parentDN = parentDN.getParentDNInSuffix();
+    }
+    return matchedDN;
+  }
 }

--
Gitblit v1.10.0