libreccm-legacy/ccm-docrepo/test/src/com/arsdigita/docrepo/FolderTest.java

504 lines
15 KiB
Java

/*
* 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);
}
}