From 6dfbd4f9a75a30afd2c7374c617cb2bc243a6abd Mon Sep 17 00:00:00 2001
From: tpylak <tpylak>
Date: Wed, 13 Jan 2010 08:43:00 +0000
Subject: [PATCH] SE-179 YeastX: DSS reporting plugins

SVN: 14267
---
 .../tasks/SimpleTableModelBuilder.java        |  27 ++-
 .../ch/systemsx/cisd/yeastx/db/DBUtils.java   |  12 ++
 .../eicml/EICMLChromatogramsReporter.java     | 163 ++++++++++++++++++
 .../cisd/yeastx/eicml/EICMLRunsReporter.java  | 114 ++++++++++++
 .../cisd/yeastx/eicml/IEICMSRunDAO.java       |  22 +--
 .../cisd/yeastx/etl/ML2DatabaseUploader.java  |   8 +-
 .../systemsx/cisd/yeastx/eicml/EICMLTest.java |  38 ++--
 ...eeningPlateImageParamsReportingPlugin.java |  15 +-
 8 files changed, 349 insertions(+), 50 deletions(-)
 create mode 100644 rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java
 create mode 100644 rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java
index 0610c5d3671..6be09a3cec2 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java
@@ -17,9 +17,14 @@
 package ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DateTableCell;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DoubleTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IntegerTableCell;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
@@ -50,7 +55,7 @@ public class SimpleTableModelBuilder
     {
         addHeader(title, false);
     }
-    
+
     public void addRow(List<ISerializableComparable> values)
     {
         assert values.size() == header.size() : "header has different number of columns than a row";
@@ -61,4 +66,24 @@ public class SimpleTableModelBuilder
     {
         return new TableModel(header, rows);
     }
+
+    public static ISerializableComparable asText(String text)
+    {
+        return new StringTableCell(text);
+    }
+
+    public static ISerializableComparable asNum(int num)
+    {
+        return new IntegerTableCell(num);
+    }
+
+    public static ISerializableComparable asNum(double num)
+    {
+        return new DoubleTableCell(num);
+    }
+
+    public static ISerializableComparable asDate(Date date)
+    {
+        return new DateTableCell(date);
+    }
 }
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBUtils.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBUtils.java
index 12269f43956..42d437ed91d 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBUtils.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBUtils.java
@@ -23,6 +23,7 @@ import net.lemnik.eodsql.TransactionQuery;
 
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.utilities.BeanUtils;
+import ch.systemsx.cisd.common.utilities.ExtendedProperties;
 import ch.systemsx.cisd.dbmigration.DBMigrationEngine;
 import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
 
@@ -37,11 +38,22 @@ public class DBUtils
     /** Current version of the database. */
     public static final String DATABASE_VERSION = "004";
 
+    private static final String DATABASE_PROPERTIES_PREFIX = "database.";
+
     static
     {
         QueryTool.getTypeMap().put(float[].class, new FloatArrayMapper());
     }
 
+    public static DatabaseConfigurationContext createAndInitDBContext(Properties properties)
+    {
+        final Properties dbProps =
+                ExtendedProperties.getSubset(properties, DATABASE_PROPERTIES_PREFIX, true);
+        final DatabaseConfigurationContext dbContext = DBUtils.createDBContext(dbProps);
+        DBUtils.init(dbContext);
+        return dbContext;
+    }
+
     public static DatabaseConfigurationContext createDBContext(Properties dbProps)
     {
         DatabaseConfigurationContext context =
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java
new file mode 100644
index 00000000000..65abf1ad749
--- /dev/null
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2010 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.yeastx.eicml;
+
+import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder.asNum;
+import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder.asText;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+import net.lemnik.eodsql.DataIterator;
+import net.lemnik.eodsql.QueryTool;
+
+import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
+import ch.systemsx.cisd.yeastx.db.DBUtils;
+
+/**
+ * Reporting plugin which shows all the chromatograms details for the chosen datasets.
+ * 
+ * @author Tomasz Pylak
+ */
+public class EICMLChromatogramsReporter extends AbstractDatastorePlugin implements
+        IReportingPluginTask
+{
+    private final IEICMSRunDAO query;
+
+    public EICMLChromatogramsReporter(Properties properties, File storeRoot)
+    {
+        super(properties, storeRoot);
+        this.query = createQuery(properties);
+    }
+
+    private static IEICMSRunDAO createQuery(Properties properties)
+    {
+        final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties);
+        DataSource dataSource = dbContext.getDataSource();
+        return QueryTool.getQuery(dataSource, IEICMSRunDAO.class);
+    }
+
+    private static final long serialVersionUID = 1L;
+
+    public TableModel createReport(List<DatasetDescription> datasets)
+    {
+        SimpleTableModelBuilder builder = new SimpleTableModelBuilder();
+        addReportHeaders(builder);
+        List<EICMSRunDTO> runs = fetchRuns(datasets);
+        for (EICMSRunDTO run : runs)
+        {
+            DataIterator<ChromatogramDTO> chromatograms = query.getChromatogramsForRun(run);
+            addRun(builder, run, chromatograms);
+        }
+        return builder.getTableModel();
+    }
+
+    private List<EICMSRunDTO> fetchRuns(List<DatasetDescription> datasets)
+    {
+        List<EICMSRunDTO> runs = new ArrayList<EICMSRunDTO>();
+        for (DatasetDescription dataset : datasets)
+        {
+            EICMSRunDTO run = query.getMSRunByDatasetPermId(dataset.getDatasetCode());
+            if (run != null)
+            {
+                runs.add(run);
+            }
+        }
+        return runs;
+    }
+
+    private static void addRun(SimpleTableModelBuilder builder, EICMSRunDTO run,
+            DataIterator<ChromatogramDTO> chromatograms)
+    {
+        for (ChromatogramDTO chromatogram : chromatograms)
+        {
+            builder.addRow(createRow(builder, run, chromatogram));
+        }
+    }
+
+    private static List<ISerializableComparable> createRow(SimpleTableModelBuilder builder,
+            EICMSRunDTO run, ChromatogramDTO chromatogram)
+    {
+        List<ISerializableComparable> row = new ArrayList<ISerializableComparable>();
+
+        row.add(asText(chromatogram.getLabel()));
+        row.add(asNum(calcMin(chromatogram.getRunTimes())));
+        row.add(asNum(calcMax(chromatogram.getRunTimes())));
+        row.add(asNum(calcMax(chromatogram.getIntensities())));
+        row.add(asNum(chromatogram.getQ1Mz()));
+        row.add(asNum(chromatogram.getQ3LowMz()));
+        row.add(asNum(chromatogram.getQ3HighMz()));
+        row.add(asText("" + chromatogram.getPolarity()));
+        return row;
+    }
+
+    private static float calcMax(float[] values)
+    {
+        if (values.length == 0)
+        {
+            return -1;
+        }
+        float max = values[0];
+        for (int i = 1; i < values.length; i++)
+        {
+            if (values[i] > max)
+            {
+                max = values[i];
+            }
+        }
+        return max;
+    }
+
+    private static float calcMin(float[] values)
+    {
+        if (values.length == 0)
+        {
+            return -1;
+        }
+        float min = values[0];
+        for (int i = 1; i < values.length; i++)
+        {
+            if (values[i] < min)
+            {
+                min = values[i];
+            }
+        }
+        return min;
+    }
+
+    private static void addReportHeaders(SimpleTableModelBuilder builder)
+    {
+        builder.addHeader("Label");
+        builder.addHeader("RT Start");
+        builder.addHeader("RT End");
+        builder.addHeader("Max. Intensity");
+        builder.addHeader("Q1 Mz", true);
+        builder.addHeader("Q3Low Mz", true);
+        builder.addHeader("Q3High Mz", true);
+        builder.addHeader("Polarity");
+    }
+}
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java
new file mode 100644
index 00000000000..efbecba4b7c
--- /dev/null
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2010 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.yeastx.eicml;
+
+import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder.asDate;
+import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder.asNum;
+import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder.asText;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+import net.lemnik.eodsql.QueryTool;
+
+import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
+import ch.systemsx.cisd.yeastx.db.DBUtils;
+
+/**
+ * Reporting plugin which shows all the run details for the chosen datasets.
+ * 
+ * @author Tomasz Pylak
+ */
+public class EICMLRunsReporter extends AbstractDatastorePlugin implements IReportingPluginTask
+{
+    private final IEICMSRunDAO query;
+
+    public EICMLRunsReporter(Properties properties, File storeRoot)
+    {
+        super(properties, storeRoot);
+        this.query = createQuery(properties);
+    }
+
+    private static IEICMSRunDAO createQuery(Properties properties)
+    {
+        final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties);
+        DataSource dataSource = dbContext.getDataSource();
+        return QueryTool.getQuery(dataSource, IEICMSRunDAO.class);
+    }
+
+    private static final long serialVersionUID = 1L;
+
+    public TableModel createReport(List<DatasetDescription> datasets)
+    {
+        SimpleTableModelBuilder builder = new SimpleTableModelBuilder();
+        addReportHeaders(builder);
+        for (DatasetDescription dataset : datasets)
+        {
+            EICMSRunDTO run = query.getMSRunByDatasetPermId(dataset.getDatasetCode());
+            if (run != null)
+            {
+                builder.addRow(createRow(run, dataset));
+            }
+        }
+        return builder.getTableModel();
+    }
+
+    private static List<ISerializableComparable> createRow(EICMSRunDTO run,
+            DatasetDescription dataset)
+    {
+        List<ISerializableComparable> row = new ArrayList<ISerializableComparable>();
+        row.add(asText(dataset.getDatasetCode()));
+        row.add(asText(run.getRawDataFilePath()));
+        row.add(asText(run.getRawDataFileName()));
+        row.add(asText(run.getInstrumentType()));
+        row.add(asText(run.getInstrumentManufacturer()));
+        row.add(asText(run.getInstrumentModel()));
+        row.add(asText(run.getMethodIonisation()));
+        row.add(asText(run.getMethodSeparation()));
+        row.add(asDate(run.getAcquisitionDate()));
+        row.add(asNum(run.getStartTime()));
+        row.add(asNum(run.getEndTime()));
+        row.add(asText(run.getOperator()));
+        return row;
+    }
+
+    private static void addReportHeaders(SimpleTableModelBuilder builder)
+    {
+        builder.addHeader("Dataset");
+        builder.addHeader("Raw data file path");
+        builder.addHeader("Raw data file name");
+        builder.addHeader("Instrument type");
+        builder.addHeader("Instrument manufacturer");
+        builder.addHeader("Instrument model");
+        builder.addHeader("Method ionisation");
+        builder.addHeader("Method separation");
+        builder.addHeader("Acquisition date");
+        builder.addHeader("Start time");
+        builder.addHeader("End time");
+        builder.addHeader("Operator");
+    }
+}
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/IEICMSRunDAO.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/IEICMSRunDAO.java
index 3aadd5a8bdc..562634c1377 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/IEICMSRunDAO.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/IEICMSRunDAO.java
@@ -61,25 +61,9 @@ public interface IEICMSRunDAO extends IGenericDAO
     @Select(sql = "select * from EIC_MS_RUNS where RAW_DATA_FILE_NAME=?{1}")
     public DataIterator<EICMSRunDTO> getMsRunsForRawDataFile(String rawDataFileName);
 
-    @Select("select EIC_MS_RUNS.*, count(EIC_CHROMATOGRAMS.*) AS chromCount from EIC_MS_RUNS "
-            + "left join EIC_CHROMATOGRAMS on EIC_MS_RUN_ID = EIC_MS_RUNS.ID where EIC_MS_RUNS.EIC_MS_RUN_ID=?{1} group by "
-            + ALL_EIC_MSRUN_COLUMNS)
-    public EICMSRunDTO getMSRunById(long id);
-
-    @Select("select EIC_MS_RUNS.*, count(EIC_CHROMATOGRAMS.*) AS chromCount from EIC_MS_RUNS "
-            + "left join EIC_CHROMATOGRAMS on EIC_MS_RUN_ID = eic_ms_run.id where EIC_MS_RUNS.DATA_SET_PERM_ID=?{1} group by "
-            + ALL_EIC_MSRUN_COLUMNS)
-    public EICMSRunDTO getMSRunByPermId(String permId);
-
-    @Select("select EIC_MS_RUNS.* FROM msrun LEFT JOIN EIC_CHROMATOGRAMS USING(ID) "
-            + "where EIC_CHROMATOGRAMS.ID = ?{1.id}")
-    public EICMSRunDTO getMSRunForChromatogram(ChromatogramDTO chromatogram);
-
-    @Select("select EIC_CHROMATOGRAMS.* FROM EIC_CHROMATOGRAMS where ID=?{1}")
-    public ChromatogramDTO getChromatogramById(long id);
-
-    @Select("select EIC_CHROMATOGRAMS.* FROM EIC_CHROMATOGRAMS where LABEL=?{1}")
-    public ChromatogramDTO getChromatogramByLabel(String label);
+    @Select(sql = "select EIC_MS_RUNS.* from EIC_MS_RUNS left join DATA_SETS on DATA_SETS.id = EIC_MS_RUNS.ds_id "
+            + "where DATA_SETS.perm_id = ?{1} group by " + ALL_EIC_MSRUN_COLUMNS)
+    public EICMSRunDTO getMSRunByDatasetPermId(String datasetPermId);
 
     @Select("select * FROM EIC_CHROMATOGRAMS where EIC_MS_RUN_ID=?{1.id}")
     public DataIterator<ChromatogramDTO> getChromatogramsForRun(EICMSRunDTO msRun);
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/ML2DatabaseUploader.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/ML2DatabaseUploader.java
index d546f5df15d..ae61eb7f282 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/ML2DatabaseUploader.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/ML2DatabaseUploader.java
@@ -26,7 +26,6 @@ import javax.sql.DataSource;
 import org.apache.commons.io.FilenameUtils;
 
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
-import ch.systemsx.cisd.common.utilities.ExtendedProperties;
 import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
 import ch.systemsx.cisd.etlserver.IDataSetUploader;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
@@ -51,8 +50,6 @@ public class ML2DatabaseUploader implements IDataSetUploader
 {
     private static final String UNKNOWN_NAME = "unknown";
 
-    private static final String DATABASE_PROPERTIES_PREFIX = "database.";
-
     private final IDatasetLoader eicML2Database;
 
     private final IDatasetLoader fiaML2Database;
@@ -71,10 +68,7 @@ public class ML2DatabaseUploader implements IDataSetUploader
 
     public ML2DatabaseUploader(Properties properties)
     {
-        final Properties dbProps =
-                ExtendedProperties.getSubset(properties, DATABASE_PROPERTIES_PREFIX, true);
-        final DatabaseConfigurationContext dbContext = DBUtils.createDBContext(dbProps);
-        DBUtils.init(dbContext);
+        final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties);
         DataSource dataSource = dbContext.getDataSource();
         this.eicML2Database = new EICML2Database(dataSource);
         this.fiaML2Database = new FIAML2Database(dataSource);
diff --git a/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/eicml/EICMLTest.java b/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/eicml/EICMLTest.java
index 6616901c685..8b2f6543106 100644
--- a/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/eicml/EICMLTest.java
+++ b/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/eicml/EICMLTest.java
@@ -27,6 +27,7 @@ import net.lemnik.eodsql.DataIterator;
 import net.lemnik.eodsql.QueryTool;
 
 import org.apache.commons.lang.ArrayUtils;
+import org.testng.AssertJUnit;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -41,6 +42,8 @@ import ch.systemsx.cisd.yeastx.db.DMDataSetDTO;
 public class EICMLTest extends AbstractDBTest
 {
 
+    private static final String DATA_SET_PERM_ID = "data set perm id eicml";
+
     private IEICMSRunDAO eicmlDAO;
 
     @BeforeMethod(alwaysRun = true)
@@ -60,8 +63,16 @@ public class EICMLTest extends AbstractDBTest
 
     private DMDataSetDTO createDataset()
     {
-        return new DMDataSetDTO("data set perm id eicml", "sample perm id eicml",
-                "sample name eicml", "experiment perm id eicml", "experiment name eicml");
+        return new DMDataSetDTO(DATA_SET_PERM_ID, "sample perm id eicml", "sample name eicml",
+                "experiment perm id eicml", "experiment name eicml");
+    }
+
+    @Test(dependsOnMethods = "testUploadEicML")
+    public void testGetMSRunByDatasetPermId() throws ParseException
+    {
+        EICMSRunDTO run = eicmlDAO.getMSRunByDatasetPermId(DATA_SET_PERM_ID);
+        AssertJUnit.assertNotNull(run);
+        assertRunCorrect(run);
     }
 
     private void checkChromatograms(int count, ChromatogramDTO chrom)
@@ -132,6 +143,20 @@ public class EICMLTest extends AbstractDBTest
         final EICMSRunDTO run = runs.next();
         assertFalse(runs.hasNext());
         assertEquals(4, run.getChromCount());
+        assertRunCorrect(run);
+        final DataIterator<ChromatogramDTO> chromatograms = eicmlDAO.getChromatogramsForRun(run);
+        int count = 0;
+        while (chromatograms.hasNext())
+        {
+            final ChromatogramDTO chrom = chromatograms.next();
+            checkChromatograms(count, chrom);
+            ++count;
+        }
+        assertEquals(run.getChromCount(), count);
+    }
+
+    private void assertRunCorrect(final EICMSRunDTO run) throws ParseException
+    {
         assertEquals(EICMLParser.getDateFormat().parse("16-Jun-2009 11:58:14"), run
                 .getAcquisitionDate());
         assertEquals(370.109f, run.getStartTime());
@@ -146,14 +171,5 @@ public class EICMLTest extends AbstractDBTest
         assertEquals(17L, run.getMsRunId().longValue());
         assertEquals(32L, run.getSetId().longValue());
         assertEquals("???", run.getOperator());
-        final DataIterator<ChromatogramDTO> chromatograms = eicmlDAO.getChromatogramsForRun(run);
-        int count = 0;
-        while (chromatograms.hasNext())
-        {
-            final ChromatogramDTO chrom = chromatograms.next();
-            checkChromatograms(count, chrom);
-            ++count;
-        }
-        assertEquals(run.getChromCount(), count);
     }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ScreeningPlateImageParamsReportingPlugin.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ScreeningPlateImageParamsReportingPlugin.java
index a66f64f85dd..36047326534 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ScreeningPlateImageParamsReportingPlugin.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ScreeningPlateImageParamsReportingPlugin.java
@@ -16,6 +16,9 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.server.plugins;
 
+import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder.asNum;
+import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder.asText;
+
 import java.io.File;
 import java.util.Arrays;
 import java.util.List;
@@ -30,8 +33,6 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractData
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IntegerTableCell;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
@@ -106,16 +107,6 @@ public class ScreeningPlateImageParamsReportingPlugin extends AbstractDatastoreP
         builder.addRow(row);
     }
 
-    private static ISerializableComparable asText(String text)
-    {
-        return new StringTableCell(text);
-    }
-
-    private static ISerializableComparable asNum(int num)
-    {
-        return new IntegerTableCell(num);
-    }
-
     private IHCSImageFormattedData getImageAccessor(IDataStructureV1_0 structure)
     {
         return (IHCSImageFormattedData) structure.getFormattedData();
-- 
GitLab