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 2010/07/20 03:08:20 UTC

svn commit: r965704 - in /directory/apacheds/trunk: ./ core-api/src/main/java/org/apache/directory/server/core/ core-integ/src/test/java/org/apache/directory/server/core/collective/ core-integ/src/test/java/org/apache/directory/server/core/subtree/ cor...

Author: elecharny
Date: Tue Jul 20 01:08:19 2010
New Revision: 965704

URL: http://svn.apache.org/viewvc?rev=965704&view=rev
Log:
merged back the subtree branch into trunk

Removed:
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributesSchemaChecker.java
    directory/apacheds/trunk/i18n/src/test/java/org/apache/directory/server/i18n/
    directory/apacheds/trunk/i18n/src/test/resources/org/apache/directory/server/i18n/
Modified:
    directory/apacheds/trunk/   (props changed)
    directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/LdapCoreSessionConnection.java
    directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/collective/CollectiveAttributeServiceIT.java
    directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/subtree/SubentryServiceIT.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/PasswordPolicyConfiguration.java   (props changed)
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogInterceptor.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeInterceptor.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/subtree/SubtreeEvaluator.java
    directory/apacheds/trunk/i18n/src/main/java/org/apache/directory/server/i18n/I18n.java
    directory/apacheds/trunk/i18n/src/main/resources/org/apache/directory/server/i18n/errors.properties
    directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/   (props changed)
    directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/PartitionTreeTest.java   (props changed)
    directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/schema/   (props changed)
    directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/schema/PartitionSchemaLoaderTest.java   (props changed)
    directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/ClientSearchRequestTest.java
    directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/SearchRequestReturningAttributesTest.java
    directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplConsumer.java   (props changed)
    directory/apacheds/trunk/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionReader.java   (props changed)
    directory/apacheds/trunk/server-config/src/main/resources/   (props changed)
    directory/apacheds/trunk/server-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java   (props changed)
    directory/apacheds/trunk/test-framework/   (props changed)

Propchange: directory/apacheds/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -1,3 +1,4 @@
 /directory/apacheds/branches/apacheds-replication:749790-764110
 /directory/apacheds/branches/apacheds-schema:806623-896441
+/directory/apacheds/branches/apacheds-subtree:965203-965686
 /directory/apacheds/branches/xdbm-refactoring:945827-946347

Modified: directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/LdapCoreSessionConnection.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/LdapCoreSessionConnection.java?rev=965704&r1=965703&r2=965704&view=diff
==============================================================================
--- directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/LdapCoreSessionConnection.java (original)
+++ directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/LdapCoreSessionConnection.java Tue Jul 20 01:08:19 2010
@@ -540,6 +540,33 @@ public class LdapCoreSessionConnection i
     /**
      * {@inheritDoc}
      */
+    public ModifyResponse modify( DN dn, Modification... modifications ) throws LdapException
+    {
+        ModifyResponse resp = new ModifyResponse();
+        resp.setLdapResult( getDefaultResult() );
+
+        try
+        {
+            List<Modification> mods = new ArrayList<Modification>();
+
+            for ( Modification modification : modifications )
+            {
+                mods.add( modification );
+            }
+            session.modify( dn, mods );
+        }
+        catch ( Exception e )
+        {
+            resp.getLdapResult().setResultCode( ResultCodeEnum.getResultCode( e ) );
+        }
+
+        return resp;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
     public ModifyResponse modify( Entry entry, ModificationOperation modOp ) throws LdapException
     {
         ModifyResponse resp = new ModifyResponse();

Modified: directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/collective/CollectiveAttributeServiceIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/collective/CollectiveAttributeServiceIT.java?rev=965704&r1=965703&r2=965704&view=diff
==============================================================================
--- directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/collective/CollectiveAttributeServiceIT.java (original)
+++ directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/collective/CollectiveAttributeServiceIT.java Tue Jul 20 01:08:19 2010
@@ -25,27 +25,36 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
 import javax.naming.directory.BasicAttribute;
-import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.DirContext;
 import javax.naming.directory.ModificationItem;
-import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
 
+import org.apache.directory.ldap.client.api.LdapConnection;
+import org.apache.directory.ldap.client.api.message.AddResponse;
+import org.apache.directory.ldap.client.api.message.ModifyResponse;
+import org.apache.directory.ldap.client.api.message.SearchResponse;
+import org.apache.directory.ldap.client.api.message.SearchResultEntry;
 import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
 import org.apache.directory.server.core.integ.FrameworkRunner;
+import org.apache.directory.server.core.integ.IntegrationUtils;
+import org.apache.directory.shared.ldap.cursor.Cursor;
+import org.apache.directory.shared.ldap.entry.DefaultEntryAttribute;
+import org.apache.directory.shared.ldap.entry.DefaultModification;
+import org.apache.directory.shared.ldap.entry.Entry;
+import org.apache.directory.shared.ldap.entry.EntryAttribute;
+import org.apache.directory.shared.ldap.entry.ModificationOperation;
 import org.apache.directory.shared.ldap.exception.LdapException;
+import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.shared.ldap.ldif.LdapLdifException;
 import org.apache.directory.shared.ldap.ldif.LdifUtils;
+import org.apache.directory.shared.ldap.message.ResultCodeEnum;
+import org.apache.directory.shared.ldap.name.DN;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -58,9 +67,12 @@ import org.junit.runner.RunWith;
 @RunWith ( FrameworkRunner.class )
 public class CollectiveAttributeServiceIT extends AbstractLdapTestUnit
 {
-    private Attributes getTestEntry( String cn ) throws LdapLdifException, LdapException
+    private static LdapConnection connection;
+    
+    private Entry getTestEntry( String dn, String cn ) throws LdapLdifException, LdapException
     {
-        Attributes subentry = LdifUtils.createAttributes( 
+        Entry subentry = LdifUtils.createEntry( 
+            new DN( dn ), 
             "objectClass: top",
             "objectClass: person",
             "cn", cn ,
@@ -70,9 +82,10 @@ public class CollectiveAttributeServiceI
     }
 
 
-    private Attributes getTestSubentry()  throws LdapLdifException, LdapException
+    private Entry getTestSubentry( String dn )  throws LdapLdifException, LdapException
     {
-        Attributes subentry = LdifUtils.createAttributes( 
+        Entry subentry = LdifUtils.createEntry( 
+            new DN( dn ),
             "objectClass: top",
             "objectClass: subentry",
             "objectClass: collectiveAttributeSubentry",
@@ -84,9 +97,10 @@ public class CollectiveAttributeServiceI
     }
 
 
-    private Attributes getTestSubentry2() throws LdapLdifException, LdapException
+    private Entry getTestSubentry2( String dn ) throws LdapLdifException, LdapException
     {
-        Attributes subentry = LdifUtils.createAttributes( 
+        Entry subentry = LdifUtils.createEntry( 
+            new DN( dn ),
             "objectClass: top",
             "objectClass: subentry",
             "objectClass: collectiveAttributeSubentry",
@@ -98,9 +112,10 @@ public class CollectiveAttributeServiceI
     }
 
 
-    private Attributes getTestSubentry3() throws LdapLdifException, LdapException
+    private Entry getTestSubentry3( String dn ) throws LdapLdifException, LdapException
     {
-        Attributes subentry = LdifUtils.createAttributes( 
+        Entry subentry = LdifUtils.createEntry( 
+            new DN( dn ),
             "objectClass: top",
             "objectClass: subentry",
             "objectClass: collectiveAttributeSubentry",
@@ -114,64 +129,90 @@ public class CollectiveAttributeServiceI
 
     private void addAdministrativeRole( String role ) throws Exception
     {
-        Attribute attribute = new BasicAttribute( "administrativeRole" );
-        attribute.add( role );
-        ModificationItem item = new ModificationItem( DirContext.ADD_ATTRIBUTE, attribute );
-        getSystemContext( service ).modifyAttributes( "", new ModificationItem[] { item } );
+        EntryAttribute attribute = new DefaultEntryAttribute( "administrativeRole", role );
+        
+        connection.modify( new DN( "ou=system" ), new DefaultModification( ModificationOperation.ADD_ATTRIBUTE, attribute ) );
     }
 
 
-    private Map<String, Attributes> getAllEntries() throws Exception
+    private Map<String, Entry> getAllEntries() throws Exception
     {
-        Map<String, Attributes> resultMap = new HashMap<String, Attributes>();
-        SearchControls controls = new SearchControls();
-        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-        controls.setReturningAttributes( new String[]
-            { "+", "*" } );
-        NamingEnumeration<SearchResult> results = getSystemContext( service ).search( "", "(objectClass=*)", controls );
+        Map<String, Entry> resultMap = new HashMap<String, Entry>();
+
+        Cursor<SearchResponse> cursor = 
+            connection.search( "ou=system", "(objectClass=*)", SearchScope.SUBTREE, "+", "*" );
         
-        while ( results.hasMore() )
+        while ( cursor.next() )
         {
-            SearchResult result = results.next();
-            resultMap.put( result.getName(), result.getAttributes() );
+            SearchResponse result = cursor.get();
+            
+            if ( result instanceof SearchResultEntry )
+            {
+                Entry entry = ((SearchResultEntry)result).getEntry();
+                resultMap.put( entry.getDn().getName(), entry );
+            }
         }
+
         return resultMap;
     }
 
 
-    private Map<String, Attributes> getAllEntriesRestrictAttributes() throws Exception
+    private Map<String, Entry> getAllEntriesRestrictAttributes() throws Exception
     {
-        Map<String, Attributes> resultMap = new HashMap<String, Attributes>();
-        SearchControls controls = new SearchControls();
-        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-        controls.setReturningAttributes( new String[]
-            { "cn" } );
-        NamingEnumeration<SearchResult> results = getSystemContext( service ).search( "", "(objectClass=*)", controls );
-        while ( results.hasMore() )
+        Map<String, Entry> resultMap = new HashMap<String, Entry>();
+
+        Cursor<SearchResponse> cursor = 
+            connection.search( "ou=system", "(objectClass=*)", SearchScope.SUBTREE, "cn" );
+        
+        while ( cursor.next() )
         {
-            SearchResult result = results.next();
-            resultMap.put( result.getName(), result.getAttributes() );
+            SearchResponse result = cursor.get();
+            
+            if ( result instanceof SearchResultEntry )
+            {
+                Entry entry = ((SearchResultEntry)result).getEntry();
+                resultMap.put( entry.getDn().getName(), entry );
+            }
         }
+
         return resultMap;
     }
     
     
-    private Map<String, Attributes> getAllEntriesCollectiveAttributesOnly() throws Exception
+    private Map<String, Entry> getAllEntriesCollectiveAttributesOnly() throws Exception
     {
-        Map<String, Attributes> resultMap = new HashMap<String, Attributes>();
-        SearchControls controls = new SearchControls();
-        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-        controls.setReturningAttributes( new String[]
-                                                    { "c-ou", "c-st" } );
-        NamingEnumeration<SearchResult> results = getSystemContext( service ).search( "", "(objectClass=*)", controls );
+        Map<String, Entry> resultMap = new HashMap<String, Entry>();
+
+        Cursor<SearchResponse> cursor = 
+            connection.search( "ou=system", "(objectClass=*)", SearchScope.SUBTREE, "c-ou", "c-st" );
         
-        while ( results.hasMore() )
+        while ( cursor.next() )
         {
-            SearchResult result = results.next();
-            resultMap.put( result.getName(), result.getAttributes() );
+            SearchResponse result = cursor.get();
+            
+            if ( result instanceof SearchResultEntry )
+            {
+                Entry entry = ((SearchResultEntry)result).getEntry();
+                resultMap.put( entry.getDn().getName(), entry );
+            }
         }
+
         return resultMap;
     }
+
+    
+    @Before
+    public void init() throws Exception
+    {
+        connection = IntegrationUtils.getAdminConnection( service );
+    }
+    
+
+    @After
+    public void shutdown() throws Exception
+    {
+        connection.close();
+    }
     
 
     @Test
@@ -180,25 +221,27 @@ public class CollectiveAttributeServiceI
         // -------------------------------------------------------------------
         // Setup the collective attribute specific administration point
         // -------------------------------------------------------------------
-
         addAdministrativeRole( "collectiveAttributeSpecificArea" );
-        getSystemContext( service ).createSubcontext( "cn=testsubentry", getTestSubentry() );
+        Entry subentry = getTestSubentry( "cn=testsubentry,ou=system" );
+        connection.add( subentry );
 
         // -------------------------------------------------------------------
         // test an entry that should show the collective attribute c-ou
         // -------------------------------------------------------------------
 
-        Attributes attributes = getSystemContext( service ).getAttributes( "ou=services,ou=configuration" );
-        Attribute c_ou = attributes.get( "c-ou" );
+        SearchResponse response = connection.lookup( "ou=services,ou=configuration,ou=system" );
+        Entry entry = ((SearchResultEntry)response).getEntry();
+        EntryAttribute c_ou = entry.get( "c-ou" );
         assertNotNull( "a collective c-ou attribute should be present", c_ou );
-        assertEquals( "configuration", c_ou.get() );
+        assertEquals( "configuration", c_ou.getString() );
 
         // -------------------------------------------------------------------
         // test an entry that should not show the collective attribute
         // -------------------------------------------------------------------
 
-        attributes = getSystemContext( service ).getAttributes( "ou=users" );
-        c_ou = attributes.get( "c-ou" );
+        response = connection.lookup( "ou=users,ou=system" );
+        entry = ((SearchResultEntry)response).getEntry();
+        c_ou = entry.get( "c-ou" );
         assertNull( "the c-ou collective attribute should not be present", c_ou );
 
         // -------------------------------------------------------------------
@@ -211,65 +254,77 @@ public class CollectiveAttributeServiceI
         getSystemContext( service ).modifyAttributes( "ou=services,ou=configuration", items );
 
         // entry should not show the c-ou collective attribute anymore
-        attributes = getSystemContext( service ).getAttributes( "ou=services,ou=configuration" );
-        c_ou = attributes.get( "c-ou" );
+        response = connection.lookup( "ou=services,ou=configuration,ou=system" );
+        entry = ((SearchResultEntry)response).getEntry();
+        c_ou = entry.get( "c-ou" );
+
         if ( c_ou != null )
         {
             assertEquals( "the c-ou collective attribute should not be present", 0, c_ou.size() );
         }
 
         // now add more collective subentries - the c-ou should still not show due to exclusions
-        getSystemContext( service ).createSubcontext( "cn=testsubentry2", getTestSubentry2() );
+        Entry subentry2 = getTestSubentry2( "cn=testsubentry2,ou=system" );
+        connection.add( subentry2 );
+
+        response = connection.lookup( "ou=services,ou=configuration,ou=system" );
+        entry = ((SearchResultEntry)response).getEntry();
+        c_ou = entry.get( "c-ou" );
 
-        attributes = getSystemContext( service ).getAttributes( "ou=services,ou=configuration" );
-        c_ou = attributes.get( "c-ou" );
         if ( c_ou != null )
         {
             assertEquals( "the c-ou collective attribute should not be present", 0, c_ou.size() );
         }
 
         // entries without the collectiveExclusion should still show both values of c-ou
-        attributes = getSystemContext( service ).getAttributes( "ou=interceptors,ou=configuration" );
-        c_ou = attributes.get( "c-ou" );
+        response = connection.lookup( "ou=interceptors,ou=configuration,ou=system" );
+        entry = ((SearchResultEntry)response).getEntry();
+        c_ou = entry.get( "c-ou" );
+
         assertNotNull( "a collective c-ou attribute should be present", c_ou );
         assertTrue( c_ou.contains( "configuration" ) );
         assertTrue( c_ou.contains( "configuration2" ) );
 
         // request the collective attribute specifically
+        response = connection.lookup( "ou=interceptors,ou=configuration,ou=system", "c-ou" );
+        entry = ((SearchResultEntry)response).getEntry();
+        c_ou = entry.get( "c-ou" );
         
-        attributes = getSystemContext( service ).getAttributes(
-                "ou=interceptors,ou=configuration", new String[] { "c-ou" } );
-        c_ou = attributes.get( "c-ou" );
         assertNotNull( "a collective c-ou attribute should be present", c_ou );
         assertTrue( c_ou.contains( "configuration" ) );
         assertTrue( c_ou.contains( "configuration2" ) );
         
         // unspecify the collective attribute in the returning attribute list
+        response = connection.lookup( "ou=interceptors,ou=configuration,ou=system", "objectClass" );
+        entry = ((SearchResultEntry)response).getEntry();
+        c_ou = entry.get( "c-ou" );
 
-        attributes = getSystemContext( service ).getAttributes(
-                "ou=interceptors,ou=configuration", new String[] { "objectClass" } );
-        c_ou = attributes.get( "c-ou" );
         assertNull( "a collective c-ou attribute should not be present", c_ou );
         
         // -------------------------------------------------------------------
         // now add the subentry for the c-st collective attribute
         // -------------------------------------------------------------------
 
-        getSystemContext( service ).createSubcontext( "cn=testsubentry3", getTestSubentry3() );
+        connection.add( getTestSubentry3( "cn=testsubentry3,ou=system" ) );
 
         // the new attribute c-st should appear in the node with the c-ou exclusion
-        attributes = getSystemContext( service ).getAttributes( "ou=services,ou=configuration" );
-        Attribute c_st = attributes.get( "c-st" );
+        response = connection.lookup( "ou=services,ou=configuration,ou=system" );
+        entry = ((SearchResultEntry)response).getEntry();
+        EntryAttribute c_st = entry.get( "c-st" );
+
         assertNotNull( "a collective c-st attribute should be present", c_st );
         assertTrue( c_st.contains( "FL" ) );
 
         // in node without exclusions both values of c-ou should appear with c-st value
-        attributes = getSystemContext( service ).getAttributes( "ou=interceptors,ou=configuration" );
-        c_ou = attributes.get( "c-ou" );
+        response = connection.lookup( "ou=interceptors,ou=configuration,ou=system" );
+        entry = ((SearchResultEntry)response).getEntry();
+        c_ou = entry.get( "c-ou" );
+
         assertNotNull( "a collective c-ou attribute should be present", c_ou );
         assertTrue( c_ou.contains( "configuration" ) );
         assertTrue( c_ou.contains( "configuration2" ) );
-        c_st = attributes.get( "c-st" );
+        
+        c_st = entry.get( "c-st" );
         assertNotNull( "a collective c-st attribute should be present", c_st );
         assertTrue( c_st.contains( "FL" ) );
 
@@ -283,13 +338,17 @@ public class CollectiveAttributeServiceI
         getSystemContext( service ).modifyAttributes( "ou=interceptors,ou=configuration", items );
 
         // none of the attributes should appear any longer
-        attributes = getSystemContext( service ).getAttributes( "ou=interceptors,ou=configuration" );
-        c_ou = attributes.get( "c-ou" );
+        response = connection.lookup( "ou=interceptors,ou=configuration,ou=system" );
+        entry = ((SearchResultEntry)response).getEntry();
+        c_ou = entry.get( "c-ou" );
+
         if ( c_ou != null )
         {
             assertEquals( "the c-ou collective attribute should not be present", 0, c_ou.size() );
         }
-        c_st = attributes.get( "c-st" );
+
+        c_st = entry.get( "c-st" );
+        
         if ( c_st != null )
         {
             assertEquals( "the c-st collective attribute should not be present", 0, c_st.size() );
@@ -305,17 +364,17 @@ public class CollectiveAttributeServiceI
         // -------------------------------------------------------------------
 
         addAdministrativeRole( "collectiveAttributeSpecificArea" );
-        getSystemContext( service ).createSubcontext( "cn=testsubentry", getTestSubentry() );
+        connection.add( getTestSubentry( "cn=testsubentry,ou=system" ) );
 
         // -------------------------------------------------------------------
         // test an entry that should show the collective attribute c-ou
         // -------------------------------------------------------------------
 
-        Map<String, Attributes> entries = getAllEntries();
-        Attributes attributes = entries.get( "ou=services,ou=configuration,ou=system" );
-        Attribute c_ou = attributes.get( "c-ou" );
+        Map<String, Entry> entries = getAllEntries();
+        Entry entry = entries.get( "ou=services,ou=configuration,ou=system" );
+        EntryAttribute c_ou = entry.get( "c-ou" );
         assertNotNull( "a collective c-ou attribute should be present", c_ou );
-        assertEquals( "configuration", c_ou.get() );
+        assertEquals( "configuration", c_ou.getString() );
 
         
         // ------------------------------------------------------------------
@@ -324,18 +383,18 @@ public class CollectiveAttributeServiceI
         // ------------------------------------------------------------------
         
         entries = getAllEntriesCollectiveAttributesOnly();
-        attributes = entries.get( "ou=services,ou=configuration,ou=system" );
-        c_ou = attributes.get( "c-ou" );
+        entry = entries.get( "ou=services,ou=configuration,ou=system" );
+        c_ou = entry.get( "c-ou" );
         assertNotNull( "a collective c-ou attribute should be present", c_ou );
-        assertEquals( "configuration", c_ou.get() );   
+        assertEquals( "configuration", c_ou.getString() );   
         
         
         // -------------------------------------------------------------------
         // test an entry that should not show the collective attribute
         // -------------------------------------------------------------------
 
-        attributes = entries.get( "ou=users,ou=system" );
-        c_ou = attributes.get( "c-ou" );
+        entry = entries.get( "ou=users,ou=system" );
+        c_ou = entry.get( "c-ou" );
         assertNull( "the c-ou collective attribute should not be present", c_ou );
 
         // -------------------------------------------------------------------
@@ -349,27 +408,29 @@ public class CollectiveAttributeServiceI
         entries = getAllEntries();
 
         // entry should not show the c-ou collective attribute anymore
-        attributes = entries.get( "ou=services,ou=configuration,ou=system" );
-        c_ou = attributes.get( "c-ou" );
+        entry = entries.get( "ou=services,ou=configuration,ou=system" );
+        c_ou = entry.get( "c-ou" );
+        
         if ( c_ou != null )
         {
             assertEquals( "the c-ou collective attribute should not be present", 0, c_ou.size() );
         }
 
         // now add more collective subentries - the c-ou should still not show due to exclusions
-        getSystemContext( service ).createSubcontext( "cn=testsubentry2", getTestSubentry2() );
+        connection.add( getTestSubentry2( "cn=testsubentry2,ou=system" ) );
         entries = getAllEntries();
 
-        attributes = entries.get( "ou=services,ou=configuration,ou=system" );
-        c_ou = attributes.get( "c-ou" );
+        entry = entries.get( "ou=services,ou=configuration,ou=system" );
+        c_ou = entry.get( "c-ou" );
+        
         if ( c_ou != null )
         {
             assertEquals( "the c-ou collective attribute should not be present", 0, c_ou.size() );
         }
 
         // entries without the collectiveExclusion should still show both values of c-ou
-        attributes = entries.get( "ou=interceptors,ou=configuration,ou=system" );
-        c_ou = attributes.get( "c-ou" );
+        entry = entries.get( "ou=interceptors,ou=configuration,ou=system" );
+        c_ou = entry.get( "c-ou" );
         assertNotNull( "a collective c-ou attribute should be present", c_ou );
         assertTrue( c_ou.contains( "configuration" ) );
         assertTrue( c_ou.contains( "configuration2" ) );
@@ -378,22 +439,22 @@ public class CollectiveAttributeServiceI
         // now add the subentry for the c-st collective attribute
         // -------------------------------------------------------------------
 
-        getSystemContext( service ).createSubcontext( "cn=testsubentry3", getTestSubentry3() );
+        connection.add( getTestSubentry3( "cn=testsubentry3,ou=system" ) );
         entries = getAllEntries();
 
         // the new attribute c-st should appear in the node with the c-ou exclusion
-        attributes = entries.get( "ou=services,ou=configuration,ou=system" );
-        Attribute c_st = attributes.get( "c-st" );
+        entry = entries.get( "ou=services,ou=configuration,ou=system" );
+        EntryAttribute c_st = entry.get( "c-st" );
         assertNotNull( "a collective c-st attribute should be present", c_st );
         assertTrue( c_st.contains( "FL" ) );
 
         // in node without exclusions both values of c-ou should appear with c-st value
-        attributes = entries.get( "ou=interceptors,ou=configuration,ou=system" );
-        c_ou = attributes.get( "c-ou" );
+        entry = entries.get( "ou=interceptors,ou=configuration,ou=system" );
+        c_ou = entry.get( "c-ou" );
         assertNotNull( "a collective c-ou attribute should be present", c_ou );
         assertTrue( c_ou.contains( "configuration" ) );
         assertTrue( c_ou.contains( "configuration2" ) );
-        c_st = attributes.get( "c-st" );
+        c_st = entry.get( "c-st" );
         assertNotNull( "a collective c-st attribute should be present", c_st );
         assertTrue( c_st.contains( "FL" ) );
 
@@ -408,13 +469,16 @@ public class CollectiveAttributeServiceI
         entries = getAllEntries();
 
         // none of the attributes should appear any longer
-        attributes = entries.get( "ou=interceptors,ou=configuration,ou=system" );
-        c_ou = attributes.get( "c-ou" );
+        entry = entries.get( "ou=interceptors,ou=configuration,ou=system" );
+        c_ou = entry.get( "c-ou" );
+        
         if ( c_ou != null )
         {
             assertEquals( "the c-ou collective attribute should not be present", 0, c_ou.size() );
         }
-        c_st = attributes.get( "c-st" );
+        
+        c_st = entry.get( "c-st" );
+        
         if ( c_st != null )
         {
             assertEquals( "the c-st collective attribute should not be present", 0, c_st.size() );
@@ -427,71 +491,41 @@ public class CollectiveAttributeServiceI
         entries = getAllEntriesRestrictAttributes();
 
         // we should no longer see collective attributes with restricted return attribs
-        attributes = entries.get( "ou=services,ou=configuration,ou=system" );
-        c_st = attributes.get( "c-st" );
+        entry = entries.get( "ou=services,ou=configuration,ou=system" );
+        c_st = entry.get( "c-st" );
         assertNull( "a collective c-st attribute should NOT be present", c_st );
 
-        attributes = entries.get( "ou=partitions,ou=configuration,ou=system" );
-        c_ou = attributes.get( "c-ou" );
-        c_st = attributes.get( "c-st" );
+        entry = entries.get( "ou=partitions,ou=configuration,ou=system" );
+        c_ou = entry.get( "c-ou" );
+        c_st = entry.get( "c-st" );
         assertNull( c_ou );
         assertNull( c_st );
     }
     
     
     @Test
-    public void testAddRegularEntryWithCollectiveAttribute() throws LdapException
+    public void testAddRegularEntryWithCollectiveAttribute() throws Exception
     {
-        Attributes entry = getTestEntry( "Ersin Er" );
+        Entry entry = getTestEntry( "cn=Ersin Er,ou=system", "Ersin Er" );
         entry.put( "c-l", "Turkiye" );
         
-        try
-        {
-            getSystemContext( service ).createSubcontext( "cn=Ersin Er", entry );
-            fail( "Entry addition with collective attribute should have failed." );
-        }
-        catch ( Exception e )
-        {
-            // Intended execution point
-        }
+        AddResponse response = connection.add( entry );
+        
+        assertEquals( ResultCodeEnum.OBJECT_CLASS_VIOLATION, response.getLdapResult().getResultCode() );
     }
     
     
     @Test
     public void testModifyRegularEntryAddingCollectiveAttribute() throws Exception
     {
-        Attributes entry = getTestEntry( "Ersin Er" );
-        getSystemContext( service ).createSubcontext( "cn=Ersin Er", entry );
-        Attributes changeSet = new BasicAttributes( "c-l", "Turkiye", true );
-        try
-        {
-            
-            getSystemContext( service ).modifyAttributes( "cn=Ersin Er", DirContext.ADD_ATTRIBUTE, changeSet );
-            fail( "Collective attribute addition to non-collectiveAttributeSubentry should have failed." );
-        }
-        catch ( NamingException e )
-        {
-            // Intended execution point
-        }
-    }
-    
-    
-    @Test
-    public void testModifyRegularEntryAddingCollectiveAttribute2() throws Exception
-    {
-        Attributes entry = getTestEntry( "Ersin Er" );
-        getSystemContext( service ).createSubcontext( "cn=Ersin Er", entry );
-        Attribute change = new BasicAttribute( "c-l", "Turkiye");
-        ModificationItem mod = new ModificationItem(DirContext.ADD_ATTRIBUTE, change);
-        try
-        {
-            getSystemContext( service ).modifyAttributes( "cn=Ersin Er", new ModificationItem[] { mod } );
-            fail( "Collective attribute addition to non-collectiveAttributeSubentry should have failed." );
-        }
-        catch ( NamingException e )
-        {
-            // Intended execution point
-        }
+        Entry entry = getTestEntry( "cn=Ersin Er,ou=system", "Ersin Er" );
+        connection.add( entry );
+        
+        ModifyResponse response = connection.modify( new DN( "cn=Ersin Er,ou=system" ), 
+            new DefaultModification( ModificationOperation.ADD_ATTRIBUTE, 
+                new DefaultEntryAttribute( "c-l", "Turkiye" ) ) );
+        
+        assertEquals( ResultCodeEnum.OBJECT_CLASS_VIOLATION, response.getLdapResult().getResultCode() );
     }
     
     
@@ -501,16 +535,17 @@ public class CollectiveAttributeServiceI
         // -------------------------------------------------------------------
         // Setup the collective attribute specific administration point
         // -------------------------------------------------------------------
-    
         addAdministrativeRole( "collectiveAttributeSpecificArea" );
-        getSystemContext( service ).createSubcontext( "cn=testsubentry", getTestSubentry() );
+        Entry subentry = getTestSubentry( "cn=testsubentry,ou=system" );
+        connection.add( subentry );
     
         // request the collective attribute's super type specifically
-        Attributes attributes = getSystemContext( service ).getAttributes( "ou=interceptors,ou=configuration",
-            new String[] { "ou" } );
-        Attribute c_ou = attributes.get( "c-ou" );
+        SearchResponse response = connection.lookup( "ou=interceptors,ou=configuration,ou=system", "ou" );
+        
+        Entry entry = ((SearchResultEntry)response).getEntry();
+        
+        EntryAttribute c_ou = entry.get( "c-ou" );
         assertNotNull( "a collective c-ou attribute should be present", c_ou );
         assertTrue( c_ou.contains( "configuration" ) );
     }
-    
 }

Modified: directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/subtree/SubentryServiceIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/subtree/SubentryServiceIT.java?rev=965704&r1=965703&r2=965704&view=diff
==============================================================================
--- directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/subtree/SubentryServiceIT.java (original)
+++ directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/subtree/SubentryServiceIT.java Tue Jul 20 01:08:19 2010
@@ -331,7 +331,6 @@ public class SubentryServiceIT extends A
     }
 
 
-    @Test
     /**
      * Add a subentry under AP-A. 
      * The following entries must be modified :
@@ -356,6 +355,7 @@ public class SubentryServiceIT extends A
      *     
      * Then suppress the subentry under AP-B
      */
+    @Test
     public void testSubentryAdd() throws Exception
     {
         LdapConnection connection = IntegrationUtils.getAdminConnection( service );
@@ -812,6 +812,7 @@ public class SubentryServiceIT extends A
 
         Attributes configuration = results.get( "ou=configuration,ou=system" );
         Attribute collectiveAttributeSubentries = configuration.get( SchemaConstants.COLLECTIVE_ATTRIBUTE_SUBENTRIES_AT );
+        
         if ( collectiveAttributeSubentries != null )
         {
             assertEquals( "ou=configuration,ou=system should not be marked", 0, collectiveAttributeSubentries.size() );
@@ -819,6 +820,7 @@ public class SubentryServiceIT extends A
 
         Attributes interceptors = results.get( "ou=interceptors,ou=configuration,ou=system" );
         collectiveAttributeSubentries = interceptors.get( SchemaConstants.COLLECTIVE_ATTRIBUTE_SUBENTRIES_AT );
+        
         if ( collectiveAttributeSubentries != null )
         {
             assertEquals( "ou=interceptors,ou=configuration,ou=system should not be marked", 0, collectiveAttributeSubentries
@@ -827,6 +829,7 @@ public class SubentryServiceIT extends A
 
         Attributes partitions = results.get( "ou=partitions,ou=configuration,ou=system" );
         collectiveAttributeSubentries = partitions.get( SchemaConstants.COLLECTIVE_ATTRIBUTE_SUBENTRIES_AT );
+        
         if ( collectiveAttributeSubentries != null )
         {
             assertEquals( "ou=partitions,ou=configuration,ou=system should not be marked", 0, collectiveAttributeSubentries.size() );
@@ -834,6 +837,7 @@ public class SubentryServiceIT extends A
 
         Attributes services = results.get( "ou=services,ou=configuration,ou=system" );
         collectiveAttributeSubentries = services.get( SchemaConstants.COLLECTIVE_ATTRIBUTE_SUBENTRIES_AT );
+        
         if ( collectiveAttributeSubentries != null )
         {
             assertEquals( "ou=services,ou=configuration,ou=system should not be marked", 0, collectiveAttributeSubentries.size() );

Propchange: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/PasswordPolicyConfiguration.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -1,3 +1,4 @@
 /directory/apacheds/branches/apacheds-replication/interceptor-kerberos/src/main/java/org/apache/directory/server/core/kerberos/PasswordPolicyConfiguration.java:749790-764110
 /directory/apacheds/branches/apacheds-schema/interceptor-kerberos/src/main/java/org/apache/directory/server/core/kerberos/PasswordPolicyConfiguration.java:806623-896441
+/directory/apacheds/branches/apacheds-subtree/core/src/main/java/org/apache/directory/server/core/authn/PasswordPolicyConfiguration.java:965203-965686
 /directory/apacheds/branches/xdbm-refactoring/interceptor-kerberos/src/main/java/org/apache/directory/server/core/kerberos/PasswordPolicyConfiguration.java:945827-946347

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogInterceptor.java?rev=965704&r1=965703&r2=965704&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogInterceptor.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogInterceptor.java Tue Jul 20 01:08:19 2010
@@ -38,6 +38,7 @@ import org.apache.directory.server.core.
 import org.apache.directory.server.core.partition.ByPassConstants;
 import org.apache.directory.server.core.schema.SchemaService;
 import org.apache.directory.shared.ldap.codec.controls.ManageDsaITControl;
+import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.entry.DefaultEntry;
 import org.apache.directory.shared.ldap.entry.Entry;
 import org.apache.directory.shared.ldap.entry.EntryAttribute;
@@ -165,12 +166,15 @@ public class ChangeLogInterceptor extend
         forward.setDn( deleteContext.getDn() );
         
         Entry reverseEntry = new DefaultEntry( serverEntry.getDn() );
+        
+        boolean isCollectiveSubentry = serverEntry.hasObjectClass( SchemaConstants.COLLECTIVE_ATTRIBUTE_SUBENTRY_OC );
 
         for ( EntryAttribute attribute : serverEntry )
         {
             // filter collective attributes, they can't be added by the revert operation
             AttributeType at = schemaService.getSchemaManager().getAttributeTypeRegistry().lookup( attribute.getId() );
-            if ( !at.isCollective() )
+            
+            if ( !at.isCollective() || isCollectiveSubentry )
             {
                 reverseEntry.add( attribute.clone() );
             }

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeInterceptor.java?rev=965704&r1=965703&r2=965704&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeInterceptor.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/collective/CollectiveAttributeInterceptor.java Tue Jul 20 01:08:19 2010
@@ -21,6 +21,7 @@ package org.apache.directory.server.core
 
 
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import org.apache.directory.server.core.DirectoryService;
@@ -37,16 +38,24 @@ import org.apache.directory.server.core.
 import org.apache.directory.server.core.interceptor.context.SearchOperationContext;
 import org.apache.directory.server.core.interceptor.context.SearchingOperationContext;
 import org.apache.directory.server.core.partition.ByPassConstants;
-import org.apache.directory.server.core.partition.PartitionNexus;
+import org.apache.directory.server.i18n.I18n;
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.entry.DefaultEntryAttribute;
 import org.apache.directory.shared.ldap.entry.Entry;
 import org.apache.directory.shared.ldap.entry.EntryAttribute;
+import org.apache.directory.shared.ldap.entry.Modification;
+import org.apache.directory.shared.ldap.entry.ModificationOperation;
 import org.apache.directory.shared.ldap.entry.Value;
 import org.apache.directory.shared.ldap.exception.LdapException;
+import org.apache.directory.shared.ldap.exception.LdapInvalidAttributeTypeException;
+import org.apache.directory.shared.ldap.exception.LdapSchemaViolationException;
+import org.apache.directory.shared.ldap.message.ResultCodeEnum;
 import org.apache.directory.shared.ldap.name.DN;
 import org.apache.directory.shared.ldap.schema.AttributeType;
 import org.apache.directory.shared.ldap.schema.SchemaManager;
+import org.apache.directory.shared.ldap.schema.SchemaUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -60,16 +69,21 @@ import org.apache.directory.shared.ldap.
  */
 public class CollectiveAttributeInterceptor extends BaseInterceptor
 {
+    /** The LoggerFactory used by this Interceptor */
+    private static Logger LOG = LoggerFactory.getLogger( CollectiveAttributeInterceptor.class );
+
     /** The SchemaManager instance */
     private SchemaManager schemaManager;
-
-    private PartitionNexus nexus;
-
-    private CollectiveAttributesSchemaChecker collectiveAttributesSchemaChecker;
     
+    /** The ObjectClass AttributeType */
+    private static AttributeType OBJECT_CLASS_AT;
+
     /** The CollectiveAttributeSubentries AttributeType */
     private static AttributeType COLLECTIVE_ATTRIBUTE_SUBENTRIES_AT;
-
+    
+    /** The CollectiveExclusions AttributeType */
+    private static AttributeType COLLECTIVE_EXCLUSIONS_AT;
+    
     /**
      * the search result filter to use for collective attribute injection
      */
@@ -77,32 +91,239 @@ public class CollectiveAttributeIntercep
     {
         public boolean accept( SearchingOperationContext operation, ClonedServerEntry result ) throws Exception
         {
-            DN name = result.getDn();
-
-            if ( name.isNormalized() == false )
-            {
-                name = DN.normalize( name, schemaManager.getNormalizerMapping() );
-            }
-
             String[] retAttrs = operation.getSearchControls().getReturningAttributes();
             addCollectiveAttributes( operation, result, retAttrs );
+            
             return true;
         }
     };
-
-
+    //-------------------------------------------------------------------------------------
+    // Initialization
+    //-------------------------------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
     public void init( DirectoryService directoryService ) throws LdapException
     {
         super.init( directoryService );
         schemaManager = directoryService.getSchemaManager();
-        nexus = directoryService.getPartitionNexus();
-        collectiveAttributesSchemaChecker = new CollectiveAttributesSchemaChecker( nexus, schemaManager );
         
+        // Load some AttributeType
         COLLECTIVE_ATTRIBUTE_SUBENTRIES_AT = schemaManager.getAttributeType( SchemaConstants.COLLECTIVE_ATTRIBUTE_SUBENTRIES_AT );
+        COLLECTIVE_EXCLUSIONS_AT = schemaManager.getAttributeType( SchemaConstants.COLLECTIVE_EXCLUSIONS_AT );
+        OBJECT_CLASS_AT = schemaManager.getAttributeType( SchemaConstants.OBJECT_CLASS_AT );
+        
+        LOG.debug( "CollectiveAttriute interceptor initilaized" );
+    }
+
+
+    // ------------------------------------------------------------------------
+    // Interceptor Method Overrides
+    // ------------------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public void add( NextInterceptor next, AddOperationContext addContext ) throws LdapException
+    {
+        checkAdd( addContext.getDn(), addContext.getEntry() );
+
+        next.add( addContext );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public EntryFilteringCursor list( NextInterceptor nextInterceptor, ListOperationContext listContext )
+        throws LdapException
+    {
+        EntryFilteringCursor cursor = nextInterceptor.list( listContext );
+        
+        cursor.addEntryFilter( SEARCH_FILTER );
+        
+        return cursor;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public Entry lookup( NextInterceptor nextInterceptor, LookupOperationContext lookupContext ) throws LdapException
+    {
+        Entry result = nextInterceptor.lookup( lookupContext );
+
+        if ( result == null )
+        {
+            return null;
+        }
+
+        // Adding the collective attributes if any
+        if ( ( lookupContext.getAttrsId() == null ) || ( lookupContext.getAttrsId().size() == 0 ) )
+        {
+            addCollectiveAttributes( lookupContext, result, SchemaConstants.ALL_USER_ATTRIBUTES_ARRAY );
+        }
+        else
+        {
+            addCollectiveAttributes( lookupContext, result, lookupContext.getAttrsIdArray() );
+        }
+
+        return result;
     }
 
 
     /**
+     * {@inheritDoc}
+     */
+    public void modify( NextInterceptor next, ModifyOperationContext modifyContext ) throws LdapException
+    {
+        checkModify( modifyContext );
+
+        next.modify( modifyContext );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public EntryFilteringCursor search( NextInterceptor nextInterceptor, SearchOperationContext searchContext )
+        throws LdapException
+    {
+        EntryFilteringCursor cursor = nextInterceptor.search( searchContext );
+        
+        cursor.addEntryFilter( SEARCH_FILTER );
+
+        return cursor;
+    }
+
+
+    //-------------------------------------------------------------------------------------
+    // Helper methods
+    //-------------------------------------------------------------------------------------
+    /**
+     * Check if we can add an entry. There are two cases : <br>
+     * <ul>
+     * <li>The entry is a normal entry : it should not contain any 'c-XXX' attributeType</li>
+     * <li>The entry is a collectiveAttributeSubentry
+     * </ul>
+     */
+    private void checkAdd( DN normName, Entry entry ) throws LdapException
+    {
+        if ( entry.hasObjectClass( SchemaConstants.COLLECTIVE_ATTRIBUTE_SUBENTRY_OC ) )
+        {
+            // This is a collectiveAttribute subentry. It must have at least one collective
+            // attribute
+            for ( EntryAttribute attribute : entry )
+            {
+                if ( attribute.getAttributeType().isCollective() )
+                {
+                    return;
+                }
+            }
+            
+            LOG.info( "A CollectiveAttribute subentry *should* have at least one collectiveAttribute" );
+            throw new LdapSchemaViolationException( ResultCodeEnum.OBJECT_CLASS_VIOLATION, I18n.err( I18n.ERR_257_COLLECTIVE_SUBENTRY_WITHOUT_COLLECTIVE_AT ) );
+        }
+
+        if ( containsAnyCollectiveAttributes( entry ) )
+        {
+            /*
+             * TODO: Replace the Exception and the ResultCodeEnum with the correct ones.
+             */
+            LOG.info( "Cannot add the entry {} : it contains some CollectiveAttributes and is not a collective subentry",
+                entry );
+            throw new LdapSchemaViolationException( ResultCodeEnum.OBJECT_CLASS_VIOLATION, I18n.err( I18n.ERR_241_CANNOT_STORE_COLLECTIVE_ATT_IN_ENTRY ) );
+        }
+    }
+
+    
+    /**
+     * Check that we can modify an entry
+     */
+    private void checkModify( ModifyOperationContext modifyContext ) throws LdapException
+    {
+        List<Modification> mods = modifyContext.getModItems();
+        Entry originalEntry = modifyContext.getEntry();
+        Entry targetEntry = ( Entry ) SchemaUtils.getTargetEntry( mods, originalEntry );
+
+        // If the modified entry contains the CollectiveAttributeSubentry, then the modification
+        // is accepted, no matter what
+        if ( targetEntry.contains( OBJECT_CLASS_AT, SchemaConstants.COLLECTIVE_ATTRIBUTE_SUBENTRY_OC ) )
+        {
+            return;
+        }
+
+        // Check that we don't add any collectve attribute, this is not allowed on normal entries
+        if ( hasCollectiveAttributes( mods ) )
+        {
+            /*
+             * TODO: Replace the Exception and the ResultCodeEnum with the correct ones.
+             */
+            LOG.info( "Cannot modify the entry {} : it contains some CollectiveAttributes and is not a collective subentry",
+                targetEntry );
+            throw new LdapSchemaViolationException( ResultCodeEnum.OBJECT_CLASS_VIOLATION, I18n.err( I18n.ERR_242 ) );
+        }
+    }
+
+    
+    /**
+     * Check that we have a CollectiveAttribute in the modifications. (CollectiveAttributes
+     * are those with a name starting with 'c-').
+     */
+    private boolean hasCollectiveAttributes( List<Modification> mods ) throws LdapException
+    {
+        for ( Modification mod : mods )
+        {
+            // TODO: handle http://issues.apache.org/jira/browse/DIRSERVER-1198
+            EntryAttribute attr = mod.getAttribute();
+            AttributeType attrType = attr.getAttributeType();
+
+            // Defensive programming. Very unlikely to happen here...
+            if ( attrType == null )
+            {
+                try
+                {
+                    attrType = schemaManager.lookupAttributeTypeRegistry( attr.getUpId() );
+                }
+                catch ( LdapException le )
+                {
+                    throw new LdapInvalidAttributeTypeException();
+                }
+            }
+
+            ModificationOperation modOp = mod.getOperation();
+
+            // If the AT is collective and we don't try to remove it, then we can return.
+            if ( attrType.isCollective() && ( modOp != ModificationOperation.REMOVE_ATTRIBUTE ) )
+            {
+                return true;
+            }
+        }
+
+        // No collective attrbute found
+        return false;
+    }
+
+    
+    /**
+     * Check if the entry contains any collective AttributeType (those starting with 'c-')
+     */
+    private boolean containsAnyCollectiveAttributes( Entry entry ) throws LdapException
+    {
+        Set<AttributeType> attributeTypes = entry.getAttributeTypes();
+
+        for ( AttributeType attributeType : attributeTypes )
+        {
+            if ( attributeType.isCollective() )
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    
+    /**
      * Adds the set of collective attributes requested in the returning attribute list
      * and contained in subentries referenced by the entry. Excludes collective
      * attributes that are specified to be excluded via the 'collectiveExclusions'
@@ -135,7 +356,7 @@ public class CollectiveAttributeIntercep
          * variance.
          */
         EntryAttribute collectiveExclusions = ( ( ClonedServerEntry ) entry ).getOriginalEntry().get(
-            SchemaConstants.COLLECTIVE_EXCLUSIONS_AT );
+            COLLECTIVE_EXCLUSIONS_AT );
         Set<String> exclusions = new HashSet<String>();
 
         if ( collectiveExclusions != null )
@@ -296,68 +517,4 @@ public class CollectiveAttributeIntercep
 
         return allSuperTypes;
     }
-
-
-    // ------------------------------------------------------------------------
-    // Interceptor Method Overrides
-    // ------------------------------------------------------------------------
-
-    public Entry lookup( NextInterceptor nextInterceptor, LookupOperationContext lookupContext ) throws LdapException
-    {
-        Entry result = nextInterceptor.lookup( lookupContext );
-
-        if ( result == null )
-        {
-            return null;
-        }
-
-        if ( ( lookupContext.getAttrsId() == null ) || ( lookupContext.getAttrsId().size() == 0 ) )
-        {
-            addCollectiveAttributes( lookupContext, result, SchemaConstants.ALL_USER_ATTRIBUTES_ARRAY );
-        }
-        else
-        {
-            addCollectiveAttributes( lookupContext, result, lookupContext.getAttrsIdArray() );
-        }
-
-        return result;
-    }
-
-
-    public EntryFilteringCursor list( NextInterceptor nextInterceptor, ListOperationContext listContext )
-        throws LdapException
-    {
-        EntryFilteringCursor cursor = nextInterceptor.list( listContext );
-        cursor.addEntryFilter( SEARCH_FILTER );
-        return cursor;
-    }
-
-
-    public EntryFilteringCursor search( NextInterceptor nextInterceptor, SearchOperationContext searchContext )
-        throws LdapException
-    {
-        EntryFilteringCursor cursor = nextInterceptor.search( searchContext );
-        cursor.addEntryFilter( SEARCH_FILTER );
-        return cursor;
-    }
-
-
-    // ------------------------------------------------------------------------
-    // Partial Schema Checking
-    // ------------------------------------------------------------------------
-
-    public void add( NextInterceptor next, AddOperationContext addContext ) throws LdapException
-    {
-        collectiveAttributesSchemaChecker.checkAdd( addContext.getDn(), addContext.getEntry() );
-
-        next.add( addContext );
-    }
-
-
-    public void modify( NextInterceptor next, ModifyOperationContext modifyContext ) throws LdapException
-    {
-        collectiveAttributesSchemaChecker.checkModify( modifyContext );
-
-        next.modify( modifyContext );
-    }
 }

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/subtree/SubtreeEvaluator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/subtree/SubtreeEvaluator.java?rev=965704&r1=965703&r2=965704&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/subtree/SubtreeEvaluator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/subtree/SubtreeEvaluator.java Tue Jul 20 01:08:19 2010
@@ -20,8 +20,6 @@
 package org.apache.directory.server.core.subtree;
 
 
-import java.util.Iterator;
-
 import org.apache.directory.server.core.event.Evaluator;
 import org.apache.directory.server.core.event.ExpressionEvaluator;
 import org.apache.directory.shared.ldap.entry.Entry;
@@ -29,7 +27,6 @@ import org.apache.directory.shared.ldap.
 import org.apache.directory.shared.ldap.name.DN;
 import org.apache.directory.shared.ldap.schema.SchemaManager;
 import org.apache.directory.shared.ldap.subtree.SubtreeSpecification;
-import org.apache.directory.shared.ldap.util.NamespaceTools;
 
 
 /**
@@ -79,51 +76,16 @@ public class SubtreeEvaluator
          * specification.
          * =====================================================================
          */
-
-        /*
-         * First we simply check if the candidate entry is a descendant of the
-         * administrative point.  In the process we calculate the relative
-         * distinguished name relative to the administrative point.
-         */
-        DN apRelativeRdn;
+        // First construct the subtree base, which is the concatenation of the
+        // AP DN and the subentry base
+        DN subentryBaseDn = (DN)apDn.clone();
+        subentryBaseDn.addAll( subtree.getBase() );
         
-        if ( !entryDn.isChildOf( apDn ) )
+        if ( !entryDn.isChildOf( subentryBaseDn ) )
         {
+            // The entry DN is not part of the subtree specification, get out
             return false;
         }
-        else if ( apDn.equals( entryDn ) )
-        {
-            apRelativeRdn = new DN();
-        }
-        else
-        {
-            apRelativeRdn = NamespaceTools.getRelativeName( apDn, entryDn );
-        }
-
-        /*
-         * We do the same thing with the base as we did with the administrative
-         * point: check if the entry is a descendant of the base and find the
-         * relative name of the entry with respect to the base rdn.  With the
-         * baseRelativeRdn we can later make comparisons with specific exclusions.
-         */
-        DN baseRelativeRdn;
-        
-        if ( subtree.getBase() != null && subtree.getBase().size() == 0 )
-        {
-            baseRelativeRdn = apRelativeRdn;
-        }
-        else if ( apRelativeRdn.equals( subtree.getBase() ) )
-        {
-            baseRelativeRdn = new DN();
-        }
-        else if ( !apRelativeRdn.isChildOf( subtree.getBase() ) )
-        {
-            return false;
-        }
-        else
-        {
-            baseRelativeRdn = NamespaceTools.getRelativeName( subtree.getBase(), apRelativeRdn );
-        }
 
         /*
          * Evaluate based on minimum and maximum chop values.  Here we simply
@@ -133,13 +95,15 @@ public class SubtreeEvaluator
          * entries with a baseRelativeRdn size less than the minimum distance
          * are rejected.
          */
-        if ( subtree.getMaxBaseDistance() != SubtreeSpecification.UNBOUNDED_MAX &&
-            subtree.getMaxBaseDistance() < baseRelativeRdn.size() )
+        int entryRelativeDnSize = entryDn.size() - subentryBaseDn.size();
+        
+        if ( ( subtree.getMaxBaseDistance() != SubtreeSpecification.UNBOUNDED_MAX ) &&
+             ( entryRelativeDnSize > subtree.getMaxBaseDistance() ) )
         {
             return false;
         }
 
-        if ( subtree.getMinBaseDistance() > 0 && baseRelativeRdn.size() < subtree.getMinBaseDistance() )
+        if ( ( subtree.getMinBaseDistance() > 0 ) && ( entryRelativeDnSize < subtree.getMinBaseDistance() ) )
         {
             return false;
         }
@@ -151,27 +115,27 @@ public class SubtreeEvaluator
          * are equal so for chopAfter exclusions we must check for equality
          * as well and reject if the relative names are equal.
          */
-        Iterator<DN> list = subtree.getChopBeforeExclusions().iterator();
+        // Now, get the entry's relative part
         
-        while ( list.hasNext() )
+        if ( ( subtree.getChopBeforeExclusions().size() != 0 ) || 
+             ( subtree.getChopAfterExclusions().size() != 0 ) )
         {
-            DN chopBefore = list.next();
+            DN entryRelativeDn = entryDn.getSuffix( apDn.size() + subtree.getBase().size() );
             
-            if ( baseRelativeRdn.isChildOf( chopBefore ) )
+            for ( DN chopBeforeDn : subtree.getChopBeforeExclusions() )
             {
-                return false;
+                if ( entryRelativeDn.isChildOf( chopBeforeDn ) )
+                {
+                    return false;
+                }
             }
-        }
-
-        list = subtree.getChopAfterExclusions().iterator();
-        
-        while ( list.hasNext() )
-        {
-            DN chopAfter = ( DN ) list.next();
-            
-            if ( baseRelativeRdn.isChildOf( chopAfter ) && !chopAfter.equals( baseRelativeRdn ) )
+    
+            for ( DN chopAfterDn : subtree.getChopAfterExclusions() )
             {
-                return false;
+                if ( entryRelativeDn.isChildOf( chopAfterDn ) && !chopAfterDn.equals( entryRelativeDn ) )
+                {
+                    return false;
+                }
             }
         }
 

Modified: directory/apacheds/trunk/i18n/src/main/java/org/apache/directory/server/i18n/I18n.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/i18n/src/main/java/org/apache/directory/server/i18n/I18n.java?rev=965704&r1=965703&r2=965704&view=diff
==============================================================================
--- directory/apacheds/trunk/i18n/src/main/java/org/apache/directory/server/i18n/I18n.java (original)
+++ directory/apacheds/trunk/i18n/src/main/java/org/apache/directory/server/i18n/I18n.java Tue Jul 20 01:08:19 2010
@@ -274,7 +274,7 @@ public enum I18n
     ERR_238("ERR_238"),
     ERR_239("ERR_239"),
     ERR_240("ERR_240"),
-    ERR_241("ERR_241"),
+    ERR_241_CANNOT_STORE_COLLECTIVE_ATT_IN_ENTRY("ERR_241_CANNOT_STORE_COLLECTIVE_ATT_IN_ENTRY"),
     ERR_242("ERR_242"),
     ERR_243("ERR_243"),
     ERR_244("ERR_244"),
@@ -290,7 +290,7 @@ public enum I18n
     ERR_254_ADD_EXISTING_VALUE("ERR_254_ADD_EXISTING_VALUE"),
     ERR_255("ERR_255"),
     ERR_256_NO_SUCH_OBJECT("ERR_256_NO_SUCH_OBJECT"),
-    //ERR_257("ERR_257"), --> ERR_250
+    ERR_257_COLLECTIVE_SUBENTRY_WITHOUT_COLLECTIVE_AT("ERR_257_COLLECTIVE_SUBENTRY_WITHOUT_COLLECTIVE_AT"),
     ERR_258("ERR_258"),
     ERR_259("ERR_259"),
     ERR_260("ERR_260"),
@@ -768,8 +768,8 @@ public enum I18n
     ERR_732("ERR_732"),
     ERR_733("ERR_733");
 
-    private final static ResourceBundle errBundle = ResourceBundle
-        .getBundle( "org/apache/directory/server/i18n/errors" );
+    private static ResourceBundle errBundle = ResourceBundle
+                .getBundle( "org.apache.directory.server.i18n.errors" );
 
     private final static ResourceBundle msgBundle = ResourceBundle
         .getBundle( "org/apache/directory/server/i18n/messages" );

Modified: directory/apacheds/trunk/i18n/src/main/resources/org/apache/directory/server/i18n/errors.properties
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/i18n/src/main/resources/org/apache/directory/server/i18n/errors.properties?rev=965704&r1=965703&r2=965704&view=diff
==============================================================================
--- directory/apacheds/trunk/i18n/src/main/resources/org/apache/directory/server/i18n/errors.properties (original)
+++ directory/apacheds/trunk/i18n/src/main/resources/org/apache/directory/server/i18n/errors.properties Tue Jul 20 01:08:19 2010
@@ -262,7 +262,7 @@ ERR_237=The underlying changelog store d
 ERR_238=The underlying changelog store does not support searching through it's tags
 ERR_239=revision must be greater than or equal to 0
 ERR_240=revision must be less than or equal to the current revision
-ERR_241=Collective attributes cannot be stored in non-collectiveAttributeSubentries
+ERR_241_CANNOT_STORE_COLLECTIVE_ATT_IN_ENTRY=Collective attributes cannot be stored in non-collectiveAttributeSubentries
 ERR_242=Cannot operate on collective attributes in non-collectiveAttributeSubentries
 ERR_243=Negation has no child: {0}
 ERR_244=Unrecognized branch node operator: {0}
@@ -278,7 +278,7 @@ ERR_253=Can not allow the deletion of th
 ERR_254_ADD_EXISTING_VALUE=Trying to add existing value ''{0}'' to attribute {1}
 ERR_255=Can not allow the renaming of the subschemaSubentry ({0}) for the global schema: it is fixed at {1}
 ERR_256_NO_SUCH_OBJECT=Entry {0} does not exist!
-#ERR_257=Entry {0} already exists!
+ERR_257_COLLECTIVE_SUBENTRY_WITHOUT_COLLECTIVE_AT=A CollectiveAttribute Subentry must have at least one collective Attribute
 ERR_258=Can not allow the move of the subschemaSubentry ({0}) for the global schema\: it is fixed at {1} 
 ERR_259=Attempt to search under non-existant entry\:  
 ERR_260=Unknown assertion type: {0}

Propchange: directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -1,4 +1,5 @@
 /directory/apacheds/branches/apacheds-replication/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree:749790-764110
 /directory/apacheds/branches/apacheds-schema/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree:806623-810034
+/directory/apacheds/branches/apacheds-subtree/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree:965203-965686
 /directory/apacheds/branches/xdbm-refactoring/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree:945827-946347
 /directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree:498338-580500,806623-894866*

Propchange: directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/PartitionTreeTest.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -1,3 +1,4 @@
 /directory/apacheds/branches/apacheds-replication/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/PartitionTreeTest.java:749790-764110
+/directory/apacheds/branches/apacheds-subtree/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/PartitionTreeTest.java:965203-965686
 /directory/apacheds/branches/xdbm-refactoring/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/PartitionTreeTest.java:945827-946347
 /directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/PartitionTreeTest.java:498338-580500,806623-894866

Propchange: directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/schema/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -1,4 +1,5 @@
 /directory/apacheds/branches/apacheds-replication/jdbm-partition/src/test/java/org/apache/directory/server/core/schema:749790-764110
 /directory/apacheds/branches/apacheds-schema/jdbm-partition/src/test/java/org/apache/directory/server/core/schema:806623-810034
+/directory/apacheds/branches/apacheds-subtree/jdbm-partition/src/test/java/org/apache/directory/server/core/schema:965203-965686
 /directory/apacheds/branches/xdbm-refactoring/jdbm-partition/src/test/java/org/apache/directory/server/core/schema:945827-946347
 /directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/schema:498338-580500,806623-894866*

Propchange: directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/schema/PartitionSchemaLoaderTest.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -1,4 +1,5 @@
 /directory/apacheds/branches/apacheds-replication/jdbm-partition/src/test/java/org/apache/directory/server/core/schema/PartitionSchemaLoaderTest.java:749790-764110
 /directory/apacheds/branches/apacheds-schema/jdbm-partition/src/test/java/org/apache/directory/server/core/schema/PartitionSchemaLoaderTest.java:806623-810034
+/directory/apacheds/branches/apacheds-subtree/jdbm-partition/src/test/java/org/apache/directory/server/core/schema/PartitionSchemaLoaderTest.java:965203-965686
 /directory/apacheds/branches/xdbm-refactoring/jdbm-partition/src/test/java/org/apache/directory/server/core/schema/PartitionSchemaLoaderTest.java:945827-946347
 /directory/apacheds/trunk/jdbm-partition/src/test/java/org/apache/directory/server/core/schema/PartitionSchemaLoaderTest.java:498338-580500,806623-894866

Modified: directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/ClientSearchRequestTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/ClientSearchRequestTest.java?rev=965704&r1=965703&r2=965704&view=diff
==============================================================================
--- directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/ClientSearchRequestTest.java (original)
+++ directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/ClientSearchRequestTest.java Tue Jul 20 01:08:19 2010
@@ -42,6 +42,7 @@ import org.apache.directory.server.core.
 import org.apache.directory.server.core.integ.FrameworkRunner;
 import org.apache.directory.shared.ldap.cursor.Cursor;
 import org.apache.directory.shared.ldap.entry.Entry;
+import org.apache.directory.shared.ldap.exception.LdapException;
 import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.message.ResultCodeEnum;
@@ -70,14 +71,22 @@ import org.junit.runner.RunWith;
     "objectClass: top",
     "sn: user1 sn",
     "cn: user1",
-    
+
     // alias to the above entry
     "dn: cn=user1-alias,ou=users,ou=system",
     "objectClass: alias",
     "objectClass: top",
     "objectClass: extensibleObject",
     "aliasedObjectName: cn=user1,ou=users,ou=system",
-    "cn: user1-alias"
+    "cn: user1-alias",
+
+    // Another user
+    "dn: cn=elecharny,ou=users,ou=system",
+    "objectClass: person",
+    "objectClass: top",
+    "sn:: RW1tYW51ZWwgTMOpY2hhcm55",
+    "cn: elecharny"
+    
 })
 public class ClientSearchRequestTest extends AbstractLdapTestUnit
 {
@@ -155,6 +164,7 @@ public class ClientSearchRequestTest ext
             "+" );
         int count = 0;
         SearchResponse searchResponse = null;
+        
         do
         {
             searchResponse = ( SearchResponse ) searchFuture.get( 1000, TimeUnit.MILLISECONDS );
@@ -181,6 +191,7 @@ public class ClientSearchRequestTest ext
             "+" );
         int count = 0;
         SearchResponse searchResponse = null;
+        
         do
         {
             searchResponse = ( SearchResponse ) searchFuture.get( 100000, TimeUnit.MILLISECONDS );
@@ -193,7 +204,7 @@ public class ClientSearchRequestTest ext
         }
         while ( !( searchResponse instanceof SearchResultDone ) );
 
-        assertEquals(2, count );
+        assertEquals( 3, count );
     }
 
     
@@ -208,22 +219,32 @@ public class ClientSearchRequestTest ext
         
         int count = 0;
         Cursor<SearchResponse> cursor = connection.search( searchRequest );
+        
         while( cursor.next() )
         {
             count++;
         }
         
         // due to dereferencing of aliases we get only one entry
-        assertEquals( 1, count );
+        assertEquals( 2, count );
 
         count = 0;
         searchRequest.setDerefAliases( AliasDerefMode.NEVER_DEREF_ALIASES );
         cursor = connection.search( searchRequest );
+        
         while( cursor.next() )
         {
             count++;
         }
         
-        assertEquals( 2, count );
+        assertEquals( 3, count );
+    }
+    
+
+    @Test(expected=LdapException.class)
+    public void testSearchUTF8() throws Exception
+    {
+        connection.search( "ou=system", "(sn=Emmanuel LŽcharny)", SearchScope.ONELEVEL, "*", "+" );
+        fail();
     }
 }

Modified: directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/SearchRequestReturningAttributesTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/SearchRequestReturningAttributesTest.java?rev=965704&r1=965703&r2=965704&view=diff
==============================================================================
--- directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/SearchRequestReturningAttributesTest.java (original)
+++ directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/SearchRequestReturningAttributesTest.java Tue Jul 20 01:08:19 2010
@@ -41,7 +41,6 @@ import org.apache.directory.shared.ldap.
 import org.apache.directory.shared.ldap.name.DN;
 import org.junit.AfterClass;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 

Propchange: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplConsumer.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -1,3 +1,4 @@
 /directory/apacheds/branches/apacheds-replication/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncReplConsumer.java:749790-764110
 /directory/apacheds/branches/apacheds-schema/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncReplConsumer.java:806623-896441
+/directory/apacheds/branches/apacheds-subtree/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplConsumer.java:965203-965686
 /directory/apacheds/branches/xdbm-refactoring/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplConsumer.java:945827-946347

Propchange: directory/apacheds/trunk/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionReader.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -1,3 +1,4 @@
 /directory/apacheds/branches/apacheds-replication/core-annotations/src/main/java/org/apache/directory/server/core/factory/ConfigPartitionReader.java:749790-764110
 /directory/apacheds/branches/apacheds-schema/core-annotations/src/main/java/org/apache/directory/server/core/factory/ConfigPartitionReader.java:806623-896441
+/directory/apacheds/branches/apacheds-subtree/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionReader.java:965203-965686
 /directory/apacheds/branches/xdbm-refactoring/default-config/src/main/java/org/apache/directory/server/config/ConfigPartitionReader.java:945827-946347

Propchange: directory/apacheds/trunk/server-config/src/main/resources/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -3,4 +3,5 @@
 /directory/apacheds/branches/apacheds-replication/default-config/src/main/resources:749790-764110
 /directory/apacheds/branches/apacheds-schema/core-annotations/src/main/resources:806623-896441
 /directory/apacheds/branches/apacheds-schema/default-config/src/main/resources:806623-896441
+/directory/apacheds/branches/apacheds-subtree/server-config/src/main/resources:965203-965686
 /directory/apacheds/branches/xdbm-refactoring/default-config/src/main/resources:945827-946347

Propchange: directory/apacheds/trunk/server-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -1,4 +1,5 @@
 /directory/apacheds/branches/apacheds-replication/core-annotations/src/main/java/org/apache/directory/server/core/factory/CiDITDirectoryServiceFactory.java:749790-764110
 /directory/apacheds/branches/apacheds-schema/core-annotations/src/main/java/org/apache/directory/server/core/factory/CiDITDirectoryServiceFactory.java:806623-896441
+/directory/apacheds/branches/apacheds-subtree/server-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java:965203-965686
 /directory/apacheds/branches/cidit/default-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java:900288-900681
 /directory/apacheds/branches/xdbm-refactoring/default-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java:945827-946347

Propchange: directory/apacheds/trunk/test-framework/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 20 01:08:19 2010
@@ -1,4 +1,5 @@
 /directory/apacheds/branches/apacheds-replication/apacheds-test-framework:749790-764110
 /directory/apacheds/branches/apacheds-replication/test-framework:749790-764110
 /directory/apacheds/branches/apacheds-schema/test-framework:806623-896441
+/directory/apacheds/branches/apacheds-subtree/test-framework:965203-965686
 /directory/apacheds/branches/xdbm-refactoring/test-framework:945827-946347