2013-02-06 15:40:17 +01:00
/ * *
2016-02-24 11:00:19 +01:00
*
2013-02-06 15:40:17 +01:00
* /
package org.gcube.portlets.user.workspace.server ;
2019-09-13 16:48:26 +02:00
import java.io.ByteArrayInputStream ;
import java.io.File ;
2013-02-06 15:40:17 +01:00
import java.io.IOException ;
2013-05-23 19:02:48 +02:00
import java.io.InputStream ;
2013-02-06 15:40:17 +01:00
import java.io.OutputStream ;
import java.io.StringReader ;
2019-09-13 16:48:26 +02:00
import java.nio.file.Files ;
2019-04-04 15:28:47 +02:00
import java.util.List ;
2013-02-06 15:40:17 +01:00
import javax.servlet.ServletException ;
import javax.servlet.http.HttpServlet ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
2013-07-23 14:24:17 +02:00
import org.apache.commons.io.FilenameUtils ;
2013-02-06 15:40:17 +01:00
import org.apache.commons.io.IOUtils ;
2017-01-20 12:45:38 +01:00
import org.gcube.common.portal.PortalContext ;
2018-11-28 16:50:18 +01:00
import org.gcube.common.storagehubwrapper.server.StorageHubWrapper ;
import org.gcube.common.storagehubwrapper.server.tohl.Workspace ;
import org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder ;
import org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem ;
import org.gcube.common.storagehubwrapper.shared.tohl.items.FileItem ;
import org.gcube.common.storagehubwrapper.shared.tohl.items.ImageFileItem ;
import org.gcube.common.storagehubwrapper.shared.tohl.items.ItemStreamDescriptor ;
import org.gcube.common.storagehubwrapper.shared.tohl.items.PDFFileItem ;
import org.gcube.common.storagehubwrapper.shared.tohl.items.URLFileItem ;
2019-09-13 16:48:26 +02:00
import org.gcube.common.storagehubwrapper.shared.tohl.items.URLItem ;
2013-06-25 15:33:03 +02:00
import org.gcube.portlets.user.workspace.client.ConstantsExplorer ;
2013-06-26 15:55:55 +02:00
import org.gcube.portlets.user.workspace.server.property.PortalUrlGroupGatewayProperty ;
2019-04-04 15:28:47 +02:00
import org.gcube.portlets.user.workspace.server.util.AllowedMimeTypeToInline ;
2019-07-08 11:16:27 +02:00
import org.gcube.portlets.user.workspace.server.util.MimeTypeUtility ;
2013-06-13 18:44:46 +02:00
import org.gcube.portlets.user.workspace.server.util.WsUtil ;
2013-06-25 15:33:03 +02:00
import org.gcube.portlets.user.workspace.shared.HandlerResultMessage ;
2014-01-13 11:54:11 +01:00
import org.gcube.portlets.user.workspace.shared.SessionExpiredException ;
2017-01-20 12:45:38 +01:00
import org.gcube.vomanagement.usermanagement.model.GCubeUser ;
2019-09-13 16:48:26 +02:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2013-02-06 15:40:17 +01:00
2016-12-21 14:55:54 +01:00
2018-11-28 16:50:18 +01:00
2013-02-06 15:40:17 +01:00
/ * *
2016-12-21 14:55:54 +01:00
* The Class DownloadServlet .
*
2019-02-22 14:40:20 +01:00
* @author Francesco Mangiacrapa francesco . mangiacrapa { @literal @ } isti . cnr . it
2018-11-28 16:50:18 +01:00
* Oct 18 , 2018
2013-02-06 15:40:17 +01:00
* /
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = - 8423345575690165644L ;
2019-09-13 16:48:26 +02:00
protected static Logger logger = LoggerFactory . getLogger ( DownloadServlet . class ) ;
2013-02-06 15:40:17 +01:00
/ * *
* { @inheritDoc }
* /
@Override
public void init ( ) throws ServletException {
super . init ( ) ;
2013-06-25 15:33:03 +02:00
logger . trace ( " Workspace DownloadServlet ready. " ) ;
2013-02-06 15:40:17 +01:00
}
2016-12-21 14:55:54 +01:00
/ * ( non - Javadoc )
* @see javax . servlet . http . HttpServlet # doGet ( javax . servlet . http . HttpServletRequest , javax . servlet . http . HttpServletResponse )
* /
2013-02-06 15:40:17 +01:00
public void doGet ( HttpServletRequest req , HttpServletResponse resp ) throws IOException {
String itemId = req . getParameter ( " id " ) ;
2016-02-24 11:00:19 +01:00
boolean viewContent = req . getParameter ( " viewContent " ) = = null ? false : req . getParameter ( " viewContent " ) . equals ( " true " ) ;
boolean isValidItem = req . getParameter ( ConstantsExplorer . VALIDATEITEM ) = = null ? false : req . getParameter ( ConstantsExplorer . VALIDATEITEM ) . equals ( " true " ) ;
boolean urlRedirectOnError = req . getParameter ( ConstantsExplorer . REDIRECTONERROR ) = = null ? false : req . getParameter ( ConstantsExplorer . REDIRECTONERROR ) . equals ( " true " ) ;
2016-12-21 14:55:54 +01:00
String contextID = req . getParameter ( ConstantsExplorer . CURRENT_CONTEXT_ID ) ;
2017-02-20 14:57:07 +01:00
String versionID = req . getParameter ( ConstantsExplorer . FILE_VERSION_ID ) ;
2017-02-21 18:24:44 +01:00
logger . info ( " Download Params " +
2017-02-20 14:57:07 +01:00
" [id: " + itemId + " , " +
" viewContent: " + viewContent + " , " +
ConstantsExplorer . VALIDATEITEM + " : " + isValidItem + " , " +
" urlRedirectOnError: " + urlRedirectOnError + " , " +
" contextID: " + contextID + " , " +
2017-02-21 18:24:44 +01:00
" versionID: " + versionID + " ] " ) ;
2015-07-03 11:23:37 +02:00
2013-06-25 15:33:03 +02:00
if ( itemId = = null | | itemId . isEmpty ( ) ) {
sendError ( resp , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Item id is null " ) ;
return ;
}
2016-02-24 11:00:19 +01:00
2017-02-21 18:24:44 +01:00
logger . debug ( " DOWNLOAD REQUEST FOR ITEM ID: " + itemId ) ;
2018-11-28 16:50:18 +01:00
//Workspace wa = null;
StorageHubWrapper storageHubWrapper = null ;
2013-02-06 15:40:17 +01:00
try {
2014-01-13 11:54:11 +01:00
2017-01-20 12:45:38 +01:00
if ( WsUtil . isSessionExpired ( req ) )
throw new SessionExpiredException ( ) ;
GCubeUser gcubeUser = PortalContext . getConfiguration ( ) . getCurrentUser ( req ) ;
2018-11-28 16:50:18 +01:00
storageHubWrapper = WsUtil . getStorageHubWrapper ( req , contextID , gcubeUser ) ;
//wa = WsUtil.getWorkspace(req, contextID, gcubeUser);
2013-02-06 15:40:17 +01:00
} catch ( Exception e ) {
2016-02-24 11:00:19 +01:00
2014-01-13 15:52:52 +01:00
if ( e instanceof SessionExpiredException ) {
sendErrorForStatus ( resp , HttpServletResponse . SC_UNAUTHORIZED + " : Session expired " , HttpServletResponse . SC_UNAUTHORIZED ) ;
return ;
}
2016-02-24 11:00:19 +01:00
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during workspace retrieving " ) ;
2013-02-06 15:40:17 +01:00
return ;
}
2018-11-28 16:50:18 +01:00
if ( storageHubWrapper = = null | | storageHubWrapper . getWorkspace ( ) = = null ) {
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error, no workspace in session " ) ;
2013-02-06 15:40:17 +01:00
return ;
}
2018-11-28 16:50:18 +01:00
WorkspaceItem item = null ;
Workspace wa = storageHubWrapper . getWorkspace ( ) ;
2013-02-06 15:40:17 +01:00
try {
2016-02-24 11:00:19 +01:00
2013-06-25 15:33:03 +02:00
item = wa . getItem ( itemId ) ;
2013-06-26 15:55:55 +02:00
if ( isValidItem ) { //ADDED 25/06/2013 - THIS CODE RETURN A SC_ACCEPT IS ITEM EXIST
2013-06-25 15:33:03 +02:00
String message = HttpServletResponse . SC_ACCEPTED + " : The resource is available " ;
2013-06-25 18:26:25 +02:00
sendMessageResourceAvailable ( resp , message ) ;
2013-06-25 15:33:03 +02:00
logger . trace ( " response return: " + message ) ;
return ;
}
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
} catch ( Exception e ) {
2013-02-06 15:40:17 +01:00
logger . error ( " Requested item " + itemId + " not found " , e ) ;
2013-06-26 15:55:55 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : The file has been deleted by another user. " ) ;
2013-02-06 15:40:17 +01:00
return ;
}
switch ( item . getType ( ) ) {
2019-09-13 16:48:26 +02:00
case URL_ITEM : {
try {
logger . info ( " Downloading " + item . getType ( ) ) ;
String urlValue = " URL not found " ;
if ( item instanceof URLItem ) {
URLItem theURL = ( URLItem ) item ;
urlValue = theURL . getValue ( ) = = null ? " URL not found " : theURL . getValue ( ) . toString ( ) ;
}
StringBuilder build = new StringBuilder ( ) ;
build . append ( " #URL downloaded from D4Science, source filename: " + item . getName ( ) ) ;
build . append ( " \ n " ) ;
build . append ( urlValue ) ;
String fileContent = build . toString ( ) ;
logger . info ( " Writing file content: \ n " + fileContent ) ;
ByteArrayInputStream is = new ByteArrayInputStream ( fileContent . getBytes ( ) ) ;
String contentDisposition = viewContent ? " inline " : " attachment " ;
String urlMimeType = " text/uri-list " ;
2022-09-14 14:58:01 +02:00
String itemName = MimeTypeUtility . getNameWithExtension ( item . getName ( ) , urlMimeType , false ) ;
2019-09-13 16:48:26 +02:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( urlMimeType ) ;
OutputStream out = resp . getOutputStream ( ) ;
IOUtils . copy ( is , out ) ;
is . close ( ) ;
out . close ( ) ;
return ;
} catch ( Exception e ) {
logger . error ( " Error during downloading the item " + itemId , e ) ;
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during data downloading: " + e . getMessage ( ) ) ;
return ;
}
}
2018-11-28 16:50:18 +01:00
case FOLDER :
2013-06-12 18:37:12 +02:00
case SHARED_FOLDER :
2018-11-28 16:50:18 +01:00
case VRE_FOLDER :
2019-09-13 16:48:26 +02:00
case SMART_FOLDER : {
2018-11-28 16:50:18 +01:00
WorkspaceFolder workspaceFolder = ( WorkspaceFolder ) item ;
ItemStreamDescriptor descr ;
2013-02-06 15:40:17 +01:00
try {
2018-11-28 16:50:18 +01:00
descr = wa . downloadFolder ( workspaceFolder . getId ( ) , workspaceFolder . getName ( ) , null ) ;
}
catch ( Exception e ) {
logger . error ( " Error on downloading the folder with id " + itemId , e ) ;
String error = e . getMessage ( ) ! = null ? e . getMessage ( ) : " The folder is not available for downloading " ;
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : " + error ) ;
return ;
}
try {
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
logger . info ( " Downloading the folder: " + workspaceFolder ) ;
String contentDisposition = viewContent ? " inline " : " attachment " ;
String mimeType = " application/zip " ;
2022-09-14 14:58:01 +02:00
String itemName = MimeTypeUtility . getNameWithExtension ( item . getName ( ) , mimeType , true ) ;
2018-11-28 16:50:18 +01:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( mimeType ) ;
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
OutputStream out = resp . getOutputStream ( ) ;
InputStream is = descr . getStream ( ) ;
2019-09-13 16:48:26 +02:00
IOUtils . copy ( is , out ) ;
2018-11-28 16:50:18 +01:00
is . close ( ) ;
2013-02-06 15:40:17 +01:00
out . close ( ) ;
return ;
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2018-11-28 16:50:18 +01:00
logger . error ( " Error during item downloading " + itemId , e ) ;
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during folder data retrieving: " + e . getMessage ( ) ) ;
2013-02-06 15:40:17 +01:00
return ;
}
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
}
case FILE_ITEM : {
2013-02-06 15:40:17 +01:00
2018-11-28 16:50:18 +01:00
FileItem workspaceFileItem = ( FileItem ) item ;
ItemStreamDescriptor descr ;
try {
logger . info ( " Downloading the file id: " + workspaceFileItem . getId ( ) + " with name: " + workspaceFileItem . getName ( ) + " and versionID: " + versionID ) ;
descr = wa . downloadFile ( workspaceFileItem . getId ( ) , workspaceFileItem . getName ( ) , versionID , null ) ;
}
catch ( Exception e1 ) {
logger . error ( " Error on downloading the file with id " + itemId , e1 ) ;
String error = e1 . getMessage ( ) ! = null ? e1 . getMessage ( ) : " The file is not available for downloading " ;
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : " + error ) ;
return ;
}
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
switch ( workspaceFileItem . getFileItemType ( ) ) {
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
case PDF_DOCUMENT : {
2013-02-06 15:40:17 +01:00
try {
2018-11-28 16:50:18 +01:00
PDFFileItem pdfFile = ( PDFFileItem ) workspaceFileItem ;
logger . info ( " Downloading: " + pdfFile ) ;
String mimeType = pdfFile . getMimeType ( ) ;
logger . trace ( " EXTERNAL_FILE DOWNLOAD FOR " + pdfFile . getId ( ) ) ;
2016-02-24 11:00:19 +01:00
String contentDisposition = viewContent ? " inline " : " attachment " ;
2022-09-14 14:58:01 +02:00
String itemName = MimeTypeUtility . getNameWithExtension ( descr . getItemName ( ) , mimeType , false ) ;
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
2013-05-23 19:02:48 +02:00
resp . setContentType ( mimeType ) ;
2020-03-27 11:44:41 +01:00
//Fixing Incident: 18926, replacing pdfFile.getSize() with ItemStreamDescriptor.getSize()
if ( descr . getSize ( ) ! = null & & descr . getSize ( ) > 0 ) {
resp = setContentLength ( resp , descr . getSize ( ) ) ;
}
logger . info ( " The " + workspaceFileItem . getFileItemType ( ) + " size is: " + descr . getSize ( ) ) ;
//resp = setContentLength(resp, pdfFile.getSize());
2018-11-28 16:50:18 +01:00
InputStream is = descr . getStream ( ) ;
OutputStream out = resp . getOutputStream ( ) ;
2013-05-23 19:02:48 +02:00
IOUtils . copy ( is , out ) ;
2016-02-24 11:00:19 +01:00
2013-05-23 19:02:48 +02:00
is . close ( ) ;
2013-02-06 15:40:17 +01:00
out . close ( ) ;
2013-05-23 19:02:48 +02:00
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2013-08-30 14:57:54 +02:00
logger . error ( " Error during external item retrieving " + itemId , e ) ;
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during data retrieving: " + e . getMessage ( ) ) ;
2013-02-06 15:40:17 +01:00
return ;
}
return ;
}
2018-11-28 16:50:18 +01:00
case IMAGE_DOCUMENT : {
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
try {
2018-11-28 16:50:18 +01:00
ImageFileItem imageFile = ( ImageFileItem ) workspaceFileItem ;
logger . info ( " Downloading: " + imageFile ) ;
String mimeType = imageFile . getMimeType ( ) ;
2022-09-14 14:58:01 +02:00
String itemName = MimeTypeUtility . getNameWithExtension ( descr . getItemName ( ) , mimeType , false ) ;
2016-02-24 11:00:19 +01:00
String contentDisposition = viewContent ? " inline " : " attachment " ;
2018-11-28 16:50:18 +01:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( mimeType ) ;
2020-03-27 11:44:41 +01:00
//Fixing Incident: 18926, replacing imageFile.getSize() with ItemStreamDescriptor.getSize()
if ( descr . getSize ( ) ! = null & & descr . getSize ( ) > 0 ) {
resp = setContentLength ( resp , descr . getSize ( ) ) ;
}
logger . info ( " The " + workspaceFileItem . getFileItemType ( ) + " size is: " + descr . getSize ( ) ) ;
//resp = setContentLength(resp, imageFile.getSize());
2017-02-24 14:49:09 +01:00
2018-11-28 16:50:18 +01:00
InputStream is = descr . getStream ( ) ;
2013-02-06 15:40:17 +01:00
OutputStream out = resp . getOutputStream ( ) ;
2013-05-23 19:02:48 +02:00
IOUtils . copy ( is , out ) ;
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
is . close ( ) ;
2013-02-06 15:40:17 +01:00
out . close ( ) ;
return ;
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2013-08-30 14:57:54 +02:00
logger . error ( " Error during item retrieving " + itemId , e ) ;
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during data retrieving: " + e . getMessage ( ) ) ;
2013-02-06 15:40:17 +01:00
return ;
}
}
2018-11-28 16:50:18 +01:00
case URL_DOCUMENT : {
2013-02-06 15:40:17 +01:00
try {
2018-11-28 16:50:18 +01:00
URLFileItem externalUrl = ( URLFileItem ) workspaceFileItem ;
logger . info ( " Downloading: " + externalUrl ) ;
String urlMimeType = " text/uri-list " ;
2022-09-14 14:58:01 +02:00
String itemName = MimeTypeUtility . getNameWithExtension ( descr . getItemName ( ) , urlMimeType , false ) ;
2016-02-24 11:00:19 +01:00
String contentDisposition = viewContent ? " inline " : " attachment " ;
2013-06-20 18:53:45 +02:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
2018-11-28 16:50:18 +01:00
resp . setContentType ( urlMimeType ) ;
2019-09-13 16:48:26 +02:00
//resp = setContentLength(resp, externalUrl.getSize());
2016-02-24 11:00:19 +01:00
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
2013-02-06 15:40:17 +01:00
OutputStream out = resp . getOutputStream ( ) ;
2018-11-28 16:50:18 +01:00
InputStream is = descr . getStream ( ) ;
IOUtils . copy ( descr . getStream ( ) , out ) ;
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
is . close ( ) ;
2013-02-06 15:40:17 +01:00
out . close ( ) ;
return ;
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2013-08-30 14:57:54 +02:00
logger . error ( " Error during item retrieving " + itemId , e ) ;
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during data retrieving: " + e . getMessage ( ) ) ;
2013-02-06 15:40:17 +01:00
return ;
}
}
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
case GCUBE_ITEM : {
2013-02-06 15:40:17 +01:00
try {
2018-11-28 16:50:18 +01:00
// Document document = (Document)item;
org . gcube . common . storagehubwrapper . shared . tohl . items . GCubeItem gcubeItem = ( org . gcube . common . storagehubwrapper . shared . tohl . items . GCubeItem ) item ; //Cast GCubeItem
logger . info ( " Downloading: " + gcubeItem ) ;
String mimeType = " text/plain " ;
2016-02-24 11:00:19 +01:00
String contentDisposition = viewContent ? " inline " : " attachment " ;
2018-11-28 16:50:18 +01:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + gcubeItem . getName ( ) + " .txt \" " ) ;
resp . setContentType ( mimeType ) ;
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
2013-02-06 15:40:17 +01:00
OutputStream out = resp . getOutputStream ( ) ;
2018-11-28 16:50:18 +01:00
InputStream is = descr . getStream ( ) ;
IOUtils . copy ( is , out ) ;
is . close ( ) ;
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
out . close ( ) ;
2018-11-28 16:50:18 +01:00
2013-02-06 15:40:17 +01:00
return ;
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2013-08-30 14:57:54 +02:00
logger . error ( " Error during item retrieving " + itemId , e ) ;
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during data retrieving: " + e . getMessage ( ) ) ;
2013-02-06 15:40:17 +01:00
return ;
}
}
2018-11-28 16:50:18 +01:00
default : {
2013-02-06 15:40:17 +01:00
try {
2016-02-24 11:00:19 +01:00
2022-09-14 14:58:01 +02:00
String itemName = MimeTypeUtility . getNameWithExtension ( descr . getItemName ( ) , workspaceFileItem . getMimeType ( ) , false ) ;
2018-11-28 16:50:18 +01:00
logger . info ( " Downloading default item: " + workspaceFileItem ) ;
2019-04-04 16:33:47 +02:00
2019-04-04 12:52:19 +02:00
//String contentDisposition = viewContent?"inline":"attachment";
//Support #16430
2019-04-04 15:28:47 +02:00
//The 'inline' option may be badly managed by browser
2019-04-04 12:52:19 +02:00
String contentDisposition = " attachment " ;
2019-04-04 15:28:47 +02:00
List < String > allowedPrefixes = AllowedMimeTypeToInline . getAllowedMimeTypePrefixes ( ) ;
if ( viewContent ) {
logger . info ( " Checking if the mime type " + workspaceFileItem . getMimeType ( ) + " exists among Mime Type Prefixes " ) ;
for ( String prefix : allowedPrefixes ) {
if ( workspaceFileItem . getMimeType ( ) . startsWith ( prefix ) ) {
logger . info ( " yes, the prefix " + prefix + " is matching the mimetype " + workspaceFileItem . getMimeType ( ) + " , so returning 'Content-Disposition' at 'inline' " ) ;
contentDisposition = " inline " ;
break ;
}
}
}
2018-11-28 16:50:18 +01:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
2020-03-27 10:51:22 +01:00
//Fixing Incident: 18926, replacing workspaceFileItem.getSize() with ItemStreamDescriptor.getSize()
2020-03-27 10:53:38 +01:00
if ( descr . getSize ( ) ! = null & & descr . getSize ( ) > 0 ) {
2020-03-27 10:51:22 +01:00
resp = setContentLength ( resp , descr . getSize ( ) ) ;
2020-03-27 10:53:38 +01:00
}
2016-02-24 11:00:19 +01:00
2020-03-27 10:53:38 +01:00
logger . info ( " The size is: " + descr . getSize ( ) ) ;
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
2013-02-06 15:40:17 +01:00
OutputStream out = resp . getOutputStream ( ) ;
2018-11-28 16:50:18 +01:00
InputStream is = descr . getStream ( ) ;
IOUtils . copy ( descr . getStream ( ) , out ) ;
2015-05-20 18:39:49 +02:00
is . close ( ) ;
2013-02-06 15:40:17 +01:00
out . close ( ) ;
return ;
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2013-08-30 14:57:54 +02:00
logger . error ( " Error during item retrieving " + itemId , e ) ;
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during data retrieving: " + e . getMessage ( ) ) ;
2013-02-06 15:40:17 +01:00
return ;
}
}
2018-11-28 16:50:18 +01:00
2013-02-06 15:40:17 +01:00
}
}
2018-11-28 16:50:18 +01:00
default :
break ;
2013-02-06 15:40:17 +01:00
}
2016-02-24 11:00:19 +01:00
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during data retrieving " ) ;
2013-02-06 15:40:17 +01:00
return ;
2015-07-02 16:53:43 +02:00
}
2016-02-24 11:00:19 +01:00
2018-11-28 16:50:18 +01:00
/ * *
* Gets the file name with version .
* IF DONWLOADING A VERSIONED FILE ADDS THE VERSION NAME AS SUFFIX
* DONE by StorageHub
* @param fileName the file name
* @param versionName the version name
* @return the file name with version
* /
protected String getFileNameWithVersion ( String fileName , String versionName ) {
String fileNameToDwnld = fileName ;
if ( versionName ! = null & & ! versionName . isEmpty ( ) )
fileNameToDwnld = FilenameUtils . getBaseName ( fileName ) + " v " + versionName + FilenameUtils . getExtension ( fileName ) ;
return fileNameToDwnld ;
}
2015-07-02 16:53:43 +02:00
/ * *
2016-12-21 14:55:54 +01:00
* Method to manage HttpServletResponse content length also to big data .
*
* @param resp the resp
* @param length the length
* @return the http servlet response
2015-07-02 16:53:43 +02:00
* /
protected HttpServletResponse setContentLength ( HttpServletResponse resp , long length ) {
try {
if ( length < = Integer . MAX_VALUE )
resp . setContentLength ( ( int ) length ) ;
else
resp . addHeader ( " Content-Length " , Long . toString ( length ) ) ;
} catch ( Exception e ) {
//silent
}
return resp ;
2013-05-23 19:02:48 +02:00
}
2016-02-24 11:00:19 +01:00
2016-12-21 14:55:54 +01:00
/ * *
* Handle error .
*
* @param urlRedirectOnError the url redirect on error
* @param req the req
* @param resp the resp
* @param itemId the item id
* @param message the message
* @throws IOException Signals that an I / O exception has occurred .
* /
2013-06-25 18:26:25 +02:00
protected void handleError ( boolean urlRedirectOnError , HttpServletRequest req , HttpServletResponse resp , String itemId , String message ) throws IOException {
2016-02-24 11:00:19 +01:00
2013-06-26 15:55:55 +02:00
logger . warn ( " Handle error occurred: " + message ) ;
2013-08-30 14:57:54 +02:00
logger . trace ( " urlRedirectOnError is active: " + urlRedirectOnError ) ;
2013-06-25 18:26:25 +02:00
if ( urlRedirectOnError ) {
2018-11-28 16:50:18 +01:00
urlRedirect ( req , resp , itemId , message ) ;
2013-06-25 18:26:25 +02:00
} else
2013-06-26 14:22:04 +02:00
sendError ( resp , message ) ;
2016-02-24 11:00:19 +01:00
2013-06-25 18:26:25 +02:00
}
2016-02-24 11:00:19 +01:00
2016-12-21 14:55:54 +01:00
/ * *
* Send error .
*
* @param response the response
* @param message the message
* @throws IOException Signals that an I / O exception has occurred .
* /
2013-06-25 15:33:03 +02:00
protected void sendError ( HttpServletResponse response , String message ) throws IOException
2016-02-24 11:00:19 +01:00
{
2013-06-25 15:33:03 +02:00
response . setStatus ( HttpServletResponse . SC_INTERNAL_SERVER_ERROR ) ;
HandlerResultMessage resultMessage = HandlerResultMessage . errorResult ( message ) ;
2013-08-30 14:57:54 +02:00
logger . trace ( " error message: " + resultMessage ) ;
logger . trace ( " writing response... " ) ;
StringReader sr = new StringReader ( resultMessage . toString ( ) ) ;
IOUtils . copy ( sr , response . getOutputStream ( ) ) ;
2015-07-02 16:53:43 +02:00
2014-01-13 15:52:52 +01:00
logger . trace ( " response writed " ) ;
response . flushBuffer ( ) ;
}
2016-02-24 11:00:19 +01:00
2016-12-21 14:55:54 +01:00
/ * *
* Send error for status .
*
* @param response the response
* @param message the message
* @param status the status
* @throws IOException Signals that an I / O exception has occurred .
* /
2014-01-13 15:52:52 +01:00
protected void sendErrorForStatus ( HttpServletResponse response , String message , int status ) throws IOException
2016-02-24 11:00:19 +01:00
{
2014-01-13 15:52:52 +01:00
response . setStatus ( status ) ;
HandlerResultMessage resultMessage = HandlerResultMessage . errorResult ( message ) ;
logger . trace ( " error message: " + resultMessage ) ;
logger . trace ( " writing response... " ) ;
StringReader sr = new StringReader ( resultMessage . toString ( ) ) ;
IOUtils . copy ( sr , response . getOutputStream ( ) ) ;
2015-07-02 16:53:43 +02:00
2013-08-30 14:57:54 +02:00
logger . trace ( " response writed " ) ;
2013-06-25 15:33:03 +02:00
response . flushBuffer ( ) ;
}
2016-02-24 11:00:19 +01:00
2016-12-21 14:55:54 +01:00
/ * *
* Send message .
*
* @param response the response
* @param message the message
* @throws IOException Signals that an I / O exception has occurred .
* /
2013-06-25 15:33:03 +02:00
protected void sendMessage ( HttpServletResponse response , String message ) throws IOException
{
response . setStatus ( HttpServletResponse . SC_ACCEPTED ) ;
HandlerResultMessage resultMessage = HandlerResultMessage . okResult ( message ) ;
response . getWriter ( ) . write ( resultMessage . toString ( ) ) ;
response . flushBuffer ( ) ;
}
2016-02-24 11:00:19 +01:00
2016-12-21 14:55:54 +01:00
/ * *
* Send message resource available .
*
* @param response the response
* @param message the message
* @throws IOException Signals that an I / O exception has occurred .
* /
2016-02-24 11:00:19 +01:00
protected void sendMessageResourceAvailable ( HttpServletResponse response , String message ) throws IOException
2013-06-25 15:33:03 +02:00
{
response . setStatus ( HttpServletResponse . SC_ACCEPTED ) ;
HandlerResultMessage resultMessage = HandlerResultMessage . okResult ( message ) ;
response . getWriter ( ) . write ( resultMessage . toString ( ) ) ;
response . flushBuffer ( ) ;
}
2016-02-24 11:00:19 +01:00
2016-12-21 14:55:54 +01:00
/ * *
* Send warn message .
*
* @param response the response
* @param message the message
* @throws IOException Signals that an I / O exception has occurred .
* /
2013-06-25 15:33:03 +02:00
protected void sendWarnMessage ( HttpServletResponse response , String message ) throws IOException
{
response . setStatus ( HttpServletResponse . SC_ACCEPTED ) ;
HandlerResultMessage resultMessage = HandlerResultMessage . warnResult ( message ) ;
response . getWriter ( ) . write ( resultMessage . toString ( ) ) ;
response . flushBuffer ( ) ;
}
2016-02-24 11:00:19 +01:00
2016-12-21 14:55:54 +01:00
/ * *
* Url redirect .
*
* @param req the req
* @param response the response
* @param fakePath the fake path
2018-11-28 16:50:18 +01:00
* @param errorMessage the error message
2016-12-21 14:55:54 +01:00
* @throws IOException Signals that an I / O exception has occurred .
* /
2018-11-28 16:50:18 +01:00
protected void urlRedirect ( HttpServletRequest req , HttpServletResponse response , String fakePath , String errorMessage ) throws IOException {
2013-06-25 18:26:25 +02:00
2013-06-26 15:55:55 +02:00
String requestUrl = getRequestURL ( req ) + fakePath ;
2013-06-26 14:22:04 +02:00
logger . trace ( " Url redirect on: " + requestUrl ) ;
response . sendRedirect ( response . encodeRedirectURL ( requestUrl ) ) ;
2013-06-25 18:26:25 +02:00
return ;
}
2019-09-13 16:48:26 +02:00
/ * *
* Creates the temp file .
*
* @param fileName the file name
* @param extension the extension
* @param data the data
* @return the file
* @throws IOException Signals that an I / O exception has occurred .
* /
public static File createTempFile ( String fileName , String extension , byte [ ] data ) throws IOException {
// Since Java 1.7 Files and Path API simplify operations on files
java . nio . file . Path path = Files . createTempFile ( fileName , extension ) ;
File file = path . toFile ( ) ;
// writing sample data
Files . write ( path , data ) ;
logger . info ( " Created the Temp File: " + file . getAbsolutePath ( ) ) ;
return file ;
}
2016-02-24 11:00:19 +01:00
2016-12-21 14:55:54 +01:00
/ * *
* Gets the request url .
*
* @param req the req
* @return the request url
* /
2013-06-26 14:22:04 +02:00
public static String getRequestURL ( HttpServletRequest req ) {
String scheme = req . getScheme ( ) ; // http
String serverName = req . getServerName ( ) ; // hostname.com
int serverPort = req . getServerPort ( ) ; // 80
String contextPath = req . getContextPath ( ) ; // /mywebapp
2013-06-26 15:55:55 +02:00
// String servletPath = req.getServletPath(); // /servlet/MyServlet
2013-06-26 14:22:04 +02:00
// String pathInfo = req.getPathInfo(); // /a/b;c=123
// String queryString = req.getQueryString(); // d=789
// Reconstruct original requesting URL
StringBuffer url = new StringBuffer ( ) ;
url . append ( scheme ) . append ( " :// " ) . append ( serverName ) ;
2016-02-24 11:00:19 +01:00
if ( serverPort ! = 80 & & serverPort ! = 443 ) {
2013-06-26 14:22:04 +02:00
url . append ( " : " ) . append ( serverPort ) ;
}
2013-06-26 15:55:55 +02:00
logger . trace ( " server: " + url ) ;
2013-07-01 14:27:33 +02:00
logger . trace ( " omitted contextPath: " + contextPath ) ;
2013-06-26 15:55:55 +02:00
PortalUrlGroupGatewayProperty p = new PortalUrlGroupGatewayProperty ( ) ;
int lenght = p . getPath ( ) . length ( ) ;
String groupgatewaypath = " / " ;
2016-02-24 11:00:19 +01:00
2013-06-26 15:55:55 +02:00
if ( lenght > 1 ) {
String lastChar = p . getPath ( ) . substring ( lenght - 1 , lenght - 1 ) ;
groupgatewaypath + = lastChar . compareTo ( " / " ) ! = 0 ? p . getPath ( ) + " / " : p . getPath ( ) ;
}
2016-02-24 11:00:19 +01:00
2013-06-26 15:55:55 +02:00
url . append ( groupgatewaypath ) ;
2013-06-26 14:22:04 +02:00
return url . toString ( ) ;
}
2013-02-06 15:40:17 +01:00
}