Return-Path: Delivered-To: apmail-directory-dev-archive@www.apache.org Received: (qmail 94966 invoked from network); 30 Jul 2006 11:24:02 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 30 Jul 2006 11:24:02 -0000 Received: (qmail 1590 invoked by uid 500); 30 Jul 2006 11:24:01 -0000 Delivered-To: apmail-directory-dev-archive@directory.apache.org Received: (qmail 1548 invoked by uid 500); 30 Jul 2006 11:24:01 -0000 Mailing-List: contact dev-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Apache Directory Developers List" Delivered-To: mailing list dev@directory.apache.org Delivered-To: moderator for dev@directory.apache.org Received: (qmail 99661 invoked by uid 99); 30 Jul 2006 11:17:08 -0000 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests= X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Message-ID: <44CC9517.7000104@bawue.de> Date: Sun, 30 Jul 2006 13:16:39 +0200 From: =?ISO-8859-15?Q?J=F6rg_Henne?= User-Agent: Thunderbird 1.5.0.5 (Windows/20060719) MIME-Version: 1.0 To: Apache Directory Developers List Subject: Re: Questions about the versions in the repository References: <44CA19C5.9060506@levigo.de> <44CA20C6.2050609@bellsouth.net> <44CBCBD8.5050706@gmail.com> <44CBD719.5080305@bawue.de> <44CBDFC2.8080108@gmail.com> In-Reply-To: <44CBDFC2.8080108@gmail.com> Content-Type: multipart/mixed; boundary="------------090706020106030408050504" X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N This is a multi-part message in MIME format. --------------090706020106030408050504 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Emmanuel Lecharny schrieb: > Ok, this is something I have to explain. I had to set those chars in > the file using an encoding. Java files use Unicode, but only when > compiled. Until then, you need to store files which use an encoding > scheme, and explain the compiler which encoding those java files have > been created with. ATM, all the java files are using UTF-8 encoding. > If you svn up the project and try to compile it on windows, there is a > good luck that you are using ISO-8859-1 or CP-152 encoding, which is > very different from UTF-8 encoding (especially when trying to use > chines or japanese chars :). What you may do is : > - change the default encoding on your computer (if you build it under > CygWin, I think changing LANG variable to en_??:UTF-8 should be enough) > - fix maven property file to include the |${maven.compiler.encoding} > property.| I have no idea how to do that :( > - fix the test files to use unicode escaped sequences for all the > special chars. Painfull :( I tried various combinations of the LANG variable without success. However, I think the most portable solution is to convert everything to escapes. Attached you'll find a version of the test I converted (using a quick converter hack) to escape sequences. Unfortunately, the testLdifParserRFC2849Sample4 test still fails for some attributes. I guess the phonetic attribute matches are supposed to do some advanced magic I don't quite get ATM. Joerg Henne --------------090706020106030408050504 Content-Type: text/plain; name="LdifReaderEscapedTest.java" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="LdifReaderEscapedTest.java" /* * Copyright (c) 2005 Your Corporation. All Rights Reserved. */ package org.apache.directory.shared.ldap.ldif; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URL; import java.util.List; import junit.framework.TestCase; import javax.naming.directory.Attribute; import javax.naming.directory.DirContext; import javax.naming.directory.ModificationItem; import javax.naming.ldap.Control; import javax.naming.NamingException; import org.apache.directory.shared.ldap.util.StringTools; /** * @author Alex Karasulu * @version $Rev: 379008 $ */ public class LdifReaderEscapedTest extends TestCase { private byte[] data; private URL jensenURL; private URL fionaURL; private File createFile( String name, byte[] data ) throws IOException { File jpeg = File.createTempFile(name, null); jpeg.createNewFile(); DataOutputStream os = new DataOutputStream( new FileOutputStream( jpeg ) ); os.write( data ); os.close(); // This file will be deleted when the JVM // will exit. jpeg.deleteOnExit(); return jpeg; } /** * Create a file to be used by ":<" values */ public void setUp() throws Exception { super.setUp(); data = new byte[256]; for ( int i = 0; i < 256; i++ ) { data[i] = (byte) i; } jensenURL = createFile( "hjensen.jpg", data ).toURL(); fionaURL = createFile( "fiona.jpg", data ).toURL(); } public void testLdifNull() throws NamingException { String ldif = null; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertEquals( 0, entries.size() ); } public void testLdifEmpty() throws NamingException { String ldif = ""; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertEquals( 0, entries.size() ); } public void testLdifEmptyLines() throws NamingException { String ldif = "\n\n\r\r\n"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertEquals( 0, entries.size() ); } public void testLdifComments() throws NamingException { String ldif = "#Comment 1\r" + "#\r" + " th\n" + " is is still a comment\n" + "\n"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertEquals( 0, entries.size() ); } public void testLdifVersion() throws NamingException { String ldif = "#Comment 1\r" + "#\r" + " th\n" + " is is still a comment\n" + "\n" + "version:\n" + " 1\n" + "# end"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertEquals( 0, entries.size() ); assertEquals( 1, reader.getVersion() ); } /** * Spaces at the end of values should not be included into values. * * @throws NamingException * @throws ParsingException */ public void testLdifParserEndSpaces() throws NamingException { String ldif = "version: 1\n" + "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + "cn: app1\n" + "objectClass: top\n" + "objectClass: apApplication\n" + "displayName: app1 \n" + "dependencies:\n" + "envVars:"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertNotNull( entries ); Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn() ); Attribute attr = entry.get( "displayname" ); assertTrue( attr.contains( "app1" ) ); } /** * Changes and entries should not be mixed * * @throws NamingException * @throws ParsingException */ public void testLdifParserCombinedEntriesChanges() throws NamingException { String ldif = "version: 1\n" + "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + "cn: app1\n" + "objectClass: top\n" + "objectClass: apApplication\n" + "displayName: app1 \n" + "dependencies:\n" + "envVars:\n" + "\n" + "# Delete an entry. The operation will attach the LDAPv3\n" + "# Tree Delete Control defined in [9]. The criticality\n" + "# field is \"true\" and the controlValue field is\n" + "# absent, as required by [9].\n" + "dn: ou=Product Development, dc=airius, dc=com\n" + "control: 1.2.840.11A556.1.4.805 true\n" + "changetype: delete\n"; LdifReader reader = new LdifReader(); try { reader.parseLdif( ldif ); fail(); } catch (NamingException ne) { assertTrue( true ); } } /** * Changes and entries should not be mixed * * @throws NamingException * @throws ParsingException */ public void testLdifParserCombinedEntriesChanges2() throws NamingException { String ldif = "version: 1\n" + "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + "cn: app1\n" + "objectClass: top\n" + "objectClass: apApplication\n" + "displayName: app1 \n" + "dependencies:\n" + "envVars:\n" + "\n" + "# Delete an entry. The operation will attach the LDAPv3\n" + "# Tree Delete Control defined in [9]. The criticality\n" + "# field is \"true\" and the controlValue field is\n" + "# absent, as required by [9].\n" + "dn: ou=Product Development, dc=airius, dc=com\n" + "changetype: delete\n"; LdifReader reader = new LdifReader(); try { reader.parseLdif( ldif ); fail(); } catch (NamingException ne) { assertTrue( true ); } } /** * Changes and entries should not be mixed * * @throws NamingException * @throws ParsingException */ public void testLdifParserCombinedChangesEntries() throws NamingException { String ldif = "version: 1\n" + "# Delete an entry. The operation will attach the LDAPv3\n" + "# Tree Delete Control defined in [9]. The criticality\n" + "# field is \"true\" and the controlValue field is\n" + "# absent, as required by [9].\n" + "dn: ou=Product Development, dc=airius, dc=com\n" + "control: 1.2.840.11A556.1.4.805 true\n" + "changetype: delete\n" + "\n" + "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + "cn: app1\n" + "objectClass: top\n" + "objectClass: apApplication\n" + "displayName: app1 \n" + "dependencies:\n" + "envVars:\n"; LdifReader reader = new LdifReader(); try { reader.parseLdif( ldif ); fail(); } catch (NamingException ne) { assertTrue( true ); } } /** * Changes and entries should not be mixed * * @throws NamingException * @throws ParsingException */ public void testLdifParserCombinedChangesEntries2() throws NamingException { String ldif = "version: 1\n" + "# Delete an entry. The operation will attach the LDAPv3\n" + "# Tree Delete Control defined in [9]. The criticality\n" + "# field is \"true\" and the controlValue field is\n" + "# absent, as required by [9].\n" + "dn: ou=Product Development, dc=airius, dc=com\n" + "changetype: delete\n" + "\n" + "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + "cn: app1\n" + "objectClass: top\n" + "objectClass: apApplication\n" + "displayName: app1 \n" + "dependencies:\n" + "envVars:\n"; LdifReader reader = new LdifReader(); try { reader.parseLdif( ldif ); fail(); } catch (NamingException ne) { assertTrue( true ); } } public void testLdifParser() throws NamingException { String ldif = "version: 1\n" + "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + "cn: app1\n" + "objectClass: top\n" + "objectClass: apApplication\n" + "displayName: app1 \n" + "dependencies:\n" + "envVars:"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertNotNull( entries ); Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn() ); Attribute attr = entry.get( "cn" ); assertTrue( attr.contains( "app1" ) ); attr = entry.get( "objectclass" ); assertTrue( attr.contains( "top" ) ); assertTrue( attr.contains( "apApplication" ) ); attr = entry.get( "displayname" ); assertTrue( attr.contains( "app1" ) ); attr = entry.get( "dependencies" ); assertNull( attr.get() ); attr = entry.get( "envvars" ); assertNull( attr.get() ); } public void testLdifParserMuiltiLineComments() throws NamingException { String ldif = "#comment\n" + " still a comment\n" + "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + "cn: app1#another comment\n" + "objectClass: top\n" + "objectClass: apApplication\n" + "displayName: app1\n" + "serviceType: http\n" + "dependencies:\n" + "httpHeaders:\n" + "startupOptions:\n" + "envVars:"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertNotNull( entries ); Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn() ); Attribute attr = entry.get( "cn" ); assertTrue( attr.contains( "app1#another comment" ) ); attr = entry.get( "objectclass" ); assertTrue( attr.contains( "top" ) ); assertTrue( attr.contains( "apApplication" ) ); attr = entry.get( "displayname" ); assertTrue( attr.contains( "app1" ) ); attr = entry.get( "dependencies" ); assertNull( attr.get() ); attr = entry.get( "envvars" ); assertNull( attr.get() ); } public void testLdifParserMultiLineEntries() throws NamingException { String ldif = "#comment\n" + "dn: cn=app1,ou=appli\n" + " cations,ou=conf,dc=apache,dc=org\n" + "cn: app1#another comment\n" + "objectClass: top\n" + "objectClass: apApplication\n" + "displayName: app1\n" + "serviceType: http\n" + "dependencies:\n" + "httpHeaders:\n" + "startupOptions:\n" + "envVars:"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertNotNull( entries ); Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn() ); Attribute attr = entry.get( "cn" ); assertTrue( attr.contains( "app1#another comment" ) ); attr = entry.get( "objectclass" ); assertTrue( attr.contains( "top" ) ); assertTrue( attr.contains( "apApplication" ) ); attr = entry.get( "displayname" ); assertTrue( attr.contains( "app1" ) ); attr = entry.get( "dependencies" ); assertNull( attr.get() ); attr = entry.get( "envvars" ); assertNull( attr.get() ); } public void testLdifParserBase64() throws NamingException, UnsupportedEncodingException { String ldif = "#comment\n" + "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + "cn:: RW1tYW51ZWwgTMOpY2hhcm55\n" + "objectClass: top\n" + "objectClass: apApplication\n" + "displayName: app1\n" + "serviceType: http\n" + "dependencies:\n" + "httpHeaders:\n" + "startupOptions:\n" + "envVars:"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertNotNull( entries ); Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn() ); Attribute attr = entry.get( "cn" ); assertTrue( attr.contains( "Emmanuel L\u00e9charny".getBytes( "UTF-8" ) ) ); attr = entry.get( "objectclass" ); assertTrue( attr.contains( "top" ) ); assertTrue( attr.contains( "apApplication" ) ); attr = entry.get( "displayname" ); assertTrue( attr.contains( "app1" ) ); attr = entry.get( "dependencies" ); assertNull( attr.get() ); attr = entry.get( "envvars" ); assertNull( attr.get() ); } public void testLdifParserBase64MultiLine() throws NamingException, UnsupportedEncodingException { String ldif = "#comment\n" + "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + "cn:: RW1tYW51ZWwg\n" + " TMOpY2hhcm55ICA=\n" + "objectClass: top\n" + "objectClass: apApplication\n" + "displayName: app1\n" + "serviceType: http\n" + "dependencies:\n" + "httpHeaders:\n" + "startupOptions:\n" + "envVars:"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertNotNull( entries ); Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn() ); Attribute attr = entry.get( "cn" ); assertTrue( attr.contains( "Emmanuel L\u00e9charny ".getBytes( "UTF-8" ) ) ); attr = entry.get( "objectclass" ); assertTrue( attr.contains( "top" ) ); assertTrue( attr.contains( "apApplication" ) ); attr = entry.get( "displayname" ); assertTrue( attr.contains( "app1" ) ); attr = entry.get( "dependencies" ); assertNull( attr.get() ); attr = entry.get( "envvars" ); assertNull( attr.get() ); } public void testLdifParserRFC2849Sample1() throws NamingException { String ldif = "version: 1\n" + "dn: cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "cn: Barbara Jensen\n" + "cn: Barbara J Jensen\n" + "cn: Babs Jensen\n" + "sn: Jensen\n" + "uid: bjensen\n" + "telephonenumber: +1 408 555 1212\n" + "description: A big sailing fan.\n" + "\n" + "dn: cn=Bjorn Jensen, ou=Accounting, dc=airius, dc=com\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "cn: Bjorn Jensen\n" + "sn: Jensen\n" + "telephonenumber: +1 408 555 1212"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertEquals( 2, entries.size() ); // Entry 1 Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); assertEquals( "cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com", entry.getDn() ); Attribute attr = entry.get( "objectclass" ); assertTrue( attr.contains( "top" ) ); assertTrue( attr.contains( "person" ) ); assertTrue( attr.contains( "organizationalPerson" ) ); attr = entry.get( "cn" ); assertTrue( attr.contains( "Barbara Jensen" ) ); assertTrue( attr.contains( "Barbara J Jensen" ) ); assertTrue( attr.contains( "Babs Jensen" ) ); attr = entry.get( "sn" ); assertTrue( attr.contains( "Jensen" ) ); attr = entry.get( "uid" ); assertTrue( attr.contains( "bjensen" ) ); attr = entry.get( "telephonenumber" ); assertTrue( attr.contains( "+1 408 555 1212" ) ); attr = entry.get( "description" ); assertTrue( attr.contains( "A big sailing fan." ) ); // Entry 2 entry = (Entry) entries.get( 1 ); assertTrue( entry.isChangeAdd() ); attr = entry.get( "dn" ); assertEquals( "cn=Bjorn Jensen, ou=Accounting, dc=airius, dc=com", entry.getDn() ); attr = entry.get( "objectclass" ); assertTrue( attr.contains( "top" ) ); assertTrue( attr.contains( "person" ) ); assertTrue( attr.contains( "organizationalPerson" ) ); attr = entry.get( "cn" ); assertTrue( attr.contains( "Bjorn Jensen" ) ); attr = entry.get( "sn" ); assertTrue( attr.contains( "Jensen" ) ); attr = entry.get( "telephonenumber" ); assertTrue( attr.contains( "+1 408 555 1212" ) ); } public void testLdifParserRFC2849Sample2() throws NamingException { String ldif = "version: 1\n" + "dn: cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "cn: Barbara Jensen\n" + "cn: Barbara J Jensen\n" + "cn: Babs Jensen\n" + "sn: Jensen\n" + "uid: bjensen\n" + "telephonenumber: +1 408 555 1212\n" + "description:Babs is a big sailing fan, and travels extensively in sea\n" + " rch of perfect sailing conditions.\n" + "title:Product Manager, Rod and Reel Division"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertEquals( 1, entries.size() ); // Entry 1 Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); assertEquals( "cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com", entry.getDn() ); Attribute attr = entry.get( "objectclass" ); assertTrue( attr.contains( "top" ) ); assertTrue( attr.contains( "person" ) ); assertTrue( attr.contains( "organizationalPerson" ) ); attr = entry.get( "cn" ); assertTrue( attr.contains( "Barbara Jensen" ) ); assertTrue( attr.contains( "Barbara J Jensen" ) ); assertTrue( attr.contains( "Babs Jensen" ) ); attr = entry.get( "sn" ); assertTrue( attr.contains( "Jensen" ) ); attr = entry.get( "uid" ); assertTrue( attr.contains( "bjensen" ) ); attr = entry.get( "telephonenumber" ); assertTrue( attr.contains( "+1 408 555 1212" ) ); attr = entry.get( "description" ); assertTrue( attr .contains( "Babs is a big sailing fan, and travels extensively in search of perfect sailing conditions." ) ); attr = entry.get( "title" ); assertTrue( attr.contains( "Product Manager, Rod and Reel Division" ) ); } public void testLdifParserRFC2849Sample3() throws NamingException, Exception { String ldif = "version: 1\n" + "dn: cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "cn: Gern Jensen\n" + "cn: Gern O Jensen\n" + "sn: Jensen\n" + "uid: gernj\n" + "telephonenumber: +1 408 555 1212\n" + "description:: V2hhdCBhIGNhcmVmdWwgcmVhZGVyIHlvdSBhcmUhICBUaGlzIHZhbHVl\n" + " IGlzIGJhc2UtNjQtZW5jb2RlZCBiZWNhdXNlIGl0IGhhcyBhIGNvbnRyb2wgY2hhcmFjdG\n" + " VyIGluIGl0IChhIENSKS4NICBCeSB0aGUgd2F5LCB5b3Ugc2hvdWxkIHJlYWxseSBnZXQg\n" + " b3V0IG1vcmUu"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertEquals( 1, entries.size() ); // Entry 1 Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); assertEquals( "cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com", entry.getDn() ); Attribute attr = entry.get( "objectclass" ); assertTrue( attr.contains( "top" ) ); assertTrue( attr.contains( "person" ) ); assertTrue( attr.contains( "organizationalPerson" ) ); attr = entry.get( "cn" ); assertTrue( attr.contains( "Gern Jensen" ) ); assertTrue( attr.contains( "Gern O Jensen" ) ); attr = entry.get( "sn" ); assertTrue( attr.contains( "Jensen" ) ); attr = entry.get( "uid" ); assertTrue( attr.contains( "gernj" ) ); attr = entry.get( "telephonenumber" ); assertTrue( attr.contains( "+1 408 555 1212" ) ); attr = entry.get( "description" ); assertTrue( attr .contains( "What a careful reader you are! This value is base-64-encoded because it has a control character in it (a CR).\r By the way, you should really get out more." .getBytes( "UTF-8" ) ) ); } public void testLdifParserRFC2849Sample3VariousSpacing() throws NamingException, Exception { String ldif = "version:1\n" + "dn:cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com \n" + "objectclass:top\n" + "objectclass: person \n" + "objectclass:organizationalPerson\n" + "cn:Gern Jensen\n" + "cn:Gern O Jensen\n" + "sn:Jensen\n" + "uid:gernj\n" + "telephonenumber:+1 408 555 1212 \n" + "description:: V2hhdCBhIGNhcmVmdWwgcmVhZGVyIHlvdSBhcmUhICBUaGlzIHZhbHVl\n" + " IGlzIGJhc2UtNjQtZW5jb2RlZCBiZWNhdXNlIGl0IGhhcyBhIGNvbnRyb2wgY2hhcmFjdG\n" + " VyIGluIGl0IChhIENSKS4NICBCeSB0aGUgd2F5LCB5b3Ugc2hvdWxkIHJlYWxseSBnZXQg\n" + " b3V0IG1vcmUu "; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); assertEquals( 1, entries.size() ); // Entry 1 Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); assertEquals( "cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com", entry.getDn() ); Attribute attr = entry.get( "objectclass" ); assertTrue( attr.contains( "top" ) ); assertTrue( attr.contains( "person" ) ); assertTrue( attr.contains( "organizationalPerson" ) ); attr = entry.get( "cn" ); assertTrue( attr.contains( "Gern Jensen" ) ); assertTrue( attr.contains( "Gern O Jensen" ) ); attr = entry.get( "sn" ); assertTrue( attr.contains( "Jensen" ) ); attr = entry.get( "uid" ); assertTrue( attr.contains( "gernj" ) ); attr = entry.get( "telephonenumber" ); assertTrue( attr.contains( "+1 408 555 1212" ) ); attr = entry.get( "description" ); assertTrue( attr .contains( "What a careful reader you are! This value is base-64-encoded because it has a control character in it (a CR).\r By the way, you should really get out more." .getBytes( "UTF-8" ) ) ); } public void testLdifParserRFC2849Sample4() throws NamingException, Exception { String ldif = "version: 1\n" + "dn:: b3U95Za25qWt6YOoLG89QWlyaXVz\n" + "# dn:: ou=\u55b6\u696d\u90e8,o=Airius\n" + "objectclass: top\n" + "objectclass: organizationalUnit\n" + "ou:: 5Za25qWt6YOo\n" + "# ou:: \u55b6\u696d\u90e8\n" + "ou;lang-ja:: 5Za25qWt6YOo\n" + "# ou;lang-ja:: \u55b6\u696d\u90e8\n" + "ou;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2\n" + "# ou;lang-ja:: \ufffd?\ufffd\ufffd?\ufffd\ufffd?\ufffd\u3087\ufffd?\ufffd\ufffd?\ufffd\n" + "ou;lang-en: Sales\n" + "description: Japanese office\n" + "\n" + "dn:: dWlkPXJvZ2FzYXdhcmEsb3U95Za25qWt6YOoLG89QWlyaXVz\n" + "# dn:: uid=rogasawara,ou=\u55b6\u696d\u90e8,o=Airius\n" + "userpassword: {SHA}O3HSv1MusyL4kTjP+HKI5uxuNoM=\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "objectclass: inetOrgPerson\n" + "uid: rogasawara\n" + "mail: rogasawara@airius.co.jp\n" + "givenname;lang-ja:: 44Ot44OJ44OL44O8\n" + "# givenname;lang-ja:: \u30ed\u30c9\u30cb\u30fc\n" + "sn;lang-ja:: 5bCP56yg5Y6f\n" + "# sn;lang-ja:: \ufffd?\u7b20\u539f\n" + "cn;lang-ja:: 5bCP56yg5Y6fIOODreODieODi+ODvA==\n" + "# cn;lang-ja:: \ufffd?\u7b20\u539f \u30ed\u30c9\u30cb\u30fc\n" + "title;lang-ja:: 5Za25qWt6YOoIOmDqOmVtw==\n" + "# title;lang-ja:: \u55b6\u696d\u90e8 \u90e8\u9577\n" + "preferredlanguage: ja\n" + "givenname:: 44Ot44OJ44OL44O8\n" + "# givenname:: \u30ed\u30c9\u30cb\u30fc\n" + "sn:: 5bCP56yg5Y6f\n" + "# sn:: \ufffd?\u7b20\u539f\n" + "cn:: 5bCP56yg5Y6fIOODreODieODi+ODvA==\n" + "# cn:: \ufffd?\u7b20\u539f \u30ed\u30c9\u30cb\u30fc\n" + "title:: 5Za25qWt6YOoIOmDqOmVtw==\n" + "# title:: \u55b6\u696d\u90e8 \u90e8\u9577\n" + "givenname;lang-ja;phonetic:: 44KN44Gp44Gr44O8\n" + "# givenname;lang-ja;phonetic::\n" + " \ufffd?\ufffd?\ufffd\ufffd?\ufffd\u30fc\n" + "sn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJ\n" + "# sn;lang-ja;phonetic:: \ufffd?\ufffd\ufffd?\ufffd\ufffd?\ufffd\ufffd?\u3089\n" + "cn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJIOOCjeOBqeOBq+ODvA==\n" + "# cn;lang-ja;phonetic:: \ufffd?\ufffd\ufffd?\ufffd\ufffd?\ufffd\ufffd?\u3089 \ufffd?\ufffd?\ufffd\ufffd?\ufffd\u30fc\n" + "title;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2IOOBtuOBoeOCh+OBhg==\n" + "# title;lang-ja;phonetic::\n" + "# \ufffd?\ufffd\ufffd?\ufffd\ufffd?\ufffd\u3087\ufffd?\ufffd\ufffd?\ufffd \ufffd?\ufffd\ufffd?\ufffd\u3087\ufffd?\ufffd\n" + "givenname;lang-en: Rodney\n" + "sn;lang-en: Ogasawara\n" + "cn;lang-en: Rodney Ogasawara\n" + "title;lang-en: Sales, Director\n"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); String[][][] values = { { { "dn", "ou=\u55b6\u696d\u90e8,o=Airius" }, { "objectclass", "top" }, { "objectclass", "organizationalUnit" }, { "ou", "\u55b6\u696d\u90e8" }, { "ou;lang-ja", "\u55b6\u696d\u90e8" }, { "ou;lang-ja;phonetic", "\ufffd?\ufffd\ufffd?\ufffd\ufffd?\ufffd\u3087\ufffd?\ufffd\ufffd?\ufffd" }, { "ou;lang-en", "Sales" }, { "description", "Japanese office" } }, { { "dn", "uid=rogasawara,ou=\u55b6\u696d\u90e8,o=Airius" }, { "userpassword", "{SHA}O3HSv1MusyL4kTjP+HKI5uxuNoM=" }, { "objectclass", "top" }, { "objectclass", "person" }, { "objectclass", "organizationalPerson" }, { "objectclass", "inetOrgPerson" }, { "uid", "rogasawara" }, { "mail", "rogasawara@airius.co.jp" }, { "givenname;lang-ja", "\u30ed\u30c9\u30cb\u30fc" }, { "sn;lang-ja", "\ufffd?\u7b20\u539f" }, { "cn;lang-ja", "\ufffd?\u7b20\u539f \u30ed\u30c9\u30cb\u30fc" }, { "title;lang-ja", "\u55b6\u696d\u90e8 \u90e8\u9577" }, { "preferredlanguage", "ja" }, { "givenname", "\u30ed\u30c9\u30cb\u30fc" }, { "sn", "\ufffd?\u7b20\u539f" }, { "cn", "\ufffd?\u7b20\u539f \u30ed\u30c9\u30cb\u30fc" }, { "title", "\u55b6\u696d\u90e8 \u90e8\u9577" }, { "givenname;lang-ja;phonetic", "\ufffd?\ufffd?\ufffd\ufffd?\ufffd\u30fc" }, { "sn;lang-ja;phonetic", "\ufffd?\ufffd\ufffd?\ufffd\ufffd?\ufffd\ufffd?\u3089" }, { "cn;lang-ja;phonetic", "\ufffd?\ufffd\ufffd?\ufffd\ufffd?\ufffd\ufffd?\u3089 \ufffd?\ufffd?\ufffd\ufffd?\ufffd\u30fc" }, { "title;lang-ja;phonetic", "\ufffd?\ufffd\ufffd?\ufffd\ufffd?\ufffd\u3087\ufffd?\ufffd\ufffd?\ufffd \ufffd?\ufffd\ufffd?\ufffd\u3087\ufffd?\ufffd" }, { "givenname;lang-en", "Rodney" }, { "sn;lang-en", "Ogasawara" }, { "cn;lang-en", "Rodney Ogasawara" }, { "title;lang-en", "Sales, Director" } } }; assertEquals( 2, entries.size() ); // Entry 1 for ( int i = 0; i < entries.size(); i++ ) { Entry entry = (Entry) entries.get( i ); assertTrue( entry.isChangeAdd() ); for ( int j = 0; j < values[i].length; j++ ) { if ( "dn".equalsIgnoreCase( values[i][j][0] ) ) { assertEquals( values[i][j][1], entry.getDn() ); } else { Attribute attr = entry.get( values[i][j][0] ); if ( attr.contains( values[i][j][1] ) ) { assertTrue( true ); } else { if(!attr.contains( values[i][j][1].getBytes( "UTF-8" ) )) fail( j + ": " + values[i][j][1] + " not in " + attr.toString() ); } } } } } public void testLdifParserRFC2849Sample5() throws NamingException, Exception { String ldif = "version: 1\n" + "dn: cn=Horatio Jensen, ou=Product Testing, dc=airius, dc=com\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "cn: Horatio Jensen\n" + "cn: Horatio N Jensen\n" + "sn: Jensen\n" + "uid: hjensen\n" + "telephonenumber: +1 408 555 1212\n" + "jpegphoto:< " + jensenURL.toExternalForm(); LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); String[][] values = { { "dn", "cn=Horatio Jensen, ou=Product Testing, dc=airius, dc=com" }, { "objectclass", "top" }, { "objectclass", "person" }, { "objectclass", "organizationalPerson" }, { "cn", "Horatio Jensen" }, { "cn", "Horatio N Jensen" }, { "sn", "Jensen" }, { "uid", "hjensen" }, { "telephonenumber", "+1 408 555 1212" }, { "jpegphoto", null } }; assertEquals( 1, entries.size() ); // Entry 1 Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); for ( int i = 0; i < values.length; i++ ) { if ( "dn".equalsIgnoreCase( values[i][0] ) ) { assertEquals( values[i][1], entry.getDn() ); } else if ( "jpegphoto".equalsIgnoreCase( values[i][0] ) ) { Attribute attr = entry.get( values[i][0] ); assertEquals( StringTools.dumpBytes( data ), StringTools.dumpBytes( (byte[]) attr.get() ) ); } else { Attribute attr = entry.get( values[i][0] ); if ( attr.contains( values[i][1] ) ) { assertTrue( true ); } else { assertTrue( attr.contains( values[i][1].getBytes( "UTF-8" ) ) ); } } } } public void testLdifParserRFC2849Sample5WithSizeLimit() throws NamingException, Exception { String ldif = "version: 1\n" + "dn: cn=Horatio Jensen, ou=Product Testing, dc=airius, dc=com\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "cn: Horatio Jensen\n" + "cn: Horatio N Jensen\n" + "sn: Jensen\n" + "uid: hjensen\n" + "telephonenumber: +1 408 555 1212\n" + "jpegphoto:< file:///tmp/hjensen.jpg"; LdifReader reader = new LdifReader(); reader.setSizeLimit( 128 ); try { reader.parseLdif( ldif ); fail(); } catch (NamingException ne) { assertEquals( "Error while parsing the ldif buffer", ne.getMessage() ); } } public void testLdifParserRFC2849Sample6() throws NamingException, Exception { String ldif = "version: 1\n" + // First entry modification : ADD "# Add a new entry\n" + "dn: cn=Fiona Jensen, ou=Marketing, dc=airius, dc=com\n" + "changetype: add\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "cn: Fiona Jensen\n" + "sn: Jensen\n" + "uid: fiona\n" + "telephonenumber: +1 408 555 1212\n" + "jpegphoto:< " + fionaURL + "\n" + "\n" + // Second entry modification : DELETE "# Delete an existing entry\n" + "dn: cn=Robert Jensen, ou=Marketing, dc=airius, dc=com\n" + "changetype: delete\n" + "\n" + // Third entry modification : MODRDN "# Modify an entry's relative distinguished name\n" + "dn: cn=Paul Jensen, ou=Product Development, dc=airius, dc=com\n" + "changetype: modrdn\n" + "newrdn: cn=Paula Jensen\n" + "deleteoldrdn: 1\n" + "\n" + // Forth entry modification : MODRDN "# Rename an entry and move all of its children to a new location in\n" + "# the directory tree (only implemented by LDAPv3 servers).\n" + "dn: ou=PD Accountants, ou=Product Development, dc=airius, dc=com\n" + "changetype: moddn\n" + "newrdn: ou=Product Development Accountants\n" + "deleteoldrdn: 0\n" + "newsuperior: ou=Accounting, dc=airius, dc=com\n" + "# Modify an entry: add an additional value to the postaladdress\n" + "# attribute, completely delete the description attribute, replace\n" + "# the telephonenumber attribute with two values, and delete a specific\n" + "# value from the facsimiletelephonenumber attribute\n" + "\n" + // Fitfh entry modification : MODIFY "dn: cn=Paula Jensen, ou=Product Development, dc=airius, dc=com\n" + "changetype: modify\n" + "add: postaladdress\n" + "postaladdress: 123 Anystreet $ Sunnyvale, CA $ 94086\n" + "-\n" + "delete: description\n" + "-\n" + "replace: telephonenumber\n" + "telephonenumber: +1 408 555 1234\n" + "telephonenumber: +1 408 555 5678\n" + "-\n" + "delete: facsimiletelephonenumber\n" + "facsimiletelephonenumber: +1 408 555 9876\n" + "-\n" + "\n" + // Sixth entry modification : MODIFY "# Modify an entry: replace the postaladdress attribute with an empty\n" + "# set of values (which will cause the attribute to be removed), and\n" + "# delete the entire description attribute. Note that the first will\n" + "# always succeed, while the second will only succeed if at least\n" + "# one value for the description attribute is present.\n" + "dn: cn=Ingrid Jensen, ou=Product Support, dc=airius, dc=com\n" + "changetype: modify\n" + "replace: postaladdress\n" + "-\n" + "delete: description\n" + "-\n"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); String[][][] values = { // First entry modification : ADD { { "dn", "cn=Fiona Jensen, ou=Marketing, dc=airius, dc=com" }, { "objectclass", "top" }, { "objectclass", "person" }, { "objectclass", "organizationalPerson" }, { "cn", "Fiona Jensen" }, { "sn", "Jensen" }, { "uid", "fiona" }, { "telephonenumber", "+1 408 555 1212" }, { "jpegphoto", "" } }, // Second entry modification : DELETE { { "dn", "cn=Robert Jensen, ou=Marketing, dc=airius, dc=com" } }, // Third entry modification : MODRDN { { "dn", "cn=Paul Jensen, ou=Product Development, dc=airius, dc=com" }, { "cn=Paula Jensen" } }, // Forth entry modification : MODRDN { { "dn", "ou=PD Accountants, ou=Product Development, dc=airius, dc=com" }, { "ou=Product Development Accountants" }, { "ou=Accounting, dc=airius, dc=com" } }, // Fitfh entry modification : MODIFY { { "dn", "cn=Paula Jensen, ou=Product Development, dc=airius, dc=com" }, // add { "postaladdress", "123 Anystreet $ Sunnyvale, CA $ 94086" }, // delete { "description" }, // replace { "telephonenumber", "+1 408 555 1234", "+1 408 555 5678" }, // delete { "facsimiletelephonenumber", "+1 408 555 9876" }, }, // Sixth entry modification : MODIFY { { "dn", "cn=Ingrid Jensen, ou=Product Support, dc=airius, dc=com" }, // replace { "postaladdress" }, // delete { "description" } } }; Entry entry = (Entry) entries.get( 0 ); assertTrue( entry.isChangeAdd() ); for ( int i = 0; i < values.length; i++ ) { if ( "dn".equalsIgnoreCase( values[0][i][0] ) ) { assertEquals( values[0][i][1], entry.getDn() ); } else if ( "jpegphoto".equalsIgnoreCase( values[0][i][0] ) ) { Attribute attr = entry.get( values[0][i][0] ); assertEquals( StringTools.dumpBytes( data ), StringTools.dumpBytes( (byte[]) attr.get() ) ); } else { Attribute attr = entry.get( values[0][i][0] ); if ( attr.contains( values[0][i][1] ) ) { assertTrue( true ); } else { assertTrue( attr.contains( values[0][i][1].getBytes( "UTF-8" ) ) ); } } } // Second entry entry = (Entry) entries.get( 1 ); assertTrue( entry.isChangeDelete() ); assertEquals( values[1][0][1], entry.getDn() ); // Third entry entry = (Entry) entries.get( 2 ); assertTrue( entry.isChangeModRdn() ); assertEquals( values[2][0][1], entry.getDn() ); assertEquals( values[2][1][0], entry.getNewRdn() ); assertTrue( entry.isDeleteOldRdn() ); // Forth entry entry = (Entry) entries.get( 3 ); assertTrue( entry.isChangeModDn() ); assertEquals( values[3][0][1], entry.getDn() ); assertEquals( values[3][1][0], entry.getNewRdn() ); assertFalse( entry.isDeleteOldRdn() ); assertEquals( values[3][2][0], entry.getNewSuperior() ); // Fifth entry entry = (Entry) entries.get( 4 ); List modifs = entry.getModificationItems(); assertTrue( entry.isChangeModify() ); assertEquals( values[4][0][1], entry.getDn() ); // "add: postaladdress" // "postaladdress: 123 Anystreet $ Sunnyvale, CA $ 94086" ModificationItem item = (ModificationItem) modifs.get( 0 ); assertEquals( DirContext.ADD_ATTRIBUTE, item.getModificationOp() ); assertEquals( values[4][1][0], item.getAttribute().getID() ); assertEquals( values[4][1][1], item.getAttribute().get( 0 ) ); // "delete: description\n" + item = (ModificationItem) modifs.get( 1 ); assertEquals( DirContext.REMOVE_ATTRIBUTE, item.getModificationOp() ); assertEquals( values[4][2][0], item.getAttribute().getID() ); // "replace: telephonenumber" // "telephonenumber: +1 408 555 1234" // "telephonenumber: +1 408 555 5678" item = (ModificationItem) modifs.get( 2 ); assertEquals( DirContext.REPLACE_ATTRIBUTE, item.getModificationOp() ); assertEquals( values[4][3][0], item.getAttribute().getID() ); assertEquals( values[4][3][1], item.getAttribute().get( 0 ) ); assertEquals( values[4][3][2], item.getAttribute().get( 1 ) ); // "delete: facsimiletelephonenumber" // "facsimiletelephonenumber: +1 408 555 9876" item = (ModificationItem) modifs.get( 3 ); assertEquals( DirContext.REMOVE_ATTRIBUTE, item.getModificationOp() ); assertEquals( values[4][4][0], item.getAttribute().getID() ); assertEquals( values[4][4][1], item.getAttribute().get( 0 ) ); // Sixth entry entry = (Entry) entries.get( 5 ); modifs = entry.getModificationItems(); assertTrue( entry.isChangeModify() ); assertEquals( values[5][0][1], entry.getDn() ); // "replace: postaladdress" item = (ModificationItem) modifs.get( 0 ); assertEquals( DirContext.REPLACE_ATTRIBUTE, item.getModificationOp() ); assertEquals( values[5][1][0], item.getAttribute().getID() ); // "delete: description" item = (ModificationItem) modifs.get( 1 ); assertEquals( DirContext.REMOVE_ATTRIBUTE, item.getModificationOp() ); assertEquals( values[5][2][0], item.getAttribute().getID() ); } public void testLdifParserRFC2849Sample7() throws NamingException, Exception { String ldif = "version: 1\n" + "# Delete an entry. The operation will attach the LDAPv3\n" + "# Tree Delete Control defined in [9]. The criticality\n" + "# field is \"true\" and the controlValue field is\n" + "# absent, as required by [9].\n" + "dn: ou=Product Development, dc=airius, dc=com\n" + "control: 1.2.840.113556.1.4.805 true\n" + "changetype: delete\n"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); Entry entry = (Entry) entries.get( 0 ); assertEquals( "ou=Product Development, dc=airius, dc=com", entry.getDn() ); assertTrue( entry.isChangeDelete() ); // Check the control Control control = entry.getControl(); assertEquals( "1.2.840.113556.1.4.805", control.getID() ); assertTrue( control.isCritical() ); } public void testLdifParserRFC2849Sample7NoValueNoCritical() throws NamingException, Exception { String ldif = "version: 1\n" + "# Delete an entry. The operation will attach the LDAPv3\n" + "# Tree Delete Control defined in [9]. The criticality\n" + "# field is \"true\" and the controlValue field is\n" + "# absent, as required by [9].\n" + "dn: ou=Product Development, dc=airius, dc=com\n" + "control: 1.2.840.11556.1.4.805\n" + "changetype: delete\n"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); Entry entry = (Entry) entries.get( 0 ); assertEquals( "ou=Product Development, dc=airius, dc=com", entry.getDn() ); assertTrue( entry.isChangeDelete() ); // Check the control Control control = entry.getControl(); assertEquals( "1.2.840.11556.1.4.805", control.getID() ); assertFalse( control.isCritical() ); } public void testLdifParserRFC2849Sample7NoCritical() throws NamingException, Exception { String ldif = "version: 1\n" + "# Delete an entry. The operation will attach the LDAPv3\n" + "# Tree Delete Control defined in [9]. The criticality\n" + "# field is \"true\" and the controlValue field is\n" + "# absent, as required by [9].\n" + "dn: ou=Product Development, dc=airius, dc=com\n" + "control: 1.2.840.11556.1.4.805:control-value\n" + "changetype: delete\n"; LdifReader reader = new LdifReader(); List entries = reader.parseLdif( ldif ); Entry entry = (Entry) entries.get( 0 ); assertEquals( "ou=Product Development, dc=airius, dc=com", entry.getDn() ); assertTrue( entry.isChangeDelete() ); // Check the control Control control = entry.getControl(); assertEquals( "1.2.840.11556.1.4.805", control.getID() ); assertFalse( control.isCritical() ); assertEquals( "control-value", StringTools.utf8ToString( control.getEncodedValue() ) ); } public void testLdifParserRFC2849Sample7NoOid() throws NamingException, Exception { String ldif = "version: 1\n" + "# Delete an entry. The operation will attach the LDAPv3\n" + "# Tree Delete Control defined in [9]. The criticality\n" + "# field is \"true\" and the controlValue field is\n" + "# absent, as required by [9].\n" + "dn: ou=Product Development, dc=airius, dc=com\n" + "control: true\n" + "changetype: delete\n"; LdifReader reader = new LdifReader(); try { reader.parseLdif( ldif ); fail(); } catch (NamingException ne) { assertTrue( true ); } } public void testLdifParserRFC2849Sample7BadOid() throws NamingException, Exception { String ldif = "version: 1\n" + "# Delete an entry. The operation will attach the LDAPv3\n" + "# Tree Delete Control defined in [9]. The criticality\n" + "# field is \"true\" and the controlValue field is\n" + "# absent, as required by [9].\n" + "dn: ou=Product Development, dc=airius, dc=com\n" + "control: 1.2.840.11A556.1.4.805 true\n" + "changetype: delete\n"; LdifReader reader = new LdifReader(); try { reader.parseLdif( ldif ); fail(); } catch (NamingException ne) { assertTrue( true ); } } public void testLdifParserChangeModifyMultiAttrs() throws NamingException, Exception { String ldif = "version: 1\n" + "dn: ou=Product Development, dc=airius, dc=com\n" + "changetype: modify\n" + "add: postaladdress\n" + "postaladdress: 123 Anystreet $ Sunnyvale, CA $ 94086\n" + "-\n" + "delete: postaladdress\n" + "-\n" + "replace: telephonenumber\n" + "telephonenumber: +1 408 555 1234\n" + "telephonenumber: +1 408 555 5678\n" + "-\n" + "delete: facsimiletelephonenumber\n" + "facsimiletelephonenumber: +1 408 555 9876\n"; LdifReader reader = new LdifReader(); try { reader.parseLdif( ldif ); fail(); } catch (NamingException ne) { assertTrue( true ); } } } --------------090706020106030408050504--