/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.file.types; import org.opencms.file.CmsFile; import org.opencms.file.CmsObject; import org.opencms.file.CmsProject; import org.opencms.file.CmsResource; import org.opencms.file.TestLinkValidation; import org.opencms.importexport.CmsExportParameters; import org.opencms.importexport.CmsImportParameters; import org.opencms.importexport.CmsVfsImportExportHandler; import org.opencms.main.CmsException; import org.opencms.main.OpenCms; import org.opencms.relations.CmsRelation; import org.opencms.relations.CmsRelationFilter; import org.opencms.relations.CmsRelationType; import org.opencms.report.CmsShellReport; import org.opencms.test.OpenCmsTestCase; import org.opencms.test.OpenCmsTestProperties; import org.opencms.xml.page.CmsXmlPage; import org.opencms.xml.page.CmsXmlPageFactory; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Locale; import junit.extensions.TestSetup; import junit.framework.Test; import junit.framework.TestSuite; /** * Unit tests for the link parseable resource types.<p> */ public class TestLinkParseableResourceTypes extends OpenCmsTestCase { /** * Default JUnit constructor.<p> * * @param arg0 JUnit parameters */ public TestLinkParseableResourceTypes(String arg0) { super(arg0); } /** * Test suite for this test class.<p> * * @return the test suite */ public static Test suite() { OpenCmsTestProperties.initialize(org.opencms.test.AllTests.TEST_PROPERTIES_PATH); TestSuite suite = new TestSuite(); suite.setName(TestLinkParseableResourceTypes.class.getName()); suite.addTest(new TestLinkParseableResourceTypes("testInitialSetup")); suite.addTest(new TestLinkParseableResourceTypes("testCopyResource")); suite.addTest(new TestLinkParseableResourceTypes("testCreateResource")); suite.addTest(new TestLinkParseableResourceTypes("testCreateSibling")); suite.addTest(new TestLinkParseableResourceTypes("testMoveResource")); suite.addTest(new TestLinkParseableResourceTypes("testReplaceLinkParseableResource")); suite.addTest(new TestLinkParseableResourceTypes("testReplaceNonLinkParseableResource")); suite.addTest(new TestLinkParseableResourceTypes("testChTypeLinkParseable")); suite.addTest(new TestLinkParseableResourceTypes("testChTypeNonLinkParseable")); suite.addTest(new TestLinkParseableResourceTypes("testWriteFile")); suite.addTest(new TestLinkParseableResourceTypes("testImportResourceLinkParseable")); suite.addTest(new TestLinkParseableResourceTypes("testImportResourceNonLinkParseable")); suite.addTest(new TestLinkParseableResourceTypes("testDeleteResource")); suite.addTest(new TestLinkParseableResourceTypes("testDeleteFolder")); suite.addTest(new TestLinkParseableResourceTypes("testUndoChanges")); TestSetup wrapper = new TestSetup(suite) { @Override protected void setUp() { setupOpenCms("simpletest", "/"); } @Override protected void tearDown() { removeOpenCms(); } }; return wrapper; } /** * Test chType method, change type link parseable with non link parseable.<p> * * @throws Throwable if something goes wrong */ public void testChTypeLinkParseable() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'chType' method, change type link parseable with non link parseable"); String sourceName = "/index_created.html"; String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); int sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); cms.lockResource(sourceName); cms.chtype(sourceName, CmsResourceTypeBinary.getStaticTypeId()); CmsResource changed = cms.readResource(sourceName); assertRelationOperation(cms, changed, target, sources - 1, 0); // check the online project CmsProject project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); assertRelationOperation(cms, changed, target, sources, 1); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(sourceName); OpenCms.getPublishManager().publishResource(cms, sourceName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); assertRelationOperation(cms, changed, target, sources - 1, 0); } /** * Test chType method, change type non link parseable with link parseable.<p> * * @throws Throwable if something goes wrong */ public void testChTypeNonLinkParseable() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'chType' method, change type non link parseable with link parseable"); String sourceName = "/index_created.html"; String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); int sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); cms.lockResource(sourceName); cms.chtype(sourceName, CmsResourceTypeXmlPage.getStaticTypeId()); CmsResource changed = cms.readResource(sourceName); assertRelationOperation(cms, changed, target, sources + 1, 1); // check the online project CmsProject project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); assertRelationOperation(cms, changed, target, sources, 0); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(sourceName); OpenCms.getPublishManager().publishResource(cms, sourceName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); assertRelationOperation(cms, changed, target, sources + 1, 1); } /** * Test copyResource method.<p> * * @throws Throwable if something goes wrong */ public void testCopyResource() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'copyResource' method"); String sourceName = "/index.html"; CmsResource source = cms.readResource(sourceName); String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); int sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); String copyName = "/index_copy.html"; cms.lockResource(sourceName); cms.copyResource(sourceName, copyName); CmsResource copy = cms.readResource(copyName); assertRelationOperation(cms, source, target, sources + 1, 1); assertRelationOperation(cms, copy, target, sources + 1, 1); // check the online project CmsProject project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(copyName); OpenCms.getPublishManager().publishResource(cms, copyName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); assertRelationOperation(cms, source, target, sources + 1, 1); assertRelationOperation(cms, copy, target, sources + 1, 1); } /** * Test createResource method.<p> * * @throws Throwable if something goes wrong */ public void testCreateResource() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'createResource' method"); String sourceName = "/index.html"; CmsResource source = cms.readResource(sourceName); String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); int sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); String createdName = "/index_created.html"; cms.createResource(createdName, source.getTypeId(), cms.readFile(source).getContents(), null); CmsResource created = cms.readResource(createdName); assertRelationOperation(cms, source, target, sources + 1, 1); assertRelationOperation(cms, created, target, sources + 1, 1); // check the online project CmsProject project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(createdName); OpenCms.getPublishManager().publishResource(cms, createdName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); assertRelationOperation(cms, source, target, sources + 1, 1); assertRelationOperation(cms, created, target, sources + 1, 1); } /** * Test createSibling method.<p> * * @throws Throwable if something goes wrong */ public void testCreateSibling() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'createSibling' method"); String sourceName = "/index.html"; CmsResource source = cms.readResource(sourceName); String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); int sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); String siblingName = "/index_sibling.html"; cms.lockResource(sourceName); cms.createSibling(sourceName, siblingName, null); CmsResource sibling = cms.readResource(siblingName); assertRelationOperation(cms, source, target, sources + 1, 1); assertRelationOperation(cms, sibling, target, sources + 1, 1); // check the online project CmsProject project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(siblingName); OpenCms.getPublishManager().publishResource(cms, siblingName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); assertRelationOperation(cms, source, target, sources + 1, 1); assertRelationOperation(cms, sibling, target, sources + 1, 1); } /** * Test deleteResource method for a folder.<p> * * @throws Throwable if something goes wrong */ public void testDeleteFolder() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'deleteResource' method for a folder"); String folderName = "/testFolder"; cms.createResource(folderName, CmsResourceTypeFolder.RESOURCE_TYPE_ID); String targetName = "/folder2/image2.gif"; CmsResource target = cms.readResource(targetName); String sourceName = folderName + "/index.html"; CmsResource source = cms.createResource(sourceName, CmsResourceTypeXmlPage.getStaticTypeId()); TestLinkValidation.setContent(cms, sourceName, "<img src='" + targetName + "'>"); List relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertEquals(1, relations.size()); CmsRelation expected = new CmsRelation(source, target, CmsRelationType.EMBEDDED_IMAGE); assertRelation(expected, (CmsRelation)relations.get(0)); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.SOURCES); assertTrue(relations.isEmpty()); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES); assertEquals(1, relations.size()); cms.lockResource(folderName); cms.deleteResource(folderName, CmsResource.DELETE_PRESERVE_SIBLINGS); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES); assertTrue(relations.isEmpty()); } /** * Test deleteResource method.<p> * * @throws Throwable if something goes wrong */ public void testDeleteResource() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'deleteResource' method"); String sourceName = "/index_copy.html"; CmsResource source = cms.readResource(sourceName); String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); CmsRelation expected = new CmsRelation(source, target, CmsRelationType.EMBEDDED_IMAGE); assertRelation(expected, (CmsRelation)relations.get(0)); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.SOURCES); assertTrue(relations.isEmpty()); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); int sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); cms.lockResource(sourceName); cms.deleteResource(sourceName, CmsResource.DELETE_PRESERVE_SIBLINGS); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES); assertEquals(sources, relations.size()); // there is no direct way to check the relations of deleted resources /* String query = "select * from cms_offline_resource_relations where relation_source_id = '" + source.getStructureId() + "' or relation_source_path like '" + source.getRootPath() + "%';"; */ // now test deleting a target relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); cms.lockResource(targetName); cms.deleteResource(targetName, CmsResource.DELETE_PRESERVE_SIBLINGS); sourceName = "/index.html"; source = cms.readResource(sourceName); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertEquals(1, relations.size()); expected = new CmsRelation(source, target, CmsRelationType.EMBEDDED_IMAGE); assertRelation(expected, (CmsRelation)relations.get(0)); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.SOURCES); assertTrue(relations.isEmpty()); // there is no direct way to check the relations of deleted resources /* query = "select * from cms_offline_resource_relations where relation_target_id = '" + target.getStructureId() + "' or relation_target_path like '" + target.getRootPath() + "%';"; */ } /** * Test importResource method for link parseable resources.<p> * * @throws Throwable if something goes wrong */ public void testImportResourceLinkParseable() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'importResource' method for link parseable resources"); String sourceName = "/index.html"; CmsResource source = cms.readResource(sourceName); String targetName = "folder1/subfolder11/subsubfolder111/jsp.jsp"; String zipExportFilename = OpenCms.getSystemInfo().getAbsoluteRfsPathRelativeToWebInf( "packages/testImportChangeType.zip"); try { List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); // replace by link parseable cms.lockResource(targetName); cms.replaceResource(targetName, source.getTypeId(), cms.readFile(source).getContents(), null); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); // export the file List exportPaths = new ArrayList(1); exportPaths.add(targetName); CmsVfsImportExportHandler vfsExportHandler = new CmsVfsImportExportHandler(); CmsExportParameters params = new CmsExportParameters( zipExportFilename, null, true, false, false, exportPaths, false, true, 0, true, false); vfsExportHandler.setExportParams(params); OpenCms.getImportExportManager().exportData( cms, vfsExportHandler, new CmsShellReport(cms.getRequestContext().getLocale())); // change the type back cms.undoChanges(targetName, CmsResource.UNDO_CONTENT); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); // re-import the exported file OpenCms.getImportExportManager().importData( cms, new CmsShellReport(cms.getRequestContext().getLocale()), new CmsImportParameters(zipExportFilename, "/", true)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); } finally { try { if (zipExportFilename != null) { File file = new File(zipExportFilename); if (file.exists()) { file.delete(); } } } catch (Throwable t) { // intentionally left blank } } } /** * Test importResource method for non link parseable resources.<p> * * @throws Throwable if something goes wrong */ public void testImportResourceNonLinkParseable() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'importResource' method for non link parseable resources"); String sourceName = "/index_created.html"; String zipExportFilename = OpenCms.getSystemInfo().getAbsoluteRfsPathRelativeToWebInf( "packages/testImportChangeType.zip"); try { List relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); // change the type of the resource cms.lockResource(sourceName); cms.chtype(sourceName, CmsResourceTypeBinary.getStaticTypeId()); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); // export the file List exportPaths = new ArrayList(1); exportPaths.add(sourceName); CmsVfsImportExportHandler vfsExportHandler = new CmsVfsImportExportHandler(); CmsExportParameters params = new CmsExportParameters( zipExportFilename, null, true, false, false, exportPaths, false, true, 0, true, false); vfsExportHandler.setExportParams(params); OpenCms.getImportExportManager().exportData( cms, vfsExportHandler, new CmsShellReport(cms.getRequestContext().getLocale())); // change the type back cms.undoChanges(sourceName, CmsResource.UNDO_CONTENT); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertEquals(1, relations.size()); // re-import the exported file OpenCms.getImportExportManager().importData( cms, new CmsShellReport(cms.getRequestContext().getLocale()), new CmsImportParameters(zipExportFilename, "/", true)); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); } finally { deleteFile(zipExportFilename); } } /** * Test the links after the setup.<p> * * @throws Throwable if something goes wrong */ public void testInitialSetup() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing the links after the setup"); String sourceName = "/index.html"; CmsResource source = cms.readResource(sourceName); String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertEquals(1, relations.size()); CmsRelation expected = new CmsRelation(source, target, CmsRelationType.EMBEDDED_IMAGE); assertRelation(expected, (CmsRelation)relations.get(0)); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.SOURCES); assertTrue(relations.isEmpty()); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES); assertEquals(20, relations.size()); } /** * Test moveResource method.<p> * * @throws Throwable if something goes wrong */ public void testMoveResource() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'moveResource' method"); String sourceName = "/index_sibling.html"; String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); int sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); String movedName = "/index_moved.html"; cms.lockResource(sourceName); cms.moveResource(sourceName, movedName); CmsResource moved = cms.readResource(movedName); assertRelationOperation(cms, moved, target, sources, 1); // check the online project CmsProject project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(movedName); OpenCms.getPublishManager().publishResource(cms, movedName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); assertRelationOperation(cms, moved, target, sources, 1); } /** * Test replaceResource method.<p> * * @throws Throwable if something goes wrong */ public void testReplaceLinkParseableResource() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'replaceResource' method, replace link parseable with non link parseable resource"); String sourceName = "/folder1/subfolder11/subsubfolder111/jsp.jsp"; CmsResource source = cms.readResource(sourceName); String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); int sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); String replacedName = "/index_created.html"; cms.lockResource(replacedName); cms.replaceResource(replacedName, source.getTypeId(), cms.readFile(source).getContents(), null); CmsResource replaced = cms.readResource(replacedName); relations = cms.getRelationsForResource(replacedName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); assertRelationOperation(cms, replaced, target, sources - 1, 0); // check the online project CmsProject project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); assertRelationOperation(cms, replaced, target, sources, 1); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(replacedName); OpenCms.getPublishManager().publishResource(cms, replacedName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(replacedName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); assertRelationOperation(cms, replaced, target, sources - 1, 0); } /** * Test replaceResource method.<p> * * @throws Throwable if something goes wrong */ public void testReplaceNonLinkParseableResource() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'replaceResource' method, replace non link parseable with link parseable resource"); String sourceName = "/index.html"; CmsResource source = cms.readResource(sourceName); String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); int sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); String replacedName = "/index_created.html"; cms.lockResource(replacedName); cms.replaceResource(replacedName, source.getTypeId(), cms.readFile(source).getContents(), null); CmsResource replaced = cms.readResource(replacedName); assertRelationOperation(cms, replaced, target, sources + 1, 1); // check the online project CmsProject project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); assertRelationOperation(cms, replaced, target, sources, 0); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(replacedName); OpenCms.getPublishManager().publishResource(cms, replacedName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); assertRelationOperation(cms, replaced, target, sources + 1, 1); } /** * Test undoChanges method.<p> * * @throws Throwable if something goes wrong */ public void testUndoChanges() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'undoChanges' method"); String sourceName = "/index.html"; CmsResource source = cms.readResource(sourceName); String targetName = "/folder1/index.html"; CmsResource target = cms.readResource(targetName); List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertEquals(1, relations.size()); assertTrue(cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).isEmpty()); // add new relation cms.lockResource(sourceName); cms.addRelationToResource(sourceName, targetName, CmsRelationType.CATEGORY.getName()); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertEquals(2, relations.size()); assertRelation(new CmsRelation(source, target, CmsRelationType.CATEGORY), (CmsRelation)relations.get(1)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES); assertEquals(1, relations.size()); assertRelation(new CmsRelation(source, target, CmsRelationType.CATEGORY), (CmsRelation)relations.get(0)); // publish OpenCms.getPublishManager().publishResource(cms, sourceName); OpenCms.getPublishManager().waitWhileRunning(); // delete relation cms.lockResource(sourceName); cms.deleteRelationsFromResource( sourceName, CmsRelationFilter.TARGETS.filterResource(target).filterNotDefinedInContent()); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertEquals(1, relations.size()); assertTrue(cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).isEmpty()); // undo changes cms.undoChanges(sourceName, CmsResource.UNDO_CONTENT); relations = cms.getRelationsForResource(sourceName, CmsRelationFilter.TARGETS); assertEquals(2, relations.size()); assertRelation(new CmsRelation(source, target, CmsRelationType.CATEGORY), (CmsRelation)relations.get(1)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES); assertEquals(1, relations.size()); assertRelation(new CmsRelation(source, target, CmsRelationType.CATEGORY), (CmsRelation)relations.get(0)); } /** * Test writeFile method.<p> * * @throws Throwable if something goes wrong */ public void testWriteFile() throws Throwable { CmsObject cms = getCmsObject(); echo("Testing 'writeFile' method"); String sourceName = "/index.html"; CmsResource source = cms.readResource(sourceName); String targetName = "/folder1/image2.gif"; CmsResource target = cms.readResource(targetName); int sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); assertRelationOperation(cms, source, target, sources, 1); // duplicate the english body into a new german body element CmsFile file = cms.readFile(source); CmsXmlPage page = CmsXmlPageFactory.unmarshal(cms, file); page.addLocale(cms, Locale.GERMAN); page.addValue("body", Locale.GERMAN); page.setStringValue(cms, "body", Locale.GERMAN, page.getStringValue(cms, "body", Locale.ENGLISH)); file.setContents(page.marshal()); cms.lockResource(sourceName); cms.writeFile(file); // the same <link> node is reused assertRelationOperation(cms, source, target, sources, 1); // check the online project CmsProject project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); List relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); assertRelationOperation(cms, source, target, sources, 1); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(sourceName); OpenCms.getPublishManager().publishResource(cms, sourceName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); assertRelationOperation(cms, source, target, sources, 1); cms.getRequestContext().setCurrentProject(project); String newLinkName = "/index_created.html"; // now add an additional link file = cms.readFile(source); page = CmsXmlPageFactory.unmarshal(cms, file); page.addLocale(cms, Locale.FRENCH); page.addValue("body", Locale.FRENCH); page.setStringValue(cms, "body", Locale.FRENCH, "<a href='" + newLinkName + "'>French</a>"); file.setContents(page.marshal()); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.SOURCES); assertTrue(relations.isEmpty()); cms.lockResource(sourceName); cms.writeFile(file); assertRelationOperation(cms, source, target, sources, 2); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.SOURCES); assertEquals(relations.size(), 2); // since the source file has a sibling! // check the online project project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); assertRelationOperation(cms, source, target, sources, 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.SOURCES); assertTrue(relations.isEmpty()); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(sourceName); OpenCms.getPublishManager().publishResource(cms, sourceName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); assertRelationOperation(cms, source, target, sources, 2); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.SOURCES); assertEquals(relations.size(), 1); cms.getRequestContext().setCurrentProject(project); // now go back file = cms.readFile(source); page = CmsXmlPageFactory.unmarshal(cms, file); page.removeLocale(Locale.GERMAN); page.removeLocale(Locale.FRENCH); file.setContents(page.marshal()); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.SOURCES); assertEquals(relations.size(), 2); // since the source file has a sibling! cms.lockResource(sourceName); cms.writeFile(file); assertRelationOperation(cms, source, target, sources, 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.SOURCES); assertTrue(relations.isEmpty()); // check the online project project = cms.getRequestContext().getCurrentProject(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); relations = cms.getRelationsForResource(targetName, CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); sources = cms.getRelationsForResource(targetName, CmsRelationFilter.SOURCES).size(); assertRelationOperation(cms, source, target, sources, 2); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.SOURCES); assertEquals(relations.size(), 1); cms.getRequestContext().setCurrentProject(project); cms.unlockResource(sourceName); OpenCms.getPublishManager().publishResource(cms, sourceName); OpenCms.getPublishManager().waitWhileRunning(); cms.getRequestContext().setCurrentProject(cms.readProject(CmsProject.ONLINE_PROJECT_ID)); assertRelationOperation(cms, source, target, sources, 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.TARGETS); assertEquals(relations.size(), 1); relations = cms.getRelationsForResource(newLinkName, CmsRelationFilter.SOURCES); assertTrue(relations.isEmpty()); } private void assertRelationOperation( CmsObject cms, CmsResource source, CmsResource target, int sources, int sourceRelations) throws CmsException { List relations = cms.getRelationsForResource( cms.getRequestContext().removeSiteRoot(source.getRootPath()), CmsRelationFilter.TARGETS); assertEquals(relations.size(), sourceRelations); if (relations.size() == 1) { CmsRelation expected = new CmsRelation(source, target, CmsRelationType.EMBEDDED_IMAGE); assertRelation(expected, (CmsRelation)relations.get(0)); } relations = cms.getRelationsForResource( cms.getRequestContext().removeSiteRoot(source.getRootPath()), CmsRelationFilter.SOURCES); assertTrue(relations.isEmpty()); relations = cms.getRelationsForResource( cms.getRequestContext().removeSiteRoot(target.getRootPath()), CmsRelationFilter.TARGETS); assertTrue(relations.isEmpty()); relations = cms.getRelationsForResource( cms.getRequestContext().removeSiteRoot(target.getRootPath()), CmsRelationFilter.SOURCES); assertEquals(relations.size(), sources); } }