libreccm-legacy/ccm-docmgr/src/com/arsdigita/cms/docmgr/ui/BrowseFileInfoPropertiesPan...

1067 lines
41 KiB
Java
Executable File

package com.arsdigita.cms.docmgr.ui;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
// pboy: unneccessary import, to be deleted
// import java.util.Iterator;
import java.util.TooManyListenersException;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.ColumnPanel;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.GridPanel;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Link;
import com.arsdigita.bebop.ModalContainer;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.RequestLocal;
import com.arsdigita.bebop.SimpleComponent;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormValidationListener;
import com.arsdigita.bebop.event.PrintEvent;
import com.arsdigita.bebop.event.PrintListener;
import com.arsdigita.bebop.event.RequestEvent;
import com.arsdigita.bebop.event.RequestListener;
import com.arsdigita.bebop.form.FileUpload;
import com.arsdigita.bebop.form.MultipleSelect;
import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.SingleSelect;
import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.form.TextArea;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.ArrayParameter;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.EmailValidationListener;
// pboy: unneccessary import, to be deleted
// import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
import com.arsdigita.categorization.Category;
import com.arsdigita.categorization.CategoryCollection;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.ContentSectionCollection;
import com.arsdigita.cms.FileAsset;
// pboy: unneccessary import, to be deleted
// import com.arsdigita.cms.docmgr.DocFolder;
import com.arsdigita.cms.docmgr.DocMgr;
import com.arsdigita.cms.docmgr.Document;
import com.arsdigita.cms.docmgr.util.GlobalizationUtil;
import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.dispatcher.MultipartHttpServletRequest;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.Group;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.KernelExcursion;
import com.arsdigita.kernel.User;
import com.arsdigita.kernel.permissions.ObjectPermissionCollection;
import com.arsdigita.kernel.permissions.PermissionDescriptor;
import com.arsdigita.kernel.permissions.PermissionManager;
import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
import com.arsdigita.mail.Mail;
import com.arsdigita.mimetypes.MimeType;
import com.arsdigita.persistence.OID;
import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.versioning.TransactionCollection;
import com.arsdigita.versioning.Versions;
import com.arsdigita.web.Application;
import com.arsdigita.web.ParameterMap;
import com.arsdigita.web.URL;
import com.arsdigita.web.Web;
import com.arsdigita.xml.Element;
/**
* @author Peter Kopunec
*/
public class BrowseFileInfoPropertiesPane extends ModalContainer implements DMConstants {
private static final Logger s_log = Logger.getLogger(BrowseFileInfoPropertiesPane.class);
private BrowsePane m_parent;
private Page m_page;
private Component m_properties;
private Component m_edit;
private Component m_upload;
private FileSendColleaguePane m_sendColleague;
private Component m_action;
private FilePropertiesPanel m_propertiesPane;
private BigDecimalParameter docIDParam = new BigDecimalParameter("doc_id");
public BrowseFileInfoPropertiesPane(BrowsePane parent) {
m_parent = parent;
m_properties = makePropertiesPane();
add(m_properties);
setDefaultComponent(m_properties);
m_edit = makeEditPane();
add(m_edit);
m_upload = makeUploadForm();
add(m_upload);
m_sendColleague = makeSendColleagueForm();
add(m_sendColleague);
}
/**
* Register the page the fist time
*/
public void register(Page p) {
m_page = p;
p.addGlobalStateParam(docIDParam);
super.register(p);
}
public BigDecimalParameter getFileIDParam() {
try {
return ((DocmgrBasePage) m_page).getFileIDParam();
} catch (Throwable e) {
}
return null;
}
public void setDocID(PageState state, BigDecimal docID) {
state.setValue(docIDParam, docID);
m_page.getTitle().setLabel(DMUtils.getFile(docID).getTitle(), state);
}
private Component makePropertiesPane() {
SimpleContainer container = new SimpleContainer();
m_propertiesPane = new FilePropertiesPanel(this);
container.add(m_propertiesPane);
container.add(new FileActionPane());
return container;
}
public void displayPropertiesPane(PageState state) {
setVisibleComponent(state, m_properties);
}
private Component makeEditPane() {
return new FileEditForm(this);
}
public void displayEditForm(PageState state) {
setVisibleComponent(state, m_edit);
}
private Component makeUploadForm() {
return new VersionUploadForm();
}
public void displayUploadForm(PageState state) {
setVisibleComponent(state, m_upload);
}
private FileSendColleaguePane makeSendColleagueForm() {
return new FileSendColleaguePane();
}
public void displaySendColleagueForm(PageState state) {
m_sendColleague.initState(state);
setVisibleComponent(state, m_sendColleague);
}
class BackCancelActionLink extends ActionLink {
public BackCancelActionLink(String label) {
super(label);
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
m_parent.displayFolderContentPanel(e.getPageState());
}
});
}
}
class FilePropertiesPanel extends SimpleComponent {
BrowseFileInfoPropertiesPane m_parent;
public FilePropertiesPanel(BrowseFileInfoPropertiesPane parent) {
m_parent = parent;
}
public void generateXML(PageState state, Element parent) {
Element element = parent.newChildElement("docs:file-info", DOCS_XML_NS);
BigDecimal docID = (BigDecimal) state.getValue(docIDParam);
if (docID != null) {
try {
// Retrieve resource properties.
Document doc = new Document(docID);
if (s_log.isDebugEnabled()) {
s_log.debug("doc raw content: " + doc.getSearchRawContent());
//s_log.debug("doc xml content: " + doc.getSearchXMLContent());
}
Element titleElement = element.newChildElement("docs:title", DOCS_XML_NS);
titleElement.setText(doc.getTitle());
Element nameElement = element.newChildElement("docs:name", DOCS_XML_NS);
nameElement.setText(URLDecoder.decode(doc.getName()));
Element descriptionElement = element.newChildElement("docs:description",
DOCS_XML_NS);
String description = doc.getDescription();
if (description != null) {
descriptionElement.setText(description);
}
Element sizeElement = element.newChildElement("docs:size", DOCS_XML_NS);
sizeElement.setText(DMUtils.FileSize.formatFileSize(doc.getSize()));
Element typeElement = element.newChildElement("docs:type", DOCS_XML_NS);
// Retrieve pretty name for a mime type.
typeElement.setText(doc.getPrettyMimeType());
Element lastModifiedElement = element.newChildElement("docs:last-modified",
DOCS_XML_NS);
lastModifiedElement.setText(
null != doc.getLastModifiedDate() ? DMUtils.DateFormat.format(doc.
getLastModifiedDate()) : "");
Element revisionElement = element.newChildElement("docs:revision", DOCS_XML_NS);
TransactionCollection tc = Versions.getTaggedTransactions(doc.getOID());
long numRevs = tc.size();
revisionElement.setText(numRevs + "");
// Must allow for the possibility that not author is available.
Element authorElement = element.newChildElement("docs:author", DOCS_XML_NS);
authorElement.setText(doc.getImpliedAuthor());
Element uriElement = element.newChildElement("docs:uri", DOCS_XML_NS);
uriElement.setText(makeFileURL(doc, state));
Element catsElement = element.newChildElement("docs:categories", DOCS_XML_NS);
CategoryCollection cats = doc.getCategoryCollection();
Category cat;
Element catElement;
while (cats.next()) {
cat = cats.getCategory();
catElement = catsElement.newChildElement("docs:category", DOCS_XML_NS);
catElement.addAttribute("id", cat.getID().toString());
catElement.addAttribute("name", cat.getName());
}
} catch (DataObjectNotFoundException exc) {
Element notfoundElement = element.newChildElement("docs:notfound", DOCS_XML_NS);
}
} else {
Element notfoundElement = element.newChildElement("docs:notfound", DOCS_XML_NS);
}
}
private String makeFileURL(Document doc, PageState state) {
final HttpServletRequest req = state.getRequest();
final ParameterMap params = new ParameterMap();
params.setParameter(FILE_ID_PARAM_NAME, doc.getID());
return URL.here(req, "/download/", params).toString();
}
}
class FileEditForm extends Form implements FormValidationListener, FormProcessListener,
FormInitListener {
private final static String FILE_EDIT = "file-edit";
private final static String FILE_EDIT_CATS = "file-edit-cats";
private final static String FILE_EDIT_FNAME = "file-edit-name";
private final static String FILE_EDIT_AUDIENCE = "file-edit-audience";
private final static String FILE_EDIT_AUTHOR = "file-edit-author";
private final static String FILE_EDIT_DESCRIPTION = "file-edit-description";
private final static String FILE_EDIT_TITLE = "file-edit-title";
private BrowseFileInfoPropertiesPane m_parent;
private StringParameter m_FileAudience;
private StringParameter m_FileName;
private TrimmedStringParameter m_FileAuthor;
private StringParameter m_FileDesc;
private ArrayParameter m_FileCats;
private StringParameter m_FileTitle;
private FileUpload m_fileUpload;
private final static String FILE_UPLOAD = "file-upload";
private Submit m_submit;
public FileEditForm(BrowseFileInfoPropertiesPane parent) {
super(FILE_EDIT, new ColumnPanel(2));
m_parent = parent;
m_FileAudience = new StringParameter(FILE_EDIT_AUDIENCE);
m_FileAuthor = new TrimmedStringParameter(FILE_EDIT_AUTHOR);
m_FileDesc = new StringParameter(FILE_EDIT_DESCRIPTION);
m_FileCats = new ArrayParameter(FILE_EDIT_CATS);
add(new Label(FILE_NAME_REQUIRED));
m_FileName = new StringParameter(FILE_EDIT_FNAME);
TextField fnameEntry = new TextField(m_FileName);
add(fnameEntry);
add(new Label("Title"));//TODO
m_FileTitle = new StringParameter(FILE_EDIT_TITLE);
TextField fTitleEntry = new TextField(m_FileTitle);
add(fTitleEntry);
add(new Label(FILE_INTENDED_AUDIENCE));
SingleSelect audienceEntry = new SingleSelect(m_FileAudience);
try {
audienceEntry.addPrintListener(new IntendedAudienceSelectPrinter());
} catch (TooManyListenersException tmlex) {
s_log.error(tmlex.getMessage());
tmlex.printStackTrace();
}
add(audienceEntry);
add(new Label(new AuthorLabelPrinter()));
TextField authorEntry = new TextField(m_FileAuthor);
authorEntry.addValidationListener(new StringLengthValidationListener(200));
add(authorEntry);
add(new Label(FILE_CATEGORIES));
MultipleSelect catSelect = new MultipleSelect(FILE_EDIT_CATS);
catSelect.setSize(20);
try {
BigDecimalParameter fileIDParam = null;
fileIDParam = getFileIDParam();
catSelect.addPrintListener(new CategoriesPrintListener(getContentSection(),
fileIDParam));
} catch (java.util.TooManyListenersException tmex) {
throw new UncheckedWrapperException(tmex.getMessage());
}
add(catSelect);
add(new Label(FILE_DESCRIPTION));
TextArea descArea = new TextArea(m_FileDesc);
descArea.setRows(10);
descArea.setCols(40);
add(descArea);
m_submit = new Submit("file-edit-save");
m_submit.setButtonLabel(FILE_SAVE);
add(new Label()); // spacer
SimpleContainer sc = new SimpleContainer();
sc.add(m_submit);
sc.add(new Submit(CANCEL));
add(sc);
addInitListener(this);
addProcessListener(this);
addValidationListener(this);
}
/**
* Initializer to pre-fill name and description
*/
public void init(FormSectionEvent e) throws FormProcessException {
PageState state = e.getPageState();
FormData data = e.getFormData();
BigDecimal id = (BigDecimal) state.getValue(docIDParam);
Document doc = DMUtils.getFile(id);
ArrayList assignedCats = new ArrayList();
CategoryCollection cats = doc.getCategoryCollection();
Category cat;
while (cats.next()) {
cat = cats.getCategory();
String catID = cat.getID().toString();
assignedCats.add(catID);
s_log.debug("init: " + catID);
}
data.put(FILE_EDIT_FNAME, URLDecoder.decode(doc.getName()));
data.put(FILE_EDIT_TITLE, doc.getTitle());
data.put(FILE_EDIT_AUTHOR, doc.getAuthor());
data.put(FILE_EDIT_DESCRIPTION, doc.getDescription());
data.put(FILE_EDIT_CATS, assignedCats.toArray());
initAudienceFormData(data, doc);
}
/**
* read form and update
*/
public void process(FormSectionEvent e) throws FormProcessException {
PageState state = e.getPageState();
if (m_submit.isSelected(state)) {
processEdit(e);
}
displayPropertiesPane(state);
}
private void processEdit(FormSectionEvent e) throws FormProcessException {
PageState state = e.getPageState();
FormData data = e.getFormData();
Document doc = DMUtils.getFile((BigDecimal) state.getValue(docIDParam));
setDocumentAttributes(data, doc);
doc.setCategories((String[]) data.get(FILE_EDIT_CATS));
doc.setLastModifiedLocal(new java.util.Date());
doc.save(); // creates a new revision
setDocumentPermission(data, doc);
}
private void setDocumentAttributes(FormData data, Document doc) {
String ftitle = (String) data.get(FILE_EDIT_TITLE);
String fname = (String) data.get(FILE_EDIT_FNAME);
// title must be set before name
doc.setTitle((ftitle != null && ftitle.length() > 0) ? ftitle : fname);
fname = fname.replace('"', ' ');
doc.setName(URLEncoder.encode(fname));
String fauthor = (String) data.get(FILE_EDIT_AUTHOR);
String fdesc = (String) data.get(FILE_EDIT_DESCRIPTION);
if (fauthor != null) {
doc.setAuthor(fauthor);
}
doc.setDescription(fdesc);
}
protected String getUploadFileName(FormSectionEvent e) {
FormData data = e.getFormData();
String filename = (String) data.get(FILE_UPLOAD);
return DMUtils.extractFileName(filename, e.getPageState());
}
/**
* Test if the new name already exists in the current folder
*/
public void validate(FormSectionEvent event) throws FormProcessException {
PageState state = event.getPageState();
if (m_submit.isSelected(state)) {
validateEdit(event);
}
}
private void validateEdit(FormSectionEvent event) throws FormProcessException {
PageState state = event.getPageState();
FormData data = event.getFormData();
String fname = (String) data.get(FILE_EDIT_FNAME);
if (fname == null || fname.trim().length() == 0) {
data.addError(FILE_EDIT_FNAME, "This parameter is required");
}
String title = (String) data.get(FILE_EDIT_TITLE);
if (title == null || title.length() == 0) {
data.addError(FILE_EDIT_TITLE, "This parameter is required.");
} else if (title.length() > 200) {
data.addError(FILE_EDIT_TITLE,
"This title is too long. It must be fewer than 200 characters.");
}
}
/*
* Initialize form data for document's intended audience.
*/
private void initAudienceFormData(FormData data, Document doc) {
ObjectPermissionCollection opc = PermissionService.getDirectGrantedPermissions(doc.
getOID());
long numPermissions = opc.size();
if (numPermissions > 1) {
s_log.error("there should only be 1 direct permission for " + "a document");
}
if (numPermissions == 0) {
data.put(FILE_EDIT_AUDIENCE, "workspace");
opc.close();
return;
}
boolean isPublic = false;
while (opc.next()) {
if (opc.getGranteeID().intValue() == PermissionManager.VIRTUAL_PUBLIC_ID) {
isPublic = true;
}
}
opc.close();
if (isPublic) {
data.put(FILE_EDIT_AUDIENCE, "public");
} else {
data.put(FILE_EDIT_AUDIENCE, "internal");
}
}
/*
* Grant/revoke direct permissions as needed. Note that workspace
* permissions is always implied.
*/
private void setDocumentPermission(FormData data, Document doc) throws FormProcessException {
final String intendedAudience = (String) data.get(FILE_EDIT_AUDIENCE);
if (intendedAudience == null) {
throw new FormProcessException(GlobalizationUtil.globalize(
"ui.intended_audience_cannot_be_null"));
}
final PermissionDescriptor publicDescriptor = new PermissionDescriptor(
PrivilegeDescriptor.READ, doc.getOID(), new OID(
User.BASE_DATA_OBJECT_TYPE, PermissionManager.VIRTUAL_PUBLIC_ID));
final PermissionDescriptor internalDescriptor = new PermissionDescriptor(
PrivilegeDescriptor.READ, doc.getOID(), new OID(
Group.BASE_DATA_OBJECT_TYPE, DocMgr.getConfig().getInternalGroupID()));
new KernelExcursion() {
protected void excurse() {
//Party currentParty = Kernel.getWebContext().getParty();
setParty(Kernel.getSystemParty());
if ("public".equals(intendedAudience)) {
PermissionService.grantPermission(publicDescriptor);
PermissionService.revokePermission(internalDescriptor);
} else if ("internal".equals(intendedAudience)) {
PermissionService.revokePermission(publicDescriptor);
PermissionService.grantPermission(internalDescriptor);
} else {
// workspace only
PermissionService.revokePermission(publicDescriptor);
PermissionService.revokePermission(internalDescriptor);
}
}
}.run();
}
protected class AuthorLabelPrinter implements PrintListener {
public AuthorLabelPrinter() {
// Empty
}
public void prepare(PrintEvent e) {
Label label = (Label) e.getTarget();
PageState pageState = e.getPageState();
String name = Web.getWebContext().getUser().getName();
label.setLabel("Author: (if not " + name + ")");
}
}
protected class IntendedAudienceSelectPrinter implements PrintListener {
public IntendedAudienceSelectPrinter() {
}
public void prepare(PrintEvent e) {
SingleSelect select = (SingleSelect) e.getTarget();
select.clearOptions();
select.addOption(new Option("workspace", Web.getWebContext().getApplication().
getParentApplication() == null ? Web.getWebContext().
getApplication().getDisplayName() : Web.getWebContext().
getApplication().getParentApplication().getDisplayName()
+ " members"));
select.addOption(new Option("internal", new Label(FILE_INTENDED_AUDIENCE_INTERNAL)));
select.addOption(new Option("public", new Label(FILE_INTENDED_AUDIENCE_PUBLIC)));
}
}
private ContentSection getContentSection() {
ContentSectionCollection csl = ContentSection.getAllSections();
csl.addEqualsFilter("label", DocMgr.getConfig().getContentSection());
if (!csl.next()) {
csl.close();
return null;
}
ContentSection docsContentSection = csl.getContentSection();
csl.close();
return docsContentSection;
}
}
class VersionUploadForm extends Form implements FormInitListener, FormProcessListener,
FormValidationListener {
private static final String VERSION_UPLOAD_FORM = "file-version";
private static final String VERSION_TRANSACTION_DESCRIPTION = "file-transaction-description";
private static final String VERSION_FILE_UPLOAD = "file-version-upload";
private FileUpload m_fileUpload;
private StringParameter m_versionDesc;
private RequestLocal m_fileData;
private Submit m_submit;
//This const allows for less than 4k bytes of 2byte unicode chars, plus
// a little wiggle room...
private int FOUR_K_CHAR_LIMIT = 1994;
public VersionUploadForm() {
super(VERSION_UPLOAD_FORM, new ColumnPanel(2));
setMethod(Form.POST);
setEncType("multipart/form-data");
// initialize the file
m_fileData = new RequestLocal() {
protected Object initialValue(PageState state) {
BigDecimal id = (BigDecimal) state.getValue(docIDParam);
return new Document(id);
}
};
m_fileUpload = new FileUpload(VERSION_FILE_UPLOAD);
m_versionDesc = new StringParameter(VERSION_TRANSACTION_DESCRIPTION);
add(new Label("Title"));//TODO
Label labelTitle = new Label();
labelTitle.addPrintListener(new PrintListener() {
public void prepare(PrintEvent e) {
PageState state = e.getPageState();
Label t = (Label) e.getTarget();
t.setLabel(getFile(state).getTitle());
}
});
add(labelTitle);
add(new Label(FILE_NAME));
Label label = new Label();
label.addPrintListener(new PrintListener() {
public void prepare(PrintEvent e) {
PageState state = e.getPageState();
Label t = (Label) e.getTarget();
t.setLabel(URLDecoder.decode(getFile(state).getName()));
}
});
add(label);
add(new Label(FILE_SOURCE));
add(m_fileUpload);
add(new Label(FILE_VERSION_DESCRIPTION));
TextArea fversionDesc = new TextArea(m_versionDesc);
fversionDesc.setRows(10);
fversionDesc.setCols(40);
add(fversionDesc);
m_submit = new Submit("file-version-save");
m_submit.setButtonLabel(FILE_SAVE);
add(new Label()); // spacer
SimpleContainer sc = new SimpleContainer();
sc.add(m_submit);
sc.add(new Submit(CANCEL));
add(sc, ColumnPanel.LEFT);
addInitListener(this);
addValidationListener(this);
addProcessListener(this);
}
private Document getFile(PageState s) {
return (Document) m_fileData.get(s);
}
public void init(FormSectionEvent e) {
PageState state = e.getPageState();
}
/**
* Receive uploaded file and reset file content, mime type, and description. Return to File
* properties screen.
*/
public void process(FormSectionEvent e) throws FormProcessException {
PageState state = e.getPageState();
if (m_submit.isSelected(state)) {
FormData data = e.getFormData();
MultipartHttpServletRequest req = (MultipartHttpServletRequest) state.getRequest();
String fpath = (String) data.get(VERSION_FILE_UPLOAD);
String fname = DMUtils.extractFileName(fpath, state);
Document doc = getFile(state);
java.io.File src = null;
try {
if (fpath != null && fpath.length() > 0) {
src = req.getFile(VERSION_FILE_UPLOAD);
}
// Try to update the file in the database
FileAsset fa = doc.getFile();
fa.loadFromFile(fname, src, "txt");
} catch (java.io.IOException ex) {
ex.printStackTrace();
throw new FormProcessException(ex);
}
// Annotate transaction description
String vdesc = (String) data.get(VERSION_TRANSACTION_DESCRIPTION);
//If version description string is over 4K in size, truncate...
if (vdesc.length() > FOUR_K_CHAR_LIMIT) {
vdesc = vdesc.substring(0, FOUR_K_CHAR_LIMIT);
}
Versions.tag(doc.getOID(), vdesc);
doc.setLastModifiedLocal(doc.getLastModifiedDate());
doc.save();
}
displayPropertiesPane(state);
}
/**
* Validate the length of name of the new file being uploaded. Validate if user tries to
* upload a file with a different Mime type than the original. This is not supported.
*
*/
public void validate(FormSectionEvent e) throws FormProcessException {
PageState state = e.getPageState();
if (!m_submit.isSelected(state)) {
return;
}
FormData data = e.getFormData();
String fpath = (String) data.get(VERSION_FILE_UPLOAD);
if (fpath == null || fpath.length() == 0) {
data.addError(VERSION_FILE_UPLOAD, "This parameter is required.");
}
String fname = DMUtils.extractFileName(fpath, state);
int nameLength = 500;
try {
nameLength = fname.getBytes("UTF-8").length;
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException("No UTF-8 support: " + uee);
}
// XXX Not localized as the other errors are.
if (nameLength > 200) {
data.addError(VERSION_FILE_UPLOAD,
"This filename is too long. It must be fewer than 200 characters.");
}
String desc = (String) data.get(VERSION_TRANSACTION_DESCRIPTION);
// trim it to really check it's not empty
if (desc != null) {
desc = desc.trim();
}
if (desc == null || desc.length() == 0) {
data.addError(VERSION_TRANSACTION_DESCRIPTION, "This parameter is required.");
}
//Default to more than required so that it will fail.
/*
* PageState state = e.getPageState(); FormData data =
* e.getFormData(); HttpServletRequest req = state.getRequest();
*
* String uploadedFileName = (String) data.get(VERSION_FILE_UPLOAD);
* String newType = File.guessContentType(uploadedFileName,req);
* String oldType = getFile(state).getContentType();
*
* if (!newType.equalsIgnoreCase(oldType)) {
* data.addError(VERSION_FILE_UPLOAD,
* DIFFERENT_MIMETYPE_ERROR.localize(req).toString()); }
*/
}
}
class FileSendColleaguePane extends SimpleContainer {
private Component m_sendForm;
private Component m_thankYou;
public FileSendColleaguePane() {
GridPanel spacer = new GridPanel(1);
spacer.add(new Label(" "));
add(spacer);
m_sendForm = new SendForm(this);
add(m_sendForm);
m_thankYou = buildThankYou();
add(m_thankYou);
}
public void initState(PageState ps) {
s_log.debug("FileSendColleaguePane.initState");
m_sendForm.setVisible(ps, true);
m_thankYou.setVisible(ps, false);
}
private Component buildThankYou() {
BoxPanel panel = new BoxPanel();
panel.add(FILE_SEND_COLLEAGUE_THANKS);
ActionLink backLink = new ActionLink(FILE_SEND_COLLEAGUE_THANKS_RETURN_LINK.localize().
toString());
backLink.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
PageState state = e.getPageState();
displayPropertiesPane(state);
}
});
panel.add(backLink);
return panel;
}
public void displayThankYou(PageState ps) {
s_log.debug("FileSendColleaguePane.displayThankYou");
m_thankYou.setVisible(ps, true);
}
}
class SendForm extends Form implements FormProcessListener {
private static final String EMAIL_PARAM_NAME = "scEmail";
private final TrimmedStringParameter m_emailParam = new TrimmedStringParameter(
EMAIL_PARAM_NAME);
private FileSendColleaguePane m_parent;
public SendForm(FileSendColleaguePane parent) {
super("sendEmail", new BoxPanel());
m_parent = parent;
GridPanel panel = new GridPanel(2);
panel.add(FILE_SEND_COLLEAGUE_FORM_EMAIL);
TextField emailField = new TextField(m_emailParam);
emailField.addValidationListener(new EmailValidationListener());
panel.add(emailField, GridPanel.LEFT);
panel.add(new Submit(FILE_SEND_COLLEAGUE_SUBMIT));
add(panel);
addProcessListener(this);
}
public void process(FormSectionEvent e) throws FormProcessException {
PageState state = e.getPageState();
FormData data = e.getFormData();
this.setVisible(state, false);
m_parent.displayThankYou(state);
// send the mail
User u = Web.getWebContext().getUser();
s_log.debug(FILE_SEND_COLLEAGUE_RETURN_ADDRESS.localize().toString());
Mail mail = new Mail((String) data.get(EMAIL_PARAM_NAME),
FILE_SEND_COLLEAGUE_RETURN_ADDRESS.localize().toString(),
FILE_SEND_COLLEAGUE_SUBJECT.localize().toString(),
FILE_SEND_COLLEAGUE_MESSAGE.localize().toString() + " " + u.
getName());
Document doc = new Document((BigDecimal) state.getValue(docIDParam));
try {
FileAsset fa = doc.getFile();
if (fa == null) {
return;
}
ByteArrayOutputStream assetStream = new ByteArrayOutputStream();
long readBytes = fa.writeBytes(assetStream);
if (readBytes == 0) {
return;
}
String mimeTypeString = "application/octet-stream";
MimeType mimeType = fa.getMimeType();
if (mimeType != null) {
mimeTypeString = mimeType.getMimeType();
}
s_log.debug("mimeTypeString: " + mimeTypeString);
mail.attach(assetStream.toByteArray(), mimeTypeString, doc.getTitle());
mail.send();
} catch (java.io.IOException iox) {
s_log.error("SendForm.process", iox);
// iox.printStackTrace();
throw new FormProcessException(GlobalizationUtil.globalize(
"ui.error.sending_document"));
} catch (javax.mail.MessagingException mex) {
s_log.error("SendForm.process", mex);
//mex.printStackTrace();
throw new FormProcessException(GlobalizationUtil.globalize(
"ui.error.sending_document"));
}
}
}
class FileActionPane extends ColumnPanel implements RequestListener {
private ActionLink m_newVersion;
private Link m_download;
private ActionLink m_email;
private ActionLink m_delete;
private ActionLink m_editLink;
private ActionLink m_fileRevisions;
public FileActionPane() {
super(1);
add(new BackCancelActionLink("back"));
m_editLink = new ActionLink(new Label(FILE_EDIT_LINK));
m_editLink.setClassAttr("actionLink");
m_editLink.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
PageState state = e.getPageState();
displayEditForm(state);
}
});
add(m_editLink);
m_fileRevisions = new ActionLink("file revisions");
m_fileRevisions.setClassAttr("actionLink");
m_fileRevisions.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
PageState state = e.getPageState();
m_parent.displayFileVersions(state, (BigDecimal) state.getValue(docIDParam));
}
});
add(m_fileRevisions);
m_newVersion = addActionLink(FILE_NEW_VERSION_LINK);
PrintListener printListener = new PrintListener() {
public void prepare(PrintEvent e) {
Link l = (Link) e.getTarget();
PageState state = e.getPageState();
Document f = new Document((BigDecimal) state.getValue(docIDParam));
l.setTarget("download/?" + FILE_ID_PARAM_NAME + "=" + f.getID());
}
};
m_download = new Link(new Label(FILE_DOWNLOAD_LINK), printListener);
m_download.setClassAttr("actionLink");
add(m_download);
m_email = addActionLink(FILE_SEND_COLLEAGUE_LINK);
m_delete = addActionLink(FILE_DELETE_LINK);
m_newVersion.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
displayUploadForm(e.getPageState());
}
});
m_email.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
displaySendColleagueForm(e.getPageState());
}
});
m_delete.addActionListener(new DeleteListener());
m_delete.setConfirmation(FILE_DELETE_CONFIRM.localize().toString());
}
public void register(Page p) {
super.register(p);
p.addRequestListener(this);
}
private ActionLink addActionLink(GlobalizedMessage msg) {
ActionLink ln = new ActionLink(new Label(msg));
ln.setClassAttr("actionLink");
this.add(ln);
return ln;
}
public void pageRequested(RequestEvent event) {
PageState state = event.getPageState();
s_log.debug("pageRequested");
if (!isVisible(state)) {
// no point in hiding links
return;
}
User user = Web.getWebContext().getUser();
Application app = Web.getWebContext().getApplication();
// Document doc = new Document((BigDecimal) state.getValue(docIDParam));
if (PermissionService.checkPermission(
new PermissionDescriptor(PrivilegeDescriptor.ADMIN, app, user))) {
return;
}
if (!PermissionService.checkPermission(
new PermissionDescriptor(PrivilegeDescriptor.EDIT, app, user))) {
m_editLink.setVisible(state, false);
m_delete.setVisible(state, false);
m_newVersion.setVisible(state, false);
}
}
}
/**
* Delete Listener of a file.
*/
private final class DeleteListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
PageState state = e.getPageState();
Document doc = new Document((BigDecimal) state.getValue(docIDParam));
ContentBundle cb = (ContentBundle) doc.getParent();
String parentFolderID = cb.getParent().getID().toString();
cb.delete();
try {
String appURI = getRedirectURI(state);
DispatcherHelper.sendRedirect(state.getRequest(), state.getResponse(), appURI + "?"
+ SEL_FOLDER_ID_PARAM.
getName() + "="
+ parentFolderID);
} catch (IOException iox) {
throw new UncheckedWrapperException(iox);
}
}
private String getRedirectURI(PageState state) {
String appURI = state.getRequestURI();
s_log.debug("Original app URI: " + appURI);
int idx = appURI.indexOf("/file/");
if (idx > -1) {
appURI = appURI.substring(0, idx);
}
final String servletPath = Web.getConfig().getDispatcherServletPath();
if (appURI.startsWith(servletPath)) {
appURI = appURI.substring(servletPath.length());
}
s_log.debug("New URI: " + appURI);
return appURI;
}
}
}