1 19 package org.netbeans.modules.xml.text.structure; 20 21 import java.util.List ; 22 import java.util.Vector ; 23 import javax.swing.text.AttributeSet ; 24 import javax.swing.text.BadLocationException ; 25 import org.netbeans.editor.BaseDocument; 26 import org.netbeans.junit.NbTestCase; 27 import org.netbeans.modules.editor.structure.api.DocumentElement; 28 import org.netbeans.modules.editor.structure.api.DocumentElementEvent; 29 import org.netbeans.modules.editor.structure.api.DocumentElementListener; 30 import org.netbeans.modules.editor.structure.api.DocumentModel; 31 import org.netbeans.modules.editor.structure.api.DocumentModelException; 32 import org.netbeans.modules.editor.structure.api.DocumentModelListener; 33 import org.netbeans.modules.editor.structure.api.DocumentModelUtils; 34 import org.netbeans.modules.editor.structure.spi.DocumentModelProvider; 35 import org.netbeans.modules.xml.text.syntax.XMLKit; 36 import org.netbeans.modules.xml.text.test.TestBase; 37 38 39 43 public class XMLDocumentModelTest extends TestBase { 44 45 private static final int MODEL_TIMEOUT = 500; 47 BaseDocument doc = null; 48 49 public XMLDocumentModelTest() { 50 super("xml-document-model-test"); 51 } 52 53 public void setUp() throws BadLocationException { 54 } 55 56 protected void runTest() throws Throwable { 57 System.out.println(getName()); 58 super.runTest(); 59 } 60 public void testModelBasis() throws DocumentModelException, BadLocationException { 62 initDoc1(); 64 65 DocumentModel model = DocumentModel.getDocumentModel(doc); 67 68 assertNotNull(model); 69 70 assertNotNull(model.getDocument()); 71 72 DocumentElement root = model.getRootElement(); 73 assertNotNull(root); 74 75 assertNull(root.getParentElement()); 76 77 List children = root.getChildren(); 78 assertEquals(2, children.size()); 79 80 DocumentElement rootel = root.getElement(1); 82 assertEquals(root, rootel.getParentElement()); 84 85 assertEquals("root", rootel.getName()); 87 assertEquals(XMLDocumentModelProvider.XML_TAG, rootel.getType()); 88 89 assertEquals(21, rootel.getStartOffset()); 91 assertEquals(55, rootel.getEndOffset()); 92 93 assertEquals(2, rootel.getElementCount()); 95 96 DocumentElement a = rootel.getElement(0); 98 assertEquals(rootel, a.getParentElement()); 100 101 assertEquals( "a", a.getName()); 102 assertEquals(XMLDocumentModelProvider.XML_TAG, a.getType()); 103 assertEquals(27, a.getStartOffset()); 105 assertEquals(37, a.getEndOffset()); 106 107 DocumentElement b = rootel.getElement(1); 109 assertEquals(rootel, b.getParentElement()); 111 112 assertEquals("b", b.getName()); 113 assertEquals(XMLDocumentModelProvider.XML_TAG, b.getType()); 114 assertEquals(38, b.getStartOffset()); 116 assertEquals(48, b.getEndOffset()); 117 118 DocumentElement t = b.getElement(0); 120 assertEquals(b, t.getParentElement()); 122 123 assertEquals("...", t.getName()); 124 assertEquals(XMLDocumentModelProvider.XML_CONTENT, t.getType()); 125 assertEquals(41, t.getStartOffset()); 127 assertEquals(44, t.getEndOffset()); 128 129 } 130 131 132 public void testAddElement() throws DocumentModelException, BadLocationException , InterruptedException { 133 initDoc1(); 135 DocumentModel model = DocumentModel.getDocumentModel(doc); 137 138 DocumentElement root = model.getRootElement(); 139 DocumentElement rootTag = root.getElement(1); 141 final Vector addedElements = new Vector (); 143 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 144 public void documentElementAdded(DocumentElement de) { 145 addedElements.add(de); 146 } 147 }); 148 149 final Vector addedElements2 = new Vector (); 151 rootTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 152 public void elementAdded(DocumentElementEvent e) { 153 addedElements2.add(e.getChangedChild()); 154 } 155 }); 156 157 assertEquals(2, rootTag.getElementCount()); 159 161 doc.insertString(27,"<new></new>",null); 162 Thread.sleep(MODEL_TIMEOUT * 2); 164 167 assertEquals(3, rootTag.getElementCount()); 169 assertEquals(1, addedElements.size()); 171 assertEquals(1, addedElements2.size()); 172 173 DocumentElement newElement = rootTag.getElement(0); 174 assertEquals("new", newElement.getName()); 176 assertEquals(XMLDocumentModelProvider.XML_TAG, newElement.getType()); 177 assertEquals(27, newElement.getStartOffset()); 179 assertEquals(37, newElement.getEndOffset()); 180 181 assertEquals(0, newElement.getChildren().size()); 183 184 DocumentElement newElementParent = newElement.getParentElement(); 186 assertEquals(rootTag, newElementParent); 187 188 } 189 190 public void testRemoveEmptyTagElement() throws DocumentModelException, BadLocationException , InterruptedException { 191 initDoc1(); 193 DocumentModel model = DocumentModel.getDocumentModel(doc); 195 196 DocumentElement root = model.getRootElement(); 197 DocumentElement rootTag = root.getElement(1); DocumentElement aTag = rootTag.getElement(0); 200 final Vector removedElements = new Vector (); 202 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 203 public void documentElementRemoved(DocumentElement de) { 204 removedElements.add(de); 205 } 206 }); 207 208 final Vector removedElements2 = new Vector (); 210 aTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 211 public void elementRemoved(DocumentElementEvent e) { 212 removedElements2.add(e.getChangedChild()); 213 } 214 }); 215 216 assertEquals(1, aTag.getElementCount()); 218 doc.remove(30,"<c/>".length()); 219 Thread.sleep(MODEL_TIMEOUT * 2); 221 assertEquals(1, removedElements.size()); 222 assertEquals(1, removedElements2.size()); 223 224 assertEquals(0, aTag.getElementCount()); 226 } 227 228 public void testRemoveTagElementWithTextContent() throws DocumentModelException, BadLocationException , InterruptedException { 229 initDoc1(); 231 DocumentModel model = DocumentModel.getDocumentModel(doc); 233 234 DocumentElement root = model.getRootElement(); 235 DocumentElement rootTag = root.getElement(1); 237 final Vector removedElements = new Vector (); 239 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 240 public void documentElementRemoved(DocumentElement de) { 241 removedElements.add(de); 242 } 243 }); 244 245 final Vector removedElements2 = new Vector (); 247 rootTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 248 public void elementRemoved(DocumentElementEvent e) { 249 removedElements2.add(e.getChangedChild()); 250 } 251 }); 252 253 assertEquals(2, rootTag.getElementCount()); 255 doc.remove(38,"<b>text</b>".length()); 256 Thread.sleep(MODEL_TIMEOUT * 2); 258 assertEquals(2, removedElements.size()); assertEquals(2, removedElements2.size()); 260 261 assertEquals(1, rootTag.getElementCount()); 263 } 264 265 public void testRemoveNestedElements() throws DocumentModelException, BadLocationException , InterruptedException { 266 initDoc1(); 268 DocumentModel model = DocumentModel.getDocumentModel(doc); 270 271 DocumentElement root = model.getRootElement(); 272 DocumentElement rootTag = root.getElement(1); 274 final Vector removedElements = new Vector (); 276 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 277 public void documentElementRemoved(DocumentElement de) { 278 removedElements.add(de); 279 } 280 }); 281 282 final Vector removedElements2 = new Vector (); 284 rootTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 285 public void elementRemoved(DocumentElementEvent e) { 286 removedElements2.add(e.getChangedChild()); 287 } 288 }); 289 290 assertEquals(2, rootTag.getElementCount()); 292 294 doc.remove(27,"<a><c/></a>".length()); 295 Thread.sleep(MODEL_TIMEOUT * 2); 297 300 assertEquals(2, removedElements.size()); 303 assertEquals(2, removedElements2.size()); 304 305 assertEquals(1, rootTag.getElementCount()); 307 } 308 309 public void testRemoveAndAddEntireDocumentContent() throws DocumentModelException, BadLocationException , InterruptedException { 310 initDoc1(); 312 DocumentModel model = DocumentModel.getDocumentModel(doc); 314 315 DocumentElement root = model.getRootElement(); 316 317 321 322 final Vector removedElements = new Vector (); 324 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 325 public void documentElementRemoved(DocumentElement de) { 326 removedElements.add(de); 327 } 328 }); 329 330 final Vector removedElements2 = new Vector (); 332 root.addDocumentElementListener(new DocumentElementListenerAdapter() { 333 public void elementRemoved(DocumentElementEvent e) { 334 removedElements2.add(e.getChangedChild()); 335 } 336 }); 337 338 doc.remove(0,doc.getLength()); 340 Thread.sleep(MODEL_TIMEOUT * 2); 342 346 assertEquals(6, removedElements.size()); 348 assertEquals(6, removedElements2.size()); 354 assertEquals(0, root.getElementCount()); 356 358 final Vector addedElements = new Vector (); 360 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 361 public void documentElementAdded(DocumentElement de) { 362 addedElements.add(de); 363 } 364 }); 365 366 final Vector addedElements2 = new Vector (); 368 root.addDocumentElementListener(new DocumentElementListenerAdapter() { 369 public void elementAdded(DocumentElementEvent e) { 370 addedElements2.add(e.getChangedChild()); 371 } 372 }); 373 374 doc.insertString(0,"<?xml version='1.0'?><root><a><c/></a><b>text</b></root>",null); 375 Thread.sleep(MODEL_TIMEOUT * 2); 377 381 assertEquals(6, addedElements.size()); assertEquals(2, addedElements2.size()); 385 assertEquals(2, root.getElementCount()); 387 DocumentElement piTag = root.getElement(0); 389 assertNotNull(piTag); 390 391 DocumentElement rootTag = root.getElement(1); 393 assertNotNull(rootTag); 394 assertEquals("root", rootTag.getName()); 396 assertEquals(XMLDocumentModelProvider.XML_TAG, rootTag.getType()); 397 398 assertEquals(2, rootTag.getElementCount()); assertEquals(0, piTag.getElementCount()); 401 DocumentElement aTag = rootTag.getElement(0); 402 DocumentElement bTag = rootTag.getElement(1); 403 assertNotNull(aTag); 404 assertEquals("a", aTag.getName()); 405 assertNotNull(bTag); 406 assertEquals("b", bTag.getName()); 407 assertEquals(1, aTag.getElementCount()); assertEquals(1, bTag.getElementCount()); 410 DocumentElement cTag = aTag.getElement(0); 411 assertNotNull(cTag); 412 assertEquals("c", cTag.getName()); 413 assertEquals(0, cTag.getElementCount()); 415 DocumentElement text = bTag.getElement(0); 416 assertNotNull(text); 417 assertEquals(XMLDocumentModelProvider.XML_CONTENT, text.getType()); 418 assertEquals(0, text.getElementCount()); 420 } 421 422 public void testReplaceEntireDocumentContent() throws DocumentModelException, BadLocationException , InterruptedException { 423 initDoc1(); 425 DocumentModel model = DocumentModel.getDocumentModel(doc); 427 428 DocumentElement root = model.getRootElement(); 429 430 final Vector removedElements = new Vector (); 432 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 433 public void documentElementRemoved(DocumentElement de) { 434 removedElements.add(de); 435 } 436 }); 437 438 final Vector removedElements2 = new Vector (); 440 root.addDocumentElementListener(new DocumentElementListenerAdapter() { 441 public void elementRemoved(DocumentElementEvent e) { 442 removedElements2.add(e.getChangedChild()); 443 } 444 }); 445 446 doc.remove(0,doc.getLength()); 448 doc.insertString(0,"xxx",null); 449 Thread.sleep(MODEL_TIMEOUT * 2); 451 455 assertEquals(6, removedElements.size()); 457 assertEquals(6, removedElements2.size()); 463 assertEquals(1, root.getElementCount()); 465 DocumentElement text = root.getElement(0); 466 assertNotNull(text); 467 assertEquals(XMLDocumentModelProvider.XML_CONTENT, text.getType()); 468 assertEquals(0, text.getElementCount()); 470 } 471 472 public void testInvalidateTagElement() throws DocumentModelException, BadLocationException , InterruptedException { 475 initDoc1(); 477 DocumentModel model = DocumentModel.getDocumentModel(doc); 479 480 DocumentElement root = model.getRootElement(); 481 DocumentElement rootTag = root.getElement(1); DocumentElement aTag = rootTag.getElement(0); 483 DocumentElement bTag = rootTag.getElement(1); 484 485 final Vector addedElements = new Vector (); 487 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 488 public void documentElementAdded(DocumentElement de) { 489 addedElements.add(de); 490 } 491 }); 492 493 final Vector addedElements2 = new Vector (); 495 root.addDocumentElementListener(new DocumentElementListenerAdapter() { 496 public void elementAdded(DocumentElementEvent e) { 497 addedElements2.add(e.getChangedChild()); 498 } 499 }); 500 501 final Vector removedElements = new Vector (); 503 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 504 public void documentElementRemoved(DocumentElement de) { 505 removedElements.add(de); 506 } 507 }); 508 509 final Vector removedElements2 = new Vector (); 511 rootTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 512 public void elementRemoved(DocumentElementEvent e) { 513 removedElements2.add(e.getChangedChild()); 515 } 516 }); 517 518 assertEquals(2, root.getElementCount()); 520 522 doc.insertString(24,"X",null); 523 Thread.sleep(MODEL_TIMEOUT * 2); 525 528 assertEquals(3, root.getElementCount()); 530 assertEquals(0, addedElements.size()); 532 assertEquals(2, addedElements2.size()); 533 534 assertEquals(1, removedElements.size()); 535 assertEquals(2, removedElements2.size()); 537 assertEquals("b", bTag.getName()); 539 assertEquals(XMLDocumentModelProvider.XML_TAG, bTag.getType()); 540 assertEquals(1, bTag.getElementCount()); 541 assertEquals(root, bTag.getParentElement()); 542 543 assertEquals("a", aTag.getName()); 544 assertEquals(XMLDocumentModelProvider.XML_TAG, aTag.getType()); 545 assertEquals(1, aTag.getElementCount()); 546 assertEquals(root, aTag.getParentElement()); 547 548 assertEquals(28, aTag.getStartOffset()); 550 assertEquals(38, aTag.getEndOffset()); 551 552 try { 554 rootTag.getParentElement(); assertTrue("The removed element still can obtain its parent!?!?!", false); 556 } catch(IllegalArgumentException iae) { 557 } 559 560 assertEquals(0, rootTag.getChildren().size()); } 562 563 public void testCreateAndUpdateCommentElement() throws DocumentModelException, BadLocationException , InterruptedException { 564 initDoc1(); 566 DocumentModel model = DocumentModel.getDocumentModel(doc); 568 569 DocumentElement root = model.getRootElement(); 570 DocumentElement rootTag = root.getElement(1); DocumentElement aTag = rootTag.getElement(0); 572 573 final Vector addedElements = new Vector (); 575 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 576 public void documentElementAdded(DocumentElement de) { 577 addedElements.add(de); 579 } 580 }); 581 582 final Vector addedElementsToATag = new Vector (); 584 aTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 585 public void elementAdded(DocumentElementEvent e) { 586 addedElementsToATag.add(e.getChangedChild()); 587 } 588 }); 589 590 assertEquals(1, aTag.getElementCount()); 592 doc.insertString(30,"<!-- xml comment -->",null); 593 Thread.sleep(MODEL_TIMEOUT * 2); 599 602 assertEquals(1, addedElements.size()); 604 assertEquals(1, addedElementsToATag.size()); 605 606 assertEquals("a", aTag.getName()); 608 assertEquals(XMLDocumentModelProvider.XML_TAG, aTag.getType()); 609 assertEquals(2, aTag.getElementCount()); assertEquals(rootTag, aTag.getParentElement()); 611 612 assertEquals(27, aTag.getStartOffset()); 614 assertEquals(57, aTag.getEndOffset()); 615 616 DocumentElement comment = aTag.getElement(0); 618 assertEquals("comment", comment.getName()); 619 assertEquals(XMLDocumentModelProvider.XML_COMMENT, comment.getType()); 620 assertEquals(0, comment.getElementCount()); assertEquals(aTag, comment.getParentElement()); 622 assertEquals(30, comment.getStartOffset()); 624 assertEquals(49, comment.getEndOffset()); 625 626 final Vector modifiedEls = new Vector (); 629 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 630 public void documentElementChanged(DocumentElement de) { 631 modifiedEls.add(de); 632 } 633 }); 634 final Vector commentModifications = new Vector (); 636 comment.addDocumentElementListener(new DocumentElementListenerAdapter() { 637 public void contentChanged(DocumentElementEvent de) { 638 commentModifications.add(de); 639 } 640 }); 641 doc.insertString(36,"big ",null); 642 Thread.sleep(MODEL_TIMEOUT * 2); 644 assertEquals(1, modifiedEls.size()); assertEquals(1, commentModifications.size()); 647 648 } 649 650 public void testElementAttributes() throws DocumentModelException, BadLocationException , InterruptedException { 651 initDoc2(); 653 DocumentModel model = DocumentModel.getDocumentModel(doc); 655 656 DocumentElement root = model.getRootElement(); 657 DocumentElement rootTag = root.getElement(1); 659 AttributeSet attrs = rootTag.getAttributes(); 660 assertNotNull(attrs); 661 662 assertEquals(1, attrs.getAttributeCount()); assertTrue(attrs.containsAttribute("attrname", "value")); 664 assertEquals("value", (String )attrs.getAttribute("attrname")); 665 666 final Vector modelAttrsChanges = new Vector (); 668 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 669 public void documentElementAttributesChanged(DocumentElement de) { 670 modelAttrsChanges.add(de); 671 } 672 }); 673 674 final Vector elementAttrsChanges = new Vector (); 676 rootTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 677 public void attributesChanged(DocumentElementEvent e) { 678 elementAttrsChanges.add(e.getChangedChild()); 679 } 680 }); 681 682 doc.insertString(39,"aaa",null); 683 Thread.sleep(MODEL_TIMEOUT * 2); 685 688 assertEquals(1, modelAttrsChanges.size()); 690 assertEquals(1, elementAttrsChanges.size()); 691 692 attrs = rootTag.getAttributes(); 694 assertNotNull(attrs); 695 696 assertEquals(1, attrs.getAttributeCount()); assertTrue(attrs.containsAttribute("attrname", "vaaaalue")); 698 assertEquals("vaaaalue", (String )attrs.getAttribute("attrname")); 699 700 701 } 702 703 public void testMergeTwoElementsIntoOne() throws DocumentModelException, BadLocationException , InterruptedException { 704 initDoc3(); 706 DocumentModel model = DocumentModel.getDocumentModel(doc); 708 DocumentElement root = model.getRootElement(); 709 710 System.out.println(doc.getText(0, doc.getLength())); 711 DocumentModelUtils.dumpElementStructure(root); 712 713 DocumentElement rootTag = root.getElement(1); DocumentElement wood1 = rootTag.getElement(0); 715 DocumentElement wood2 = rootTag.getElement(1); 716 717 assertEquals("tree", wood1.getName()); 718 assertEquals("tree", wood2.getName()); 719 720 final Vector modelChanges = new Vector (); 722 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 723 public void documentElementRemoved(DocumentElement de) { 724 modelChanges.add(de); 725 } 726 }); 727 728 final Vector elementChanges = new Vector (); 730 rootTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 731 public void elementRemoved(DocumentElementEvent e) { 732 elementChanges.add(e.getChangedChild()); 733 } 734 }); 735 736 doc.remove(40,"/><tree id=\"2\"".length()); 737 Thread.sleep(MODEL_TIMEOUT * 2); 739 System.out.println(doc.getText(0, doc.getLength())); 740 DocumentModelUtils.dumpElementStructure(root); 741 742 assertEquals(1, modelChanges.size()); 744 assertEquals(wood2, modelChanges.get(0)); 745 assertEquals(1, elementChanges.size()); 746 assertEquals(wood2, elementChanges.get(0)); 747 748 AttributeSet attrs = wood1.getAttributes(); 750 assertNotNull(attrs); 751 752 assertEquals(1, attrs.getAttributeCount()); assertTrue(attrs.containsAttribute("id", "1")); 754 755 } 756 757 public void testRemoveTwoElementsWithSameName() throws DocumentModelException, BadLocationException , InterruptedException { 758 initDoc3(); 760 DocumentModel model = DocumentModel.getDocumentModel(doc); 762 DocumentElement root = model.getRootElement(); 763 764 System.out.println(doc.getText(0, doc.getLength())); 765 DocumentModelUtils.dumpElementStructure(root); 766 767 DocumentElement rootTag = root.getElement(1); DocumentElement wood1 = rootTag.getElement(0); 769 DocumentElement wood2 = rootTag.getElement(1); 770 771 assertEquals("tree", wood1.getName()); 772 assertEquals("tree", wood2.getName()); 773 774 final Vector modelChanges = new Vector (); 776 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 777 public void documentElementRemoved(DocumentElement de) { 778 System.out.println("removed " + de); 779 modelChanges.add(de); 780 } 781 }); 782 783 final Vector elementChanges = new Vector (); 785 rootTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 786 public void elementRemoved(DocumentElementEvent e) { 787 System.out.println("removed " + e.getChangedChild()); 788 elementChanges.add(e.getChangedChild()); 789 } 790 }); 791 792 doc.remove(27, "<tree id=\"1\"/><tree id=\"2\"/>".length()); 793 Thread.sleep(MODEL_TIMEOUT * 2); 795 System.out.println(doc.getText(0, doc.getLength())); 796 DocumentModelUtils.dumpElementStructure(root); 797 798 assertEquals(2, elementChanges.size()); assertEquals(2, modelChanges.size()); 802 assertEquals(0, rootTag.getElementCount()); 803 804 } 805 806 public void testDoTwoModificationsOnVariousPlaces() throws DocumentModelException, BadLocationException , InterruptedException { 807 initDoc1(); 809 DocumentModel model = DocumentModel.getDocumentModel(doc); 811 DocumentElement root = model.getRootElement(); 812 813 System.out.println(doc.getText(0, doc.getLength())); 814 DocumentModelUtils.dumpElementStructure(root); 815 816 DocumentElement rootTag = root.getElement(1); DocumentElement aTag = rootTag.getElement(0); DocumentElement bTag= rootTag.getElement(1); 820 final Vector modelChanges = new Vector (); 822 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 823 public void documentElementAdded(DocumentElement de) { 824 modelChanges.add(de); 825 } 826 }); 827 828 final Vector aChanges = new Vector (); 830 aTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 831 public void elementAdded(DocumentElementEvent e) { 832 aChanges.add(e.getChangedChild()); 833 } 834 }); 835 836 final Vector bChanges = new Vector (); 837 bTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 838 public void elementAdded(DocumentElementEvent e) { 839 bChanges.add(e.getChangedChild()); 840 } 841 }); 842 843 doc.insertString(30,"<tag1></tag1>", null); 844 doc.insertString(41+"<tag1></tag1>".length(),"<tag2></tag2>", null); 845 Thread.sleep(MODEL_TIMEOUT * 2); 847 System.out.println(doc.getText(0, doc.getLength())); 848 DocumentModelUtils.dumpElementStructure(root); 849 850 assertEquals(2, modelChanges.size()); 852 853 assertEquals(1, aChanges.size()); 854 assertEquals(1, bChanges.size()); 855 856 DocumentElement tag1 = aTag.getElement(0); 857 assertNotNull(tag1); 858 assertEquals("tag1",tag1.getName()); 859 860 DocumentElement tag2 = bTag.getElement(0); 861 assertNotNull(tag2); 862 assertEquals("tag2",tag2.getName()); 863 864 } 865 866 public void testRemoveDocumentContentPartToTheEndOfTheFile() throws DocumentModelException, BadLocationException , InterruptedException { 867 initDoc1(); 869 DocumentModel model = DocumentModel.getDocumentModel(doc); 871 DocumentElement root = model.getRootElement(); 872 873 System.out.println(doc.getText(0, doc.getLength())); 874 DocumentModelUtils.dumpElementStructure(root); 875 876 final Vector modelChanges = new Vector (); 878 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 879 public void documentElementRemoved(DocumentElement de) { 880 System.out.println("removed " + de); 881 modelChanges.add(de); 882 } 883 }); 884 885 final Vector elementChanges = new Vector (); 887 root.addDocumentElementListener(new DocumentElementListenerAdapter() { 888 public void elementRemoved(DocumentElementEvent e) { 889 System.out.println("removed " + e.getChangedChild()); 890 elementChanges.add(e.getChangedChild()); 891 } 892 }); 893 894 doc.remove(21, doc.getLength() - 21); 895 Thread.sleep(MODEL_TIMEOUT * 2); 897 System.out.println(doc.getText(0, doc.getLength())); 898 DocumentModelUtils.dumpElementStructure(root); 899 900 902 assertEquals(5, elementChanges.size()); 909 assertEquals(5, modelChanges.size()); 911 assertEquals(1, root.getElementCount()); 913 } 914 915 public void testRemoveElementAttributes() throws DocumentModelException, BadLocationException , InterruptedException { 916 initDoc2(); 918 DocumentModel model = DocumentModel.getDocumentModel(doc); 920 921 DocumentElement root = model.getRootElement(); 922 DocumentElement rootTag = root.getElement(1); 924 AttributeSet attrs = rootTag.getAttributes(); 925 assertNotNull(attrs); 926 927 assertEquals(1, attrs.getAttributeCount()); assertTrue(attrs.containsAttribute("attrname", "value")); 929 assertEquals("value", (String )attrs.getAttribute("attrname")); 930 931 final Vector modelAttrsChanges = new Vector (); 933 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 934 public void documentElementAttributesChanged(DocumentElement de) { 935 modelAttrsChanges.add(de); 936 } 937 }); 938 939 final Vector elementAttrsChanges = new Vector (); 941 rootTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 942 public void attributesChanged(DocumentElementEvent e) { 943 elementAttrsChanges.add(e.getChangedChild()); 944 } 945 }); 946 947 doc.remove(26, " attrname=\"value\"".length()); 948 Thread.sleep(MODEL_TIMEOUT * 2); 950 System.out.println(doc.getText(0, doc.getLength())); 951 DocumentModelUtils.dumpElementStructure(root); 952 953 assertEquals(1, modelAttrsChanges.size()); 955 assertEquals(1, elementAttrsChanges.size()); 956 957 attrs = rootTag.getAttributes(); 959 assertNotNull(attrs); 960 961 assertEquals(0, attrs.getAttributeCount()); 963 } 964 965 public void testChangeTreeFromElementsWithSameName() throws DocumentModelException, BadLocationException , InterruptedException { 966 initDoc4(); 968 DocumentModel model = DocumentModel.getDocumentModel(doc); 970 DocumentElement root = model.getRootElement(); 971 972 System.out.println(doc.getText(0, doc.getLength())); 973 DocumentModelUtils.dumpElementStructure(root); 974 975 assertEquals(2, root.getElementCount()); 977 DocumentElement tree1 = root.getElement(1); assertEquals(1, tree1.getElementCount()); 980 DocumentElement tree2 = tree1.getElement(0); assertEquals(2, tree2.getElementCount()); 983 DocumentElement tree3 = tree2.getElement(0); DocumentElement tree4 = tree2.getElement(1); 986 assertEquals("tree", tree3.getName()); 987 assertEquals("tree", tree4.getName()); 988 989 final Vector modelChanges = new Vector (); 991 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 992 public void documentElementRemoved(DocumentElement de) { 993 System.out.println("removed " + de); 994 modelChanges.add(de); 995 } 996 }); 997 998 final Vector tree1Removes = new Vector (); 1000 final Vector tree1Adds = new Vector (); 1001 tree1.addDocumentElementListener(new DocumentElementListenerAdapter() { 1002 public void elementRemoved(DocumentElementEvent e) { 1003 System.out.println("removed " + e.getChangedChild()); 1004 tree1Removes.add(e.getChangedChild()); 1005 } 1006 public void elementAdded(DocumentElementEvent e) { 1007 System.out.println("added " + e.getChangedChild()); 1008 tree1Adds.add(e.getChangedChild()); 1009 } 1010 }); 1011 1012 doc.insertString(36, "BIG", null); 1013 Thread.sleep(MODEL_TIMEOUT * 2); 1015 System.out.println(doc.getText(0, doc.getLength())); 1016 DocumentModelUtils.dumpElementStructure(root); 1017 1018 1020 assertEquals(1, modelChanges.size()); 1022 assertEquals(tree2, modelChanges.get(0)); 1023 1024 assertEquals(1, tree1Removes.size()); 1026 assertEquals(tree2, tree1Removes.get(0)); 1027 1028 assertEquals(2, tree1Adds.size()); 1030 assertEquals(tree1Adds.get(0), tree3); 1031 assertEquals(tree1Adds.get(1), tree4); 1032 assertEquals(tree1.getElement(0), tree3); 1033 assertEquals(tree1.getElement(1), tree4); 1034 1035 1037 final Vector modelChanges2 = new Vector (); 1039 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 1040 public void documentElementAdded(DocumentElement de) { 1041 System.out.println("added " + de); 1042 modelChanges2.add(de); 1043 } 1044 }); 1045 1046 tree1Adds.clear(); 1047 tree1Removes.clear(); 1048 1049 doc.remove(36, "BIG".length()); 1050 Thread.sleep(MODEL_TIMEOUT * 2); 1052 System.out.println(doc.getText(0, doc.getLength())); 1053 DocumentModelUtils.dumpElementStructure(root); 1054 1055 1056 1058 assertEquals(1, modelChanges.size()); 1060 assertEquals(1, tree1Adds.size()); 1062 assertEquals(2, tree1Removes.size()); 1064 1065 assertEquals(1, tree1.getElementCount()); 1067 DocumentElement tree2_2 = tree1.getElement(0); 1068 1069 assertEquals(2, tree2.getElementCount()); 1071 1072 assertEquals(tree3, tree2.getElement(0)); 1073 assertEquals(tree4, tree2.getElement(1)); 1074 1075 assertEquals(2, root.getElementCount()); 1077 } 1078 1079 public void testRemoveElementsInText() throws DocumentModelException, BadLocationException , InterruptedException { 1080 initDoc5(); 1082 DocumentModel model = DocumentModel.getDocumentModel(doc); 1084 1085 DocumentElement root = model.getRootElement(); 1086 DocumentElement rootTag = root.getElement(2); 1088 final Vector removedElements = new Vector (); 1090 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 1091 public void documentElementRemoved(DocumentElement de) { 1092 removedElements.add(de); 1093 } 1094 }); 1095 1096 final Vector removedElements2 = new Vector (); 1098 rootTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 1099 public void elementRemoved(DocumentElementEvent e) { 1100 removedElements2.add(e.getChangedChild()); 1101 } 1102 }); 1103 1104 DocumentModelUtils.dumpElementStructure(root); 1105 1106 doc.remove(31," <a> <c/> </a> ".length()); 1107 Thread.sleep(MODEL_TIMEOUT * 2); 1109 System.out.println(doc.getText(0, doc.getLength())); 1110 DocumentModelUtils.dumpElementStructure(root); 1111 1112 assertEquals(6, removedElements.size()); assertEquals(6, removedElements2.size()); 1114 1115 assertEquals(3, rootTag.getElementCount()); 1117 } 1118 1119 1120 public void testEditElementWithOneCharContent_71596() throws DocumentModelException, BadLocationException , InterruptedException { 1121 initDoc6(); 1123 DocumentModel model = DocumentModel.getDocumentModel(doc); 1125 DocumentElement root = model.getRootElement(); 1126 1127 System.out.println(doc.getText(0, doc.getLength())); 1128 DocumentModelUtils.dumpElementStructure(root); 1129 1130 DocumentElement rootTag = root.getElement(0); 1132 assertNotNull(rootTag.getName()); 1133 1134 final Vector modelChanges = new Vector (); 1136 model.addDocumentModelListener(new DocumentModelListenerAdapter() { 1137 public void documentElementAdded(DocumentElement de) { 1138 modelChanges.add(de); 1139 } 1140 }); 1141 1142 final Vector elementChanges = new Vector (); 1144 rootTag.addDocumentElementListener(new DocumentElementListenerAdapter() { 1145 public void elementAdded(DocumentElementEvent e) { 1146 elementChanges.add(e.getChangedChild()); 1147 } 1148 }); 1149 1150 doc.insertString(5," ",null); 1151 Thread.sleep(MODEL_TIMEOUT * 2); 1153 System.out.println(doc.getText(0, doc.getLength())); 1154 DocumentModelUtils.dumpElementStructure(root); 1155 1156 assertEquals(1, rootTag.getElementCount()); 1157 1158 assertEquals(0, modelChanges.size()); 1160 assertEquals(0, elementChanges.size()); 1161 1162 } 1163 1164 public void testModelLocking() throws DocumentModelException, BadLocationException , InterruptedException { 1165 initDoc1(); 1167 1168 final Semaphore semaphore = new Semaphore(); 1169 Runnable r = new Runnable () { 1170 public void run() { 1171 try { 1173 DocumentModel model = DocumentModel.getDocumentModel(doc); 1174 DocumentElement root = model.getRootElement(); 1176 doc.insertString(0, " ", null); 1178 root.getChildren(); 1180 1181 semaphore.state = true; 1182 synchronized (semaphore) { 1183 semaphore.notifyAll(); 1184 } 1185 }catch(Throwable t) { 1186 t.printStackTrace(); 1187 t.printStackTrace(getLog()); 1188 } 1189 } 1190 }; 1191 1192 Thread t = new Thread (r); 1193 t.start(); 1194 1195 try { 1196 synchronized (semaphore) { 1197 semaphore.wait(5000); 1198 } 1199 } catch(InterruptedException ioe) { 1200 ; 1201 } 1202 1203 assertTrue("The DocumentElement.getChildren() locked up! (model.writeLock() called under model.readLock())", semaphore.state); 1204 1205 } 1206 1207 1239 1240 1241 private void initDoc1() throws BadLocationException { 1242 1257 doc = new BaseDocument(XMLKit.class, false); 1258 doc.putProperty("mimeType", "text/xml"); 1259 1260 doc.insertString(0,"<?xml version='1.0'?><root><a><c/></a><b>text</b></root>",null); 1261 } 1264 1265 private void initDoc2() throws BadLocationException { 1266 1275 doc = new BaseDocument(XMLKit.class, false); 1276 doc.putProperty("mimeType", "text/xml"); 1277 1278 doc.insertString(0,"<?xml version='1.0'?><root attrname=\"value\">text</root>",null); 1279 } 1282 1283 private void initDoc3() throws BadLocationException { 1284 1294 doc = new BaseDocument(XMLKit.class, false); 1295 doc.putProperty("mimeType", "text/xml"); 1296 1297 doc.insertString(0,"<?xml version=\"1.0\"?><wood><tree id=\"1\"/><tree id=\"2\"/></wood>",null); 1298 } 1301 1302 private void initDoc4() throws BadLocationException { 1303 1315 doc = new BaseDocument(XMLKit.class, false); 1316 doc.putProperty("mimeType", "text/xml"); 1317 1318 doc.insertString(0,"<?xml version=\"1.0\"?><tree id=\"1\"><tree id=\"2\"><tree id=\"3\"></tree><tree id=\"4\"></tree></tree></tree>",null); 1319 } 1322 1323 private void initDoc5() throws BadLocationException { 1324 1339 doc = new BaseDocument(XMLKit.class, false); 1340 doc.putProperty("mimeType", "text/xml"); 1341 1342 doc.insertString(0,"<?xml version='1.0'?> <root> <a> <c/> </a> <b>text</b> </root>",null); 1343 } 1346 1347 private void initDoc6() throws BadLocationException { 1348 1354 doc = new BaseDocument(XMLKit.class, false); 1355 doc.putProperty("mimeType", "text/xml"); 1356 1357 doc.insertString(0,"<root>X</root>",null); 1358 } 1361 1362 private static class DocumentModelListenerAdapter implements DocumentModelListener { 1363 public void documentElementAdded(DocumentElement de) { 1364 } 1365 public void documentElementAttributesChanged(DocumentElement de) { 1366 } 1367 public void documentElementChanged(DocumentElement de) { 1368 } 1369 public void documentElementRemoved(DocumentElement de) { 1370 } 1371 } 1372 1373 private static class DocumentElementListenerAdapter implements DocumentElementListener { 1374 public void attributesChanged(DocumentElementEvent e) { 1375 } 1376 public void childrenReordered(DocumentElementEvent e) { 1377 } 1378 public void contentChanged(DocumentElementEvent e) { 1379 } 1380 public void elementAdded(DocumentElementEvent e) { 1381 } 1382 public void elementRemoved(DocumentElementEvent e) { 1383 } 1384 } 1385 1386 private static class Semaphore { 1387 public boolean state = false; 1388 } 1389} 1390 | Popular Tags |