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/24 10:45:25 UTC

svn commit: r659774 - in /directory: apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/event/ apacheds/branches/bigbang/core/src/main...

Author: akarasulu
Date: Sat May 24 01:45:24 2008
New Revision: 659774

URL: http://svn.apache.org/viewvc?rev=659774&view=rev
Log:
fixing several bugs withsearch such as applying controls and with subtree scope processing - also added new enumerated type for SearchScope and added more (better) paramters into SearchingOperationContexts instead of using SearchControls

Added:
    directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SearchScope.java
Modified:
    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/event/EventInterceptor.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/event/ScopeEvaluator.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilteringCursor.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/interceptor/context/SearchingOperationContext.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/jndi/NamingEnumerationAdapter.java
    directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/PartitionNexusProxy.java
    directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/CursorBuilder.java
    directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultOptimizer.java
    directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultSearchEngine.java
    directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/EvaluatorBuilder.java
    directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/OneLevelScopeEvaluator.java
    directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubtreeScopeEvaluator.java
    directory/apacheds/branches/bigbang/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/OneLevelScopeTest.java
    directory/apacheds/branches/bigbang/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/SubtreeScopeTest.java
    directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/ScopeNode.java
    directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SimpleNode.java

Modified: 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=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ClonedServerEntry.java (original)
+++ directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ClonedServerEntry.java Sat May 24 01:45:24 2008
@@ -19,6 +19,8 @@
  */
 package org.apache.directory.server.core.entry;
 
+
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -392,4 +394,282 @@
     {
         return ( ServerEntry ) clonedEntry.clone();
     }
+    
+    
+    public String toString()
+    {
+        return clonedEntry.toString();
+    }
+    
+    
+    class EmptyEntry implements ServerEntry
+    {
+        LdapDN dn;
+        
+        EmptyEntry( LdapDN dn )
+        {
+            this.dn = dn;
+        }
+        
+        public void add( AttributeType attributeType, byte[]... values ) throws NamingException
+        {
+        }
+
+        public void add( AttributeType attributeType, String... values ) throws NamingException
+        {
+        }
+
+        public void add( AttributeType attributeType, Value<?>... values ) throws NamingException
+        {
+        }
+
+        public void add( String upId, AttributeType attributeType, byte[]... values ) throws NamingException
+        {
+        }
+
+        public void add( String upId, AttributeType attributeType, String... values ) throws NamingException
+        {
+        }
+
+        public void add( String upId, AttributeType attributeType, Value<?>... values ) throws NamingException
+        {
+        }
+
+        public boolean contains( AttributeType attributeType, byte[]... values )
+        {
+            return false;
+        }
+
+        public boolean contains( AttributeType attributeType, String... values )
+        {
+            return false;
+        }
+
+        public boolean contains( AttributeType attributeType, Value<?>... values )
+        {
+            return false;
+        }
+
+        public boolean containsAttribute( AttributeType attributeType )
+        {
+            return false;
+        }
+
+        public EntryAttribute get( AttributeType attributeType )
+        {
+            return null;
+        }
+
+        public Set<AttributeType> getAttributeTypes()
+        {
+            return null;
+        }
+
+        public boolean hasObjectClass( EntryAttribute objectClass )
+        {
+            return false;
+        }
+
+        public boolean isValid()
+        {
+            return false;
+        }
+
+        public boolean isValid( String objectClass )
+        {
+            return false;
+        }
+
+        public boolean isValid( EntryAttribute objectClass )
+        {
+            return false;
+        }
+
+        public EntryAttribute put( AttributeType attributeType, byte[]... values ) throws NamingException
+        {
+            return null;
+        }
+
+        public EntryAttribute put( AttributeType attributeType, String... values ) throws NamingException
+        {
+            return null;
+        }
+
+        public EntryAttribute put( AttributeType attributeType, Value<?>... values ) throws NamingException
+        {
+            return null;
+        }
+
+        public EntryAttribute put( String upId, AttributeType attributeType, byte[]... values ) throws NamingException
+        {
+            return null;
+        }
+
+        public EntryAttribute put( String upId, AttributeType attributeType, String... values ) throws NamingException
+        {
+            return null;
+        }
+
+        public EntryAttribute put( String upId, AttributeType attributeType, Value<?>... values )
+            throws NamingException
+        {
+            return null;
+        }
+
+        public boolean remove( AttributeType attributeType, byte[]... values ) throws NamingException
+        {
+            return false;
+        }
+
+        public boolean remove( AttributeType attributeType, String... values ) throws NamingException
+        {
+            return false;
+        }
+
+        public boolean remove( AttributeType attributeType, Value<?>... values ) throws NamingException
+        {
+            return false;
+        }
+
+        public List<EntryAttribute> remove( EntryAttribute... attributes ) throws NamingException
+        {
+            return Collections.emptyList();
+        }
+
+        public List<EntryAttribute> removeAttributes( AttributeType... attributes )
+        {
+            return Collections.emptyList();
+        }
+
+        public List<EntryAttribute> set( AttributeType... attributeTypes )
+        {
+            return Collections.emptyList();
+        }
+
+        public void add( EntryAttribute... attributes ) throws NamingException
+        {
+        }
+
+        public void add( String upId, String... values ) throws NamingException
+        {
+        }
+
+        public void add( String upId, byte[]... values ) throws NamingException
+        {
+        }
+
+        public void add( String upId, Value<?>... values ) throws NamingException
+        {
+        }
+
+        public void clear()
+        {
+        }
+
+        public boolean contains( EntryAttribute... attributes ) throws NamingException
+        {
+            return false;
+        }
+
+        public boolean contains( String upId, byte[]... values )
+        {
+            return false;
+        }
+
+        public boolean contains( String upId, String... values )
+        {
+            return false;
+        }
+
+        public boolean contains( String upId, Value<?>... values )
+        {
+            return false;
+        }
+
+        public boolean containsAttribute( String... attributes )
+        {
+            return false;
+        }
+
+        public EntryAttribute get( String alias )
+        {
+            return null;
+        }
+
+        public LdapDN getDn()
+        {
+            return null;
+        }
+
+        public boolean hasObjectClass( String objectClass )
+        {
+            return false;
+        }
+
+        @SuppressWarnings("unchecked")
+        public Iterator<EntryAttribute> iterator()
+        {
+            return ( ( List <EntryAttribute> ) Collections.EMPTY_LIST ).iterator();
+        }
+
+        public List<EntryAttribute> put( EntryAttribute... attributes ) throws NamingException
+        {
+            return Collections.emptyList();
+        }
+
+        public EntryAttribute put( String upId, byte[]... values )
+        {
+            return null;
+        }
+
+        public EntryAttribute put( String upId, String... values )
+        {
+            return null;
+        }
+
+        public EntryAttribute put( String upId, Value<?>... values )
+        {
+            return null;
+        }
+
+        public boolean remove( String upId, byte[]... values ) throws NamingException
+        {
+            return false;
+        }
+
+        public boolean remove( String upId, String... values ) throws NamingException
+        {
+            return false;
+        }
+
+        public boolean remove( String upId, Value<?>... values ) throws NamingException
+        {
+            return false;
+        }
+
+        public List<EntryAttribute> removeAttributes( String... attributes )
+        {
+            return Collections.emptyList();
+        }
+
+        public List<EntryAttribute> set( String... upIds )
+        {
+            return Collections.emptyList();
+        }
+
+        public void setDn( LdapDN dn )
+        {
+            this.dn = dn;
+        }
+
+        public int size()
+        {
+            return 0;
+        }
+    
+        public ServerEntry clone()
+        {
+            return new EmptyEntry( dn );
+        }
+    }
 }

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/event/EventInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/event/EventInterceptor.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/event/EventInterceptor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/event/EventInterceptor.java Sat May 24 01:45:24 2008
@@ -56,6 +56,7 @@
 import org.apache.directory.shared.ldap.filter.LeafNode;
 import org.apache.directory.shared.ldap.filter.NotNode;
 import org.apache.directory.shared.ldap.filter.ScopeNode;
+import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.shared.ldap.name.NameComponentNormalizer;
@@ -165,7 +166,7 @@
         }
 
         ScopeNode scope = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES, normalizedBaseDn.toNormName(),
-            searchControls.getSearchScope() );
+            SearchScope.getSearchScope( searchControls ) );
 
         if ( filter != null )
         {

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/event/ScopeEvaluator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/event/ScopeEvaluator.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/event/ScopeEvaluator.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/event/ScopeEvaluator.java Sat May 24 01:45:24 2008
@@ -51,10 +51,10 @@
 
         switch ( snode.getScope() )
         {
-            case ( SearchControls.OBJECT_SCOPE  ):
+            case OBJECT:
                 return dn.equals( snode.getBaseDn() );
             
-            case ( SearchControls.ONELEVEL_SCOPE  ):
+            case ONELEVEL:
                 if ( dn.endsWith( snode.getBaseDn() ) )
                 {
                     LdapDN candidateDn = new LdapDN( dn );
@@ -62,7 +62,7 @@
                     return ( scopeDn.size() + 1 ) == candidateDn.size();
                 }
             
-            case ( SearchControls.SUBTREE_SCOPE  ):
+            case SUBTREE:
                 return dn.endsWith( snode.getBaseDn() );
             
             default:

Modified: 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=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilteringCursor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/filtering/EntryFilteringCursor.java Sat May 24 01:45:24 2008
@@ -32,6 +32,8 @@
 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.apache.directory.shared.ldap.schema.AttributeType;
+import org.apache.directory.shared.ldap.schema.UsageEnum;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -62,9 +64,6 @@
     
     /** the first accepted search result that is pre fetched */
     private ClonedServerEntry prefetched;
-    
-    /** whether or not this search has been abandoned */
-    private boolean abandoned = false;
 
     
     // ------------------------------------------------------------------------
@@ -122,7 +121,7 @@
         this.filters = new ArrayList<EntryFilter>();
         this.filters.addAll( filters );
     }
-
+    
     
     // ------------------------------------------------------------------------
     // Class Specific Methods
@@ -136,7 +135,7 @@
      */
     public boolean isAbandoned()
     {
-        return abandoned;
+        return getOperationContext().isAbandoned();
     }
     
     
@@ -147,7 +146,7 @@
      */
     public void setAbandoned( boolean abandoned )
     {
-        this.abandoned = abandoned;
+        getOperationContext().setAbandoned( abandoned );
         
         if ( abandoned )
         {
@@ -269,7 +268,7 @@
      */
     public boolean first() throws Exception
     {
-        if ( abandoned )
+        if ( getOperationContext().isAbandoned() )
         {
             log.info( "Cursor has been abandoned." );
             close();
@@ -318,7 +317,7 @@
      */
     public boolean last() throws Exception
     {
-        if ( abandoned )
+        if ( getOperationContext().isAbandoned() )
         {
             log.info( "Cursor has been abandoned." );
             close();
@@ -328,14 +327,73 @@
         afterLast();
         return previous();
     }
+    
+    
+    private void filterContents( ClonedServerEntry entry ) throws Exception
+    {
+        boolean returnAll = getOperationContext().getReturningAttributes() == null ||
+            ( getOperationContext().isAllOperationalAttributes() && getOperationContext().isAllUserAttributes() );
+        
+        if ( returnAll )
+        {
+            return;
+        }
+        
+        if ( getOperationContext().isAllUserAttributes() )
+        {
+            for ( AttributeType at : entry.getOriginalEntry().getAttributeTypes() )
+            {
+                boolean isNotRequested = ! getOperationContext().getReturningAttributes().contains( at );
+                boolean isNotUserAttribute = at.getUsage() != UsageEnum.USER_APPLICATIONS;
+                
+                if (  isNotRequested && isNotUserAttribute )
+                {
+                    entry.removeAttributes( at );
+                }
+            }
+            
+            return;
+        }
+        
+        if ( getOperationContext().isAllOperationalAttributes() )
+        {
+            for ( AttributeType at : entry.getOriginalEntry().getAttributeTypes() )
+            {
+                boolean isNotRequested = ! getOperationContext().getReturningAttributes().contains( at );
+                boolean isUserAttribute = at.getUsage() == UsageEnum.USER_APPLICATIONS;
+                
+                if ( isNotRequested && isUserAttribute )
+                {
+                    entry.removeAttributes( at );
+                }
+            }
+            
+            return;
+        }
 
+        if ( getOperationContext().isNoAttributes() )
+        {
+            for ( AttributeType at : entry.getOriginalEntry().getAttributeTypes() )
+            {
+                boolean isNotRequested = ! getOperationContext().getReturningAttributes().contains( at );
 
+                if ( isNotRequested )
+                {
+                    entry.removeAttributes( at );
+                }
+            }
+            
+            return;
+        }
+    }
+    
+    
     /* 
      * @see Cursor#next()
      */
     public boolean next() throws Exception
     {
-        if ( abandoned )
+        if ( getOperationContext().isAbandoned() )
         {
             log.info( "Cursor has been abandoned." );
             close();
@@ -368,14 +426,16 @@
             if ( filters.isEmpty() )
             {
                 prefetched = tempResult;
+                filterContents( prefetched );
                 return true;
             }
             
             if ( filters.size() == 1 )
             {
-                if ( filters.get( 0 ).accept( operationContext, tempResult ) )
+                if ( filters.get( 0 ).accept( getOperationContext(), tempResult ) )
                 {
                     prefetched = tempResult;
+                    filterContents( prefetched );
                     return true;
                 }
             }
@@ -385,7 +445,7 @@
             for ( EntryFilter filter : filters )
             {
                 // if a filter rejects then short and continue with outer loop
-                if ( ! ( accepted &= filter.accept( operationContext, tempResult ) ) )
+                if ( ! ( accepted &= filter.accept( getOperationContext(), tempResult ) ) )
                 {
                     continue outer;
                 }
@@ -394,8 +454,8 @@
             /*
              * Here the entry has been accepted by all filters.
              */
-            
             prefetched = tempResult;
+            filterContents( prefetched );
             return true;
         }
         
@@ -409,7 +469,7 @@
      */
     public boolean previous() throws Exception
     {
-        if ( abandoned )
+        if ( getOperationContext().isAbandoned() )
         {
             log.info( "Cursor has been abandoned." );
             close();
@@ -433,14 +493,16 @@
             if ( filters.isEmpty() )
             {
                 prefetched = tempResult;
+                filterContents( prefetched );
                 return true;
             }
             
             if ( filters.size() == 1 )
             {
-                if ( filters.get( 0 ).accept( operationContext, tempResult ) )
+                if ( filters.get( 0 ).accept( getOperationContext(), tempResult ) )
                 {
                     prefetched = tempResult;
+                    filterContents( prefetched );
                     return true;
                 }
             }
@@ -450,7 +512,7 @@
             for ( EntryFilter filter : filters )
             {
                 // if a filter rejects then short and continue with outer loop
-                if ( ! ( accepted &= filter.accept( operationContext, tempResult ) ) )
+                if ( ! ( accepted &= filter.accept( getOperationContext(), tempResult ) ) )
                 {
                     continue outer;
                 }
@@ -459,8 +521,8 @@
             /*
              * Here the entry has been accepted by all filters.
              */
-            
             prefetched = tempResult;
+            filterContents( prefetched );
             return true;
         }
         

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=659774&r1=659773&r2=659774&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 Sat May 24 01:45:24 2008
@@ -20,14 +20,16 @@
 package org.apache.directory.server.core.interceptor.context;
 
 
+import javax.naming.NamingException;
+import javax.naming.directory.SearchControls;
+
 import org.apache.directory.server.schema.registries.Registries;
 import org.apache.directory.shared.ldap.filter.ExprNode;
+import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.message.MessageTypeEnum;
 import org.apache.directory.shared.ldap.name.LdapDN;
 
-import javax.naming.directory.SearchControls;
-
 
 /**
  * A Search context used for Interceptors. It contains all the informations
@@ -57,9 +59,10 @@
      * @param dn the dn of the search base
      * @param filter the filter AST to use for the search
      * @param searchControls the search controls
+     * @throws NamingException 
      */
     public SearchOperationContext( Registries registries, LdapDN dn, AliasDerefMode aliasDerefMode, ExprNode filter,
-                                   SearchControls searchControls )
+                                   SearchControls searchControls ) throws NamingException
     {
         super( registries, dn, aliasDerefMode, searchControls );
         this.filter = filter;

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/SearchingOperationContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/SearchingOperationContext.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/SearchingOperationContext.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/SearchingOperationContext.java Sat May 24 01:45:24 2008
@@ -20,11 +20,21 @@
 package org.apache.directory.server.core.interceptor.context;
 
 
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.naming.NamingException;
 import javax.naming.directory.SearchControls;
 
 import org.apache.directory.server.schema.registries.Registries;
+import org.apache.directory.shared.ldap.constants.SchemaConstants;
+import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.schema.AttributeType;
+import org.apache.directory.shared.ldap.util.ArrayUtils;
+
+import static org.apache.directory.shared.ldap.filter.SearchScope.ONELEVEL;
 
 
 /**
@@ -38,9 +48,22 @@
 {
     private AliasDerefMode aliasDerefMode = AliasDerefMode.DEREF_ALWAYS;
 
-    /** The controls */
-    protected SearchControls searchControls = new SearchControls();
+    private long sizeLimit = 0;
+    
+    private int timeLimit = 0;
+    
+    private SearchScope scope = ONELEVEL;
 
+    private boolean allOperationalAttributes = false;
+    
+    private boolean allUserAttributes = false;
+    
+    private boolean noAttributes = false;
+    
+    private Set<AttributeType> returningAttributes; 
+    
+    private boolean abandoned = false;
+    
     
     /**
      * Creates a new instance of ListOperationContext.
@@ -80,16 +103,48 @@
      *
      * @param dn The DN to get the suffix from
      * @param aliasDerefMode the alias dereferencing mode to use
+     * @throws NamingException 
      */
     public SearchingOperationContext( Registries registries, LdapDN dn, AliasDerefMode aliasDerefMode, 
-        SearchControls searchControls )
+        SearchControls searchControls ) throws NamingException
     {
         super( registries, dn );
         this.aliasDerefMode = aliasDerefMode;
-        this.searchControls = searchControls;
+        this.scope = SearchScope.getSearchScope( searchControls );
+        this.timeLimit = searchControls.getTimeLimit();
+        this.sizeLimit = searchControls.getCountLimit();
+        
+        if ( searchControls.getReturningAttributes() != null )
+        {
+            returningAttributes = new HashSet<AttributeType>();
+            for ( String returnAttribute : searchControls.getReturningAttributes() )
+            {
+                if ( returnAttribute.equals( SchemaConstants.NO_ATTRIBUTE ) )
+                {
+                    noAttributes = true;
+                    continue;
+                }
+                
+                if ( returnAttribute.equals( SchemaConstants.ALL_OPERATIONAL_ATTRIBUTES ) )
+                {
+                    allOperationalAttributes = true;
+                    continue;
+                }
+                
+                if ( returnAttribute.equals( SchemaConstants.ALL_USER_ATTRIBUTES ) )
+                {
+                    allUserAttributes = true;
+                    continue;
+                }
+                
+                returningAttributes.add( registries.getAttributeTypeRegistry().lookup( returnAttribute ) );
+            }
+        }
     }
 
     
+    
+    
     /**
      * @see Object#toString()
      */
@@ -98,29 +153,216 @@
         return "ListOperationContext with DN '" + getDn().getUpName() + "'";
     }
 
+    
+    public AliasDerefMode getAliasDerefMode()
+    {
+        return aliasDerefMode;
+    }
+
 
     /**
-     *  @return The search controls
+     * @param sizeLimit the sizeLimit to set
      */
-    public SearchControls getSearchControls()
+    public void setSizeLimit( long sizeLimit )
     {
-        return searchControls;
+        this.sizeLimit = sizeLimit;
     }
 
 
     /**
-     * Set the search controls
-     *
-     * @param searchControls The search controls
+     * @return the sizeLimit
+     */
+    public long getSizeLimit()
+    {
+        return sizeLimit;
+    }
+
+
+    /**
+     * @param timeLimit the timeLimit to set
+     */
+    public void setTimeLimit( int timeLimit )
+    {
+        this.timeLimit = timeLimit;
+    }
+
+
+    /**
+     * @return the timeLimit
+     */
+    public int getTimeLimit()
+    {
+        return timeLimit;
+    }
+
+
+    /**
+     * @param scope the scope to set
+     */
+    public void setScope( SearchScope scope )
+    {
+        this.scope = scope;
+    }
+
+
+    /**
+     * @return the scope
+     */
+    public SearchScope getScope()
+    {
+        return scope;
+    }
+
+
+    /**
+     * @param allOperationalAttributes the allOperationalAttributes to set
+     */
+    public void setAllOperationalAttributes( boolean allOperationalAttribute )
+    {
+        this.allOperationalAttributes = allOperationalAttribute;
+    }
+
+
+    /**
+     * @return the allOperationalAttributes
+     */
+    public boolean isAllOperationalAttributes()
+    {
+        return allOperationalAttributes;
+    }
+
+
+    /**
+     * @param allUserAttributes the allUserAttributes to set
+     */
+    public void setAllUserAttributes( boolean allUserAttributes )
+    {
+        this.allUserAttributes = allUserAttributes;
+    }
+
+
+    /**
+     * @return the allUserAttributes
+     */
+    public boolean isAllUserAttributes()
+    {
+        return allUserAttributes;
+    }
+
+
+    /**
+     * @param noAttributes the noAttributes to set
+     */
+    public void setNoAttributes( boolean noAttributes )
+    {
+        this.noAttributes = noAttributes;
+    }
+
+
+    /**
+     * @return the noAttributes
+     */
+    public boolean isNoAttributes()
+    {
+        return noAttributes;
+    }
+
+
+    /**
+     * @param returningAttributes the returningAttributes to set
+     */
+    public void setReturningAttributes( Set<AttributeType> returningAttributes )
+    {
+        this.returningAttributes = returningAttributes;
+    }
+
+
+    /**
+     * @return the returningAttributes
      */
-    public void setSearchControls( SearchControls searchControls )
+    public Set<AttributeType> getReturningAttributes()
     {
-        this.searchControls = searchControls;
+        return returningAttributes;
     }
 
     
-    public AliasDerefMode getAliasDerefMode()
+    /**
+     * Creates a new SearchControls object populated with the parameters 
+     * contained in this SearchOperationContext in normalized form.
+     *
+     * @return a new SearchControls object
+     */
+    public SearchControls getSearchControls()
     {
-        return aliasDerefMode;
+        return getSearchControls( false );
+    }
+    
+    
+    /**
+     * Creates a new SearchControls object populated with the parameters 
+     * contained in this SearchOperationContext.
+     *
+     * @param denormalized true if attribute values are <b>not</b> normalized
+     * @return a new SearchControls object
+     */
+    public SearchControls getSearchControls( boolean denormalized )
+    {
+        SearchControls controls = new SearchControls();
+        controls.setCountLimit( sizeLimit );
+        controls.setSearchScope( scope.getJndiScope() );
+        controls.setTimeLimit( timeLimit );
+
+        Set<String> allReturningAttributes = new HashSet<String>();
+        
+        if ( noAttributes )
+        {
+            allReturningAttributes.add( SchemaConstants.NO_ATTRIBUTE );
+        }
+        
+        if ( allUserAttributes )
+        {
+            allReturningAttributes.add( SchemaConstants.ALL_USER_ATTRIBUTES );
+        }
+        
+        if ( allOperationalAttributes )
+        {
+            allReturningAttributes.add( SchemaConstants.ALL_OPERATIONAL_ATTRIBUTES );
+        }
+        
+        if ( returningAttributes != null )
+        {
+            for ( AttributeType at : returningAttributes )
+            {
+                if ( denormalized )
+                {
+                    allReturningAttributes.add( at.getName() );
+                }
+                else
+                {
+                    allReturningAttributes.add( at.getOid() );
+                }
+            }
+        }
+        
+        controls.setReturningAttributes( allReturningAttributes.toArray( ArrayUtils.EMPTY_STRING_ARRAY ) );
+        return controls;
+    }
+
+
+    /**
+     * @param abandoned the abandoned to set
+     */
+    public void setAbandoned( boolean abandoned )
+    {
+        this.abandoned = abandoned;
+    }
+
+
+    /**
+     * @return the abandoned
+     */
+    public boolean isAbandoned()
+    {
+        return abandoned;
     }
 }

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/jndi/NamingEnumerationAdapter.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/jndi/NamingEnumerationAdapter.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/jndi/NamingEnumerationAdapter.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/jndi/NamingEnumerationAdapter.java Sat May 24 01:45:24 2008
@@ -118,7 +118,6 @@
         
         SearchResult result = new SearchResult( entry.getDn().getUpName(), null, ServerEntryUtils.toAttributesImpl( entry ) );
         result.setRelative( false );
-        
         return result;
     }
 
@@ -137,26 +136,13 @@
      */
     public SearchResult nextElement()
     {
-        ClonedServerEntry entry = null;
-        
         try
         {
-            entry = cursor.get();
-            if ( available = cursor.next() )
-            {
-                cursor.close();
-            }
+            return next();
         }
-        catch ( Exception e )
+        catch ( NamingException e )
         {
-            NoSuchElementException nsee = new NoSuchElementException( e.getMessage() );
-            nsee.initCause( e );
-            throw nsee;
+            throw new NoSuchElementException( e.getMessage() );
         }
-        
-        SearchResult result = new SearchResult( entry.getDn().getUpName(), null, ServerEntryUtils.toAttributesImpl( entry ) );
-        result.setRelative( false );
-        
-        return result;
     }
 }

Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/PartitionNexusProxy.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/PartitionNexusProxy.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/PartitionNexusProxy.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/partition/PartitionNexusProxy.java Sat May 24 01:45:24 2008
@@ -510,42 +510,41 @@
         EntryFilteringCursor cursor = search( opContext, null );
         final SearchControls searchCtls = opContext.getSearchControls();
 
-            if ( searchCtls.getTimeLimit() + searchCtls.getCountLimit() > 0 )
+        if ( searchCtls.getTimeLimit() + searchCtls.getCountLimit() > 0 )
+        {
+            // this will be the last filter added so other filters before it must
+            // have passed/approved of the entry to be returned back to the client
+            // so the candidate we have is going to be returned for sure
+            cursor.addEntryFilter( new EntryFilter()
             {
-                // this will be the last filter added so other filters before it must
-                // have passed/approved of the entry to be returned back to the client
-                // so the candidate we have is going to be returned for sure
-                cursor.addEntryFilter( new EntryFilter()
-                {
-                    final long startTime = System.currentTimeMillis();
-                    int count = 1; // with prefetch we've missed one which is ok since 1 is the minimum
-
+                final long startTime = System.currentTimeMillis();
+                int count = 0; // with prefetch we've missed one which is ok since 1 is the minimum
 
-                    public boolean accept( SearchingOperationContext operation, ClonedServerEntry entry )
-                            throws Exception
+                public boolean accept( SearchingOperationContext operation, ClonedServerEntry entry )
+                        throws Exception
+                {
+                    if ( searchCtls.getTimeLimit() > 0 )
                     {
-                        if ( searchCtls.getTimeLimit() > 0 )
+                        long runtime = System.currentTimeMillis() - startTime;
+                        if ( runtime > searchCtls.getTimeLimit() )
                         {
-                            long runtime = System.currentTimeMillis() - startTime;
-                            if ( runtime > searchCtls.getTimeLimit() )
-                            {
-                                throw new LdapTimeLimitExceededException();
-                            }
+                            throw new LdapTimeLimitExceededException();
                         }
+                    }
 
-                        if ( searchCtls.getCountLimit() > 0 )
+                    if ( searchCtls.getCountLimit() > 0 )
+                    {
+                        if ( count > searchCtls.getCountLimit() )
                         {
-                            if ( count > searchCtls.getCountLimit() )
-                            {
-                                throw new LdapSizeLimitExceededException();
-                            }
+                            throw new LdapSizeLimitExceededException();
                         }
-
-                        count++;
-                        return true;
                     }
-                } );
-            }
+
+                    count++;
+                    return true;
+                }
+            } );
+        }
 
         return cursor;
     }

Modified: directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/CursorBuilder.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/CursorBuilder.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/CursorBuilder.java (original)
+++ directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/CursorBuilder.java Sat May 24 01:45:24 2008
@@ -23,8 +23,6 @@
 import java.util.List;
 import java.util.ArrayList;
 
-import javax.naming.directory.SearchControls;
-
 import org.apache.directory.server.xdbm.Store;
 import org.apache.directory.server.xdbm.IndexCursor;
 import org.apache.directory.server.xdbm.search.Evaluator;
@@ -78,7 +76,7 @@
             case PRESENCE:
                 return new PresenceCursor( db, ( PresenceEvaluator ) evaluatorBuilder.build( node ) );
             case SCOPE:
-                if ( ( ( ScopeNode ) node ).getScope() == SearchControls.ONELEVEL_SCOPE )
+                if ( ( ( ScopeNode ) node ).getScope() == SearchScope.ONELEVEL )
                 {
                     return new OneLevelScopeCursor( db, ( OneLevelScopeEvaluator ) evaluatorBuilder.build( node ) );
                 }

Modified: directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultOptimizer.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultOptimizer.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultOptimizer.java (original)
+++ directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultOptimizer.java Sat May 24 01:45:24 2008
@@ -22,8 +22,6 @@
 
 import java.util.List;
 
-import javax.naming.directory.SearchControls;
-
 import org.apache.directory.shared.ldap.filter.AndNode;
 import org.apache.directory.shared.ldap.filter.ApproximateNode;
 import org.apache.directory.shared.ldap.filter.AssertionNode;
@@ -341,14 +339,14 @@
     {
         switch ( node.getScope() )
         {
-            case ( SearchControls.OBJECT_SCOPE  ):
+            case OBJECT:
                 return 1L;
             
-            case ( SearchControls.ONELEVEL_SCOPE  ):
+            case ONELEVEL:
                 Long id = db.getEntryId( node.getBaseDn() );
                 return db.getChildCount( id );
                 
-            case ( SearchControls.SUBTREE_SCOPE  ):
+            case SUBTREE:
                 return db.count();
             
             default:

Modified: directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultSearchEngine.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultSearchEngine.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultSearchEngine.java (original)
+++ directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultSearchEngine.java Sat May 24 01:45:24 2008
@@ -26,6 +26,7 @@
 import org.apache.directory.shared.ldap.filter.BranchNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
 import org.apache.directory.shared.ldap.filter.ScopeNode;
+import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.server.xdbm.*;
@@ -124,7 +125,8 @@
         
         // Add the scope node using the effective base to the filter
         BranchNode root = new AndNode();
-        ExprNode node = new ScopeNode( aliasDerefMode, effectiveBase.toString(), searchCtls.getSearchScope() );
+        ExprNode node = new ScopeNode( aliasDerefMode, effectiveBase.toString(), 
+            SearchScope.getSearchScope( searchCtls ) );
         root.getChildren().add( node );
         root.getChildren().add( filter );
 

Modified: directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/EvaluatorBuilder.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/EvaluatorBuilder.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/EvaluatorBuilder.java (original)
+++ directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/EvaluatorBuilder.java Sat May 24 01:45:24 2008
@@ -20,8 +20,6 @@
 package org.apache.directory.server.xdbm.search.impl;
 
 
-import javax.naming.directory.SearchControls;
-
 import org.apache.directory.server.schema.registries.Registries;
 import org.apache.directory.server.xdbm.Store;
 import org.apache.directory.server.xdbm.search.Evaluator;
@@ -77,7 +75,7 @@
             case PRESENCE:
                 return new PresenceEvaluator( ( PresenceNode ) node, db, registries );
             case SCOPE:
-                if ( ( ( ScopeNode ) node ).getScope() == SearchControls.ONELEVEL_SCOPE )
+                if ( ( ( ScopeNode ) node ).getScope() == SearchScope.ONELEVEL )
                 {
                     return new OneLevelScopeEvaluator<ServerEntry>( db, ( ScopeNode ) node );
                 }

Modified: directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/OneLevelScopeEvaluator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/OneLevelScopeEvaluator.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/OneLevelScopeEvaluator.java (original)
+++ directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/OneLevelScopeEvaluator.java Sat May 24 01:45:24 2008
@@ -20,9 +20,8 @@
 package org.apache.directory.server.xdbm.search.impl;
 
 
-import javax.naming.directory.SearchControls;
-
 import org.apache.directory.shared.ldap.filter.ScopeNode;
+import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.server.xdbm.IndexEntry;
 import org.apache.directory.server.xdbm.Store;
 import org.apache.directory.server.xdbm.search.Evaluator;
@@ -60,7 +59,7 @@
     {
         this.node = node;
 
-        if ( node.getScope() != SearchControls.ONELEVEL_SCOPE )
+        if ( node.getScope() != SearchScope.ONELEVEL )
         {
             throw new IllegalStateException( "ScopeNode is not of onelevel scope." );
         }

Modified: directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubtreeScopeEvaluator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubtreeScopeEvaluator.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubtreeScopeEvaluator.java (original)
+++ directory/apacheds/branches/bigbang/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubtreeScopeEvaluator.java Sat May 24 01:45:24 2008
@@ -21,12 +21,11 @@
 
 
 import org.apache.directory.shared.ldap.filter.ScopeNode;
+import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.server.xdbm.IndexEntry;
 import org.apache.directory.server.xdbm.Store;
 import org.apache.directory.server.xdbm.search.Evaluator;
 
-import javax.naming.directory.SearchControls;
-
 
 /**
  * Evaluates ScopeNode assertions with subtree scope on candidates using an
@@ -74,7 +73,7 @@
         this.db = db;
         this.node = node;
 
-        if ( node.getScope() != SearchControls.SUBTREE_SCOPE )
+        if ( node.getScope() != SearchScope.SUBTREE )
         {
             throw new IllegalStateException( "ScopeNode is not of subtree scope." );
         }

Modified: directory/apacheds/branches/bigbang/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/OneLevelScopeTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/OneLevelScopeTest.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/OneLevelScopeTest.java (original)
+++ directory/apacheds/branches/bigbang/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/OneLevelScopeTest.java Sat May 24 01:45:24 2008
@@ -36,6 +36,7 @@
 import org.apache.directory.server.core.entry.DefaultServerEntry;
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.filter.ScopeNode;
+import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.commons.io.FileUtils;
@@ -47,7 +48,6 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertEquals;
 
-import javax.naming.directory.SearchControls;
 import java.io.File;
 import java.util.Set;
 import java.util.HashSet;
@@ -138,7 +138,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         OneLevelScopeEvaluator<ServerEntry> evaluator = new OneLevelScopeEvaluator<ServerEntry>( store, node );
         OneLevelScopeCursor cursor = new OneLevelScopeCursor( store, evaluator );
 
@@ -285,7 +285,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=engineering," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         OneLevelScopeEvaluator<ServerEntry> evaluator = new OneLevelScopeEvaluator<ServerEntry>( store, node );
         OneLevelScopeCursor cursor = new OneLevelScopeCursor( store, evaluator );
 
@@ -432,7 +432,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.DEREF_IN_SEARCHING,
             SchemaConstants.OU_AT_OID + "=board of directors," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         OneLevelScopeEvaluator<ServerEntry> evaluator = new OneLevelScopeEvaluator<ServerEntry>( store, node );
         OneLevelScopeCursor cursor = new OneLevelScopeCursor( store, evaluator );
 
@@ -558,7 +558,7 @@
         ScopeNode node = new ScopeNode( AliasDerefMode.DEREF_IN_SEARCHING,
             SchemaConstants.OU_AT_OID + "=apache," +
             SchemaConstants.OU_AT_OID + "=board of directors," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         OneLevelScopeEvaluator<ServerEntry> evaluator = new OneLevelScopeEvaluator<ServerEntry>( store, node );
         OneLevelScopeCursor cursor = new OneLevelScopeCursor( store, evaluator );
 
@@ -674,7 +674,7 @@
 
         ScopeNode node = new ScopeNode( AliasDerefMode.DEREF_IN_SEARCHING,
             SchemaConstants.OU_AT_OID + "=board of directors," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         OneLevelScopeEvaluator<ServerEntry> evaluator = new OneLevelScopeEvaluator<ServerEntry>( store, node );
         OneLevelScopeCursor cursor = new OneLevelScopeCursor( store, evaluator );
 
@@ -905,7 +905,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         OneLevelScopeEvaluator<ServerEntry> evaluator = new OneLevelScopeEvaluator<ServerEntry>( store, node );
 
         ForwardIndexEntry<Long,ServerEntry> indexEntry = new ForwardIndexEntry<Long,ServerEntry>();
@@ -919,7 +919,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.DEREF_ALWAYS,
             SchemaConstants.OU_AT_OID + "=engineering," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         OneLevelScopeEvaluator<ServerEntry> evaluator = new OneLevelScopeEvaluator<ServerEntry>( store, node );
         assertEquals( node, evaluator.getExpression() );
 
@@ -951,7 +951,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         OneLevelScopeEvaluator<ServerEntry> evaluator = new OneLevelScopeEvaluator<ServerEntry>( store, node );
         OneLevelScopeCursor cursor = new OneLevelScopeCursor( store, evaluator );
         cursor.get();
@@ -963,7 +963,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         OneLevelScopeEvaluator<ServerEntry> evaluator = new OneLevelScopeEvaluator<ServerEntry>( store, node );
         OneLevelScopeCursor cursor = new OneLevelScopeCursor( store, evaluator );
 
@@ -979,7 +979,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         OneLevelScopeEvaluator<ServerEntry> evaluator = new OneLevelScopeEvaluator<ServerEntry>( store, node );
         OneLevelScopeCursor cursor = new OneLevelScopeCursor( store, evaluator );
 
@@ -995,7 +995,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.SUBTREE_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         new OneLevelScopeEvaluator<ServerEntry>( store, node );
     }
 }
\ No newline at end of file

Modified: directory/apacheds/branches/bigbang/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/SubtreeScopeTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/SubtreeScopeTest.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/SubtreeScopeTest.java (original)
+++ directory/apacheds/branches/bigbang/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/SubtreeScopeTest.java Sat May 24 01:45:24 2008
@@ -36,6 +36,7 @@
 import org.apache.directory.server.core.entry.DefaultServerEntry;
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.filter.ScopeNode;
+import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.commons.io.FileUtils;
@@ -48,7 +49,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
-import javax.naming.directory.SearchControls;
 import java.io.File;
 import java.util.Set;
 import java.util.HashSet;
@@ -139,7 +139,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.SUBTREE_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.SUBTREE);
         SubtreeScopeEvaluator<ServerEntry> evaluator = new SubtreeScopeEvaluator<ServerEntry>( store, node );
         SubtreeScopeCursor cursor = new SubtreeScopeCursor( store, evaluator );
 
@@ -264,7 +264,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.DEREF_IN_SEARCHING,
             SchemaConstants.OU_AT_OID + "=board of directors," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.SUBTREE_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.SUBTREE );
         SubtreeScopeEvaluator<ServerEntry> evaluator = new SubtreeScopeEvaluator<ServerEntry>( store, node );
         SubtreeScopeCursor cursor = new SubtreeScopeCursor( store, evaluator );
 
@@ -414,7 +414,7 @@
         ScopeNode node = new ScopeNode( AliasDerefMode.DEREF_IN_SEARCHING,
             SchemaConstants.OU_AT_OID + "=apache," +
             SchemaConstants.OU_AT_OID + "=board of directors," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.SUBTREE_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.SUBTREE );
         SubtreeScopeEvaluator<ServerEntry> evaluator = new SubtreeScopeEvaluator<ServerEntry>( store, node );
         SubtreeScopeCursor cursor = new SubtreeScopeCursor( store, evaluator );
 
@@ -530,7 +530,7 @@
 
         ScopeNode node = new ScopeNode( AliasDerefMode.DEREF_IN_SEARCHING,
             SchemaConstants.OU_AT_OID + "=board of directors," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.SUBTREE_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.SUBTREE );
         SubtreeScopeEvaluator<ServerEntry> evaluator = new SubtreeScopeEvaluator<ServerEntry>( store, node );
         SubtreeScopeCursor cursor = new SubtreeScopeCursor( store, evaluator );
 
@@ -755,7 +755,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.SUBTREE_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.SUBTREE );
         SubtreeScopeEvaluator<ServerEntry> evaluator = new SubtreeScopeEvaluator<ServerEntry>( store, node );
 
         ForwardIndexEntry<Long,ServerEntry> indexEntry = new ForwardIndexEntry<Long,ServerEntry>();
@@ -769,7 +769,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.DEREF_ALWAYS,
             SchemaConstants.OU_AT_OID + "=engineering," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.SUBTREE_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.SUBTREE );
         SubtreeScopeEvaluator<ServerEntry> evaluator = new SubtreeScopeEvaluator<ServerEntry>( store, node );
         assertEquals( node, evaluator.getExpression() );
 
@@ -796,7 +796,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.SUBTREE_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.SUBTREE );
         SubtreeScopeEvaluator<ServerEntry> evaluator = new SubtreeScopeEvaluator<ServerEntry>( store, node );
         SubtreeScopeCursor cursor = new SubtreeScopeCursor( store, evaluator );
         cursor.get();
@@ -808,7 +808,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.SUBTREE_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.SUBTREE );
         SubtreeScopeEvaluator<ServerEntry> evaluator = new SubtreeScopeEvaluator<ServerEntry>( store, node );
         SubtreeScopeCursor cursor = new SubtreeScopeCursor( store, evaluator );
 
@@ -824,7 +824,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.SUBTREE_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.SUBTREE );
         SubtreeScopeEvaluator<ServerEntry> evaluator = new SubtreeScopeEvaluator<ServerEntry>( store, node );
         SubtreeScopeCursor cursor = new SubtreeScopeCursor( store, evaluator );
 
@@ -840,7 +840,7 @@
     {
         ScopeNode node = new ScopeNode( AliasDerefMode.NEVER_DEREF_ALIASES,
             SchemaConstants.OU_AT_OID + "=sales," +
-            SchemaConstants.O_AT_OID  + "=good times co.", SearchControls.ONELEVEL_SCOPE );
+            SchemaConstants.O_AT_OID  + "=good times co.", SearchScope.ONELEVEL );
         SubtreeScopeEvaluator<ServerEntry> evaluator = new SubtreeScopeEvaluator<ServerEntry>( store, node );
         assertNull( evaluator );
     }

Modified: directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/ScopeNode.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/ScopeNode.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/ScopeNode.java (original)
+++ directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/ScopeNode.java Sat May 24 01:45:24 2008
@@ -20,8 +20,6 @@
 package org.apache.directory.shared.ldap.filter;
 
 
-import javax.naming.directory.SearchControls;
-
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 
 
@@ -35,7 +33,7 @@
 public class ScopeNode extends AbstractExprNode
 {
     /** the scope of this node */
-    private final int scope;
+    private final SearchScope scope;
 
     /** the search base */
     private final String baseDn;
@@ -51,7 +49,7 @@
      * @param baseDn the search base
      * @param scope the search scope
      */
-    public ScopeNode( AliasDerefMode aliasDerefAliases, String baseDn, int scope )
+    public ScopeNode( AliasDerefMode aliasDerefAliases, String baseDn, SearchScope scope )
     {
         super( AssertionType.SCOPE );
         this.scope = scope;
@@ -72,14 +70,11 @@
 
 
     /**
-     * Gets the scope constant for this node.
+     * Gets the search scope.
      * 
-     * @return the scope constant
-     * @see javax.naming.directory.SearchControls#OBJECT_SCOPE
-     * @see javax.naming.directory.SearchControls#ONELEVEL_SCOPE
-     * @see javax.naming.directory.SearchControls#SUBTREE_SCOPE
+     * @return the search scope 
      */
-    public int getScope()
+    public SearchScope getScope()
     {
         return scope;
     }
@@ -143,7 +138,7 @@
         h = h*17 + super.hashCode();
         h = h*17 + ( aliasDerefAliases != null ? aliasDerefAliases.hashCode() : 0 );
         h = h*17 + ( baseDn != null ? baseDn.hashCode() : 0 );
-        h = h*17 + scope;
+        h = h*17 + scope.getJndiScope();
         
         return h;
     }
@@ -160,17 +155,17 @@
 
         switch ( scope )
         {
-            case ( SearchControls.OBJECT_SCOPE  ):
+            case OBJECT:
                 buf.append( "OBJECT_SCOPE" );
 
                 break;
 
-            case ( SearchControls.ONELEVEL_SCOPE  ):
+            case ONELEVEL:
                 buf.append( "ONE_LEVEL_SCOPE" );
 
                 break;
 
-            case ( SearchControls.SUBTREE_SCOPE  ):
+            case SUBTREE:
                 buf.append( "SUBTREE_SCOPE (Estimated)" );
 
                 break;

Added: directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SearchScope.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SearchScope.java?rev=659774&view=auto
==============================================================================
--- directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SearchScope.java (added)
+++ directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SearchScope.java Sat May 24 01:45:24 2008
@@ -0,0 +1,100 @@
+/*
+ *   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.shared.ldap.filter;
+
+import javax.naming.directory.SearchControls;
+
+/**
+ * A search scope enumerated type.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public enum SearchScope
+{
+    OBJECT( SearchControls.OBJECT_SCOPE ), 
+    ONELEVEL( SearchControls.ONELEVEL_SCOPE ), 
+    SUBTREE( SearchControls.SUBTREE_SCOPE );
+    
+    /** 
+     * The corresponding JNDI scope constant value as defined in 
+     * SearchControls.
+     * 
+     * @see javax.naming.directory.SearchControls#OBJECT_SCOPE
+     * @see javax.naming.directory.SearchControls#ONELEVEL_SCOPE
+     * @see javax.naming.directory.SearchControls#SUBTREE_SCOPE
+     */ 
+    private final int jndiScope;
+    
+
+    /**
+     * Creates a new instance of SearchScope based on the respective 
+     * SearchControls scope constant.
+     *
+     * @param jndiScope the JNDI scope constant
+     */
+    private SearchScope( int jndiScope )
+    {
+        this.jndiScope = jndiScope;
+    }
+
+
+    /**
+     * Gets the corresponding JNDI scope constant value as defined in 
+     * SearchControls.
+     * 
+     * @return the jndiScope
+     * @see javax.naming.directory.SearchControls#OBJECT_SCOPE
+     * @see javax.naming.directory.SearchControls#ONELEVEL_SCOPE
+     * @see javax.naming.directory.SearchControls#SUBTREE_SCOPE
+     */
+    public int getJndiScope()
+    {
+        return jndiScope;
+    }
+    
+    
+    /**
+     * Gets the SearchScope enumerated type for the corresponding 
+     * SearchControls scope setting.
+     *
+     * @param searchControls the search controls to get SearchScope for
+     * @return the SearchScope enumerated type for the SearchControls
+     */
+    public static SearchScope getSearchScope( SearchControls searchControls )
+    {
+        SearchScope scope = OBJECT;
+        
+        switch( searchControls.getSearchScope() )
+        {
+            case( SearchControls.OBJECT_SCOPE ): 
+                scope = OBJECT;
+                break;
+            case( SearchControls.ONELEVEL_SCOPE ):
+                scope = ONELEVEL;
+                break;
+            case( SearchControls.SUBTREE_SCOPE ):
+                scope = SUBTREE;
+                break;
+        }
+        
+        return scope;
+    }
+}

Modified: directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SimpleNode.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SimpleNode.java?rev=659774&r1=659773&r2=659774&view=diff
==============================================================================
--- directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SimpleNode.java (original)
+++ directory/shared/branches/bigbang/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SimpleNode.java Sat May 24 01:45:24 2008
@@ -160,7 +160,7 @@
             return false;
         }
 
-        SimpleNode otherNode = ( SimpleNode ) other;
+        SimpleNode<?> otherNode = ( SimpleNode<?> ) other;
 
         if ( value == null )
         {