X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.eclipse.ui.rap%2Fsrc%2Forg%2Fargeo%2Feclipse%2Fui%2Fspecific%2FOpenFileService.java;h=a181a29936324a2fe75a15173179bba163246b2b;hb=089f2201225ffa035997755f335594ee0636d2fd;hp=890df5bbd9a98864dbab24731cedf4953633a547;hpb=04a1908a7a366d20d2db5b30832028eee85b5a91;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/OpenFileService.java b/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/OpenFileService.java index 890df5bbd..a181a2993 100644 --- a/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/OpenFileService.java +++ b/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/OpenFileService.java @@ -15,6 +15,9 @@ */ package org.argeo.eclipse.ui.specific; +import static org.argeo.eclipse.ui.utils.SingleSourcingConstants.FILE_SCHEME; +import static org.argeo.eclipse.ui.utils.SingleSourcingConstants.SCHEME_HOST_SEPARATOR; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -25,6 +28,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.argeo.eclipse.ui.EclipseUiUtils; +import org.argeo.eclipse.ui.utils.SingleSourcingConstants; import org.eclipse.rap.rwt.service.ServiceHandler; /** @@ -35,23 +39,21 @@ import org.eclipse.rap.rwt.service.ServiceHandler; * Clients might extend to provide context specific services */ public class OpenFileService implements ServiceHandler { - public final static String PARAM_FILE_NAME = "param.fileName"; - public final static String PARAM_FILE_URI = "param.fileURI"; - - public final static String SCHEME_HOST_SEPARATOR = "://"; - public final static String FILE_SCHEME = "file"; - public final static String JCR_SCHEME = "jcr"; - public OpenFileService() { } public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - String fileName = request.getParameter(PARAM_FILE_NAME); - String uri = request.getParameter(PARAM_FILE_URI); + String fileName = request.getParameter(SingleSourcingConstants.PARAM_FILE_NAME); + String uri = request.getParameter(SingleSourcingConstants.PARAM_FILE_URI); + + // Use buffered array to directly write the stream? + if (!uri.startsWith(SingleSourcingConstants.FILE_SCHEME)) + throw new IllegalArgumentException( + "Open file service can only handle files that are on the server file system"); // Set the Metadata response.setContentLength((int) getFileSize(uri)); - if (fileName == null || "".equals(fileName.trim())) + if (EclipseUiUtils.isEmpty(fileName)) fileName = getFileName(uri); response.setContentType(getMimeType(uri, fileName)); String contentDisposition = "attachment; filename=\"" + fileName + "\""; @@ -62,35 +64,18 @@ public class OpenFileService implements ServiceHandler { // response.setHeader("Pragma", "no-cache"); // response.setHeader("Cache-Control", "no-cache, must-revalidate"); - // Use buffered array to directly write the stream? - response.getOutputStream().write(getFileAsByteArray(uri)); - } - - /** - * Retrieves the data as Byte Array given an uri. - * - * Overwrite to provide application specific behaviours, like opening from a - * JCR repository - */ - protected byte[] getFileAsByteArray(String uri) { - try { - if (uri.startsWith(FILE_SCHEME)) { - Path path = Paths.get(getAbsPathFromUri(uri)); - return Files.readAllBytes(path); - } - // else if (uri.startsWith(JCR_SCHEME)) { - // String absPath = Paths.get(getAbsPathFromUri(uri)); - // return Files.readAllBytes(path); - // } + Path path = Paths.get(getAbsPathFromUri(uri)); + Files.copy(path, response.getOutputStream()); - } catch (IOException ioe) { - throw new SingleSourcingException("Error getting the file at " + uri, ioe); - } - return null; + // FIXME we always use temporary files for the time being. + // the deleteOnClose file only works when the JVM is closed so we + // explicitly delete to avoid overloading the server + if (path.startsWith("/tmp")) + path.toFile().delete(); } protected long getFileSize(String uri) throws IOException { - if (uri.startsWith(FILE_SCHEME)) { + if (uri.startsWith(SingleSourcingConstants.FILE_SCHEME)) { Path path = Paths.get(getAbsPathFromUri(uri)); return Files.size(path); } @@ -98,7 +83,7 @@ public class OpenFileService implements ServiceHandler { } protected String getFileName(String uri) { - if (uri.startsWith(FILE_SCHEME)) { + if (uri.startsWith(SingleSourcingConstants.FILE_SCHEME)) { Path path = Paths.get(getAbsPathFromUri(uri)); return path.getFileName().toString(); } @@ -108,10 +93,10 @@ public class OpenFileService implements ServiceHandler { private String getAbsPathFromUri(String uri) { if (uri.startsWith(FILE_SCHEME)) return uri.substring((FILE_SCHEME + SCHEME_HOST_SEPARATOR).length()); - else if (uri.startsWith(JCR_SCHEME)) - return uri.substring((JCR_SCHEME + SCHEME_HOST_SEPARATOR).length()); + // else if (uri.startsWith(JCR_SCHEME)) + // return uri.substring((JCR_SCHEME + SCHEME_HOST_SEPARATOR).length()); else - throw new SingleSourcingException("Unknown URI prefix for" + uri); + throw new IllegalArgumentException("Unknown URI prefix for" + uri); } protected String getMimeType(String uri, String fileName) throws IOException { @@ -121,11 +106,6 @@ public class OpenFileService implements ServiceHandler { if (EclipseUiUtils.notEmpty(mimeType)) return mimeType; } - return getMimeTypeFromName(fileName); - } - - /** Overwrite to precise the content type */ - protected String getMimeTypeFromName(String fileName) { return "application/octet-stream"; } }