Rename packages in order to make future stable documentation clearer.
[lgpl/argeo-commons.git] / org.argeo.eclipse.ui.rap / src / org / argeo / eclipse / ui / specific / OpenFileService.java
index 890df5bbd9a98864dbab24731cedf4953633a547..4a75cc1f6eb20c11f91bf1a8df11f3c798dd2e48 100644 (file)
@@ -15,6 +15,9 @@
  */
 package org.argeo.eclipse.ui.specific;
 
+import static org.argeo.eclipse.ui.util.SingleSourcingConstants.FILE_SCHEME;
+import static org.argeo.eclipse.ui.util.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.util.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";
        }
 }