libreccm-legacy/ccm-cms/src/com/arsdigita/cms/ui/FileUploadSection.java

448 lines
15 KiB
Java
Executable File

/*
* Copyright (C) 2001-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.cms.ui;
import com.arsdigita.bebop.ColumnPanel;
import com.arsdigita.bebop.Container;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.FormSection;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.form.FileUpload;
import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.OptionGroup;
import com.arsdigita.bebop.form.SingleSelect;
import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.globalization.GlobalizedMessage; // this can be removed when the deprecated messages are removed.
import com.arsdigita.dispatcher.MultipartHttpServletRequest;
import com.arsdigita.mimetypes.MimeType;
import com.arsdigita.mimetypes.MimeTypeCollection;
import java.io.File;
/**
* A form section with two widgets: a mime-type selection widget
* and a file upload widget. The section will attempt to automatically
* guess the mime type from the filename (if necessary), and
* return the mime type.
*
* @author Stanislav Freidin (sfreidin@arsdigita.com)
* @version $Id: FileUploadSection.java 1940 2009-05-29 07:15:05Z terry $
*/
public class FileUploadSection extends FormSection {
private SingleSelect m_mimeWidget;
private FileUpload m_fileWidget;
private String m_mimePrefix;
private String m_defaultMimeType;
private String m_parameterPrefix;
/**
* The mime type widget
*/
public static final String MIME_TYPE = "mime_type";
/**
* The file upload widget
*/
public static final String FILE_UPLOAD = "file_upload";
/**
* Automatically guess the mime type
*/
public static final String GUESS_MIME = "-guess-";
/**
* Construct a new FileUploadSection
*
* @param mimeLabel The label for the mime type widget
*
* @param mimePrefix Populate the mime type widget with all
* mime types that match the prefix. Some of the possible
* prefixes are "text", "image", "binary", etc.
*
* @param defaultMimeType The default mime type that should be
* assumed if the guessing fails
*
* @param panel The panel that is to be used to lay out the
* components
*
*/
public FileUploadSection(
GlobalizedMessage mimeLabel, String mimePrefix, String defaultMimeType, Container panel
) {
this(mimeLabel, mimePrefix, defaultMimeType, "", panel);
}
/**
* Construct a new FileUploadSection
*
* @param mimeLabel The label for the mime type widget
*
* @param mimePrefix Populate the mime type widget with all
* mime types that match the prefix. Some of the possible
* prefixes are "text", "image", "binary", etc.
*
* @param defaultMimeType The default mime type that should be
* assumed if the guessing fails
*
* @param panel The panel that is to be used to lay out the
* components
*
* @deprecated use the same constructor but with the GlobalizedMessage
* for the mimeLabel
*/
public FileUploadSection(String mimeLabel, String mimePrefix, String defaultMimeType, Container panel) {
// This takes advantage of the fact that the "key" is returned
// when it is not present in the message bundle
this(new GlobalizedMessage(mimeLabel), mimePrefix, defaultMimeType, panel);
}
/**
* Construct a new FileUploadSection
*
* @param mimeLabel The label for the mime type widget
*
* @param mimePrefix Populate the mime type widget with all
* mime types that match the prefix. Some of the possible
* prefixes are "text", "image", "binary", etc.
*
* @param defaultMimeType The default mime type that should be
* assumed if the guessing fails
*
* @param parameterPrefix Prepended to MIME_TYPE and FILE_UPLOAD for
* parameter names so that more than 1 file upload widgets may be
* used per form
*
* @param panel The panel that is to be used to lay out the
* components
*
* @deprecated use the same constructor but with the GlobalizedMessage
* for the mimeLabel
*/
public FileUploadSection(
String mimeLabel,
String mimePrefix,
String defaultMimeType,
String parameterPrefix,
Container panel
) {
// This takes advantage of the fact that the "key" is returned
// when it is not present in the message bundle
this(new GlobalizedMessage(mimeLabel), mimePrefix,
defaultMimeType, parameterPrefix, panel);
}
/**
* Construct a new FileUploadSection
*
* @param mimeLabel The label for the mime type widget
*
* @param mimePrefix Populate the mime type widget with all
* mime types that match the prefix. Some of the possible
* prefixes are "text", "image", "binary", etc.
*
* @param defaultMimeType The default mime type that should be
* assumed if the guessing fails
*
* @param parameterPrefix Prepended to MIME_TYPE and FILE_UPLOAD for
* parameter names so that more than 1 file upload widgets may be
* used per form
*
* @param panel The panel that is to be used to lay out the
* components
*
*/
public FileUploadSection(GlobalizedMessage mimeLabel,
String mimePrefix,
String defaultMimeType,
String parameterPrefix,
Container panel) {
super(panel);
m_mimePrefix = mimePrefix;
m_defaultMimeType = defaultMimeType;
if (parameterPrefix != null) {
m_parameterPrefix = parameterPrefix;
} else {
m_parameterPrefix = "";
}
add(new Label(mimeLabel, false));
m_mimeWidget = new SingleSelect(getMimeTypeWidgetName());
addMimeOptions(m_mimeWidget, mimePrefix);
m_mimeWidget.addOption(new
Option(GUESS_MIME,
new Label(GlobalizationUtil.globalize(
"cms.ui.authoring.file_upload.auto_detect"))));
m_mimeWidget.setDefaultValue(GUESS_MIME);
add(m_mimeWidget);
add(new Label(GlobalizationUtil.globalize("cms.ui.upload_new_content")));
m_fileWidget = new FileUpload(getFileUploadWidgetName());
add(m_fileWidget);
}
/**
* Construct a new FileUploadSection
*
* @param mimeLabel The label for the mime type widget
*
* @param mimePrefix Populate the mime type widget with all
* mime types that match the prefix. Some of the possible
* prefixes are "text", "image", "binary", etc.
*
* @param defaultMimeType The default mime type that should be
* assumed if the guessing fails
*
* @param parameterPrefix Prepended to MIME_TYPE and FILE_UPLOAD for
* parameter names so that more than 1 file upload widgets may be
* used per form
*
*/
public FileUploadSection (GlobalizedMessage mimeLabel,
String mimePrefix,
String defaultMimeType,
String parameterPrefix) {
this(mimeLabel,
mimePrefix,
defaultMimeType,
parameterPrefix,
new ColumnPanel(2, true));
ColumnPanel panel = (ColumnPanel)getPanel();
panel.setBorder(false);
panel.setPadColor("#FFFFFF");
}
/**
* Construct a new FileUploadSection
*
* @param mimeLabel The label for the mime type widget
*
* @param mimePrefix Populate the mime type widget with all
* mime types that match the prefix. Some of the possible
* prefixes are "text", "image", "binary", etc.
*
* @param defaultMimeType The default mime type that should be
* assumed if the guessing fails
*
* @param parameterPrefix Prepended to MIME_TYPE and FILE_UPLOAD for
* parameter names so that more than 1 file upload widgets may be
* used per form
*
* @deprecated use the same constructor but with the GlobalizedMessage
* for the mimeLabel
*/
public FileUploadSection (
String mimeLabel,
String mimePrefix,
String defaultMimeType,
String parameterPrefix
) {
// This takes advantage of the fact that the "key" is returned
// when it is not present in the message bundle
this(new GlobalizedMessage(mimeLabel),
mimePrefix,
defaultMimeType,
parameterPrefix);
}
/**
* Construct a new FileUploadSection
*
* @param mimeLabel The label for the mime type widget
*
* @param mimePrefix Populate the mime type widget with all
* mime types that match the prefix. Some of the possible
* prefixes are "text", "image", "binary", etc.
*
* @param defaultMimeType The default mime type that should be
* assumed if the guessing fails
*
* @deprecated use the same constructor but with the GlobalizedMessage
* for the mimeLabel
*/
public FileUploadSection(
String mimeLabel, String mimePrefix, String defaultMimeType
) {
// This takes advantage of the fact that the "key" is returned
// when it is not present in the message bundle
this(new GlobalizedMessage(mimeLabel), mimePrefix, defaultMimeType, "");
}
/**
* Construct a new FileUploadSection
*
* @param mimeLabel The GlobalizedMessage for the label for the mime
* type widget
*
* @param mimePrefix Populate the mime type widget with all
* mime types that match the prefix. Some of the possible
* prefixes are "text", "image", "binary", etc.
*
* @param defaultMimeType The default mime type that should be
* assumed if the guessing fails
*
*/
public FileUploadSection(GlobalizedMessage mimeLabel,
String mimePrefix,
String defaultMimeType) {
this(mimeLabel, mimePrefix, defaultMimeType, "");
}
/**
* Try to guess the mime type from the filename, and return
* it. The parent form should call this method in its process
* listener. Note that this method may return null if the mime
* type could not be guessed.
*
* @param e The form section event
*/
public MimeType getMimeType(FormSectionEvent e) {
FormData data = e.getFormData();
String fileName = (String)data.get(getFileUploadWidgetName());
String mimeTypeName = (String)data.get(getMimeTypeWidgetName());
MimeType mimeType = null;
// Guess the mime type from the filename
if(fileName != null) {
if(GUESS_MIME.equals(mimeTypeName)) {
// Guess the mime type from the file extension
mimeType = MimeType.guessMimeTypeFromFile(fileName);
} else {
mimeType = MimeType.loadMimeType(mimeTypeName);
}
}
// Failed to guess it, failed to load it, fall back on the default
if(mimeType == null) {
mimeType = MimeType.loadMimeType(m_defaultMimeType);
}
return mimeType;
}
/**
* Obtain a File object from the file upload widget. The containing form
* should call this method in its process listener.
*
* @param e The form section event
*/
public File getFile(FormSectionEvent e) {
FormData data = e.getFormData();
String fileName = getFileName(e);
if(fileName != null && fileName.length() > 0) {
return ((MultipartHttpServletRequest)e.getPageState().getRequest())
.getFile(getFileUploadWidgetName());
}
return null;
}
/**
* Obtain a filename from the file upload widget. The containing form
* should call this method in its process listener.
*
* @param e The form section event
*/
public String getFileName(FormSectionEvent e) {
FormData data = e.getFormData();
return (String)data.get(getFileUploadWidgetName());
}
/**
* Set the value for the mime type widget. The containing form should
* call this method in its init listener
*
* @param e The form section event
* @param mimeType The mime type to set, such as "textr/html" or "img/jpeg"
*
*/
public void setMimeType(FormSectionEvent e, String mimeType) {
FormData data = e.getFormData();
data.put(getMimeTypeWidgetName(), mimeType);
}
/**
* @return the mime type widget
*/
public SingleSelect getMimeTypeWidget() {
return m_mimeWidget;
}
/**
* @return the file upload widget
*/
public FileUpload getFileUploadWidget() {
return m_fileWidget;
}
/**
* @return the parameter name prefix
*/
public String getParameterPrefix() {
return m_parameterPrefix;
}
/**
* @return the file upload parameter name
*/
public String getFileUploadWidgetName() {
return m_parameterPrefix + FILE_UPLOAD;
}
/**
* @return the mime typeparameter name
*/
public String getMimeTypeWidgetName() {
return m_parameterPrefix + MIME_TYPE;
}
/**
* Add mime-type options to the option group by loading all mime
* types which match a certain prefix from the database
*
* @param w The mime type widget to which options should be added
*
* @param mimePrefix Populate the mime type widget with all
* mime types that match the prefix. Some of the possible
* prefixes are "text", "image", "binary", etc.
*
*/
public static void addMimeOptions(OptionGroup w, String mimePrefix) {
MimeTypeCollection types;
if (mimePrefix == null || mimePrefix.equals("")) {
types = MimeType.getAllMimeTypes();
} else {
types = MimeType.searchMimeTypes(mimePrefix + "/");
}
while(types.next()) {
MimeType type = types.getMimeType();
w.addOption(new Option(type.getMimeType(), type.getLabel()));
}
}
}