From c5983b95bafa6c809dc88f8921d6c7230472e229 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Tue, 04 Mar 2014 14:52:27 +0000
Subject: [PATCH] Add support for SearchScope.SUBORDINATES to MemoryBackend

---
 opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/MemoryBackend.java         |    6 ++++--
 opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/MemoryBackendTestCase.java |   18 ++++++++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/MemoryBackend.java b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/MemoryBackend.java
index cbc1c89..b8065b0 100644
--- a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/MemoryBackend.java
+++ b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/MemoryBackend.java
@@ -398,7 +398,8 @@
                     sendEntry(attributeFilter, resultHandler, baseEntry);
                 }
                 resultHandler.handleResult(newResult(ResultCode.SUCCESS));
-            } else if (scope.equals(SearchScope.SINGLE_LEVEL) || scope.equals(SearchScope.WHOLE_SUBTREE)) {
+            } else if (scope.equals(SearchScope.SINGLE_LEVEL) || scope.equals(SearchScope.SUBORDINATES)
+                || scope.equals(SearchScope.WHOLE_SUBTREE)) {
                 searchWithSubordinates(requestContext, resultHandler, dn, matcher, attributeFilter,
                         request.getSizeLimit(), scope, request.getControl(
                                 SimplePagedResultsControl.DECODER, new DecodeOptions()));
@@ -502,7 +503,8 @@
         int position = 0;
         for (final Entry entry : subtree.values()) {
             requestContext.checkIfCancelled(false);
-            if (scope.equals(SearchScope.WHOLE_SUBTREE) || entry.getName().isChildOf(dn)) {
+            if (scope.equals(SearchScope.WHOLE_SUBTREE) || entry.getName().isChildOf(dn)
+                || (scope.equals(SearchScope.SUBORDINATES) && !entry.getName().equals(dn))) {
                 if (matcher.matches(entry).toBoolean()) {
                     /*
                      * This entry is going to be returned to the client so it
diff --git a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/MemoryBackendTestCase.java b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/MemoryBackendTestCase.java
index c00ca54..aafd4c8 100644
--- a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/MemoryBackendTestCase.java
+++ b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/MemoryBackendTestCase.java
@@ -456,6 +456,24 @@
     }
 
     @Test
+    public void testSearchSubordinatesReturnsAllEntries() throws Exception {
+        final Connection connection = getConnection();
+        Collection<SearchResultEntry> entries = new ArrayList<SearchResultEntry>();
+        connection.search(Requests.newSearchRequest("dc=com", SearchScope.SUBORDINATES, "(objectclass=*)"), entries);
+        assertThat(entries).hasSize(numberOfEntriesInBackend - 1);
+    }
+
+    @Test
+    public void testSearchSubordinatesEntries() throws Exception {
+        int numberOfUsers = 5;
+        final Connection connection = getConnection();
+        Collection<SearchResultEntry> entries = new ArrayList<SearchResultEntry>();
+        connection.search(Requests.newSearchRequest("ou=People,dc=example,dc=com", SearchScope.SUBORDINATES,
+            "(objectclass=*)"), entries);
+        assertThat(entries).hasSize(numberOfUsers);
+    }
+
+    @Test
     public void testSearchSubtreeWithSizeLimit() throws Exception {
         final Connection connection = getConnection();
         Collection<SearchResultEntry> entries = new ArrayList<SearchResultEntry>();

--
Gitblit v1.10.0