You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by qi...@apache.org on 2008/05/27 09:18:29 UTC

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

Author: qiuxx
Date: Tue May 27 00:18:29 2008
New Revision: 660412

URL: http://svn.apache.org/viewvc?rev=660412&view=rev
Log:
Apply patch for HARMONY-5841, ([classlib][jndi][ldap] - add support for property java.naming.ldap.attributes.binary)

Modified:
    harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapAttribute.java
    harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapContextImpl.java
    harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSearchResult.java
    harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/SearchOp.java
    harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapAttributeTest.java
    harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapContextServerMockedTest.java

Modified: harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapAttribute.java?rev=660412&r1=660411&r2=660412&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapAttribute.java (original)
+++ harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapAttribute.java Tue May 27 00:18:29 2008
@@ -20,7 +20,9 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Vector;
 
 import javax.naming.NameNotFoundException;
 import javax.naming.NamingEnumeration;
@@ -44,29 +46,24 @@
 
     private static final long serialVersionUID = -6492847268062616321L;
 
-    /**
-     * whether the value of attribute is binary
-     */
-    private boolean isBinary;
-
     private LdapContextImpl context = null;
 
     private static HashSet<String> BINARY_ATTRIBUTE = new HashSet<String>();
     static {
-        BINARY_ATTRIBUTE.add("photo");
-        BINARY_ATTRIBUTE.add("personalSignature");
-        BINARY_ATTRIBUTE.add("audio");
-        BINARY_ATTRIBUTE.add("jpegPhoto");
-        BINARY_ATTRIBUTE.add("javaSerializedData");
-        BINARY_ATTRIBUTE.add("thumbnailPhoto");
-        BINARY_ATTRIBUTE.add("thumbnailLogo");
-        BINARY_ATTRIBUTE.add("userPassword");
-        BINARY_ATTRIBUTE.add("userCertificate");
-        BINARY_ATTRIBUTE.add("cACertificate");
-        BINARY_ATTRIBUTE.add("authorityRevocationList");
-        BINARY_ATTRIBUTE.add("certificateRevocationList");
-        BINARY_ATTRIBUTE.add("crossCertificatePair");
-        BINARY_ATTRIBUTE.add("x500UniqueIdentifier");
+        BINARY_ATTRIBUTE.add("photo".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("personalSignature".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("audio".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("jpegPhoto".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("javaSerializedData".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("thumbnailPhoto".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("thumbnailLogo".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("userPassword".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("userCertificate".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("cACertificate".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("authorityRevocationList".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("certificateRevocationList".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("crossCertificatePair".toLowerCase()); //$NON-NLS-1$
+        BINARY_ATTRIBUTE.add("x500UniqueIdentifier".toLowerCase()); //$NON-NLS-1$
     }
 
     /**
@@ -79,7 +76,6 @@
 
     public LdapAttribute(String id, LdapContextImpl ctx) {
         super(id, false);
-        isBinary = isBinary(id);
         context = ctx;
     }
 
@@ -94,9 +90,9 @@
      *            may never be <code>null</code>
      * @throws NamingException
      */
-    public LdapAttribute(Attribute attr, LdapContextImpl ctx) throws NamingException {
+    public LdapAttribute(Attribute attr, LdapContextImpl ctx)
+            throws NamingException {
         super(attr.getID(), attr.isOrdered());
-        isBinary = isBinary(getID());
         NamingEnumeration<?> enu = attr.getAll();
         while (enu.hasMore()) {
             Object value = enu.next();
@@ -109,19 +105,10 @@
     public void decodeValues(Object[] vs) {
         byte[] type = (byte[]) vs[0];
         attrID = Utils.getString(type);
-        isBinary = isBinary(attrID);
         Collection<byte[]> list = (Collection<byte[]>) vs[1];
-        // FIXME: deal with java.naming.ldap.attributes.binary
-        if (!isBinary) {
-            for (byte[] bs : list) {
-                add(Utils.getString(bs));
-            }
-        } else {
-            for (byte[] bs : list) {
-                add(bs);
-            }
+        for (byte[] bs : list) {
+            add(bs);
         }
-
     }
 
     public void encodeValues(Object[] vs) {
@@ -130,7 +117,7 @@
         List<Object> list = new ArrayList<Object>(this.values.size());
 
         for (Object object : this.values) {
-            if (!isBinary && object instanceof String) {
+            if (object instanceof String) {
                 String str = (String) object;
                 object = Utils.getBytes(str);
             }
@@ -173,7 +160,35 @@
 
     }
 
-    private static boolean isBinary(String name) {
-        return BINARY_ATTRIBUTE.contains(name) || name.endsWith(";binary");
+    public void convertValueToString() {
+        // values can't be null
+        if (values.size() == 0) {
+            return;
+        }
+
+        Vector<Object> newValues = new Vector<Object>(values.size());
+        for (Iterator<Object> iter = values.iterator(); iter.hasNext();) {
+            Object value = iter.next();
+            newValues.add(Utils.getString(value));
+        }
+
+        values.clear();
+        values = newValues;
+    }
+
+    public static boolean isBinary(String name, String[] attrs) {
+        if (BINARY_ATTRIBUTE.contains(name.toLowerCase())
+                || name.endsWith(";binary")) { //$NON-NLS-1$
+            return true;
+        }
+
+        if (attrs != null) {
+            for (int i = 0; i < attrs.length; i++) {
+                if (name.equalsIgnoreCase(attrs[i])) {
+                    return true;
+                }
+            }
+        }
+        return false;
     }
 }

Modified: harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapContextImpl.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapContextImpl.java?rev=660412&r1=660411&r2=660412&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapContextImpl.java (original)
+++ harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapContextImpl.java Tue May 27 00:18:29 2008
@@ -143,6 +143,8 @@
 
     private List<UnsolicitedNotificationListener> unls;
 
+    private String[] binaryAttributes;
+
     private static final Control NON_CRITICAL_MANAGE_REF_CONTROL = new ManageReferralControl(
             Control.NONCRITICAL);
 
@@ -154,6 +156,8 @@
 
     private static final String LDAP_TYPES_ONLY = "java.naming.ldap.typesOnly"; //$NON-NLS-1$
 
+    private static final String LDAP_ATTRIBUTES_BINARY = "java.naming.ldap.attributes.binary"; //$NON-NLS-1$
+
     /**
      * Some properties, such as 'java.naming.security.authentication', changed
      * by <code>Context.addToEnvironment</code> or
@@ -1256,6 +1260,8 @@
             }
         }
 
+        op.getSearchResult().setBinaryAttributes(binaryAttributes);
+
         LdapMessage message = null;
         try {
             message = client.doOperation(op, requestControls);
@@ -1415,6 +1421,11 @@
             isReBind = true;
         }
 
+        if (s.equals(LDAP_ATTRIBUTES_BINARY)) {
+            String value = (String) o;
+            StringTokenizer st = new StringTokenizer(value.trim());
+            binaryAttributes = value.trim().split(" ");
+        }
         return preValue;
     }
 
@@ -1966,6 +1977,10 @@
             isReBind = true;
         }
 
+        if (s.equals(LDAP_ATTRIBUTES_BINARY)) {
+            binaryAttributes = null;
+        }
+
         return preValue;
     }
 

Modified: harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSearchResult.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSearchResult.java?rev=660412&r1=660411&r2=660412&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSearchResult.java (original)
+++ harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/LdapSearchResult.java Tue May 27 00:18:29 2008
@@ -49,6 +49,8 @@
 
     private String address;
 
+    private String[] binaryAttributes;
+
     public String getAddress() {
 		return address;
 	}
@@ -109,6 +111,9 @@
         for (Object[] objects : list) {
             LdapAttribute attr = new LdapAttribute();
             attr.decodeValues(objects);
+            if (!LdapAttribute.isBinary(attr.getID(), binaryAttributes)) {
+                attr.convertValueToString();
+            }
             attrs.put(attr);
         }
     }
@@ -140,4 +145,13 @@
     public void setRefURLs(List<String> refURLs) {
         this.refURLs = refURLs;
     }
+
+    public String[] getBinaryAttributes() {
+        return binaryAttributes;
+    }
+
+    public void setBinaryAttributes(String[] binaryAttributes) {
+        this.binaryAttributes = binaryAttributes;
+    }
+
 }

Modified: harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/SearchOp.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/SearchOp.java?rev=660412&r1=660411&r2=660412&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/SearchOp.java (original)
+++ harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/ldap/SearchOp.java Tue May 27 00:18:29 2008
@@ -44,6 +44,9 @@
     private LdapSearchResult result;
 
     public LdapSearchResult getSearchResult() {
+        if (result == null) {
+            result = new LdapSearchResult();
+        }
         return result;
     }
 

Modified: harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapAttributeTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapAttributeTest.java?rev=660412&r1=660411&r2=660412&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapAttributeTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapAttributeTest.java Tue May 27 00:18:29 2008
@@ -81,10 +81,19 @@
         id = "cn";
         values = new Object[] { Utils.getBytes(id), valueList };
         la = new LdapAttribute();
-        // 'cn' is not binary attribute, should return string value
+        /*
+         * 'cn' is not binary attribute, but LdapAttribute.decodeValues()
+         * doesn't convert values to string, must call convertValueToString() to
+         * do it.
+         */
         la.decodeValues(values);
 
         for (int i = 0; i < la.size(); ++i) {
+            assertTrue(la.get() instanceof byte[]);
+        }
+
+        la.convertValueToString();
+        for (int i = 0; i < la.size(); ++i) {
             assertTrue(la.get() instanceof String);
         }
 
@@ -98,4 +107,41 @@
             assertTrue(la.get() instanceof byte[]);
         }
     }
+
+    public void test_isBinary() {
+        assertTrue(LdapAttribute.isBinary("photo", null));
+        assertTrue(LdapAttribute.isBinary("Photo", null));
+        assertTrue(LdapAttribute.isBinary("photo", new String[0]));
+        assertTrue(LdapAttribute.isBinary("cn;binary", null));
+        assertTrue(LdapAttribute.isBinary("cn;binary", new String[0]));
+
+        assertFalse(LdapAttribute.isBinary("cn", null));
+        assertFalse(LdapAttribute.isBinary("cn",
+                new String[] { "ou", "person" }));
+        assertTrue(LdapAttribute.isBinary("cn", new String[] { "ou", "person",
+                "cn" }));
+        assertTrue(LdapAttribute.isBinary("cn", new String[] { "ou", "person",
+                "Cn" }));
+    }
+
+    public void test_convertValueToString() throws Exception {
+        LdapAttribute attr = new LdapAttribute();
+
+        // do nothing
+        attr.convertValueToString();
+
+        BasicAttribute basicAttribute = new BasicAttribute("cn");
+        attr = new LdapAttribute(basicAttribute, null);
+
+        // do nothing
+        attr.convertValueToString();
+        attr.add(Utils.getBytes("test"));
+        attr.add(Utils.getBytes("binary"));
+
+        attr.convertValueToString();
+
+        assertEquals(2, attr.size());
+        assertEquals("test", attr.get(0));
+        assertEquals("binary", attr.get(1));
+    }
 }

Modified: harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapContextServerMockedTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapContextServerMockedTest.java?rev=660412&r1=660411&r2=660412&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapContextServerMockedTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/jndi/src/test/java/org/apache/harmony/jndi/provider/ldap/LdapContextServerMockedTest.java Tue May 27 00:18:29 2008
@@ -363,7 +363,7 @@
                         new EncodableLdapResult(), null) });
 
         context.search("cn=test", null);
-        
+
     }
 
     public void testReferralFollow() throws Exception {
@@ -446,6 +446,43 @@
 
     }
 
+    public void testAddToEnvironment_binaryAttributeProp() throws Exception {
+        server.setResponseSeq(new LdapMessage[] { new LdapMessage(
+                LdapASN1Constant.OP_BIND_RESPONSE, new BindResponse(), null) });
+
+        assertNull(env.get(Context.REFERRAL));
+
+        InitialDirContext initialDirContext = new InitialDirContext(env);
+
+        initialDirContext.addToEnvironment(
+                "java.naming.ldap.attributes.binary", "cn");
+        assertEquals("cn", initialDirContext.getEnvironment().get(
+                "java.naming.ldap.attributes.binary"));
+
+        initialDirContext.addToEnvironment(
+                "java.naming.ldap.attributes.binary", "cn ou");
+        assertEquals("cn ou", initialDirContext.getEnvironment().get(
+                "java.naming.ldap.attributes.binary"));
+
+        initialDirContext.addToEnvironment(
+                "java.naming.ldap.attributes.binary", " cn ");
+        assertEquals(" cn ", initialDirContext.getEnvironment().get(
+                "java.naming.ldap.attributes.binary"));
+
+        initialDirContext.addToEnvironment(
+                "java.naming.ldap.attributes.binary", " cn ou ");
+        assertEquals(" cn ou ", initialDirContext.getEnvironment().get(
+                "java.naming.ldap.attributes.binary"));
+
+        try {
+            initialDirContext.addToEnvironment(
+                    "java.naming.ldap.attributes.binary", new Object());
+            fail("Should throw ClassCastException");
+        } catch (ClassCastException e) {
+            // expected
+        }
+    }
+
     public void testReconnect() throws Exception {
         Control[] expected = new Control[] { new PagedResultsControl(10,
                 Control.NONCRITICAL) };
@@ -527,6 +564,12 @@
         another.reconnect(null);
     }
 
+    /*
+     * This test would block on RI, that because of difference of inner
+     * implementation between RI and Harmony, It's hard to emulate using
+     * MockServer. If run in real environment, the test will pass both on RI and
+     * Harmony.
+     */
     public void testFederation() throws Exception {
         server.setResponseSeq(new LdapMessage[] { new LdapMessage(
                 LdapASN1Constant.OP_BIND_RESPONSE, new BindResponse(), null) });
@@ -559,8 +602,8 @@
             assertEquals(1, e.getResolvedName().size());
             assertEquals("/", e.getResolvedName().toString());
             assertTrue(e.getAltNameCtx() instanceof LdapContext);
-            assertEquals(context.getNameInNamespace(), e
-                    .getAltNameCtx().getNameInNamespace());
+            assertEquals(context.getNameInNamespace(), e.getAltNameCtx()
+                    .getNameInNamespace());
             assertTrue(e.getResolvedObj() instanceof Reference);
 
             Reference ref = (Reference) e.getResolvedObj();
@@ -571,8 +614,8 @@
             assertEquals(1, ref.size());
             RefAddr addr = ref.get(0);
             assertTrue(addr.getContent() instanceof LdapContext);
-            assertEquals(context.getNameInNamespace(),
-                    ((LdapContext) addr.getContent()).getNameInNamespace());
+            assertEquals(context.getNameInNamespace(), ((LdapContext) addr
+                    .getContent()).getNameInNamespace());
             assertEquals("nns", addr.getType());
         }
 
@@ -607,8 +650,8 @@
             assertEquals(1, e.getResolvedName().size());
             assertEquals("/", e.getResolvedName().toString());
             assertTrue(e.getAltNameCtx() instanceof LdapContext);
-            assertEquals(context.getNameInNamespace(), e
-                    .getAltNameCtx().getNameInNamespace());
+            assertEquals(context.getNameInNamespace(), e.getAltNameCtx()
+                    .getNameInNamespace());
             assertTrue(e.getResolvedObj() instanceof Reference);
 
             Reference ref = (Reference) e.getResolvedObj();
@@ -619,11 +662,12 @@
             assertEquals(1, ref.size());
             RefAddr addr = ref.get(0);
             assertTrue(addr.getContent() instanceof LdapContext);
-            assertEquals(context.getNameInNamespace(),
-                    ((LdapContext) addr.getContent()).getNameInNamespace());
+            assertEquals(context.getNameInNamespace(), ((LdapContext) addr
+                    .getContent()).getNameInNamespace());
             assertEquals("nns", addr.getType());
         }
     }
+
     public void testUnsolicitedNotification() throws Exception {
         server.setResponseSeq(new LdapMessage[] { new LdapMessage(
                 LdapASN1Constant.OP_BIND_RESPONSE, new BindResponse(), null) });