Skip to content
Snippets Groups Projects
Commit 9d819bb8 authored by felmer's avatar felmer
Browse files

LMS-420 Bug fixed and tests adapted

SVN: 6002
parent 7f3ff186
No related branches found
No related tags found
No related merge requests found
...@@ -19,7 +19,8 @@ package ch.systemsx.cisd.openbis.datasetdownload; ...@@ -19,7 +19,8 @@ package ch.systemsx.cisd.openbis.datasetdownload;
import ch.systemsx.cisd.lims.base.IDataSetService; import ch.systemsx.cisd.lims.base.IDataSetService;
/** /**
* * Application context. It contains the object accessing the openBIS for retrieving the data set,
* configuration parameters, and the name of the application which will be a part of its URL.
* *
* @author Franz-Josef Elmer * @author Franz-Josef Elmer
*/ */
...@@ -28,11 +29,15 @@ class ApplicationContext ...@@ -28,11 +29,15 @@ class ApplicationContext
private final IDataSetService dataSetService; private final IDataSetService dataSetService;
private final ConfigParameters configParameters; private final ConfigParameters configParameters;
private final String applicationName;
ApplicationContext(IDataSetService service, ConfigParameters configParameters) ApplicationContext(IDataSetService service, ConfigParameters configParameters,
String applicationName)
{ {
this.dataSetService = service; this.dataSetService = service;
this.configParameters = configParameters; this.configParameters = configParameters;
this.applicationName = applicationName;
} }
public final IDataSetService getDataSetService() public final IDataSetService getDataSetService()
...@@ -44,6 +49,10 @@ class ApplicationContext ...@@ -44,6 +49,10 @@ class ApplicationContext
{ {
return configParameters; return configParameters;
} }
public final String getApplicationName()
{
return applicationName;
}
} }
...@@ -70,7 +70,8 @@ public class DatasetDownloadService ...@@ -70,7 +70,8 @@ public class DatasetDownloadService
server.addConnector(socketConnector); server.addConnector(socketConnector);
Context context = new Context(server, "/", Context.SESSIONS); Context context = new Context(server, "/", Context.SESSIONS);
context.setAttribute(APPLICATION_CONTEXT_KEY, applicationContext); context.setAttribute(APPLICATION_CONTEXT_KEY, applicationContext);
context.addServlet(DatasetDownloadServlet.class, "/dataset-download/*"); context.addServlet(DatasetDownloadServlet.class, "/"
+ applicationContext.getApplicationName() + "/*");
server.start(); server.start();
selfTest(applicationContext); selfTest(applicationContext);
...@@ -99,7 +100,8 @@ public class DatasetDownloadService ...@@ -99,7 +100,8 @@ public class DatasetDownloadService
{ {
ConfigParameters configParameters = getConfigParameters(); ConfigParameters configParameters = getConfigParameters();
IDataSetService dataSetService = new DataSetService(configParameters); IDataSetService dataSetService = new DataSetService(configParameters);
ApplicationContext applicationContext = new ApplicationContext(dataSetService, configParameters); ApplicationContext applicationContext =
new ApplicationContext(dataSetService, configParameters, "dataset-download");
return applicationContext; return applicationContext;
} }
......
...@@ -23,6 +23,7 @@ import java.io.FileInputStream; ...@@ -23,6 +23,7 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.net.URLDecoder;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
...@@ -115,15 +116,14 @@ public class DatasetDownloadServlet extends HttpServlet ...@@ -115,15 +116,14 @@ public class DatasetDownloadServlet extends HttpServlet
{ {
try try
{ {
String pathInfo = request.getPathInfo(); String requestURI = URLDecoder.decode(request.getRequestURI(), "UTF-8");
if (pathInfo == null) String prefix = "/" + applicationContext.getApplicationName() + "/";
if (requestURI.startsWith(prefix) == false)
{ {
throw new UserFailureException("Path not specified in URL."); throw new EnvironmentFailureException("Request URI '" + requestURI
} + "' expected to start with '" + prefix + "'.");
if (pathInfo.startsWith("/"))
{
pathInfo = pathInfo.substring(1);
} }
String pathInfo = requestURI.substring(prefix.length());
int indexOfFirstSeparator = pathInfo.indexOf('/'); int indexOfFirstSeparator = pathInfo.indexOf('/');
String dataSetCode; String dataSetCode;
if (indexOfFirstSeparator < 0) if (indexOfFirstSeparator < 0)
...@@ -151,7 +151,6 @@ public class DatasetDownloadServlet extends HttpServlet ...@@ -151,7 +151,6 @@ public class DatasetDownloadServlet extends HttpServlet
throw new UserFailureException("Unknown data set '" + dataSetCode + "'."); throw new UserFailureException("Unknown data set '" + dataSetCode + "'.");
} }
File rootDir = createDataSetRootDirectory(dataSet); File rootDir = createDataSetRootDirectory(dataSet);
String requestURI = request.getRequestURI();
RenderingContext context = new RenderingContext(rootDir, requestURI, pathInfo); RenderingContext context = new RenderingContext(rootDir, requestURI, pathInfo);
renderPage(response, dataSet, context); renderPage(response, dataSet, context);
} }
......
...@@ -17,10 +17,13 @@ ...@@ -17,10 +17,13 @@
package ch.systemsx.cisd.openbis.datasetdownload; package ch.systemsx.cisd.openbis.datasetdownload;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel;
import ch.systemsx.cisd.common.utilities.Template; import ch.systemsx.cisd.common.utilities.Template;
import ch.systemsx.cisd.lims.base.ExternalData; import ch.systemsx.cisd.lims.base.ExternalData;
...@@ -96,12 +99,24 @@ class HTMLDirectoryRenderer implements IDirectoryRenderer ...@@ -96,12 +99,24 @@ class HTMLDirectoryRenderer implements IDirectoryRenderer
private void printRow(String name, String relativePath, String fileSize) private void printRow(String name, String relativePath, String fileSize)
{ {
Template template = ROW_TEMPLATE.createFreshCopy(); Template template = ROW_TEMPLATE.createFreshCopy();
template.bind("path", urlPrefix + relativePath); System.out.println("url prefix:"+urlPrefix+" unescaped path:"+relativePath);
template.bind("path", urlPrefix + encodeURL(relativePath));
template.bind("name", name); template.bind("name", name);
template.bind("size", fileSize); template.bind("size", fileSize);
writer.println(template.createText()); writer.println(template.createText());
} }
private String encodeURL(String url)
{
try
{
return URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException ex)
{
throw CheckedExceptionTunnel.wrapIfNecessary(ex);
}
}
private String renderFileSize(long size) private String renderFileSize(long size)
{ {
if (size < 10 * UNIT_KB) if (size < 10 * UNIT_KB)
......
...@@ -23,6 +23,8 @@ import java.io.File; ...@@ -23,6 +23,8 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
...@@ -39,6 +41,7 @@ import org.testng.annotations.AfterMethod; ...@@ -39,6 +41,7 @@ import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel;
import ch.systemsx.cisd.common.logging.BufferedAppender; import ch.systemsx.cisd.common.logging.BufferedAppender;
import ch.systemsx.cisd.common.utilities.FileUtilities; import ch.systemsx.cisd.common.utilities.FileUtilities;
import ch.systemsx.cisd.common.utilities.OSUtilities; import ch.systemsx.cisd.common.utilities.OSUtilities;
...@@ -54,6 +57,10 @@ import ch.systemsx.cisd.lims.base.LocatorType; ...@@ -54,6 +57,10 @@ import ch.systemsx.cisd.lims.base.LocatorType;
*/ */
public class DatasetDownloadServletTest public class DatasetDownloadServletTest
{ {
private static final String APPLICATION_NAME = "download";
private static final String REQUEST_URI_PREFIX = "/" + APPLICATION_NAME + "/";
private static final String EXPIRATION_MESSAGE = private static final String EXPIRATION_MESSAGE =
"<html><body>Download session expired.</body></html>"; "<html><body>Download session expired.</body></html>";
...@@ -66,18 +73,22 @@ public class DatasetDownloadServletTest ...@@ -66,18 +73,22 @@ public class DatasetDownloadServletTest
private static final File TEST_FOLDER = new File("targets/unit-test/store"); private static final File TEST_FOLDER = new File("targets/unit-test/store");
private static final String EXAMPLE_DATA_SET_FOLDER_NAME = "data-set-123"; private static final String EXAMPLE_DATA_SET_FOLDER_NAME = "data set #123";
private static final File EXAMPLE_DATA_SET_FOLDER = private static final File EXAMPLE_DATA_SET_FOLDER =
new File(TEST_FOLDER, EXAMPLE_DATA_SET_FOLDER_NAME); new File(TEST_FOLDER, EXAMPLE_DATA_SET_FOLDER_NAME);
private static final String EXAMPLE_FILE_NAME = "readme.txt"; private static final String EXAMPLE_FILE_NAME = "read me @home.txt";
private static final File EXAMPLE_FILE = new File(EXAMPLE_DATA_SET_FOLDER, EXAMPLE_FILE_NAME); private static final File EXAMPLE_FILE = new File(EXAMPLE_DATA_SET_FOLDER, EXAMPLE_FILE_NAME);
private static final String EXAMPLE_FILE_CONTENT = "Hello world!"; private static final String EXAMPLE_FILE_CONTENT = "Hello world!";
private static final String EXAMPLE_DATA_SET_SUB_FOLDER_NAME = "sub"; private static final String EXAMPLE_DATA_SET_SUB_FOLDER_NAME = "+ s % ! # @";
private static final String ESCAPED_EXAMPLE_DATA_SET_SUB_FOLDER_NAME =
encode(EXAMPLE_DATA_SET_SUB_FOLDER_NAME);
private static final File EXAMPLE_DATA_SET_SUB_FOLDER = private static final File EXAMPLE_DATA_SET_SUB_FOLDER =
new File(EXAMPLE_DATA_SET_FOLDER, EXAMPLE_DATA_SET_SUB_FOLDER_NAME); new File(EXAMPLE_DATA_SET_FOLDER, EXAMPLE_DATA_SET_SUB_FOLDER_NAME);
...@@ -86,6 +97,16 @@ public class DatasetDownloadServletTest ...@@ -86,6 +97,16 @@ public class DatasetDownloadServletTest
private static final String EXAMPLE_DATA_SET_CODE = "1234-1"; private static final String EXAMPLE_DATA_SET_CODE = "1234-1";
private static String encode(String url)
{
try
{
return URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException ex)
{
throw CheckedExceptionTunnel.wrapIfNecessary(ex);
}
}
private BufferedAppender logRecorder; private BufferedAppender logRecorder;
private Mockery context; private Mockery context;
...@@ -137,14 +158,16 @@ public class DatasetDownloadServletTest ...@@ -137,14 +158,16 @@ public class DatasetDownloadServletTest
assertEquals("<html><body>" + OSUtilities.LINE_SEPARATOR + "<h1>Data Set 1234-1</h1>" assertEquals("<html><body>" + OSUtilities.LINE_SEPARATOR + "<h1>Data Set 1234-1</h1>"
+ OSUtilities.LINE_SEPARATOR + OSUtilities.LINE_SEPARATOR
+ "<table border=\'0\' cellpadding=\'5\' cellspacing=\'0\'>" + "<table border=\'0\' cellpadding=\'5\' cellspacing=\'0\'>"
+ OSUtilities.LINE_SEPARATOR + "<tr><td><a href='download/1234-1/sub'>sub</td><td></td></tr>" + OSUtilities.LINE_SEPARATOR + "<tr><td><a href='/download/1234-1/"
+ ESCAPED_EXAMPLE_DATA_SET_SUB_FOLDER_NAME + "'>"
+ EXAMPLE_DATA_SET_SUB_FOLDER_NAME + "</td><td></td></tr>"
+ OSUtilities.LINE_SEPARATOR + OSUtilities.LINE_SEPARATOR
+ "<tr><td><a href='download/1234-1/readme.txt'>readme.txt</td><td>12 Bytes</td></tr>" + "<tr><td><a href='/download/1234-1/read+me+%40home.txt'>read me @home.txt</td>"
+ OSUtilities.LINE_SEPARATOR + "</table></body></html>" + "<td>12 Bytes</td></tr>" + OSUtilities.LINE_SEPARATOR + "</table></body></html>"
+ OSUtilities.LINE_SEPARATOR, writer.toString()); + OSUtilities.LINE_SEPARATOR, writer.toString());
assertEquals(LOG_INFO + "Data set '1234-1' obtained from openBIS server." assertEquals(LOG_INFO + "Data set '1234-1' obtained from openBIS server."
+ OSUtilities.LINE_SEPARATOR + LOG_INFO + OSUtilities.LINE_SEPARATOR + LOG_INFO
+ "For data set '1234-1' show directory <wd>/data-set-123", + "For data set '1234-1' show directory <wd>/data set #123",
getNormalizedLogContent()); getNormalizedLogContent());
context.assertIsSatisfied(); context.assertIsSatisfied();
...@@ -196,9 +219,9 @@ public class DatasetDownloadServletTest ...@@ -196,9 +219,9 @@ public class DatasetDownloadServletTest
Map<String, ExternalData> map = new HashMap<String, ExternalData>(); Map<String, ExternalData> map = new HashMap<String, ExternalData>();
will(returnValue(map)); will(returnValue(map));
one(request).getPathInfo(); one(request).getRequestURI();
String codeAndPath = externalData.getCode(); String codeAndPath = externalData.getCode();
will(returnValue(codeAndPath)); will(returnValue(REQUEST_URI_PREFIX + codeAndPath));
one(response).getWriter(); one(response).getWriter();
will(returnValue(new PrintWriter(writer))); will(returnValue(new PrintWriter(writer)));
...@@ -224,20 +247,20 @@ public class DatasetDownloadServletTest ...@@ -224,20 +247,20 @@ public class DatasetDownloadServletTest
final StringWriter writer = new StringWriter(); final StringWriter writer = new StringWriter();
final ExternalData externalData = createExternalData(); final ExternalData externalData = createExternalData();
prepareForNotObtainingDataSetFromServer(); prepareForNotObtainingDataSetFromServer();
prepareForGettingDataSetFromSession(externalData, EXAMPLE_DATA_SET_SUB_FOLDER_NAME); prepareForGettingDataSetFromSession(externalData, ESCAPED_EXAMPLE_DATA_SET_SUB_FOLDER_NAME);
prepareForCreatingHTML(writer); prepareForCreatingHTML(writer);
DatasetDownloadServlet servlet = createServlet(); DatasetDownloadServlet servlet = createServlet();
servlet.doGet(request, response); servlet.doGet(request, response);
assertEquals("<html><body>" + OSUtilities.LINE_SEPARATOR + "<h1>Data Set 1234-1</h1>" assertEquals("<html><body>" + OSUtilities.LINE_SEPARATOR + "<h1>Data Set 1234-1</h1>"
+ OSUtilities.LINE_SEPARATOR + "Folder: sub" + OSUtilities.LINE_SEPARATOR + "Folder: " + EXAMPLE_DATA_SET_SUB_FOLDER_NAME
+ OSUtilities.LINE_SEPARATOR + OSUtilities.LINE_SEPARATOR
+ "<table border=\'0\' cellpadding=\'5\' cellspacing=\'0\'>" + "<table border=\'0\' cellpadding=\'5\' cellspacing=\'0\'>"
+ OSUtilities.LINE_SEPARATOR + "<tr><td><a href='download/1234-1/'>..</td><td></td></tr>" + OSUtilities.LINE_SEPARATOR + "<tr><td><a href='/download/1234-1/'>..</td><td></td></tr>"
+ OSUtilities.LINE_SEPARATOR + "</table></body></html>" + OSUtilities.LINE_SEPARATOR + "</table></body></html>"
+ OSUtilities.LINE_SEPARATOR, writer.toString()); + OSUtilities.LINE_SEPARATOR, writer.toString());
assertEquals(LOG_INFO + "For data set '1234-1' show directory <wd>/data-set-123/sub", assertEquals(LOG_INFO + "For data set '1234-1' show directory <wd>/data set #123/"
getNormalizedLogContent()); + EXAMPLE_DATA_SET_SUB_FOLDER_NAME, getNormalizedLogContent());
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
...@@ -270,9 +293,8 @@ public class DatasetDownloadServletTest ...@@ -270,9 +293,8 @@ public class DatasetDownloadServletTest
DatasetDownloadServlet servlet = createServlet(); DatasetDownloadServlet servlet = createServlet();
servlet.doGet(request, response); servlet.doGet(request, response);
assertEquals("Hello world!", outputStream.toString()); assertEquals("Hello world!", outputStream.toString());
assertEquals(LOG_INFO assertEquals(LOG_INFO + "For data set '1234-1' deliver file "
+ "For data set '1234-1' deliver file <wd>/data-set-123/readme.txt (12 bytes).", + "<wd>/data set #123/read me @home.txt (12 bytes).", getNormalizedLogContent());
getNormalizedLogContent());
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
...@@ -319,8 +341,8 @@ public class DatasetDownloadServletTest ...@@ -319,8 +341,8 @@ public class DatasetDownloadServletTest
context.checking(new Expectations() context.checking(new Expectations()
{ {
{ {
one(request).getPathInfo(); one(request).getRequestURI();
will(returnValue(EXAMPLE_DATA_SET_CODE)); will(returnValue(REQUEST_URI_PREFIX + EXAMPLE_DATA_SET_CODE));
one(request).getSession(false); one(request).getSession(false);
will(returnValue(null)); will(returnValue(null));
...@@ -339,14 +361,20 @@ public class DatasetDownloadServletTest ...@@ -339,14 +361,20 @@ public class DatasetDownloadServletTest
} }
@Test @Test
public void testDoGetForNullPathInfo() throws Exception public void testDoGetRquestURINotStartingWithApplicationName() throws Exception
{ {
final StringWriter writer = new StringWriter(); final StringWriter writer = new StringWriter();
context.checking(new Expectations() context.checking(new Expectations()
{ {
{ {
one(request).getPathInfo(); one(request).getRequestURI();
will(returnValue(null)); will(returnValue("blabla"));
one(request).getRequestURL();
will(returnValue(new StringBuffer("requestURL")));
one(request).getQueryString();
will(returnValue("query"));
one(response).getWriter(); one(response).getWriter();
will(returnValue(new PrintWriter(writer))); will(returnValue(new PrintWriter(writer)));
...@@ -356,10 +384,13 @@ public class DatasetDownloadServletTest ...@@ -356,10 +384,13 @@ public class DatasetDownloadServletTest
DatasetDownloadServlet servlet = createServlet(); DatasetDownloadServlet servlet = createServlet();
servlet.doGet(request, response); servlet.doGet(request, response);
assertEquals("<html><body><h1>Error</h1>" + OSUtilities.LINE_SEPARATOR assertEquals("<html><body><h1>Error</h1>" + OSUtilities.LINE_SEPARATOR
+ "Path not specified in URL." + OSUtilities.LINE_SEPARATOR + "</body></html>" + "Request URI 'blabla' expected to start with '/download/'."
+ OSUtilities.LINE_SEPARATOR, writer.toString()); + OSUtilities.LINE_SEPARATOR + "</body></html>" + OSUtilities.LINE_SEPARATOR,
assertEquals(LOG_INFO + "User failure: Path not specified in URL.", writer.toString());
getNormalizedLogContent()); String logContent = getNormalizedLogContent();
assertEquals("The following string does not start as expected: " + logContent, true,
logContent.startsWith(LOG_ERROR
+ "Request requestURL?query caused an exception:"));
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
...@@ -373,8 +404,8 @@ public class DatasetDownloadServletTest ...@@ -373,8 +404,8 @@ public class DatasetDownloadServletTest
context.checking(new Expectations() context.checking(new Expectations()
{ {
{ {
one(request).getPathInfo(); one(request).getRequestURI();
will(returnValue("/" + EXAMPLE_DATA_SET_CODE)); will(returnValue(REQUEST_URI_PREFIX + EXAMPLE_DATA_SET_CODE));
one(request).getSession(false); one(request).getSession(false);
will(returnValue(null)); will(returnValue(null));
...@@ -407,12 +438,12 @@ public class DatasetDownloadServletTest ...@@ -407,12 +438,12 @@ public class DatasetDownloadServletTest
map.put(externalData.getCode(), externalData); map.put(externalData.getCode(), externalData);
will(returnValue(map)); will(returnValue(map));
one(request).getPathInfo(); one(request).getRequestURI();
String codeAndPath = externalData.getCode() + "/" + path; String codeAndPath = REQUEST_URI_PREFIX + externalData.getCode() + "/" + path;
will(returnValue(codeAndPath)); will(returnValue(codeAndPath));
allowing(request).getRequestURI(); allowing(request).getRequestURI();
will(returnValue("download/" + codeAndPath)); will(returnValue(APPLICATION_NAME + "/" + codeAndPath));
} }
}); });
...@@ -486,7 +517,8 @@ public class DatasetDownloadServletTest ...@@ -486,7 +517,8 @@ public class DatasetDownloadServletTest
properties.setProperty(ConfigParameters.KEYSTORE_PASSWORD_KEY, ""); properties.setProperty(ConfigParameters.KEYSTORE_PASSWORD_KEY, "");
properties.setProperty(ConfigParameters.KEYSTORE_KEY_PASSWORD_KEY, ""); properties.setProperty(ConfigParameters.KEYSTORE_KEY_PASSWORD_KEY, "");
ConfigParameters configParameters = new ConfigParameters(properties); ConfigParameters configParameters = new ConfigParameters(properties);
return new DatasetDownloadServlet(new ApplicationContext(dataSetService, configParameters)); return new DatasetDownloadServlet(new ApplicationContext(dataSetService, configParameters,
APPLICATION_NAME));
} }
private String getNormalizedLogContent() private String getNormalizedLogContent()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment