1 31 32 package org.opencms.file; 33 34 import org.opencms.file.types.CmsResourceTypeFolder; 35 import org.opencms.file.types.CmsResourceTypePlain; 36 import org.opencms.main.CmsException; 37 import org.opencms.main.CmsMultiException; 38 import org.opencms.report.CmsShellReport; 39 import org.opencms.test.OpenCmsTestCase; 40 import org.opencms.test.OpenCmsTestLogAppender; 41 import org.opencms.test.OpenCmsTestProperties; 42 import org.opencms.test.OpenCmsTestResourceFilter; 43 44 import junit.extensions.TestSetup; 45 import junit.framework.Test; 46 import junit.framework.TestSuite; 47 48 55 public class TestPublishing extends OpenCmsTestCase { 56 57 62 public TestPublishing(String arg0) { 63 super(arg0); 64 } 65 66 71 public static Test suite() { 72 OpenCmsTestProperties.initialize(org.opencms.test.AllTests.TEST_PROPERTIES_PATH); 73 74 TestSuite suite = new TestSuite(); 75 suite.setName(TestPublishing.class.getName()); 76 77 suite.addTest(new TestPublishing("testPublishNewFiles")); 78 suite.addTest(new TestPublishing("testPublishNewFilesInNewFolder")); 79 suite.addTest(new TestPublishing("testPublishChangedFiles")); 80 suite.addTest(new TestPublishing("testPublishLockedFiles")); 81 suite.addTest(new TestPublishing("testPublishDeletedFiles")); 82 suite.addTest(new TestPublishing("testPublishProjectLastmodified")); 83 suite.addTest(new TestPublishing("testPublishTemporaryProject")); 84 85 TestSetup wrapper = new TestSetup(suite) { 86 87 protected void setUp() { 88 setupOpenCms("simpletest", "/sites/default/"); 89 } 90 91 protected void tearDown() { 92 removeOpenCms(); 93 } 94 }; 95 96 return wrapper; 97 } 98 99 104 public void testPublishChangedFiles() throws Throwable { 105 106 CmsObject cms = getCmsObject(); 107 echo("Testing publish changed files"); 108 109 String resource1 = "/folder2/image1_new.gif"; 110 String resource2 = "/folder2/image1_sibling1.gif"; 111 String resource3 = "/folder2/image1_sibling2.gif"; 112 String resource4 = "/folder2/image1_sibling3.gif"; 113 114 CmsProject onlineProject = cms.readProject("Online"); 115 CmsProject offlineProject = cms.readProject("Offline"); 116 117 CmsProperty prop1; 118 CmsProperty prop2; 119 CmsProperty prop3; 120 CmsProperty prop4; 121 122 123 127 cms.lockResource(resource1); 128 cms.lockResource(resource2); 129 130 cms.writePropertyObject(resource1, new CmsProperty("Title", resource1, null)); 131 cms.writePropertyObject(resource2, new CmsProperty("Title", resource2, null)); 132 cms.writePropertyObject(resource3, new CmsProperty("Title", resource3, null)); 133 cms.writePropertyObject(resource4, new CmsProperty("Title", resource4, null)); 134 135 cms.unlockResource(resource1); 137 cms.unlockResource(resource2); 138 139 storeResources(cms, resource1); 140 storeResources(cms, resource2); 141 storeResources(cms, resource3); 142 storeResources(cms, resource4); 143 144 cms.publishResource(resource1); 147 148 cms.getRequestContext().setCurrentProject(onlineProject); 150 prop1 = cms.readPropertyObject(resource1, "Title", false); 151 152 153 if (!prop1.getValue().equals((resource1))) { 154 fail("Property not published for " + resource1); 155 } 156 assertFilter(cms, resource1, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 157 158 cms.getRequestContext().setCurrentProject(offlineProject); 160 assertState(cms, resource1, CmsResource.STATE_UNCHANGED); 161 162 cms.publishResource(resource2); 165 166 cms.getRequestContext().setCurrentProject(onlineProject); 168 prop2 = cms.readPropertyObject(resource2, "Title", false); 169 prop3 = cms.readPropertyObject(resource3, "Title", false); 170 prop4 = cms.readPropertyObject(resource4, "Title", false); 171 172 if (!prop2.getValue().equals((resource2))) { 173 fail("Property not published for " + resource2); 174 } 175 if (prop3.getValue().equals((resource3))) { 176 fail("Property published for " + resource3); 177 } 178 if (prop4.getValue().equals((resource4))) { 179 fail("Property published for " + resource4); 180 } 181 182 assertFilter(cms, resource2, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 183 184 cms.getRequestContext().setCurrentProject(offlineProject); 186 assertState(cms, resource2, CmsResource.STATE_UNCHANGED); 187 assertState(cms, resource3, CmsResource.STATE_CHANGED); 188 assertState(cms, resource4, CmsResource.STATE_CHANGED); 189 190 cms.publishResource(resource3, true, new CmsShellReport(cms.getRequestContext().getLocale())); 193 194 cms.getRequestContext().setCurrentProject(onlineProject); 196 prop3 = cms.readPropertyObject(resource3, "Title", false); 197 prop4 = cms.readPropertyObject(resource4, "Title", false); 198 199 if (!prop3.getValue().equals((resource3))) { 200 fail("Property not published for " + resource3); 201 } 202 if (!prop4.getValue().equals((resource4))) { 203 fail("Property not published for " + resource4); 204 } 205 206 assertFilter(cms, resource3, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 207 assertFilter(cms, resource4, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 208 209 cms.getRequestContext().setCurrentProject(offlineProject); 211 assertState(cms, resource3, CmsResource.STATE_UNCHANGED); 212 assertState(cms, resource4, CmsResource.STATE_UNCHANGED); 213 } 214 215 220 public void testPublishDeletedFiles() throws Throwable { 221 222 CmsObject cms = getCmsObject(); 223 echo("Testing publish deleted files"); 224 225 String resource1 = "/folder2/image1_new.gif"; 226 String resource2 = "/folder2/image1_sibling1.gif"; 227 String resource3 = "/folder2/image1_sibling2.gif"; 228 String resource4 = "/folder2/image1_sibling3.gif"; 229 230 CmsProject onlineProject = cms.readProject("Online"); 231 CmsProject offlineProject = cms.readProject("Offline"); 232 233 236 cms.lockResource(resource1); 238 cms.deleteResource(resource1, CmsResource.DELETE_PRESERVE_SIBLINGS); 239 cms.unlockResource(resource1); 240 241 cms.publishResource(resource1); 242 243 cms.getRequestContext().setCurrentProject(onlineProject); 245 try { 246 cms.readResource(resource1); 247 fail ("Resource " + resource1 + " was not deleted online"); 248 } catch (CmsVfsResourceNotFoundException e) { 249 } catch (CmsException e) { 251 fail("Resource " + resource1 + " error:" +e); 252 } 253 254 cms.getRequestContext().setCurrentProject(offlineProject); 255 256 259 cms.lockResource(resource2); 261 cms.deleteResource(resource2, CmsResource.DELETE_REMOVE_SIBLINGS); 262 cms.unlockResource(resource2); 263 264 cms.publishResource(resource2, false, new CmsShellReport(cms.getRequestContext().getLocale())); 266 267 cms.getRequestContext().setCurrentProject(onlineProject); 269 try { 270 cms.readResource(resource2); 271 fail ("Resource " + resource2 + " was not deleted online"); 272 } catch (CmsVfsResourceNotFoundException e) { 273 } catch (CmsException e) { 275 fail("Resource " + resource2 + " error:" +e); 276 } 277 try { 279 cms.readResource(resource3); 280 } catch (CmsException e) { 281 fail("Resource " + resource3 + " error:" +e); 282 } 283 try { 284 cms.readResource(resource4); 285 } catch (CmsException e) { 286 fail("Resource " + resource4 + " error:" +e); 287 } 288 289 cms.getRequestContext().setCurrentProject(offlineProject); 290 assertState(cms, resource3, CmsResource.STATE_DELETED); 292 assertState(cms, resource4, CmsResource.STATE_DELETED); 293 294 cms.publishResource(resource3, true, new CmsShellReport(cms.getRequestContext().getLocale())); 297 298 cms.getRequestContext().setCurrentProject(onlineProject); 300 try { 301 cms.readResource(resource3); 302 fail ("Resource " + resource3 + " was not deleted online"); 303 } catch (CmsVfsResourceNotFoundException e) { 304 } catch (CmsException e) { 306 fail("Resource " + resource3 + " error:" +e); 307 } 308 try { 309 cms.readResource(resource4); 310 fail ("Resource " + resource4 + " was not deleted online"); 311 } catch (CmsVfsResourceNotFoundException e) { 312 } catch (CmsException e) { 314 fail("Resource " + resource4 + " error:" +e); 315 } 316 317 cms.getRequestContext().setCurrentProject(offlineProject); 318 319 } 320 321 326 public void testPublishLockedFiles() throws Throwable { 327 328 CmsObject cms = getCmsObject(); 329 echo("Testing publish locked files"); 330 331 String source = "/folder2/subfolder21/image1.gif"; 332 String resource1 = "/folder2/image1_new.gif"; 333 String resource2 = "/folder2/image1_sibling1.gif"; 334 335 CmsProject onlineProject = cms.readProject("Online"); 336 337 CmsProperty prop0; 338 CmsProperty prop1; 339 CmsProperty prop2; 340 341 345 cms.lockResource(source); 346 cms.lockResource(resource1); 347 cms.lockResource(resource2); 348 349 cms.writePropertyObject(source, new CmsProperty("Title", source + " modified", null)); 350 cms.writePropertyObject(resource1, new CmsProperty("Title", resource1 + " modified", null)); 351 cms.writePropertyObject(resource2, new CmsProperty("Title", resource2 + " modified", null)); 352 353 storeResources(cms, source); 354 storeResources(cms, resource1); 355 storeResources(cms, resource2); 356 357 cms.publishProject(); 359 360 assertState(cms, source, CmsResource.STATE_CHANGED); 362 assertState(cms, resource1, CmsResource.STATE_CHANGED); 363 assertState(cms, resource2, CmsResource.STATE_CHANGED); 364 365 cms.getRequestContext().setCurrentProject(onlineProject); 367 prop0 = cms.readPropertyObject(source, "Title", false); 368 prop1 = cms.readPropertyObject(resource1, "Title", false); 369 prop2 = cms.readPropertyObject(resource2, "Title", false); 370 371 if (prop0.getValue().equals((source + " modified"))) { 372 fail("Property published for " + source); 373 } 374 if (prop1.getValue().equals((resource1 + " modified"))) { 375 fail("Property published for " + resource1); 376 } 377 if (prop2.getValue().equals((resource2 + " modified"))) { 378 fail("Property published for " + resource2); 379 } 380 } 381 382 383 384 385 390 public void testPublishNewFiles() throws Throwable { 391 392 CmsObject cms = getCmsObject(); 393 echo("Testing publish new files"); 394 395 String source = "/folder2/subfolder21/image1.gif"; 396 String destination1 = "/folder2/image1_new.gif"; 397 String destination2 = "/folder2/image1_sibling1.gif"; 398 String destination3 = "/folder2/image1_sibling2.gif"; 399 String destination4 = "/folder2/image1_sibling3.gif"; 400 401 CmsProject onlineProject = cms.readProject("Online"); 402 CmsProject offlineProject = cms.readProject("Offline"); 403 404 cms.copyResource(source, destination1, CmsResource.COPY_AS_NEW); 406 cms.copyResource(source, destination2, CmsResource.COPY_AS_SIBLING); 407 cms.copyResource(source, destination3, CmsResource.COPY_AS_SIBLING); 408 cms.copyResource(source, destination4, CmsResource.COPY_AS_SIBLING); 409 410 storeResources(cms, destination1); 411 storeResources(cms, destination2); 412 storeResources(cms, destination3); 413 storeResources(cms, destination4); 414 415 cms.unlockResource(destination1); 418 cms.unlockResource(destination2); 419 420 cms.publishResource(destination1); 423 424 cms.getRequestContext().setCurrentProject(onlineProject); 426 try { 427 cms.readResource(destination1); 428 } catch (CmsException e) { 429 fail("Resource " + destination1 + " not found in online project:" +e); 430 } 431 assertFilter(cms, destination1, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 432 433 cms.getRequestContext().setCurrentProject(offlineProject); 435 assertState(cms, destination1, CmsResource.STATE_UNCHANGED); 436 437 cms.publishResource(destination2); 440 441 cms.getRequestContext().setCurrentProject(onlineProject); 443 try { 444 cms.readResource(destination2); 445 } catch (CmsException e) { 446 fail("Resource " + destination2 + " not found in online project:" +e); 447 } 448 try { 450 cms.readResource(destination3); 451 fail("Resource " + destination3+ " should not available online yet"); 452 } catch (CmsVfsResourceNotFoundException e) { 453 } catch (CmsException e) { 455 fail("Resource " + destination3 + " error:" +e); 456 } 457 try { 458 cms.readResource(destination4); 459 fail("Resource " + destination4+ " should not available online yet"); 460 } catch (CmsVfsResourceNotFoundException e) { 461 } catch (CmsException e) { 463 fail("Resource " + destination4 + " error:" +e); 464 } 465 466 assertFilter(cms, destination2, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 467 468 cms.getRequestContext().setCurrentProject(offlineProject); 470 assertState(cms, destination2, CmsResource.STATE_UNCHANGED); 471 assertState(cms, destination3, CmsResource.STATE_NEW); 473 assertState(cms, destination4, CmsResource.STATE_NEW); 474 475 cms.publishResource(destination3, true, new CmsShellReport(cms.getRequestContext().getLocale())); 478 cms.getRequestContext().setCurrentProject(onlineProject); 480 try { 481 cms.readResource(destination3); 482 } catch (CmsException e) { 483 fail("Resource " + destination3 + " not found in online project:" +e); 484 } 485 try { 486 cms.readResource(destination4); 487 } catch (CmsException e) { 488 fail("Resource " + destination4 + " not found in online project:" +e); 489 } 490 assertFilter(cms, destination3, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 491 assertFilter(cms, destination4, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 492 493 cms.getRequestContext().setCurrentProject(offlineProject); 495 assertState(cms, destination3, CmsResource.STATE_UNCHANGED); 496 assertState(cms, destination4, CmsResource.STATE_UNCHANGED); 497 } 498 499 504 public void testPublishNewFilesInNewFolder() throws Throwable { 505 506 CmsObject cms = getCmsObject(); 507 echo("Testing publishing new files in new folder"); 508 509 String source = "/folder1/image1.gif"; 510 String newFolder = "/new_folder/"; 511 String newFile = newFolder + "new_file"; 512 String newSibling = newFolder + "new_sibling"; 513 514 cms.createResource(newFolder, CmsResourceTypeFolder.getStaticTypeId()); 515 cms.unlockResource(newFolder); 516 storeResources(cms, newFolder); 517 518 CmsProject project = getTestProject(cms); 520 cms.getRequestContext().setCurrentProject(project); 521 522 cms.copyResource(source, newFile, CmsResource.COPY_AS_NEW); 523 cms.unlockResource(newFile); 524 525 cms.copyResource(source, newSibling, CmsResource.COPY_AS_SIBLING); 526 cms.unlockResource(newSibling); 527 528 echo ("Publishing the resource directly"); 530 531 storeResources(cms, newFile); 532 533 boolean error = true; 534 try { 535 OpenCmsTestLogAppender.setBreakOnError(false); 537 cms.publishResource(newFile); 538 } catch (CmsMultiException e) { 539 CmsVfsException ex = (CmsVfsException)e.getExceptions().get(0); 540 if (ex.getMessageContainer().getKey() == org.opencms.db.Messages.ERR_DIRECT_PUBLISH_PARENT_NEW_2) { 541 error = false; 542 } 543 } 544 OpenCmsTestLogAppender.setBreakOnError(true); 546 547 if (error) { 548 fail("A resource in a new folder could be published without generating an error!"); 549 } 550 551 assertFilter(cms, newFile, OpenCmsTestResourceFilter.FILTER_EQUAL); 552 553 echo ("Publishing another sibling"); 555 cms.lockResource(source); 556 cms.setDateLastModified(source, System.currentTimeMillis(), false); 557 cms.unlockResource(source); 558 559 storeResources(cms, newSibling); 560 cms.publishResource(source, true, new CmsShellReport(cms.getRequestContext().getLocale())); 561 assertFilter(cms, newSibling, OpenCmsTestResourceFilter.FILTER_EQUAL); 562 563 echo ("Publishing the test project"); 565 cms.publishProject(); 566 567 assertFilter(cms, newFile, OpenCmsTestResourceFilter.FILTER_EQUAL); 568 assertFilter(cms, newSibling, OpenCmsTestResourceFilter.FILTER_EQUAL); 569 570 echo ("Publishing the offline project"); 572 573 cms.getRequestContext().setCurrentProject(cms.readProject("Offline")); 574 cms.publishProject(); 575 576 assertFilter(cms, newFolder, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 577 assertState(cms, newFolder, CmsResource.STATE_UNCHANGED); 578 579 assertFilter(cms, newFile, OpenCmsTestResourceFilter.FILTER_EQUAL); 580 assertFilter(cms, newSibling, OpenCmsTestResourceFilter.FILTER_EQUAL); 581 582 echo ("Publishing the test project again"); 584 cms.getRequestContext().setCurrentProject(project); 585 cms.publishProject(); 586 587 assertFilter(cms, newFile, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 588 assertState(cms, newFile, CmsResource.STATE_UNCHANGED); 589 590 assertFilter(cms, newSibling, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 591 assertState(cms, newSibling, CmsResource.STATE_UNCHANGED); 592 593 } 594 595 600 public void testPublishProjectLastmodified() throws Throwable { 601 602 CmsObject cms = getCmsObject(); 603 echo("Testing publishing a distinct project"); 604 605 String path = "/folder1"; 606 String res1 = path + "/page1.html"; 607 String res2 = path + "/page2.html"; 608 609 long timestamp = System.currentTimeMillis(); 610 611 cms.getRequestContext().setCurrentProject(cms.readProject("Online")); 612 storeResources(cms, res1); 613 614 cms.getRequestContext().setCurrentProject(cms.readProject("Offline")); 616 cms.lockResource(res1); 617 cms.setDateLastModified(res1, timestamp, false); 618 619 cms.unlockProject(cms.getRequestContext().currentProject().getId()); 620 621 CmsProject project = getTestProject(cms); 623 cms.getRequestContext().setCurrentProject(project); 624 cms.copyResourceToProject(path); 625 626 cms.lockResource(res2); 628 cms.setDateLastModified(res2, timestamp, false); 629 cms.unlockProject(cms.getRequestContext().currentProject().getId()); 630 storeResources(cms, res2); 631 632 cms.publishProject(); 634 635 cms.getRequestContext().setCurrentProject(cms.readProject("Online")); 636 this.assertFilter(cms, res1, OpenCmsTestResourceFilter.FILTER_EQUAL); 637 this.assertFilter(cms, res2, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 638 this.assertDateLastModified(cms, res2, timestamp); 639 640 echo("Testing publishing in different projects"); 641 642 String res3 = path + "/testPublishProjectLastmodified.txt"; 644 cms.getRequestContext().setCurrentProject(project); 645 cms.createResource(res3, CmsResourceTypePlain.getStaticTypeId()); 646 647 String res4 = "/testPublishProjectLastmodified.txt"; 650 cms.getRequestContext().setCurrentProject(cms.readProject("Offline")); 651 cms.copyResource(res3, res4, CmsResource.COPY_AS_SIBLING); 652 653 assertState(cms, res3, CmsResource.STATE_NEW); 655 assertState(cms, res4, CmsResource.STATE_NEW); 656 657 cms.getRequestContext().setCurrentProject(project); 659 cms.unlockProject(project.getId()); 660 cms.publishProject(); 661 662 assertState(cms, res3, CmsResource.STATE_NEW); 664 665 assertState(cms, res4, CmsResource.STATE_NEW); 667 668 cms.publishResource(path, true, new CmsShellReport(cms.getRequestContext().getLocale())); 670 671 assertState(cms, res3, CmsResource.STATE_NEW); 673 674 assertState(cms, res4, CmsResource.STATE_NEW); 676 } 677 678 683 public void testPublishTemporaryProject() throws Throwable { 684 CmsObject cms = getCmsObject(); 685 echo("Testing publish temporary project"); 686 687 String source = "/folder1/testfile.txt"; 688 CmsProject onlineProject = cms.readProject("Online"); 689 CmsProject offlineProject = cms.readProject("Offline"); 690 691 CmsProject tempProject = cms.createProject("deleteme", "Temp project to be deleted after publish", "Users", "Projectmanagers", CmsProject.PROJECT_TYPE_TEMPORARY); 693 cms.copyResourceToProject("/"); 694 cms.getRequestContext().setCurrentProject(tempProject); 695 696 cms.createResource(source, CmsResourceTypePlain.getStaticTypeId()); 698 cms.unlockResource(source); 699 storeResources(cms, source); 700 701 cms.readResource(source); 702 703 cms.publishProject(); 705 706 707 try { 709 cms.readResource(source); 710 } catch (CmsException e) { 711 fail("Resource " + source + " not found in project " + cms.getRequestContext().currentProject().toString() + ":" +e); 712 } 713 714 cms.getRequestContext().setCurrentProject(onlineProject); 716 try { 717 cms.readResource(source); 718 } catch (CmsException e) { 719 fail("Resource " + source + " not found in project " + cms.getRequestContext().currentProject().toString() + ":" +e); 720 } 721 722 assertFilter(cms, source, OpenCmsTestResourceFilter.FILTER_PUBLISHRESOURCE); 724 725 cms.getRequestContext().setCurrentProject(offlineProject); 727 assertState(cms, source, CmsResource.STATE_UNCHANGED); 728 729 try { 731 cms.readProject("deleteme"); 732 fail("Temporary project still existing"); 733 } catch (CmsException e) { 734 } 736 737 738 } 739 740 746 CmsProject getTestProject(CmsObject cms) { 747 748 CmsProject project = null; 749 750 try { 751 project = cms.readProject("Test"); 752 } catch (Exception e) { 753 try { 754 project = cms.createProject("Test", "", "Users", "Administrators"); 755 } catch (Exception ee) { 756 } 758 } 759 760 return project; 761 } 762 } 763 | Popular Tags |