diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/DownloadServlet.java b/src/main/java/org/gcube/portlets/user/workspace/server/DownloadServlet.java index 70b3f6a..f123c55 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/DownloadServlet.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/DownloadServlet.java @@ -5,7 +5,6 @@ package org.gcube.portlets.user.workspace.server; import java.io.File; import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -20,7 +19,6 @@ import javax.servlet.http.HttpSession; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; -import org.gcube.common.homelibrary.home.HomeLibrary; import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; import org.gcube.common.homelibrary.home.workspace.Workspace; import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; @@ -146,12 +144,9 @@ public class DownloadServlet extends HttpServlet{ File tmpZip = ZipUtil.zipFolder((WorkspaceFolder) item); resp.setHeader( "Content-Disposition", "attachment; filename=\"" + item.getName() + ".zip\"" ); resp.setContentType("application/zip"); - resp.setContentLength((int) tmpZip.length()); + resp = setContentLength(resp, tmpZip.length()); OutputStream out = resp.getOutputStream(); - //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(); @@ -163,7 +158,6 @@ public class DownloadServlet extends HttpServlet{ } catch (Exception e) { logger.error("Error during folder compression "+itemId,e); 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()); return; } } @@ -175,29 +169,22 @@ public class DownloadServlet extends HttpServlet{ case REPORT_TEMPLATE:{ try{ ReportTemplate reportTemplate = (ReportTemplate)folderItem; - 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(); - String contentDisposition = (viewContent)?"inline":"attachment"; resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" ); resp.setContentType("application/zip"); - resp.setContentLength((int) reportTemplate.getLength()); + resp = setContentLength(resp, reportTemplate.getLength()); OutputStream out = resp.getOutputStream(); //MODIFIED 22-05-2013 CLOSE STREAM -// IOUtils.copy(reportTemplate.getData(), resp.getOutputStream()); InputStream is = reportTemplate.getData(); IOUtils.copy(is, resp.getOutputStream()); is.close(); @@ -206,7 +193,6 @@ public class DownloadServlet extends HttpServlet{ } catch (Exception e) { logger.error("Error during external item sending "+itemId,e); 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()); return; } return; @@ -215,28 +201,22 @@ public class DownloadServlet extends HttpServlet{ case REPORT:{ try{ Report report = (Report)folderItem; - 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(); logger.trace("case REPORT itemName is" +extension); -// String itemName = item.getName() + "." + Extensions.REPORT.getValue(); - String contentDisposition = (viewContent)?"inline":"attachment"; resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" ); resp.setContentType("application/zip"); - resp.setContentLength((int) report.getLength()); + resp = setContentLength(resp, report.getLength()); OutputStream out = resp.getOutputStream(); //MODIFIED 22-05-2013 CLOSE STREAM -// IOUtils.copy(report.getData(), resp.getOutputStream()); InputStream is = report.getData(); IOUtils.copy(is, resp.getOutputStream()); is.close(); @@ -245,7 +225,6 @@ public class DownloadServlet extends HttpServlet{ } catch (Exception e) { logger.error("Error during external item sending "+itemId,e); 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()); return; } return; @@ -262,28 +241,11 @@ public class DownloadServlet extends HttpServlet{ String mimeType = externalFile.getMimeType(); logger.trace("EXTERNAL_FILE DOWNLOAD FOR "+externalFile.getId()); - //COMMENTED 26/03/2013 -// String itemName = MimeTypeUtil.getNameWithExtension(item.getName(), mimeType); - String contentDisposition = (viewContent)?"inline":"attachment"; - //COMMENTED 26/03/2013 -// resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" ); - resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + item.getName() + "\"" ); + resp.setHeader("Content-Disposition", contentDisposition+"; filename=\"" + item.getName() + "\"" ); resp.setContentType(mimeType); - - resp.setContentLength((int) externalFile.getLength()); - - - //MODIFIED 22-05-2013 CLOSE STREAM -// IOUtils.copy(externalFile.getData(), resp.getOutputStream()); + resp = setContentLength(resp, externalFile.getLength()); is = externalFile.getData(); - -// //REMOVE THIS -- TODO TEMPORARY SOLUTION -// if(is==null){ -// logger.error("Error during get input stream: IS is null"); -// throw new Exception("Item is not reachable"); -// } - out = resp.getOutputStream(); IOUtils.copy(is, out); @@ -293,7 +255,6 @@ public class DownloadServlet extends HttpServlet{ } catch (Exception e) { logger.error("Error during external item retrieving "+itemId,e); 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()); return; } return; @@ -310,21 +271,9 @@ public class DownloadServlet extends HttpServlet{ String contentDisposition = (viewContent)?"inline":"attachment"; resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" ); resp.setContentType(externalImage.getMimeType()); - - resp.setContentLength((int) externalImage.getLength()); - - //MODIFIED 22-05-2013 CLOSE STREAM -// IOUtils.copy(externalImage.getData(), resp.getOutputStream()); + resp = setContentLength(resp, externalImage.getLength()); OutputStream out = resp.getOutputStream(); InputStream is = externalImage.getData(); - - -// //REMOVE THIS -- TODO TEMPORARY SOLUTION -// if(is==null){ -// logger.error("Error during get input stream: IS is null"); -// throw new Exception("Item is not reachable"); -// } - IOUtils.copy(is, out); is.close(); @@ -333,7 +282,6 @@ public class DownloadServlet extends HttpServlet{ } catch (Exception e) { logger.error("Error during item retrieving "+itemId,e); 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()); return; } } @@ -341,18 +289,11 @@ public class DownloadServlet extends HttpServlet{ try{ ExternalUrl externalUrl = (ExternalUrl)folderItem; - //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 + "\"" ); - resp.setContentType("text/uri-list"); - resp.setContentLength((int) externalUrl.getLength()); + resp = setContentLength(resp, externalUrl.getLength()); //MODIFIED 22-05-2013 CLOSE STREAM StringReader sr = new StringReader(externalUrl.getUrl()); @@ -365,7 +306,6 @@ public class DownloadServlet extends HttpServlet{ } catch (Exception e) { logger.error("Error during item retrieving "+itemId,e); 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()); return; } } @@ -374,11 +314,10 @@ public class DownloadServlet extends HttpServlet{ Query query = (Query)folderItem; resp.setContentType("text/plain"); try { - resp.setContentLength((int) query.getLength()); + resp = setContentLength(resp, query.getLength()); } catch (Exception e) { logger.error("Error getting item lenght "+query,e); 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()); return; } @@ -399,9 +338,8 @@ public class DownloadServlet extends HttpServlet{ String contentDisposition = (viewContent)?"inline":"attachment"; resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + item.getName() + ".zip\"" ); - resp.setContentType("application/zip"); - resp.setContentLength((int) tmpZip.length()); + resp = setContentLength(resp, tmpZip.length()); //MODIFIED 22-05-2013 CLOSE STREAM OutputStream out = resp.getOutputStream(); @@ -415,37 +353,9 @@ public class DownloadServlet extends HttpServlet{ } catch (Exception e) { logger.error("Error during item retrieving "+itemId,e); 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()); 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()); - - //MODIFIED 22-05-2013 CLOSE STREAM - OutputStream out = resp.getOutputStream(); - FileInputStream fileTmpZip = new FileInputStream(tmpZip); - IOUtils.copy(fileTmpZip, out); - fileTmpZip.close(); - - out.close(); - tmpZip.delete(); - return; - } catch (Exception e) { - logger.error("Error during item retrieving "+itemId,e); - 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()); - return; - } - }*/ case IMAGE_DOCUMENT: case PDF_DOCUMENT: case URL_DOCUMENT: @@ -459,7 +369,7 @@ public class DownloadServlet extends HttpServlet{ resp.setHeader( "Content-Disposition", "attachment; filename=\"" + item.getName() + ".zip\"" ); resp.setContentType("application/zip"); - resp.setContentLength((int) tmpZip.length()); + resp = setContentLength(resp, tmpZip.length()); //MODIFIED 22-05-2013 CLOSE STREAM OutputStream out = resp.getOutputStream(); @@ -475,8 +385,7 @@ public class DownloadServlet extends HttpServlet{ String itemName = MimeTypeUtil.getNameWithExtension(item.getName(), mimeType); resp.setHeader( "Content-Disposition", "inline; filename=\"" + itemName + "\"" ); resp.setContentType(document.getMimeType()); - resp.setContentLength((int) document.getLength()); - + resp = setContentLength(resp, document.getLength()); //MODIFIED 22-05-2013 CLOSE STREAM OutputStream out = resp.getOutputStream(); InputStream is = document.getData(); @@ -489,7 +398,6 @@ public class DownloadServlet extends HttpServlet{ } catch (Exception e) { logger.error("Error during item retrieving "+itemId,e); 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()); return; } } @@ -500,104 +408,47 @@ public class DownloadServlet extends HttpServlet{ GCubeItem metadata = (GCubeItem) item; //Cast GCubeItem resp.setContentType("text/html"); - resp.setContentLength((int) metadata.getLength()); + resp = setContentLength(resp, metadata.getLength()); //MODIFIED 22-05-2013 CLOSE STREAM OutputStream out = resp.getOutputStream(); -// StringReader sr = new StringReader(metadata.getData()); InputStream is = metadata.getData(); IOUtils.copy(is, out); is.close(); - out.close(); return; } catch (Exception e) { logger.error("Error during item retrieving "+itemId,e); 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()); return; } - - } - /*COMMENT ACCORDING TO HL - 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){ - logger.trace("mimeType is null... recover from MimeTypeUtil by BufferedInputStream"); - - BufferedInputStream bufferedStream = new BufferedInputStream(externalResourceLink.getData(), (int) externalResourceLink.getLength()); - mimeType = MimeTypeUtil.getMimeType(externalResourceLink.getName(), bufferedStream); - } - - logger.trace("setContentType with mimeType " + mimeType); - String itemName = MimeTypeUtil.getNameWithExtension(item.getName(), mimeType); - - String contentDisposition = (viewContent)?"inline":"attachment"; - resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" ); - resp.setContentType(mimeType); - - - logger.trace("resoure link lenght: " +externalResourceLink.getLength()); - - resp.setContentLength((int) externalResourceLink.getLength()); - - if(externalResourceLink.getData()!=null){ - logger.trace("Input stream is not null"); - - //MODIFIED 22-05-2013 CLOSE STREAM - InputStream eris = externalResourceLink.getData(); - IOUtils.copy(eris, resp.getOutputStream()); - eris.close(); - } - else{ - logger.error("Input stream is null "+itemId); - 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"); - } - - } catch (ExternalResourceBrokenLinkException e) { - logger.error("Error during link resource retrieving "+itemId,e); - 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()); - } catch (ExternalResourcePluginNotFoundException e) { - logger.error("Error during link resource retrieving "+itemId,e); - 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()); - } - out.close(); - } catch (InternalErrorException e) { - logger.error("Error during external item sending "+itemId,e); - 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()); - return; - } catch (Exception e) { - logger.error("Error during resource retrieving "+itemId,e); - 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()); - e.printStackTrace(); - } - - return; - - }*/ } } } 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"); - return; - + } + + /** + * Method to manage HttpServletResponse content length also to big data + * @param resp + * @param length + * @return + */ + 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; } protected void handleError(boolean urlRedirectOnError, HttpServletRequest req, HttpServletResponse resp, String itemId, String message) throws IOException{ @@ -619,8 +470,7 @@ public class DownloadServlet extends HttpServlet{ logger.trace("writing response..."); StringReader sr = new StringReader(resultMessage.toString()); IOUtils.copy(sr, response.getOutputStream()); - -// response.getWriter().write(resultMessage.toString()); + logger.trace("response writed"); response.flushBuffer(); } @@ -634,8 +484,7 @@ public class DownloadServlet extends HttpServlet{ logger.trace("writing response..."); StringReader sr = new StringReader(resultMessage.toString()); IOUtils.copy(sr, response.getOutputStream()); - -// response.getWriter().write(resultMessage.toString()); + logger.trace("response writed"); response.flushBuffer(); } @@ -701,7 +550,6 @@ public class DownloadServlet extends HttpServlet{ // } // if (queryString != null) { // url.append("?").append(queryString); - // } PortalUrlGroupGatewayProperty p = new PortalUrlGroupGatewayProperty(); @@ -722,6 +570,7 @@ public class DownloadServlet extends HttpServlet{ return url.toString(); } + /* public static void main(String[] args) { InputStream is = null; @@ -766,5 +615,5 @@ public class DownloadServlet extends HttpServlet{ }catch (Exception e) { e.printStackTrace(); } - } + }*/ } diff --git a/src/test/java/org/gcube/portlets/user/workspace/SizeRetrieving.java b/src/test/java/org/gcube/portlets/user/workspace/SizeRetrieving.java index 68f3dbc..826427b 100644 --- a/src/test/java/org/gcube/portlets/user/workspace/SizeRetrieving.java +++ b/src/test/java/org/gcube/portlets/user/workspace/SizeRetrieving.java @@ -23,8 +23,9 @@ import org.gcube.common.scope.impl.ScopeBean; public class SizeRetrieving { - public static String DEFAULT_SCOPE = "/gcube/devsec"; //DEV - public static String TEST_USER = "andrea.manzi"; +// public static String DEFAULT_SCOPE = "/gcube/devsec"; //DEV + public static String DEFAULT_SCOPE = "/d4science.research-infrastructures.eu/gCubeApps/DESCRAMBLE"; + public static String TEST_USER = "massimiliano.assante"; public static void main(String[] args) {