2013-02-06 15:40:17 +01:00
/ * *
*
* /
package org.gcube.portlets.user.workspace.server ;
import java.io.BufferedInputStream ;
import java.io.File ;
import java.io.FileInputStream ;
2013-05-23 19:02:48 +02:00
import java.io.FileOutputStream ;
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 ;
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-06-13 18:44:46 +02:00
import org.gcube.common.core.scope.GCUBEScope ;
2013-02-06 15:40:17 +01:00
import org.gcube.common.core.utils.logging.GCUBELog ;
2013-06-13 18:44:46 +02:00
import org.gcube.portlets.user.homelibrary.home.HomeLibrary ;
2013-02-06 15:40:17 +01:00
import org.gcube.portlets.user.homelibrary.home.exceptions.InternalErrorException ;
import org.gcube.portlets.user.homelibrary.home.workspace.Workspace ;
import org.gcube.portlets.user.homelibrary.home.workspace.WorkspaceFolder ;
import org.gcube.portlets.user.homelibrary.home.workspace.WorkspaceItem ;
import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.ExternalResourceBrokenLinkException ;
import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.ExternalResourcePluginNotFoundException ;
import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.ItemNotFoundException ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.FolderItem ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.AquaMapsItem ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ExternalFile ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ExternalImage ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ExternalResourceLink ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ExternalUrl ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.Query ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.Report ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ReportTemplate ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.gcube.Document ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.gcube.Metadata ;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ts.TimeSeries ;
import org.gcube.portlets.user.homelibrary.util.Extensions ;
import org.gcube.portlets.user.homelibrary.util.MimeTypeUtil ;
import org.gcube.portlets.user.homelibrary.util.zip.ZipUtil ;
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 ;
2013-02-06 15:40:17 +01:00
/ * *
* @author Federico De Faveri defaveri @isti.cnr.it
*
* /
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = - 8423345575690165644L ;
2013-06-25 15:33:03 +02:00
protected static GCUBELog logger = new GCUBELog ( 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
}
public void doGet ( HttpServletRequest req , HttpServletResponse resp ) throws IOException {
String itemId = req . getParameter ( " id " ) ;
boolean viewContent = ( req . getParameter ( " viewContent " ) = = null ) ? false : req . getParameter ( " viewContent " ) . equals ( " true " ) ;
2013-06-25 15:33:03 +02:00
boolean isValidItem = ( req . getParameter ( ConstantsExplorer . VALIDATEITEM ) = = null ) ? false : req . getParameter ( ConstantsExplorer . VALIDATEITEM ) . equals ( " true " ) ;
2013-06-25 18:26:25 +02:00
boolean urlRedirectOnError = ( req . getParameter ( ConstantsExplorer . REDIRECTONERROR ) = = null ) ? false : req . getParameter ( ConstantsExplorer . REDIRECTONERROR ) . equals ( " true " ) ;
2013-06-25 15:33:03 +02:00
2013-06-25 18:26:25 +02:00
logger . trace ( " Input Params [id: " + itemId + " , viewContent: " + viewContent + " , " + ConstantsExplorer . VALIDATEITEM + " : " + isValidItem + " , urlRedirectOnError: " + urlRedirectOnError + " ] " ) ;
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 ;
}
logger . trace ( " FILE DOWNLOAD REQUEST " + itemId ) ;
2013-02-06 15:40:17 +01:00
Workspace wa = null ;
try {
2013-06-13 18:44:46 +02:00
wa = WsUtil . getWorkspace ( req . getSession ( ) ) ;
2013-02-06 15:40:17 +01:00
} catch ( Exception e ) {
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during workspace retrieving " ) ;
// sendError(resp,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 " ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error, no workspace in session");
2013-02-06 15:40:17 +01:00
return ;
}
WorkspaceItem item ;
try {
2013-05-23 19:02:48 +02:00
2013-06-25 15:33:03 +02:00
item = wa . getItem ( itemId ) ;
2013-05-23 19:02:48 +02:00
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 ;
}
2013-05-23 19:02:48 +02:00
try {
//ACCOUNTING
item . markAsRead ( true ) ;
} catch ( InternalErrorException e ) {
logger . error ( " Requested item " + itemId + " has trow an internal error exception " , e ) ;
}
2013-02-06 15:40:17 +01:00
} catch ( ItemNotFoundException e ) {
logger . error ( " Requested item " + itemId + " not found " , e ) ;
2013-06-25 15:33:03 +02:00
// sendError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error, no items found");
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-06-25 18:26:25 +02:00
// sendError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": "+ConstantsExplorer.ERROR_ITEM_DOES_NOT_EXIST);
2013-06-25 15:33:03 +02:00
2013-02-06 15:40:17 +01:00
return ;
}
switch ( item . getType ( ) ) {
2013-05-23 19:02:48 +02: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 " ) ;
resp . setContentLength ( ( int ) tmpZip . length ( ) ) ;
OutputStream out = resp . getOutputStream ( ) ;
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
// IOUtils.copy(new FileInputStream(tmpZip), resp.getOutputStream());
FileInputStream fileTmpZip = new FileInputStream ( tmpZip ) ;
IOUtils . copy ( fileTmpZip , resp . getOutputStream ( ) ) ;
fileTmpZip . close ( ) ;
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 ( ) ) ;
// sendError(resp,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 ( ) ) {
2013-07-23 14:24:17 +02: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 ) ;
if ( extension . compareToIgnoreCase ( Extensions . REPORT_TEMPLATE . getName ( ) ) ! = 0 ) //ADD EXTENSION?
itemName = " . " + Extensions . REPORT_TEMPLATE . getName ( ) ;
logger . trace ( " case REPORT_TEMPLATE itemName is " + extension ) ;
// String itemName = item.getName() + "." + Extensions.REPORT_TEMPLATE.getValue();
2013-02-06 15:40:17 +01:00
String contentDisposition = ( viewContent ) ? " inline " : " attachment " ;
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( " application/zip " ) ;
resp . setContentLength ( ( int ) reportTemplate . getLength ( ) ) ;
OutputStream out = resp . getOutputStream ( ) ;
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
// IOUtils.copy(reportTemplate.getData(), resp.getOutputStream());
InputStream is = reportTemplate . getData ( ) ;
IOUtils . copy ( is , resp . getOutputStream ( ) ) ;
is . close ( ) ;
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 ( ) ) ;
// sendError(resp,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 ) ;
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 ) ;
// String itemName = item.getName() + "." + Extensions.REPORT.getValue();
2013-02-06 15:40:17 +01:00
String contentDisposition = ( viewContent ) ? " inline " : " attachment " ;
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( " application/zip " ) ;
resp . setContentLength ( ( int ) report . getLength ( ) ) ;
OutputStream out = resp . getOutputStream ( ) ;
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
// IOUtils.copy(report.getData(), resp.getOutputStream());
InputStream is = report . getData ( ) ;
IOUtils . copy ( is , resp . getOutputStream ( ) ) ;
is . close ( ) ;
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 ( ) ) ;
// sendError(resp,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 : {
2013-05-23 19:02:48 +02:00
InputStream is = null ;
OutputStream out = null ;
2013-02-06 15:40:17 +01:00
try {
ExternalFile externalFile = ( ExternalFile ) folderItem ;
String mimeType = externalFile . getMimeType ( ) ;
2013-03-26 17:31:13 +01:00
2013-05-23 19:02:48 +02:00
logger . trace ( " EXTERNAL_FILE DOWNLOAD FOR " + externalFile . getId ( ) ) ;
2013-03-26 17:31:13 +01:00
//COMMENTED 26/03/2013
// String itemName = MimeTypeUtil.getNameWithExtension(item.getName(), mimeType);
2013-02-06 15:40:17 +01:00
String contentDisposition = ( viewContent ) ? " inline " : " attachment " ;
2013-03-26 17:31:13 +01:00
//COMMENTED 26/03/2013
// resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" );
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + item . getName ( ) + " \" " ) ;
2013-05-23 19:02:48 +02:00
resp . setContentType ( mimeType ) ;
2013-02-06 15:40:17 +01:00
resp . setContentLength ( ( int ) externalFile . getLength ( ) ) ;
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
// IOUtils.copy(externalFile.getData(), resp.getOutputStream());
is = externalFile . getData ( ) ;
out = resp . getOutputStream ( ) ;
IOUtils . copy ( is , out ) ;
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-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 ( ) ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage());
2013-02-06 15:40:17 +01:00
return ;
}
return ;
}
case EXTERNAL_IMAGE : {
2013-05-23 19:02:48 +02: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 ) ;
String contentDisposition = ( viewContent ) ? " inline " : " attachment " ;
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( externalImage . getMimeType ( ) ) ;
resp . setContentLength ( ( int ) externalImage . getLength ( ) ) ;
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
// IOUtils.copy(externalImage.getData(), resp.getOutputStream());
2013-02-06 15:40:17 +01:00
OutputStream out = resp . getOutputStream ( ) ;
2013-05-23 19:02:48 +02:00
InputStream is = externalImage . 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-02-06 15:40:17 +01:00
logger . error ( " Error during item compression " + 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 ( ) ) ;
// sendError(resp,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 ;
2013-06-20 18:53:45 +02:00
//ADDED 20/06/2013
String itemName = MimeTypeUtil . getNameWithExtension ( externalUrl . getName ( ) , " text/uri-list " ) ;
String contentDisposition = ( viewContent ) ? " inline " : " attachment " ;
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
// //ADDED 20/06/2013
// String itemName = externalUrl.getName() + ".uri";
// String contentDisposition = (viewContent)?"inline":"attachment";
// resp.setHeader("Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" );
2013-02-06 15:40:17 +01:00
resp . setContentType ( " text/uri-list " ) ;
resp . setContentLength ( ( int ) externalUrl . getLength ( ) ) ;
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 ) ;
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-02-06 15:40:17 +01:00
logger . error ( " Error during item compression " + 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 ( ) ) ;
// sendError(resp,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 {
resp . setContentLength ( ( int ) 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 ( ) ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage());
2013-02-06 15:40:17 +01:00
return ;
}
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 ( ) ;
2013-02-06 15:40:17 +01:00
out . close ( ) ;
return ;
}
case TIME_SERIES : {
try {
TimeSeries ts = ( TimeSeries ) folderItem ;
File tmpZip = ZipUtil . zipTimeSeries ( ts ) ;
String contentDisposition = ( viewContent ) ? " inline " : " attachment " ;
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + item . getName ( ) + " .zip \" " ) ;
resp . setContentType ( " application/zip " ) ;
resp . setContentLength ( ( int ) tmpZip . length ( ) ) ;
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 ( ) ;
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 item compression " + 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 ( ) ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage());
2013-02-06 15:40:17 +01:00
return ;
}
}
case AQUAMAPS_ITEM : {
try {
AquaMapsItem aquamaps = ( AquaMapsItem ) folderItem ;
File tmpZip = ZipUtil . zipAquaMapsItem ( aquamaps ) ;
String contentDisposition = ( viewContent ) ? " inline " : " attachment " ;
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + item . getName ( ) + " .zip \" " ) ;
resp . setContentType ( " application/zip " ) ;
resp . setContentLength ( ( int ) tmpZip . length ( ) ) ;
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 ( ) ;
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 item compression " + 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 ( ) ) ;
// sendError(resp,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 {
Document document = ( Document ) item ;
if ( ! viewContent ) {
File tmpZip = ZipUtil . zipDocument ( document ) ;
resp . setHeader ( " Content-Disposition " , " attachment; filename= \" " + item . getName ( ) + " .zip \" " ) ;
resp . setContentType ( " application/zip " ) ;
resp . setContentLength ( ( int ) tmpZip . length ( ) ) ;
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 ( ) ;
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 ( ) ) ;
resp . setContentLength ( ( int ) 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 ( ) ;
2013-02-06 15:40:17 +01:00
out . close ( ) ;
}
return ;
2013-06-25 18:26:25 +02:00
} catch ( Exception e ) {
2013-02-06 15:40:17 +01:00
logger . error ( " Error during item compression " + 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 ( ) ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage());
2013-02-06 15:40:17 +01:00
return ;
}
}
case METADATA : {
try {
Metadata document = ( Metadata ) item ;
resp . setContentType ( " text/html " ) ;
resp . setContentLength ( ( int ) 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
StringReader sr = new StringReader ( document . getData ( ) ) ;
IOUtils . copy ( sr , out ) ;
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-02-06 15:40:17 +01:00
logger . error ( " Error during item compression " + 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 ( ) ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage());
2013-02-06 15:40:17 +01:00
return ;
}
}
case EXTERNAL_RESOURCE_LINK : { //IT'S SAME OF EXTERNAL FILE
try {
ExternalResourceLink externalResourceLink = ( ExternalResourceLink ) folderItem ;
OutputStream out = resp . getOutputStream ( ) ;
try {
String mimeType = externalResourceLink . getMimeType ( ) ;
if ( mimeType = = null ) {
2013-06-25 15:33:03 +02:00
logger . trace ( " mimeType is null... recover from MimeTypeUtil by BufferedInputStream " ) ;
2013-02-06 15:40:17 +01:00
BufferedInputStream bufferedStream = new BufferedInputStream ( externalResourceLink . getData ( ) , ( int ) externalResourceLink . getLength ( ) ) ;
mimeType = MimeTypeUtil . getMimeType ( bufferedStream ) ;
}
2013-06-25 15:33:03 +02:00
logger . trace ( " setContentType with mimeType " + mimeType ) ;
2013-02-06 15:40:17 +01:00
String itemName = MimeTypeUtil . getNameWithExtension ( item . getName ( ) , mimeType ) ;
String contentDisposition = ( viewContent ) ? " inline " : " attachment " ;
resp . setHeader ( " Content-Disposition " , contentDisposition + " ; filename= \" " + itemName + " \" " ) ;
resp . setContentType ( mimeType ) ;
2013-06-25 15:33:03 +02:00
logger . trace ( " resoure link lenght: " + externalResourceLink . getLength ( ) ) ;
2013-02-06 15:40:17 +01:00
resp . setContentLength ( ( int ) externalResourceLink . getLength ( ) ) ;
if ( externalResourceLink . getData ( ) ! = null ) {
2013-06-25 15:33:03 +02:00
logger . trace ( " Input stream is not null " ) ;
2013-05-23 19:02:48 +02:00
//MODIFIED 22-05-2013 CLOSE STREAM
InputStream eris = externalResourceLink . getData ( ) ;
IOUtils . copy ( eris , resp . getOutputStream ( ) ) ;
eris . close ( ) ;
2013-02-06 15:40:17 +01:00
}
else {
logger . error ( " Input stream is null " + itemId ) ;
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during inpunt stream retrieving, it's null " ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during inpunt stream retrieving, it's null");
2013-02-06 15:40:17 +01:00
}
} catch ( ExternalResourceBrokenLinkException e ) {
logger . error ( " Error during link resource retrieving " + itemId , e ) ;
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during link retrieving, link broken!: " + e . getMessage ( ) ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during link retrieving, link broken!: "+e.getMessage());
2013-02-06 15:40:17 +01:00
} catch ( ExternalResourcePluginNotFoundException e ) {
logger . error ( " Error during link resource retrieving " + itemId , e ) ;
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during link retrieving, plugin not found!: " + e . getMessage ( ) ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during link retrieving, plugin not found!: "+e.getMessage());
2013-02-06 15:40:17 +01:00
}
out . close ( ) ;
} catch ( InternalErrorException e ) {
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 ( ) ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage());
2013-02-06 15:40:17 +01:00
return ;
} catch ( Exception e ) {
logger . error ( " Error during resource retrieving " + itemId , e ) ;
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during resource retrieving! " + e . getMessage ( ) ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during resource retrieving, plugin not found!: "+e.getMessage());
2013-02-06 15:40:17 +01:00
e . printStackTrace ( ) ;
}
return ;
}
}
}
}
2013-06-25 18:26:25 +02:00
handleError ( urlRedirectOnError , req , resp , itemId , HttpServletResponse . SC_INTERNAL_SERVER_ERROR + " : Error during data retrieving " ) ;
// sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving");
2013-02-06 15:40:17 +01:00
return ;
2013-05-23 19:02:48 +02:00
}
2013-06-25 18:26:25 +02:00
protected void handleError ( boolean urlRedirectOnError , HttpServletRequest req , HttpServletResponse resp , String itemId , String message ) throws IOException {
2013-06-26 15:55:55 +02:00
logger . warn ( " Handle error occurred: " + message ) ;
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 ) ;
2013-06-25 18:26:25 +02:00
}
2013-06-25 15:33:03 +02:00
protected void sendError ( HttpServletResponse response , String message ) throws IOException
2013-06-25 18:26:25 +02:00
{
2013-06-25 15:33:03 +02:00
response . setStatus ( HttpServletResponse . SC_INTERNAL_SERVER_ERROR ) ;
HandlerResultMessage resultMessage = HandlerResultMessage . errorResult ( message ) ;
response . getWriter ( ) . write ( resultMessage . toString ( ) ) ;
response . flushBuffer ( ) ;
}
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 ( ) ;
}
2013-06-25 18:26:25 +02: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 ( ) ;
}
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 ( ) ;
}
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-06-26 15:55:55 +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 ;
}
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 ) ;
if ( ( serverPort ! = 80 ) & & ( serverPort ! = 443 ) ) {
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
// logger.trace("servletPath: "+servletPath);
// url.append(contextPath).append(servletPath);
2013-06-26 14:22:04 +02:00
// if (pathInfo != null) {
// url.append(pathInfo);
// }
// if (queryString != null) {
// url.append("?").append(queryString);
2013-06-26 15:55:55 +02:00
2013-06-26 14:22:04 +02:00
// }
2013-06-26 15:55:55 +02:00
PortalUrlGroupGatewayProperty p = new PortalUrlGroupGatewayProperty ( ) ;
int lenght = p . getPath ( ) . length ( ) ;
String groupgatewaypath = " / " ;
if ( lenght > 1 ) {
String lastChar = p . getPath ( ) . substring ( lenght - 1 , lenght - 1 ) ;
groupgatewaypath + = lastChar . compareTo ( " / " ) ! = 0 ? p . getPath ( ) + " / " : p . getPath ( ) ;
}
url . append ( groupgatewaypath ) ;
2013-06-26 14:22:04 +02:00
return url . toString ( ) ;
}
2013-05-23 19:02:48 +02:00
public static void main ( String [ ] args ) {
InputStream is = null ;
2013-06-25 15:33:03 +02:00
logger . trace ( " start " ) ;
2013-05-23 19:02:48 +02:00
2013-06-20 18:53:45 +02:00
// is = GCUBEStorage.getRemoteFile("/Home/test.user/Workspace3d660604-03ef-49eb-89c3-4c73f8a47914");
2013-06-28 18:42:10 +02:00
2013-05-23 19:02:48 +02:00
try {
2013-06-20 18:53:45 +02:00
Workspace ws = HomeLibrary . getHomeManagerFactory ( ) . getHomeManager ( ) . getHome ( " francesco.mangiacrapa " , GCUBEScope . getScope ( " /gcube/devsec " ) ) . getWorkspace ( ) ;
2013-05-23 19:02:48 +02:00
//
2013-06-20 18:53:45 +02:00
// ExternalFile f = (ExternalFile) ws.getItem("907ce8ef-5c0b-4601-83ac-215d1f432f6b");
WorkspaceItem wsItem = ws . getItem ( " 907ce8ef-5c0b-4601-83ac-215d1f432f6b " ) ;
2013-06-25 15:33:03 +02:00
logger . trace ( " metadata info recovered from HL: [ID: " + wsItem . getId ( ) + " , name: " + wsItem . getName ( ) + " ] " ) ;
2013-07-01 14:27:33 +02:00
2013-05-23 19:02:48 +02:00
FileOutputStream out = new FileOutputStream ( new File ( " /tmp/bla " ) ) ;
// byte[] buffer = new byte[1024];
// int len;
// while ((len = is.read(buffer)) != -1) {
// out.write(buffer, 0, len);
// }
2013-06-25 15:33:03 +02:00
logger . trace ( " cast as external file " ) ;
2013-06-20 18:53:45 +02:00
ExternalFile f = ( ExternalFile ) wsItem ;
is = f . getData ( ) ;
2013-05-23 19:02:48 +02:00
IOUtils . copy ( is , out ) ;
is . close ( ) ;
out . close ( ) ;
2013-06-25 15:33:03 +02:00
// logger.trace("Sleeping");
2013-05-23 19:02:48 +02:00
// Thread.sleep(20000);
2013-06-25 15:33:03 +02:00
// logger.trace("Alive");
2013-05-23 19:02:48 +02:00
2013-06-25 15:33:03 +02:00
logger . trace ( " end " ) ;
2013-05-23 19:02:48 +02:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
2013-02-06 15:40:17 +01:00
}
}