From c88e6afe57bf577949bd091a2e26471b957efa5e Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Wed, 27 Nov 2013 11:26:38 +0000 Subject: [PATCH] First try to solve RAP specific file download service issue revealed by the upgrade to RAP 2.x APIs See https://www.argeo.org/bugzilla/show_bug.cgi?id=188 git-svn-id: https://svn.argeo.org/commons/trunk@6656 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../ui/specific/AbstractOpenFileHandler.java | 82 +++++++++++++++++++ .../specific/FileDownloadServiceHandler.java | 65 +++++++++++++++ .../eclipse/ui/specific/FileHandler.java | 13 ++- 3 files changed, 156 insertions(+), 4 deletions(-) create mode 100644 base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/AbstractOpenFileHandler.java create mode 100644 base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileDownloadServiceHandler.java diff --git a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/AbstractOpenFileHandler.java b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/AbstractOpenFileHandler.java new file mode 100644 index 000000000..429e537d2 --- /dev/null +++ b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/AbstractOpenFileHandler.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.eclipse.ui.specific; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.rap.rwt.RWT; +import org.eclipse.rap.rwt.client.service.UrlLauncher; + +/** + * Rap specific handler to open a file stored in the server file system, among + * other tmp files created for exports. + * + */ +public abstract class AbstractOpenFileHandler extends AbstractHandler { + private final static Log log = LogFactory + .getLog(AbstractOpenFileHandler.class); + + // Must be declared by implementing classes + // public final static String ID = "org.argeo.eclipse.ui.specific.openFile"; + + public final static String PARAM_FILE_NAME = FileDownloadServiceHandler.PARAM_FILE_NAME; + public final static String PARAM_FILE_PATH = FileDownloadServiceHandler.PARAM_FILE_PATH; + + public Object execute(ExecutionEvent event) throws ExecutionException { + + // Try to register each time we execute the command. + // try { + // ServiceHandler handler = new FileDownloadServiceHandler(); + // RWT.getServiceManager().registerServiceHandler( + // FileDownloadServiceHandler.DOWNLOAD_SERVICE_NAME, handler); + // } catch (IllegalArgumentException iae) { + // log.warn("Handler is already registered, clean this registering process"); + // } + + // The real usefull handler + String fileName = event.getParameter(PARAM_FILE_NAME); + String filePath = event.getParameter(PARAM_FILE_PATH); + + StringBuilder url = new StringBuilder(); + url.append("&").append(PARAM_FILE_NAME).append("="); + url.append(fileName); + url.append("&").append(PARAM_FILE_PATH).append("="); + url.append(filePath); + + String downloadUrl = RWT.getServiceManager().getServiceHandlerUrl( + getDownloadServiceHandlerId()) + + url.toString(); + if (log.isTraceEnabled()) + log.debug("URL : " + downloadUrl); + + UrlLauncher launcher = RWT.getClient().getService(UrlLauncher.class); + launcher.openURL(downloadUrl); + + // These lines are useless in the current use case but might be + // necessary with new browsers. Stored here for memo + // 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"); + return null; + } + + protected abstract String getDownloadServiceHandlerId(); +} \ No newline at end of file diff --git a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileDownloadServiceHandler.java b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileDownloadServiceHandler.java new file mode 100644 index 000000000..f803d20f0 --- /dev/null +++ b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileDownloadServiceHandler.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.eclipse.ui.specific; + +import java.io.File; +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.argeo.ArgeoException; +import org.eclipse.rap.rwt.service.ServiceHandler; + +/** Provide a basic handler that returns a file from the file system in Rap. */ +public class FileDownloadServiceHandler implements ServiceHandler { + private final String downloadServicehandlerId; + public final static String PARAM_FILE_NAME = "param.fileName"; + public final static String PARAM_FILE_PATH = "param.filePath"; + + public FileDownloadServiceHandler(String downloadServicehandlerId) { + this.downloadServicehandlerId = downloadServicehandlerId; + } + + public void service(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + String fileName = request.getParameter(PARAM_FILE_NAME); + String path = request.getParameter(PARAM_FILE_PATH); + + // Get the file + File file = new File(path); + + // Send the Metadata + response.setContentType("application/octet-stream"); + response.setContentLength((int) file.length()); + String contentDisposition = "attachment; filename=\"" + fileName + "\""; + response.setHeader("Content-Disposition", contentDisposition); + + try { + response.getOutputStream().write( + FileUtils.readFileToByteArray(new File(path))); + } catch (IOException ioe) { + throw new ArgeoException("Error while writing the file " + fileName + + " to the servlet response", ioe); + } + } + + public String getDownloadServiceHandlerId(){ + return downloadServicehandlerId; + } +} \ No newline at end of file diff --git a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileHandler.java b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileHandler.java index 1d1b2739c..1c53d84c3 100644 --- a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileHandler.java +++ b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileHandler.java @@ -17,6 +17,7 @@ package org.argeo.eclipse.ui.specific; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.ArgeoException; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.client.service.UrlLauncher; import org.eclipse.rap.rwt.service.ServiceHandler; @@ -37,22 +38,26 @@ public class FileHandler { public FileHandler(FileProvider provider) { ServiceHandler handler = new DownloadServiceHandler(provider); - RWT.getServiceManager().registerServiceHandler(DOWNLOAD_SERVICE_NAME, - handler); + try { + RWT.getServiceManager().registerServiceHandler( + DOWNLOAD_SERVICE_NAME, handler); + } catch (IllegalArgumentException iae) { + log.warn("Handler is already registered, clean this registering process"); + } } public void openFile(String fileName, String fileId) { try { String downloadUrl = RWT.getServiceManager().getServiceHandlerUrl( DOWNLOAD_SERVICE_NAME) - + createParamUrl(fileName, fileId); + + createParamUrl(fileName, fileId); if (log.isTraceEnabled()) log.debug("URL : " + downloadUrl); UrlLauncher launcher = RWT.getClient() .getService(UrlLauncher.class); launcher.openURL(downloadUrl); } catch (Exception e) { - e.printStackTrace(); + throw new ArgeoException("Unable to open file " + fileName, e); } // These lines are useless in the current use case but might be // necessary with new browsers. Stored here for memo -- 2.30.2