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());
+    }
+}