diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetCommandExecutor.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetCommandExecutor.java index 9acc523603c22fb16fc3f5183cc90da691768d67..e417992d562287b5165b2e8e99f1dfb100c8adaf 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetCommandExecutor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetCommandExecutor.java @@ -146,11 +146,12 @@ class DataSetCommandExecutor implements IDataSetCommandExecutor public void scheduleProcessDatasets(IProcessingPluginTask task, List<DatasetDescription> datasets, Map<String, String> parameterBindings, - String userEmailOrNull, DatastoreServiceDescription serviceDescription, + String userEmailOrNull, String sessionTokenOrNull, + DatastoreServiceDescription serviceDescription, MailClientParameters mailClientParameters) { scheduleCommand(new ProcessDatasetsCommand(task, datasets, parameterBindings, - userEmailOrNull, serviceDescription, mailClientParameters)); + userEmailOrNull, sessionTokenOrNull, serviceDescription, mailClientParameters)); } private void scheduleCommand(IDataSetCommand command) diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java index c80a5242f03da052b6c15d15e6fa55140e85280f..578e20ed9a78895f6db1d544b33ef9485791f28c 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java @@ -179,7 +179,8 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic { operationLog.info("Command executor started."); } - getShareIdManager().isKnown(""); // initializes ShareIdManager: reading all share ids from the data base + getShareIdManager().isKnown(""); // initializes ShareIdManager: reading all share ids from + // the data base if (operationLog.isInfoEnabled()) { operationLog.info("Initialization finished."); @@ -293,8 +294,8 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic return new CIFEXRPCServiceFactory(cifexURL); } - public TableModel createReportFromDatasets(String sessionToken, String serviceKey, - List<DatasetDescription> datasets) + public TableModel createReportFromDatasets(String sessionToken, String userSessionToken, + String serviceKey, List<DatasetDescription> datasets) { sessionTokenManager.assertValidSessionToken(sessionToken); @@ -310,7 +311,7 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic { return task.createReport(datasets, new DataSetProcessingContext( new DataSetDirectoryProvider(storeRoot, manager), - new HashMap<String, String>(), null, null)); + new HashMap<String, String>(), null, null, userSessionToken)); } finally { @@ -318,7 +319,7 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic } } - public void processDatasets(String sessionToken, String serviceKey, + public void processDatasets(String sessionToken, String userSessionToken, String serviceKey, List<DatasetDescription> datasets, Map<String, String> parameterBindings, String userEmailOrNull) { @@ -330,7 +331,7 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic IProcessingPluginTask task = plugins.getPluginInstance(serviceKey); DatastoreServiceDescription pluginDescription = plugins.getPluginDescription(serviceKey); commandExecutor.scheduleProcessDatasets(task, datasets, parameterBindings, userEmailOrNull, - pluginDescription, mailClientParameters); + userSessionToken, pluginDescription, mailClientParameters); } public void unarchiveDatasets(String sessionToken, List<DatasetDescription> datasets, @@ -372,7 +373,7 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic DatastoreServiceDescription.processing(description, description, null, null); Map<String, String> parameterBindings = Collections.<String, String> emptyMap(); commandExecutor.scheduleProcessDatasets(processingTask, datasets, parameterBindings, - userEmailOrNull, pluginDescription, mailClientParameters); + userEmailOrNull, sessionToken, pluginDescription, mailClientParameters); } private static class ArchiveProcessingPluginTask implements IProcessingPluginTask diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java index 723c26c2a896c183757d8c4c3b4c43d44d8eb244..945fad6560ffb2ca72d1ee82237f8ed0e1fb88d7 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java @@ -84,8 +84,8 @@ class DataStoreServiceLogger implements IDataStoreService, IInitializable return 0; } - public List<String> getKnownDataSets(String sessionToken, List<DatasetDescription> dataSetLocations) - throws InvalidAuthenticationException + public List<String> getKnownDataSets(String sessionToken, + List<DatasetDescription> dataSetLocations) throws InvalidAuthenticationException { log("getKnownDataSets", "DATA_SETS(%s)", dataSetLocations); return null; @@ -109,20 +109,21 @@ class DataStoreServiceLogger implements IDataStoreService, IInitializable .toString().trim()); } - public TableModel createReportFromDatasets(String sessionToken, String serviceKey, - List<DatasetDescription> datasets) + public TableModel createReportFromDatasets(String sessionToken, String userSessionToken, + String serviceKey, List<DatasetDescription> datasets) { - log("createReportFromDatasets", "TASK_ID(%s) NO_OF_DATASETS(%s)", serviceKey, - datasets.size()); + log("createReportFromDatasets", "USER_SESSION(%s) TASK_ID(%s) NO_OF_DATASETS(%s)", + userSessionToken, serviceKey, datasets.size()); return null; } - public void processDatasets(String sessionToken, String serviceKey, + public void processDatasets(String sessionToken, String userSessionToken, String serviceKey, List<DatasetDescription> datasets, Map<String, String> parameterBindings, String userEmailOrNull) { - log("processDatasets", "TASK_ID(%s) NO_OF_DATASETS(%s) PARAMETERS(%s) USER_EMAIL(%s)", - serviceKey, datasets.size(), parameterBindings, userEmailOrNull); + log("processDatasets", + "USER_SESSION(%s) TASK_ID(%s) NO_OF_DATASETS(%s) PARAMETERS(%s) USER_EMAIL(%s)", + userSessionToken, serviceKey, datasets.size(), parameterBindings, userEmailOrNull); } public void unarchiveDatasets(String sessionToken, List<DatasetDescription> datasets, diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetImageOverviewServlet.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetImageOverviewServlet.java index 2482e11e0e9a81adec0f836aefa43b0322efd13d..0126ccb34f3391ac3ab270b4a93d17a4f5d47930 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetImageOverviewServlet.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetImageOverviewServlet.java @@ -131,6 +131,7 @@ public class DatasetImageOverviewServlet extends AbstractDatasetDownloadServlet private ResponseContentStream createImageResponse(HttpSession session, String datasetCode, String datasetTypeCode, ImageResolutionKind resolution) { + @SuppressWarnings("deprecation") File datasetRoot = createDataSetRootDirectory(datasetCode, session); IDatasetImageOverviewPlugin plugin = configuration.getDatasetImageOverviewPlugin(datasetTypeCode); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IDataSetCommandExecutor.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IDataSetCommandExecutor.java index bbe4781700bdca7a3352eae6d9daeaa2deb8e6b7..60bf90eba6fee6c6fe546c1fb39731251110d92f 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IDataSetCommandExecutor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IDataSetCommandExecutor.java @@ -63,16 +63,18 @@ public interface IDataSetCommandExecutor extends IDataSetDeleter String cifexAdminPasswordOrNull); /** - * Schedules the specified processing task with specified parameter bindings for provided datasets. + * Schedules the specified processing task with specified parameter bindings for provided + * datasets. * - * @param parameterBindings Contains at least the parameter {@link Constants#USER_PARAMETER} with - * the ID of the user who initiated processing. + * @param parameterBindings Contains at least the parameter {@link Constants#USER_PARAMETER} + * with the ID of the user who initiated processing. * @param userEmailOrNull Email of user who initiated processing and will get a message after * the processing is finished. It may be null if the user doesn't have email and no * message will be send in such case. + * @param sessionTokenOrNull The session token of the user that requested the processing. */ void scheduleProcessDatasets(IProcessingPluginTask task, List<DatasetDescription> datasets, Map<String, String> parameterBindings, String userEmailOrNull, - DatastoreServiceDescription serviceDescription, + String sessionTokenOrNull, DatastoreServiceDescription serviceDescription, MailClientParameters mailClientParameters); } \ No newline at end of file diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ProcessDatasetsCommand.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ProcessDatasetsCommand.java index 430ee2f90f1ea24f5cf9126b43b934bc9df82360..0962aaa9a1818c266684e623c6ad6e5b1e751bdf 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ProcessDatasetsCommand.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ProcessDatasetsCommand.java @@ -59,6 +59,8 @@ public class ProcessDatasetsCommand extends AbstractDataSetDescriptionBasedComma private final String userEmailOrNull; + private final String sessionTokenOrNull; + private final DatastoreServiceDescription serviceDescription; private MailClientParameters mailClientParameters; @@ -67,22 +69,24 @@ public class ProcessDatasetsCommand extends AbstractDataSetDescriptionBasedComma public ProcessDatasetsCommand(IProcessingPluginTask task, List<DatasetDescription> datasets, Map<String, String> parameterBindings, String userEmailOrNull, - DatastoreServiceDescription serviceDescription, + String sessionTokenOrNull, DatastoreServiceDescription serviceDescription, MailClientParameters mailClientParameters) { - this(task, datasets, parameterBindings, userEmailOrNull, serviceDescription, - new MailClient(mailClientParameters)); + this(task, datasets, parameterBindings, userEmailOrNull, sessionTokenOrNull, + serviceDescription, new MailClient(mailClientParameters)); this.mailClientParameters = mailClientParameters; } ProcessDatasetsCommand(IProcessingPluginTask task, List<DatasetDescription> datasets, Map<String, String> parameterBindings, String userEmailOrNull, - DatastoreServiceDescription serviceDescription, IMailClient mailClient) + String sessionTokenOrNull, DatastoreServiceDescription serviceDescription, + IMailClient mailClient) { super(datasets); this.task = task; this.parameterBindings = parameterBindings; this.userEmailOrNull = userEmailOrNull; + this.sessionTokenOrNull = sessionTokenOrNull; this.serviceDescription = serviceDescription; this.mailClient = mailClient; } @@ -153,7 +157,7 @@ public class ProcessDatasetsCommand extends AbstractDataSetDescriptionBasedComma { DataSetProcessingContext context = new DataSetProcessingContext(dataSetDirectoryProvider, parameterBindings, - proxyMailClient, userEmailOrNull); + proxyMailClient, userEmailOrNull, sessionTokenOrNull); processingStatusOrNull = task.process(dataSets, context); } catch (RuntimeException e) { diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISSessionHolder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISSessionHolder.java index 3263ba849293af3f163a4a8949eb9cb3802a28d8..3ce260e2de4aa9ccae0c08eb460c4dc9796478ac 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISSessionHolder.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISSessionHolder.java @@ -17,6 +17,9 @@ package ch.systemsx.cisd.openbis.dss.generic.server.openbisauth; /** + * A class that holds information about the openBIS session. It has the information necessary to + * connect to any of the openBIS APIs. + * * @author Kaloyan Enimanev */ public class OpenBISSessionHolder @@ -25,6 +28,17 @@ public class OpenBISSessionHolder private String dataStoreCode; + private String serverUrl; + + public String getServerUrl() + { + return serverUrl; + } + + public void setServerUrl(String serverUrl) + { + this.serverUrl = serverUrl; + } public String getDataStoreCode() { diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/IPluginScriptRunnerFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/IPluginScriptRunnerFactory.java index c0781268c48caec0c3e088fbc2ad1364f93c47e6..7a89415f5b970a6a159bd5141b6c9c32d5b64d4d 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/IPluginScriptRunnerFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/IPluginScriptRunnerFactory.java @@ -24,6 +24,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable; */ public interface IPluginScriptRunnerFactory extends ISerializable { + String getScriptPath(); + IReportingPluginScriptRunner createReportingPluginRunner(DataSetProcessingContext context); IProcessingPluginScriptRunner createProcessingPluginRunner(DataSetProcessingContext context); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedProcessingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedProcessingPlugin.java index 8b390f5ee3f6d6d96ebca5eacb4e59268e7074a0..19f22fe7cab10d101f9a52157d91dfd4e58be529 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedProcessingPlugin.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedProcessingPlugin.java @@ -52,14 +52,18 @@ public class JythonBasedProcessingPlugin implements IProcessingPluginTask transient IHierarchicalContentProvider hierarchicalContentProvider; + protected static String getScriptPathProperty(Properties properties) + { + return PropertyUtils.getMandatoryProperty(properties, SCRIPT_PATH); + } + public JythonBasedProcessingPlugin(Properties properties, File storeRoot) { - this(new PluginScriptRunnerFactory(PropertyUtils.getMandatoryProperty(properties, - SCRIPT_PATH)), null); + this(new PluginScriptRunnerFactory(getScriptPathProperty(properties)), null); } // for tests - JythonBasedProcessingPlugin(IPluginScriptRunnerFactory scriptRunnerFactory, + protected JythonBasedProcessingPlugin(IPluginScriptRunnerFactory scriptRunnerFactory, IHierarchicalContentProvider contentProvider) { this.scriptRunnerFactory = scriptRunnerFactory; diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedReportingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedReportingPlugin.java index 33c3a2ab4587d247205651bbe4a6d5ebfb1499cb..2ec8fc096210bdee29177a8ee8b14743841f9f6b 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedReportingPlugin.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedReportingPlugin.java @@ -22,10 +22,10 @@ import java.util.Properties; import org.apache.log4j.Logger; +import ch.systemsx.cisd.common.evaluator.EvaluatorException; import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.utilities.PropertyUtils; import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api.IDataSet; import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin; import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractTableModelReportingPlugin; @@ -45,23 +45,26 @@ public class JythonBasedReportingPlugin extends AbstractTableModelReportingPlugi { private static final long serialVersionUID = 1L; - private static final String SCRIPT_PATH = "script-path"; - private static final Logger notifyLog = LogFactory.getLogger(LogCategory.NOTIFY, AbstractDatastorePlugin.class); + protected static String getScriptPathProperty(Properties properties) + { + return JythonBasedProcessingPlugin.getScriptPathProperty(properties); + } + private final IPluginScriptRunnerFactory scriptRunnerFactory; transient IHierarchicalContentProvider hierarchicalContentProvider; public JythonBasedReportingPlugin(Properties properties, File storeRoot) { - this(properties, storeRoot, new PluginScriptRunnerFactory( - PropertyUtils.getMandatoryProperty(properties, SCRIPT_PATH)), null); + this(properties, storeRoot, + new PluginScriptRunnerFactory(getScriptPathProperty(properties)), null); } // for tests - JythonBasedReportingPlugin(Properties properties, File storeRoot, + protected JythonBasedReportingPlugin(Properties properties, File storeRoot, IPluginScriptRunnerFactory scriptRunnerFactory, IHierarchicalContentProvider contentProvider) { @@ -108,9 +111,25 @@ public class JythonBasedReportingPlugin extends AbstractTableModelReportingPlugi operationLog.info("Reporting done"); JythonBasedPluginUtils.closeContent(iDataSets); } + } catch (EvaluatorException ex) + { + StringBuilder errorString = new StringBuilder(); + errorString + .append("Could not run report script " + scriptRunnerFactory.getScriptPath()); + if (null != ex.getCause()) + { + notifyLog.error(errorString.toString(), ex.getCause()); + } else + { + notifyLog.error(errorString.toString(), ex); + } + throw new UserFailureException("Chosen plugin failed to create a report."); } catch (RuntimeException ex) { - notifyLog.error(ex.getMessage()); + StringBuilder errorString = new StringBuilder(); + errorString + .append("Could not run report script " + scriptRunnerFactory.getScriptPath()); + notifyLog.error(errorString.toString(), ex); throw new UserFailureException("Chosen plugin failed to create a report."); } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/PluginScriptRunnerFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/PluginScriptRunnerFactory.java index d9fbdd21f07fa5c314a6ba27393cbdf7ad89d710..36abacd746ed50d71b31e60a89c41398a182be42 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/PluginScriptRunnerFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/PluginScriptRunnerFactory.java @@ -39,7 +39,7 @@ import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.ISimpleTable /** * @author Piotr Buczek */ -class PluginScriptRunnerFactory implements IPluginScriptRunnerFactory +public class PluginScriptRunnerFactory implements IPluginScriptRunnerFactory { private static final long serialVersionUID = 1L; @@ -57,6 +57,7 @@ class PluginScriptRunnerFactory implements IPluginScriptRunnerFactory public PluginScriptRunnerFactory(String scriptPath) { this.scriptPath = scriptPath; + Evaluator.initialize(); } /** @@ -124,8 +125,8 @@ class PluginScriptRunnerFactory implements IPluginScriptRunnerFactory /** * Factory method for creating an IReportingPluginScriptRunner given the script as a string. */ - static IReportingPluginScriptRunner createReportingPluginRunnerFromScriptString( - String scriptString, DataSetProcessingContext context) + IReportingPluginScriptRunner createReportingPluginRunnerFromScriptString(String scriptString, + DataSetProcessingContext context) { return new ReportingPluginScriptRunner(createEvaluator(scriptString, context)); } @@ -133,13 +134,13 @@ class PluginScriptRunnerFactory implements IPluginScriptRunnerFactory /** * Factory method for creating an IProcessingPluginScriptRunner given the script as a string. */ - static IProcessingPluginScriptRunner createProcessingPluginRunnerFromScriptString( - String scriptString, DataSetProcessingContext context) + IProcessingPluginScriptRunner createProcessingPluginRunnerFromScriptString(String scriptString, + DataSetProcessingContext context) { return new ProcessingPluginScriptRunner(createEvaluator(scriptString, context)); } - private static Evaluator createEvaluator(String scriptString, DataSetProcessingContext context) + protected Evaluator createEvaluator(String scriptString, DataSetProcessingContext context) { final Evaluator evaluator = new Evaluator("", null, scriptString, false); evaluator.set(SEARCH_SERVICE_VARIABLE_NAME, createSearchService()); @@ -218,4 +219,9 @@ class PluginScriptRunnerFactory implements IPluginScriptRunnerFactory } + public String getScriptPath() + { + return scriptPath; + } + } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/ReportingBasedProcessingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/ReportingBasedProcessingPlugin.java index 0de1afdc1bb7d31c2cbb6e2122efe4624afa667f..8d2febc5808acffe36a25ff60d6b89c6fa34378d 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/ReportingBasedProcessingPlugin.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/ReportingBasedProcessingPlugin.java @@ -34,6 +34,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractTabl import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IProcessingPluginTask; import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; import ch.systemsx.cisd.openbis.dss.generic.shared.ProcessingStatus; +import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; @@ -53,8 +54,6 @@ public class ReportingBasedProcessingPlugin implements IProcessingPluginTask // keys of properties - private static final String SCRIPT_PATH = "script-path"; // the only mandatory property - private static final String EMAIL_SUBJECT = "email-subject"; private static final String EMAIL_BODY = "email-body"; @@ -71,6 +70,11 @@ public class ReportingBasedProcessingPlugin implements IProcessingPluginTask private static final boolean DEFAULT_SINGLE_REPORT_FOR_ALL = false; + protected static String getScriptPathProperty(Properties properties) + { + return JythonBasedProcessingPlugin.getScriptPathProperty(properties); + } + private final String emailSubject; private final String emailBody; @@ -83,9 +87,17 @@ public class ReportingBasedProcessingPlugin implements IProcessingPluginTask public ReportingBasedProcessingPlugin(Properties properties, File storeRoot) { - this.scriptRunnerFactory = - new PluginScriptRunnerFactory(PropertyUtils.getMandatoryProperty(properties, - SCRIPT_PATH)); + this(new PluginScriptRunnerFactory(getScriptPathProperty(properties)), properties, + storeRoot); + } + + /** + * Internal constructor for use by subclasses. + */ + protected ReportingBasedProcessingPlugin(IPluginScriptRunnerFactory scriptRunnerFactory, + Properties properties, File storeRoot) + { + this.scriptRunnerFactory = scriptRunnerFactory; this.singleReport = PropertyUtils.getBoolean(properties, SINGLE_REPORT, DEFAULT_SINGLE_REPORT_FOR_ALL); this.emailSubject = @@ -144,8 +156,8 @@ public class ReportingBasedProcessingPlugin implements IProcessingPluginTask public TableModel createTableModel(List<DatasetDescription> dataSets, DataSetProcessingContext context) { - return JythonBasedReportingPlugin - .createReport(dataSets, context, scriptRunnerFactory, null); + return JythonBasedReportingPlugin.createReport(dataSets, context, scriptRunnerFactory, + ServiceProvider.getHierarchicalContentProvider()); } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java index aacfdac3678540a1b7d2c14c673e3f5d729cb57c..380e9e3d94af19e1724be2dd64dc5cb0df9f77be 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java @@ -23,7 +23,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IProcessingPlug /** * Context for processing data sets by a {@link IProcessingPluginTask}. - * + * * @author Franz-Josef Elmer */ public class DataSetProcessingContext @@ -36,17 +36,31 @@ public class DataSetProcessingContext private final IDataSetDirectoryProvider directoryProvider; + private final String sessionTokenOrNull; + /** * Creates an instance for specified directory provider, parameter bindings, e-mail client, and - * optional user e-mail address. + * optional user e-mail address and sessionToken. */ public DataSetProcessingContext(IDataSetDirectoryProvider directoryProvider, Map<String, String> parameterBindings, IMailClient mailClient, String userEmailOrNull) + { + this(directoryProvider, parameterBindings, mailClient, userEmailOrNull, null); + } + + /** + * Creates an instance for specified directory provider, parameter bindings, e-mail client, and + * optional user e-mail address and sessionToken. + */ + public DataSetProcessingContext(IDataSetDirectoryProvider directoryProvider, + Map<String, String> parameterBindings, IMailClient mailClient, String userEmailOrNull, + String sessionTokenOrNull) { this.directoryProvider = directoryProvider; this.parameterBindings = parameterBindings; this.mailClient = mailClient; this.userEmailOrNull = userEmailOrNull; + this.sessionTokenOrNull = sessionTokenOrNull; } public IDataSetDirectoryProvider getDirectoryProvider() @@ -68,4 +82,9 @@ public class DataSetProcessingContext { return userEmailOrNull; } + + public String trySessionToken() + { + return sessionTokenOrNull; + } } diff --git a/datastore_server/source/java/dssApplicationContext.xml b/datastore_server/source/java/dssApplicationContext.xml index 2c07fc869d6f02f62a95219379b09566227a3fde..71e4cc80850fc5da0644a02d4d799e1bef2e38f6 100644 --- a/datastore_server/source/java/dssApplicationContext.xml +++ b/datastore_server/source/java/dssApplicationContext.xml @@ -35,6 +35,7 @@ <bean id="sessionHolder" class="ch.systemsx.cisd.openbis.dss.generic.server.openbisauth.OpenBISSessionHolder"> <property name="dataStoreCode" value="${data-store-server-code}"/> + <property name="serverUrl" value="${server-url}"/> </bean> <bean id="reauthenticateInterceptor" class="ch.systemsx.cisd.openbis.dss.generic.server.openbisauth.OpenBISAuthenticationInterceptor"> diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ProcessDatasetsCommandTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ProcessDatasetsCommandTest.java index aeaf67ca8d07b1d7d605e852d5d83a373d1efd1d..8e84a77ac76721ffa223cf1421dd9ccb25bfa8c3 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ProcessDatasetsCommandTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ProcessDatasetsCommandTest.java @@ -87,7 +87,7 @@ public class ProcessDatasetsCommandTest extends AssertJUnit parameterBindings = new HashMap<String, String>(); dataSets = Arrays.<DatasetDescription> asList(ds1, ds2); command = - new ProcessDatasetsCommand(task, dataSets, parameterBindings, E_MAIL, + new ProcessDatasetsCommand(task, dataSets, parameterBindings, E_MAIL, null, DatastoreServiceDescription.processing("MY_TASK", EXAMPLE_TASK_LABEL, new String[0], "DSS1"), mailClient); subjectRecorder = new RecordingMatcher<String>(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java index caa7470515686168799e849e18dc40a3d5fa3505..170707cc51d3ea5f7c6a69e91f8c260dbcfa784c 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java @@ -551,9 +551,10 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements } List<DatasetDescription> locations = loadAvailableDatasetDescriptions(datasetCodes); String sessionToken = dataStore.getSessionToken(); + String userSessionToken = session.getSessionToken(); parameterBindings.put(Constants.USER_PARAMETER, session.tryGetPerson().getUserId()); - service.processDatasets(sessionToken, datastoreServiceKey, locations, parameterBindings, - tryGetLoggedUserEmail()); + service.processDatasets(sessionToken, userSessionToken, datastoreServiceKey, locations, + parameterBindings, tryGetLoggedUserEmail()); } private String tryGetLoggedUserEmail() @@ -579,7 +580,9 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements } List<DatasetDescription> locations = loadAvailableDatasetDescriptions(datasetCodes); String sessionToken = dataStore.getSessionToken(); - return service.createReportFromDatasets(sessionToken, datastoreServiceKey, locations); + String userSessionToken = session.getSessionToken(); + return service.createReportFromDatasets(sessionToken, userSessionToken, + datastoreServiceKey, locations); } private List<DatasetDescription> loadAvailableDatasetDescriptions(List<String> dataSetCodes) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IDataStoreService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IDataStoreService.java index 8fcce253dfca48b9914b9db178406157cfc6500a..16274c3c277941bec98b0b21c23b189fa11f2091 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IDataStoreService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IDataStoreService.java @@ -78,20 +78,21 @@ public interface IDataStoreService DataSetUploadContext context) throws InvalidAuthenticationException; /** Runs the reporting task with the specified id for provided datasets */ - public TableModel createReportFromDatasets(String sessionToken, String serviceKey, - List<DatasetDescription> datasets); + public TableModel createReportFromDatasets(String sessionToken, String userSessionToken, + String serviceKey, List<DatasetDescription> datasets); /** * Schedules the processing task with the specified id for provided datasets and specified * parameter bindings. * + * @param userSessionToken The session token of the user that initiated the processing. * @param parameterBindings Contains at least the parameter {@link Constants#USER_PARAMETER} * with the ID of the user who initiated processing. * @param userEmailOrNull Email of user who initiated processing and will get a message after * the processing is finished. It may be null if the user doesn't have email and no * message will be send in such case. */ - public void processDatasets(String sessionToken, String serviceKey, + public void processDatasets(String sessionToken, String userSessionToken, String serviceKey, List<DatasetDescription> datasets, Map<String, String> parameterBindings, String userEmailOrNull); diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningJythonBasedProcessingPlugin.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningJythonBasedProcessingPlugin.java new file mode 100644 index 0000000000000000000000000000000000000000..528ba994f26e7f2bfb9d05b11edbe42b63ddf9d2 --- /dev/null +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningJythonBasedProcessingPlugin.java @@ -0,0 +1,59 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * 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 ch.systemsx.cisd.openbis.dss.screening.server.plugins.jython; + +import java.io.File; +import java.util.Properties; + +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.IPluginScriptRunnerFactory; +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonBasedProcessingPlugin; +import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider; + +/** + * A version of the {@link JythonBasedProcessingPlugin} with extra support for screening. + * + * @author Chandrasekhar Ramakrishnan + */ +public class ScreeningJythonBasedProcessingPlugin extends JythonBasedProcessingPlugin +{ + + private static final long serialVersionUID = 1L; + + /** + * Public constructor. + * + * @param properties + * @param storeRoot + */ + public ScreeningJythonBasedProcessingPlugin(Properties properties, File storeRoot) + { + this(new ScreeningPluginScriptRunnerFactory(getScriptPathProperty(properties)), null); + } + + /** + * Constructor for tests. + * + * @param scriptRunnerFactory + * @param contentProvider + */ + ScreeningJythonBasedProcessingPlugin(IPluginScriptRunnerFactory scriptRunnerFactory, + IHierarchicalContentProvider contentProvider) + { + super(scriptRunnerFactory, contentProvider); + } + +} diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningJythonBasedReportingPlugin.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningJythonBasedReportingPlugin.java new file mode 100644 index 0000000000000000000000000000000000000000..57fd993f2bb53dc5163dda811060b1c661ab5e20 --- /dev/null +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningJythonBasedReportingPlugin.java @@ -0,0 +1,63 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * 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 ch.systemsx.cisd.openbis.dss.screening.server.plugins.jython; + +import java.io.File; +import java.util.Properties; + +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.IPluginScriptRunnerFactory; +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonBasedReportingPlugin; +import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider; + +/** + * A version of the {@link JythonBasedReportingPlugin} with extra support for screening. + * + * @author Chandrasekhar Ramakrishnan + */ +public class ScreeningJythonBasedReportingPlugin extends JythonBasedReportingPlugin +{ + + private static final long serialVersionUID = 1L; + + /** + * Public constructor. + * + * @param properties + * @param storeRoot + */ + public ScreeningJythonBasedReportingPlugin(Properties properties, File storeRoot) + { + this(properties, storeRoot, new ScreeningPluginScriptRunnerFactory( + getScriptPathProperty(properties)), null); + } + + /** + * Constructor for tests. + * + * @param properties + * @param storeRoot + * @param scriptRunnerFactory + * @param contentProvider + */ + public ScreeningJythonBasedReportingPlugin(Properties properties, File storeRoot, + IPluginScriptRunnerFactory scriptRunnerFactory, + IHierarchicalContentProvider contentProvider) + { + super(properties, storeRoot, scriptRunnerFactory, contentProvider); + } + +} diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningPluginScriptRunnerFactory.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningPluginScriptRunnerFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..eb7e4f3016dbb4888b4bd5d66c2a042568ca5e71 --- /dev/null +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningPluginScriptRunnerFactory.java @@ -0,0 +1,66 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * 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 ch.systemsx.cisd.openbis.dss.screening.server.plugins.jython; + +import org.springframework.beans.factory.BeanFactory; + +import ch.systemsx.cisd.common.evaluator.Evaluator; +import ch.systemsx.cisd.openbis.dss.generic.server.openbisauth.OpenBISSessionHolder; +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.PluginScriptRunnerFactory; +import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; +import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; +import ch.systemsx.cisd.openbis.plugin.screening.client.api.v1.IScreeningOpenbisServiceFacade; +import ch.systemsx.cisd.openbis.plugin.screening.client.api.v1.ScreeningOpenbisServiceFacadeFactory; + +/** + * A version of the {@link PluginScriptRunnerFactory} with extra support for screening. + * + * @author Chandrasekhar Ramakrishnan + */ +public class ScreeningPluginScriptRunnerFactory extends PluginScriptRunnerFactory +{ + private static final long serialVersionUID = 1L; + + private final static String SCREENING_FACADE_VARIABLE_NAME = "screeningFacade"; + + /** + * Public constructor + * + * @param scriptPath + */ + public ScreeningPluginScriptRunnerFactory(String scriptPath) + { + super(scriptPath); + } + + @Override + protected Evaluator createEvaluator(String scriptString, DataSetProcessingContext context) + { + Evaluator evaluator = super.createEvaluator(scriptString, context); + evaluator.set(SCREENING_FACADE_VARIABLE_NAME, createScreeningFacade(context)); + return evaluator; + } + + private IScreeningOpenbisServiceFacade createScreeningFacade(DataSetProcessingContext context) + { + BeanFactory applicationContext = ServiceProvider.getApplicationContext(); + OpenBISSessionHolder sessionContextHolder = + (OpenBISSessionHolder) applicationContext.getBean("sessionHolder"); + return ScreeningOpenbisServiceFacadeFactory.tryCreate(context.trySessionToken(), + sessionContextHolder.getServerUrl()); + } +} diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningReportingBasedProcessingPlugin.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningReportingBasedProcessingPlugin.java new file mode 100644 index 0000000000000000000000000000000000000000..664210935c3369d8651ddc01d6866cdea7db197b --- /dev/null +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningReportingBasedProcessingPlugin.java @@ -0,0 +1,44 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * 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 ch.systemsx.cisd.openbis.dss.screening.server.plugins.jython; + +import java.io.File; +import java.util.Properties; + +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.ReportingBasedProcessingPlugin; + +/** + * A version of the {@link ReportingBasedProcessingPlugin} with extra support for screening. + * + * @author Chandrasekhar Ramakrishnan + */ +public class ScreeningReportingBasedProcessingPlugin extends ReportingBasedProcessingPlugin +{ + + /** + * @param properties + * @param storeRoot + */ + public ScreeningReportingBasedProcessingPlugin(Properties properties, File storeRoot) + { + super(new ScreeningPluginScriptRunnerFactory(getScriptPathProperty(properties)), + properties, storeRoot); + } + + private static final long serialVersionUID = 1L; + +} diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeFactory.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeFactory.java index 97f4e987cc6ae5661d69335fde806e291de40fb4..abe4f80ed8d585ad4b7707a33602c6999f738e57 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeFactory.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeFactory.java @@ -20,7 +20,7 @@ package ch.systemsx.cisd.openbis.plugin.screening.client.api.v1; * Default implementation of {@link IScreeningOpenbisServiceFacadeFactory}. * * @author Chandrasekhar Ramakrishnan - * @author Franze-Josef Elmer + * @author Franz-Josef Elmer */ public class ScreeningOpenbisServiceFacadeFactory implements IScreeningOpenbisServiceFacadeFactory { diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningJythonBasedReportingPluginTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningJythonBasedReportingPluginTest.java new file mode 100644 index 0000000000000000000000000000000000000000..063e017173cc20b7049c4a64d989f4561473d669 --- /dev/null +++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/plugins/jython/ScreeningJythonBasedReportingPluginTest.java @@ -0,0 +1,187 @@ +/* + * Copyright 2009 ETH Zuerich, CISD + * + * 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 ch.systemsx.cisd.openbis.dss.screening.server.plugins.jython; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; + +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; +import ch.systemsx.cisd.common.io.hierarchical_content.api.IHierarchicalContent; +import ch.systemsx.cisd.common.logging.LogInitializer; +import ch.systemsx.cisd.common.test.RecordingMatcher; +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.IPluginScriptRunnerFactory; +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.IReportingPluginScriptRunner; +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api.IDataSet; +import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; +import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider; +import ch.systemsx.cisd.openbis.dss.screening.server.plugins.jython.ScreeningJythonBasedReportingPlugin; +import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; +import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.ISimpleTableModelBuilderAdaptor; + +/** + * Tests for {@link ScreeningJythonBasedReportingPlugin} class. + * + * @author Chandrasekhar Ramakrishnan + */ +public class ScreeningJythonBasedReportingPluginTest extends AbstractFileSystemTestCase +{ + private Mockery context; + + private IHierarchicalContentProvider hierarchicalContentProvider; + + private IPluginScriptRunnerFactory scriptRunnerFactory; + + private IReportingPluginScriptRunner reportingPluginScriptRunner; + + private DataSetProcessingContext processingContext; + + private File store; + + private DatasetDescription datasetDescription1; + + private DatasetDescription datasetDescription2; + + private IHierarchicalContent content1; + + private IHierarchicalContent content2; + + @BeforeMethod + public void beforeMethod() + { + LogInitializer.init(); + store = new File(workingDirectory, "store"); + store.mkdirs(); + + datasetDescription1 = createDatasetDescription(1); + datasetDescription2 = createDatasetDescription(2); + context = new Mockery(); + scriptRunnerFactory = context.mock(IPluginScriptRunnerFactory.class); + reportingPluginScriptRunner = context.mock(IReportingPluginScriptRunner.class); + hierarchicalContentProvider = context.mock(IHierarchicalContentProvider.class); + content1 = context.mock(IHierarchicalContent.class, "content1"); + content2 = context.mock(IHierarchicalContent.class, "content2"); + } + + @AfterMethod + public void afterTest() + { + context.assertIsSatisfied(); + } + + private ScreeningJythonBasedReportingPlugin createPlugin() + { + return new ScreeningJythonBasedReportingPlugin(new Properties(), store, + scriptRunnerFactory, hierarchicalContentProvider); + } + + @Test + public void testCreateReportHappyCase() + { + final ScreeningJythonBasedReportingPlugin plugin = createPlugin(); + final RecordingMatcher<List<IDataSet>> iDataSetsMatcher = + new RecordingMatcher<List<IDataSet>>(); + commonPrepare(); + context.checking(new Expectations() + { + { + one(reportingPluginScriptRunner).describe(with(iDataSetsMatcher), + with(any(ISimpleTableModelBuilderAdaptor.class))); + } + }); + plugin.createReport(Arrays.asList(datasetDescription1, datasetDescription2), + processingContext); + // verify data sets + assertEquals(2, iDataSetsMatcher.recordedObject().size()); + verifyDataset(content1, 1, iDataSetsMatcher.recordedObject().get(0)); + verifyDataset(content2, 2, iDataSetsMatcher.recordedObject().get(1)); + + context.assertIsSatisfied(); + } + + private void commonPrepare() + { + context.checking(new Expectations() + { + { + one(scriptRunnerFactory).createReportingPluginRunner(processingContext); + will(returnValue(reportingPluginScriptRunner)); + + one(hierarchicalContentProvider).asContent("code1"); + will(returnValue(content1)); + one(hierarchicalContentProvider).asContent("code2"); + will(returnValue(content2)); + + // in the end all contents should be closed automatically + // (both for success and failure) + one(content1).close(); + one(content2).close(); + } + }); + } + + private static DatasetDescription createDatasetDescription(int nr) + { + DatasetDescription result = new DatasetDescription(); + result.setDatabaseInstanceCode("databaseInstanceCode" + nr); + result.setDataSetCode("code" + nr); + result.setDataSetLocation("dataSetLocation" + nr); + result.setDataSetSize(new Long(nr)); + result.setDatasetTypeCode("datasetTypeCode" + nr); + result.setExperimentCode("experimentCode" + nr); + result.setExperimentIdentifier("experimentIdentifier" + nr); + result.setExperimentTypeCode("experimentTypeCode" + nr); + result.setMainDataSetPath("mainDataSetPath" + nr); + result.setMainDataSetPattern("mainDataSetPattern" + nr); + result.setProjectCode("projectCode" + nr); + result.setSampleCode("sampleCode" + nr); + result.setSampleIdentifier("sampleIdentifier" + nr); + result.setSampleTypeCode("sampleTypeCode" + nr); + result.setSpaceCode("spaceCode" + nr); + result.setSpeedHint(nr); + return result; + } + + private static void verifyDataset(IHierarchicalContent expectedContent, int expectedNr, + IDataSet dataSet) + { + assertSame(expectedContent, dataSet.getContent()); + assertEquals("databaseInstanceCode" + expectedNr, dataSet.getDatabaseInstanceCode()); + assertEquals("code" + expectedNr, dataSet.getDataSetCode()); + assertEquals("dataSetLocation" + expectedNr, dataSet.getDataSetLocation()); + assertEquals(new Long(expectedNr), dataSet.getDataSetSize()); + assertEquals("datasetTypeCode" + expectedNr, dataSet.getDataSetTypeCode()); + assertEquals("experimentCode" + expectedNr, dataSet.getExperimentCode()); + assertEquals("experimentIdentifier" + expectedNr, dataSet.getExperimentIdentifier()); + assertEquals("experimentTypeCode" + expectedNr, dataSet.getExperimentTypeCode()); + assertEquals("mainDataSetPath" + expectedNr, dataSet.getMainDataSetPath()); + assertEquals("mainDataSetPattern" + expectedNr, dataSet.getMainDataSetPattern()); + assertEquals("projectCode" + expectedNr, dataSet.getProjectCode()); + assertEquals("sampleCode" + expectedNr, dataSet.getSampleCode()); + assertEquals("sampleIdentifier" + expectedNr, dataSet.getSampleIdentifier()); + assertEquals("sampleTypeCode" + expectedNr, dataSet.getSampleTypeCode()); + assertEquals("spaceCode" + expectedNr, dataSet.getSpaceCode()); + assertEquals(expectedNr, dataSet.getSpeedHint()); + } +}