From: Bruno Sinou Date: Wed, 27 Nov 2013 15:25:10 +0000 (+0000) Subject: Clean solution to solve RAP specific file download service issue revealed by the... X-Git-Tag: argeo-commons-2.1.30~631 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=621ccf3d8ac1cac5b617d9e31161eee75f730713;p=lgpl%2Fargeo-commons.git Clean solution to solve RAP specific file download service issue revealed by the upgrade to RAP 2.x APIs. Mark legacy classes as deprecated. This might be merged in commons stable branch See https://www.argeo.org/bugzilla/show_bug.cgi?id=188 git-svn-id: https://svn.argeo.org/commons/trunk@6657 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- 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 deleted file mode 100644 index 429e537d2..000000000 --- a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/AbstractOpenFileHandler.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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/DownloadServiceHandler.java b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/DownloadServiceHandler.java index 6c70b215e..b28229695 100644 --- a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/DownloadServiceHandler.java +++ b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/DownloadServiceHandler.java @@ -24,6 +24,7 @@ import javax.servlet.http.HttpServletResponse; import org.argeo.ArgeoException; import org.eclipse.rap.rwt.service.ServiceHandler; +@Deprecated public class DownloadServiceHandler implements ServiceHandler { private FileProvider provider; diff --git a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileDownloadService.java b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileDownloadService.java new file mode 100644 index 000000000..e5eb8fcae --- /dev/null +++ b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileDownloadService.java @@ -0,0 +1,59 @@ +/* + * 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 FileDownloadService implements ServiceHandler { + public final static String PARAM_FILE_NAME = "param.fileName"; + public final static String PARAM_FILE_PATH = "param.filePath"; + + public FileDownloadService() { + } + + 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); + } + } +} \ 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 deleted file mode 100644 index f803d20f0..000000000 --- a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileDownloadServiceHandler.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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 1c53d84c3..927747e62 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 @@ -32,6 +32,7 @@ import org.eclipse.rap.rwt.service.ServiceHandler; * Manages the process of forwarding the request to the handler at runtime to * open the dialog box encodedURL */ +@Deprecated public class FileHandler { public final static String DOWNLOAD_SERVICE_NAME = "argeo.rap.download.service"; private final static Log log = LogFactory.getLog(FileHandler.class); diff --git a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileProvider.java b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileProvider.java index 37db4c94f..ae959fb6d 100644 --- a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileProvider.java +++ b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/FileProvider.java @@ -21,6 +21,7 @@ import java.io.InputStream; * Used for file download : subclasses must implement model specific methods to * get a byte array representing a file given is ID. */ +@Deprecated public interface FileProvider { public byte[] getByteArrayFileFromId(String fileId); diff --git a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/SimpleOpenFile.java b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/SimpleOpenFile.java new file mode 100644 index 000000000..f8ee3b1a3 --- /dev/null +++ b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/SimpleOpenFile.java @@ -0,0 +1,79 @@ +/* + * 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 class SimpleOpenFile extends AbstractHandler { + private final static Log log = LogFactory + .getLog(SimpleOpenFile.class); + + private String serviceId; + + public final static String PARAM_FILE_NAME = FileDownloadService.PARAM_FILE_NAME; + public final static String PARAM_FILE_PATH = FileDownloadService.PARAM_FILE_PATH; + + public Object execute(ExecutionEvent event) throws ExecutionException { + String fileName = event.getParameter(PARAM_FILE_NAME); + String filePath = event.getParameter(PARAM_FILE_PATH); + + // sanity check + if (serviceId == null || "".equals(serviceId.trim()) + || fileName == null || "".equals(fileName.trim()) + || filePath == null || "".equals(filePath.trim())) + return null; + + 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( + serviceId) + + 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; + } + + /* DEPENDENCY INJECTION */ + public void setDownloadServiceHandlerId(String downloadServiceHandlerId) { + this.serviceId = downloadServiceHandlerId; + } +} \ No newline at end of file