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 2012/02/22 15:26:22 UTC

svn commit: r1292307 - in /directory: apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/ apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/exception/ apacheds/trunk/core-integ/src/test/java/org/apache/dir...

Author: elecharny
Date: Wed Feb 22 14:26:22 2012
New Revision: 1292307

URL: http://svn.apache.org/viewvc?rev=1292307&view=rev
Log:
Fixed the rename operation : it's now allowed to rename an entry on itself.

Added:
    directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/rename/RenameIT.java
Modified:
    directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/LdapCoreSessionConnection.java
    directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/exception/ExceptionServiceIT.java
    directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/jndi/referral/RenameReferralIT.java
    directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/rename/RenamePerfIT.java
    directory/apacheds/trunk/interceptors/exception/src/main/java/org/apache/directory/server/core/exception/ExceptionInterceptor.java
    directory/apacheds/trunk/interceptors/schema/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java
    directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/entry/DefaultAttribute.java
    directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/ldif/LdifRevertor.java

Modified: directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/LdapCoreSessionConnection.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/LdapCoreSessionConnection.java?rev=1292307&r1=1292306&r2=1292307&view=diff
==============================================================================
--- directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/LdapCoreSessionConnection.java (original)
+++ directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/LdapCoreSessionConnection.java Wed Feb 22 14:26:22 2012
@@ -774,9 +774,9 @@ public class LdapCoreSessionConnection i
             }
             else
             {
-                result.setDiagnosticMessage( "Attempt to move entry onto itself." );
-                result.setResultCode( ResultCodeEnum.ENTRY_ALREADY_EXISTS );
-                result.setMatchedDn( modDnRequest.getName() );
+                // This might be a simple change, we will update the DN and the entry
+                // with the new provided value by using a modify operation later on
+                session.rename( modDnRequest );
             }
 
         }

Modified: directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/exception/ExceptionServiceIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/exception/ExceptionServiceIT.java?rev=1292307&r1=1292306&r2=1292307&view=diff
==============================================================================
--- directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/exception/ExceptionServiceIT.java (original)
+++ directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/exception/ExceptionServiceIT.java Wed Feb 22 14:26:22 2012
@@ -6,16 +6,16 @@
  *  to you under the Apache License, Version 2.0 (the
  *  "License"); you may not use this file except in compliance
  *  with the License.  You may obtain a copy of the License at
- *  
+ * 
  *    http://www.apache.org/licenses/LICENSE-2.0
- *  
+ * 
  *  Unless required by applicable law or agreed to in writing,
  *  software distributed under the License is distributed on an
  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  *  KIND, either express or implied.  See the License for the
  *  specific language governing permissions and limitations
- *  under the License. 
- *  
+ *  under the License.
+ * 
  */
 package org.apache.directory.server.core.exception;
 
@@ -149,25 +149,19 @@ public class ExceptionServiceIT extends 
     {
         LdapConnection connection = getAdminConnection( getService() );
 
-        Entry entry = new DefaultEntry( "ou=users,ou=groups,ou=system" );
-        entry.add( SchemaConstants.OBJECT_CLASS_AT, "OrganizationalUnit" );
-        entry.add( SchemaConstants.OU_AT, "users" );
+        Entry entry = new DefaultEntry( "ou=users,ou=groups,ou=system",
+            "ObjectClass: top",
+            "ObjectClass: OrganizationalUnit",
+            "ou: users" );
 
         connection.add( entry );
 
-        try
-        {
-            connection.rename( entry.getDn(), new Rdn( "ou=users" ) );
-            fail();
-        }
-        catch ( LdapEntryAlreadyExistsException leaee )
-        {
-            assertTrue( true );
-        }
+        connection.rename( entry.getDn(), new Rdn( "ou=users" ) );
 
-        Entry userzEntry = new DefaultEntry( "ou=userz,ou=groups,ou=system" );
-        userzEntry.add( SchemaConstants.OBJECT_CLASS_AT, "OrganizationalUnit" );
-        userzEntry.add( SchemaConstants.OU_AT, "userz" );
+        Entry userzEntry = new DefaultEntry( "ou=userz,ou=groups,ou=system",
+            "ObjectClass: top",
+            "ObjectClass: OrganizationalUnit",
+            "ou: userz" );
 
         connection.add( userzEntry );
 
@@ -238,18 +232,43 @@ public class ExceptionServiceIT extends 
     // ------------------------------------------------------------------------
     // ModifyRdn Operation Tests
     // ------------------------------------------------------------------------
+    /**
+     * Test modifyRdn operation success when the object is renamed in place.
+     *
+     * @throws Exception on error
+     */
+    @Test
+    public void testAllowModifyRdnEntry() throws Exception
+    {
+        LdapConnection connection = getAdminConnection( getService() );
 
+        Entry entry = connection.lookup( "ou=users,ou=system" );
+        
+        assertNotNull( entry );
+        assertEquals( 1, entry.get( "ou" ).size() );
+        assertEquals( "users", entry.get( "ou" ).getString() );
+
+        connection.rename( "ou=users,ou=system", "ou=Users" );
+        
+        entry = connection.lookup( "ou=Users,ou=system" );
+        
+        assertNotNull( entry );
+        assertEquals( 1, entry.get( "ou" ).size() );
+        assertEquals( "Users", entry.get( "ou" ).getString() );
+    }
+
+    
     /**
-     * Test modifyRdn operation failure when the object renamed is non-existant.
+     * Test modifyRdn operation failure when the object renamed is existant.
      *
      * @throws Exception on error
      */
-    @Test(expected = LdapEntryAlreadyExistsException.class)
+    @Test(expected=LdapEntryAlreadyExistsException.class)
     public void testFailModifyRdnEntryAlreadyExists() throws Exception
     {
         LdapConnection connection = getAdminConnection( getService() );
 
-        connection.rename( "ou=users,ou=system", "ou=groups" );
+        connection.rename( "ou=users,ou=system", "ou=Groups" );
     }
 
 

Modified: directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/jndi/referral/RenameReferralIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/jndi/referral/RenameReferralIT.java?rev=1292307&r1=1292306&r2=1292307&view=diff
==============================================================================
--- directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/jndi/referral/RenameReferralIT.java (original)
+++ directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/jndi/referral/RenameReferralIT.java Wed Feb 22 14:26:22 2012
@@ -6,16 +6,16 @@
  *  to you under the Apache License, Version 2.0 (the
  *  "License"); you may not use this file except in compliance
  *  with the License.  You may obtain a copy of the License at
- *  
+ * 
  *    http://www.apache.org/licenses/LICENSE-2.0
- *  
+ * 
  *  Unless required by applicable law or agreed to in writing,
  *  software distributed under the License is distributed on an
  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  *  KIND, either express or implied.  See the License for the
  *  specific language governing permissions and limitations
- *  under the License. 
- *  
+ *  under the License.
+ * 
  */
 package org.apache.directory.server.core.jndi.referral;
 
@@ -53,7 +53,7 @@ import org.junit.runner.RunWith;
 
 
 /**
- * Tests the referral handling functionality for the Modify operation 
+ * Tests the referral handling functionality for the Modify operation
  * within the server's core.
  * 
  * The Move operation is a ModifyDN where the Rdn is changed, not the superior.
@@ -148,7 +148,7 @@ public class RenameReferralIT extends Ab
 
     
     /**
-     * Test a rename of a non existing entry (not a referral), with no referral 
+     * Test a rename of a non existing entry (not a referral), with no referral
      * in its ancestor.
      */
     @Test
@@ -167,7 +167,7 @@ public class RenameReferralIT extends Ab
 
 
     /**
-     * Test a rename of a non existing entry (not a referral), with a referral 
+     * Test a rename of a non existing entry (not a referral), with a referral
      * in its ancestor, using JNDI throw.
      */
     @Test
@@ -185,7 +185,7 @@ public class RenameReferralIT extends Ab
             Set<String> expectedRefs = new HashSet<String>();
             expectedRefs.add( "ldap://hostd/cn=Emmanuel%20Lecharny,ou=apache,ou=Roles,dc=apache,dc=org" );
             
-            do 
+            do
             {
                 String ref = (String)re.getReferralInfo();
                 
@@ -200,7 +200,7 @@ public class RenameReferralIT extends Ab
 
 
     /**
-     * Test a rename of a non existing entry (not a referral), with a referral 
+     * Test a rename of a non existing entry (not a referral), with a referral
      * in its ancestor, using the Core API without the ManageDsaIT flag.
      */
     @Test
@@ -221,9 +221,9 @@ public class RenameReferralIT extends Ab
             Set<String> expectedRefs = new HashSet<String>();
             expectedRefs.add( "ldap://hostd/cn=Emmanuel%20Lecharny,ou=apache,ou=Roles,dc=apache,dc=org" );
             
-            do 
+            do
             {
-                String ref = (String)re.getReferralInfo();
+                String ref = re.getReferralInfo();
                 
                 assertTrue( expectedRefs.contains( ref ) );
                 nbRefs ++;
@@ -236,7 +236,7 @@ public class RenameReferralIT extends Ab
 
 
     /**
-     * Test a rename of an existing entry (not a referral), with no referral 
+     * Test a rename of an existing entry (not a referral), with no referral
      * in its ancestor.
      */
     @Test
@@ -278,7 +278,7 @@ public class RenameReferralIT extends Ab
 
 
     /**
-     * Test a rename of an existing referral, using JNDI throw. 
+     * Test a rename of an existing referral, using JNDI throw.
      */
     @Test
     public void testRenameExistingReferralJNDIThrow() throws Exception
@@ -295,7 +295,7 @@ public class RenameReferralIT extends Ab
             Set<String> expectedRefs = new HashSet<String>();
             expectedRefs.add( "ldap://hostd/ou=Roles,dc=apache,dc=org" );
             
-            do 
+            do
             {
                 String ref = (String)re.getReferralInfo();
                 
@@ -310,8 +310,8 @@ public class RenameReferralIT extends Ab
 
 
     /**
-     * Test a rename of an existing referral, using the Core API without 
-     * the ManageDsaIt flag. 
+     * Test a rename of an existing referral, using the Core API without
+     * the ManageDsaIt flag.
      */
     @Test
     public void testRenameExistingReferralCoreApiWithoutManageDsaIt() throws Exception
@@ -331,9 +331,9 @@ public class RenameReferralIT extends Ab
             Set<String> expectedRefs = new HashSet<String>();
             expectedRefs.add( "ldap://hostd/ou=Roles,dc=apache,dc=org" );
             
-            do 
+            do
             {
-                String ref = (String)re.getReferralInfo();
+                String ref = re.getReferralInfo();
                 
                 assertTrue( expectedRefs.contains( ref ) );
                 nbRefs ++;
@@ -382,7 +382,7 @@ public class RenameReferralIT extends Ab
             Set<String> expectedRefs = new HashSet<String>();
             expectedRefs.add( "ldap://hostd/ou=Roles,dc=apache,dc=org" );
             
-            do 
+            do
             {
                 String ref = (String)re.getReferralInfo();
                 
@@ -418,9 +418,9 @@ public class RenameReferralIT extends Ab
             Set<String> expectedRefs = new HashSet<String>();
             expectedRefs.add( "ldap://hostd/ou=Roles,dc=apache,dc=org" );
             
-            do 
+            do
             {
-                String ref = (String)re.getReferralInfo();
+                String ref = re.getReferralInfo();
                 
                 assertTrue( expectedRefs.contains( ref ) );
                 nbRefs ++;

Added: directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/rename/RenameIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/rename/RenameIT.java?rev=1292307&view=auto
==============================================================================
--- directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/rename/RenameIT.java (added)
+++ directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/rename/RenameIT.java Wed Feb 22 14:26:22 2012
@@ -0,0 +1,117 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.directory.server.core.operations.rename;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.directory.ldap.client.api.LdapConnection;
+import org.apache.directory.server.core.annotations.ContextEntry;
+import org.apache.directory.server.core.annotations.CreateDS;
+import org.apache.directory.server.core.annotations.CreateIndex;
+import org.apache.directory.server.core.annotations.CreatePartition;
+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.model.entry.Attribute;
+import org.apache.directory.shared.ldap.model.entry.DefaultEntry;
+import org.apache.directory.shared.ldap.model.entry.Entry;
+import org.apache.directory.shared.ldap.model.entry.Value;
+import org.apache.directory.shared.ldap.model.name.Dn;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test the rename operation performances
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+@RunWith(FrameworkRunner.class)
+@CreateDS(name = "RenamePerfDS",
+    partitions =
+    {
+        @CreatePartition(
+            name = "example",
+            suffix = "dc=example,dc=com",
+            contextEntry =
+                @ContextEntry(
+                    entryLdif =
+                        "dn: dc=example,dc=com\n" +
+                        "dc: example\n" +
+                        "objectClass: top\n" +
+                        "objectClass: domain\n\n"),
+            indexes =
+            {
+                @CreateIndex(attribute = "objectClass"),
+                @CreateIndex(attribute = "sn"),
+                @CreateIndex(attribute = "cn")
+            })
+    },
+    enableChangeLog = true)
+public class RenameIT extends AbstractLdapTestUnit
+{
+    @Test
+    public void testRenameUperCaseRdn() throws Exception
+    {
+        LdapConnection connection = IntegrationUtils.getAdminConnection( getService() );
+
+        String oldDn = "cn=test,ou=system";
+
+        Dn dn = new Dn( oldDn );
+        Entry entry = new DefaultEntry( getService().getSchemaManager(), dn,
+            "ObjectClass: top",
+            "ObjectClass: person",
+            "sn: TEST",
+            "cn: test0" );
+
+        connection.add( entry );
+        
+        Entry original = connection.lookup( oldDn );
+        
+        assertNotNull( original );
+
+        connection.rename( oldDn, "cn=TEST" );
+        
+        Entry renamed = connection.lookup( oldDn );
+        
+        assertNotNull( renamed );
+        assertEquals( original.getDn(), renamed.getDn() );
+        Attribute attribute = renamed.get( "cn" );
+        Set<String> expected = new HashSet<String>();
+        expected.add( "test0" );
+        expected.add( "TEST" );
+        int found = 0;
+        
+        for ( Value<?> value : attribute )
+        {
+            String val = value.getString();
+            
+            assertTrue( expected.contains( val ) );
+            found++;
+        }
+        
+        assertEquals( 2, found );
+    }
+}

Modified: directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/rename/RenamePerfIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/rename/RenamePerfIT.java?rev=1292307&r1=1292306&r2=1292307&view=diff
==============================================================================
--- directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/rename/RenamePerfIT.java (original)
+++ directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/rename/RenamePerfIT.java Wed Feb 22 14:26:22 2012
@@ -28,9 +28,7 @@ import org.apache.directory.server.core.
 import org.apache.directory.server.core.integ.FrameworkRunner;
 import org.apache.directory.server.core.integ.IntegrationUtils;
 import org.apache.directory.shared.ldap.model.entry.DefaultEntry;
-import org.apache.directory.shared.ldap.model.entry.DefaultModification;
 import org.apache.directory.shared.ldap.model.entry.Entry;
-import org.apache.directory.shared.ldap.model.entry.ModificationOperation;
 import org.apache.directory.shared.ldap.model.name.Dn;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -119,31 +117,4 @@ public class RenamePerfIT extends Abstra
         System.out.println( "Delta : " + deltaWarmed + "( " + ( ( ( nbIterations - 5000 ) * 1000 ) / deltaWarmed ) + " per s ) /" + ( t1 - t0 ) );
         connection.close();
     }
-
-    
-    @Test
-    public void testRenameUperCase() throws Exception
-    {
-        LdapConnection connection = IntegrationUtils.getAdminConnection( getService() );
-
-        String oldDn = "cn=test,ou=system";
-
-        Dn dn = new Dn( oldDn );
-        Entry entry = new DefaultEntry( getService().getSchemaManager(), dn );
-        entry.add( "ObjectClass", "top", "person" );
-        entry.add( "sn", "TEST" );
-        entry.add( "cn", "test0" );
-
-        connection.add( entry );
-        
-        Entry original = connection.lookup( oldDn );
-        
-        System.out.println( "Original : " + original );
-
-        connection.modify( oldDn, new DefaultModification( ModificationOperation.REPLACE_ATTRIBUTE, "cn", "TEST" ) );
-        
-        Entry renamed = connection.lookup( oldDn );
-        
-        System.out.println( "Renamed : " + renamed );
-    }
 }

Modified: directory/apacheds/trunk/interceptors/exception/src/main/java/org/apache/directory/server/core/exception/ExceptionInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/interceptors/exception/src/main/java/org/apache/directory/server/core/exception/ExceptionInterceptor.java?rev=1292307&r1=1292306&r2=1292307&view=diff
==============================================================================
--- directory/apacheds/trunk/interceptors/exception/src/main/java/org/apache/directory/server/core/exception/ExceptionInterceptor.java (original)
+++ directory/apacheds/trunk/interceptors/exception/src/main/java/org/apache/directory/server/core/exception/ExceptionInterceptor.java Wed Feb 22 14:26:22 2012
@@ -370,10 +370,16 @@ public class ExceptionInterceptor extend
 
         if ( nexus.hasEntry( new HasEntryOperationContext( renameContext.getSession(), newDn ) ) )
         {
-            LdapEntryAlreadyExistsException e;
-            e = new LdapEntryAlreadyExistsException( I18n.err( I18n.ERR_250_ENTRY_ALREADY_EXISTS, newDn.getName() ) );
-            //e.setResolvedName( DNFactory.create( newDn.getName() ) );
-            throw e;
+            // Ok, the target entry already exists.
+            // If the target entry has the same name than the modified entry, it's a rename on itself,
+            // we want to allow this.
+            if ( !newDn.equals( dn ) )
+            {
+                LdapEntryAlreadyExistsException e;
+                e = new LdapEntryAlreadyExistsException( I18n.err( I18n.ERR_250_ENTRY_ALREADY_EXISTS, newDn.getName() ) );
+                //e.setResolvedName( DNFactory.create( newDn.getName() ) );
+                throw e;
+            }
         }
 
         // Remove the previous entry from the notAnAlias cache

Modified: directory/apacheds/trunk/interceptors/schema/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/interceptors/schema/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java?rev=1292307&r1=1292306&r2=1292307&view=diff
==============================================================================
--- directory/apacheds/trunk/interceptors/schema/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java (original)
+++ directory/apacheds/trunk/interceptors/schema/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java Wed Feb 22 14:26:22 2012
@@ -1438,10 +1438,7 @@ public class SchemaInterceptor extends B
         {
             AttributeType type = schemaManager.lookupAttributeTypeRegistry( atav.getType() );
 
-            if ( !entry.contains( type, atav.getNormValue() ) )
-            {
-                entry.add( new DefaultAttribute( type, atav.getValue() ) );
-            }
+            entry.add( new DefaultAttribute( type, atav.getValue() ) );
         }
 
         // Substitute the Rdn and check if the new entry is correct

Modified: directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/entry/DefaultAttribute.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/entry/DefaultAttribute.java?rev=1292307&r1=1292306&r2=1292307&view=diff
==============================================================================
--- directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/entry/DefaultAttribute.java (original)
+++ directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/entry/DefaultAttribute.java Wed Feb 22 14:26:22 2012
@@ -62,7 +62,7 @@ public class DefaultAttribute implements
     /** The normalized ID (will be the OID if we have a AttributeType) */
     private String id;
 
-    /** Tells if the attribute is Human Readable or not. When not set, 
+    /** Tells if the attribute is Human Readable or not. When not set,
      * this flag is null. */
     private Boolean isHR;
 
@@ -425,12 +425,12 @@ public class DefaultAttribute implements
      * If the initial Attribute is not schema aware, the copy will be if the attributeType
      * argument is not null.
      *
-     * @param attributeType The attribute's type 
+     * @param attributeType The attribute's type
      * @param attribute The attribute to be copied
      */
     public DefaultAttribute( AttributeType attributeType, Attribute attribute ) throws LdapException
     {
-        // Copy the common values. isHR is only available on a ServerAttribute 
+        // Copy the common values. isHR is only available on a ServerAttribute
         this.attributeType = attributeType;
         this.id = attribute.getId();
         this.upId = attribute.getUpId();
@@ -767,7 +767,13 @@ public class DefaultAttribute implements
                                 stringValue.apply( attributeType );
                             }
 
-                            if ( values.add( val ) )
+                            if ( values.contains( val ) )
+                            {
+                                // Replace the value
+                                values.remove( val );
+                                values.add( val );
+                            }
+                            else if ( values.add( val ) )
                             {
                                 nbAdded++;
                             }
@@ -847,11 +853,11 @@ public class DefaultAttribute implements
             {
                 if ( val == null )
                 {
-                    // We have a null value. If the HR flag is not set, we will consider 
+                    // We have a null value. If the HR flag is not set, we will consider
                     // that the attribute is not HR. We may change this later
                     if ( isHR == null )
                     {
-                        // This is the first value. Add both types, as we 
+                        // This is the first value. Add both types, as we
                         // don't know yet the attribute type's, but we may
                         // know later if we add some new value.
                         // We have to do that because we are using a Set,
@@ -869,7 +875,7 @@ public class DefaultAttribute implements
                         // The attribute type is binary.
                         nullBinaryValue = new BinaryValue( ( byte[] ) null );
 
-                        // Don't add a value if it already exists. 
+                        // Don't add a value if it already exists.
                         if ( !values.contains( nullBinaryValue ) )
                         {
                             values.add( nullBinaryValue );
@@ -882,7 +888,7 @@ public class DefaultAttribute implements
                         // The attribute is HR
                         nullStringValue = new StringValue( ( String ) null );
 
-                        // Don't add a value if it already exists. 
+                        // Don't add a value if it already exists.
                         if ( !values.contains( nullStringValue ) )
                         {
                             values.add( nullStringValue );
@@ -891,7 +897,7 @@ public class DefaultAttribute implements
                 }
                 else
                 {
-                    // Let's check the value type. 
+                    // Let's check the value type.
                     if ( val instanceof StringValue )
                     {
                         // We have a String value
@@ -960,7 +966,7 @@ public class DefaultAttribute implements
             }
         }
 
-        // Last, not least, if a nullValue has been added, and if other 
+        // Last, not least, if a nullValue has been added, and if other
         // values are all String, we have to keep the correct nullValue,
         // and to remove the other
         if ( nullValueAdded )
@@ -1244,7 +1250,7 @@ public class DefaultAttribute implements
         }
         else
         {
-            // Iterate through all the values, and quit if we 
+            // Iterate through all the values, and quit if we
             // don't find one in the values. We have to separate the check
             // depending on the isHR flag value.
             if ( isHR )
@@ -1335,9 +1341,9 @@ public class DefaultAttribute implements
             }
             else
             {
-                // As the attribute type is binary, we have to convert 
+                // As the attribute type is binary, we have to convert
                 // the values before checking for them in the values
-                // Iterate through all the values, and quit if we 
+                // Iterate through all the values, and quit if we
                 // don't find one in the values
                 for ( String val : vals )
                 {
@@ -1354,7 +1360,7 @@ public class DefaultAttribute implements
         {
             if ( isHR )
             {
-                // Iterate through all the values, and quit if we 
+                // Iterate through all the values, and quit if we
                 // don't find one in the values
                 for ( String val : vals )
                 {
@@ -1400,7 +1406,7 @@ public class DefaultAttribute implements
         {
             if ( !isHR )
             {
-                // Iterate through all the values, and quit if we 
+                // Iterate through all the values, and quit if we
                 // don't find one in the values
                 for ( byte[] val : vals )
                 {
@@ -1412,9 +1418,9 @@ public class DefaultAttribute implements
             }
             else
             {
-                // As the attribute type is String, we have to convert 
+                // As the attribute type is String, we have to convert
                 // the values before checking for them in the values
-                // Iterate through all the values, and quit if we 
+                // Iterate through all the values, and quit if we
                 // don't find one in the values
                 for ( byte[] val : vals )
                 {
@@ -1431,7 +1437,7 @@ public class DefaultAttribute implements
         {
             if ( !isHR )
             {
-                // Iterate through all the values, and quit if we 
+                // Iterate through all the values, and quit if we
                 // don't find one in the values
                 for ( byte[] val : vals )
                 {
@@ -1819,11 +1825,11 @@ public class DefaultAttribute implements
 
 
     /**
-     * The hashCode is based on the id, the isHR flag and 
+     * The hashCode is based on the id, the isHR flag and
      * on the internal values.
-     *  
+     * 
      * @see Object#hashCode()
-     * @return the instance's hashcode 
+     * @return the instance's hashcode
      */
     public int hashCode()
     {
@@ -1936,7 +1942,7 @@ public class DefaultAttribute implements
 
 
     /**
-     * @see Object#toString() 
+     * @see Object#toString()
      */
     public String toString()
     {
@@ -1971,7 +1977,7 @@ public class DefaultAttribute implements
 
     /**
      * This is the place where we serialize attributes, and all theirs
-     * elements. 
+     * elements.
      * 
      * {@inheritDoc}
      */

Modified: directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/ldif/LdifRevertor.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/ldif/LdifRevertor.java?rev=1292307&r1=1292306&r2=1292307&view=diff
==============================================================================
--- directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/ldif/LdifRevertor.java (original)
+++ directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/ldif/LdifRevertor.java Wed Feb 22 14:26:22 2012
@@ -475,14 +475,6 @@ public final class LdifRevertor
         if ( newRdn.size() == 1 )
         {
             // We have a simple new Rdn, something like A=a
-            if ( ( oldRdn.size() == 1 ) && ( oldRdn.equals( newRdn ) ) )
-            {
-                // We have a simple old Rdn, something like A=a
-                // If the values overlap, we can't rename the entry, just get out
-                // with an error
-                throw new LdapInvalidDnException( I18n.err( I18n.ERR_12080 ) );
-            }
-
             reverted = revertEntry( entry, newDn, newSuperior, oldRdn, newRdn );
 
             entries.add( reverted );