diff --git a/datastore_server/.classpath b/datastore_server/.classpath index 5690297cf29c832c9712d3eac4d54aff6ea5a400..489b20ce9168771de72ef0bda010f159cf134122 100644 --- a/datastore_server/.classpath +++ b/datastore_server/.classpath @@ -31,5 +31,6 @@ <classpathentry kind="lib" path="/libraries/jaxb/jaxb-api.jar" sourcepath="/libraries/jaxb/jaxb-api-src.zip"/> <classpathentry kind="lib" path="/libraries/jaxb/jaxb-impl.jar"/> <classpathentry kind="lib" path="/libraries/jaxb/jsr173_1.0_api.jar"/> + <classpathentry kind="lib" path="/libraries/activation/activation.jar"/> <classpathentry kind="output" path="targets/classes"/> </classpath> diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java index d21aa531d1bf7c2c692d235faeed8382ea6e906b..461995d39da1675f646d49232c80166367453a47 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java @@ -31,6 +31,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.Map; +import javax.activation.MimetypesFileTypeMap; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -40,6 +41,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -71,6 +73,10 @@ public class DatasetDownloadServlet extends HttpServlet static final String BINARY_CONTENT_TYPE = "binary"; + static final String PLAIN_TEXT_CONTENT_TYPE = "text/plain"; + + private static final MimetypesFileTypeMap MIMETYPES = new MimetypesFileTypeMap(); + private static final long serialVersionUID = 1L; protected static final Logger operationLog = @@ -79,6 +85,24 @@ public class DatasetDownloadServlet extends HttpServlet protected static final Logger notificationLog = LogFactory.getLogger(LogCategory.NOTIFY, DatasetDownloadServlet.class); + // @Private + static String getMimeType(File f, boolean plainTextMode) + { + if (plainTextMode) + { + return BINARY_CONTENT_TYPE; + } else + { + if (FilenameUtils.getExtension(f.getName()).length() == 0) + { + return PLAIN_TEXT_CONTENT_TYPE; + } else + { + return MIMETYPES.getContentType(f.getName().toLowerCase()); + } + } + } + private static final Comparator<File> FILE_COMPARATOR = new Comparator<File>() { public int compare(File file1, File file2) @@ -214,7 +238,7 @@ public class DatasetDownloadServlet extends HttpServlet RenderingContext context = new RenderingContext(rootDir, requestParams.getURLPrefix(), requestParams .getPathInfo()); - renderPage(rendererFactory, response, dataSet, context); + renderPage(rendererFactory, response, dataSet, context, requestParams); } private IRendererFactory createRendererFactory(boolean plainTextMode) @@ -290,7 +314,8 @@ public class DatasetDownloadServlet extends HttpServlet } private void renderPage(IRendererFactory rendererFactory, HttpServletResponse response, - ExternalDataPE dataSet, RenderingContext renderingContext) throws IOException + ExternalDataPE dataSet, RenderingContext renderingContext, RequestParams requestParams) + throws IOException { File file = renderingContext.getFile(); if (file.exists() == false) @@ -302,7 +327,7 @@ public class DatasetDownloadServlet extends HttpServlet createPage(rendererFactory, response, dataSet, renderingContext, file); } else { - deliverFile(response, dataSet, file); + deliverFile(response, dataSet, file, requestParams.isPlainTextMode()); } } @@ -354,8 +379,8 @@ public class DatasetDownloadServlet extends HttpServlet } } - private void deliverFile(final HttpServletResponse response, ExternalDataPE dataSet, File file) - throws IOException, FileNotFoundException + private void deliverFile(final HttpServletResponse response, ExternalDataPE dataSet, File file, + boolean plainTextMode) throws IOException, FileNotFoundException { long size = file.length(); if (operationLog.isInfoEnabled()) @@ -367,7 +392,7 @@ public class DatasetDownloadServlet extends HttpServlet response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); ServletOutputStream outputStream = null; FileInputStream fileInputStream = null; - response.setContentType(BINARY_CONTENT_TYPE); + response.setContentType(getMimeType(file, plainTextMode)); try { outputStream = response.getOutputStream(); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java index fdce0b982dcaa9741cdb592cdf54f5d306b14151..313d6ed834527b033e52dad77f8716517d2474c6 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java @@ -155,6 +155,17 @@ public class DatasetDownloadServletTest context.assertIsSatisfied(); } + @Test + public void testGetMimetype() + { + assertEquals("image/tiff", DatasetDownloadServlet.getMimeType(new File("/some/image.tiff"), false)); + assertEquals("binary", DatasetDownloadServlet.getMimeType(new File("/some/image.tiff"), true)); + assertEquals("image/tiff", DatasetDownloadServlet.getMimeType(new File("/some/image.TIF"), false)); + assertEquals("binary", DatasetDownloadServlet.getMimeType(new File("/some/image.TIF"), true)); + assertEquals("application/pdf", DatasetDownloadServlet.getMimeType(new File("doc.pdf"), false)); + assertEquals("text/plain", DatasetDownloadServlet.getMimeType(new File("/dir/filewithoutext"), false)); + } + @Test public void testInitialDoGet() throws Exception { @@ -305,7 +316,7 @@ public class DatasetDownloadServletTest context.checking(new Expectations() { { - one(response).setContentType(DatasetDownloadServlet.BINARY_CONTENT_TYPE); + one(response).setContentType("text/plain"); one(response).setContentLength(EXAMPLE_FILE_CONTENT.length()); one(response).setHeader("Content-Disposition", "inline; filename=" + EXAMPLE_FILE_NAME);