You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by er...@apache.org on 2007/01/10 02:29:58 UTC

svn commit: r494680 - in /directory/trunks/apacheds: core-unit/src/test/java/org/apache/directory/server/core/collective/ core/src/main/java/org/apache/directory/server/core/collective/ server-unit/src/test/java/org/apache/directory/server/

Author: ersiner
Date: Tue Jan  9 17:29:57 2007
New Revision: 494680

URL: http://svn.apache.org/viewvc?view=rev&rev=494680
Log:
> Fixed DIRSERVER-816.
> Fixed 2-3 bugs more related to Collective Attribute Service.
> Enabled seelman's test cases which were commented out.
> Stuff added with this commit, may be improved for performance.
> A review of the Collective Attribute Service Interceptor might be a useful. I think it can be better organized.

Modified:
    directory/trunks/apacheds/core-unit/src/test/java/org/apache/directory/server/core/collective/CollectiveAttributeServiceITest.java
    directory/trunks/apacheds/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeService.java
    directory/trunks/apacheds/server-unit/src/test/java/org/apache/directory/server/SearchTest.java

Modified: directory/trunks/apacheds/core-unit/src/test/java/org/apache/directory/server/core/collective/CollectiveAttributeServiceITest.java
URL: http://svn.apache.org/viewvc/directory/trunks/apacheds/core-unit/src/test/java/org/apache/directory/server/core/collective/CollectiveAttributeServiceITest.java?view=diff&rev=494680&r1=494679&r2=494680
==============================================================================
--- directory/trunks/apacheds/core-unit/src/test/java/org/apache/directory/server/core/collective/CollectiveAttributeServiceITest.java (original)
+++ directory/trunks/apacheds/core-unit/src/test/java/org/apache/directory/server/core/collective/CollectiveAttributeServiceITest.java Tue Jan  9 17:29:57 2007
@@ -147,22 +147,21 @@
     }
     
     
-//  Testcase for DIRSERVER-816
-//    public Map getAllEntriesCollectiveAttributesOnly() throws NamingException
-//    {
-//        Map resultMap = new HashMap();
-//        SearchControls controls = new SearchControls();
-//        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-//        controls.setReturningAttributes( new String[]
-//                                                    { "c-ou", "c-st" } );
-//        NamingEnumeration results = super.sysRoot.search( "", "(objectClass=*)", controls );
-//        while ( results.hasMore() )
-//        {
-//            SearchResult result = ( SearchResult ) results.next();
-//            resultMap.put( result.getName(), result.getAttributes() );
-//        }
-//        return resultMap;
-//    }
+    public Map getAllEntriesCollectiveAttributesOnly() throws NamingException
+    {
+        Map resultMap = new HashMap();
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+        controls.setReturningAttributes( new String[]
+                                                    { "c-ou", "c-st" } );
+        NamingEnumeration results = super.sysRoot.search( "", "(objectClass=*)", controls );
+        while ( results.hasMore() )
+        {
+            SearchResult result = ( SearchResult ) results.next();
+            resultMap.put( result.getName(), result.getAttributes() );
+        }
+        return resultMap;
+    }
     
 
     public void testLookup() throws Exception
@@ -291,17 +290,16 @@
         assertEquals( "configuration", c_ou.get() );
 
         
-//      Testcase for DIRSERVER-816
-//        // ------------------------------------------------------------------
-//        // test an entry that should show the collective attribute c-ou, 
-//        // but restrict returned attributes to c-ou and c-st
-//        // ------------------------------------------------------------------
-//        
-//        entries = getAllEntriesCollectiveAttributesOnly();
-//        attributes = ( Attributes ) entries.get( "ou=services,ou=configuration,ou=system" );
-//        c_ou = attributes.get( "c-ou" );
-//        assertNotNull( "a collective c-ou attribute should be present", c_ou );
-//        assertEquals( "configuration", c_ou.get() );   
+        // ------------------------------------------------------------------
+        // test an entry that should show the collective attribute c-ou, 
+        // but restrict returned attributes to c-ou and c-st
+        // ------------------------------------------------------------------
+        
+        entries = getAllEntriesCollectiveAttributesOnly();
+        attributes = ( Attributes ) entries.get( "ou=services,ou=configuration,ou=system" );
+        c_ou = attributes.get( "c-ou" );
+        assertNotNull( "a collective c-ou attribute should be present", c_ou );
+        assertEquals( "configuration", c_ou.get() );   
         
         
         // -------------------------------------------------------------------

Modified: directory/trunks/apacheds/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeService.java
URL: http://svn.apache.org/viewvc/directory/trunks/apacheds/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeService.java?view=diff&rev=494680&r1=494679&r2=494680
==============================================================================
--- directory/trunks/apacheds/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeService.java (original)
+++ directory/trunks/apacheds/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeService.java Tue Jan  9 17:29:57 2007
@@ -20,6 +20,19 @@
 package org.apache.directory.server.core.collective;
 
 
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.naming.Name;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+
 import org.apache.directory.server.core.DirectoryServiceConfiguration;
 import org.apache.directory.server.core.configuration.InterceptorConfiguration;
 import org.apache.directory.server.core.enumeration.SearchResultFilter;
@@ -36,18 +49,6 @@
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.shared.ldap.schema.AttributeType;
 
-import javax.naming.NamingException;
-import javax.naming.NamingEnumeration;
-import javax.naming.Name;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.SearchControls;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.SearchResult;
-import java.util.Map;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Collections;
-
 
 /**
  * An interceptor based service dealing with collective attribute
@@ -69,7 +70,10 @@
         public boolean accept( Invocation invocation, SearchResult result, SearchControls controls )
             throws NamingException
         {
-            return filter( result.getAttributes() );
+            LdapDN name = new LdapDN(result.getName());
+            filter( name, result.getAttributes() );
+            searchFilter( name, result.getAttributes(), controls.getReturningAttributes() );
+            return true;
         }
     };
 
@@ -90,18 +94,22 @@
      * by the entry.  All collective attributes that are not exclused are added
      * to the entry from all subentries.
      *
+     * @param name name of the entry being processed
      * @param entry the entry to have the collective attributes injected
      * @throws NamingException if there are problems accessing subentries
      */
-    private void addCollectiveAttributes( Attributes entry ) throws NamingException
+    private void addCollectiveAttributes( Name name, Attributes entry ) throws NamingException
     {
-        Attribute subentries = entry.get( SubentryService.COLLECTIVE_ATTRIBUTE_SUBENTRIES );
+        LdapDN normName = LdapDN.normalize( ( LdapDN ) name, registry.getNormalizerMapping() );
+        Attributes entryWithCAS = nexus.lookup( normName, new String[] { "collectiveAttributeSubentries" } );
+        Attribute subentries = entryWithCAS.get( SubentryService.COLLECTIVE_ATTRIBUTE_SUBENTRIES );
 
         if ( subentries == null )
         {
             return;
         }
-
+        
+        
         /*
          * Before we proceed we need to lookup the exclusions within the
          * entry and build a set of exclusions for rapid lookup.  We use
@@ -186,20 +194,19 @@
     /**
      * Filter that injects collective attributes into the entry.
      *
+     * @param name name of the entry being filtered
      * @param attributes the resultant attributes with added collective attributes
      * @return true always
      */
-    private boolean filter( Attributes attributes ) throws NamingException
+    private boolean filter( Name name, Attributes attributes ) throws NamingException
     {
-        addCollectiveAttributes( attributes );
+        addCollectiveAttributes( name, attributes );
         return true;
     }
 
 
     private void filter( Name dn, Attributes entry, String[] ids ) throws NamingException
     {
-        filter( entry );
-
         // still need to return collective attrs when ids is null
         if ( ids == null )
         {
@@ -233,6 +240,49 @@
         // attributes to include - backends will automatically populate
         // with right set of attributes using ids array
     }
+    
+    private void searchFilter( Name dn, Attributes entry, String[] ids ) throws NamingException
+    {
+        // still need to return collective attrs when ids is null
+        if ( ids == null )
+        {
+            return;
+        }
+        
+        HashSet idsSet = new HashSet( ids.length );
+
+        for ( int ii = 0; ii < ids.length; ii++ )
+        {
+            idsSet.add( ids[ii].toLowerCase() );
+        }
+        
+        if ( idsSet.contains( "*" ) )
+        {
+            return;
+        }
+
+        NamingEnumeration list = entry.getIDs();
+
+        while ( list.hasMore() )
+        {
+            String attrId = ( ( String ) list.nextElement() ).toLowerCase();
+            
+            AttributeType attrType = registry.lookup( attrId );
+            if ( !attrType.isCollective() )
+            {
+                continue;
+            }
+
+            if ( !idsSet.contains( attrId ) )
+            {
+                entry.remove( attrId );
+            }
+        }
+
+        // do nothing past here since this explicity specifies which
+        // attributes to include - backends will automatically populate
+        // with right set of attributes using ids array
+    }
 
 
     // ------------------------------------------------------------------------
@@ -246,7 +296,7 @@
         {
             return null;
         }
-        filter( result );
+        filter( name, result );
         return result;
     }
     
@@ -258,7 +308,7 @@
         {
             return null;
         }
-
+        filter( name, result );
         filter( name, result, attrIds );
         return result;
     }

Modified: directory/trunks/apacheds/server-unit/src/test/java/org/apache/directory/server/SearchTest.java
URL: http://svn.apache.org/viewvc/directory/trunks/apacheds/server-unit/src/test/java/org/apache/directory/server/SearchTest.java?view=diff&rev=494680&r1=494679&r2=494680
==============================================================================
--- directory/trunks/apacheds/server-unit/src/test/java/org/apache/directory/server/SearchTest.java (original)
+++ directory/trunks/apacheds/server-unit/src/test/java/org/apache/directory/server/SearchTest.java Tue Jan  9 17:29:57 2007
@@ -21,7 +21,6 @@
 
 
 import java.util.Arrays;
-import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Set;
@@ -834,56 +833,55 @@
     }
     
     
-//  Testcase for DIRSERVER-816
-//    public void testSearchAttrC_L() throws NamingException
-//    {
-//        // create administrative area
-//        Attributes aaAttrs = new AttributesImpl();
-//        Attribute aaObjectClass = new AttributeImpl( "objectClass" );
-//        aaObjectClass.add( "top" );
-//        aaObjectClass.add( "organizationalUnit" );
-//        aaObjectClass.add( "extensibleObject" );
-//        aaAttrs.put( aaObjectClass );
-//        aaAttrs.put( "ou", "Collective Test" );
-//        aaAttrs.put( "administrativeRole", "collectiveAttributeSpecificArea" );
-//        DirContext aaCtx = ctx.createSubcontext( "ou=Collective Area", aaAttrs );
-//        
-//        // create subentry
-//        Attributes subentry = new AttributesImpl();
-//        Attribute objectClass = new AttributeImpl( "objectClass" );
-//        objectClass.add( "top" );
-//        objectClass.add( "subentry" );
-//        objectClass.add( "collectiveAttributeSubentry" );
-//        subentry.put( objectClass );
-//        subentry.put( "c-l", "Munich" );
-//        subentry.put( "cn", "Collective Subentry" );
-//        subentry.put( "subtreeSpecification", "{ }" );
-//        aaCtx.createSubcontext( "cn=Collective Subentry", subentry );
-//        
-//        // create real enty
-//        Attributes attributes = this.getPersonAttributes( "Bush", "Kate Bush" );
-//        aaCtx.createSubcontext( "cn=Kate Bush", attributes );
-//        
-//        // search
-//        SearchControls controls = new SearchControls();
-//        controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
-//        controls.setReturningAttributes( new String[]{"c-l"} );
-//        
-//        NamingEnumeration res = aaCtx.search( "", "(cn=Kate Bush)", controls );
-//        
-//        assertTrue( res.hasMore() );
-//        
-//        SearchResult result = ( SearchResult ) res.next();
-//        
-//        // ensure that result is not null
-//        assertNotNull( result );
-//        
-//        Attributes attrs = result.getAttributes();
-//        
-//        // ensure the one and only attribute is "c-l"
-//        assertEquals( 1, attrs.size() );
-//        assertNotNull( attrs.get("c-l") );
-//        assertEquals( 1, attrs.get("c-l").size() );
-//        assertEquals( "Munich", (String)attrs.get("c-l").get() );
-//    }
+    public void testSearchAttrC_L() throws NamingException
+    {
+        // create administrative area
+        Attributes aaAttrs = new AttributesImpl();
+        Attribute aaObjectClass = new AttributeImpl( "objectClass" );
+        aaObjectClass.add( "top" );
+        aaObjectClass.add( "organizationalUnit" );
+        aaObjectClass.add( "extensibleObject" );
+        aaAttrs.put( aaObjectClass );
+        aaAttrs.put( "ou", "Collective Area" );
+        aaAttrs.put( "administrativeRole", "collectiveAttributeSpecificArea" );
+        DirContext aaCtx = ctx.createSubcontext( "ou=Collective Area", aaAttrs );
+        
+        // create subentry
+        Attributes subentry = new AttributesImpl();
+        Attribute objectClass = new AttributeImpl( "objectClass" );
+        objectClass.add( "top" );
+        objectClass.add( "subentry" );
+        objectClass.add( "collectiveAttributeSubentry" );
+        subentry.put( objectClass );
+        subentry.put( "c-l", "Munich" );
+        subentry.put( "cn", "Collective Subentry" );
+        subentry.put( "subtreeSpecification", "{ }" );
+        aaCtx.createSubcontext( "cn=Collective Subentry", subentry );
+        
+        // create real enty
+        Attributes attributes = this.getPersonAttributes( "Bush", "Kate Bush" );
+        aaCtx.createSubcontext( "cn=Kate Bush", attributes );
+        
+        // search
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+        controls.setReturningAttributes( new String[]{"c-l" } );
+        
+        NamingEnumeration res = aaCtx.search( "", "(cn=Kate Bush)", controls );
+        
+        assertTrue( res.hasMore() );
+        
+        SearchResult result = ( SearchResult ) res.next();
+        
+        // ensure that result is not null
+        assertNotNull( result );
+        
+        Attributes attrs = result.getAttributes();
+        
+        // ensure the one and only attribute is "c-l"
+        assertEquals( 1, attrs.size() );
+        assertNotNull( attrs.get("c-l") );
+        assertEquals( 1, attrs.get("c-l").size() );
+        assertEquals( "Munich", (String)attrs.get("c-l").get() );
+    }
 }