From bb917d0ac64be191c867a2e0432412a2e24d0080 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 26 Sep 2011 22:04:48 +0000
Subject: [PATCH] Fix OPENDJ-278: ldapSubentry entries should have an implicit scope of { base="" } when no subtree specification is specified

---
 opendj-sdk/opends/src/server/org/opends/server/types/SubEntry.java                                       |    5 ++---
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/SubentryManagerTestCase.java |   37 +++++++++++++++++++++++++++++++++----
 2 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/SubEntry.java b/opendj-sdk/opends/src/server/org/opends/server/types/SubEntry.java
index 86944a3..7855c12 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/SubEntry.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/SubEntry.java
@@ -246,9 +246,8 @@
     {
       // There is none for some reason eg this could be
       // old Draft based ldapSubEntry so create a dummy.
-      this.subTreeSpec = new SubtreeSpecification(
-                DN.NULL_DN, null, -1, -1,
-                null, null, null);
+      this.subTreeSpec = new SubtreeSpecification(entry.getDN().getParent(),
+          null, -1, -1, null, null, null);
     }
 
     // Determine if this subentry is collective attribute subentry.
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/SubentryManagerTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/SubentryManagerTestCase.java
index 8f8fb61..8dad866 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/SubentryManagerTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/SubentryManagerTestCase.java
@@ -58,6 +58,7 @@
 
   private Entry testEntry;
   private Entry ldapSubentry;
+  private Entry legacyLdapSubentry;
   private Entry collectiveSubentry;
 
   @BeforeClass
@@ -73,6 +74,7 @@
   {
     TestCaseUtils.deleteEntry(collectiveSubentry.getDN());
     TestCaseUtils.deleteEntry(ldapSubentry.getDN());
+    TestCaseUtils.deleteEntry(legacyLdapSubentry.getDN());
 
     SubentryManager manager = DirectoryServer.getSubentryManager();
     assertNotNull(manager);
@@ -99,13 +101,15 @@
     assertNotNull(manager);
     List<SubEntry> subentryList = manager.getSubentries(testEntry.getDN());
     assertNotNull(subentryList);
-    assertEquals(subentryList.size(), 1);
+    assertEquals(subentryList.size(), 2);
     assertEquals(subentryList.get(0).getDN(), ldapSubentry.getDN());
+    assertEquals(subentryList.get(1).getDN(), legacyLdapSubentry.getDN());
     subentryList.clear();
     subentryList = manager.getSubentries(testEntry);
     assertNotNull(subentryList);
-    assertEquals(subentryList.size(), 1);
+    assertEquals(subentryList.size(), 2);
     assertEquals(subentryList.get(0).getEntry(), ldapSubentry);
+    assertEquals(subentryList.get(1).getEntry(), legacyLdapSubentry);
     subentryList.clear();
     subentryList = manager.getCollectiveSubentries(testEntry.getDN());
     assertNotNull(subentryList);
@@ -116,6 +120,15 @@
     assertNotNull(subentryList);
     assertEquals(subentryList.size(), 1);
     assertEquals(subentryList.get(0).getEntry(), collectiveSubentry);
+    subentryList.clear();
+    subentryList = manager.getSubentries(legacyLdapSubentry.getDN().getParent());
+    assertNotNull(subentryList);
+    assertEquals(subentryList.size(), 1);
+    assertEquals(subentryList.get(0).getEntry(), legacyLdapSubentry);
+    subentryList.clear();
+    subentryList = manager.getSubentries(legacyLdapSubentry.getDN().getParent().getParent());
+    assertNotNull(subentryList);
+    assertEquals(subentryList.size(), 0);
   }
 
   @Test
@@ -571,8 +584,10 @@
             "uid=rogasawara," + NEWBASE + "," + SUFFIX)));
     assertTrue(DirectoryServer.getSubentryManager().getCollectiveSubentries(
           DN.decode("uid=rogasawara," + NEWBASE + "," + SUFFIX)).isEmpty());
-    assertTrue(DirectoryServer.getSubentryManager().getSubentries(
-          DN.decode("uid=rogasawara," + NEWBASE + "," + SUFFIX)).isEmpty());
+
+    // The legacyLdapSubentry should still apply.
+    assertEquals(DirectoryServer.getSubentryManager().getSubentries(
+          DN.decode("uid=rogasawara," + NEWBASE + "," + SUFFIX)).size(), 1);
 
     // Move it back.
     String oldPath = TestCaseUtils.createTempFile(
@@ -740,6 +755,20 @@
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     assertNotNull(DirectoryServer.getEntry(ldapSubentry.getDN()));
 
+    // Add test legacy subentry.
+    legacyLdapSubentry = TestCaseUtils.makeEntry(
+         "dn: cn=Legacy Subentry," + SUFFIX,
+         "objectClass: top",
+         "objectclass: ldapSubentry",
+         "cn: Legacy Subentry");
+    addOperation =
+         connection.processAdd(legacyLdapSubentry.getDN(),
+                               legacyLdapSubentry.getObjectClasses(),
+                               legacyLdapSubentry.getUserAttributes(),
+                               legacyLdapSubentry.getOperationalAttributes());
+    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
+    assertNotNull(DirectoryServer.getEntry(legacyLdapSubentry.getDN()));
+
     // Add test collective subentry.
     collectiveSubentry = TestCaseUtils.makeEntry(
          "dn: cn=Collective Subentry," + SUFFIX,

--
Gitblit v1.10.0