You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2008/05/22 22:00:40 UTC

svn commit: r659229 [1/2] - in /directory/apacheds/branches/bigbang: core-entry/src/main/java/org/apache/directory/server/core/entry/ core/src/main/java/org/apache/directory/server/core/authn/ core/src/main/java/org/apache/directory/server/core/authz/ ...

Author: akarasulu
Date: Thu May 22 13:00:38 2008
New Revision: 659229

URL: http://svn.apache.org/viewvc?rev=659229&view=rev
Log:
removing SearchResultFilter and SearchResultFilterEnumeration and replacing with EntryFilter and EntryFilteringCursor

Added:
    directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ClonedServerEntry.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilter.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilteringCursor.java
Removed:
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/enumeration/SearchResultEnumeration.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/enumeration/SearchResultFilter.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/enumeration/SearchResultFilteringEnumeration.java
Modified:
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authn/AuthenticationInterceptor.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/AciAuthorizationInterceptor.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/DefaultAuthorizationInterceptor.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/GroupCache.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/TupleCache.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeInterceptor.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/exception/ExceptionInterceptor.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/BaseInterceptor.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/Interceptor.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/InterceptorChain.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/NextInterceptor.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/ListOperationContext.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/SearchOperationContext.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/AbstractPartition.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/DefaultPartitionNexus.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/Partition.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/PartitionNexus.java

Added: directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ClonedServerEntry.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ClonedServerEntry.java?rev=659229&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ClonedServerEntry.java (added)
+++ directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ClonedServerEntry.java Thu May 22 13:00:38 2008
@@ -0,0 +1,395 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *   or more contributor license agreements.  See the NOTICE file
+ *   distributed with this work for additional information
+ *   regarding copyright ownership.  The ASF licenses this file
+ *   to you under the Apache License, Version 2.0 (the
+ *   "License"); you may not use this file except in compliance
+ *   with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing,
+ *   software distributed under the License is distributed on an
+ *   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *   KIND, either express or implied.  See the License for the
+ *   specific language governing permissions and limitations
+ *   under the License.
+ *
+ */
+package org.apache.directory.server.core.entry;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.naming.NamingException;
+
+import org.apache.directory.shared.ldap.entry.EntryAttribute;
+import org.apache.directory.shared.ldap.entry.Value;
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.schema.AttributeType;
+
+
+/**
+ * A ServerEntry refers to the original entry before being modified by 
+ * EntryFilters or operations.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class ClonedServerEntry implements ServerEntry
+{
+    /** The original entry as returned by the backend */
+    private final ServerEntry originalEntry;
+    
+    /** The copied entry */
+    private final ServerEntry clonedEntry;
+
+    
+    /**
+     * Creates a new instance of ClonedServerEntry.
+     * 
+     * The original entry is cloned in order to protect its content.
+     *
+     * @param originalEntry The original entry
+     */
+    public ClonedServerEntry( ServerEntry originalEntry )
+    {
+        this.originalEntry = originalEntry;
+        this.clonedEntry = ( ServerEntry ) originalEntry.clone();
+    }
+    
+    
+    /**
+     * @return the originalEntry
+     */
+    public ServerEntry getOriginalEntry()
+    {
+        return originalEntry;
+    }
+
+
+    public void add( AttributeType attributeType, byte[]... values ) throws NamingException
+    {
+        clonedEntry.add( attributeType, values );
+    }
+
+
+    public void add( AttributeType attributeType, String... values ) throws NamingException
+    {
+        clonedEntry.add( attributeType, values );
+    }
+
+
+    public void add( AttributeType attributeType, Value<?>... values ) throws NamingException
+    {
+        clonedEntry.add( attributeType, values );
+    }
+
+
+    public void add( String upId, AttributeType attributeType, byte[]... values ) throws NamingException
+    {
+        clonedEntry.add( attributeType, values );
+    }
+
+
+    public void add( String upId, AttributeType attributeType, String... values ) throws NamingException
+    {
+        clonedEntry.add( attributeType, values );
+    }
+
+
+    public void add( String upId, AttributeType attributeType, Value<?>... values ) throws NamingException
+    {
+        clonedEntry.add( attributeType, values );
+    }
+
+
+    public boolean contains( AttributeType attributeType, byte[]... values )
+    {
+        return clonedEntry.contains( attributeType, values );
+    }
+
+
+    public boolean contains( AttributeType attributeType, String... values )
+    {
+        return clonedEntry.contains( attributeType, values );
+    }
+
+
+    public boolean contains( AttributeType attributeType, Value<?>... values )
+    {
+        return clonedEntry.contains( attributeType, values );
+    }
+
+
+    public boolean containsAttribute( AttributeType attributeType )
+    {
+        return clonedEntry.containsAttribute( attributeType );
+    }
+
+
+    public EntryAttribute get( AttributeType attributeType )
+    {
+        return clonedEntry.get( attributeType );
+    }
+
+
+    public Set<AttributeType> getAttributeTypes()
+    {
+        return clonedEntry.getAttributeTypes();
+    }
+
+
+    public boolean hasObjectClass( EntryAttribute objectClass )
+    {
+        return clonedEntry.hasObjectClass( objectClass );
+    }
+
+
+    public boolean isValid()
+    {
+        return clonedEntry.isValid();
+    }
+
+
+    public boolean isValid( String objectClass )
+    {
+        return clonedEntry.isValid( objectClass );
+    }
+
+
+    public boolean isValid( EntryAttribute objectClass )
+    {
+        return clonedEntry.isValid( objectClass );
+    }
+
+
+    public EntryAttribute put( AttributeType attributeType, byte[]... values ) throws NamingException
+    {
+        return clonedEntry.put( attributeType, values );
+    }
+
+
+    public EntryAttribute put( AttributeType attributeType, String... values ) throws NamingException
+    {
+        return clonedEntry.put( attributeType, values );
+    }
+
+
+    public EntryAttribute put( AttributeType attributeType, Value<?>... values ) throws NamingException
+    {
+        return clonedEntry.put( attributeType, values );
+    }
+
+
+    public EntryAttribute put( String upId, AttributeType attributeType, byte[]... values ) throws NamingException
+    {
+        return clonedEntry.put( attributeType, values );
+    }
+
+
+    public EntryAttribute put( String upId, AttributeType attributeType, String... values ) throws NamingException
+    {
+        return clonedEntry.put( upId, attributeType, values );
+    }
+
+
+    public EntryAttribute put( String upId, AttributeType attributeType, Value<?>... values ) throws NamingException
+    {
+        return clonedEntry.put( upId, attributeType, values );
+    }
+
+
+    public boolean remove( AttributeType attributeType, byte[]... values ) throws NamingException
+    {
+        return clonedEntry.remove( attributeType, values );
+    }
+
+
+    public boolean remove( AttributeType attributeType, String... values ) throws NamingException
+    {
+        return clonedEntry.remove( attributeType, values );
+    }
+
+
+    public boolean remove( AttributeType attributeType, Value<?>... values ) throws NamingException
+    {
+        return clonedEntry.remove( attributeType, values );
+    }
+
+
+    public List<EntryAttribute> remove( EntryAttribute... attributes ) throws NamingException
+    {
+        return clonedEntry.remove( attributes );
+    }
+
+
+    public List<EntryAttribute> removeAttributes( AttributeType... attributes )
+    {
+        return clonedEntry.removeAttributes( attributes );
+    }
+
+
+    public List<EntryAttribute> set( AttributeType... attributeTypes )
+    {
+        return clonedEntry.set( attributeTypes );
+    }
+
+
+    public void add( EntryAttribute... attributes ) throws NamingException
+    {
+        clonedEntry.add( attributes );
+    }
+
+
+    public void add( String upId, String... values ) throws NamingException
+    {
+        clonedEntry.add( upId, values );
+    }
+
+
+    public void add( String upId, byte[]... values ) throws NamingException
+    {
+        clonedEntry.add( upId, values );
+    }
+
+
+    public void add( String upId, Value<?>... values ) throws NamingException
+    {
+        clonedEntry.add( upId, values );
+    }
+
+
+    public void clear()
+    {
+        clonedEntry.clear();
+    }
+
+
+    public boolean contains( EntryAttribute... attributes ) throws NamingException
+    {
+        return clonedEntry.contains( attributes );
+    }
+
+
+    public boolean contains( String upId, byte[]... values )
+    {
+        return clonedEntry.contains( upId, values );
+    }
+
+
+    public boolean contains( String upId, String... values )
+    {
+        return clonedEntry.contains( upId, values );
+    }
+
+
+    public boolean contains( String upId, Value<?>... values )
+    {
+        return clonedEntry.contains( upId, values );
+    }
+
+
+    public boolean containsAttribute( String... attributes )
+    {
+        return clonedEntry.containsAttribute( attributes );
+    }
+
+
+    public EntryAttribute get( String alias )
+    {
+        return clonedEntry.get( alias );
+    }
+
+
+    public LdapDN getDn()
+    {
+        return clonedEntry.getDn();
+    }
+
+
+    public boolean hasObjectClass( String objectClass )
+    {
+        return clonedEntry.hasObjectClass( objectClass );
+    }
+
+
+    public Iterator<EntryAttribute> iterator()
+    {
+        return clonedEntry.iterator();
+    }
+
+
+    public List<EntryAttribute> put( EntryAttribute... attributes ) throws NamingException
+    {
+        return clonedEntry.put( attributes );
+    }
+
+
+    public EntryAttribute put( String upId, byte[]... values )
+    {
+        return clonedEntry.put( upId, values );
+    }
+
+
+    public EntryAttribute put( String upId, String... values )
+    {
+        return clonedEntry.put( upId, values );
+    }
+
+
+    public EntryAttribute put( String upId, Value<?>... values )
+    {
+        return clonedEntry.put( upId, values );
+    }
+
+
+    public boolean remove( String upId, byte[]... values ) throws NamingException
+    {
+        return clonedEntry.remove( upId, values );
+    }
+
+
+    public boolean remove( String upId, String... values ) throws NamingException
+    {
+        return clonedEntry.remove( upId, values );
+    }
+
+
+    public boolean remove( String upId, Value<?>... values ) throws NamingException
+    {
+        return clonedEntry.remove( upId, values );
+    }
+
+
+    public List<EntryAttribute> removeAttributes( String... attributes )
+    {
+        return clonedEntry.removeAttributes( attributes );
+    }
+
+
+    public List<EntryAttribute> set( String... upIds )
+    {
+        return clonedEntry.set( upIds );
+    }
+
+
+    public void setDn( LdapDN dn )
+    {
+        clonedEntry.setDn( dn );
+    }
+
+
+    public int size()
+    {
+        return clonedEntry.size();
+    }
+
+
+    public ServerEntry clone()
+    {
+        return ( ServerEntry ) clonedEntry.clone();
+    }
+}

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authn/AuthenticationInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authn/AuthenticationInterceptor.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authn/AuthenticationInterceptor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authn/AuthenticationInterceptor.java Thu May 22 13:00:38 2008
@@ -30,8 +30,8 @@
 import java.util.Set;
 
 import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.cursor.Cursor;
-import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.BaseInterceptor;
 import org.apache.directory.server.core.interceptor.Interceptor;
 import org.apache.directory.server.core.interceptor.NextInterceptor;
@@ -228,7 +228,7 @@
     }
 
 
-    public ServerEntry getRootDSE( NextInterceptor next, GetRootDSEOperationContext opContext ) throws Exception
+    public ClonedServerEntry getRootDSE( NextInterceptor next, GetRootDSEOperationContext opContext ) throws Exception
     {
         if ( IS_DEBUG )
         {
@@ -264,7 +264,7 @@
     }
 
 
-    public Cursor<ServerEntry> list( NextInterceptor next, ListOperationContext opContext ) throws Exception
+    public EntryFilteringCursor list( NextInterceptor next, ListOperationContext opContext ) throws Exception
     {
         if ( IS_DEBUG )
         {
@@ -288,7 +288,7 @@
     }
 
 
-    public ServerEntry lookup( NextInterceptor next, LookupOperationContext opContext ) throws Exception
+    public ClonedServerEntry lookup( NextInterceptor next, LookupOperationContext opContext ) throws Exception
     {
         if ( IS_DEBUG )
         {
@@ -382,7 +382,7 @@
     }
 
 
-    public Cursor<ServerEntry> search( NextInterceptor next, SearchOperationContext opContext ) throws Exception
+    public EntryFilteringCursor search( NextInterceptor next, SearchOperationContext opContext ) throws Exception
     {
         if ( IS_DEBUG )
         {

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/AciAuthorizationInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/AciAuthorizationInterceptor.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/AciAuthorizationInterceptor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/AciAuthorizationInterceptor.java Thu May 22 13:00:38 2008
@@ -20,17 +20,16 @@
 package org.apache.directory.server.core.authz;
 
 
-import org.apache.commons.lang.NotImplementedException;
 import org.apache.directory.server.constants.ServerDNConstants;
 import org.apache.directory.server.core.DirectoryService;
 import org.apache.directory.server.core.authn.LdapPrincipal;
 import org.apache.directory.server.core.authz.support.ACDFEngine;
-import org.apache.directory.server.core.cursor.Cursor;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
 import org.apache.directory.server.core.entry.ServerAttribute;
 import org.apache.directory.server.core.entry.ServerEntry;
 import org.apache.directory.server.core.entry.ServerEntryUtils;
-import org.apache.directory.server.core.entry.ServerSearchResult;
-import org.apache.directory.server.core.enumeration.SearchResultFilter;
+import org.apache.directory.server.core.filtering.EntryFilter;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.BaseInterceptor;
 import org.apache.directory.server.core.interceptor.InterceptorChain;
 import org.apache.directory.server.core.interceptor.NextInterceptor;
@@ -46,6 +45,7 @@
 import org.apache.directory.server.core.interceptor.context.MoveOperationContext;
 import org.apache.directory.server.core.interceptor.context.RenameOperationContext;
 import org.apache.directory.server.core.interceptor.context.SearchOperationContext;
+import org.apache.directory.server.core.interceptor.context.SearchingOperationContext;
 import org.apache.directory.server.core.invocation.Invocation;
 import org.apache.directory.server.core.invocation.InvocationStack;
 import org.apache.directory.server.core.jndi.ServerContext;
@@ -759,7 +759,7 @@
     }
 
 
-    public ServerEntry lookup( NextInterceptor next, LookupOperationContext lookupContext ) throws Exception
+    public ClonedServerEntry lookup( NextInterceptor next, LookupOperationContext lookupContext ) throws Exception
     {
         Invocation invocation = InvocationStack.getInstance().peek();
         LdapPrincipal principal = ( ( ServerContext ) invocation.getCaller() ).getPrincipal();
@@ -995,32 +995,31 @@
     }
 
     
-    public Cursor<ServerEntry> list( NextInterceptor next, ListOperationContext opContext ) throws Exception
+    public EntryFilteringCursor list( NextInterceptor next, ListOperationContext opContext ) throws Exception
     {
         Invocation invocation = InvocationStack.getInstance().peek();
         ServerLdapContext ctx = ( ServerLdapContext ) invocation.getCaller();
         LdapPrincipal user = ctx.getPrincipal();
-        Cursor<ServerEntry> e = next.list( opContext );
+        EntryFilteringCursor cursor = next.list( opContext );
         
         if ( isPrincipalAnAdministrator( user.getJndiName() ) || !enabled )
         {
-            return e;
+            return cursor;
         }
         
         AuthorizationFilter authzFilter = new AuthorizationFilter();
-//        return new SearchResultFilteringEnumeration( e, DEFAULT_SEARCH_CONTROLS, invocation, authzFilter, "List authorization Filter" );
-        // TODO NotImplementedException
-        throw new NotImplementedException();
+        cursor.addEntryFilter( authzFilter );
+        return cursor;
     }
 
 
-    public Cursor<ServerEntry> search( NextInterceptor next, SearchOperationContext opContext ) throws Exception
+    public EntryFilteringCursor search( NextInterceptor next, SearchOperationContext opContext ) throws Exception
     {
         Invocation invocation = InvocationStack.getInstance().peek();
         ServerLdapContext ctx = ( ServerLdapContext ) invocation.getCaller();
         LdapPrincipal user = ctx.getPrincipal();
         LdapDN principalDn = user.getJndiName();
-        Cursor<ServerEntry> e = next.search( opContext );
+        EntryFilteringCursor cursor = next.search( opContext );
 
         boolean isSubschemaSubentryLookup = subschemaSubentryDn.equals( opContext.getDn().getNormName() );
         SearchControls searchCtls = opContext.getSearchControls();
@@ -1028,13 +1027,11 @@
 
         if ( isPrincipalAnAdministrator( principalDn ) || !enabled || isRootDSELookup || isSubschemaSubentryLookup )
         {
-            return e;
+            return cursor;
         }
         
-        AuthorizationFilter authzFilter = new AuthorizationFilter();
-//        return new SearchResultFilteringEnumeration( e, searchCtls, invocation, authzFilter, "Search authorization Filter" );
-        // TODO NotImplementedException
-        throw new NotImplementedException();
+        cursor.addEntryFilter( new AuthorizationFilter() );
+        return cursor;
     }
 
     
@@ -1129,15 +1126,14 @@
     }
 
 
-    private boolean filter( Invocation invocation, LdapDN normName, ServerSearchResult result ) throws Exception
+    private boolean filter( LdapDN normName, ClonedServerEntry clonedEntry ) throws Exception
     {
-        ServerEntry resultEntry = result.getServerEntry();
-
         /*
          * First call hasPermission() for entry level "Browse" and "ReturnDN" perm
          * tests.  If we hasPermission() returns false we immediately short the
          * process and return false.
          */
+        Invocation invocation = InvocationStack.getInstance().peek();
         ServerEntry entry = invocation.getProxy().lookup( 
                 new LookupOperationContext( registries, normName ), PartitionNexusProxy.LOOKUP_BYPASS );
         
@@ -1160,7 +1156,7 @@
                         null, 
                         SEARCH_ENTRY_PERMS, 
                         tuples, 
-                        entry, 
+                        clonedEntry.getOriginalEntry(), 
                         null ) )
         {
             return false;
@@ -1175,11 +1171,11 @@
          */
         List<AttributeType> attributeToRemove = new ArrayList<AttributeType>();
         
-        for ( AttributeType attributeType:resultEntry.getAttributeTypes() )
+        for ( AttributeType attributeType:clonedEntry.getAttributeTypes() )
         {
             // if attribute type scope access is not allowed then remove the attribute and continue
             String id = attributeType.getName();
-            EntryAttribute attr = resultEntry.get( attributeType );
+            EntryAttribute attr = clonedEntry.get( attributeType );
         
             if ( !engine.hasPermission( 
                         registries, 
@@ -1236,10 +1232,9 @@
         
         for ( AttributeType attributeType:attributeToRemove )
         {
-            resultEntry.removeAttributes( attributeType );
+            clonedEntry.removeAttributes( attributeType );
         }
 
-        result.setServerEntry( resultEntry );
         return true;
     }
 
@@ -1247,13 +1242,13 @@
     /**
      * WARNING: create one of these filters fresh every time for each new search.
      */
-    class AuthorizationFilter implements SearchResultFilter
+    class AuthorizationFilter implements EntryFilter
     {
-        public boolean accept( Invocation invocation, ServerSearchResult result, SearchControls controls ) 
+        public boolean accept( SearchingOperationContext operationContext, ClonedServerEntry entry ) 
             throws Exception
         {
-            LdapDN normName = result.getDn().normalize( atRegistry.getNormalizerMapping() );
-            return filter( invocation, normName, result );
+            LdapDN normName = entry.getDn().normalize( atRegistry.getNormalizerMapping() );
+            return filter( normName, entry );
         }
     }
 }

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/DefaultAuthorizationInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/DefaultAuthorizationInterceptor.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/DefaultAuthorizationInterceptor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/DefaultAuthorizationInterceptor.java Thu May 22 13:00:38 2008
@@ -20,12 +20,12 @@
 package org.apache.directory.server.core.authz;
 
 
-import org.apache.commons.lang.NotImplementedException;
 import org.apache.directory.server.constants.ServerDNConstants;
 import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.cursor.Cursor;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
 import org.apache.directory.server.core.entry.ServerEntry;
-import org.apache.directory.server.core.entry.ServerSearchResult;
+import org.apache.directory.server.core.filtering.EntryFilter;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.BaseInterceptor;
 import org.apache.directory.server.core.interceptor.Interceptor;
 import org.apache.directory.server.core.interceptor.NextInterceptor;
@@ -37,6 +37,7 @@
 import org.apache.directory.server.core.interceptor.context.MoveOperationContext;
 import org.apache.directory.server.core.interceptor.context.RenameOperationContext;
 import org.apache.directory.server.core.interceptor.context.SearchOperationContext;
+import org.apache.directory.server.core.interceptor.context.SearchingOperationContext;
 import org.apache.directory.server.core.invocation.Invocation;
 import org.apache.directory.server.core.invocation.InvocationStack;
 import org.apache.directory.server.core.jndi.ServerContext;
@@ -422,9 +423,9 @@
     }
 
 
-    public ServerEntry lookup( NextInterceptor nextInterceptor, LookupOperationContext opContext ) throws Exception
+    public ClonedServerEntry lookup( NextInterceptor nextInterceptor, LookupOperationContext opContext ) throws Exception
     {
-        ServerEntry serverEntry = nextInterceptor.lookup( opContext );
+        ClonedServerEntry serverEntry = nextInterceptor.lookup( opContext );
         
         if ( !enabled || ( serverEntry == null ) )
         {
@@ -494,57 +495,48 @@
     }
 
 
-    public Cursor<ServerEntry> search( NextInterceptor nextInterceptor, SearchOperationContext opContext ) throws Exception
+    public EntryFilteringCursor search( NextInterceptor nextInterceptor, SearchOperationContext opContext ) throws Exception
     {
-        Cursor<ServerEntry> e = nextInterceptor.search( opContext );
+        EntryFilteringCursor cursor = nextInterceptor.search( opContext );
 
         if ( !enabled )
         {
-            return e;
+            return cursor;
         }
 
-        Invocation invocation = InvocationStack.getInstance().peek();
-
-//        return new SearchResultFilteringEnumeration( e, opContext.getSearchControls(), invocation, 
-//            new SearchResultFilter()
-//        {
-//            public boolean accept( Invocation invocation, ServerSearchResult result, SearchControls controls )
-//                throws Exception
-//            {
-//                return DefaultAuthorizationInterceptor.this.isSearchable( invocation, result );
-//            }
-//        }, "Search Default Authorization filter" );
-        // TODO not implemented
-        throw new NotImplementedException();
+        cursor.addEntryFilter( new EntryFilter() {
+            public boolean accept( SearchingOperationContext operation, ClonedServerEntry result ) throws Exception
+            {
+                Invocation invocation = InvocationStack.getInstance().peek();
+                return DefaultAuthorizationInterceptor.this.isSearchable( invocation, result );
+            }
+        } );
+        return cursor;
     }
 
 
-    public Cursor<ServerEntry> list( NextInterceptor nextInterceptor, ListOperationContext opContext ) throws Exception
+    public EntryFilteringCursor list( NextInterceptor nextInterceptor, ListOperationContext opContext ) throws Exception
     {
-        Cursor<ServerEntry> result = nextInterceptor.list( opContext );
+        EntryFilteringCursor cursor = nextInterceptor.list( opContext );
         
         if ( !enabled )
         {
-            return result;
+            return cursor;
         }
 
-        Invocation invocation = InvocationStack.getInstance().peek();
-        
-//        return new SearchResultFilteringEnumeration( result, null, invocation, new SearchResultFilter()
-//        {
-//            public boolean accept( Invocation invocation, ServerSearchResult result, SearchControls controls )
-//                throws Exception
-//            {
-//                return DefaultAuthorizationInterceptor.this.isSearchable( invocation, result );
-//            }
-//        }, "List Default Authorization filter" );
-        
-        // TODO not implemented
-        throw new NotImplementedException();
+        cursor.addEntryFilter( new EntryFilter()
+        {
+            public boolean accept( SearchingOperationContext operation, ClonedServerEntry entry ) throws Exception
+            {
+                Invocation invocation = InvocationStack.getInstance().peek();
+                return DefaultAuthorizationInterceptor.this.isSearchable( invocation, entry );
+            }
+        } );
+        return cursor;
     }
 
 
-    private boolean isSearchable( Invocation invocation, ServerSearchResult result ) throws Exception
+    private boolean isSearchable( Invocation invocation, ClonedServerEntry result ) throws Exception
     {
         LdapDN principalDn = ( ( ServerContext ) invocation.getCaller() ).getPrincipal().getJndiName();
         LdapDN dn = result.getDn();

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/GroupCache.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/GroupCache.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/GroupCache.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/GroupCache.java Thu May 22 13:00:38 2008
@@ -29,9 +29,9 @@
 
 import org.apache.directory.server.constants.ServerDNConstants;
 import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.cursor.Cursor;
 import org.apache.directory.server.core.entry.ServerAttribute;
 import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.context.SearchOperationContext;
 import org.apache.directory.server.core.partition.PartitionNexus;
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
@@ -142,7 +142,7 @@
             LdapDN baseDn = new LdapDN( suffix );
             SearchControls ctls = new SearchControls();
             ctls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-            Cursor<ServerEntry> results = nexus.search( new SearchOperationContext( registries,
+            EntryFilteringCursor results = nexus.search( new SearchOperationContext( registries,
                 baseDn, AliasDerefMode.DEREF_ALWAYS, filter, ctls ) );
 
             while ( results.next() )

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/TupleCache.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/TupleCache.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/TupleCache.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/authz/TupleCache.java Thu May 22 13:00:38 2008
@@ -21,9 +21,9 @@
 
 
 import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.cursor.Cursor;
 import org.apache.directory.server.core.entry.ServerAttribute;
 import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.context.SearchOperationContext;
 import org.apache.directory.server.core.partition.PartitionNexus;
 import org.apache.directory.server.schema.ConcreteNameComponentNormalizer;
@@ -134,7 +134,7 @@
                 SchemaConstants.ACCESS_CONTROL_SUBENTRY_OC ) );
             SearchControls ctls = new SearchControls();
             ctls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-            Cursor<ServerEntry> results = nexus.search( new SearchOperationContext( registries,
+            EntryFilteringCursor results = nexus.search( new SearchOperationContext( registries,
                 baseDn, AliasDerefMode.NEVER_DEREF_ALIASES, filter, ctls ) );
 
             while ( results.next() )

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeInterceptor.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeInterceptor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeInterceptor.java Thu May 22 13:00:38 2008
@@ -20,13 +20,12 @@
 package org.apache.directory.server.core.collective;
 
 
-import org.apache.commons.lang.NotImplementedException;
 import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.cursor.Cursor;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
 import org.apache.directory.server.core.entry.DefaultServerAttribute;
 import org.apache.directory.server.core.entry.ServerEntry;
-import org.apache.directory.server.core.entry.ServerSearchResult;
-import org.apache.directory.server.core.enumeration.SearchResultFilter;
+import org.apache.directory.server.core.filtering.EntryFilter;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.BaseInterceptor;
 import org.apache.directory.server.core.interceptor.NextInterceptor;
 import org.apache.directory.server.core.interceptor.context.AddOperationContext;
@@ -34,8 +33,7 @@
 import org.apache.directory.server.core.interceptor.context.LookupOperationContext;
 import org.apache.directory.server.core.interceptor.context.ModifyOperationContext;
 import org.apache.directory.server.core.interceptor.context.SearchOperationContext;
-import org.apache.directory.server.core.invocation.Invocation;
-import org.apache.directory.server.core.invocation.InvocationStack;
+import org.apache.directory.server.core.interceptor.context.SearchingOperationContext;
 import org.apache.directory.server.core.partition.PartitionNexus;
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.server.schema.registries.Registries;
@@ -45,8 +43,6 @@
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.shared.ldap.schema.AttributeType;
 
-import javax.naming.NamingException;
-import javax.naming.directory.SearchControls;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -79,22 +75,20 @@
     /**
      * the search result filter to use for collective attribute injection
      */
-    private final SearchResultFilter SEARCH_FILTER = new SearchResultFilter()
+    private final EntryFilter SEARCH_FILTER = new EntryFilter()
     {
-        public boolean accept( Invocation invocation, ServerSearchResult result, SearchControls controls )
+        public boolean accept( SearchingOperationContext operation, ClonedServerEntry result )
             throws Exception
         {
-            LdapDN name = ((ServerSearchResult)result).getDn();
+            LdapDN name = result.getDn();
             
             if ( name.isNormalized() == false )
             {
             	name = LdapDN.normalize( name, atRegistry.getNormalizerMapping() );
             }
             
-            ServerEntry entry = result.getServerEntry();
-            String[] retAttrs = controls.getReturningAttributes();
-            addCollectiveAttributes( name, entry, retAttrs );
-            result.setServerEntry( entry );
+            String[] retAttrs = operation.getSearchControls().getReturningAttributes();
+            addCollectiveAttributes( name, result, retAttrs );
             return true;
         }
     };
@@ -285,7 +279,7 @@
     }
     
     
-    private Set<AttributeType> getAllSuperTypes( AttributeType id ) throws NamingException
+    private Set<AttributeType> getAllSuperTypes( AttributeType id ) throws Exception
     {
         Set<AttributeType> allSuperTypes = new HashSet<AttributeType>();
         AttributeType superType = id;
@@ -307,9 +301,12 @@
     // ------------------------------------------------------------------------
     // Interceptor Method Overrides
     // ------------------------------------------------------------------------
-    public ServerEntry lookup( NextInterceptor nextInterceptor, LookupOperationContext opContext ) throws Exception
+
+    
+    public ClonedServerEntry lookup( NextInterceptor nextInterceptor, LookupOperationContext opContext ) 
+        throws Exception
     {
-        ServerEntry result = nextInterceptor.lookup( opContext );
+        ClonedServerEntry result = nextInterceptor.lookup( opContext );
         
         if ( result == null )
         {
@@ -329,34 +326,27 @@
     }
 
 
-    public Cursor<ServerEntry> list( NextInterceptor nextInterceptor, ListOperationContext opContext ) throws Exception
+    public EntryFilteringCursor list( NextInterceptor nextInterceptor, ListOperationContext opContext ) throws Exception
     {
-        Cursor<ServerEntry> result = nextInterceptor.list( opContext );
-        Invocation invocation = InvocationStack.getInstance().peek();
-        
-//        return new SearchResultFilteringEnumeration( result, new SearchControls(), invocation, SEARCH_FILTER, "List collective Filter" );
-        
-        // TODO not implemented
-        throw new NotImplementedException();
+        EntryFilteringCursor cursor = nextInterceptor.list( opContext );
+        cursor.addEntryFilter( SEARCH_FILTER );
+        return cursor;
     }
 
 
-    public Cursor<ServerEntry> search( NextInterceptor nextInterceptor, SearchOperationContext opContext ) throws Exception
+    public EntryFilteringCursor search( NextInterceptor nextInterceptor, SearchOperationContext opContext ) throws Exception
     {
-        Cursor<ServerEntry> result = nextInterceptor.search( opContext );
-        Invocation invocation = InvocationStack.getInstance().peek();
-        
-//        return new SearchResultFilteringEnumeration( 
-//            result, opContext.getSearchControls(), invocation, SEARCH_FILTER, "Search collective Filter" );
-        
-        // TODO not implemented
-        throw new NotImplementedException();
+        EntryFilteringCursor cursor = nextInterceptor.search( opContext );
+        cursor.addEntryFilter( SEARCH_FILTER );
+        return cursor;
     }
+
     
     // ------------------------------------------------------------------------
     // Partial Schema Checking
     // ------------------------------------------------------------------------
     
+    
     public void add( NextInterceptor next, AddOperationContext opContext ) throws Exception
     {
         collectiveAttributesSchemaChecker.checkAdd( opContext.getDn(), opContext.getEntry() );

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/exception/ExceptionInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/exception/ExceptionInterceptor.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/exception/ExceptionInterceptor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/exception/ExceptionInterceptor.java Thu May 22 13:00:38 2008
@@ -22,10 +22,11 @@
 
 import org.apache.commons.collections.map.LRUMap;
 import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.cursor.Cursor;
 import org.apache.directory.server.core.cursor.EmptyCursor;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
 import org.apache.directory.server.core.entry.ServerAttribute;
 import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.BaseInterceptor;
 import org.apache.directory.server.core.interceptor.NextInterceptor;
 import org.apache.directory.server.core.interceptor.context.AddOperationContext;
@@ -232,7 +233,7 @@
 
         // check if entry to delete has children (only leaves can be deleted)
         boolean hasChildren = false;
-        Cursor<ServerEntry> list = nextInterceptor.list( new ListOperationContext( registries, name ) );
+        EntryFilteringCursor list = nextInterceptor.list( new ListOperationContext( registries, name ) );
         
         if ( list.next() )
         {
@@ -263,12 +264,12 @@
     /**
      * Checks to see the base being searched exists, otherwise throws the appropriate LdapException.
      */
-    public Cursor<ServerEntry> list( NextInterceptor nextInterceptor, ListOperationContext opContext ) throws Exception
+    public EntryFilteringCursor list( NextInterceptor nextInterceptor, ListOperationContext opContext ) throws Exception
     {
         if ( opContext.getDn().getNormName().equals( subschemSubentryDn.getNormName() ) )
         {
             // there is nothing under the schema subentry
-            return new EmptyCursor<ServerEntry>();
+            return new EntryFilteringCursor( new EmptyCursor<ServerEntry>(), opContext );
         }
         
         // check if entry to search exists
@@ -282,7 +283,7 @@
     /**
      * Checks to see the base being searched exists, otherwise throws the appropriate LdapException.
      */
-    public ServerEntry lookup( NextInterceptor nextInterceptor, LookupOperationContext opContext ) throws Exception
+    public ClonedServerEntry lookup( NextInterceptor nextInterceptor, LookupOperationContext opContext ) throws Exception
     {
         if ( opContext.getDn().getNormName().equals( subschemSubentryDn.getNormName() ) )
         {
@@ -516,15 +517,15 @@
     /**
      * Checks to see the entry being searched exists, otherwise throws the appropriate LdapException.
      */
-    public Cursor<ServerEntry> search( NextInterceptor nextInterceptor, SearchOperationContext opContext ) throws Exception
+    public EntryFilteringCursor search( NextInterceptor nextInterceptor, SearchOperationContext opContext ) throws Exception
     {
         LdapDN base = opContext.getDn();
 
         try
         {
-            Cursor<ServerEntry> result =  nextInterceptor.search( opContext );
+            EntryFilteringCursor cursor =  nextInterceptor.search( opContext );
 	        
-	        if ( ! result.next() )
+	        if ( ! cursor.next() )
 	        {
 	            if ( !base.isEmpty() && !( subschemSubentryDn.toNormName() ).equalsIgnoreCase( base.toNormName() ) )
 	            {
@@ -533,7 +534,7 @@
 	            }
 	        }
 
-	        return result;
+	        return cursor;
         }
         catch ( Exception ne )
         {

Added: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilter.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilter.java?rev=659229&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilter.java (added)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilter.java Thu May 22 13:00:38 2008
@@ -0,0 +1,52 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.server.core.filtering;
+
+
+import org.apache.directory.server.core.entry.ClonedServerEntry;
+import org.apache.directory.server.core.interceptor.context.SearchingOperationContext;
+
+
+/**
+ * An entry filter is used to modify search results while they are being 
+ * returned from Cursors over ServerEntry objects.  These filters are used in
+ * conjunction with a {@link FilteringCursor}.  Multiple filters can be 
+ * applied one after the other and hence they are stack-able and applied in
+ * order.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public interface EntryFilter
+{
+    /**
+     * Filters the contents of search entries on the way out the door to 
+     * client callers.  These filters can and do produce side-effects on the 
+     * entry results if need be.  These entries, their attributes and values
+     * should be cloned when alterations are made to avoid altering cached
+     * entries.
+     *
+     * @param result the result to accept or reject possibly modifying it
+     * @param controls search controls associated with the invocation
+     * @return true if the entry is to be returned, false if it is rejected
+     * @throws Exception if there are failures during evaluation
+     */
+    boolean accept( SearchingOperationContext operation, ClonedServerEntry result ) throws Exception;
+}

Added: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilteringCursor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilteringCursor.java?rev=659229&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilteringCursor.java (added)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilteringCursor.java Thu May 22 13:00:38 2008
@@ -0,0 +1,470 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *   or more contributor license agreements.  See the NOTICE file
+ *   distributed with this work for additional information
+ *   regarding copyright ownership.  The ASF licenses this file
+ *   to you under the Apache License, Version 2.0 (the
+ *   "License"); you may not use this file except in compliance
+ *   with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing,
+ *   software distributed under the License is distributed on an
+ *   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *   KIND, either express or implied.  See the License for the
+ *   specific language governing permissions and limitations
+ *   under the License.
+ *
+ */
+package org.apache.directory.server.core.filtering;
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.directory.server.core.cursor.Cursor;
+import org.apache.directory.server.core.cursor.CursorIterator;
+import org.apache.directory.server.core.cursor.InvalidCursorPositionException;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
+import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.interceptor.context.SearchingOperationContext;
+import org.apache.directory.shared.ldap.exception.OperationAbandonedException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * A Cursor which uses a list of filters to selectively return entries and/or
+ * modify the contents of entries.  Uses lazy pre-fetching on positioning 
+ * operations which means adding filters after creation will not miss candidate
+ * entries.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EntryFilteringCursor implements Cursor<ClonedServerEntry>
+{
+    /** the logger used by this class */
+    private static final Logger log = LoggerFactory.getLogger( EntryFilteringCursor.class );
+
+    /** the underlying wrapped search results Cursor */
+    private final Cursor<ServerEntry> wrapped;
+    
+    /** the parameters associated with the search operation */
+    private final SearchingOperationContext operationContext;
+    
+    /** the list of filters to be applied */
+    private final List<EntryFilter> filters;
+    
+    /** the first accepted search result that is pre fetched */
+    private ClonedServerEntry prefetched;
+    
+    /** whether or not this search has been abandoned */
+    private boolean abandoned = false;
+
+    
+    // ------------------------------------------------------------------------
+    // C O N S T R U C T O R S
+    // ------------------------------------------------------------------------
+
+    
+    /**
+     * Creates a new entry filtering Cursor over an existing Cursor using a 
+     * single filter initially: more can be added later after creation.
+     * 
+     * @param wrapped the underlying wrapped Cursor whose entries are filtered
+     * @param searchControls the controls of search that created this Cursor
+     * @param invocation the search operation invocation creating this Cursor
+     * @param filter a single filter to be used
+     */
+    public EntryFilteringCursor( Cursor<ServerEntry> wrapped, 
+        SearchingOperationContext operationContext, EntryFilter filter )
+    {
+        this( wrapped, operationContext, Collections.singletonList( filter ) );
+    }
+
+    
+    /**
+     * Creates a new entry filtering Cursor over an existing Cursor using a 
+     * no filter initially: more can be added later after creation.
+     * 
+     * @param wrapped the underlying wrapped Cursor whose entries are filtered
+     * @param searchControls the controls of search that created this Cursor
+     * @param invocation the search operation invocation creating this Cursor
+     * @param filter a single filter to be used
+     */
+    public EntryFilteringCursor( Cursor<ServerEntry> wrapped, SearchingOperationContext operationContext )
+    {
+        this.wrapped = wrapped;
+        this.operationContext = operationContext;
+        this.filters = new ArrayList<EntryFilter>();
+    }
+
+    
+    /**
+     * Creates a new entry filtering Cursor over an existing Cursor using a 
+     * list of filters initially: more can be added later after creation.
+     * 
+     * @param wrapped the underlying wrapped Cursor whose entries are filtered
+     * @param operationContext the operation context that created this Cursor
+     * @param invocation the search operation invocation creating this Cursor
+     * @param filters a list of filters to be used
+     */
+    public EntryFilteringCursor( Cursor<ServerEntry> wrapped, 
+        SearchingOperationContext operationContext, List<EntryFilter> filters )
+    {
+        this.wrapped = wrapped;
+        this.operationContext = operationContext;
+        this.filters = new ArrayList<EntryFilter>();
+        this.filters.addAll( filters );
+    }
+
+    
+    // ------------------------------------------------------------------------
+    // Class Specific Methods
+    // ------------------------------------------------------------------------
+
+    
+    /**
+     * Gets whether or not this EntryFilteringCursor has been abandoned.
+     *
+     * @return true if abandoned, false if not
+     */
+    public boolean isAbandoned()
+    {
+        return abandoned;
+    }
+    
+    
+    /**
+     * Sets whether this EntryFilteringCursor has been abandoned.
+     *
+     * @param abandoned true if abandoned, false if not
+     */
+    public void setAbandoned( boolean abandoned )
+    {
+        this.abandoned = abandoned;
+        
+        if ( abandoned )
+        {
+            log.info( "Cursor has been abandoned." );
+        }
+    }
+    
+    
+    /**
+     * Adds an entry filter to this EntryFilteringCursor at the very end of 
+     * the filter list.  EntryFilters are applied in the order of addition.
+     * 
+     * @param filter a filter to apply to the entries
+     * @return the result of {@link List#add(Object)}
+     */
+    public boolean addEntryFilter( EntryFilter filter )
+    {
+        return filters.add( filter );
+    }
+    
+    
+    /**
+     * Removes an entry filter to this EntryFilteringCursor at the very end of 
+     * the filter list.  
+     * 
+     * @param filter a filter to remove from the filter list
+     * @return the result of {@link List#remove(Object)}
+     */
+    public boolean removeEntryFilter( EntryFilter filter )
+    {
+        return filters.remove( filter );
+    }
+    
+    
+    /**
+     * Gets an unmodifiable list of EntryFilters applied.
+     *
+     * @return an unmodifiable list of EntryFilters applied
+     */
+    public List<EntryFilter> getEntryFilters()
+    {
+        return Collections.unmodifiableList( filters );
+    }
+    
+    
+    /**
+     * @return the operationContext
+     */
+    public SearchingOperationContext getOperationContext()
+    {
+        return operationContext;
+    }
+
+    
+    // ------------------------------------------------------------------------
+    // Cursor Interface Methods
+    // ------------------------------------------------------------------------
+
+    
+    /* 
+     * @see Cursor#after(Object)
+     */
+    public void after( ClonedServerEntry element ) throws Exception
+    {
+        throw new UnsupportedOperationException();
+    }
+
+
+    /* 
+     * @see Cursor#afterLast()
+     */
+    public void afterLast() throws Exception
+    {
+        wrapped.afterLast();
+        prefetched = null;
+    }
+
+
+    /* 
+     * @see Cursor#available()
+     */
+    public boolean available()
+    {
+        return prefetched != null;
+    }
+
+
+    /* 
+     * @see Cursor#before(java.lang.Object)
+     */
+    public void before( ClonedServerEntry element ) throws Exception
+    {
+        throw new UnsupportedOperationException();
+    }
+
+
+    /* 
+     * @see Cursor#beforeFirst()
+     */
+    public void beforeFirst() throws Exception
+    {
+        wrapped.beforeFirst();
+        prefetched = null;
+    }
+
+
+    /* 
+     * @see Cursor#close()
+     */
+    public void close() throws Exception
+    {
+        wrapped.close();
+        prefetched = null;
+    }
+
+
+    /* 
+     * @see Cursor#first()
+     */
+    public boolean first() throws Exception
+    {
+        if ( abandoned )
+        {
+            log.info( "Cursor has been abandoned." );
+            close();
+            throw new OperationAbandonedException();
+        }
+        
+        beforeFirst();
+        return next();
+    }
+
+
+    /* 
+     * @see Cursor#get()
+     */
+    public ClonedServerEntry get() throws Exception
+    {
+        if ( available() )
+        {
+            return prefetched;
+        }
+        
+        throw new InvalidCursorPositionException();
+    }
+
+
+    /* 
+     * @see Cursor#isClosed()
+     */
+    public boolean isClosed() throws Exception
+    {
+        return wrapped.isClosed();
+    }
+
+
+    /* 
+     * @see Cursor#isElementReused()
+     */
+    public boolean isElementReused()
+    {
+        return true;
+    }
+
+
+    /* 
+     * @see Cursor#last()
+     */
+    public boolean last() throws Exception
+    {
+        if ( abandoned )
+        {
+            log.info( "Cursor has been abandoned." );
+            close();
+            throw new OperationAbandonedException();
+        }
+
+        afterLast();
+        return previous();
+    }
+
+
+    /* 
+     * @see Cursor#next()
+     */
+    public boolean next() throws Exception
+    {
+        if ( abandoned )
+        {
+            log.info( "Cursor has been abandoned." );
+            close();
+            throw new OperationAbandonedException();
+        }
+        
+        ClonedServerEntry tempResult = null;
+        outer: while ( wrapped.next() )
+        {
+            boolean accepted = true;
+            tempResult = new ClonedServerEntry( wrapped.get() );
+            
+            /*
+             * O P T I M I Z A T I O N
+             * -----------------------
+             * 
+             * Don't want to waste cycles on enabling a loop for processing 
+             * filters if we have zero or one filter.
+             */
+            
+            if ( filters.isEmpty() )
+            {
+                prefetched = tempResult;
+                return true;
+            }
+            
+            if ( filters.size() == 1 )
+            {
+                if ( filters.get( 0 ).accept( operationContext, tempResult ) )
+                {
+                    prefetched = tempResult;
+                    return true;
+                }
+            }
+            
+            /* E N D   O P T I M I Z A T I O N */
+            
+            for ( EntryFilter filter : filters )
+            {
+                // if a filter rejects then short and continue with outer loop
+                if ( ! ( accepted &= filter.accept( operationContext, tempResult ) ) )
+                {
+                    continue outer;
+                }
+            }
+            
+            /*
+             * Here the entry has been accepted by all filters.
+             */
+            
+            prefetched = tempResult;
+            return true;
+        }
+        
+        prefetched = null;
+        return false;
+    }
+
+
+    /* 
+     * @see Cursor#previous()
+     */
+    public boolean previous() throws Exception
+    {
+        if ( abandoned )
+        {
+            log.info( "Cursor has been abandoned." );
+            close();
+            throw new OperationAbandonedException();
+        }
+        
+        ClonedServerEntry tempResult = null;
+        outer: while ( wrapped.previous() )
+        {
+            boolean accepted = true;
+            tempResult = new ClonedServerEntry( wrapped.get() );
+            
+            /*
+             * O P T I M I Z A T I O N
+             * -----------------------
+             * 
+             * Don't want to waste cycles on enabling a loop for processing 
+             * filters if we have zero or one filter.
+             */
+            
+            if ( filters.isEmpty() )
+            {
+                prefetched = tempResult;
+                return true;
+            }
+            
+            if ( filters.size() == 1 )
+            {
+                if ( filters.get( 0 ).accept( operationContext, tempResult ) )
+                {
+                    prefetched = tempResult;
+                    return true;
+                }
+            }
+            
+            /* E N D   O P T I M I Z A T I O N */
+            
+            for ( EntryFilter filter : filters )
+            {
+                // if a filter rejects then short and continue with outer loop
+                if ( ! ( accepted &= filter.accept( operationContext, tempResult ) ) )
+                {
+                    continue outer;
+                }
+            }
+            
+            /*
+             * Here the entry has been accepted by all filters.
+             */
+            
+            prefetched = tempResult;
+            return true;
+        }
+        
+        prefetched = null;
+        return false;
+    }
+
+
+    /* 
+     * @see Iterable#iterator()
+     */
+    public Iterator<ClonedServerEntry> iterator()
+    {
+        return new CursorIterator<ClonedServerEntry>( this );
+    }
+}

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/BaseInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/BaseInterceptor.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/BaseInterceptor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/BaseInterceptor.java Thu May 22 13:00:38 2008
@@ -22,8 +22,8 @@
 
 import org.apache.directory.server.core.DirectoryService;
 import org.apache.directory.server.core.authn.LdapPrincipal;
-import org.apache.directory.server.core.cursor.Cursor;
-import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.context.AddContextPartitionOperationContext;
 import org.apache.directory.server.core.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.interceptor.context.BindOperationContext;
@@ -142,7 +142,7 @@
     }
 
 
-    public ServerEntry getRootDSE( NextInterceptor next, GetRootDSEOperationContext opContext ) throws Exception
+    public ClonedServerEntry getRootDSE( NextInterceptor next, GetRootDSEOperationContext opContext ) throws Exception
     {
         return next.getRootDSE( opContext );
     }
@@ -160,7 +160,7 @@
     }
 
 
-    public Cursor<ServerEntry> list( NextInterceptor next, ListOperationContext opContext ) throws Exception
+    public EntryFilteringCursor list( NextInterceptor next, ListOperationContext opContext ) throws Exception
     {
         return next.list( opContext );
     }
@@ -173,7 +173,7 @@
     }
 
 
-    public ServerEntry lookup( NextInterceptor next, LookupOperationContext opContext ) throws Exception
+    public ClonedServerEntry lookup( NextInterceptor next, LookupOperationContext opContext ) throws Exception
     {
         return next.lookup( opContext );
     }
@@ -204,7 +204,7 @@
     }
 
 
-    public Cursor<ServerEntry> search( NextInterceptor next, SearchOperationContext opContext ) throws Exception
+    public EntryFilteringCursor search( NextInterceptor next, SearchOperationContext opContext ) throws Exception
     {
         return next.search( opContext );
     }

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/Interceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/Interceptor.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/Interceptor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/Interceptor.java Thu May 22 13:00:38 2008
@@ -21,8 +21,8 @@
 
 
 import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.cursor.Cursor;
-import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.context.AddContextPartitionOperationContext;
 import org.apache.directory.server.core.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.interceptor.context.BindOperationContext;
@@ -138,7 +138,7 @@
     /**
      * Filters {@link PartitionNexus#getRootDSE( GetRootDSEOperationContext )} call.
      */
-    ServerEntry getRootDSE( NextInterceptor next, GetRootDSEOperationContext  opContext ) throws Exception;
+    ClonedServerEntry getRootDSE( NextInterceptor next, GetRootDSEOperationContext  opContext ) throws Exception;
 
 
     /**
@@ -198,19 +198,19 @@
     /**
      * Filters {@link Partition#list( ListOperationContext )} call.
      */
-    Cursor<ServerEntry> list( NextInterceptor next, ListOperationContext opContext ) throws Exception;
+    EntryFilteringCursor list( NextInterceptor next, ListOperationContext opContext ) throws Exception;
 
 
     /**
      * Filters {@link Partition#search( SearchOperationContext )} call.
      */
-    Cursor<ServerEntry> search( NextInterceptor next, SearchOperationContext opContext ) throws Exception;
+    EntryFilteringCursor search( NextInterceptor next, SearchOperationContext opContext ) throws Exception;
 
 
     /**
      * Filters {@link Partition#lookup( LookupOperationContext )} call.
      */
-    ServerEntry lookup( NextInterceptor next, LookupOperationContext opContext ) throws Exception;
+    ClonedServerEntry lookup( NextInterceptor next, LookupOperationContext opContext ) throws Exception;
 
 
     /**

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/InterceptorChain.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/InterceptorChain.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/InterceptorChain.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/InterceptorChain.java Thu May 22 13:00:38 2008
@@ -27,8 +27,8 @@
 import java.util.Map;
 
 import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.cursor.Cursor;
-import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.context.AddContextPartitionOperationContext;
 import org.apache.directory.server.core.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.interceptor.context.BindOperationContext;
@@ -100,7 +100,7 @@
         }
 
 
-        public ServerEntry getRootDSE( NextInterceptor next, GetRootDSEOperationContext opContext ) throws Exception
+        public ClonedServerEntry getRootDSE( NextInterceptor next, GetRootDSEOperationContext opContext ) throws Exception
         {
             return nexus.getRootDSE( opContext );
         }
@@ -142,21 +142,21 @@
         }
 
 
-        public Cursor<ServerEntry> list( NextInterceptor next, ListOperationContext opContext ) throws Exception
+        public EntryFilteringCursor list( NextInterceptor next, ListOperationContext opContext ) throws Exception
         {
             return nexus.list( opContext );
         }
 
 
-        public Cursor<ServerEntry>  search( NextInterceptor next, SearchOperationContext opContext ) throws Exception
+        public EntryFilteringCursor search( NextInterceptor next, SearchOperationContext opContext ) throws Exception
         {
             return nexus.search( opContext );
         }
 
 
-        public ServerEntry lookup( NextInterceptor next, LookupOperationContext opContext ) throws Exception
+        public ClonedServerEntry lookup( NextInterceptor next, LookupOperationContext opContext ) throws Exception
         {
-            return ( ServerEntry ) nexus.lookup( opContext ).clone();
+            return nexus.lookup( opContext );
         }
 
 
@@ -534,7 +534,7 @@
     }
 
 
-    public ServerEntry getRootDSE( GetRootDSEOperationContext opContext ) throws Exception
+    public ClonedServerEntry getRootDSE( GetRootDSEOperationContext opContext ) throws Exception
     {
         Entry entry = getStartingEntry();
         Interceptor head = entry.interceptor;
@@ -793,7 +793,7 @@
     }
 
 
-    public Cursor<ServerEntry> list( ListOperationContext opContext ) throws Exception
+    public EntryFilteringCursor list( ListOperationContext opContext ) throws Exception
     {
         Entry entry = getStartingEntry();
         Interceptor head = entry.interceptor;
@@ -815,7 +815,7 @@
     }
 
 
-    public Cursor<ServerEntry> search( SearchOperationContext opContext )
+    public EntryFilteringCursor search( SearchOperationContext opContext )
         throws Exception
     {
         Entry entry = getStartingEntry();
@@ -838,7 +838,7 @@
     }
 
 
-    public ServerEntry lookup( LookupOperationContext opContext ) throws Exception
+    public ClonedServerEntry lookup( LookupOperationContext opContext ) throws Exception
     {
         Entry entry = getStartingEntry();
         Interceptor head = entry.interceptor;
@@ -1039,7 +1039,7 @@
                 }
 
 
-                public ServerEntry getRootDSE( GetRootDSEOperationContext opContext ) throws Exception
+                public ClonedServerEntry getRootDSE( GetRootDSEOperationContext opContext ) throws Exception
                 {
                     Entry next = getNextEntry();
                     Interceptor interceptor = next.interceptor;
@@ -1183,7 +1183,7 @@
                 }
 
                 
-                public Cursor<ServerEntry> list( ListOperationContext opContext ) throws Exception
+                public EntryFilteringCursor list( ListOperationContext opContext ) throws Exception
                 {
                     Entry next = getNextEntry();
                     Interceptor interceptor = next.interceptor;
@@ -1204,7 +1204,7 @@
                 }
 
 
-                public Cursor<ServerEntry> search( SearchOperationContext opContext )
+                public EntryFilteringCursor search( SearchOperationContext opContext )
                     throws Exception
                 {
                     Entry next = getNextEntry();
@@ -1226,7 +1226,7 @@
                 }
 
 
-                public ServerEntry lookup( LookupOperationContext opContext ) throws Exception
+                public ClonedServerEntry lookup( LookupOperationContext opContext ) throws Exception
                 {
                     Entry next = getNextEntry();
                     Interceptor interceptor = next.interceptor;

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/NextInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/NextInterceptor.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/NextInterceptor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/NextInterceptor.java Thu May 22 13:00:38 2008
@@ -22,8 +22,8 @@
 
 import java.util.Iterator;
 
-import org.apache.directory.server.core.cursor.Cursor;
-import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.context.AddContextPartitionOperationContext;
 import org.apache.directory.server.core.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.interceptor.context.BindOperationContext;
@@ -66,7 +66,7 @@
     /**
      * Calls the next interceptor's {@link Interceptor#getRootDSE( NextInterceptor, GetRootDSEOperationContext )}.
      */
-    ServerEntry getRootDSE( GetRootDSEOperationContext opContext ) throws Exception;
+    ClonedServerEntry getRootDSE( GetRootDSEOperationContext opContext ) throws Exception;
 
 
     /**
@@ -119,19 +119,19 @@
     /**
      * Calls the next interceptor's {@link Interceptor#list( NextInterceptor, ListOperationContext )}.
      */
-    Cursor<ServerEntry> list( ListOperationContext opContext ) throws Exception;
+    EntryFilteringCursor list( ListOperationContext opContext ) throws Exception;
 
 
     /**
      * Calls the next interceptor's {@link Interceptor#search( NextInterceptor, SearchOperationContext opContext )}.
      */
-    Cursor<ServerEntry> search( SearchOperationContext opContext ) throws Exception;
+    EntryFilteringCursor search( SearchOperationContext opContext ) throws Exception;
 
 
     /**
      * Calls the next interceptor's {@link Interceptor#lookup( NextInterceptor, LookupOperationContext )}.
      */
-    ServerEntry lookup( LookupOperationContext opContext ) throws Exception;
+    ClonedServerEntry lookup( LookupOperationContext opContext ) throws Exception;
 
 
     /**

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/ListOperationContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/ListOperationContext.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/ListOperationContext.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/ListOperationContext.java Thu May 22 13:00:38 2008
@@ -19,10 +19,12 @@
  */
 package org.apache.directory.server.core.interceptor.context;
 
+
 import org.apache.directory.server.schema.registries.Registries;
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 
+
 /**
  * A ListContext context used for Interceptors. It contains all the informations
  * needed for the List operation, and used by all the interceptors
@@ -30,11 +32,8 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
  */
-public class ListOperationContext extends AbstractOperationContext
+public class ListOperationContext extends SearchingOperationContext
 {
-    private AliasDerefMode aliasDerefMode = AliasDerefMode.DEREF_ALWAYS;
-
-
     /**
      * Creates a new instance of ListOperationContext.
      */
@@ -63,8 +62,7 @@
      */
     public ListOperationContext( Registries registries, LdapDN dn, AliasDerefMode aliasDerefMode )
     {
-        super( registries, dn );
-        this.aliasDerefMode = aliasDerefMode;
+        super( registries, dn, aliasDerefMode );
     }
 
     
@@ -75,10 +73,4 @@
     {
         return "ListOperationContext with DN '" + getDn().getUpName() + "'";
     }
-
-
-    public AliasDerefMode getAliasDerefMode()
-    {
-        return aliasDerefMode;
-    }
 }

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/SearchOperationContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/SearchOperationContext.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/SearchOperationContext.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/SearchOperationContext.java Thu May 22 13:00:38 2008
@@ -35,16 +35,10 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
  */
-public class SearchOperationContext extends AbstractOperationContext
+public class SearchOperationContext extends SearchingOperationContext
 {
     /** The filter */
     private ExprNode filter;
-    
-    /** The controls */
-    private SearchControls searchControls;
-
-    /** The mode of alias handling */
-    private AliasDerefMode aliasDerefMode;
 
 
     /**
@@ -66,10 +60,8 @@
     public SearchOperationContext( Registries registries, LdapDN dn, AliasDerefMode aliasDerefMode, ExprNode filter,
                                    SearchControls searchControls )
     {
-        super( registries, dn );
+        super( registries, dn, aliasDerefMode, searchControls );
         this.filter = filter;
-        this.aliasDerefMode = aliasDerefMode;
-        this.searchControls = searchControls;
     }
 
 
@@ -94,26 +86,6 @@
 
 
     /**
-     *  @return The search controls
-     */
-    public SearchControls getSearchControls()
-    {
-        return searchControls;
-    }
-
-
-    /**
-     * Set the search controls
-     *
-     * @param searchControls The search controls
-     */
-    public void setSearchControls( SearchControls searchControls )
-    {
-        this.searchControls = searchControls;
-    }
-
-
-    /**
      * @see Object#toString()
      */
     public String toString()
@@ -121,23 +93,4 @@
         return "SearchContext for DN '" + getDn().getUpName() + "', filter :'"
         + filter + "'"; 
     }
-
-
-    /**
-     *  @return The alias handling mode
-     */
-    public AliasDerefMode getAliasDerefMode()
-    {
-        return aliasDerefMode;
-    }
-
-
-    /**
-     * Set the alias handling mode
-     *  @param aliasDerefMode The alias handling mode
-     */
-    public void setAliasDerefMode( AliasDerefMode aliasDerefMode )
-    {
-        this.aliasDerefMode = aliasDerefMode;
-    }
 }

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java Thu May 22 13:00:38 2008
@@ -24,11 +24,11 @@
 import org.apache.directory.server.core.DirectoryService;
 import org.apache.directory.server.core.authn.AuthenticationInterceptor;
 import org.apache.directory.server.core.authn.LdapPrincipal;
-import org.apache.directory.server.core.cursor.Cursor;
 import org.apache.directory.server.core.entry.DefaultServerEntry;
 import org.apache.directory.shared.ldap.entry.EntryAttribute;
 import org.apache.directory.server.core.entry.ServerEntry;
 import org.apache.directory.server.core.entry.ServerEntryUtils;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.interceptor.context.BindOperationContext;
 import org.apache.directory.server.core.interceptor.context.DeleteOperationContext;
@@ -253,7 +253,7 @@
      * @param searchControls
      * @return NamingEnumeration
      */
-    protected Cursor<ServerEntry> doSearchOperation( LdapDN dn, AliasDerefMode aliasDerefMode,
+    protected EntryFilteringCursor doSearchOperation( LdapDN dn, AliasDerefMode aliasDerefMode,
         ExprNode filter, SearchControls searchControls ) throws Exception
     {
         // setup the op context and populate with request controls
@@ -262,7 +262,7 @@
         opCtx.addRequestControls( requestControls );
 
         // execute search operation
-        Cursor<ServerEntry> results = nexusProxy.search( opCtx );
+        EntryFilteringCursor results = nexusProxy.search( opCtx );
 
         // clear the request controls and set the response controls 
         requestControls = EMPTY_CONTROLS;
@@ -275,14 +275,14 @@
     /**
      * Used to encapsulate [de]marshalling of controls before and after list operations.
      */
-    protected Cursor<ServerEntry> doListOperation( LdapDN target ) throws Exception
+    protected EntryFilteringCursor doListOperation( LdapDN target ) throws Exception
     {
         // setup the op context and populate with request controls
         ListOperationContext opCtx = new ListOperationContext( registries, target );
         opCtx.addRequestControls( requestControls );
 
         // execute list operation
-        Cursor<ServerEntry> results = nexusProxy.list( opCtx );
+        EntryFilteringCursor results = nexusProxy.list( opCtx );
 
         // clear the request controls and set the response controls 
         requestControls = EMPTY_CONTROLS;
@@ -1170,6 +1170,7 @@
         ctls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
         AliasDerefMode aliasDerefMode = AliasDerefMode.getEnum( getEnvironment() );
 //        return doSearchOperation( base, aliasDerefMode, filter, ctls );
+        
         // TODO not implemented
         throw new NotImplementedException();
     }

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/AbstractPartition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/AbstractPartition.java?rev=659229&r1=659228&r2=659229&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/AbstractPartition.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/AbstractPartition.java Thu May 22 13:00:38 2008
@@ -21,7 +21,7 @@
 
 
 import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
 import org.apache.directory.server.core.interceptor.context.EntryOperationContext;
 import org.apache.directory.server.core.interceptor.context.LookupOperationContext;
 
@@ -166,7 +166,7 @@
      * with null <tt>attributeIds</tt> by default.  Please override
      * this method if there is more effective way for your implementation.
      */
-    public ServerEntry lookup( LookupOperationContext lookupContext ) throws NamingException
+    public ClonedServerEntry lookup( LookupOperationContext lookupContext ) throws NamingException
     {
         return null;
     }