From 7b89e3fc7a04b7a89488a757dc26c9bc1f9c08ce Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Wed, 2 Apr 2014 14:51:37 +0000 Subject: [PATCH] new proposal to address the generic "open file" issue using a cleaner strategy. git-svn-id: https://svn.argeo.org/commons/trunk@6924 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../ui/specific/DownloadFsFileService.java | 62 ------------ .../{OpenFsFile.java => OpenFile.java} | 48 ++++++---- .../eclipse/ui/specific/OpenFileService.java | 95 +++++++++++++++++++ .../argeo/eclipse/ui/specific/OpenFile.java | 78 +++++++++++++++ 4 files changed, 201 insertions(+), 82 deletions(-) delete mode 100644 base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/DownloadFsFileService.java rename base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/{OpenFsFile.java => OpenFile.java} (57%) create mode 100644 base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/OpenFileService.java create mode 100644 base/runtime/org.argeo.eclipse.ui.rcp/src/main/java/org/argeo/eclipse/ui/specific/OpenFile.java diff --git a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/DownloadFsFileService.java b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/DownloadFsFileService.java deleted file mode 100644 index 14915c873..000000000 --- a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/DownloadFsFileService.java +++ /dev/null @@ -1,62 +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; - -/** - * Basic service handler that retrieves a file in the server file system using - * an absolute path and forward it to the end user browser. Rap specific. - */ -public class DownloadFsFileService implements ServiceHandler { - public final static String PARAM_FILE_NAME = "param.fileName"; - public final static String PARAM_FILE_PATH = "param.filePath"; - - public DownloadFsFileService() { - } - - 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/OpenFsFile.java b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/OpenFile.java similarity index 57% rename from base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/OpenFsFile.java rename to base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/OpenFile.java index b1b21b756..b55521b12 100644 --- a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/OpenFsFile.java +++ b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/OpenFile.java @@ -24,41 +24,49 @@ import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.client.service.UrlLauncher; /** - * Rap specific command handler to open a file stored in the server file system. - * The file absolute path and name must be passed as parameters. + * Rap specific command handler to open a file retrieved from the server. It + * forwards the request to the correct service after encoding file name and path + * in the request URI. * - * It relies on an existing {@link DownloadFsFileService} to forward the - * corresponding file to the user browser. + * The parameter "URI" is used to determine the correct file service, the path + * and the file name. An optional file name can be precised to present a + * different file name as the one used to retrieve it to the end user/ * + * Various instances of this handler with different command ID might coexist in + * order to provide context specific download service. + * + * The instance specific service is called by its ID and must have been + * externally created */ -public class OpenFsFile extends AbstractHandler { - private final static Log log = LogFactory.getLog(OpenFsFile.class); +public class OpenFile extends AbstractHandler { + private final static Log log = LogFactory.getLog(OpenFile.class); /* DEPENDENCY INJECTION */ - private String serviceId; + private String openFileServiceId; - public final static String PARAM_FILE_NAME = DownloadFsFileService.PARAM_FILE_NAME; - public final static String PARAM_FILE_PATH = DownloadFsFileService.PARAM_FILE_PATH; + public final static String PARAM_FILE_NAME = OpenFileService.PARAM_FILE_NAME; + public final static String PARAM_FILE_URI = OpenFileService.PARAM_FILE_URI; // "param.fileURI"; public Object execute(ExecutionEvent event) throws ExecutionException { String fileName = event.getParameter(PARAM_FILE_NAME); - String filePath = event.getParameter(PARAM_FILE_PATH); + String fileUri = event.getParameter(PARAM_FILE_URI); // sanity check - if (serviceId == null || "".equals(serviceId.trim()) - || fileName == null || "".equals(fileName.trim()) - || filePath == null || "".equals(filePath.trim())) + if (fileUri == null || "".equals(fileUri.trim()) + || openFileServiceId == null + || "".equals(openFileServiceId.trim())) return null; StringBuilder url = new StringBuilder(); + url.append(RWT.getServiceManager().getServiceHandlerUrl( + openFileServiceId)); + url.append("&").append(PARAM_FILE_NAME).append("="); url.append(fileName); - url.append("&").append(PARAM_FILE_PATH).append("="); - url.append(filePath); + url.append("&").append(PARAM_FILE_URI).append("="); + url.append(fileUri); - String downloadUrl = RWT.getServiceManager().getServiceHandlerUrl( - serviceId) - + url.toString(); + String downloadUrl = url.toString(); if (log.isTraceEnabled()) log.debug("URL : " + downloadUrl); @@ -76,7 +84,7 @@ public class OpenFsFile extends AbstractHandler { } /* DEPENDENCY INJECTION */ - public void setDownloadServiceHandlerId(String downloadServiceHandlerId) { - this.serviceId = downloadServiceHandlerId; + public void setOpenFileServiceId(String openFileServiceId) { + this.openFileServiceId = openFileServiceId; } } \ No newline at end of file diff --git a/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/OpenFileService.java b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/OpenFileService.java new file mode 100644 index 000000000..e48babf0b --- /dev/null +++ b/base/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/OpenFileService.java @@ -0,0 +1,95 @@ +/* + * 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; + +/** + * Basic Default service handler that retrieves a file on the server file system + * using its absolute path and forwards it to the end user browser. Rap + * specific. + * + * Clients might extend to provide context specific services (to open files from + * a JCR repository for instance) + */ +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 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); + + // Set the Metadata + response.setContentType("application/octet-stream"); + response.setContentLength((int) getFileLength(uri)); + if (fileName == null || "".equals(fileName.trim())) + fileName = getFileName(uri); + String contentDisposition = "attachment; filename=\"" + fileName + "\""; + response.setHeader("Content-Disposition", contentDisposition); + + response.getOutputStream().write(getFileAsByteArray(uri)); + // FileUtils.readFileToByteArray(new File(path)) + } + + protected byte[] getFileAsByteArray(String uri) { + if (uri.startsWith(FILE_SCHEME)) { + try { + return FileUtils.readFileToByteArray(new File( + getFilePathFromUri(uri))); + } catch (IOException ioe) { + throw new ArgeoException("Error while getting the file at " + + uri, ioe); + } + } + return null; + } + + protected long getFileLength(String uri) { + if (uri.startsWith(FILE_SCHEME)) { + return new File(getFilePathFromUri(uri)).length(); + } + return -1l; + } + + protected String getFileName(String uri) { + if (uri.startsWith(FILE_SCHEME)) { + return new File(getFilePathFromUri(uri)).getName(); + } + return null; + } + + private String getFilePathFromUri(String uri) { + return uri.substring((FILE_SCHEME + SCHEME_HOST_SEPARATOR).length()); + } + +} \ No newline at end of file diff --git a/base/runtime/org.argeo.eclipse.ui.rcp/src/main/java/org/argeo/eclipse/ui/specific/OpenFile.java b/base/runtime/org.argeo.eclipse.ui.rcp/src/main/java/org/argeo/eclipse/ui/specific/OpenFile.java new file mode 100644 index 000000000..610020dd1 --- /dev/null +++ b/base/runtime/org.argeo.eclipse.ui.rcp/src/main/java/org/argeo/eclipse/ui/specific/OpenFile.java @@ -0,0 +1,78 @@ +/* + * 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.awt.Desktop; +import java.io.File; +import java.io.IOException; + +import org.argeo.ArgeoException; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +/** + * RCP specific command handler to open a file. + * + * The parameter "URI" is used to determine the correct method to open it. + * + * Various instances of this handler with different command ID might coexist in + * order to provide context specific open file service. + * + */ +public class OpenFile extends AbstractHandler { + // private final static Log log = LogFactory.getLog(OpenFile.class); + + public final static String PARAM_FILE_NAME = "param.fileName"; + public final static String PARAM_FILE_URI = "param.fileURI"; + + private final static String FILE_SCHEME = "file"; + + public Object execute(ExecutionEvent event) throws ExecutionException { + @SuppressWarnings("unused") + @Deprecated + String fileName = event.getParameter(PARAM_FILE_NAME); + String fileUri = event.getParameter(PARAM_FILE_URI); + + // sanity check + if (fileUri == null || "".equals(fileUri.trim())) + return null; + + Desktop desktop = null; + if (Desktop.isDesktopSupported()) { + desktop = Desktop.getDesktop(); + } + + File file = getFileFromUri(fileUri); + if (file != null) + try { + desktop.open(file); + } catch (IOException e) { + throw new ArgeoException("Unable to open file with URI: " + + fileUri, e); + } + + return null; + } + + protected File getFileFromUri(String uri) { + if (uri.startsWith(FILE_SCHEME)) { + String path = uri.substring((FILE_SCHEME + "://").length()); + return new File(path); + } + return null; + } +} \ No newline at end of file -- 2.30.2