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 2006/01/07 05:28:55 UTC

svn commit: r366649 - in /directory/trunk: apacheds-core-unit/src/test/java/org/apache/ldap/server/jndi/ apacheds/src/main/java/org/apache/ldap/server/jndi/ apacheds/src/main/java/org/apache/ldap/server/partition/

Author: akarasulu
Date: Fri Jan  6 20:28:48 2006
New Revision: 366649

URL: http://svn.apache.org/viewcvs?rev=366649&view=rev
Log:
completed and passed tests for time and size limit implementation: also fixed bugs in it too

Modified:
    directory/trunk/apacheds-core-unit/src/test/java/org/apache/ldap/server/jndi/SearchContextTest.java
    directory/trunk/apacheds/src/main/java/org/apache/ldap/server/jndi/ServerDirContext.java
    directory/trunk/apacheds/src/main/java/org/apache/ldap/server/partition/DefaultDirectoryPartitionNexus.java
    directory/trunk/apacheds/src/main/java/org/apache/ldap/server/partition/DirectoryPartitionNexusProxy.java

Modified: directory/trunk/apacheds-core-unit/src/test/java/org/apache/ldap/server/jndi/SearchContextTest.java
URL: http://svn.apache.org/viewcvs/directory/trunk/apacheds-core-unit/src/test/java/org/apache/ldap/server/jndi/SearchContextTest.java?rev=366649&r1=366648&r2=366649&view=diff
==============================================================================
--- directory/trunk/apacheds-core-unit/src/test/java/org/apache/ldap/server/jndi/SearchContextTest.java (original)
+++ directory/trunk/apacheds-core-unit/src/test/java/org/apache/ldap/server/jndi/SearchContextTest.java Fri Jan  6 20:28:48 2006
@@ -29,7 +29,12 @@
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
 
+import org.apache.ldap.common.exception.LdapSizeLimitExceededException;
+import org.apache.ldap.common.exception.LdapTimeLimitExceededException;
 import org.apache.ldap.common.message.DerefAliasesEnum;
+import org.apache.ldap.server.enumeration.SearchResultFilter;
+import org.apache.ldap.server.enumeration.SearchResultFilteringEnumeration;
+import org.apache.ldap.server.invocation.Invocation;
 import org.apache.ldap.server.unit.AbstractAdminTestCase;
 
 
@@ -49,111 +54,70 @@
          * create ou=testing00,ou=system
          */
         Attributes attributes = new BasicAttributes( true );
-
         Attribute attribute = new BasicAttribute( "objectClass" );
-
         attribute.add( "top" );
-
         attribute.add( "organizationalUnit" );
-
         attributes.put( attribute );
-
         attributes.put( "ou", "testing00" );
 
         DirContext ctx = sysRoot.createSubcontext( "ou=testing00", attributes );
-
         assertNotNull( ctx );
-
+        
         ctx = ( DirContext ) sysRoot.lookup( "ou=testing00" );
-
         assertNotNull( ctx );
-
         attributes = ctx.getAttributes( "" );
-
         assertNotNull( attributes );
-
         assertEquals( "testing00", attributes.get( "ou" ).get() );
-
         attribute = attributes.get( "objectClass" );
-
         assertNotNull( attribute );
-
         assertTrue( attribute.contains( "top" ) );
-
         assertTrue( attribute.contains( "organizationalUnit" ) );
 
         /*
          * create ou=testing01,ou=system
          */
         attributes = new BasicAttributes( true );
-
         attribute = new BasicAttribute( "objectClass" );
-
         attribute.add( "top" );
-
         attribute.add( "organizationalUnit" );
-
         attributes.put( attribute );
-
         attributes.put( "ou", "testing01" );
 
         ctx = sysRoot.createSubcontext( "ou=testing01", attributes );
-
         assertNotNull( ctx );
 
         ctx = ( DirContext ) sysRoot.lookup( "ou=testing01" );
-
         assertNotNull( ctx );
-
         attributes = ctx.getAttributes( "" );
-
         assertNotNull( attributes );
-
         assertEquals( "testing01", attributes.get( "ou" ).get() );
-
         attribute = attributes.get( "objectClass" );
-
         assertNotNull( attribute );
-
         assertTrue( attribute.contains( "top" ) );
-
         assertTrue( attribute.contains( "organizationalUnit" ) );
 
         /*
          * create ou=testing02,ou=system
          */
         attributes = new BasicAttributes( true );
-
         attribute = new BasicAttribute( "objectClass" );
-
         attribute.add( "top" );
-
         attribute.add( "organizationalUnit" );
-
         attributes.put( attribute );
-
         attributes.put( "ou", "testing02" );
-
         ctx = sysRoot.createSubcontext( "ou=testing02", attributes );
-
         assertNotNull( ctx );
 
         ctx = ( DirContext ) sysRoot.lookup( "ou=testing02" );
-
         assertNotNull( ctx );
 
         attributes = ctx.getAttributes( "" );
-
         assertNotNull( attributes );
-
         assertEquals( "testing02", attributes.get( "ou" ).get() );
 
         attribute = attributes.get( "objectClass" );
-
         assertNotNull( attribute );
-
         assertTrue( attribute.contains( "top" ) );
-
         assertTrue( attribute.contains( "organizationalUnit" ) );
 
         /*
@@ -162,37 +126,25 @@
         ctx = ( DirContext ) sysRoot.lookup( "ou=testing01" );
 
         attributes = new BasicAttributes( true );
-
         attribute = new BasicAttribute( "objectClass" );
-
         attribute.add( "top" );
-
         attribute.add( "organizationalUnit" );
-
         attributes.put( attribute );
-
         attributes.put( "ou", "subtest" );
 
         ctx = ctx.createSubcontext( "ou=subtest", attributes );
-
         assertNotNull( ctx );
 
         ctx = ( DirContext ) sysRoot.lookup( "ou=subtest,ou=testing01" );
-
         assertNotNull( ctx );
 
         attributes = ctx.getAttributes( "" );
-
         assertNotNull( attributes );
-
         assertEquals( "subtest", attributes.get( "ou" ).get() );
 
         attribute = attributes.get( "objectClass" );
-
         assertNotNull( attribute );
-
         assertTrue( attribute.contains( "top" ) );
-
         assertTrue( attribute.contains( "organizationalUnit" ) );
     }
 
@@ -200,30 +152,21 @@
     public void testSearchOneLevel() throws NamingException
     {
         SearchControls controls = new SearchControls();
-
         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
-
         controls.setDerefLinkFlag( false );
-
         sysRoot.addToEnvironment( DerefAliasesEnum.JNDI_PROP, DerefAliasesEnum.NEVERDEREFALIASES.getName() );
-
         HashMap map = new HashMap();
 
         NamingEnumeration list = sysRoot.search( "", "(ou=*)", controls );
-
         while ( list.hasMore() )
         {
             SearchResult result = ( SearchResult ) list.next();
-
             map.put( result.getName(), result.getAttributes() );
         }
 
         assertEquals( "Expected number of results returned was incorrect!", 6, map.size() );
-
         assertTrue( map.containsKey( "ou=testing00,ou=system" ) );
-
         assertTrue( map.containsKey( "ou=testing01,ou=system" ) );
-
         assertTrue( map.containsKey( "ou=testing02,ou=system" ) );
     }
 
@@ -231,63 +174,109 @@
     public void testSearchSubTreeLevel() throws NamingException
     {
         SearchControls controls = new SearchControls();
-
         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-
         controls.setDerefLinkFlag( false );
-
         sysRoot.addToEnvironment( DerefAliasesEnum.JNDI_PROP, DerefAliasesEnum.NEVERDEREFALIASES.getName() );
 
         HashMap map = new HashMap();
-
         NamingEnumeration list = sysRoot.search( "", "(ou=*)", controls );
-
         while ( list.hasMore() )
         {
             SearchResult result = ( SearchResult ) list.next();
-
             map.put( result.getName(), result.getAttributes() );
         }
 
         assertEquals( "Expected number of results returned was incorrect", 12, map.size() );
-
         assertTrue( map.containsKey( "ou=system" ) );
-
         assertTrue( map.containsKey( "ou=testing00,ou=system" ) );
-
         assertTrue( map.containsKey( "ou=testing01,ou=system" ) );
-
         assertTrue( map.containsKey( "ou=testing02,ou=system" ) );
-
         assertTrue( map.containsKey( "ou=subtest,ou=testing01,ou=system" ) );
     }
+
     
     public void testSearchFilterArgs() throws NamingException
     {
         SearchControls controls = new SearchControls();
-
         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
-
         controls.setDerefLinkFlag( false );
-
         sysRoot.addToEnvironment( DerefAliasesEnum.JNDI_PROP, DerefAliasesEnum.NEVERDEREFALIASES.getName() );
-
         HashMap map = new HashMap();
 
         NamingEnumeration list = sysRoot.search( "", "(| (ou={0}) (ou={1}))", new Object[] {"testing00", "testing01"}, controls );
-
         while ( list.hasMore() )
         {
             SearchResult result = ( SearchResult ) list.next();
-
             map.put( result.getName(), result.getAttributes() );
         }
 
         assertEquals( "Expected number of results returned was incorrect!", 2, map.size() );
-
         assertTrue( map.containsKey( "ou=testing00,ou=system" ) );
-
         assertTrue( map.containsKey( "ou=testing01,ou=system" ) );
     }
+    
+    
+    public void testSearchSizeLimit() throws NamingException
+    {
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+        controls.setDerefLinkFlag( false );
+        controls.setCountLimit( 7 );
+        sysRoot.addToEnvironment( DerefAliasesEnum.JNDI_PROP, DerefAliasesEnum.NEVERDEREFALIASES.getName() );
 
+        HashMap map = new HashMap();
+        NamingEnumeration list = sysRoot.search( "", "(ou=*)", controls );
+        
+        try
+        {
+            while ( list.hasMore() )
+            {
+                SearchResult result = ( SearchResult ) list.next();
+                map.put( result.getName(), result.getAttributes() );
+            }
+            fail( "Should not get here due to a SizeLimitExceededException" );
+        }
+        catch( LdapSizeLimitExceededException e ){}
+        assertEquals( "Expected number of results returned was incorrect", 7, map.size() );
+    }
+
+
+    public void testSearchTimeLimit() throws NamingException
+    {
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+        controls.setDerefLinkFlag( false );
+        controls.setTimeLimit( 200 );
+        sysRoot.addToEnvironment( DerefAliasesEnum.JNDI_PROP, DerefAliasesEnum.NEVERDEREFALIASES.getName() );
+
+        HashMap map = new HashMap();
+        NamingEnumeration list = sysRoot.search( "", "(ou=*)", controls );
+        SearchResultFilteringEnumeration srfe = ( SearchResultFilteringEnumeration ) list;
+        srfe.addResultFilter( new SearchResultFilter() {
+            public boolean accept(Invocation invocation, SearchResult result, SearchControls controls) throws NamingException
+            {
+                try
+                {
+                    Thread.sleep( 201 );
+                }
+                catch ( InterruptedException e )
+                {
+                    e.printStackTrace();
+                }
+                return true;
+            }
+        });
+        
+        try
+        {
+            while ( list.hasMore() )
+            {
+                SearchResult result = ( SearchResult ) list.next();
+                map.put( result.getName(), result.getAttributes() );
+            }
+            fail( "Should not get here due to a TimeLimitExceededException" );
+        }
+        catch( LdapTimeLimitExceededException e ){}
+        assertEquals( "Expected number of results returned was incorrect", 1, map.size() );
+    }
 }

Modified: directory/trunk/apacheds/src/main/java/org/apache/ldap/server/jndi/ServerDirContext.java
URL: http://svn.apache.org/viewcvs/directory/trunk/apacheds/src/main/java/org/apache/ldap/server/jndi/ServerDirContext.java?rev=366649&r1=366648&r2=366649&view=diff
==============================================================================
--- directory/trunk/apacheds/src/main/java/org/apache/ldap/server/jndi/ServerDirContext.java (original)
+++ directory/trunk/apacheds/src/main/java/org/apache/ldap/server/jndi/ServerDirContext.java Fri Jan  6 20:28:48 2006
@@ -523,7 +523,6 @@
             if ( attr.size() == 0 )
             {
                 filter.addNode( new PresenceNode( attr.getID() ) );
-
                 continue;
             }
             
@@ -539,7 +538,6 @@
                 if ( val instanceof String )
                 {
                     node = new SimpleNode( attr.getID(), ( String ) val, SimpleNode.EQUALITY );
-
                     filter.addNode( node );
                 }
             }

Modified: directory/trunk/apacheds/src/main/java/org/apache/ldap/server/partition/DefaultDirectoryPartitionNexus.java
URL: http://svn.apache.org/viewcvs/directory/trunk/apacheds/src/main/java/org/apache/ldap/server/partition/DefaultDirectoryPartitionNexus.java?rev=366649&r1=366648&r2=366649&view=diff
==============================================================================
--- directory/trunk/apacheds/src/main/java/org/apache/ldap/server/partition/DefaultDirectoryPartitionNexus.java (original)
+++ directory/trunk/apacheds/src/main/java/org/apache/ldap/server/partition/DefaultDirectoryPartitionNexus.java Fri Jan  6 20:28:48 2006
@@ -633,7 +633,6 @@
         if ( base.size() == 0 )
         {
             boolean isObjectScope = searchCtls.getSearchScope() == SearchControls.OBJECT_SCOPE;
-
             boolean isSearchAll = ( ( PresenceNode ) filter ).getAttribute().equalsIgnoreCase( "objectclass" );
 
             /*
@@ -643,13 +642,11 @@
             if ( filter instanceof PresenceNode && isObjectScope && isSearchAll )
             {
                 Attributes attrs = ( Attributes ) getRootDSE().clone();
-
                 String[] ids = searchCtls.getReturningAttributes();
 
                 if ( ids != null && ids.length > 0 )
                 {
                     boolean doSwap = true;
-
                     Attributes askedFor = new LockableAttributesImpl();
 
                     for ( int ii = 0; ii < ids.length; ii++ )
@@ -657,7 +654,6 @@
                         if ( ids[ii].trim().equals( "*" ) )
                         {
                             doSwap = false;
-
                             break;
                         }
 
@@ -674,7 +670,6 @@
                 }
 
                 SearchResult result = new SearchResult( "", null, attrs, false );
-
                 return new SingletonEnumeration( result );
             }
 
@@ -682,7 +677,6 @@
         }
 
         DirectoryPartition backend = getBackend( base );
-
         return backend.search( base, env, filter, searchCtls );
     }
 

Modified: directory/trunk/apacheds/src/main/java/org/apache/ldap/server/partition/DirectoryPartitionNexusProxy.java
URL: http://svn.apache.org/viewcvs/directory/trunk/apacheds/src/main/java/org/apache/ldap/server/partition/DirectoryPartitionNexusProxy.java?rev=366649&r1=366648&r2=366649&view=diff
==============================================================================
--- directory/trunk/apacheds/src/main/java/org/apache/ldap/server/partition/DirectoryPartitionNexusProxy.java (original)
+++ directory/trunk/apacheds/src/main/java/org/apache/ldap/server/partition/DirectoryPartitionNexusProxy.java Fri Jan  6 20:28:48 2006
@@ -28,14 +28,19 @@
 import javax.naming.directory.ModificationItem;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.DirContext;
+import javax.naming.directory.SearchResult;
 import javax.naming.event.EventContext;
 import javax.naming.event.NamingListener;
 import javax.naming.ldap.LdapContext;
 
+import org.apache.ldap.common.exception.LdapSizeLimitExceededException;
+import org.apache.ldap.common.exception.LdapTimeLimitExceededException;
 import org.apache.ldap.common.filter.ExprNode;
 import org.apache.ldap.server.DirectoryServiceConfiguration;
 import org.apache.ldap.server.DirectoryService;
 import org.apache.ldap.server.configuration.DirectoryPartitionConfiguration;
+import org.apache.ldap.server.enumeration.SearchResultFilter;
+import org.apache.ldap.server.enumeration.SearchResultFilteringEnumeration;
 import org.apache.ldap.server.event.EventService;
 import org.apache.ldap.server.interceptor.InterceptorChain;
 import org.apache.ldap.server.invocation.Invocation;
@@ -112,37 +117,49 @@
         this.configuration = service.getConfiguration();
     }
     
-    public LdapContext getLdapContext() {
+    
+    public LdapContext getLdapContext() 
+    {
         return this.configuration.getPartitionNexus().getLdapContext();
     }
 
+    
     public void init( DirectoryServiceConfiguration factoryCfg, DirectoryPartitionConfiguration cfg )
     {
     }
 
+    
     public void destroy()
     {
     }
 
+    
     public DirectoryPartition getSystemPartition()
     {
         return this.configuration.getPartitionNexus().getSystemPartition();
     }
 
+    
     public Name getSuffix( boolean normalized ) throws NamingException
     {
         return this.configuration.getPartitionNexus().getSuffix( normalized );
     }
 
-    public void sync() throws NamingException {
+    
+    public void sync() throws NamingException 
+    {
         this.service.sync();
     }
 
-    public void close() throws NamingException {
+    
+    public void close() throws NamingException 
+    {
         this.service.shutdown();
     }
 
-    public boolean isInitialized() {
+    
+    public boolean isInitialized() 
+    {
         return this.service.isStarted();
     }
 
@@ -368,7 +385,42 @@
     public NamingEnumeration search( Name base, Map env, ExprNode filter, SearchControls searchCtls )
             throws NamingException
     {
-        return search( base, env, filter, searchCtls, null );
+        SearchResultFilteringEnumeration results = ( SearchResultFilteringEnumeration ) 
+            search( base, env, filter, searchCtls, null );
+        
+        if ( searchCtls.getTimeLimit() + searchCtls.getCountLimit() > 0 )
+        {
+            // this will be he 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
+            results.addResultFilter( new SearchResultFilter(){
+                final long startTime = System.currentTimeMillis();
+                int count = 1;  // with prefetch we've missed one which is ok since 1 is the minimum
+                public boolean accept( Invocation invocation, SearchResult result, SearchControls controls ) throws NamingException
+                {
+                    if ( controls.getTimeLimit() > 0 )
+                    {
+                        long runtime = System.currentTimeMillis() - startTime;
+                        if ( runtime > controls.getTimeLimit() )
+                        {
+                            throw new LdapTimeLimitExceededException();
+                        }
+                    }
+                    
+                    if ( controls.getCountLimit() > 0 )
+                    {
+                       if ( count > controls.getCountLimit() )
+                       {
+                           throw new LdapSizeLimitExceededException();
+                       }
+                    }
+                    
+                    count++;
+                    return true;
+                }
+            });
+        }
+        return results;
     }