Implementation of file handlers for both RCP & RAP
[lgpl/argeo-commons.git] / eclipse / runtime / org.argeo.eclipse.ui.rap / src / main / java / org / argeo / eclipse / ui / specific / FileHandler.java
index 45905f6be240d3c0aa8faa57e586e6e3954912e4..2058328a30570e8187ec1ad37b6fc735c203eb1b 100644 (file)
 package org.argeo.eclipse.ui.specific;
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 
-//import org.argeo.eclipse.ui.dialogs.Error;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.ArgeoException;
+import org.eclipse.rwt.RWT;
 
 public class FileHandler {
 
+       private static Log log = LogFactory.getLog(FileHandler.class);
+
        public FileHandler() {
        }
 
        public void openFile(String fileName, InputStream is) {
-               // org.argeo.eclipse.ui.dialogs.Error.show("In Open File for RAP.");
+
+               // // Which file to download?
+               // String fileName = RWT.getRequest().getParameter( "filename" );
+               // // Get the file content
+               // byte[] download = MyDataStore.getByteArrayData( fileName );
+               // // Send the file in the response
+               // HttpServletResponse response = RWT.getResponse();
+               // response.setContentType( "application/octet-stream" );
+               // response.setContentLength( download.length );
+               // String contentDisposition = "attachment; filename=\"" + fileName +
+               // "\"";
+               // response.setHeader( "Content-Disposition", contentDisposition );
+               // try {
+               // response.getOutputStream().write( download );
+               // } catch( IOException e1 ) {
+               // e1.printStackTrace();
+               // }
+               //
+               //
+
+               try {
+
+                       // / workaround : create a tmp file.
+                       String prefix = "", suffix = "";
+                       if (fileName != null) {
+                               int ind = fileName.lastIndexOf('.');
+                               if (ind > 0) {
+                                       prefix = fileName.substring(0, ind);
+                                       suffix = fileName.substring(ind);
+                               }
+                       }
+
+                       File tmpFile = createTmpFile(prefix, suffix, is);
+
+                       // Send the file in the response
+                       HttpServletResponse response = RWT.getResponse();
+                       byte[] ba = null;
+                       ba = FileUtils.readFileToByteArray(tmpFile);
+
+                       response.setContentLength(ba.length);
+
+                       // String contentDisposition = "attachment; filename=\"" + fileName
+                       // + "\"";
+                       String contentDisposition = "attachment; filename=\"" + fileName
+                                       + "\"";
+                       response.setContentType("application/force-download");
+                       response.setHeader("Content-Disposition", contentDisposition);
+                       response.setHeader("Content-Transfer-Encoding", "binary");
+                       response.setHeader("Pragma", "no-cache");
+                       response.setHeader("Cache-Control", "no-cache, must-revalidate");
+
+                       // must-revalidate");
+
+                       if (log.isDebugEnabled()) {
+                               log.debug("Header Set ");
+                       }
+
+                       // header("Content-Type: application/force-download; name=\"".$localName."\"");
+                       // 852 header("Content-Transfer-Encoding: binary");
+                       // 853 if($gzip){
+                       // 854 header("Content-Encoding: gzip");
+                       // 855 // If gzip, recompute data size!
+                       // 856 $gzippedData =
+                       // ($data?gzencode($filePathOrData,9):gzencode(file_get_contents($filePathOrData),
+                       // 9));
+                       // 857 $size = strlen($gzippedData);
+                       // 858 }
+                       // 859 header("Content-Length: ".$size);
+                       // 860 if ($isFile && ($size != 0)) header("Content-Range: bytes 0-"
+                       // . ($size - 1) . "/" . $size . ";");
+                       // 861
+                       // header("Content-Disposition: attachment; filename=\"".$localName."\"");
+                       // 862 header("Expires: 0");
+                       // 863 header("Cache-Control: no-cache, must-revalidate");
+                       // 864 header("Pragma: no-cache");
+
+                       // IOUtils.copy(is, response.getOutputStream());
+                       response.getOutputStream().write(ba);
+                       // Error.show("In Open File for RAP.");
+               } catch (IOException ioe) {
+
+                       throw new ArgeoException("Cannot copy input stream from file "
+                                       + fileName + " to HttpServletResponse", ioe);
+               }
+
        }
 
        private File createTmpFile(String prefix, String suffix, InputStream is) {
                File tmpFile = null;
+               OutputStream os = null;
+               try {
+                       tmpFile = File.createTempFile(prefix, suffix);
+                       os = new FileOutputStream(tmpFile);
+                       IOUtils.copy(is, os);
+               } catch (IOException e) {
+                       throw new ArgeoException("Cannot open file " + prefix + "."
+                                       + suffix, e);
+               } finally {
+                       IOUtils.closeQuietly(os);
+               }
                return tmpFile;
        }