All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opencms.file.TestShallowLocks Maven / Gradle / Ivy

Go to download

OpenCms is an enterprise-ready, easy to use website content management system based on Java and XML technology. Offering a complete set of features, OpenCms helps content managers worldwide to create and maintain beautiful websites fast and efficiently.

The newest version!
/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH & Co. KG (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, 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;

import org.opencms.lock.CmsLock;
import org.opencms.lock.CmsLockType;
import org.opencms.main.CmsException;
import org.opencms.main.OpenCms;
import org.opencms.test.OpenCmsTestCase;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import junit.framework.Test;

/**
 * Test cases for shallow locks.
 */
public class TestShallowLocks extends OpenCmsTestCase {

    /**
     * Creates a new test instance.
     *
     * @param name the test name
     */
    public TestShallowLocks(String name) {

        super(name);

    }

    /**
     * Creates the test suite.
     *
     * @return the test suite
     */
    public static Test suite() {

        return generateSetupTestWrapper(TestShallowLocks.class, "simpletest", "/");
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testGetBlockingResources() throws Exception {

        CmsObject cms = getCmsObject();
        CmsResource file = makeTestFile(cms, "/testGetBlockingResources/folder/file.txt");
        cms.lockResourceShallow(cms.readResource("/testGetBlockingResources"));
        CmsObject otherCms = OpenCms.initCmsObject(cms);
        setupUsers();
        otherCms.loginUser("Beta", "beta");
        otherCms.getRequestContext().setCurrentProject(cms.readProject("Offline"));
        List b1 = otherCms.getBlockingLockedResources("/testGetBlockingResources");
        List blocking = otherCms.getBlockingLockedResources("/testGetBlockingResources/folder");
        assertEquals(
            "Folder with shallow lock should not appear as a blocking resource for its children",
            0,
            blocking.size());

    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testLockType() throws Exception {

        CmsObject cms = getCmsObject();
        CmsResource tb = makeTestFile(cms, "testBar");
        cms.lockResourceShallow(tb);
        assertEquals(CmsLockType.SHALLOW, cms.getLock(tb).getType());
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testPublish() throws Exception {

        CmsObject cms = getCmsObject();

        CmsProject tempProject = cms.createTempfileProject();
        cms.getRequestContext().setCurrentProject(tempProject);
        CmsResource tb = makeTestFile(cms, "/testPublish/file.txt");
        cms.lockResourceShallow(cms.readResource("/testPublish"));
        assertLock(cms, "/testPublish", CmsLockType.SHALLOW);
        OpenCms.getPublishManager().publishProject(cms);
        OpenCms.getPublishManager().waitWhileRunning();
        assertLock(cms, "/testPublish", CmsLockType.UNLOCKED);

        tempProject = cms.createTempfileProject();
        cms.getRequestContext().setCurrentProject(tempProject);
        tb = makeTestFile(cms, "/testPublish2/subfolder/file.txt");
        cms.lockResourceShallow(cms.readResource("/testPublish2/subfolder"));
        assertLock(cms, "/testPublish2/subfolder", CmsLockType.SHALLOW);
        OpenCms.getPublishManager().publishProject(cms);
        OpenCms.getPublishManager().waitWhileRunning();
        assertLock(cms, "/testPublish2/subfolder", CmsLockType.UNLOCKED);
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testShallowLockBasic() throws Exception {

        CmsObject cms = getCmsObject();
        CmsObject otherCms = OpenCms.initCmsObject(cms);
        setupUsers();
        String folderPath = "/testShallowLockBasic/folder";
        String filePath = "/testShallowLockBasic/folder/file.txt";
        otherCms.loginUser("Beta", "beta");
        otherCms.getRequestContext().setCurrentProject(cms.readProject("Offline"));
        CmsResource testfile1 = makeTestFile(cms, filePath);
        CmsResource folder = cms.readResource(folderPath);
        CmsResource file = cms.readResource(filePath);
        cms.lockResourceShallow(folder);
        assertLock(cms, cms.getSitePath(file), CmsLockType.UNLOCKED);
        otherCms.lockResourceShallow(file);
        tryChangeTitle(cms, folderPath);
        tryChangeTitle(otherCms, filePath);
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testShallowLockBasic2() throws Exception {

        CmsObject cms = getCmsObject();
        CmsObject otherCms = OpenCms.initCmsObject(cms);
        setupUsers();
        String folderPath = "/testShallowLockBasic2/folder";
        String filePath = "/testShallowLockBasic2/folder/file.txt";
        otherCms.loginUser("Beta", "beta");
        otherCms.getRequestContext().setCurrentProject(cms.readProject("Offline"));
        CmsResource testfile1 = makeTestFile(cms, filePath);
        CmsResource folder = cms.readResource(folderPath);
        CmsResource file = cms.readResource(filePath);
        cms.lockResourceShallow(folder);
        otherCms.lockResource(file);
        tryChangeTitle(cms, folderPath);
        tryChangeTitle(otherCms, filePath);
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testShallowLockBasic3() throws Exception {

        CmsObject cms = getCmsObject();
        CmsObject otherCms = OpenCms.initCmsObject(cms);
        setupUsers();
        String folderPath = "/testShallowLockBasic3/folder";
        String filePath = "/testShallowLockBasic3/folder/file.txt";
        otherCms.loginUser("Beta", "beta");
        otherCms.getRequestContext().setCurrentProject(cms.readProject("Offline"));
        CmsResource testfile1 = makeTestFile(cms, filePath);
        CmsResource folder = cms.readResource(folderPath);
        CmsResource file = cms.readResource(filePath);
        cms.lockResource(folder);
        assertThrows(
            "Should not be able to use a shallow lock in a normally locked folder.",
            () -> otherCms.lockResourceShallow(file));
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testShallowLockDoesNotAllowDelete() throws Exception {

        CmsObject cms = getCmsObject();
        CmsResource file = makeTestFile(cms, "/testShallowLockDoesNotAllowDelete/file.txt");
        cms.lockResourceShallow(cms.readResource("/testShallowLockDoesNotAllowDelete"));
        assertThrows(
            "Shallow lock should not allow delete operations",
            () -> cms.deleteResource("/testShallowLockDoesNotAllowDelete", CmsResource.DELETE_PRESERVE_SIBLINGS));
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testShallowLockDoesNotAllowMove() throws Exception {

        CmsObject cms = getCmsObject();
        CmsResource file = makeTestFile(cms, "/testShallowLockDoesNotAllowMove/file.txt");
        cms.lockResourceShallow(cms.readResource("/testShallowLockDoesNotAllowMove"));
        assertThrows(
            "Shallow lock should not allow move operations",
            () -> cms.moveResource("/testShallowLockDoesNotAllowMove", "/testShallowLockDoesNotAllowMove2"));
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testShallowLockOnFolderDoesNotOverrideChildLock() throws Exception {

        CmsObject cms = getCmsObject();
        CmsObject otherCms = OpenCms.initCmsObject(cms);
        setupUsers();
        String folderPath = "/testShallowLockOnFolderDoesNotOverrideChildLock/folder";
        String filePath = "/testShallowLockOnFolderDoesNotOverrideChildLock/folder/file.txt";
        otherCms.loginUser("Beta", "beta");
        otherCms.getRequestContext().setCurrentProject(cms.readProject("Offline"));
        CmsResource testfile1 = makeTestFile(cms, filePath);
        CmsResource folder = cms.readResource(folderPath);
        CmsResource file = cms.readResource(filePath);
        otherCms.lockResource(file);
        cms.lockResourceShallow(folder);
        CmsLock childLock = cms.getLock(file);
        assertEquals(CmsLockType.EXCLUSIVE, childLock.getType());
        tryChangeTitle(otherCms, cms.getSitePath(file));
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testUnlock() throws Exception {

        CmsObject cms = getCmsObject();
        makeTestFile(cms, "/testUnlock/test.txt");
        makeTestFile(cms, "/testUnlock/test2.txt");
        CmsResource folder = cms.readResource("/testUnlock");
        cms.lockResource("/testUnlock/test.txt");
        cms.lockResourceShallow(folder);
        cms.lockResource("/testUnlock/test2.txt");
        cms.unlockResource(folder);
        assertLock(cms, "/testUnlock/test.txt", CmsLockType.EXCLUSIVE);
        assertLock(cms, "/testUnlock/test2.txt", CmsLockType.EXCLUSIVE);
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testUpgradeLockFails() throws Exception {

        CmsObject cms = getCmsObject();
        // CmsResource testFolder = ensureTestFolder(cms);
        CmsResource tb = makeTestFile(cms, "testUpgradeLock");
        cms.lockResourceShallow(tb);
        assertThrows("Trying to normally lock a shallow-locked folder should fail.", () -> cms.lockResource(tb));
    }

    /**
     * Test case.
     *
     * @throws Exception
     */
    public void testWriteProps() throws Exception {

        CmsObject cms = getCmsObject();
        CmsResource tb = makeTestFile(cms, "testWriteProps");
        cms.lockResourceShallow(tb);
        cms.writePropertyObjects(
            tb,
            Arrays.asList(new CmsProperty(CmsPropertyDefinition.PROPERTY_DESCRIPTION, "Desc 1", null)));
    }

    /**
     * Helper for creating a test file and all its parents folders.
     *
     * All created resources are unlocked.
     *
     * @param cms the CMS context to use
     * @param path the path at which to create the test file
     * @return the newly created test file
     *
     * @throws CmsException if something goes wrong
     */
    CmsResource makeTestFile(CmsObject cms, String path) throws CmsException {

        String currentPath = path;
        List ancestors = new ArrayList<>();
        while (currentPath != null) {
            ancestors.add(currentPath);
            currentPath = CmsResource.getParentFolder(currentPath);
        }
        CmsResource result = null;
        Collections.sort(ancestors);
        for (String ancestor : ancestors) {
            if (!cms.existsResource(ancestor)) {
                int type = 0;
                if (ancestor.equals(path)) {
                    type = 1;
                }
                CmsResource created = cms.createResource(ancestor, type);
                if (ancestor.equals(path)) {
                    result = created;
                }
                cms.unlockResource(created);
            }
        }
        return result;
    }

    /**
     * Sets up the necessary user accounts.
     *
     * @throws Exception if something goes wrong
     */
    private void setupUsers() throws Exception {

        CmsObject cms = getCmsObject();
        try {
            CmsUser user = cms.readUser("Beta");
        } catch (Exception e) {
            cms.createUser("Beta", "beta", "desc", new HashMap<>());
            cms.addUserToGroup("Beta", "Administrators");
        }
    }

    /**
     * Tries to set the Title property to a new value on the given resources, and then verifies that the value has actually been written.
     *
     * @param cms the CMS context to use
     * @param path the path for which to modify the property
     * @throws Exception if setting the property fails
     */
    private void tryChangeTitle(CmsObject cms, String path) throws Exception {

        String s = "EXPECTED-TITLE-" + System.currentTimeMillis();
        cms.writePropertyObjects(cms.readResource(path), Arrays.asList(new CmsProperty("Title", s, null)));
        cms.readPropertyObject(path, "Title", false);
        assertEquals(s, cms.readPropertyObject(path, "Title", false).getStructureValue());

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy