/* * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved. * * 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. * * 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 com.arsdigita.docmgr; import com.arsdigita.domain.DataObjectNotFoundException; import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.persistence.DataQuery; import com.arsdigita.persistence.OID; import com.arsdigita.persistence.Session; import com.arsdigita.persistence.SessionManager; import com.arsdigita.persistence.UniqueConstraintException; import com.arsdigita.persistence.DataCollection; import com.arsdigita.tools.junit.framework.BaseTestCase; import com.arsdigita.versioning.TransactionCollection; import org.apache.log4j.Logger; import java.math.BigDecimal; import java.util.Vector; /** * Test cases for folders; * * @author ron@arsdigita.com * @author sdeusch@arsdigita.com * @version $Id: //apps/docmgr/dev/test/src/com/arsdigita/docmgr/FolderTest.java#6 $ */ public class FolderTest extends BaseTestCase { final static String TEST_FILE_NAME = "file.html"; final static String TEST_IMAGE_NAME = "file.gif"; final static String TEST_FILE_PATH = System.getProperty("test.base.dir") + "/com/arsdigita/docmgr/" + TEST_FILE_NAME; final static String TEST_IMAGE_PATH = System.getProperty("test.base.dir") + "/com/arsdigita/docmgr/" + TEST_FILE_NAME; private static final Logger s_log = Logger.getLogger(FolderTest.class); public FolderTest(String name) { super(name); } /** * Tests to make sure uniqueness constraints work as intended */ public void testConstraints() throws Exception { Vector folderNames = new Vector(); folderNames.addElement("textxx/subfolder1"); folderNames.addElement("textxx/subfolder2"); Folder root = new Folder("ROOT", "root"); root.save(); Vector folders = new Vector(); for (int j = 0; j < folderNames.size(); j++) { String folderName = (String) folderNames.elementAt(j); try { Folder currentFolder = root.retrieveFolder(folderName); folders.addElement(currentFolder); } catch (DataObjectNotFoundException notFound) { Folder currentFolder = root.createFolders(folderName); folders.addElement(currentFolder); } } assertEquals(2, folders.size()); } /** * Create a folder. */ public void testFolderCreate() throws Exception { String name = "f001"; String desc = "f001 folder"; Folder f = new Folder(name, desc); f.save(); assertEquals(f.getName(), name); assertEquals(f.getDescription(), desc); } /** * Create subfolders and verify that a parent cannot contain two * folders with the same name. */ public void testFolderUniquenes() throws Exception { String name = "f002"; String desc = "f002 folder"; Folder f0 = null; Folder f1 = null; f0 = new Folder(name, desc); f0.save(); f1 = new Folder(name, desc, f0); f1.save(); try { Folder f2 = new Folder(name, desc, f0); f2.save(); fail("Created identical sub folders"); } catch (ResourceExistsException ex) { // triggered unique contraint violation } } /** * Retrieve sub folders by name. */ public void testFolderRetrieveByName() throws Exception { String name = "f003"; String desc = "f003 folder"; Folder fldr[] = new Folder[3]; fldr[0] = new Folder(name,desc); fldr[0].save(); for (int i = 1; i < fldr.length; i++) { fldr[i] = new Folder(name,desc,fldr[i-1]); fldr[i].save(); } // Set up the path elements. This array will store the // relative path from the root folder to each sub folder. String path[] = new String[fldr.length]; path[0] = ""; path[1] = name; for (int i = 2; i < path.length; i++) { path[i] = path[i-1] + Resource.SEPARATOR + name; } // Retrieve each sub folder by path for (int i = 1; i < fldr.length; i++) { Folder f = null; try { f = fldr[0].retrieveFolder(path[i]); } catch (DataObjectNotFoundException ex) { fail(ex.getMessage()); } catch (InvalidNameException ex) { fail(ex.getMessage()); } assertNotNull(f); assertEquals(fldr[i].getID(), f.getID()); } // Verify that retrieving a non-existing path returns null try { fldr[0].retrieveFolder("non-existent-path"); fail("Retrieved a non-existent path"); } catch (DataObjectNotFoundException ex) { // ignore } } /** * Create sub folders using relative path names. */ public void testFolderCreateByPath() throws Exception { String name = "f004"; String desc = "f004 folder"; // Create the root folder Folder root = null; root = new Folder(name,desc); root.save(); // Create all path elements (relative to root) String path[] = new String[4]; path[0] = root.getName(); for (int i = 1; i < path.length; i++) { path[i] = path[i-1] + Folder.SEPARATOR + name; } // Create the first and last sub folders root.createFolders(path[1]); root.createFolders(path[path.length-1]); // Verify that all intermediate folders were also created for (int i = 1; i < path.length; i++) { Folder f = null; f = root.retrieveFolder(path[i]); assertNotNull(f); } // Verify that trying to create an existing folder fails try { root.createFolders(path[path.length-1]); fail("Created duplicate folder"); } catch (ResourceExistsException ex) { // caught the unique constraint violation } } /** * Retrieve a file in a folder */ public void testFolderRetrieveFile() throws Exception { // create parent folder with one file String name = "f006"; String desc = "f006 folder"; Folder parent = null; File f1 = null; parent = new Folder(name,desc); parent.save(); s_log.warn(""); final String mimeType = Util.guessContentType(TEST_FILE_NAME, null); f1 = new File(parent); f1.setContent(new java.io.File(TEST_FILE_PATH),TEST_FILE_NAME, "test file", mimeType); f1.save(); s_log.warn(""); s_log.warn("File name:" + f1.getDisplayName()); s_log.warn("Folder path:" + parent.getPath()); s_log.warn("File path: " + f1.getPath()); // retrieve file by name File f2 = null; f2 = parent.retrieveFile(TEST_FILE_NAME); assertNotNull(f2); assertEquals(f1.getID(), f2.getID()); assertEquals(f1.getPath(), f2.getPath()); // load a non-existing file f2 = null; try { f2 = parent.retrieveFile("nonExistingFileName"); fail("Loaded non-existing File"); } catch(DataObjectNotFoundException e) { // correctly caught the exception } } /** * Verify that a folder cannot be deleted if it contains files or * other folders. */ public void testFolderDelete() throws Exception { String name = "root"; String desc = "root folder"; Folder root = new Folder(name,desc); root.save(); // add a subfolder Folder sub = new Folder(name,desc,root); sub.save(); // add a file File file = new File(name+".txt",desc,root); file.save(); root.delete(); } /** * Test moving a folder to a new location. */ public void testFolderMove() throws Exception { Folder root = buildFolderTree(); // Create one additional subfolder inside the folder we'll be // moving. Folder child = null; // pre /root/f0/f0 // post /root/f0/f0/f0 child = root.createFolders("f0/f0/f0"); child.save(); assertEquals("/root/f0/f0/f0", child.getPath()); assertEquals("f0", child.getName()); // Try moving /root/f0/f0 to /root/f2 Folder target = null; target = root.retrieveFolder("f0/f0"); assertEquals(target.getID(), child.getParentResourceID()); assertEquals("/root/f0/f0", target.getPath()); target.setName("f2"); target.save(); assertEquals("/root/f0/f2", target.getPath()); assertEquals("f2", target.getName()); target.setParent(root); target.save(); assertEquals("/root/f2", target.getPath()); assertEquals(target.getID(), child.getParentResourceID()); try { root.retrieveFolder("f0/f0"); fail("Folder should no longer be in this location"); } catch (DataObjectNotFoundException ex) { // correct } // Try retrieving the original subfolder f0/f0 using its new // path. Folder sub = null; sub = root.retrieveFolder("f2"); assertEquals(sub.getID(), target.getID()); assertEquals("/root/f2", sub.getPath()); // Try retrieving the subfolder from the new location sub = new Folder(child.getID()); System.out.println("EXPECT: "); System.out.println("/root/f2/f0"); System.out.println("Actual:"); System.out.println(sub.getPath()); // Needed because of session caching. The DataOperation that updates the child // paths happens behind the scenes of the cache. The retrieve operation // will flush the cache for the type. DataCollection folders = SessionManager.getSession().retrieve(Folder.BASE_DATA_OBJECT_TYPE); folders.addEqualsFilter("id", child.getID()); folders.next(); sub = new Folder(folders.getDataObject()); System.out.println("EXPECT: "); System.out.println("/root/f2/f0"); System.out.println("Actual:"); System.out.println(sub.getPath()); assertEquals("/root/f2/f0", sub.getPath()); } /** * Verify that a folder can't be moved to one of its own * subdirectories */ public void testFolderMoveCycle() throws Exception { try { Folder root = buildFolderTree(); Folder destination = root.createFolders("f0/f0/f0/f0/f0"); Folder source = root.retrieveFolder("f0/f0"); System.out.println("testFolderMoveCycle sourcepath: " + source.getPath()); System.out.println("testFolderMoveCycle destpath: " + destination.getPath()); source.setParent(destination); source.save(); fail("moved a folder into one of its sub folders"); } catch (ResourceException ex) { // Correct, this should NOT work! } } /** * Verify that a folder and all of its content can be copied. */ public void testFolderCopy() throws Exception { Folder root = buildFolderTree(); Folder orig = null; orig = root.retrieveFolder("f0"); // Place some children into the subfolder String desc = "child"; String child[] = { "child-0", "child-1" }; for (int i = 0; i < child.length; i++) { File f = new File(child[i], desc, orig); f.save(); } // Copy the subfolder to a new root-level folder named "f2" Folder copy = (Folder) orig.copyTo("f2", root); // Verify that the children were copied successfully for (int i = 0; i < child.length; i++) { BigDecimal id = copy.getResourceID(child[i]); File f = new File(id); assertEquals(child[i], f.getName()); assertEquals(desc, f.getDescription()); } } /** * Test factory method for instantiating folders. */ public void testFolderFactory() throws Exception { Folder root = buildFolderTree(); Folder fldr = null; OID oid = new OID(ResourceImpl.BASE_DATA_OBJECT_TYPE, root.getID()); fldr = (Folder) DomainObjectFactory.newInstance(oid); assertEquals(root.getID(), fldr.getID()); assertEquals(root.getName(), fldr.getName()); assertEquals(root.getDescription(), fldr.getDescription()); } /** * Build a folder tree for testing, of the following form: * * root/f0 * root/f0/f0 * root/f0/f1 * root/f1 * root/f1/f0 * root/f1/f1 * * @return the root of the folder tree */ protected static Folder buildFolderTree() throws Exception { String name = "root"; String desc = "root folder"; Folder root = null; String folderNames[] = { "f0/f0", "f0/f1", "f1/f0", "f1/f1" }; root = new Folder(name,desc); root.save(); for (int i = 0; i < folderNames.length; i++) { root.createFolders(folderNames[i]); } return root; } /** * List the contents of a folder (for debugging) */ private void list(Folder folder) { Session session = SessionManager.getSession(); DataQuery query = session.retrieveQuery ("com.arsdigita.docmgr.getResourceTree"); query.setParameter("startFolderID", folder.getID()); System.out.println("----- Listing folder " + folder.getName()); while (query.next()) { System.out.println((BigDecimal) query.get("id") + " " + (String) query.get("name") + " " + (String) query.get("path")); } query.close(); } /** * Main method required to make this test runnable. */ public static void main(String args[]) { junit.textui.TestRunner.run(FolderTest.class); } }