You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2011/01/14 18:20:18 UTC

svn commit: r1059081 - in /directory/apacheds/branches/apacheds-AP: core-api/src/main/java/org/apache/directory/server/core/administrative/ core-integ/src/test/java/org/apache/directory/server/core/subtree/ core/src/main/java/org/apache/directory/serve...

Author: elecharny
Date: Fri Jan 14 17:20:18 2011
New Revision: 1059081

URL: http://svn.apache.org/viewvc?rev=1059081&view=rev
Log:
o Added a toString() method to the subentryCache
o Added some test for the AP rename of an IAP
o Partially implemented the IAP rename

Modified:
    directory/apacheds/branches/apacheds-AP/core-api/src/main/java/org/apache/directory/server/core/administrative/SubentryCache.java
    directory/apacheds/branches/apacheds-AP/core-integ/src/test/java/org/apache/directory/server/core/subtree/SubentryRenameOperationIT.java
    directory/apacheds/branches/apacheds-AP/core/src/main/java/org/apache/directory/server/core/subtree/SubentryInterceptor.java

Modified: directory/apacheds/branches/apacheds-AP/core-api/src/main/java/org/apache/directory/server/core/administrative/SubentryCache.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-AP/core-api/src/main/java/org/apache/directory/server/core/administrative/SubentryCache.java?rev=1059081&r1=1059080&r2=1059081&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-AP/core-api/src/main/java/org/apache/directory/server/core/administrative/SubentryCache.java (original)
+++ directory/apacheds/branches/apacheds-AP/core-api/src/main/java/org/apache/directory/server/core/administrative/SubentryCache.java Fri Jan 14 17:20:18 2011
@@ -403,4 +403,37 @@ public class SubentryCache implements It
             unlock();
         }
     }
+    
+    
+    /**
+     * @see Object#toString()
+     */
+    public String toString()
+    {
+        StringBuilder sb = new StringBuilder();
+        
+        sb.append( "Subentry cache :\n" );
+        
+        lockRead();
+        sb.append( "  DN cache :\n" ).append( dnCache ).append( "\n" );
+        
+        sb.append( "  UUID cache :\n" );
+        
+        for ( String uuid : uuidCache.keySet() )
+        {
+            sb.append( uuid ).append( " -> " );
+            
+            for ( Subentry subentry : uuidCache.get( uuid ) )
+            {
+                if ( subentry != null )
+                {
+                    sb.append( subentry );
+                }
+            }
+        }
+        
+        unlock();
+        
+        return sb.toString();
+    }
 }

Modified: directory/apacheds/branches/apacheds-AP/core-integ/src/test/java/org/apache/directory/server/core/subtree/SubentryRenameOperationIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-AP/core-integ/src/test/java/org/apache/directory/server/core/subtree/SubentryRenameOperationIT.java?rev=1059081&r1=1059080&r2=1059081&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-AP/core-integ/src/test/java/org/apache/directory/server/core/subtree/SubentryRenameOperationIT.java (original)
+++ directory/apacheds/branches/apacheds-AP/core-integ/src/test/java/org/apache/directory/server/core/subtree/SubentryRenameOperationIT.java Fri Jan 14 17:20:18 2011
@@ -21,6 +21,7 @@ package org.apache.directory.server.core
 
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -59,7 +60,13 @@ import org.junit.runner.RunWith;
         "objectClass: person",
         "cn: testUser",
         "sn: test User",
-        "userpassword: test"
+        "userpassword: test",
+        "",
+        // An entry used as a root for tests
+        "dn: ou=test,ou=system",
+        "objectClass: top",
+        "objectClass: organizationalUnit",
+        "ou: test"
     })
 public class SubentryRenameOperationIT extends AbstractSubentryUnitTest
 {
@@ -116,6 +123,108 @@ public class SubentryRenameOperationIT e
     }
     
     
+    /**
+     * Test a rename of an IAP. We will use this data structure :
+     * <pre>
+     * ou=test,ou=system
+     *   |
+     *   +-- [ou=SAP]
+     *        |
+     *        +-- <cn=test1> base="ou=europe,ou=IAP2,ou=IAP1", will select europe, france, paris
+     *        |
+     *        +-- ou=IAP1
+     *              |
+     *              +-- <cn=test2> base="ou=france,ou=europe,ou=IAP2" will select france, paris
+     *              |
+     *              +-- ou=IAP2
+     *                    |
+     *                    +-- <cn=test3> base="ou=paris,ou=france,ou=europe" will select paris
+     *                    |
+     *                    +-- ou=europe
+     *                          |
+     *                          +-- ou=france
+     *                                |
+     *                                +-- ou=paris 
+     * </pre>
+     * 
+     * We will rename ou=IAP2, and the cn=test1 or cn=test2 will now select nothing
+     */
+    @Test
+    public void testRenameIAP() throws Exception
+    {
+        // Create the APs
+        createCaSAP( "ou=SAP,ou=test,ou=system" );
+        createCaIAP( "ou=IAP1,ou=SAP,ou=test,ou=system" );
+        createCaIAP( "ou=IAP2,ou=IAP1,ou=SAP,ou=test,ou=system" );
+        
+        // Create the subentries
+        createCaSubentry( "cn=test1,ou=SAP,ou=test,ou=system", "{base \"ou=europe,ou=IAP2,ou=IAP1\"}" );
+        createCaSubentry( "cn=test2,ou=IAP1,ou=SAP,ou=test,ou=system", "{base \"ou=france,ou=europe,ou=IAP2\"}" );
+        createCaSubentry( "cn=test3,ou=IAP2,ou=IAP1,ou=SAP,ou=test,ou=system", "{base \"ou=paris,ou=france,ou=europe\"}" );
+        
+        // Add entries
+        Entry e1 = LdifUtils.createEntry( 
+            "ou=europe,ou=IAP2,ou=IAP1,ou=SAP,ou=test,ou=system", 
+            "ObjectClass: top",
+            "ObjectClass: organizationalUnit", 
+            "ou: europe" );
+        
+        createEntryAdmin( e1 );
+
+        Entry e2 = LdifUtils.createEntry( 
+            "ou=france,ou=europe,ou=IAP2,ou=IAP1,ou=SAP,ou=test,ou=system", 
+            "ObjectClass: top",
+            "ObjectClass: organizationalUnit", 
+            "ou: france" );
+        
+        createEntryAdmin( e2 );
+
+        Entry e3 = LdifUtils.createEntry( 
+            "ou=paris,ou=france,ou=europe,ou=IAP2,ou=IAP1,ou=SAP,ou=test,ou=system", 
+            "ObjectClass: top",
+            "ObjectClass: organizationalUnit", 
+            "ou: paris" );
+        
+        createEntryAdmin( e3 );
+        
+        // Check that the entries are referring the subentries
+        String sapUuid = getEntryUuid( "cn=test1,ou=SAP,ou=test,ou=system" );
+        String iap1Uuid = getEntryUuid( "cn=test2,ou=IAP1,ou=SAP,ou=test,ou=system" );
+        String iap2Uuid = getEntryUuid( "cn=test3,ou=IAP2,ou=IAP1,ou=SAP,ou=test,ou=system" );
+        
+        e1 = adminConnection.lookup( "ou=europe,ou=IAP2,ou=IAP1,ou=SAP,ou=test,ou=system", "+" );
+        e2 = adminConnection.lookup( "ou=france,ou=europe,ou=IAP2,ou=IAP1,ou=SAP,ou=test,ou=system", "+" );
+        e3 = adminConnection.lookup( "ou=paris,ou=france,ou=europe,ou=IAP2,ou=IAP1,ou=SAP,ou=test,ou=system", "+" );
+        
+        assertTrue( e1.contains( "CollectiveAttributeSubentriesUUID", sapUuid ) );
+        assertTrue( e2.contains( "CollectiveAttributeSubentriesUUID", sapUuid, iap1Uuid ) );
+        assertTrue( e3.contains( "CollectiveAttributeSubentriesUUID", sapUuid, iap1Uuid, iap2Uuid ) );
+        
+        dumpBase( "ou=test,ou=system" );
+        dumpSubentries( "ou=test,ou=system" );
+        dumpApCache();
+        dumpSubentryCache();
+        
+        // Now, rename IAP2
+        ModifyDnResponse response = adminConnection.rename( "ou=IAP2,ou=IAP1,ou=SAP,ou=test,ou=system", "ou=IAPnew" );
+        
+        assertEquals( ResultCodeEnum.SUCCESS, response.getLdapResult().getResultCode() );
+        
+        dumpBase( "ou=test,ou=system" );
+        dumpSubentries( "ou=test,ou=system" );
+        dumpApCache();
+        dumpSubentryCache();
+        
+        // Check the references
+        e1 = adminConnection.lookup( "ou=europe,ou=IAPnew,ou=IAP1,ou=SAP,ou=test,ou=system", "+" );
+        e2 = adminConnection.lookup( "ou=france,ou=europe,ou=IAPnew,ou=IAP1,ou=SAP,ou=test,ou=system", "+" );
+        e3 = adminConnection.lookup( "ou=paris,ou=france,ou=europe,ou=IAPnew,ou=IAP1,ou=SAP,ou=test,ou=system", "+" );
+        
+        assertFalse( e1.containsAttribute( "CollectiveAttributeSubentriesUUID" ) );
+        assertFalse( e2.containsAttribute( "CollectiveAttributeSubentriesUUID" ) );
+        assertTrue( e3.contains( "CollectiveAttributeSubentriesUUID", iap2Uuid ) );
+        assertFalse( e3.contains( "CollectiveAttributeSubentriesUUID", iap1Uuid, sapUuid ) );
+    }
     
     
     // ===================================================================

Modified: directory/apacheds/branches/apacheds-AP/core/src/main/java/org/apache/directory/server/core/subtree/SubentryInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-AP/core/src/main/java/org/apache/directory/server/core/subtree/SubentryInterceptor.java?rev=1059081&r1=1059080&r2=1059081&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-AP/core/src/main/java/org/apache/directory/server/core/subtree/SubentryInterceptor.java (original)
+++ directory/apacheds/branches/apacheds-AP/core/src/main/java/org/apache/directory/server/core/subtree/SubentryInterceptor.java Fri Jan 14 17:20:18 2011
@@ -789,7 +789,7 @@ public class SubentryInterceptor extends
                     entrySeqNumber = adminPoint.getSeqNumber();
                 }
 
-                if ( initialSeqNumber < adminPoint.getSeqNumber() )
+                if ( ( initialSeqNumber < adminPoint.getSeqNumber() ) || seqNumberUpdated )
                 {
                     // Evaluate the current AP on the entry for each subentry
                     for ( Subentry subentry : adminPoint.getSubentries() )
@@ -2780,11 +2780,13 @@ public class SubentryInterceptor extends
             switch ( adminPoint.getRole() )
             {
                 case AccessControlSpecificArea :
+                case AccessControlInnerArea :
                     directoryService.getAccessControlAPCache().remove( oldDn );
                     directoryService.getAccessControlAPCache().add( newDn, adminPoint );
                     break;
                     
                 case CollectiveAttributeSpecificArea :
+                case CollectiveAttributeInnerArea :
                     directoryService.getCollectiveAttributeAPCache().remove( oldDn );
                     directoryService.getCollectiveAttributeAPCache().add( newDn, adminPoint );
                     break;
@@ -2795,6 +2797,7 @@ public class SubentryInterceptor extends
                     break;
                     
                 case TriggerExecutionSpecificArea :
+                case TriggerExecutionInnerArea :
                     directoryService.getTriggerExecutionAPCache().remove( oldDn );
                     directoryService.getTriggerExecutionAPCache().add( newDn, adminPoint );
                     break;
@@ -2873,7 +2876,8 @@ public class SubentryInterceptor extends
                 applyRenameApCache( oldDn, newDn );
                 
                 // And check if we have to change the parent's AP seqNumbers
-                List<Modification> modifications = null;
+                List<Modification> modifications = new ArrayList<Modification>();
+                long newSeqNumber = -1L;
                 
                 for ( AdministrativeRoleEnum role : getRoles( adminPointAT ) )
                 {
@@ -2884,10 +2888,11 @@ public class SubentryInterceptor extends
                             
                         case CollectiveAttribute :
                             DnNode<AdministrativePoint> apCache = directoryService.getCollectiveAttributeAPCache();
-                            DnNode<AdministrativePoint> apNode = apCache.getParentWithElement( newDn );
+                            DnNode<AdministrativePoint> apNode = apCache.getNode( newDn );
 
                             // We have an AdministrativePoint for this entry, get its SeqNumber
                             AdministrativePoint adminPoint = apNode.getElement();
+                            AdministrativePoint currentAP = apNode.getElement();
                             EntryAttribute seqNumberAttribute = entry.get( COLLECTIVE_ATTRIBUTE_SEQ_NUMBER_AT );
 
                             // We have to recurse : starting from the IAP, we go up the AP tree
@@ -2901,12 +2906,12 @@ public class SubentryInterceptor extends
 
                             do
                             {
-                                if ( adminPoint.isSpecific() )
+                                if ( currentAP.isSpecific() )
                                 {
                                     sapFound = true;
                                 }
 
-                                Set<Subentry> subentries = adminPoint.getSubentries();
+                                Set<Subentry> subentries = currentAP.getSubentries();
                                 
                                 if ( ( subentries != null ) && ( subentries.size() != 0 ) )
                                 {
@@ -2945,50 +2950,44 @@ public class SubentryInterceptor extends
                                 
                                 // Go down one level
                                 apNode = apNode.getParentWithElement();
-                                adminPoint = apNode.getElement();
+                                currentAP = apNode.getElement();
                             } while ( !sapFound && !updateSN );
                             
+                            if ( updateSN )
+                            {
+                                if ( newSeqNumber == -1L )
+                                {
+                                    newSeqNumber = directoryService.getNewApSeqNumber();
+
+                                    adminPoint.setSeqNumber( newSeqNumber );
+                                    
+                                    EntryAttribute newSeqNumberAT = new DefaultEntryAttribute( COLLECTIVE_ATTRIBUTE_SEQ_NUMBER_AT, Long.toString( newSeqNumber ) );
+                                    Modification seqNumberModification = new DefaultModification( ModificationOperation.REPLACE_ATTRIBUTE, newSeqNumberAT );
+                                    
+                                    modifications.add( seqNumberModification );
+                                }
+                            }
                             break;
 
                         case SubSchema :
                         case TriggerExecution :
                     }
+                    
+                    // Update the AdminPoint
+                    
 
-                    // Now, update the seqNumber
-                    /*
+                    // Now, update the AP entry
                     // If we have updated the entry, create the list of modifications to apply
-                    if ( updateSN )
+                    if ( modifications.size() > 0 )
                     {
-                        // Create the list of modifications : we will inject REPLACE operations. 
-                        modifications = new ArrayList<Modification>();
-                        
-                        // The seqNubmer
-                        EntryAttribute newSeqNumberAT = new DefaultEntryAttribute( seqNumberAT, Long.toString( entrySeqNumber ) );
-                        Modification seqNumberModification = new DefaultModification( ModificationOperation.REPLACE_ATTRIBUTE, newSeqNumberAT );
-                        
-                        modifications.add( seqNumberModification );
-                        
-                        // The subentry UUID, if any
-                        if ( ( subentryUuids != null ) && ( subentryUuids.size() != 0 ) )
-                        {
-                            EntryAttribute newSubentryUuidAT = new DefaultEntryAttribute( subentryUuidAT, subentryUuids.toArray( new String[]{} ) );
-                            Modification subentryUuiMod = new DefaultModification( ModificationOperation.REPLACE_ATTRIBUTE, newSubentryUuidAT );
-
-                            modifications.add( subentryUuiMod );
-                        }
-                        else
-                        {
-                            // We may have to remove UUID refs from the entry
-                            if ( entry.containsAttribute( subentryUuidAT ) )
-                            {
-                                EntryAttribute newSubentryUuidAT = new DefaultEntryAttribute( subentryUuidAT );
-                                Modification subentryUuiMod = new DefaultModification( ModificationOperation.REMOVE_ATTRIBUTE, newSubentryUuidAT );
+                        ModifyOperationContext modCtx = new ModifyOperationContext( directoryService.getAdminSession() );
+                        modCtx.setByPassed( BYPASS_INTERCEPTORS );
+                        modCtx.setDn( entry.getDn() );
+                        modCtx.setModItems( modifications );
+                        modCtx.setEntry( renameContext.getEntry() );
 
-                                modifications.add( subentryUuiMod );
-                            }
-                        }
+                        directoryService.getOperationManager().modify( modCtx );
                     }
-                    */
                 }
             }
             else