Files
alfresco-community-repo/source/java/org/alfresco/web/bean/content/AddContentDialog.java
Derek Hulley 6c3b7b8cd6 Merged V3.2 to HEAD
15897: Merged V3.1 to V3.2
      14485: (RECORD ONLY) ETHREEOH-1937
      14915: (RECORD ONLY) Fix for ETHREEOH-2011: chaining-authentication-context.xml.sample
      14954: (RECORD ONLY) Fix merge error
      14966: (RECORD ONLY) Merged V2.2 to V3.1
         14131: *RECORD ONLY*
         14605: Merged HEAD to V2.2 (workaround for ETWOTWO-1137)
            14368: Fix for ETHREEOH-1936
         14607: Fixed NPE in TextMiningContentTransformer: Lead-up to fix for ETWOTWO-1174
      14992: (RECORD ONLY) Updated svn:mergeinfo for V2.1-A
      15080: Applied suggested fix for ETHREEOH-2252: Emailed content created in wrong space
      15131: Merged V2.1-A to V3.1 (ETHREEOH-2270)
         13465: Fix for ADB-161 ACT 7870 - added 'xsd' to mimetype map.
      15134: Merged V2.2 to V3.1
         14332: (RECORD-ONLY)
         14717: (RECORD-ONLY)
         14745: (RECORD-ONLY)
         14746: Fixed error relating to detection and clean-up of duplicate child associations
         14759: Missed check-in: Set transactionService for post-transaction duplicate child assoc cleanup
         14761: (RECORD-ONLY)
         14885: (RECORD-ONLY)
         14893: (RECORD-ONLY)
         14903: (RECORD-ONLY)
      15204: Fixed ETHREEOH-2303: FixNameCrcValuesPatch throws ConstraintViolationException during upgrade ...
      15214: Fixed ETHREEOH-1861: Offline synchronization updates file content without any changes
      15271: Applied patch fix: Imported users don't conform to case-sensitivity switch
      15352: ETHREEOH-2322
      15361: ETHREEOH-1112
      15369: ETHREEOH-2448
      15419: ETHREEOH-2479
      15431: ETHREEOH-2520 and ETHREEOH-2521
      15587: (RECORD ONLY) Moved Enterprise-only scripts to correct location
      15616: Fix ETHREEOH-2581 - WCM layered folder - can't submit deleted file
      15675: WCM fixes (ETHREEOH-2110 & ETHREEOH-2645)
      15836: Check for null username in ContentUsage service getUserUsage() method
      15840: (RECORD ONLY) Merged V3.2 to V3.1
         14760: Fix for ALFCOM-586 - trims and ignores leading/trailing whitespace before validation in JSF client forms.
      15841: Fixes for ETHREEOH-2702 and ETHREEOH-2687
      15860: (RECORD ONLY) Added Oracle and MS SQL Server config
      15891: Removed unused compiler directive
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /alfresco/BRANCHES/DEV/BELARUS/ETHREEOH-2221:r14753
   Merged /alfresco/BRANCHES/V2.1-A: lots
   Merged /alfresco/BRANCHES/V2.2:r14131,14332,14605,14607,14717,14745-14746,14759,14761,14885,14893,14903
   Merged /alfresco/BRANCHES/V3.1:r14485,14915,14954,14966,14992,15080,15131,15134,15204,15214,15271,15352,15361,15369,15419,15431,15587,15616,15675,15818,15836,15840-15841,15860,15891
   Merged /alfresco/BRANCHES/V3.2:r15897


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@16886 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2009-10-13 20:08:41 +00:00

339 lines
11 KiB
Java

/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program 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 General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.web.bean.content;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.alfresco.config.Config;
import org.alfresco.config.ConfigElement;
import org.alfresco.config.ConfigService;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.filestore.FileContentReader;
import org.alfresco.service.cmr.model.FileExistsException;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
import org.alfresco.service.namespace.QName;
import org.alfresco.web.app.Application;
import org.alfresco.web.bean.FileUploadBean;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.bean.repository.Repository;
import org.alfresco.web.ui.common.Utils;
/**
* Bean implementation for the "Add Content" dialog
*
* @author gavinc
*/
public class AddContentDialog extends BaseContentWizard
{
private final static String MSG_OK = "ok";
private static final long serialVersionUID = 3593557546118692687L;
protected List<String> inlineEditableMimeTypes;
protected File file;
// ------------------------------------------------------------------------------
// Dialog implementation
@Override
protected String finishImpl(FacesContext context, String outcome)
throws Exception
{
// Try and extract metadata from the file
ContentReader cr = new FileContentReader(this.file);
cr.setMimetype(this.mimeType);
cr.setEncoding(this.encoding);
// create properties for content type
Map<QName, Serializable> contentProps = new HashMap<QName, Serializable>(5, 1.0f);
if (Repository.extractMetadata(FacesContext.getCurrentInstance(), cr, contentProps))
{
this.author = (String)(contentProps.get(ContentModel.PROP_AUTHOR));
this.title = DefaultTypeConverter.INSTANCE.convert(String.class, contentProps.get(ContentModel.PROP_TITLE));
this.description = DefaultTypeConverter.INSTANCE.convert(String.class, contentProps.get(ContentModel.PROP_DESCRIPTION));
}
// default the title to the file name if not set
if (this.title == null)
{
this.title = this.fileName;
}
// determine whether inline editing should be enabled by default.
// if the mime type of the added file is in the list of mime types
// configured in "Content Wizards" then enable inline editing
List<String> mimeTypes = getInlineEditableMimeTypes();
if (mimeTypes.contains(this.mimeType))
{
this.inlineEdit = true;
}
saveContent(this.file, null);
// return default outcome
return outcome;
}
@Override
public void init(Map<String, String> parameters)
{
super.init(parameters);
clearUpload();
}
@Override
protected String doPostCommitProcessing(FacesContext context, String outcome)
{
clearUpload();
// as we were successful, go to the set properties dialog if asked
// to otherwise just return
if (this.showOtherProperties)
{
// we are going to immediately edit the properties so we need
// to setup the BrowseBean context appropriately
this.browseBean.setDocument(new Node(this.createdNode));
return "dialog:setContentProperties";
}
else
{
return outcome;
}
}
@Override
protected String getDefaultFinishOutcome()
{
// as we are using this dialog outside the dialog framework
// just go back to the main page
return "dialog:close:browse";
}
// ------------------------------------------------------------------------------
// Bean getters and setters
/**
* @return Returns the message to display when a file has been uploaded
*/
public String getFileUploadSuccessMsg()
{
// NOTE: This is a far from ideal solution but will do until we have
// a pure JSF upload solution working. This method is only called
// after a file is uploaded, so we can calculate the mime type and
// determine whether to enable inline editing in here.
FacesContext fc = FacesContext.getCurrentInstance();
this.mimeType = Repository.getMimeTypeForFileName(fc, this.fileName);
this.encoding = "UTF-8";
InputStream is = null;
try
{
if (this.file != null)
{
is = new BufferedInputStream(new FileInputStream(this.file));
this.encoding = Repository.guessEncoding(fc, is, this.mimeType);
}
}
catch (Throwable e)
{
// Not terminal
logger.error("Failed to get encoding from file: " + this.fileName, e);
}
finally
{
try { is.close(); } catch (Throwable e) {} // Includes NPE
}
this.inlineEdit = (this.mimeType.equals(MimetypeMap.MIMETYPE_HTML));
// get the file upload message
String msg = Application.getMessage(FacesContext.getCurrentInstance(), "file_upload_success");
return MessageFormat.format(msg, new Object[] {Utils.encode(getFileName())});
}
/**
* @return Returns the name of the file
*/
public String getFileName()
{
// try and retrieve the file and filename from the file upload bean
// representing the file we previously uploaded.
FacesContext ctx = FacesContext.getCurrentInstance();
FileUploadBean fileBean = (FileUploadBean)ctx.getExternalContext().getSessionMap().
get(FileUploadBean.FILE_UPLOAD_BEAN_NAME);
if (fileBean != null)
{
this.file = fileBean.getFile();
this.fileName = fileBean.getFileName();
}
return this.fileName;
}
/**
* @param fileName The name of the file
*/
public void setFileName(String fileName)
{
this.fileName = fileName;
// we also need to keep the file upload bean in sync
FacesContext ctx = FacesContext.getCurrentInstance();
FileUploadBean fileBean = (FileUploadBean)ctx.getExternalContext().getSessionMap().
get(FileUploadBean.FILE_UPLOAD_BEAN_NAME);
if (fileBean != null)
{
fileBean.setFileName(this.fileName);
}
}
// ------------------------------------------------------------------------------
// Action event handlers
/**
* Action listener called when the add content dialog is called
*/
public void start(ActionEvent event)
{
// NOTE: this is a temporary solution to allow us to use the new dialog
// framework beans outside of the dialog framework, we need to do
// this because the uploading requires a separate non-JSF form, this
// approach can not be used in the current dialog framework. Until
// we have a pure JSF upload solution we need this initialisation
init(null);
}
/**
* Action handler called when the user wishes to remove an uploaded file
*/
public String removeUploadedFile()
{
clearUpload();
// also clear the file name
this.fileName = null;
// refresh the current page
return null;
}
/**
* Action handler called when the dialog is cancelled
*/
public String cancel()
{
clearUpload();
return "dialog:close";
}
// ------------------------------------------------------------------------------
// Helper Methods
/**
* Deletes the uploaded file and removes the FileUploadBean from the session
*/
protected void clearUpload()
{
// delete the temporary file we uploaded earlier
if (this.file != null)
{
this.file.delete();
}
this.file = null;
// remove the file upload bean from the session
FacesContext ctx = FacesContext.getCurrentInstance();
ctx.getExternalContext().getSessionMap().remove(FileUploadBean.FILE_UPLOAD_BEAN_NAME);
}
protected List<String> getInlineEditableMimeTypes()
{
if ((this.inlineEditableMimeTypes == null) || (Application.isDynamicConfig(FacesContext.getCurrentInstance())))
{
this.inlineEditableMimeTypes = new ArrayList<String>(8);
// get the create mime types list from the config
ConfigService svc = Application.getConfigService(FacesContext.getCurrentInstance());
Config wizardCfg = svc.getConfig("Content Wizards");
if (wizardCfg != null)
{
ConfigElement typesCfg = wizardCfg.getConfigElement("create-mime-types");
if (typesCfg != null)
{
for (ConfigElement child : typesCfg.getChildren())
{
String currentMimeType = child.getAttribute("name");
this.inlineEditableMimeTypes.add(currentMimeType);
}
}
}
}
return this.inlineEditableMimeTypes;
}
@Override
public String getFinishButtonLabel()
{
return Application.getMessage(FacesContext.getCurrentInstance(), MSG_OK);
}
@Override
protected String formatErrorMessage(Throwable exception)
{
if (exception instanceof FileExistsException)
{
return MessageFormat.format(Application.getMessage(
FacesContext.getCurrentInstance(), Repository.ERROR_EXISTS),
((FileExistsException)exception).getName());
}
else
{
return MessageFormat.format(Application.getMessage(
FacesContext.getCurrentInstance(), "error_content"),
exception.getMessage());
}
}
}