You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2008/05/26 12:23:11 UTC

svn commit: r660155 - in /harmony/enhanced/classlib/trunk/modules/jndi/src: main/java/org/apache/harmony/jndi/internal/nls/ main/java/org/apache/harmony/jndi/provider/ldap/ test/java/org/apache/harmony/jndi/provider/ldap/

Author: tellison
Date: Mon May 26 03:23:09 2008
New Revision: 660155

URL: http://svn.apache.org/viewvc?rev=660155&view=rev
Log:
Apply patch HARMONY-5842 ([classlib][jndi][ldap] - LdapSchemaContextImpl.rename() and modifyAttributes() doesn't deal with name correctly)

Modified:
    harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/internal/nls/messages.properties
    harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextImpl.java
    harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextTest.java

Modified: harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/internal/nls/messages.properties
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/internal/nls/messages.properties?rev=660155&r1=660154&r2=660155&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/internal/nls/messages.properties (original)
+++ harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/internal/nls/messages.properties Mon May 26 03:23:09 2008
@@ -219,3 +219,5 @@
 ldap.37=Can't delete schema root
 ldap.38=Can't modify schema root
 ldap.39=Can't rename schema
+ldap.3A=Can't rename empty name
+ldap.3B=Can't rename across contexts

Modified: harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextImpl.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextImpl.java?rev=660155&r1=660154&r2=660155&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextImpl.java (original)
+++ harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextImpl.java Mon May 26 03:23:09 2008
@@ -21,6 +21,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import java.util.Map.Entry;
 
 import javax.naming.Binding;
 import javax.naming.CompositeName;
@@ -257,7 +258,7 @@
             // jndi.2E=The name is null
             throw new NullPointerException(Messages.getString("jndi.2E")); //$NON-NLS-1$
         }
-        
+
         if (attributes == null) {
             // jndi.13=Non-null attribute is required for modification
             throw new NullPointerException(Messages.getString("jndi.13")); //$NON-NLS-1$
@@ -283,7 +284,8 @@
         modifyAttributes(name, items);
     }
 
-    // Mapping from DirContext's attribute operation code to server's operation code. 
+    // Mapping from DirContext's attribute operation code to server's operation
+    // code.
     private static final int OperationJndi2Ldap[] = { -1, 0, 2, 1, };
 
     @Override
@@ -291,6 +293,12 @@
             throws NamingException {
         // First get the old schema.
         int size = name.size();
+
+        if (size < 1) {
+            // ldap.38=Can't modify schema root
+            throw new SchemaViolationException(Messages.getString("ldap.38")); //$NON-NLS-1$
+        }
+
         Hashtable<String, Object> subSchemaTree = doLookup(name
                 .getPrefix(size - 1), size - 1);
 
@@ -366,17 +374,41 @@
         ModifyOp op = new ModifyOp(ldapContext.subschemasubentry);
         Name modifySchemaName = name.getPrefix(size - 1).addAll(rdn);
         BasicAttribute schemaEntry = new LdapAttribute(new BasicAttribute(
-                jndi2ldap(modifySchemaName.toString()), schemaLine), ldapContext);
+                jndi2ldap(modifySchemaName.toString()), schemaLine),
+                ldapContext);
         op.addModification(OperationJndi2Ldap[DirContext.REMOVE_ATTRIBUTE],
                 new LdapAttribute(schemaEntry, ldapContext));
         BasicAttribute addSchemaEntry = new LdapAttribute(new BasicAttribute(
-                jndi2ldap(modifySchemaName.toString()), newSchemaLine), ldapContext);
+                jndi2ldap(modifySchemaName.toString()), newSchemaLine),
+                ldapContext);
         op.addModification(OperationJndi2Ldap[DirContext.ADD_ATTRIBUTE],
                 new LdapAttribute(addSchemaEntry, ldapContext));
 
         doBasicOperation(op);
-        subSchemaTree.remove(subSchemaType);
-        subSchemaTree.put(subSchemaType, newSchemaLine);
+
+        // Modify the hashtable to reflect the modification.
+        Object subSchema = subSchemaTree.get(subSchemaType);
+        if (subSchema instanceof String) {
+            subSchemaTree.remove(subSchemaType);
+            subSchemaTree.put(subSchemaType, newSchemaLine);
+        } else {
+            /*
+             * Here we can only change the content of subSchemaTable, instead of
+             * change the reference. Because in other ldapSchemaContext, there
+             * may be reference to this table. And they should also reflect the
+             * changes.
+             */
+            Hashtable<String, Object> subSchemaTable = (Hashtable<String, Object>) subSchema;
+            subSchemaTable.clear();
+            Hashtable<String, Object> parsedTable = SchemaParser
+                    .parseValue(newSchemaLine);
+            Iterator<Entry<String, Object>> it = parsedTable.entrySet()
+                    .iterator();
+            while (it.hasNext()) {
+                Entry<String, Object> entry = it.next();
+                subSchemaTable.put(entry.getKey(), entry.getValue());
+            }
+        }
     }
 
     @Override
@@ -579,14 +611,26 @@
 
     @Override
     public void rename(Name nOld, Name nNew) throws NamingException {
+        if (nOld == null || nNew == null) {
+            throw new NullPointerException();
+        }
+
+        if (nOld.size() == 0 || nNew.size() == 0) {
+            // ldap.3A=Can't rename empty name
+            throw new InvalidNameException(Messages.getString("ldap.3A")); //$NON-NLS-1$
+        }
+
+        if (nOld.size() > 1 || nNew.size() > 1) {
+            // ldap.3B=Can't rename across contexts
+            throw new InvalidNameException(Messages.getString("ldap.3B")); //$NON-NLS-1$
+        }
         // ldap.39=Can't rename schema
         throw new SchemaViolationException(Messages.getString("ldap.39")); //$NON-NLS-1$
     }
 
     @Override
     public void rename(String sOld, String sNew) throws NamingException {
-        // ldap.39=Can't rename schema
-        throw new SchemaViolationException(Messages.getString("ldap.39")); //$NON-NLS-1$
+        rename(new CompositeName(sOld), new CompositeName(sNew));
     }
 
     @Override
@@ -720,7 +764,7 @@
     public NamingEnumeration<SearchResult> search(String name, String filter, SearchControls searchControls) throws NamingException {
         return search(new CompositeName(name), filter, searchControls);
     }
-    
+
     protected DirContext getClassDefinition(Attribute objectclassAttr)
             throws NamingException {
         Hashtable<String, Object> definitionTable = new Hashtable<String, Object>();

Modified: harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextTest.java?rev=660155&r1=660154&r2=660155&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapSchemaContextTest.java Mon May 26 03:23:09 2008
@@ -1105,6 +1105,36 @@
         }
     }
 
+    public void testModifyAttributes_WatchSubSchema() throws NamingException {
+        // Creates the attributes.
+        Attributes attrs = new BasicAttributes(false); // Ignore case
+        attrs.put("NAME", "ListObjectClass");
+        attrs.put("SUP", "top");
+        attrs.put("NUMERICOID", "1.3.6.1.4.1.42.2.27.4.2.3.1.88.77");
+        attrs.put("DESC", "for test");
+        attrs.put("STRUCTURAL", "fds");
+
+        Attribute must = new BasicAttribute("MUST", "cn");
+        must.add("objectclass");
+        attrs.put(must);
+
+        DirContext dir = schema.createSubcontext(new CompositeName(
+                "ClassDefinition/ListObjectClass"), attrs);
+
+        Attributes newAttrs = new BasicAttributes(false);
+        newAttrs.put("NAME", "Modified");
+        newAttrs.put("SUP", "top");
+        newAttrs.put("NUMERICOID", "1.3.6.1.4.1.42.2.27.4.2.3.1.88.77");
+        newAttrs.put("DESC", "for test");
+        newAttrs.put("STRUCTURAL", "fds");
+
+        schema.modifyAttributes("ClassDefinition/ListObjectClass",
+                DirContext.REPLACE_ATTRIBUTE, newAttrs);
+
+        Attributes subSchemaAttrs = dir.getAttributes("");
+        assertEquals("Modified", subSchemaAttrs.get("NAME").get());
+    }
+
     public void testModifyAttributes_Exception() throws NamingException {
         Attributes attrs = new BasicAttributes(true); // Ignore case
         attrs.put("NUMERICOID", "1.3.6.1.4.1.42.2.27.4.2.3.1.88.11");
@@ -1157,6 +1187,21 @@
         } catch (NameNotFoundException e) {
             // Expected.
         }
+
+        try {
+            schema.modifyAttributes("", new ModificationItem[] {});
+            fail("Should throw SchemaViolationException");
+        } catch (SchemaViolationException e) {
+            // expected
+        }
+
+        try {
+            schema.modifyAttributes(new CompositeName(""),
+                    new ModificationItem[] {});
+            fail("Should throw SchemaViolationException");
+        } catch (SchemaViolationException e) {
+            // expected
+        }
     }
 
     public void testCreateAndDeleteSubContext() throws NamingException {
@@ -2075,6 +2120,165 @@
         assertEquals(2, count);
     }
 
+    public void testRename() throws NamingException {
+        Name name1 = new CompositeName("test1");
+        Name name2 = new CompositeName("/");
+        Name invalidName1 = new CompositeName("");
+        try {
+            schema.rename(name1, name2);
+            fail("Should throw SchemaViolationException");
+        } catch (SchemaViolationException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename(invalidName1, name2);
+            fail("Should throw InvalidNameException");
+        } catch (InvalidNameException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename(name2, invalidName1);
+            fail("Should throw InvalidNameException");
+        } catch (InvalidNameException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename("test1", "test2");
+            fail("Should throw SchemaViolationException");
+        } catch (SchemaViolationException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename("", "test2");
+            fail("Should throw InvalidNameException");
+        } catch (InvalidNameException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename("test1", "");
+            fail("Should throw InvalidNameException");
+        } catch (InvalidNameException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename("classdefinition/javaClass", "test");
+            fail("Should throw InvalidNameException");
+        } catch (InvalidNameException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename("classdefinition\\javaClass", "test");
+            fail("Should throw SchemaViolationException");
+        } catch (SchemaViolationException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename(new CompositeName("classdefinition/javaClass"),
+                    new CompositeName("test"));
+            fail("Should throw InvalidNameException");
+        } catch (InvalidNameException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename(new CompositeName("classdefinition\\javaClass"),
+                    new CompositeName("test"));
+            fail("Should throw SchemaViolationException");
+        } catch (SchemaViolationException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename("classdefinition/javaClass", "");
+            fail("Should throw InvalidNameException");
+        } catch (InvalidNameException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename("", "classdefinition/javaClass");
+            fail("Should throw InvalidNameException");
+        } catch (InvalidNameException e) {
+            // Expected.
+        }
+    }
+
+    public void testRename_Exception() throws NamingException {
+        Name name = new CompositeName("test");
+        Name nullName = null;
+        String nullString = null;
+        try {
+            schema.rename(nullName, name);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename(name, nullName);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename(nullName, nullName);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename(nullString, "test");
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename("test", nullString);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename(nullString, nullString);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename("\\", nullString);
+            fail("Should throw InvalidNameException");
+        } catch (InvalidNameException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename("/", nullString);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // Expected.
+        }
+
+        try {
+            schema.rename(null, "");
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // Expected.
+        }
+    }
+
     public void testClassDefinition() throws NamingException {
         MockLdapSchemaContext mockSchema = new MockLdapSchemaContext(context,
                 null, name, schemaTable,