1 17 package scriptella.driver.ldap.ldif; 18 19 import junit.framework.TestCase; 20 21 import javax.naming.NamingException ; 22 import javax.naming.directory.Attribute ; 23 import javax.naming.directory.DirContext ; 24 import javax.naming.directory.ModificationItem ; 25 import javax.naming.ldap.Control ; 26 import java.io.DataOutputStream ; 27 import java.io.File ; 28 import java.io.FileOutputStream ; 29 import java.io.IOException ; 30 import java.io.UnsupportedEncodingException ; 31 import java.util.Arrays ; 32 import java.util.List ; 33 34 42 public class LdifReaderTest extends TestCase { 43 private byte[] data; 44 45 private static File HJENSEN_JPEG_FILE = null; 46 private static File FIONA_JPEG_FILE = null; 47 48 private File createFile(String name, byte[] data) throws IOException { 49 File jpeg = File.createTempFile(name, "jpg"); 50 51 jpeg.createNewFile(); 52 53 DataOutputStream os = new DataOutputStream (new FileOutputStream (jpeg)); 54 55 os.write(data); 56 os.close(); 57 58 jpeg.deleteOnExit(); 61 62 return jpeg; 63 } 64 65 68 public void setUp() throws Exception { 69 super.setUp(); 70 71 data = new byte[256]; 72 73 for (int i = 0; i < 256; i++) { 74 data[i] = (byte) i; 75 } 76 77 HJENSEN_JPEG_FILE = createFile("hjensen", data); 78 FIONA_JPEG_FILE = createFile("fiona", data); 79 } 80 81 public void testLdifEmpty() throws NamingException { 82 String ldif = ""; 83 84 LdifReader reader = new LdifReader(); 85 List entries = reader.parseLdif(ldif); 86 87 assertEquals(0, entries.size()); 88 } 89 90 public void testLdifEmptyLines() throws NamingException { 91 String ldif = "\n\n\r\r\n"; 92 93 LdifReader reader = new LdifReader(); 94 List entries = reader.parseLdif(ldif); 95 96 assertEquals(0, entries.size()); 97 } 98 99 public void testLdifComments() throws NamingException { 100 String ldif = 101 "#Comment 1\r" + 102 "#\r" + 103 " th\n" + 104 " is is still a comment\n" + 105 "\n"; 106 107 LdifReader reader = new LdifReader(); 108 List entries = reader.parseLdif(ldif); 109 110 assertEquals(0, entries.size()); 111 } 112 113 public void testLdifVersion() throws NamingException { 114 String ldif = 115 "#Comment 1\r" + 116 "#\r" + 117 " th\n" + 118 " is is still a comment\n" + 119 "\n" + 120 "version:\n" + 121 " 2\n" + 122 "# end"; 123 124 LdifReader reader = new LdifReader(); 125 List entries = reader.parseLdif(ldif); 126 127 assertEquals(0, entries.size()); 128 assertEquals(2, reader.getVersion()); 129 } 130 131 136 public void testLdifParserEndSpaces() throws NamingException { 137 String ldif = 138 "version: 1\n" + 139 "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + 140 "cn: app1\n" + 141 "objectClass: top\n" + 142 "objectClass: apApplication\n" + 143 "displayName: app1 \n" + 144 "dependencies:\n" + 145 "envVars:"; 146 147 LdifReader reader = new LdifReader(); 148 149 List entries = reader.parseLdif(ldif); 150 assertNotNull(entries); 151 152 Entry entry = (Entry) entries.get(0); 153 154 assertTrue(entry.isChangeAdd()); 155 156 assertEquals("cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn()); 157 158 Attribute attr = entry.get("displayname"); 159 assertTrue(attr.contains("app1")); 160 161 } 162 163 168 public void testLdifParserCombinedEntriesChanges() throws NamingException { 169 String ldif = 170 "version: 1\n" + 171 "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + 172 "cn: app1\n" + 173 "objectClass: top\n" + 174 "objectClass: apApplication\n" + 175 "displayName: app1 \n" + 176 "dependencies:\n" + 177 "envVars:\n" + 178 "\n" + 179 "# Delete an entry. The operation will attach the LDAPv3\n" + 180 "# Tree Delete Control defined in [9]. The criticality\n" + 181 "# field is \"true\" and the controlValue field is\n" + 182 "# absent, as required by [9].\n" + 183 "dn: ou=Product Development, dc=airius, dc=com\n" + 184 "control: 1.2.840.11A556.1.4.805 true\n" + 185 "changetype: delete\n"; 186 187 LdifReader reader = new LdifReader(); 188 189 try { 190 reader.parseLdif(ldif); 191 fail(); 192 } 193 catch (LdifParseException e) { 194 } 196 } 197 198 203 public void testLdifParserCombinedEntriesChanges2() throws NamingException { 204 String ldif = 205 "version: 1\n" + 206 "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + 207 "cn: app1\n" + 208 "objectClass: top\n" + 209 "objectClass: apApplication\n" + 210 "displayName: app1 \n" + 211 "dependencies:\n" + 212 "envVars:\n" + 213 "\n" + 214 "# Delete an entry. The operation will attach the LDAPv3\n" + 215 "# Tree Delete Control defined in [9]. The criticality\n" + 216 "# field is \"true\" and the controlValue field is\n" + 217 "# absent, as required by [9].\n" + 218 "dn: ou=Product Development, dc=airius, dc=com\n" + 219 "changetype: delete\n"; 220 221 LdifReader reader = new LdifReader(); 222 223 try { 224 reader.parseLdif(ldif); 225 fail(); 226 } 227 catch (LdifParseException e) { 228 } 230 } 231 232 237 public void testLdifParserCombinedChangesEntries() throws NamingException { 238 String ldif = 239 "version: 1\n" + 240 "# Delete an entry. The operation will attach the LDAPv3\n" + 241 "# Tree Delete Control defined in [9]. The criticality\n" + 242 "# field is \"true\" and the controlValue field is\n" + 243 "# absent, as required by [9].\n" + 244 "dn: ou=Product Development, dc=airius, dc=com\n" + 245 "control: 1.2.840.11A556.1.4.805 true\n" + 246 "changetype: delete\n" + 247 "\n" + 248 "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + 249 "cn: app1\n" + 250 "objectClass: top\n" + 251 "objectClass: apApplication\n" + 252 "displayName: app1 \n" + 253 "dependencies:\n" + 254 "envVars:\n"; 255 256 LdifReader reader = new LdifReader(); 257 258 try { 259 reader.parseLdif(ldif); 260 fail(); 261 } 262 catch (LdifParseException e) { 263 } 265 } 266 267 272 public void testLdifParserCombinedChangesEntries2() throws NamingException { 273 String ldif = 274 "version: 1\n" + 275 "# Delete an entry. The operation will attach the LDAPv3\n" + 276 "# Tree Delete Control defined in [9]. The criticality\n" + 277 "# field is \"true\" and the controlValue field is\n" + 278 "# absent, as required by [9].\n" + 279 "dn: ou=Product Development, dc=airius, dc=com\n" + 280 "changetype: delete\n" + 281 "\n" + 282 "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + 283 "cn: app1\n" + 284 "objectClass: top\n" + 285 "objectClass: apApplication\n" + 286 "displayName: app1 \n" + 287 "dependencies:\n" + 288 "envVars:\n"; 289 290 LdifReader reader = new LdifReader(); 291 292 try { 293 reader.parseLdif(ldif); 294 fail(); 295 } 296 catch (LdifParseException e) { 297 } 299 } 300 301 public void testLdifParser() throws NamingException { 302 String ldif = 303 "version: 1\n" + 304 "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + 305 "cn: app1\n" + 306 "objectClass: top\n" + 307 "objectClass: apApplication\n" + 308 "displayName: app1 \n" + 309 "dependencies:\n" + 310 "envVars:"; 311 312 LdifReader reader = new LdifReader(); 313 List entries = reader.parseLdif(ldif); 314 315 assertNotNull(entries); 316 317 Entry entry = (Entry) entries.get(0); 318 assertTrue(entry.isChangeAdd()); 319 320 assertEquals("cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn()); 321 322 Attribute attr = entry.get("cn"); 323 assertTrue(attr.contains("app1")); 324 325 attr = entry.get("objectclass"); 326 assertTrue(attr.contains("top")); 327 assertTrue(attr.contains("apApplication")); 328 329 attr = entry.get("displayname"); 330 assertTrue(attr.contains("app1")); 331 332 attr = entry.get("dependencies"); 333 assertNull(attr.get()); 334 335 attr = entry.get("envvars"); 336 assertNull(attr.get()); 337 } 338 339 public void testLdifParserMuiltiLineComments() throws NamingException { 340 String ldif = 341 "#comment\n" + 342 " still a comment\n" + 343 "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + 344 "cn: app1#another comment\n" + 345 "objectClass: top\n" + 346 "objectClass: apApplication\n" + 347 "displayName: app1\n" + 348 "serviceType: http\n" + 349 "dependencies:\n" + 350 "httpHeaders:\n" + 351 "startupOptions:\n" + 352 "envVars:"; 353 354 LdifReader reader = new LdifReader(); 355 List entries = reader.parseLdif(ldif); 356 357 assertNotNull(entries); 358 359 Entry entry = (Entry) entries.get(0); 360 assertTrue(entry.isChangeAdd()); 361 362 assertEquals("cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn()); 363 364 Attribute attr = entry.get("cn"); 365 assertTrue(attr.contains("app1#another comment")); 366 367 attr = entry.get("objectclass"); 368 assertTrue(attr.contains("top")); 369 assertTrue(attr.contains("apApplication")); 370 371 attr = entry.get("displayname"); 372 assertTrue(attr.contains("app1")); 373 374 attr = entry.get("dependencies"); 375 assertNull(attr.get()); 376 377 attr = entry.get("envvars"); 378 assertNull(attr.get()); 379 } 380 381 public void testLdifParserMultiLineEntries() throws NamingException { 382 String ldif = 383 "#comment\n" + 384 "dn: cn=app1,ou=appli\n" + 385 " cations,ou=conf,dc=apache,dc=org\n" + 386 "cn: app1#another comment\n" + 387 "objectClass: top\n" + 388 "objectClass: apApplication\n" + 389 "displayName: app1\n" + 390 "serviceType: http\n" + 391 "dependencies:\n" + 392 "httpHeaders:\n" + 393 "startupOptions:\n" + 394 "envVars:"; 395 396 LdifReader reader = new LdifReader(); 397 List entries = reader.parseLdif(ldif); 398 399 assertNotNull(entries); 400 401 Entry entry = (Entry) entries.get(0); 402 assertTrue(entry.isChangeAdd()); 403 404 assertEquals("cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn()); 405 406 Attribute attr = entry.get("cn"); 407 assertTrue(attr.contains("app1#another comment")); 408 409 attr = entry.get("objectclass"); 410 assertTrue(attr.contains("top")); 411 assertTrue(attr.contains("apApplication")); 412 413 attr = entry.get("displayname"); 414 assertTrue(attr.contains("app1")); 415 416 attr = entry.get("dependencies"); 417 assertNull(attr.get()); 418 419 attr = entry.get("envvars"); 420 assertNull(attr.get()); 421 } 422 423 public void testLdifParserBase64() throws NamingException , UnsupportedEncodingException { 424 String ldif = 425 "#comment\n" + 426 "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + 427 "cn:: RW1tYW51ZWwgTMOpY2hhcm55\n" + 428 "objectClass: top\n" + 429 "objectClass: apApplication\n" + 430 "displayName: app1\n" + 431 "serviceType: http\n" + 432 "dependencies:\n" + 433 "httpHeaders:\n" + 434 "startupOptions:\n" + 435 "envVars:"; 436 437 LdifReader reader = new LdifReader(); 438 List entries = reader.parseLdif(ldif); 439 440 assertNotNull(entries); 441 442 Entry entry = (Entry) entries.get(0); 443 assertTrue(entry.isChangeAdd()); 444 445 assertEquals("cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn()); 446 447 Attribute attr = entry.get("cn"); 448 assertTrue(attr.contains("Emmanuel L\u00e9charny".getBytes("UTF-8"))); 449 450 attr = entry.get("objectclass"); 451 assertTrue(attr.contains("top")); 452 assertTrue(attr.contains("apApplication")); 453 454 attr = entry.get("displayname"); 455 assertTrue(attr.contains("app1")); 456 457 attr = entry.get("dependencies"); 458 assertNull(attr.get()); 459 460 attr = entry.get("envvars"); 461 assertNull(attr.get()); 462 } 463 464 public void testLdifParserBase64MultiLine() throws NamingException , UnsupportedEncodingException { 465 String ldif = 466 "#comment\n" + 467 "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" + 468 "cn:: RW1tYW51ZWwg\n" + 469 " TMOpY2hhcm55ICA=\n" + 470 "objectClass: top\n" + 471 "objectClass: apApplication\n" + 472 "displayName: app1\n" + 473 "serviceType: http\n" + 474 "dependencies:\n" + 475 "httpHeaders:\n" + 476 "startupOptions:\n" + 477 "envVars:"; 478 479 LdifReader reader = new LdifReader(); 480 List entries = reader.parseLdif(ldif); 481 482 assertNotNull(entries); 483 484 Entry entry = (Entry) entries.get(0); 485 assertTrue(entry.isChangeAdd()); 486 487 assertEquals("cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn()); 488 489 Attribute attr = entry.get("cn"); 490 assertTrue(attr.contains("Emmanuel L\u00e9charny ".getBytes("UTF-8"))); 491 492 attr = entry.get("objectclass"); 493 assertTrue(attr.contains("top")); 494 assertTrue(attr.contains("apApplication")); 495 496 attr = entry.get("displayname"); 497 assertTrue(attr.contains("app1")); 498 499 attr = entry.get("dependencies"); 500 assertNull(attr.get()); 501 502 attr = entry.get("envvars"); 503 assertNull(attr.get()); 504 } 505 506 public void testLdifParserRFC2849Sample1() throws NamingException { 507 String ldif = 508 "version: 1\n" + 509 "dn: cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com\n" + 510 "objectclass: top\n" + 511 "objectclass: person\n" + 512 "objectclass: organizationalPerson\n" + 513 "cn: Barbara Jensen\n" + 514 "cn: Barbara J Jensen\n" + 515 "cn: Babs Jensen\n" + 516 "sn: Jensen\n" + 517 "uid: bjensen\n" + 518 "telephonenumber: +1 408 555 1212\n" + 519 "description: A big sailing fan.\n" + 520 "\n" + 521 "dn: cn=Bjorn Jensen, ou=Accounting, dc=airius, dc=com\n" + 522 "objectclass: top\n" + 523 "objectclass: person\n" + 524 "objectclass: organizationalPerson\n" + 525 "cn: Bjorn Jensen\n" + 526 "sn: Jensen\n" + 527 "telephonenumber: +1 408 555 1212"; 528 529 LdifReader reader = new LdifReader(); 530 List entries = reader.parseLdif(ldif); 531 532 assertEquals(2, entries.size()); 533 534 Entry entry = (Entry) entries.get(0); 536 assertTrue(entry.isChangeAdd()); 537 538 assertEquals("cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com", entry.getDn()); 539 540 Attribute attr = entry.get("objectclass"); 541 assertTrue(attr.contains("top")); 542 assertTrue(attr.contains("person")); 543 assertTrue(attr.contains("organizationalPerson")); 544 545 attr = entry.get("cn"); 546 assertTrue(attr.contains("Barbara Jensen")); 547 assertTrue(attr.contains("Barbara J Jensen")); 548 assertTrue(attr.contains("Babs Jensen")); 549 550 attr = entry.get("sn"); 551 assertTrue(attr.contains("Jensen")); 552 553 attr = entry.get("uid"); 554 assertTrue(attr.contains("bjensen")); 555 556 attr = entry.get("telephonenumber"); 557 assertTrue(attr.contains("+1 408 555 1212")); 558 559 attr = entry.get("description"); 560 assertTrue(attr.contains("A big sailing fan.")); 561 562 entry = (Entry) entries.get(1); 564 assertTrue(entry.isChangeAdd()); 565 566 assertEquals("cn=Bjorn Jensen, ou=Accounting, dc=airius, dc=com", entry.getDn()); 567 568 attr = entry.get("objectclass"); 569 assertTrue(attr.contains("top")); 570 assertTrue(attr.contains("person")); 571 assertTrue(attr.contains("organizationalPerson")); 572 573 attr = entry.get("cn"); 574 assertTrue(attr.contains("Bjorn Jensen")); 575 576 attr = entry.get("sn"); 577 assertTrue(attr.contains("Jensen")); 578 579 attr = entry.get("telephonenumber"); 580 assertTrue(attr.contains("+1 408 555 1212")); 581 } 582 583 public void testLdifParserRFC2849Sample2() throws NamingException { 584 String ldif = 585 "version: 1\n" + 586 "dn: cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com\n" + 587 "objectclass: top\n" + 588 "objectclass: person\n" + 589 "objectclass: organizationalPerson\n" + 590 "cn: Barbara Jensen\n" + 591 "cn: Barbara J Jensen\n" + 592 "cn: Babs Jensen\n" + 593 "sn: Jensen\n" + 594 "uid: bjensen\n" + 595 "telephonenumber: +1 408 555 1212\n" + 596 "description:Babs is a big sailing fan, and travels extensively in sea\n" + 597 " rch of perfect sailing conditions.\n" + 598 "title:Product Manager, Rod and Reel Division"; 599 600 LdifReader reader = new LdifReader(); 601 List entries = reader.parseLdif(ldif); 602 603 assertEquals(1, entries.size()); 604 605 Entry entry = (Entry) entries.get(0); 607 assertTrue(entry.isChangeAdd()); 608 609 assertEquals("cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com", entry.getDn()); 610 611 Attribute attr = entry.get("objectclass"); 612 assertTrue(attr.contains("top")); 613 assertTrue(attr.contains("person")); 614 assertTrue(attr.contains("organizationalPerson")); 615 616 attr = entry.get("cn"); 617 assertTrue(attr.contains("Barbara Jensen")); 618 assertTrue(attr.contains("Barbara J Jensen")); 619 assertTrue(attr.contains("Babs Jensen")); 620 621 attr = entry.get("sn"); 622 assertTrue(attr.contains("Jensen")); 623 624 attr = entry.get("uid"); 625 assertTrue(attr.contains("bjensen")); 626 627 attr = entry.get("telephonenumber"); 628 assertTrue(attr.contains("+1 408 555 1212")); 629 630 attr = entry.get("description"); 631 assertTrue(attr 632 .contains("Babs is a big sailing fan, and travels extensively in search of perfect sailing conditions.")); 633 634 attr = entry.get("title"); 635 assertTrue(attr.contains("Product Manager, Rod and Reel Division")); 636 637 } 638 639 public void testLdifParserRFC2849Sample3() throws NamingException , Exception { 640 String ldif = 641 "version: 1\n" + 642 "dn: cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com\n" + 643 "objectclass: top\n" + 644 "objectclass: person\n" + 645 "objectclass: organizationalPerson\n" + 646 "cn: Gern Jensen\n" + 647 "cn: Gern O Jensen\n" + 648 "sn: Jensen\n" + 649 "uid: gernj\n" + 650 "telephonenumber: +1 408 555 1212\n" + 651 "description:: V2hhdCBhIGNhcmVmdWwgcmVhZGVyIHlvdSBhcmUhICBUaGlzIHZhbHVl\n" + 652 " IGlzIGJhc2UtNjQtZW5jb2RlZCBiZWNhdXNlIGl0IGhhcyBhIGNvbnRyb2wgY2hhcmFjdG\n" + 653 " VyIGluIGl0IChhIENSKS4NICBCeSB0aGUgd2F5LCB5b3Ugc2hvdWxkIHJlYWxseSBnZXQg\n" + 654 " b3V0IG1vcmUu"; 655 656 LdifReader reader = new LdifReader(); 657 List entries = reader.parseLdif(ldif); 658 659 assertEquals(1, entries.size()); 660 661 Entry entry = (Entry) entries.get(0); 663 assertTrue(entry.isChangeAdd()); 664 665 assertEquals("cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com", entry.getDn()); 666 667 Attribute attr = entry.get("objectclass"); 668 assertTrue(attr.contains("top")); 669 assertTrue(attr.contains("person")); 670 assertTrue(attr.contains("organizationalPerson")); 671 672 attr = entry.get("cn"); 673 assertTrue(attr.contains("Gern Jensen")); 674 assertTrue(attr.contains("Gern O Jensen")); 675 676 attr = entry.get("sn"); 677 assertTrue(attr.contains("Jensen")); 678 679 attr = entry.get("uid"); 680 assertTrue(attr.contains("gernj")); 681 682 attr = entry.get("telephonenumber"); 683 assertTrue(attr.contains("+1 408 555 1212")); 684 685 attr = entry.get("description"); 686 assertTrue(attr 687 .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." 688 .getBytes("UTF-8"))); 689 } 690 691 public void testLdifParserRFC2849Sample3VariousSpacing() throws NamingException , Exception { 692 String ldif = 693 "version:1\n" + 694 "dn:cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com \n" + 695 "objectclass:top\n" + 696 "objectclass: person \n" + 697 "objectclass:organizationalPerson\n" + 698 "cn:Gern Jensen\n" + 699 "cn:Gern O Jensen\n" + 700 "sn:Jensen\n" + 701 "uid:gernj\n" + 702 "telephonenumber:+1 408 555 1212 \n" + 703 "description:: V2hhdCBhIGNhcmVmdWwgcmVhZGVyIHlvdSBhcmUhICBUaGlzIHZhbHVl\n" + 704 " IGlzIGJhc2UtNjQtZW5jb2RlZCBiZWNhdXNlIGl0IGhhcyBhIGNvbnRyb2wgY2hhcmFjdG\n" + 705 " VyIGluIGl0IChhIENSKS4NICBCeSB0aGUgd2F5LCB5b3Ugc2hvdWxkIHJlYWxseSBnZXQg\n" + 706 " b3V0IG1vcmUu "; 707 708 LdifReader reader = new LdifReader(); 709 List entries = reader.parseLdif(ldif); 710 711 assertEquals(1, entries.size()); 712 713 Entry entry = (Entry) entries.get(0); 715 assertTrue(entry.isChangeAdd()); 716 717 assertEquals("cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com", entry.getDn()); 718 719 Attribute attr = entry.get("objectclass"); 720 assertTrue(attr.contains("top")); 721 assertTrue(attr.contains("person")); 722 assertTrue(attr.contains("organizationalPerson")); 723 724 attr = entry.get("cn"); 725 assertTrue(attr.contains("Gern Jensen")); 726 assertTrue(attr.contains("Gern O Jensen")); 727 728 attr = entry.get("sn"); 729 assertTrue(attr.contains("Jensen")); 730 731 attr = entry.get("uid"); 732 assertTrue(attr.contains("gernj")); 733 734 attr = entry.get("telephonenumber"); 735 assertTrue(attr.contains("+1 408 555 1212")); 736 737 attr = entry.get("description"); 738 assertTrue(attr 739 .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." 740 .getBytes("UTF-8"))); 741 } 742 743 public void testLdifParserRFC2849Sample4() throws NamingException , Exception { 744 String ldif = 745 "version: 1\n" + 746 "dn:: b3U95Za25qWt6YOoLG89QWlyaXVz\n" + 747 "# dn:: ou=õÖ?öåíùÃè,o=Airius\n" + 748 "objectclass: top\n" + 749 "objectclass: organizationalUnit\n" + 750 "ou:: 5Za25qWt6YOo\n" + 751 "# ou:: õÖ?öåíùÃè\n" + 752 "ou;lang-ja:: 5Za25qWt6YOo\n" + 753 "# ou;lang-ja:: õÖ?öåíùÃè\n" + 754 "ou;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2\n" + 755 "# ou;lang-ja:: óÁÈóÁÄóÁÎóÂÇóÁÆóÁ?\n" + 756 "ou;lang-en: Sales\n" + 757 "description: Japanese office\n" + 758 "\n" + 759 "dn:: dWlkPXJvZ2FzYXdhcmEsb3U95Za25qWt6YOoLG89QWlyaXVz\n" + 760 "# dn:: uid=rogasawara,ou=õÖ?öåíùÃè,o=Airius\n" + 761 "userpassword: {SHA}O3HSv1MusyL4kTjP+HKI5uxuNoM=\n" + 762 "objectclass: top\n" + 763 "objectclass: person\n" + 764 "objectclass: organizationalPerson\n" + 765 "objectclass: inetOrgPerson\n" + 766 "uid: rogasawara\n" + 767 "mail: rogasawara@airius.co.jp\n" + 768 "givenname;lang-ja:: 44Ot44OJ44OL44O8\n" + 769 "# givenname;lang-ja:: óÃíóÃÉóÃËóÃ?\n" + 770 "sn;lang-ja:: 5bCP56yg5Y6f\n" + 771 "# sn;lang-ja:: õ?Ï÷ìàõÎß\n" + 772 "cn;lang-ja:: 5bCP56yg5Y6fIOODreODieODi+ODvA==\n" + 773 "# cn;lang-ja:: õ?Ï÷ìàõÎß óÃíóÃÉóÃËóÃ?\n" + 774 "title;lang-ja:: 5Za25qWt6YOoIOmDqOmVtw==\n" + 775 "# title;lang-ja:: õÖ?öåíùÃè ùÃèùÕ?\n" + 776 "preferredlanguage: ja\n" + 777 "givenname:: 44Ot44OJ44OL44O8\n" + 778 "# givenname:: óÃíóÃÉóÃËóÃ?\n" + 779 "sn:: 5bCP56yg5Y6f\n" + 780 "# sn:: õ?Ï÷ìàõÎß\n" + 781 "cn:: 5bCP56yg5Y6fIOODreODieODi+ODvA==\n" + 782 "# cn:: õ?Ï÷ìàõÎß óÃíóÃÉóÃËóÃ?\n" + 783 "title:: 5Za25qWt6YOoIOmDqOmVtw==\n" + 784 "# title:: õÖ?öåíùÃè ùÃèùÕ?\n" + 785 "givenname;lang-ja;phonetic:: 44KN44Gp44Gr44O8\n" + 786 "# givenname;lang-ja;phonetic:: óÂÍóÁéóÁëóÃ?\n" + 787 "sn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJ\n" + 788 "# sn;lang-ja;phonetic:: óÁÊóÁÌóÁÕóÂÏóÂÉ\n" + 789 "cn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJIOOCjeOBqeOBq+ODvA==\n" + 790 "# cn;lang-ja;phonetic:: óÁÊóÁÌóÁÎóÂÏóÂÉ óÂÍóÁéóÁëóÃ?\n" + 791 "title;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2IOOBtuOBoeOCh+OBhg==\n" + 792 "# title;lang-ja;phonetic::\n" + 793 "# óÁÈóÁÄóÁÎóÂÇóÁÆóÁ? óÁ?óÁáóÂÇóÁÆ\n" + 794 "givenname;lang-en: Rodney\n" + 795 "sn;lang-en: Ogasawara\n" + 796 "cn;lang-en: Rodney Ogasawara\n" + 797 "title;lang-en: Sales, Director\n"; 798 799 LdifReader reader = new LdifReader(); 800 List entries = reader.parseLdif(ldif); 801 802 String [][][] values = 803 { 804 { 805 {"dn", "ou=\u55b6\u696d\u90e8,o=Airius"}, {"objectclass", "top"}, 807 {"objectclass", "organizationalUnit"}, 808 {"ou", "\u55b6\u696d\u90e8"}, 809 {"ou;lang-ja", "\u55b6\u696d\u90e8"}, 810 {"ou;lang-ja;phonetic", "\u3048\u3044\u304e\u3087\u3046\u3076"}, {"ou;lang-en", "Sales"}, 813 {"description", "Japanese office"}}, 814 { 815 {"dn", "uid=rogasawara,ou=\u55b6\u696d\u90e8,o=Airius"}, 816 {"userpassword", "{SHA}O3HSv1MusyL4kTjP+HKI5uxuNoM="}, 817 {"objectclass", "top"}, 818 {"objectclass", "person"}, 819 {"objectclass", "organizationalPerson"}, 820 {"objectclass", "inetOrgPerson"}, 821 {"uid", "rogasawara"}, 822 {"mail", "rogasawara@airius.co.jp"}, 823 {"givenname;lang-ja", "\u30ed\u30c9\u30cb\u30fc"}, {"sn;lang-ja", "\u5c0f\u7b20\u539f"}, {"cn;lang-ja", "\u5c0f\u7b20\u539f \u30ed\u30c9\u30cb\u30fc"}, 826 {"title;lang-ja", "\u55b6\u696d\u90e8 \u90e8\u9577"}, {"preferredlanguage", "ja"}, 828 {"givenname", "\u30ed\u30c9\u30cb\u30fc"}, 829 {"sn", "\u5c0f\u7b20\u539f"}, 830 {"cn", "\u5c0f\u7b20\u539f \u30ed\u30c9\u30cb\u30fc"}, 831 {"title", "\u55b6\u696d\u90e8 \u90e8\u9577"}, 832 {"givenname;lang-ja;phonetic", "\u308d\u3069\u306b\u30fc"}, {"sn;lang-ja;phonetic", "\u304a\u304c\u3055\u308f\u3089"}, {"cn;lang-ja;phonetic", "\u304a\u304c\u3055\u308f\u3089 \u308d\u3069\u306b\u30fc"}, 835 {"title;lang-ja;phonetic", "\u3048\u3044\u304e\u3087\u3046\u3076 \u3076\u3061\u3087\u3046"}, {"givenname;lang-en", "Rodney"}, 837 {"sn;lang-en", "Ogasawara"}, 838 {"cn;lang-en", "Rodney Ogasawara"}, 839 {"title;lang-en", "Sales, Director"} 840 } 841 }; 842 843 assertEquals(2, entries.size()); 844 845 for (int i = 0; i < entries.size(); i++) { 847 Entry entry = (Entry) entries.get(i); 848 assertTrue(entry.isChangeAdd()); 849 850 for (int j = 0; j < values[i].length; j++) { 851 if ("dn".equalsIgnoreCase(values[i][j][0])) { 852 assertEquals(values[i][j][1], entry.getDn()); 853 } else { 854 Attribute attr = entry.get(values[i][j][0]); 855 856 if (attr.contains(values[i][j][1])) { 857 assertTrue(true); 858 } else { 859 assertTrue(attr.contains(values[i][j][1].getBytes("UTF-8"))); 860 } 861 } 862 } 863 } 864 } 865 866 public void testLdifParserRFC2849Sample5() throws NamingException , Exception { 867 String ldif = 868 "version: 1\n" + 869 "dn: cn=Horatio Jensen, ou=Product Testing, dc=airius, dc=com\n" + 870 "objectclass: top\n" + 871 "objectclass: person\n" + 872 "objectclass: organizationalPerson\n" + 873 "cn: Horatio Jensen\n" + 874 "cn: Horatio N Jensen\n" + 875 "sn: Jensen\n" + 876 "uid: hjensen\n" + 877 "telephonenumber: +1 408 555 1212\n" + 878 "jpegphoto:< file:" + HJENSEN_JPEG_FILE.getAbsolutePath() + "\n"; 879 880 LdifReader reader = new LdifReader(); 881 List entries = reader.parseLdif(ldif); 882 883 String [][] values = 884 { 885 {"dn", "cn=Horatio Jensen, ou=Product Testing, dc=airius, dc=com"}, 886 {"objectclass", "top"}, 887 {"objectclass", "person"}, 888 {"objectclass", "organizationalPerson"}, 889 {"cn", "Horatio Jensen"}, 890 {"cn", "Horatio N Jensen"}, 891 {"sn", "Jensen"}, 892 {"uid", "hjensen"}, 893 {"telephonenumber", "+1 408 555 1212"}, 894 {"jpegphoto", null} 895 }; 896 897 assertEquals(1, entries.size()); 898 899 Entry entry = (Entry) entries.get(0); 901 assertTrue(entry.isChangeAdd()); 902 903 for (int i = 0; i < values.length; i++) { 904 if ("dn".equalsIgnoreCase(values[i][0])) { 905 assertEquals(values[i][1], entry.getDn()); 906 } else if ("jpegphoto".equalsIgnoreCase(values[i][0])) { 907 Attribute attr = entry.get(values[i][0]); 908 assertTrue(Arrays.equals(data, (byte[]) attr.get())); 909 } else { 910 Attribute attr = entry.get(values[i][0]); 911 912 if (attr.contains(values[i][1])) { 913 assertTrue(true); 914 } else { 915 assertTrue(attr.contains(values[i][1].getBytes("UTF-8"))); 916 } 917 } 918 } 919 } 920 921 public void testLdifParserRFC2849Sample5WithSizeLimit() throws NamingException , Exception { 922 String ldif = 923 "version: 1\n" + 924 "dn: cn=Horatio Jensen, ou=Product Testing, dc=airius, dc=com\n" + 925 "objectclass: top\n" + 926 "objectclass: person\n" + 927 "objectclass: organizationalPerson\n" + 928 "cn: Horatio Jensen\n" + 929 "cn: Horatio N Jensen\n" + 930 "sn: Jensen\n" + 931 "uid: hjensen\n" + 932 "telephonenumber: +1 408 555 1212\n" + 933 "jpegphoto:< file:" + HJENSEN_JPEG_FILE.getAbsolutePath() + "\n"; 934 935 LdifReader reader = new LdifReader(); 936 reader.setSizeLimit(128); 937 938 try { 939 reader.parseLdif(ldif); 940 fail(); 941 } 942 catch (LdifParseException e) { 943 final Throwable cause = e.getCause(); 944 assertTrue("Content too long exception must be thrown", 945 cause !=null && cause.getMessage().indexOf("too long")>0); 946 } 947 } 948 949 public void testLdifParserRFC2849Sample6() throws NamingException , Exception { 950 String ldif = 951 "version: 1\n" + 952 "# Add a new entry\n" + 954 "dn: cn=Fiona Jensen, ou=Marketing, dc=airius, dc=com\n" + 955 "changetype: add\n" + 956 "objectclass: top\n" + 957 "objectclass: person\n" + 958 "objectclass: organizationalPerson\n" + 959 "cn: Fiona Jensen\n" + 960 "sn: Jensen\n" + 961 "uid: fiona\n" + 962 "telephonenumber: +1 408 555 1212\n" + 963 "jpegphoto:< file:" + FIONA_JPEG_FILE.getAbsolutePath() + "\n" + 964 "\n" + 965 "# Delete an existing entry\n" + 967 "dn: cn=Robert Jensen, ou=Marketing, dc=airius, dc=com\n" + 968 "changetype: delete\n" + 969 "\n" + 970 "# Modify an entry's relative distinguished name\n" + 972 "dn: cn=Paul Jensen, ou=Product Development, dc=airius, dc=com\n" + 973 "changetype: modrdn\n" + 974 "newrdn: cn=Paula Jensen\n" + 975 "deleteoldrdn: 1\n" + 976 "\n" + 977 "# Rename an entry and move all of its children to a new location in\n" + 979 "# the directory tree (only implemented by LDAPv3 servers).\n" + 980 "dn: ou=PD Accountants, ou=Product Development, dc=airius, dc=com\n" + 981 "changetype: moddn\n" + 982 "newrdn: ou=Product Development Accountants\n" + 983 "deleteoldrdn: 0\n" + 984 "newsuperior: ou=Accounting, dc=airius, dc=com\n" + 985 "# Modify an entry: add an additional value to the postaladdress\n" + 986 "# attribute, completely delete the description attribute, replace\n" + 987 "# the telephonenumber attribute with two values, and delete a specific\n" + 988 "# value from the facsimiletelephonenumber attribute\n" + 989 "\n" + 990 "dn: cn=Paula Jensen, ou=Product Development, dc=airius, dc=com\n" + 992 "changetype: modify\n" + 993 "add: postaladdress\n" + 994 "postaladdress: 123 Anystreet $ Sunnyvale, CA $ 94086\n" + 995 "-\n" + 996 "delete: description\n" + 997 "-\n" + 998 "replace: telephonenumber\n" + 999 "telephonenumber: +1 408 555 1234\n" + 1000 "telephonenumber: +1 408 555 5678\n" + 1001 "-\n" + 1002 "delete: facsimiletelephonenumber\n" + 1003 "facsimiletelephonenumber: +1 408 555 9876\n" + 1004 "-\n" + 1005 "\n" + 1006 "# Modify an entry: replace the postaladdress attribute with an empty\n" + 1008 "# set of values (which will cause the attribute to be removed), and\n" + 1009 "# delete the entire description attribute. Note that the first will\n" + 1010 "# always succeed, while the second will only succeed if at least\n" + 1011 "# one value for the description attribute is present.\n" + 1012 "dn: cn=Ingrid Jensen, ou=Product Support, dc=airius, dc=com\n" + 1013 "changetype: modify\n" + 1014 "replace: postaladdress\n" + 1015 "-\n" + 1016 "delete: description\n" + 1017 "-\n"; 1018 1019 LdifReader reader = new LdifReader(); 1020 List entries = reader.parseLdif(ldif); 1021 1022 String [][][] values = 1023 { 1024 { 1026 {"dn", "cn=Fiona Jensen, ou=Marketing, dc=airius, dc=com"}, 1027 {"objectclass", "top"}, 1028 {"objectclass", "person"}, 1029 {"objectclass", "organizationalPerson"}, 1030 {"cn", "Fiona Jensen"}, 1031 {"sn", "Jensen"}, 1032 {"uid", "fiona"}, 1033 {"telephonenumber", "+1 408 555 1212"}, 1034 {"jpegphoto", ""} 1035 }, 1036 { 1038 {"dn", "cn=Robert Jensen, ou=Marketing, dc=airius, dc=com"} 1039 }, 1040 { 1042 {"dn", "cn=Paul Jensen, ou=Product Development, dc=airius, dc=com"}, 1043 {"cn=Paula Jensen"} 1044 }, 1045 { 1047 {"dn", "ou=PD Accountants, ou=Product Development, dc=airius, dc=com"}, 1048 {"ou=Product Development Accountants"}, 1049 {"ou=Accounting, dc=airius, dc=com"} 1050 }, 1051 { 1053 {"dn", "cn=Paula Jensen, ou=Product Development, dc=airius, dc=com"}, 1054 {"postaladdress", "123 Anystreet $ Sunnyvale, CA $ 94086"}, 1056 {"description"}, 1058 {"telephonenumber", "+1 408 555 1234", "+1 408 555 5678"}, 1060 {"facsimiletelephonenumber", "+1 408 555 9876"}, 1062 }, 1063 { 1065 {"dn", "cn=Ingrid Jensen, ou=Product Support, dc=airius, dc=com"}, 1066 {"postaladdress"}, 1068 {"description"} 1070 } 1071 }; 1072 1073 Entry entry = (Entry) entries.get(0); 1074 assertTrue(entry.isChangeAdd()); 1075 1076 for (int i = 0; i < values.length; i++) { 1077 if ("dn".equalsIgnoreCase(values[0][i][0])) { 1078 assertEquals(values[0][i][1], entry.getDn()); 1079 } else if ("jpegphoto".equalsIgnoreCase(values[0][i][0])) { 1080 Attribute attr = entry.get(values[0][i][0]); 1081 assertTrue(Arrays.equals(data, (byte[]) attr.get())); 1082 } else { 1083 Attribute attr = entry.get(values[0][i][0]); 1084 1085 if (attr.contains(values[0][i][1])) { 1086 assertTrue(true); 1087 } else { 1088 assertTrue(attr.contains(values[0][i][1].getBytes("UTF-8"))); 1089 } 1090 } 1091 } 1092 1093 entry = (Entry) entries.get(1); 1095 assertTrue(entry.isChangeDelete()); 1096 assertEquals(values[1][0][1], entry.getDn()); 1097 1098 entry = (Entry) entries.get(2); 1100 assertTrue(entry.isChangeModRdn()); 1101 assertEquals(values[2][0][1], entry.getDn()); 1102 assertEquals(values[2][1][0], entry.getNewRdn()); 1103 assertTrue(entry.isDeleteOldRdn()); 1104 1105 entry = (Entry) entries.get(3); 1107 assertTrue(entry.isChangeModDn()); 1108 assertEquals(values[3][0][1], entry.getDn()); 1109 assertEquals(values[3][1][0], entry.getNewRdn()); 1110 assertFalse(entry.isDeleteOldRdn()); 1111 assertEquals(values[3][2][0], entry.getNewSuperior()); 1112 1113 entry = (Entry) entries.get(4); 1115 List modifs = entry.getModificationItems(); 1116 1117 assertTrue(entry.isChangeModify()); 1118 assertEquals(values[4][0][1], entry.getDn()); 1119 1120 ModificationItem item = (ModificationItem ) modifs.get(0); 1123 assertEquals(DirContext.ADD_ATTRIBUTE, item.getModificationOp()); 1124 assertEquals(values[4][1][0], item.getAttribute().getID()); 1125 assertEquals(values[4][1][1], item.getAttribute().get(0)); 1126 1127 item = (ModificationItem ) modifs.get(1); 1129 assertEquals(DirContext.REMOVE_ATTRIBUTE, item.getModificationOp()); 1130 assertEquals(values[4][2][0], item.getAttribute().getID()); 1131 1132 item = (ModificationItem ) modifs.get(2); 1136 assertEquals(DirContext.REPLACE_ATTRIBUTE, item.getModificationOp()); 1137 assertEquals(values[4][3][0], item.getAttribute().getID()); 1138 assertEquals(values[4][3][1], item.getAttribute().get(0)); 1139 assertEquals(values[4][3][2], item.getAttribute().get(1)); 1140 1141 item = (ModificationItem ) modifs.get(3); 1144 assertEquals(DirContext.REMOVE_ATTRIBUTE, item.getModificationOp()); 1145 assertEquals(values[4][4][0], item.getAttribute().getID()); 1146 assertEquals(values[4][4][1], item.getAttribute().get(0)); 1147 1148 entry = (Entry) entries.get(5); 1150 modifs = entry.getModificationItems(); 1151 1152 assertTrue(entry.isChangeModify()); 1153 assertEquals(values[5][0][1], entry.getDn()); 1154 1155 item = (ModificationItem ) modifs.get(0); 1157 assertEquals(DirContext.REPLACE_ATTRIBUTE, item.getModificationOp()); 1158 assertEquals(values[5][1][0], item.getAttribute().getID()); 1159 1160 item = (ModificationItem ) modifs.get(1); 1162 assertEquals(DirContext.REMOVE_ATTRIBUTE, item.getModificationOp()); 1163 assertEquals(values[5][2][0], item.getAttribute().getID()); 1164 } 1165 1166 public void testLdifParserRFC2849Sample7() throws NamingException , Exception { 1167 String ldif = 1168 "version: 1\n" + 1169 "# Delete an entry. The operation will attach the LDAPv3\n" + 1170 "# Tree Delete Control defined in [9]. The criticality\n" + 1171 "# field is \"true\" and the controlValue field is\n" + 1172 "# absent, as required by [9].\n" + 1173 "dn: ou=Product Development, dc=airius, dc=com\n" + 1174 "control: 1.2.840.113556.1.4.805 true\n" + 1175 "changetype: delete\n"; 1176 1177 LdifReader reader = new LdifReader(); 1178 List entries = reader.parseLdif(ldif); 1179 1180 Entry entry = (Entry) entries.get(0); 1181 1182 assertEquals("ou=Product Development, dc=airius, dc=com", entry.getDn()); 1183 assertTrue(entry.isChangeDelete()); 1184 1185 Control control = entry.getControl(); 1187 1188 assertEquals("1.2.840.113556.1.4.805", control.getID()); 1189 assertTrue(control.isCritical()); 1190 } 1191 1192 public void testLdifParserRFC2849Sample7NoValueNoCritical() throws NamingException , Exception { 1193 String ldif = 1194 "version: 1\n" + 1195 "# Delete an entry. The operation will attach the LDAPv3\n" + 1196 "# Tree Delete Control defined in [9]. The criticality\n" + 1197 "# field is \"true\" and the controlValue field is\n" + 1198 "# absent, as required by [9].\n" + 1199 "dn: ou=Product Development, dc=airius, dc=com\n" + 1200 "control: 1.2.840.11556.1.4.805\n" + 1201 "changetype: delete\n"; 1202 1203 LdifReader reader = new LdifReader(); 1204 List entries = reader.parseLdif(ldif); 1205 1206 Entry entry = (Entry) entries.get(0); 1207 1208 assertEquals("ou=Product Development, dc=airius, dc=com", entry.getDn()); 1209 assertTrue(entry.isChangeDelete()); 1210 1211 Control control = entry.getControl(); 1213 1214 assertEquals("1.2.840.11556.1.4.805", control.getID()); 1215 assertFalse(control.isCritical()); 1216 } 1217 1218 public void testLdifParserRFC2849Sample7NoCritical() throws NamingException , Exception { 1219 String ldif = 1220 "version: 1\n" + 1221 "# Delete an entry. The operation will attach the LDAPv3\n" + 1222 "# Tree Delete Control defined in [9]. The criticality\n" + 1223 "# field is \"true\" and the controlValue field is\n" + 1224 "# absent, as required by [9].\n" + 1225 "dn: ou=Product Development, dc=airius, dc=com\n" + 1226 "control: 1.2.840.11556.1.4.805:control-value\n" + 1227 "changetype: delete\n"; 1228 1229 LdifReader reader = new LdifReader(); 1230 List entries = reader.parseLdif(ldif); 1231 1232 Entry entry = (Entry) entries.get(0); 1233 1234 assertEquals("ou=Product Development, dc=airius, dc=com", entry.getDn()); 1235 assertTrue(entry.isChangeDelete()); 1236 1237 Control control = entry.getControl(); 1239 1240 assertEquals("1.2.840.11556.1.4.805", control.getID()); 1241 assertFalse(control.isCritical()); 1242 assertEquals("control-value", new String (control.getEncodedValue())); 1243 } 1244 1245 public void testLdifParserRFC2849Sample7NoOid() throws NamingException , Exception { 1246 String ldif = 1247 "version: 1\n" + 1248 "# Delete an entry. The operation will attach the LDAPv3\n" + 1249 "# Tree Delete Control defined in [9]. The criticality\n" + 1250 "# field is \"true\" and the controlValue field is\n" + 1251 "# absent, as required by [9].\n" + 1252 "dn: ou=Product Development, dc=airius, dc=com\n" + 1253 "control: true\n" + 1254 "changetype: delete\n"; 1255 1256 LdifReader reader = new LdifReader(); 1257 1258 try { 1259 reader.parseLdif(ldif); 1260 fail(); 1261 } 1262 catch (LdifParseException e) { 1263 } 1265 } 1266 1267 public void testLdifParserRFC2849Sample7BadOid() throws NamingException , Exception { 1268 String ldif = 1269 "version: 1\n" + 1270 "# Delete an entry. The operation will attach the LDAPv3\n" + 1271 "# Tree Delete Control defined in [9]. The criticality\n" + 1272 "# field is \"true\" and the controlValue field is\n" + 1273 "# absent, as required by [9].\n" + 1274 "dn: ou=Product Development, dc=airius, dc=com\n" + 1275 "control: 1.2.840.11A556.1.4.805 true\n" + 1276 "changetype: delete\n"; 1277 1278 LdifReader reader = new LdifReader(); 1279 1280 try { 1281 reader.parseLdif(ldif); 1282 fail(); 1283 } 1284 catch (LdifParseException e) { 1285 } 1287 } 1288 1289 public void testLdifParserChangeModifyMultiAttrs() throws NamingException , Exception { 1290 String ldif = 1291 "version: 1\n" + 1292 "dn: ou=Product Development, dc=airius, dc=com\n" + 1293 "changetype: modify\n" + 1294 "add: postaladdress\n" + 1295 "postaladdress: 123 Anystreet $ Sunnyvale, CA $ 94086\n" + 1296 "-\n" + 1297 "delete: postaladdress\n" + 1298 "-\n" + 1299 "replace: telephonenumber\n" + 1300 "telephonenumber: +1 408 555 1234\n" + 1301 "telephonenumber: +1 408 555 5678\n" + 1302 "-\n" + 1303 "delete: facsimiletelephonenumber\n" + 1304 "facsimiletelephonenumber: +1 408 555 9876\n"; 1305 1306 LdifReader reader = new LdifReader(); 1307 1308 try { 1309 reader.parseLdif(ldif); 1310 fail(); 1311 } 1312 catch (LdifParseException e) { 1313 } 1315 } 1316} 1317 | Popular Tags |