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 ;
import java.io.File ;
import java.io.FileInputStream ;
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 ;
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 ;
2013-10-04 13:58:07 +02:00
import org.apache.log4j.Logger ;
2017-02-24 14:49:09 +01:00
import org.gcube.common.homelibary.model.versioning.WorkspaceVersion ;
2013-09-27 17:39:28 +02:00
import org.gcube.common.homelibrary.home.workspace.Workspace ;
import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder ;
import org.gcube.common.homelibrary.home.workspace.WorkspaceItem ;
import org.gcube.common.homelibrary.home.workspace.exceptions.ItemNotFoundException ;
import org.gcube.common.homelibrary.home.workspace.folder.FolderItem ;
import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalFile ;
import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalImage ;
import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalUrl ;
2015-05-20 18:39:49 +02:00
import org.gcube.common.homelibrary.home.workspace.folder.items.GCubeItem ;
2013-09-27 17:39:28 +02:00
import org.gcube.common.homelibrary.home.workspace.folder.items.Query ;
import org.gcube.common.homelibrary.home.workspace.folder.items.Report ;
import org.gcube.common.homelibrary.home.workspace.folder.items.ReportTemplate ;
import org.gcube.common.homelibrary.home.workspace.folder.items.ts.TimeSeries ;
import org.gcube.common.homelibrary.util.Extensions ;
import org.gcube.common.homelibrary.util.MimeTypeUtil ;
import org.gcube.common.homelibrary.util.zip.ZipUtil ;
2017-01-20 12:45:38 +01:00
import org.gcube.common.portal.PortalContext ;
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 ;
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 ;
2013-02-06 15:40:17 +01:00
2016-12-21 14:55:54 +01:00
2013-02-06 15:40:17 +01:00
/ * *
2016-12-21 14:55:54 +01:00
* The Class DownloadServlet .
*
2013-02-06 15:40:17 +01:00
* @author Federico De Faveri defaveri @isti.cnr.it
2015-07-03 11:23:37 +02:00
* @author Francesco Mangiacrapa francesco . mangiacrapa @isti.cnr.it
2016-12-21 14:55:54 +01:00
* Dec 21 , 2016
2013-02-06 15:40:17 +01:00
* /
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = - 8423345575690165644L ;
2013-10-04 13:58:07 +02:00
protected static Logger logger = Logger . 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-01-20 12:45:38 +01:00
2017-02-21 18:24:44 +01:00
logger . debug ( " DOWNLOAD REQUEST FOR ITEM ID: " + itemId ) ;
2013-02-06 15:40:17 +01:00
Workspace wa = null ;
try {
2016-12-22 17:37:11 +01:00
//REMOVED BECAUSE IT DOES NOT WORK. MUST BE CHECK USERID AND CONTEXTID
// //ADDED 13-01-2014 SESSION VALIDATION
// if(WsUtil.isSessionExpired(req))
// throw new SessionExpiredException();
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 ) ;
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 ;
}
if ( wa = = 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 ;
}
WorkspaceItem item ;
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
2013-02-06 15:40:17 +01:00
} catch ( ItemNotFoundException e ) {
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 ( ) ) {
2016-02-24 11:00:19 +01:00
2013-06-12 18:37:12 +02:00
case SHARED_FOLDER :
2013-02-06 15:40:17 +01:00
case FOLDER : {
try {
File tmpZip = ZipUtil . zipFolder ( ( WorkspaceFolder ) item ) ;
resp . setHeader ( " Content-Disposition " , " attachment; filename= \" " + item . getName ( ) + " .zip \" " ) ;
resp . setContentType ( " application/zip " ) ;
2015-07-02 16:53:43 +02:00
resp = setContentLength ( resp , tmpZip . length ( ) ) ;
2013-02-06 15:40:17 +01:00
OutputStream out = resp . getOutputStream ( ) ;
2016-02-24 11:00:19 +01:00
2013-05-23 19:02:48 +02:00
FileInputStream fileTmpZip = new FileInputStream ( tmpZip ) ;
IOUtils . copy ( fileTmpZip , resp . getOutputStream ( ) ) ;
fileTmpZip . close ( ) ;
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
out . close ( ) ;
tmpZip . delete ( ) ;
return ;
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2013-02-06 15:40:17 +01:00
logger . error ( " Error during folder compression " + itemId , e ) ;
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during folder compression: " + e . getMessage ( ) ) ;
2013-02-06 15:40:17 +01:00
return ;
}
}
case FOLDER_ITEM : {
FolderItem folderItem = ( FolderItem ) item ;
switch ( folderItem . getFolderItemType ( ) ) {
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
case REPORT_TEMPLATE : {
try {
ReportTemplate reportTemplate = ( ReportTemplate ) folderItem ;
2013-07-23 14:24:17 +02:00
String extension = FilenameUtils . getExtension ( item . getName ( ) ) ;
String itemName = item . getName ( ) ;
logger . trace ( " case REPORT_TEMPLATE extension is " + extension ) ;
2016-02-24 11:00:19 +01:00
2013-07-23 14:24:17 +02:00
if ( extension . compareToIgnoreCase ( Extensions . REPORT_TEMPLATE . getName ( ) ) ! = 0 ) //ADD EXTENSION?
itemName = " . " + Extensions . REPORT_TEMPLATE . getName ( ) ;
2016-02-24 11:00:19 +01:00
2013-07-23 14:24:17 +02:00
logger . trace ( " case REPORT_TEMPLATE itemName is " + extension ) ;
2016-02-24 11:00:19 +01:00
String contentDisposition = viewContent ? " inline " : " attachment " ;
2013-02-06 15:40:17 +01:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( " application/zip " ) ;
2015-07-02 16:53:43 +02:00
resp = setContentLength ( resp , reportTemplate . getLength ( ) ) ;
2013-02-06 15:40:17 +01:00
OutputStream out = resp . getOutputStream ( ) ;
2016-02-24 11:00:19 +01:00
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
InputStream is = reportTemplate . getData ( ) ;
IOUtils . copy ( is , resp . getOutputStream ( ) ) ;
is . close ( ) ;
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
out . close ( ) ;
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2013-02-06 15:40:17 +01:00
logger . error ( " Error during external item sending " + 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 ;
}
case REPORT : {
try {
Report report = ( Report ) folderItem ;
2013-07-23 14:24:17 +02:00
String extension = FilenameUtils . getExtension ( item . getName ( ) ) ;
String itemName = item . getName ( ) ;
logger . trace ( " case REPORT extension is " + extension ) ;
2016-02-24 11:00:19 +01:00
2013-07-23 14:24:17 +02:00
if ( extension . compareToIgnoreCase ( Extensions . REPORT . getName ( ) ) ! = 0 ) //ADD EXTENSION?
itemName = " . " + Extensions . REPORT . getName ( ) ;
2013-02-06 15:40:17 +01:00
2013-07-23 14:24:17 +02:00
logger . trace ( " case REPORT itemName is " + extension ) ;
2016-02-24 11:00:19 +01:00
String contentDisposition = viewContent ? " inline " : " attachment " ;
2013-02-06 15:40:17 +01:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( " application/zip " ) ;
2015-07-02 16:53:43 +02:00
resp = setContentLength ( resp , report . getLength ( ) ) ;
2013-02-06 15:40:17 +01:00
OutputStream out = resp . getOutputStream ( ) ;
2016-02-24 11:00:19 +01:00
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
InputStream is = report . getData ( ) ;
IOUtils . copy ( is , resp . getOutputStream ( ) ) ;
is . close ( ) ;
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
out . close ( ) ;
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2013-02-06 15:40:17 +01:00
logger . error ( " Error during external item sending " + 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 ;
}
case EXTERNAL_PDF_FILE :
case EXTERNAL_FILE : {
2016-02-24 11:00:19 +01:00
2013-05-23 19:02:48 +02:00
InputStream is = null ;
OutputStream out = null ;
2013-02-06 15:40:17 +01:00
try {
2017-02-20 14:57:07 +01:00
ExternalFile externalFile = ( ExternalFile ) folderItem ;
2013-02-06 15:40:17 +01:00
String mimeType = externalFile . getMimeType ( ) ;
2013-05-23 19:02:48 +02:00
logger . trace ( " EXTERNAL_FILE DOWNLOAD FOR " + externalFile . getId ( ) ) ;
2016-02-24 11:00:19 +01:00
String contentDisposition = viewContent ? " inline " : " attachment " ;
2015-07-02 16:53:43 +02:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + item . getName ( ) + " \" " ) ;
2013-05-23 19:02:48 +02:00
resp . setContentType ( mimeType ) ;
2017-02-20 14:57:07 +01:00
if ( versionID ! = null ) {
logger . info ( " Downloading version id: " + versionID ) ;
//TODO MUST BE ADDED SIZE FOR VERSIONED FILE
2017-02-24 14:49:09 +01:00
WorkspaceVersion vers = externalFile . getVersion ( versionID ) ;
if ( vers ! = null ) {
long versionSize = vers . getSize ( ) ; //just one read
versionSize = versionSize > 0 ? versionSize : - 1 ;
if ( versionSize > 0 )
resp = setContentLength ( resp , versionSize ) ;
is = externalFile . downloadVersion ( versionID ) ;
} else {
logger . error ( " Error file version " + versionID + " not found in the server-side. Refresh and try again. " ) ;
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error file version " + versionID + " not found in the server-side. Refresh and try again. " ) ;
return ;
}
2017-02-20 14:57:07 +01:00
} else {
resp = setContentLength ( resp , externalFile . getLength ( ) ) ;
is = externalFile . getData ( ) ;
}
2013-05-23 19:02:48 +02:00
out = resp . getOutputStream ( ) ;
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 ;
}
case EXTERNAL_IMAGE : {
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
try {
ExternalImage externalImage = ( ExternalImage ) folderItem ;
String mimeType = externalImage . getMimeType ( ) ;
String itemName = MimeTypeUtil . getNameWithExtension ( item . getName ( ) , mimeType ) ;
2016-02-24 11:00:19 +01:00
String contentDisposition = viewContent ? " inline " : " attachment " ;
2013-02-06 15:40:17 +01:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( externalImage . getMimeType ( ) ) ;
2017-02-24 14:49:09 +01:00
InputStream is ;
if ( versionID ! = null ) {
logger . info ( " Downloading version id: " + versionID ) ;
//TODO MUST BE ADDED SIZE FOR VERSIONED FILE
WorkspaceVersion vers = externalImage . getVersion ( versionID ) ;
if ( vers ! = null ) {
long versionSize = vers . getSize ( ) ; //just one read
versionSize = versionSize > 0 ? versionSize : - 1 ;
if ( versionSize > 0 )
resp = setContentLength ( resp , versionSize ) ;
is = externalImage . downloadVersion ( versionID ) ;
} else {
logger . error ( " Error file version " + versionID + " not found in the server-side. Refresh and try again. " ) ;
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error file version " + versionID + " not found in the server-side. Refresh and try again. " ) ;
return ;
}
} else {
resp = setContentLength ( resp , externalImage . getLength ( ) ) ;
is = externalImage . getData ( ) ;
}
2013-02-06 15:40:17 +01:00
OutputStream out = resp . getOutputStream ( ) ;
2013-05-23 19:02:48 +02:00
IOUtils . copy ( is , out ) ;
is . close ( ) ;
2016-02-24 11:00:19 +01:00
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 ;
}
}
case EXTERNAL_URL : {
try {
ExternalUrl externalUrl = ( ExternalUrl ) folderItem ;
2016-02-24 11:00:19 +01:00
2013-06-20 18:53:45 +02:00
String itemName = MimeTypeUtil . getNameWithExtension ( externalUrl . getName ( ) , " text/uri-list " ) ;
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 + " \" " ) ;
2013-02-06 15:40:17 +01:00
resp . setContentType ( " text/uri-list " ) ;
2015-07-02 16:53:43 +02:00
resp = setContentLength ( resp , externalUrl . getLength ( ) ) ;
2016-02-24 11:00:19 +01:00
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
StringReader sr = new StringReader ( externalUrl . getUrl ( ) ) ;
2013-02-06 15:40:17 +01:00
OutputStream out = resp . getOutputStream ( ) ;
2013-05-23 19:02:48 +02:00
IOUtils . copy ( sr , out ) ;
2016-02-24 11:00:19 +01:00
2013-05-23 19:02:48 +02:00
sr . 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 ;
}
}
case QUERY : {
Query query = ( Query ) folderItem ;
resp . setContentType ( " text/plain " ) ;
try {
2015-07-02 16:53:43 +02:00
resp = setContentLength ( resp , query . getLength ( ) ) ;
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2013-02-06 15:40:17 +01:00
logger . error ( " Error getting item lenght " + query , 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
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 ( ) ;
2013-05-23 19:02:48 +02:00
StringReader sr = new StringReader ( query . getQuery ( ) ) ;
IOUtils . copy ( sr , out ) ;
sr . close ( ) ;
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
out . close ( ) ;
return ;
}
case TIME_SERIES : {
try {
TimeSeries ts = ( TimeSeries ) folderItem ;
File tmpZip = ZipUtil . zipTimeSeries ( ts ) ;
2016-02-24 11:00:19 +01:00
String contentDisposition = viewContent ? " inline " : " attachment " ;
2013-02-06 15:40:17 +01:00
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + item . getName ( ) + " .zip \" " ) ;
resp . setContentType ( " application/zip " ) ;
2015-07-02 16:53:43 +02:00
resp = setContentLength ( resp , tmpZip . length ( ) ) ;
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 ( ) ;
2013-05-23 19:02:48 +02:00
FileInputStream fileTmpZip = new FileInputStream ( tmpZip ) ;
IOUtils . copy ( fileTmpZip , out ) ;
fileTmpZip . close ( ) ;
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
out . close ( ) ;
tmpZip . delete ( ) ;
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 ;
}
}
case IMAGE_DOCUMENT :
case PDF_DOCUMENT :
case URL_DOCUMENT :
case DOCUMENT : {
try {
2015-05-20 18:39:49 +02:00
// Document document = (Document)item;
GCubeItem document = ( GCubeItem ) item ; //Cast GCubeItem
2013-02-06 15:40:17 +01:00
if ( ! viewContent ) {
File tmpZip = ZipUtil . zipDocument ( document ) ;
resp . setHeader ( " Content-Disposition " , " attachment; filename= \" " + item . getName ( ) + " .zip \" " ) ;
resp . setContentType ( " application/zip " ) ;
2015-07-02 16:53:43 +02:00
resp = setContentLength ( resp , tmpZip . length ( ) ) ;
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 ( ) ;
2013-05-23 19:02:48 +02:00
FileInputStream fileTmpZip = new FileInputStream ( tmpZip ) ;
IOUtils . copy ( fileTmpZip , out ) ;
fileTmpZip . close ( ) ;
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
out . close ( ) ;
tmpZip . delete ( ) ;
}
else {
String mimeType = document . getMimeType ( ) ;
String itemName = MimeTypeUtil . getNameWithExtension ( item . getName ( ) , mimeType ) ;
resp . setHeader ( " Content-Disposition " , " inline; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( document . getMimeType ( ) ) ;
2015-07-02 16:53:43 +02:00
resp = setContentLength ( resp , document . getLength ( ) ) ;
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 ( ) ;
2013-05-23 19:02:48 +02:00
InputStream is = document . getData ( ) ;
IOUtils . copy ( is , out ) ;
is . close ( ) ;
2016-02-24 11:00:19 +01:00
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 ;
}
}
case METADATA : {
try {
2015-05-20 18:39:49 +02:00
// Metadata document = (Metadata)item;
GCubeItem metadata = ( GCubeItem ) item ; //Cast GCubeItem
2016-02-24 11:00:19 +01:00
2013-02-06 15:40:17 +01:00
resp . setContentType ( " text/html " ) ;
2015-07-02 16:53:43 +02:00
resp = setContentLength ( resp , metadata . getLength ( ) ) ;
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 ( ) ;
2015-05-20 18:39:49 +02:00
InputStream is = metadata . getData ( ) ;
IOUtils . copy ( is , out ) ;
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
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
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 ) {
2013-06-26 14:22:04 +02:00
urlRedirect ( req , resp , itemId ) ;
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
* @throws IOException Signals that an I / O exception has occurred .
* /
2013-06-26 14:22:04 +02:00
protected void urlRedirect ( HttpServletRequest req , HttpServletResponse response , String fakePath ) 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 ) ;
2013-08-30 14:57:54 +02:00
// System.out.println("Url redirect on: "+requestUrl);
2013-06-26 14:22:04 +02:00
response . sendRedirect ( response . encodeRedirectURL ( requestUrl ) ) ;
2013-06-25 18:26:25 +02:00
return ;
}
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
}