diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NotifyingTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NotifyingTask.java index fbb6b58c88ff837a1921126c249063882211c881..85693333f67d55c5369c822b54fd2d13bb2f27ee 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NotifyingTask.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NotifyingTask.java @@ -39,10 +39,13 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; public class NotifyingTask extends AbstractPostRegistrationTask { private static final String MESSAGE_TEMPLATE_KEY = "message-template"; + private static final String DESTINATION_PATH_TEMPLATE_KEY = "destination-path-template"; + private static final String PROPERTY_PREFIX = "property:"; + private static final String DATA_SET_CODE_PLACE_HOLDER = "data-set-code"; - + private final Template messageTemplate; private final Template destinationPathTemplate; @@ -67,7 +70,7 @@ public class NotifyingTask extends AbstractPostRegistrationTask ExternalData dataSet = service.tryGetDataSet(dataSetCode); if (dataSet == null) { - throw new IllegalArgumentException("Unknown data set " + dataSetCode); + throw new IllegalArgumentException("Unknown data set: " + dataSetCode); } return new Executor(dataSet, messageTemplate.createFreshCopy(), destinationPathTemplate.createFreshCopy()); 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 213afa30c45e89f954d7160614abc53e7bf5c7ae..8a2cb18287e0a195ac7385ac9edc6568051c7223 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 @@ -39,9 +39,7 @@ import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.io.IHierarchicalContent; import ch.systemsx.cisd.common.io.IHierarchicalContentNode; import ch.systemsx.cisd.common.utilities.HierarchicalContentUtils; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.Size; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; import ch.systemsx.cisd.openbis.generic.shared.util.HttpRequestUtils; /** @@ -221,12 +219,29 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet private RenderingContext createRenderingContext(RequestParams requestParams, String dataSetCode, HttpSession session) { - IHierarchicalContent rootContent = - applicationContext.getHierarchicalContentProvider().asContent(dataSetCode); - RenderingContext context = - new RenderingContext(rootContent, requestParams.getURLPrefix(), - requestParams.getPathInfo(), requestParams.tryGetSessionId()); - return context; + IHierarchicalContent rootContent = null; + try + { + rootContent = + applicationContext.getHierarchicalContentProvider().asContent(dataSetCode); + } catch (IllegalArgumentException ex) + { + throw new UserFailureException(ex.getMessage()); + } + try + { + RenderingContext context = + new RenderingContext(rootContent, requestParams.getURLPrefix(), + requestParams.getPathInfo(), requestParams.tryGetSessionId()); + return context; + } catch (IllegalArgumentException ex) + { + if (rootContent != null) + { + rootContent.close(); + } + throw ex; // rethrow + } } private IRendererFactory createRendererFactory(String displayMode) @@ -340,36 +355,32 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet + "' does not exist in data set '" + dataSetCode + "'."); } - // If we want to browse a directory, we need a whole dataset metadata from openbis to - // display them for the user. But if just a file is needed, then it's much faster to just - // check the access rights in openbis. String sessionIdOrNull = requestParams.tryGetSessionId(); + ensureDatasetAccessible(dataSetCode, session, sessionIdOrNull); if (node.isDirectory()) { - ExternalData dataSet = getDataSet(dataSetCode, sessionIdOrNull, session); if (requestParams.isAutoResolve()) { autoResolve(rendererFactory, response, dataSetCode, renderingContext, - requestParams, session, node, dataSet, false); + requestParams, session, node, false); } else if (requestParams.isForceAutoResolve()) { autoResolve(rendererFactory, response, dataSetCode, renderingContext, - requestParams, session, node, dataSet, true); + requestParams, session, node, true); } else { - createPage(rendererFactory, response, dataSet, renderingContext, node); + createPage(rendererFactory, response, dataSetCode, renderingContext, node); } } else { - ensureDatasetAccessible(dataSetCode, session, sessionIdOrNull); deliverFile(response, dataSetCode, node, requestParams.getDisplayMode()); } } private void autoResolve(IRendererFactory rendererFactory, HttpServletResponse response, String dataSetCode, RenderingContext renderingContext, RequestParams requestParams, - HttpSession session, IHierarchicalContentNode dirNode, ExternalData dataSet, - boolean shouldForce) throws IOException + HttpSession session, IHierarchicalContentNode dirNode, boolean shouldForce) + throws IOException { assert dirNode.exists() && dirNode.isDirectory(); List<IHierarchicalContentNode> mainDataSets = @@ -396,7 +407,7 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet autoResolveRedirect(response, newRenderingContext); } else { - createPage(rendererFactory, response, dataSet, renderingContext, dirNode); + createPage(rendererFactory, response, dataSetCode, renderingContext, dirNode); } } @@ -418,14 +429,13 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet } private void createPage(IRendererFactory rendererFactory, HttpServletResponse response, - ExternalData dataSet, RenderingContext renderingContext, - IHierarchicalContentNode dirNode) throws IOException + String dataSetCode, RenderingContext renderingContext, IHierarchicalContentNode dirNode) + throws IOException { assert dirNode.isDirectory(); if (operationLog.isInfoEnabled()) { - operationLog.info(String.format("For data set '%s' show directory '%s'", - dataSet.getCode(), + operationLog.info(String.format("For data set '%s' show directory '%s'", dataSetCode, (dirNode.getRelativePath() == null) ? "/" : dirNode.getRelativePath())); } IDirectoryRenderer directoryRenderer = @@ -515,40 +525,4 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet contentNode.getFileLength(), contentType, contentNode.getName()); } - private ExternalData getDataSet(String dataSetCode, String sessionIdOrNull, HttpSession session) - { - ExternalData dataset = tryToGetCachedDataSet(session, dataSetCode); - if (dataset != null) - { - return dataset; - } - ensureSessionIdSpecified(sessionIdOrNull); - ExternalData dataSet = tryGetDataSetFromServer(dataSetCode, sessionIdOrNull); - if (dataSet != null) - { - putDataSetToMap(session, dataSetCode, dataSet); - return dataSet; - } else - { - throw new UserFailureException("Unknown data set '" + dataSetCode + "'."); - } - } - - private ExternalData tryGetDataSetFromServer(String dataSetCode, String sessionIdOrNull) - { - IEncapsulatedOpenBISService dataSetService = applicationContext.getDataSetService(); - ExternalData dataSet = dataSetService.tryGetDataSet(sessionIdOrNull, dataSetCode); - if (operationLog.isInfoEnabled()) - { - String actionDesc = (dataSet != null) ? "obtained from" : "not found in"; - operationLog.info(String.format("Data set '%s' %s openBIS server.", dataSetCode, - actionDesc)); - } - return dataSet; - } - - private void putDataSetToMap(HttpSession session, String dataSetCode, ExternalData dataSet) - { - getDataSets(session).put(dataSetCode, dataSet); - } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java index 8ccf3ce9f3b73d2291f257c309d3ef03485c1677..84ea45dfc279707b45a1540740d07dec61552aaf 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java @@ -79,7 +79,9 @@ public class HierarchicalContentProvider implements IHierarchicalContentProvider ExternalData externalData = openbisService.tryGetDataSet(dataSetCode); if (externalData == null) { - throw new IllegalArgumentException("Unknown data set " + dataSetCode); + operationLog.error(String.format("Data set '%s' not found in openBIS server.", + dataSetCode)); + throw new IllegalArgumentException("Unknown data set: " + dataSetCode); } if (externalData.isContainer()) { diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java index f94427323f21b0ddb91f5ad3c28c8d1b03eb6e25..34128720cfe85a03b253924bd40b24b404e383b1 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java @@ -36,11 +36,12 @@ public interface IHierarchicalContentProvider /** * This is the only method that supports abstraction for virtual data sets. It needs to access - * openBIS DB first to retrieve information first. + * openBIS DB to retrieve information first. * * @return {@link IHierarchicalContent} for the specified data set + * @throws IllegalArgumentException if data set doesn't exist in openBIS DB */ - IHierarchicalContent asContent(String dataSetCode); + IHierarchicalContent asContent(String dataSetCode) throws IllegalArgumentException; /** * @return {@link IHierarchicalContent} for the specified data set diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DatasetLocationUtil.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DatasetLocationUtil.java index a925b91d98929d05c5814e54a6a2a426c2540754..a2029af4761dc1d522909b56ba339fc6cdc38005 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DatasetLocationUtil.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DatasetLocationUtil.java @@ -32,13 +32,14 @@ public class DatasetLocationUtil * * @throws UserFailureException if the dataset directory does not exist. */ - public static File getDatasetLocationPathCheckingIfExists(String dataSetCode, String shareId, + public static File getDatasetLocationPathCheckingIfExists(String dataSetCode, String shareId, DatabaseInstance databaseInstance, File storeDir) { String databaseUuid = databaseInstance.getUuid(); File dataSetRootDirectory = - DatasetLocationUtil.getDatasetLocationPath(storeDir, dataSetCode, shareId, databaseUuid); + DatasetLocationUtil.getDatasetLocationPath(storeDir, dataSetCode, shareId, + databaseUuid); if (dataSetRootDirectory.exists() == false) { throw new UserFailureException("Data set '" + dataSetCode + "' not found in the store."); @@ -47,14 +48,14 @@ public class DatasetLocationUtil } /** Creates a location where a dataset can be found in a specified base directory. */ - public static File getDatasetLocationPath(final File baseDir, String dataSetCode, String shareId, - final String instanceUUID) + public static File getDatasetLocationPath(final File baseDir, String dataSetCode, + String shareId, final String instanceUUID) { return new File(baseDir, getDatasetRelativeLocationPath(dataSetCode, shareId, instanceUUID)); } /** returns path relative to the store */ - public static String getDatasetRelativeLocationPath(String dataSetCode, String shareId, + public static String getDatasetRelativeLocationPath(String dataSetCode, String shareId, final String instanceUUID) { final File instanceDir = new File(new File(shareId), instanceUUID); @@ -63,6 +64,15 @@ public class DatasetLocationUtil return datasetDir.getPath(); } + /** returns location (path relative to the share) */ + public static String getDatasetLocationPath(String dataSetCode, final String instanceUUID) + { + final File instanceDir = new File(instanceUUID); + final File shardingDir = createShardingDir(instanceDir, dataSetCode); + final File datasetDir = new File(shardingDir, dataSetCode); + return datasetDir.getPath(); + } + // In order not to overwhelm the file system implementation, we won't use a completely flat // hierarchy, but instead a structure called 'data sharding'. 'Data sharding' ensures that there // are no directories with an extremely large number of data sets. diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java index e3adcd92dba33525c6712a22066632cc9e6657c5..91c210fb144d5971d4b48758715e7dec00f17bd3 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java @@ -59,9 +59,10 @@ public class SegmentedStoreUtils private static final String RSYNC_EXEC = "rsync"; private static final Pattern SHARE_ID_PATTERN = Pattern.compile("[0-9]+"); - - @Private static final String SPEED_FILE = "speed"; - + + @Private + static final String SPEED_FILE = "speed"; + private static final Comparator<Share> SHARE_COMPARATOR = new Comparator<Share>() { public int compare(Share o1, Share o2) @@ -165,8 +166,9 @@ public class SegmentedStoreUtils Set<String> incomingShares, IFreeSpaceProvider freeSpaceProvider, IEncapsulatedOpenBISService service, ISimpleLogger log) { - List<Share> shares = getDataSetsPerShare(storeRoot, dataStoreCode, freeSpaceProvider, service, log, - SystemTimeProvider.SYSTEM_TIME_PROVIDER); + List<Share> shares = + getDataSetsPerShare(storeRoot, dataStoreCode, freeSpaceProvider, service, log, + SystemTimeProvider.SYSTEM_TIME_PROVIDER); for (Share share : shares) { share.setIncoming(incomingShares.contains(share.getShareId())); @@ -201,9 +203,10 @@ public class SegmentedStoreUtils log.log(LogLevel.INFO, "Calculating size of " + dataSetInStore); long t0 = timeProvider.getTimeInMilliseconds(); long size = FileUtils.sizeOfDirectory(dataSetInStore); - log.log(LogLevel.INFO, dataSetInStore + " contains " + size - + " bytes (calculated in " - + (timeProvider.getTimeInMilliseconds() - t0) + " msec)"); + log.log(LogLevel.INFO, + dataSetInStore + " contains " + size + " bytes (calculated in " + + (timeProvider.getTimeInMilliseconds() - t0) + + " msec)"); service.updateShareIdAndSize(dataSetCode, shareId, size); dataSet.setDataSetSize(size); } @@ -271,7 +274,7 @@ public class SegmentedStoreUtils ExternalData dataSet = service.tryGetDataSet(dataSetCode); if (dataSet == null) { - throw new UserFailureException("Unknown data set " + dataSetCode); + throw new UserFailureException("Unknown data set: " + dataSetCode); } File oldShare = dataSetDirInStore.getParentFile().getParentFile().getParentFile().getParentFile() @@ -288,14 +291,13 @@ public class SegmentedStoreUtils } /** - * Deletes specified data set at specified location. This methods waits until any locks - * on the specified data set have been released. + * Deletes specified data set at specified location. This methods waits until any locks on the + * specified data set have been released. */ public static void deleteDataSet(final String dataSetCode, final File dataSetDirInStore, final IShareIdManager shareIdManager, final ISimpleLogger logger) { - logger.log(LogLevel.INFO, "Await for data set " + dataSetCode - + " to be unlocked."); + logger.log(LogLevel.INFO, "Await for data set " + dataSetCode + " to be unlocked."); shareIdManager.await(dataSetCode); logger.log(LogLevel.INFO, "Start deleting data set " + dataSetCode + " at " + dataSetDirInStore); 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 ecde6b4ed4cfa359d8a1d43767ca5af49494ffb6..4f1feed2ac495918d85eac42227c9887b4e1c28d 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 @@ -52,15 +52,17 @@ import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; import ch.systemsx.cisd.base.utilities.OSUtilities; import ch.systemsx.cisd.common.filesystem.FileUtilities; import ch.systemsx.cisd.common.io.DefaultFileBasedHierarchicalContentFactory; +import ch.systemsx.cisd.common.io.IHierarchicalContentFactory; import ch.systemsx.cisd.common.logging.BufferedAppender; import ch.systemsx.cisd.common.test.AssertionUtil; +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.MockDataSetDirectoryProvider; import ch.systemsx.cisd.openbis.dss.generic.shared.HierarchicalContentProvider; +import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider; import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider; import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager; import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DatasetLocationUtil; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType; @@ -71,8 +73,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE; /** * @author Franz-Josef Elmer */ -// FIXME use mocks for abstraction -@Test(groups = "broken") +@Test public class DatasetDownloadServletTest { private static final String REQUEST_URI_PREFIX = "/" + DATA_STORE_SERVER_WEB_APPLICATION_NAME @@ -83,10 +84,16 @@ public class DatasetDownloadServletTest private static final String LOGGER_NAME = "OPERATION.AbstractDatasetDownloadServlet"; + private static final String CONTENT_PROVIDER_LOGGER_NAME = + "OPERATION.HierarchicalContentProvider"; + private static final String LOG_INFO = "INFO " + LOGGER_NAME + " - "; private static final String LOG_ERROR = "ERROR " + LOGGER_NAME + " - "; + private static final String CONTENT_PROVIDER_LOG_ERROR = "ERROR " + + CONTENT_PROVIDER_LOGGER_NAME + " - "; + private static final String DATABASE_INSTANCE_UUID = "db-uuid"; private static final File TEST_FOLDER = new File("targets/unit-test/store"); @@ -137,12 +144,12 @@ public class DatasetDownloadServletTest private HttpServletResponse response; - private IEncapsulatedOpenBISService dataSetService; - private HttpSession httpSession; private IShareIdManager shareIdManager; + private IEncapsulatedOpenBISService openbisService; + private IHierarchicalContentProvider hierarchicalContentProvider; @BeforeMethod @@ -153,12 +160,16 @@ public class DatasetDownloadServletTest context = new Mockery(); request = context.mock(HttpServletRequest.class); response = context.mock(HttpServletResponse.class); - dataSetService = context.mock(IEncapsulatedOpenBISService.class); shareIdManager = context.mock(IShareIdManager.class); - // test with HierarchicalContentFactory to actually access files + openbisService = context.mock(IEncapsulatedOpenBISService.class); + // test with DefaultFileBasedHierarchicalContentFactory to actually access files + final IHierarchicalContentFactory fileBasedContentFactory = + new DefaultFileBasedHierarchicalContentFactory(); + final IDataSetDirectoryProvider dummyDirectoryProvider = + new MockDataSetDirectoryProvider(TEST_FOLDER, DEFAULT_SHARE_ID, shareIdManager); hierarchicalContentProvider = - new HierarchicalContentProvider(null, null, - new DefaultFileBasedHierarchicalContentFactory()); + new HierarchicalContentProvider(openbisService, dummyDirectoryProvider, + fileBasedContentFactory); httpSession = context.mock(HttpSession.class); TEST_FOLDER.mkdirs(); EXAMPLE_DATA_SET_FOLDER.mkdirs(); @@ -187,16 +198,17 @@ public class DatasetDownloadServletTest assertEquals("text/plain", DatasetDownloadServlet.getMimeType("filewithoutext", false)); } - @Test() + @Test public void testInitialDoGet() throws Exception { final StringWriter writer = new StringWriter(); final ExternalData externalData = createExternalData(); prepareParseRequestURL(); + prepareCheckDatasetAccess(); prepareForObtainingDataSetFromServer(externalData); + prepareLocking(); prepareForGettingDataSetFromSession(externalData, ""); prepareForCreatingHTML(writer); - prepareListDataSetsByCode(); DatasetDownloadServlet servlet = createServlet(); servlet.doGet(request, response); @@ -229,8 +241,11 @@ public class DatasetDownloadServletTest + OSUtilities.LINE_SEPARATOR + "", writer.toString()); String normalizedLogContent = getNormalizedLogContent(); - assertContains(getSessionCreationLogMessage() + OSUtilities.LINE_SEPARATOR + LOG_INFO - + "Data set '1234-1' obtained from openBIS server.", normalizedLogContent); + // assertContains(getSessionCreationLogMessage() + OSUtilities.LINE_SEPARATOR + LOG_INFO + // + "Data set '1234-1' obtained from openBIS server.", normalizedLogContent); + // FIXME + // assertContains(getSessionCreationLogMessage() + OSUtilities.LINE_SEPARATOR + LOG_INFO + // + "Check access to the data set '1234-1' at openBIS server.", normalizedLogContent); assertContains(LOG_INFO + "For data set '1234-1' show directory '/'", normalizedLogContent); context.assertIsSatisfied(); @@ -268,8 +283,8 @@ public class DatasetDownloadServletTest final StringWriter writer = new StringWriter(); final ExternalData externalData = createExternalData(); prepareParseRequestURL(); - prepareCreateSession(); - prepareListDataSetsByCode(); + prepareForObtainingDataSetFromServer(externalData); + prepareLocking(); context.checking(new Expectations() { { @@ -305,9 +320,7 @@ public class DatasetDownloadServletTest { final StringWriter writer = new StringWriter(); prepareParseRequestURL(); - prepareCreateSession(); - prepareTryGetDataset(null); - prepareListDataSetsByCode(); + prepareForObtainingDataSetFromServer(null); context.checking(new Expectations() { { @@ -323,12 +336,13 @@ public class DatasetDownloadServletTest DatasetDownloadServlet servlet = createServlet(); servlet.doGet(request, response); assertContains("<html><body><h1>Error</h1>" + OSUtilities.LINE_SEPARATOR - + "Unknown data set '1234-1'." + OSUtilities.LINE_SEPARATOR + "</body></html>" + + "Unknown data set: 1234-1" + OSUtilities.LINE_SEPARATOR + "</body></html>" + OSUtilities.LINE_SEPARATOR, writer.toString()); String logContent = logRecorder.getLogContent(); - assertContains(getSessionCreationLogMessage() + OSUtilities.LINE_SEPARATOR + LOG_INFO - + "Data set '1234-1' not found in openBIS server." + OSUtilities.LINE_SEPARATOR - + LOG_INFO + "User failure: Unknown data set '1234-1'.", logContent); + assertContains(getSessionCreationLogMessage() + OSUtilities.LINE_SEPARATOR + + CONTENT_PROVIDER_LOG_ERROR + "Data set '1234-1' not found in openBIS server." + + OSUtilities.LINE_SEPARATOR + LOG_INFO + "User failure: Unknown data set: 1234-1", + logContent); context.assertIsSatisfied(); } @@ -339,12 +353,14 @@ public class DatasetDownloadServletTest + "Creating a new session with the following parameters: [sessionID=AV76CF] Session Timeout: 120 sec"; } - @Test() + @Test public void testDoGetSubFolder() throws Exception { final StringWriter writer = new StringWriter(); final ExternalData externalData = createExternalData(); - prepareListDataSetsByCode(); + prepareCheckDatasetAccess(); + prepareForObtainingDataSetFromServer(externalData); + prepareLocking(); context.checking(new Expectations() { { @@ -353,11 +369,6 @@ public class DatasetDownloadServletTest allowing(request).getSession(false); will(returnValue(httpSession)); - DatabaseInstance databaseInstance = new DatabaseInstance(); - databaseInstance.setUuid(DATABASE_INSTANCE_UUID); - getSessionAttribute(this, DatasetDownloadServlet.DATABASE_INSTANCE_SESSION_KEY, - databaseInstance); - prepareForGettingDataSetFromSession(this, externalData, ESCAPED_EXAMPLE_DATA_SET_SUB_FOLDER_NAME); } @@ -369,7 +380,7 @@ public class DatasetDownloadServletTest assertEquals( "<html><head><style type='text/css'> * { margin: 3px; }html { height: 100%; }body { height: 100%; font-family: verdana, tahoma, helvetica; font-size: 11px; text-align:left; }h1 { text-align: center; padding: 1em; color: #1E4E8F;}.td_hd { border: 1px solid #FFFFFF; padding 3px; background-color: #DDDDDD; height: 1.5em; }.div_hd { background-color: #1E4E8F; color: white; font-weight: bold; padding: 3px; }table { border-collapse: collapse; padding: 1em; }tr, td { font-family: verdana, tahoma, helvetica; font-size: 11px; }.td_file { font-family: verdana, tahoma, helvetica; font-size: 11px; height: 1.5em }.wrapper { min-height: 100%; height: auto !important; height: 100%; margin: 0em auto -4em; }.footer { height: 4em; text-align: center; }</style></head><body><table> <tr><td class='td_hd'>Folder:</td><td>+ s % ! # @</td></tr>" + OSUtilities.LINE_SEPARATOR - + "<tr><td class='td_file'><a href='/datastore_server/1234-1/?mode=simpleHtml'>..</td><td></td></tr>" + + "<tr><td class='td_file'><a href='/datastore_server/1234-1/?mode=simpleHtml&sessionID=AV76CF'>..</td><td></td></tr>" + OSUtilities.LINE_SEPARATOR + "</table> </div> </body></html>" + OSUtilities.LINE_SEPARATOR, writer.toString()); @@ -385,10 +396,11 @@ public class DatasetDownloadServletTest final ExternalData externalData = createExternalData(); final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - prepareCreateSession(); - prepareCheckDatasetAccess(); prepareParseRequestURL(); - prepareListDataSetsByCode(); + prepareFullCheckDatasetAccess(); + prepareForObtainingDataSetFromServer(externalData); + prepareLocking(); + context.checking(new Expectations() { { @@ -429,9 +441,10 @@ public class DatasetDownloadServletTest BufferedImage image = new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB); ImageIO.write(image, "png", EXAMPLE_FILE); prepareParseRequestURLForThumbnail(100, 50); - prepareCreateSession(); - prepareCheckDatasetAccess(); - prepareListDataSetsByCode(); + final ExternalData externalData = createExternalData(); + prepareFullCheckDatasetAccess(); + prepareForObtainingDataSetFromServer(externalData); + prepareLocking(); final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); context.checking(new Expectations() { @@ -479,8 +492,8 @@ public class DatasetDownloadServletTest final StringWriter writer = new StringWriter(); final ExternalData externalData = createExternalData(); prepareParseRequestURL(); - prepareCreateSession(); - prepareListDataSetsByCode(); + prepareForObtainingDataSetFromServer(externalData); + prepareLocking(); context.checking(new Expectations() { { @@ -697,14 +710,6 @@ public class DatasetDownloadServletTest will(Expectations.returnValue(parameterNames.elements())); one(request).getParameter(Utils.SESSION_ID_PARAM); will(returnValue(EXAMPLE_SESSION_ID)); - - DatabaseInstance databaseInstance = new DatabaseInstance(); - databaseInstance.setUuid(DATABASE_INSTANCE_UUID); - one(dataSetService).getHomeDatabaseInstance(); - will(returnValue(databaseInstance)); - checkAndSetAttribute(this, - DatasetDownloadServlet.DATABASE_INSTANCE_SESSION_KEY, databaseInstance); - } }); } @@ -714,28 +719,28 @@ public class DatasetDownloadServletTest context.checking(new Expectations() { { - HashMap<String, ExternalDataPE> map = new HashMap<String, ExternalDataPE>(); - checkAndSetAttribute(this, DatasetDownloadServlet.DATA_SET_SESSION_KEY, map); + // FIXME temporary + // HashMap<String, ExternalDataPE> map = new HashMap<String, ExternalDataPE>(); + // checkAndSetAttribute(this, DatasetDownloadServlet.DATA_SET_SESSION_KEY, map); - one(dataSetService).tryGetDataSet(EXAMPLE_SESSION_ID, EXAMPLE_DATA_SET_CODE); + one(openbisService).tryGetDataSet(EXAMPLE_DATA_SET_CODE); will(returnValue(externalData)); } }); } - private void prepareListDataSetsByCode() + private void prepareLocking() { context.checking(new Expectations() { { one(shareIdManager).lock(EXAMPLE_DATA_SET_CODE); - one(shareIdManager).getShareId(EXAMPLE_DATA_SET_CODE); - will(returnValue(DEFAULT_SHARE_ID)); + one(shareIdManager).releaseLock(EXAMPLE_DATA_SET_CODE); } }); } - private void prepareCheckDatasetAccess() + private void prepareFullCheckDatasetAccess() { context.checking(new Expectations() { @@ -747,7 +752,7 @@ public class DatasetDownloadServletTest checkAndSetAttribute(this, DatasetDownloadServlet.DATA_SET_ACCESS_SESSION_KEY, map); - one(dataSetService).checkDataSetAccess(EXAMPLE_SESSION_ID, + one(openbisService).checkDataSetAccess(EXAMPLE_SESSION_ID, EXAMPLE_DATA_SET_CODE); getSessionAttribute(this, DatasetDownloadServlet.DATA_SET_ACCESS_SESSION_KEY, @@ -756,6 +761,19 @@ public class DatasetDownloadServletTest }); } + private void prepareCheckDatasetAccess() + { + context.checking(new Expectations() + { + { + // FIXME + Map<String, Boolean> map = new HashMap<String, Boolean>(); + checkAndSetAttribute(this, DatasetDownloadServlet.DATA_SET_ACCESS_SESSION_KEY, + map); + } + }); + } + private void checkAndSetAttribute(Expectations exp, String attributeKey, Object newValue) { getSessionAttribute(exp, attributeKey, null); @@ -797,8 +815,9 @@ public class DatasetDownloadServletTest LocatorType locatorType = new LocatorType(); locatorType.setCode(LocatorType.DEFAULT_LOCATOR_TYPE_CODE); externalData.setLocatorType(locatorType); - externalData.setLocation(DatasetLocationUtil.getDatasetRelativeLocationPath( - EXAMPLE_DATA_SET_CODE, DEFAULT_SHARE_ID, DATABASE_INSTANCE_UUID)); + externalData.setShareId(DEFAULT_SHARE_ID); + externalData.setLocation(DatasetLocationUtil.getDatasetLocationPath(EXAMPLE_DATA_SET_CODE, + DATABASE_INSTANCE_UUID)); return externalData; } @@ -820,7 +839,7 @@ public class DatasetDownloadServletTest properties.setProperty(ConfigParameters.KEYSTORE_KEY_PASSWORD_KEY, "y"); properties.setProperty(ConfigParameters.DOWNLOAD_URL, "http://localhost:8080"); ConfigParameters configParameters = new ConfigParameters(properties); - return new DatasetDownloadServlet(new ApplicationContext(dataSetService, shareIdManager, + return new DatasetDownloadServlet(new ApplicationContext(openbisService, shareIdManager, hierarchicalContentProvider, configParameters)); } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java index c781cce2bcf14af458d1bfb1050a3862b7b2278b..142afe1a52394759e88c09c4fe49ad8eb3133bc9 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java @@ -28,10 +28,18 @@ public final class MockDataSetDirectoryProvider implements IDataSetDirectoryProv private final String shareID; + private final IShareIdManager shareIdManager; + public MockDataSetDirectoryProvider(File store, String shareID) + { + this(store, shareID, null); + } + + public MockDataSetDirectoryProvider(File store, String shareID, IShareIdManager shareIdManager) { this.store = store; this.shareID = shareID; + this.shareIdManager = shareIdManager; } public File getStoreRoot() @@ -46,6 +54,6 @@ public final class MockDataSetDirectoryProvider implements IDataSetDirectoryProv public IShareIdManager getShareIdManager() { - return null; + return shareIdManager; } } \ No newline at end of file diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProviderTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProviderTest.java index 9af0daa7a54edc3cb60bb69a541701f07c38be12..2f581e5fb97e57fb60a58a359357e4a8f21251aa 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProviderTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProviderTest.java @@ -138,7 +138,7 @@ public class HierarchicalContentProviderTest extends AssertJUnit fail("expected IllegalArgumentException"); } catch (IllegalArgumentException ex) { - assertEquals("Unknown data set " + dataSetCode, ex.getMessage()); + assertEquals("Unknown data set: " + dataSetCode, ex.getMessage()); } context.assertIsSatisfied(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java index ab0242ffbbe3cbf329c43c93a8b8b37850f78be5..6245b3c47fb809a787852822477cafbb66cc479a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java @@ -705,7 +705,7 @@ public class ETLService extends AbstractCommonServer<IETLService> implements IET DataPE dataSet = dataSetDAO.tryToFindFullDataSetByCode(dataSetCode, false, false); if (dataSet == null) { - throw new UserFailureException("Unknown data set " + dataSetCode); + throw new UserFailureException("Unknown data set: " + dataSetCode); } ExternalDataPE externalData = dataSet.tryAsExternalData(); if (externalData == null) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/DataStoreServerBasedDataSourceProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/DataStoreServerBasedDataSourceProvider.java index 135cb740adc297cbe86cf099ecd0241539733740..9277d2dda1d53fa3eceec9d66b91cbfc80cf5750 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/DataStoreServerBasedDataSourceProvider.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/DataStoreServerBasedDataSourceProvider.java @@ -81,7 +81,7 @@ public class DataStoreServerBasedDataSourceProvider implements IDataSourceProvid DataPE dataSet = daoFactory.getDataDAO().tryToFindDataSetByCode(dataSetCode); if (dataSet == null) { - throw new UserFailureException("Unknown data set " + dataSetCode); + throw new UserFailureException("Unknown data set: " + dataSetCode); } return getDataSourceByDataStoreServerCode(dataSet.getDataStore().getCode(), technology); }