From f2711b53bdd5f48eaf312981541b61c6e89bdfa1 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Fri, 29 Mar 2013 18:06:19 +0000
Subject: [PATCH] Additional change for OPENDJ-354: Implement a RequestHandler which provides an in-memory backend

---
 opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/MemoryBackend.java |   33 ++++++++++++++++-----------------
 1 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/MemoryBackend.java b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/MemoryBackend.java
index 92020ff..794ee02 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/MemoryBackend.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/MemoryBackend.java
@@ -33,7 +33,6 @@
 import static org.forgerock.opendj.ldap.responses.Responses.newSearchResultEntry;
 
 import java.io.IOException;
-import java.util.Collection;
 import java.util.NavigableMap;
 import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -324,10 +323,12 @@
             final SearchScope scope = request.getScope();
             final Filter filter = request.getFilter();
             final Matcher matcher = filter.matcher(schema);
+            final AttributeFilter attributeFilter =
+                    new AttributeFilter(request.getAttributes(), schema);
 
             if (scope.equals(SearchScope.BASE_OBJECT)) {
                 if (matcher.matches(baseEntry).toBoolean()) {
-                    sendEntry(request, resultHandler, baseEntry);
+                    sendEntry(attributeFilter, resultHandler, baseEntry);
                 }
             } else if (scope.equals(SearchScope.SINGLE_LEVEL)) {
                 final NavigableMap<DN, Entry> subtree =
@@ -338,7 +339,7 @@
                     final DN childDN = entry.getName();
                     if (childDN.isChildOf(dn)) {
                         if (matcher.matches(entry).toBoolean()
-                                && !sendEntry(request, resultHandler, entry)) {
+                                && !sendEntry(attributeFilter, resultHandler, entry)) {
                             // Caller has asked to stop sending results.
                             break;
                         }
@@ -351,7 +352,7 @@
                     // Check for cancellation.
                     requestContext.checkIfCancelled(false);
                     if (matcher.matches(entry).toBoolean()
-                            && !sendEntry(request, resultHandler, entry)) {
+                            && !sendEntry(attributeFilter, resultHandler, entry)) {
                         // Caller has asked to stop sending results.
                         break;
                     }
@@ -378,8 +379,10 @@
                 if (preRead.isCritical() && before == null) {
                     throw newErrorResult(ResultCode.UNAVAILABLE_CRITICAL_EXTENSION);
                 } else {
-                    result.addControl(PreReadResponseControl.newControl(filter(before, preRead
-                            .getAttributes())));
+                    final AttributeFilter filter =
+                            new AttributeFilter(preRead.getAttributes(), schema);
+                    result.addControl(PreReadResponseControl.newControl(filter
+                            .filteredViewOf(before)));
                 }
             }
 
@@ -390,8 +393,10 @@
                 if (postRead.isCritical() && after == null) {
                     throw newErrorResult(ResultCode.UNAVAILABLE_CRITICAL_EXTENSION);
                 } else {
-                    result.addControl(PostReadResponseControl.newControl(filter(after, postRead
-                            .getAttributes())));
+                    final AttributeFilter filter =
+                            new AttributeFilter(postRead.getAttributes(), schema);
+                    result.addControl(PostReadResponseControl.newControl(filter
+                            .filteredViewOf(after)));
                 }
             }
             return result;
@@ -400,11 +405,6 @@
         }
     }
 
-    private Entry filter(final Entry entry, final Collection<String> attributes) {
-        // FIXME: attribute filtering not supported yet.
-        return entry;
-    }
-
     private BindResult getBindResult(final BindRequest request, final Entry before,
             final Entry after) throws ErrorResultException {
         return addResultControls(request, before, after, newBindResult(ResultCode.SUCCESS));
@@ -453,9 +453,8 @@
                 + "' does not exist");
     }
 
-    private boolean sendEntry(final SearchRequest request, final SearchResultHandler resultHandler,
-            final Entry entry) {
-        return resultHandler
-                .handleEntry(newSearchResultEntry(filter(entry, request.getAttributes())));
+    private boolean sendEntry(final AttributeFilter filter,
+            final SearchResultHandler resultHandler, final Entry entry) {
+        return resultHandler.handleEntry(newSearchResultEntry(filter.filteredViewOf(entry)));
     }
 }

--
Gitblit v1.10.0