From d8e502b3e62715ae9a8c85bf7939d66f9b757570 Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Thu, 23 May 2013 17:02:48 +0000 Subject: [PATCH] fixed: closing of input streams git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/workspace-tree-widget@75305 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../workspace/server/DownloadServlet.java | 166 ++++++++++++++++-- 1 file changed, 151 insertions(+), 15 deletions(-) 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 8d3cfc4..31b4b29 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 @@ -6,7 +6,9 @@ package org.gcube.portlets.user.workspace.server; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.io.StringReader; @@ -15,8 +17,11 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.antlr.stringtemplate.language.Cat; import org.apache.commons.io.IOUtils; +import org.gcube.common.core.scope.GCUBEScope; import org.gcube.common.core.utils.logging.GCUBELog; +import org.gcube.portlets.user.homelibrary.home.HomeLibrary; 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; @@ -36,6 +41,7 @@ import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ReportTem 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.jcr.repository.external.GCUBEStorage; 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; @@ -89,6 +95,16 @@ public class DownloadServlet extends HttpServlet{ WorkspaceItem item; try { item = wa.getItem(itemId); + + + try{ + //ACCOUNTING + item.markAsRead(true); + + } catch (InternalErrorException e) { + logger.error("Requested item "+itemId+" has trow an internal error exception",e); + } + } catch (ItemNotFoundException e) { logger.error("Requested item "+itemId+" not found",e); resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"Error, no items found"); @@ -96,6 +112,7 @@ public class DownloadServlet extends HttpServlet{ } switch (item.getType()) { + case FOLDER:{ try { File tmpZip = ZipUtil.zipFolder((WorkspaceFolder) item); @@ -103,7 +120,14 @@ public class DownloadServlet extends HttpServlet{ resp.setContentType("application/zip"); resp.setContentLength((int) tmpZip.length()); OutputStream out = resp.getOutputStream(); - IOUtils.copy(new FileInputStream(tmpZip), 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(); + out.close(); tmpZip.delete(); return; @@ -129,7 +153,13 @@ public class DownloadServlet extends HttpServlet{ resp.setContentType("application/zip"); resp.setContentLength((int) reportTemplate.getLength()); OutputStream out = resp.getOutputStream(); - IOUtils.copy(reportTemplate.getData(), 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(); + out.close(); } catch (InternalErrorException e) { logger.error("Error during external item sending "+itemId,e); @@ -151,7 +181,13 @@ public class DownloadServlet extends HttpServlet{ resp.setContentType("application/zip"); resp.setContentLength((int) report.getLength()); OutputStream out = resp.getOutputStream(); - IOUtils.copy(report.getData(), 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(); + out.close(); } catch (InternalErrorException e) { logger.error("Error during external item sending "+itemId,e); @@ -163,11 +199,15 @@ public class DownloadServlet extends HttpServlet{ } case EXTERNAL_PDF_FILE: case EXTERNAL_FILE:{ + + InputStream is = null; + OutputStream out = null; try{ ExternalFile externalFile = (ExternalFile)folderItem; String mimeType = externalFile.getMimeType(); + logger.trace("EXTERNAL_FILE DOWNLOAD FOR "+externalFile.getId()); //COMMENTED 26/03/2013 // String itemName = MimeTypeUtil.getNameWithExtension(item.getName(), mimeType); @@ -175,12 +215,20 @@ public class DownloadServlet extends HttpServlet{ //COMMENTED 26/03/2013 // resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" ); resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + item.getName() + "\"" ); - resp.setContentType(externalFile.getMimeType()); + resp.setContentType(mimeType); resp.setContentLength((int) externalFile.getLength()); - OutputStream out = resp.getOutputStream(); - IOUtils.copy(externalFile.getData(), resp.getOutputStream()); + + + //MODIFIED 22-05-2013 CLOSE STREAM +// IOUtils.copy(externalFile.getData(), resp.getOutputStream()); + is = externalFile.getData(); + out = resp.getOutputStream(); + IOUtils.copy(is, out); + + is.close(); out.close(); + } catch (InternalErrorException e) { logger.error("Error during external item sending "+itemId,e); resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"Error during data retrieving: "+e.getMessage()); @@ -190,6 +238,7 @@ public class DownloadServlet extends HttpServlet{ } case EXTERNAL_IMAGE:{ + try{ ExternalImage externalImage = (ExternalImage)folderItem; @@ -201,8 +250,14 @@ public class DownloadServlet extends HttpServlet{ resp.setContentType(externalImage.getMimeType()); resp.setContentLength((int) externalImage.getLength()); + + //MODIFIED 22-05-2013 CLOSE STREAM +// IOUtils.copy(externalImage.getData(), resp.getOutputStream()); OutputStream out = resp.getOutputStream(); - IOUtils.copy(externalImage.getData(), resp.getOutputStream()); + InputStream is = externalImage.getData(); + IOUtils.copy(is, out); + is.close(); + out.close(); return; } catch (InternalErrorException e) { @@ -216,8 +271,14 @@ public class DownloadServlet extends HttpServlet{ ExternalUrl externalUrl = (ExternalUrl)folderItem; resp.setContentType("text/uri-list"); resp.setContentLength((int) externalUrl.getLength()); + + + //MODIFIED 22-05-2013 CLOSE STREAM + StringReader sr = new StringReader(externalUrl.getUrl()); OutputStream out = resp.getOutputStream(); - IOUtils.copy(new StringReader(externalUrl.getUrl()), resp.getOutputStream()); + IOUtils.copy(sr, out); + + sr.close(); out.close(); return; } catch (InternalErrorException e) { @@ -237,8 +298,13 @@ public class DownloadServlet extends HttpServlet{ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"Error during data retrieving: "+e.getMessage()); return; } + + //MODIFIED 22-05-2013 CLOSE STREAM OutputStream out = resp.getOutputStream(); - IOUtils.copy(new StringReader(query.getQuery()), resp.getOutputStream()); + StringReader sr = new StringReader(query.getQuery()); + IOUtils.copy(sr, out); + sr.close(); + out.close(); return; @@ -253,8 +319,13 @@ public class DownloadServlet extends HttpServlet{ resp.setContentType("application/zip"); resp.setContentLength((int) tmpZip.length()); + + //MODIFIED 22-05-2013 CLOSE STREAM OutputStream out = resp.getOutputStream(); - IOUtils.copy(new FileInputStream(tmpZip), resp.getOutputStream()); + FileInputStream fileTmpZip = new FileInputStream(tmpZip); + IOUtils.copy(fileTmpZip, out); + fileTmpZip.close(); + out.close(); tmpZip.delete(); return; @@ -274,8 +345,13 @@ public class DownloadServlet extends HttpServlet{ resp.setContentType("application/zip"); resp.setContentLength((int) tmpZip.length()); + + //MODIFIED 22-05-2013 CLOSE STREAM OutputStream out = resp.getOutputStream(); - IOUtils.copy(new FileInputStream(tmpZip), resp.getOutputStream()); + FileInputStream fileTmpZip = new FileInputStream(tmpZip); + IOUtils.copy(fileTmpZip, out); + fileTmpZip.close(); + out.close(); tmpZip.delete(); return; @@ -299,8 +375,13 @@ public class DownloadServlet extends HttpServlet{ resp.setHeader( "Content-Disposition", "attachment; filename=\"" + item.getName() + ".zip\"" ); resp.setContentType("application/zip"); resp.setContentLength((int) tmpZip.length()); + + //MODIFIED 22-05-2013 CLOSE STREAM OutputStream out = resp.getOutputStream(); - IOUtils.copy(new FileInputStream(tmpZip), resp.getOutputStream()); + FileInputStream fileTmpZip = new FileInputStream(tmpZip); + IOUtils.copy(fileTmpZip, out); + fileTmpZip.close(); + out.close(); tmpZip.delete(); } @@ -310,8 +391,13 @@ public class DownloadServlet extends HttpServlet{ resp.setHeader( "Content-Disposition", "inline; filename=\"" + itemName + "\"" ); resp.setContentType(document.getMimeType()); resp.setContentLength((int) document.getLength()); + + //MODIFIED 22-05-2013 CLOSE STREAM OutputStream out = resp.getOutputStream(); - IOUtils.copy(document.getData(), resp.getOutputStream()); + InputStream is = document.getData(); + IOUtils.copy(is, out); + is.close(); + out.close(); } return; @@ -328,8 +414,13 @@ public class DownloadServlet extends HttpServlet{ resp.setContentType("text/html"); resp.setContentLength((int) document.getLength()); + + //MODIFIED 22-05-2013 CLOSE STREAM OutputStream out = resp.getOutputStream(); - IOUtils.copy(new StringReader(document.getData()), resp.getOutputStream()); + StringReader sr = new StringReader(document.getData()); + IOUtils.copy(sr, out); + sr.close(); + out.close(); return; @@ -371,7 +462,11 @@ public class DownloadServlet extends HttpServlet{ if(externalResourceLink.getData()!=null){ System.out.println("Input stream is not null"); - IOUtils.copy(externalResourceLink.getData(), resp.getOutputStream()); + + //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); @@ -410,5 +505,46 @@ public class DownloadServlet extends HttpServlet{ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"Error during data retrieving"); return; + } + + public static void main(String[] args) { + + InputStream is = null; + + System.out.println("start"); + + is = GCUBEStorage.getRemoteFile("/Home/test.user/Workspace3d660604-03ef-49eb-89c3-4c73f8a47914"); + + try{ + +// Workspace ws = HomeLibrary.getHomeManagerFactory().getHomeManager().getHome("test.user", GCUBEScope.getScope("/gcube/devsec")).getWorkspace(); +// +// ExternalFile f = (ExternalFile) ws.getItem("61c6d01c-72f3-44b6-88da-6b9b486ef391"); + + 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); +// } + +// is = f.getData(); + + IOUtils.copy(is, out); + is.close(); + + out.close(); + +// System.out.println("Sleeping"); +// Thread.sleep(20000); +// System.out.println("Alive"); + + System.out.println("end"); + }catch (Exception e) { + e.printStackTrace(); + } + + + } }