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 2009/08/10 20:25:38 UTC

svn commit: r802884 - /directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java

Author: elecharny
Date: Mon Aug 10 18:25:38 2009
New Revision: 802884

URL: http://svn.apache.org/viewvc?rev=802884&view=rev
Log:
Hack added to deal with removal of not existing values

Modified:
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java?rev=802884&r1=802883&r2=802884&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java Mon Aug 10 18:25:38 2009
@@ -1240,6 +1240,9 @@
             // Get the entry we already read at the beginning
             entry = opContext.getEntry();
         }
+        
+        boolean schemaModification = name.startsWith( schemaBaseDN );
+        boolean subSchemaModification = subschemaSubentryDnNorm.equals( name.getNormName() );
 
         // First, we get the entry from the backend. If it does not exist, then we throw an exception
         ServerEntry targetEntry = (ServerEntry)SchemaUtils.getTargetEntry( mods , entry );
@@ -1310,7 +1313,7 @@
         else
         {
             objectClass = getResultantObjectClasses( objectClassMod.getOperation(), objectClassMod.getAttribute(),
-                tmpEntry.get( SchemaConstants.OBJECT_CLASS_AT ) );
+                tmpEntry.get( SchemaConstants.OBJECT_CLASS_AT ).clone() );
         }
 
         ObjectClassRegistry ocRegistry = this.registries.getObjectClassRegistry();
@@ -1409,7 +1412,15 @@
                         // And inject back the values except the ones to remove
                         for ( Value<?> value : change )
                         {
-                            modified.remove( value );
+                            if ( modified.contains( value ) )
+                            {
+                                modified.remove( value );
+                            }
+                            else if ( !subSchemaModification )
+                            {
+                                // We are trying to remove an not existing value : error
+                                throw new LdapNoSuchAttributeException( "Value " + value + " does not exist in the " + modified + " AT" );
+                            }
                         }
 
                         // ok, done. Last check : if the attribute does not content any more value;
@@ -1518,14 +1529,14 @@
             }
         }
 
-        if ( name.startsWith( schemaBaseDN ) )
+        if ( schemaModification )
         {
             LOG.debug( "Modification attempt on schema partition {}: \n{}", name, opContext );
 
             schemaManager.modify( opContext, entry, targetEntry, opContext
                 .hasRequestControl( CascadeControl.CONTROL_OID ) );
         }
-        else if ( subschemaSubentryDnNorm.equals( name.getNormName() ) )
+        else if ( subSchemaModification )
         {
             LOG.debug( "Modification attempt on schema subentry {}: \n{}", name, opContext );