libreccm-legacy/ccm-docmgr/src/com/arsdigita/cms/docmgr/DocFolder.java

293 lines
9.3 KiB
Java
Executable File

package com.arsdigita.cms.docmgr;
import java.math.BigDecimal;
import java.net.URL;
import java.net.URLEncoder;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentType;
import com.arsdigita.cms.Folder;
import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.KernelExcursion;
import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.util.UncheckedWrapperException;
/**
* This class needs its own BASE_DATA_OBJECT_TYPE so we can have
* Description field. Otherwise, it would just be cms.Folder.
*
* @author Crag Wolfe
**/
public class DocFolder extends Folder implements Resource {
/** Private Logger instance for debugging purpose. */
private final static org.apache.log4j.Logger s_log =
org.apache.log4j.Logger.getLogger(DocFolder.class);
public static final String DESCRIPTION = "description";
/** Data object type for this domain object */
public static final String BASE_DATA_OBJECT_TYPE
= "com.arsdigita.cms.docmgr.DocFolder";
/** Data object type for this domain object (for CMS compatibility) */
public static final String TYPE = BASE_DATA_OBJECT_TYPE;
public DocFolder() {
this(BASE_DATA_OBJECT_TYPE);
try {
setContentType(ContentType.findByAssociatedObjectType(BASE_DATA_OBJECT_TYPE));
} catch(DataObjectNotFoundException e) {
throw new UncheckedWrapperException( (String) GlobalizationUtil.globalize(
"cms.contenttypes.event_type_not_registered").localize(), e);
}
}
public DocFolder(BigDecimal id) throws DataObjectNotFoundException {
this(new OID(BASE_DATA_OBJECT_TYPE, id));
}
public DocFolder(OID id) throws DataObjectNotFoundException {
super(id);
}
public DocFolder(DataObject obj) {
super(obj);
}
public DocFolder(String type) {
super(type);
}
public DocFolder(String title, String descrip, DocFolder parent) {
this(TYPE);
setTitle(title);
setDescription(descrip);
setParent(parent);
setContentSection(parent.getContentSection());
s_log.debug("creating docfolder: " + title);
}
/**
* Returns a DocFolder for the given data object. Use this method instead
* of the new Docfolder(DataObject) method. This method uses the domain
* object factory to produce the appropriate docfolder class.
*
* @param docfolderData the docfolder <code>DataObject</code>
*
* @return the docfolder for the given data object.
**/
public static DocFolder retrieveDocFolder(DataObject docfolderData) {
DocFolder docfolder = (DocFolder)
DomainObjectFactory.newInstance(docfolderData);
if (docfolder==null) {
throw new RuntimeException
("Domain object factory produced " +
"null docfolder for data object " +
docfolderData);
}
return docfolder;
}
public DocFolder retrieveSubFolder(String folderTitle) throws
DataObjectNotFoundException {
Folder.ItemCollection items = getItems();
items.addFolderFilter(true);
items.addEqualsFilter("name",
URLEncoder.encode(folderTitle));
DocFolder df = null;
if (items.next()) {
df = (DocFolder) items.getContentItem();
}
items.close();
if (df == null) {
throw new DataObjectNotFoundException
("No child, "+folderTitle+", found for folder "+
getTitle()+" (id is "+getID().toString());
}
return df;
}
public Resource retrieveSubResource(String resourceTitle) throws
DataObjectNotFoundException {
Folder.ItemCollection items = getItems();
items.addEqualsFilter("name",
URLEncoder.encode(resourceTitle));
Resource r = null;
if (items.next()) {
if (items.isFolder()) {
r = (DocFolder) items.getContentItem();
} else {
r = (Document)
((ContentBundle) items.getContentItem())
.getPrimaryInstance();
}
}
items.close();
if (r == null) {
throw new DataObjectNotFoundException
("No child, "+resourceTitle+", found for folder "+
getTitle()+" (id is "+getID().toString());
}
return r;
}
public boolean isFolder() {
return true;
}
public boolean isFile() {
return false;
}
public String getTitle() {
return getLabel();
}
public void setTitle(String title) {
setName(URLEncoder.encode(title));
super.setLabel(title);
}
public String getDescription() {
return (String) get(DESCRIPTION);
}
public void setDescription(String description) {
set(DESCRIPTION, description);
}
/**
* Copies the resource into another location. Preserves the
* original name of the resource but places the copy inside a new
* parent resource.
*
* @param parent the parent of the copy
* @return a copy of the original resource
*/
public Resource copyTo(Resource parent) throws ResourceExistsException {
return copyTo(getTitle(), parent);
}
/**
* Copies the resource into another location with a new name.
*
* @param name the name of the copy
* @param parent the parent of the copy
* @return a copy of the original resource.
*/
public Resource copyTo(String name, Resource parent) throws ResourceExistsException {
//TODO
Folder.ItemCollection ic =
((Folder) parent).getItems();
ic.addEqualsFilter("name",URLEncoder.encode(name));
boolean resourceExists = ic.next();
ic.close();
if(resourceExists) {
throw new ResourceExistsException
("Copying document would result in duplicate: "+name);
}
DocFolder df = new DocFolder(getTitle(), getDescription(),
(DocFolder) parent);
df.save();
return df;
}
/**
* Copies the resource into the same location (same parent) with a
* new name.
*
* @param name the name of the copy
* @return a copy of the original resource.
*/
public Resource copyTo(String name) throws ResourceExistsException {
return copyTo(name, getParentResource());
}
public URL toURL() {
//TODO
//return new URL("http://tod.example.net");
try {
return new URL("http://tod.example.net");
} catch ( java.net.MalformedURLException ex ) {
ex.printStackTrace();
s_log.error(ex.getMessage());
return null;
}
}
public boolean isRoot() {
// all root repositories folders are one folder below
// a content section root
// OR
// have a parent Folder rather than DocFolder
return ((ContentItem) getParent()).getParent() == null ||
//((ACSObject) ((ContentItem) getParent()).getParent()).
((ACSObject) getParent()).
getSpecificObjectType().equals("com.arsdigita.cms.Folder");
}
public Resource getParentResource() {
DocFolder parent = (DocFolder) getParent();
return parent;
}
public void setParentResource(final Resource r) {
setParent((ACSObject) r);
save();
final DocFolder thisResource = this;
new KernelExcursion() {
protected void excurse() {
setParty(Kernel.getSystemParty());
PermissionService.setContext(thisResource,(ACSObject) r);
}}.run();
}
public static DocFolder getRootFolder(DocFolder f) {
if (f.isRoot()) {
return f;
}
return f.getRootFolder((DocFolder) f.getParentResource());
}
public static Repository getRepository(Resource r) {
DocFolder f = null;
if (r.isFolder()) {
f = (DocFolder) r;
} else {
f = (DocFolder) r.getParentResource();
}
DocFolder rootFolder = DocFolder.getRootFolder(f);
Repository rep = null;
DataCollection dataCollection =
SessionManager.getSession().retrieve(Repository.BASE_DATA_OBJECT_TYPE);
dataCollection.addEqualsFilter(Repository.ROOT,rootFolder.getID().toString());
long size = dataCollection.size();
if (size > 1) {
s_log.error("should not have more than one repository per folder");
} if (size == 0) {
s_log.error("root folder does not have a repository");
} else {
dataCollection.next();
rep = new Repository(dataCollection.getDataObject());
}
dataCollection.close();
return rep;
}
}