You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2006/01/07 11:27:09 UTC

svn commit: r366701 - in /directory/trunk: apacheds-server-unit/src/test/java/org/apache/ldap/server/ModifyAddTest.java apacheds/src/main/java/org/apache/ldap/server/schema/SchemaService.java

Author: akarasulu
Date: Sat Jan  7 02:27:02 2006
New Revision: 366701

URL: http://svn.apache.org/viewcvs?rev=366701&view=rev
Log:
fixed DIREVE-268 where duplicates in mods are not allowed - added tests and they pass now

Modified:
    directory/trunk/apacheds-server-unit/src/test/java/org/apache/ldap/server/ModifyAddTest.java
    directory/trunk/apacheds/src/main/java/org/apache/ldap/server/schema/SchemaService.java

Modified: directory/trunk/apacheds-server-unit/src/test/java/org/apache/ldap/server/ModifyAddTest.java
URL: http://svn.apache.org/viewcvs/directory/trunk/apacheds-server-unit/src/test/java/org/apache/ldap/server/ModifyAddTest.java?rev=366701&r1=366700&r2=366701&view=diff
==============================================================================
--- directory/trunk/apacheds-server-unit/src/test/java/org/apache/ldap/server/ModifyAddTest.java (original)
+++ directory/trunk/apacheds-server-unit/src/test/java/org/apache/ldap/server/ModifyAddTest.java Sat Jan  7 02:27:02 2006
@@ -24,6 +24,7 @@
 import javax.naming.directory.BasicAttribute;
 import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.DirContext;
+import javax.naming.directory.ModificationItem;
 import javax.naming.ldap.InitialLdapContext;
 import javax.naming.ldap.LdapContext;
 
@@ -200,5 +201,57 @@
         assertNotNull(attr);
         assertTrue(attr.contains(PERSON_DESCRIPTION));
         assertEquals(1, attr.size());
+    }
+
+    /**
+     * Try to add a duplicate attribute value to an entry, where this attribute
+     * is already present (objectclass in this case). Expected behaviour is that
+     * the modify operation causes an error (error code 20, "Attribute or value
+     * exists").
+     * 
+     * @throws NamingException
+     */
+    public void testAddDuplicateValueToExistingAttribute() throws NamingException
+    {
+        // modify object classes, add a new value twice
+        Attribute ocls = new BasicAttribute("objectClass", "organizationalPerson");
+        ModificationItem[] modItems = new ModificationItem[2];
+        modItems[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, ocls);
+        modItems[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, ocls);
+        try {
+            ctx.modifyAttributes(RDN, modItems);
+            fail("Adding a duplicate attribute value should cause an error.");
+        } catch (AttributeInUseException ex) {}
+
+        // Check, whether attribute objectClass is unchanged
+        Attributes attrs = ctx.getAttributes(RDN);
+        ocls = attrs.get("objectClass");
+        assertEquals(ocls.size(), 2);
+        assertTrue(ocls.contains("top"));
+        assertTrue(ocls.contains("person"));
+    }
+
+    /**
+     * Try to add a duplicate attribute value to an entry, where this attribute
+     * is not present. Expected behaviour is that the modify operation causes an
+     * error (error code 20, "Attribute or value exists").
+     * 
+     * @throws NamingException
+     */
+    public void testAddDuplicateValueToNewAttribute() throws NamingException
+    {
+        // add the same description value twice
+        Attribute desc = new BasicAttribute("description", "another description value besides songwriter");
+        ModificationItem[] modItems = new ModificationItem[2];
+        modItems[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, desc);
+        modItems[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, desc);
+        try {
+            ctx.modifyAttributes(RDN, modItems);
+            fail("Adding a duplicate attribute value should cause an error.");
+        } catch (AttributeInUseException ex) {}
+
+        // Check, whether attribute description is still not present
+        Attributes attrs = ctx.getAttributes(RDN);
+        assertEquals( 1, attrs.get("description").size() );
     }
 }

Modified: directory/trunk/apacheds/src/main/java/org/apache/ldap/server/schema/SchemaService.java
URL: http://svn.apache.org/viewcvs/directory/trunk/apacheds/src/main/java/org/apache/ldap/server/schema/SchemaService.java?rev=366701&r1=366700&r2=366701&view=diff
==============================================================================
--- directory/trunk/apacheds/src/main/java/org/apache/ldap/server/schema/SchemaService.java (original)
+++ directory/trunk/apacheds/src/main/java/org/apache/ldap/server/schema/SchemaService.java Sat Jan  7 02:27:02 2006
@@ -47,6 +47,7 @@
 import org.apache.ldap.common.util.DateUtils;
 import org.apache.ldap.common.util.AttributeUtils;
 import org.apache.ldap.common.util.StringTools;
+import org.apache.ldap.common.exception.LdapAttributeInUseException;
 import org.apache.ldap.common.exception.LdapSchemaViolationException;
 import org.apache.ldap.common.exception.LdapInvalidAttributeIdentifierException;
 import org.apache.ldap.common.exception.LdapNoSuchAttributeException;
@@ -559,13 +560,27 @@
     public void modify( NextInterceptor next, Name name, ModificationItem[] mods ) throws NamingException
     {
         Attributes entry = nexus.lookup( name );
-
+        Set modset = new HashSet();
         ModificationItem objectClassMod = null;
+                    
         for ( int ii = 0; ii < mods.length; ii++ )
         {
             if ( mods[ii].getAttribute().getID().equalsIgnoreCase( "objectclass" ) )
             {
                 objectClassMod = mods[ii];
+            }
+            
+            StringBuffer keybuf = new StringBuffer();
+            keybuf.append( mods[ii].getModificationOp() );
+            keybuf.append( mods[ii].getAttribute().getID() );
+            for ( int jj = 0; jj < mods[ii].getAttribute().size(); jj++ )
+            {
+                keybuf.append( mods[ii].getAttribute().get( jj ) );
+            }
+            if ( ! modset.add( keybuf.toString() ) && mods[ii].getModificationOp() == DirContext.ADD_ATTRIBUTE )
+            {
+                throw new LdapAttributeInUseException( "found two copies of the following modification item: " 
+                    + mods[ii] );
             }
         }
         Attribute objectClass;