448 lines
15 KiB
Java
Executable File
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()));
|
|
}
|
|
}
|
|
|
|
}
|