From 8275e6a1c91ac13244c245e38347bc03efb64026 Mon Sep 17 00:00:00 2001
From: tpylak <tpylak>
Date: Mon, 10 May 2010 09:03:17 +0000
Subject: [PATCH] LMS-1531 yeastx: create DAOs (and connections) first time
 when they are needed

SVN: 15860
---
 .../cisd/yeastx/db/AbstractDatasetLoader.java | 35 +++++++++++++++--
 .../cisd/yeastx/eicml/EICML2Database.java     | 24 ++++--------
 .../cisd/yeastx/etl/MLArchiverTask.java       | 39 +++++++++++++------
 .../cisd/yeastx/fiaml/FIAML2Database.java     | 26 +++++--------
 .../cisd/yeastx/mzxml/MzXml2Database.java     | 25 ++++--------
 .../cisd/yeastx/quant/QuantML2Database.java   | 21 +++-------
 .../cisd/yeastx/mzxml/MzXml2DatabaseTest.java |  2 +-
 7 files changed, 90 insertions(+), 82 deletions(-)

diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/AbstractDatasetLoader.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/AbstractDatasetLoader.java
index a360f400414..da604dc960e 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/AbstractDatasetLoader.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/AbstractDatasetLoader.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.yeastx.db;
 
+import javax.sql.DataSource;
+
 import org.springframework.dao.DataAccessException;
 
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
@@ -26,13 +28,40 @@ import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
  * 
  * @author Tomasz Pylak
  */
-abstract public class AbstractDatasetLoader implements IDatasetLoader
+abstract public class AbstractDatasetLoader<T extends IGenericDAO> implements IDatasetLoader
 {
-    abstract protected IGenericDAO getDao();
-
     // if false transaction has to be commited or rollbacked before the next dataset will be created
     protected boolean isTransactionCompleted = true;
 
+    private final DataSource dataSource;
+
+    private final Class<T> queryClass;
+
+    private T daoOrNull; // created when used for the first time
+
+    protected AbstractDatasetLoader(DataSource dataSource, Class<T> queryClass)
+    {
+        this.dataSource = dataSource;
+        this.queryClass = queryClass;
+    }
+
+    // for tests only
+    protected AbstractDatasetLoader(DataSource dataSource, Class<T> queryClass, T dao)
+    {
+        this.dataSource = dataSource;
+        this.queryClass = queryClass;
+        this.daoOrNull = dao;
+    }
+
+    protected final T getDao()
+    {
+        if (daoOrNull == null)
+        {
+            this.daoOrNull = DBUtils.getQuery(dataSource, queryClass);
+        }
+        return daoOrNull;
+    }
+
     /**
      * Cannot be called twice in a row if {@link #commit()} or {@link #rollback()} has not been
      * called in between.
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICML2Database.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICML2Database.java
index 4856dfc6072..86441c7123f 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICML2Database.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICML2Database.java
@@ -23,9 +23,7 @@ import java.util.List;
 import javax.sql.DataSource;
 
 import ch.systemsx.cisd.yeastx.db.AbstractDatasetLoader;
-import ch.systemsx.cisd.yeastx.db.DBUtils;
 import ch.systemsx.cisd.yeastx.db.DMDataSetDTO;
-import ch.systemsx.cisd.yeastx.db.IGenericDAO;
 import ch.systemsx.cisd.yeastx.eicml.EICMLParser.IChromatogramObserver;
 import ch.systemsx.cisd.yeastx.eicml.EICMLParser.IMSRunObserver;
 
@@ -34,7 +32,7 @@ import ch.systemsx.cisd.yeastx.eicml.EICMLParser.IMSRunObserver;
  * 
  * @author Bernd Rinn
  */
-public class EICML2Database extends AbstractDatasetLoader
+public class EICML2Database extends AbstractDatasetLoader<IEICMSRunDAO>
 {
 
     private final static int CHROMATOGRAM_BATCH_SIZE = 100;
@@ -49,11 +47,9 @@ public class EICML2Database extends AbstractDatasetLoader
         }
     }
 
-    private final IEICMSRunDAO dao;
-
-    public EICML2Database(DataSource datasource)
+    public EICML2Database(DataSource dataSource)
     {
-        this.dao = DBUtils.getQuery(datasource, IEICMSRunDAO.class);
+        super(dataSource, IEICMSRunDAO.class);
     }
 
     /**
@@ -73,30 +69,26 @@ public class EICML2Database extends AbstractDatasetLoader
                     {
                         // add chromatograms from the last run to the database before setting the
                         // new run id
-                        addChromatograms(dao, eicMLId[0], chromatograms, 1);
+                        addChromatograms(getDao(), eicMLId[0], chromatograms, 1);
                         run.setExperimentId(dataSet.getExperimentId());
                         run.setSampleId(dataSet.getSampleId());
                         run.setDataSetId(dataSet.getId());
-                        eicMLId[0] = dao.addMSRun(run);
+                        eicMLId[0] = getDao().addMSRun(run);
                     }
                 }, new IChromatogramObserver()
                 {
                     public void observe(ChromatogramDTO chromatogram)
                     {
                         chromatograms.add(chromatogram);
-                        addChromatograms(dao, eicMLId[0], chromatograms, CHROMATOGRAM_BATCH_SIZE);
+                        addChromatograms(getDao(), eicMLId[0], chromatograms,
+                                CHROMATOGRAM_BATCH_SIZE);
                     }
                 });
-            addChromatograms(dao, eicMLId[0], chromatograms, 1);
+            addChromatograms(getDao(), eicMLId[0], chromatograms, 1);
         } catch (Throwable th)
         {
             rollbackAndRethrow(th);
         }
     }
 
-    @Override
-    protected IGenericDAO getDao()
-    {
-        return dao;
-    }
 }
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/MLArchiverTask.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/MLArchiverTask.java
index 94ab1252646..7a0e3a8c3f4 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/MLArchiverTask.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/MLArchiverTask.java
@@ -94,19 +94,9 @@ public class MLArchiverTask extends AbstractArchiverProcessingPlugin
             Sample sample = null;
             if (dataset.getSampleCode() != null)
             {
-                // NOTE: we assume that it is not a shared sample
-                SampleIdentifier sampleIdentifier =
-                        new SampleIdentifier(new SpaceIdentifier(dataset.getDatabaseInstanceCode(),
-                                dataset.getGroupCode()), dataset.getSampleCode());
-                sample =
-                        ServiceProvider.getOpenBISService().tryGetSampleWithExperiment(
-                                sampleIdentifier);
+                sample = fetchSample(dataset);
             }
-            ExperimentIdentifier experimentIdentifier =
-                    new ExperimentIdentifier(dataset.getDatabaseInstanceCode(), dataset
-                            .getGroupCode(), dataset.getProjectCode(), dataset.getExperimentCode());
-            Experiment experiment =
-                    ServiceProvider.getOpenBISService().tryToGetExperiment(experimentIdentifier);
+            Experiment experiment = getOrFetchExperiment(dataset, sample);
             databaseUploader = new ML2DatabaseUploader(properties);
             databaseUploader.upload(getDataFile(dataset), sample, experiment, dataset
                     .getDatasetCode());
@@ -121,6 +111,31 @@ public class MLArchiverTask extends AbstractArchiverProcessingPlugin
         }
     }
 
+    private Sample fetchSample(DatasetDescription dataset)
+    {
+        Sample sample;
+        // NOTE: we assume that it is not a shared sample
+        SampleIdentifier sampleIdentifier =
+                new SampleIdentifier(new SpaceIdentifier(dataset.getDatabaseInstanceCode(), dataset
+                        .getGroupCode()), dataset.getSampleCode());
+        sample = ServiceProvider.getOpenBISService().tryGetSampleWithExperiment(sampleIdentifier);
+        return sample;
+    }
+
+    private Experiment getOrFetchExperiment(DatasetDescription dataset, Sample sample)
+    {
+        if (sample != null && sample.getExperiment() != null)
+        {
+            return sample.getExperiment();
+        }
+        ExperimentIdentifier experimentIdentifier =
+                new ExperimentIdentifier(dataset.getDatabaseInstanceCode(), dataset.getGroupCode(),
+                        dataset.getProjectCode(), dataset.getExperimentCode());
+        Experiment experiment =
+                ServiceProvider.getOpenBISService().tryToGetExperiment(experimentIdentifier);
+        return experiment;
+    }
+
     private File getDataFile(DatasetDescription dataset)
     {
         File datasetDir = getDataSubDir(dataset);
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/FIAML2Database.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/FIAML2Database.java
index d39c187757b..79246af8086 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/FIAML2Database.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/FIAML2Database.java
@@ -23,9 +23,7 @@ import java.util.Iterator;
 import javax.sql.DataSource;
 
 import ch.systemsx.cisd.yeastx.db.AbstractDatasetLoader;
-import ch.systemsx.cisd.yeastx.db.DBUtils;
 import ch.systemsx.cisd.yeastx.db.DMDataSetDTO;
-import ch.systemsx.cisd.yeastx.db.IGenericDAO;
 import ch.systemsx.cisd.yeastx.fiaml.FIAMLParser.IMSRunObserver;
 
 /**
@@ -33,7 +31,7 @@ import ch.systemsx.cisd.yeastx.fiaml.FIAMLParser.IMSRunObserver;
  * 
  * @author Bernd Rinn
  */
-public class FIAML2Database extends AbstractDatasetLoader
+public class FIAML2Database extends AbstractDatasetLoader<IFIAMSRunDAO>
 {
 
     private final static int PROFILE_CHUNK_SIZE = 250;
@@ -73,11 +71,9 @@ public class FIAML2Database extends AbstractDatasetLoader
             };
     }
 
-    private final IFIAMSRunDAO dao;
-
-    public FIAML2Database(DataSource datasource)
+    public FIAML2Database(DataSource dataSource)
     {
-        this.dao = DBUtils.getQuery(datasource, IFIAMSRunDAO.class);
+        super(dataSource, IFIAMSRunDAO.class);
     }
 
     /**
@@ -95,10 +91,12 @@ public class FIAML2Database extends AbstractDatasetLoader
                         run.setExperimentId(dataSet.getExperimentId());
                         run.setSampleId(dataSet.getSampleId());
                         run.setDataSetId(dataSet.getId());
-                        final long fiaMsRunId = dao.addMSRun(run);
-                        dao.addProfiles(fiaMsRunId, profileChunk(runData));
-                        dao.addCentroids(fiaMsRunId, runData.getCentroidMz(), runData
-                                .getCentroidIntensities(), runData.getCentroidCorrelations());
+                        final long fiaMsRunId = getDao().addMSRun(run);
+                        getDao().addProfiles(fiaMsRunId, profileChunk(runData));
+                        getDao()
+                                .addCentroids(fiaMsRunId, runData.getCentroidMz(),
+                                        runData.getCentroidIntensities(),
+                                        runData.getCentroidCorrelations());
                     }
                 });
         } catch (Throwable th)
@@ -106,10 +104,4 @@ public class FIAML2Database extends AbstractDatasetLoader
             rollbackAndRethrow(th);
         }
     }
-
-    @Override
-    protected IGenericDAO getDao()
-    {
-        return dao;
-    }
 }
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/mzxml/MzXml2Database.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/mzxml/MzXml2Database.java
index 876d18475c1..773f3870a3f 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/mzxml/MzXml2Database.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/mzxml/MzXml2Database.java
@@ -27,9 +27,7 @@ import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.exceptions.NotImplementedException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.yeastx.db.AbstractDatasetLoader;
-import ch.systemsx.cisd.yeastx.db.DBUtils;
 import ch.systemsx.cisd.yeastx.db.DMDataSetDTO;
-import ch.systemsx.cisd.yeastx.db.IGenericDAO;
 import ch.systemsx.cisd.yeastx.mzxml.dto.MzPrecursorDTO;
 import ch.systemsx.cisd.yeastx.mzxml.dto.MzRunDTO;
 import ch.systemsx.cisd.yeastx.mzxml.dto.MzScanDTO;
@@ -41,19 +39,18 @@ import ch.systemsx.cisd.yeastx.utils.JaxbXmlParser;
  * 
  * @author Tomasz Pylak
  */
-public class MzXml2Database extends AbstractDatasetLoader
+public class MzXml2Database extends AbstractDatasetLoader<IMzXmlDAO>
 {
-    private final IMzXmlDAO dao;
-
     public MzXml2Database(DataSource datasource)
     {
-        this(DBUtils.getQuery(datasource, IMzXmlDAO.class));
+        super(datasource, IMzXmlDAO.class);
     }
 
     @Private
-    MzXml2Database(IMzXmlDAO dao)
+    // for tests only
+    MzXml2Database(DataSource dataSource, IMzXmlDAO dao)
     {
-        this.dao = dao;
+        super(dataSource, IMzXmlDAO.class, dao);
     }
 
     /**
@@ -80,7 +77,7 @@ public class MzXml2Database extends AbstractDatasetLoader
     @Private
     void uploadRun(MzRunDTO run, DMDataSetDTO dataSet)
     {
-        long runId = dao.addRun(dataSet, run.getInstrument());
+        long runId = getDao().addRun(dataSet, run.getInstrument());
         List<MzScanDTO> scans = run.getScans();
         for (MzScanDTO scan : scans)
         {
@@ -111,7 +108,7 @@ public class MzXml2Database extends AbstractDatasetLoader
                                 scan.getNumber(), precursors.size());
             }
         }
-        long scanId = dao.addScan(runId, scan, precursor1, precursor2);
+        long scanId = getDao().addScan(runId, scan, precursor1, precursor2);
         uploadPeaks(scanId, scan.getPeaks());
     }
 
@@ -119,7 +116,7 @@ public class MzXml2Database extends AbstractDatasetLoader
     {
         Iterable<Float> mzArray = createEverySecondIterator(peaks, 0);
         Iterable<Float> intensityArray = createEverySecondIterator(peaks, 1);
-        dao.addPeaks(scanId, mzArray, intensityArray);
+        getDao().addPeaks(scanId, mzArray, intensityArray);
     }
 
     // iterates on every second element of an array starting from the specified initial index
@@ -154,10 +151,4 @@ public class MzXml2Database extends AbstractDatasetLoader
                 }
             };
     }
-
-    @Override
-    protected IGenericDAO getDao()
-    {
-        return dao;
-    }
 }
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/quant/QuantML2Database.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/quant/QuantML2Database.java
index 4f314090303..fda48a38ce4 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/quant/QuantML2Database.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/quant/QuantML2Database.java
@@ -23,9 +23,7 @@ import java.util.List;
 import javax.sql.DataSource;
 
 import ch.systemsx.cisd.yeastx.db.AbstractDatasetLoader;
-import ch.systemsx.cisd.yeastx.db.DBUtils;
 import ch.systemsx.cisd.yeastx.db.DMDataSetDTO;
-import ch.systemsx.cisd.yeastx.db.IGenericDAO;
 import ch.systemsx.cisd.yeastx.quant.dto.ConcentrationCompounds;
 import ch.systemsx.cisd.yeastx.quant.dto.MSConcentrationDTO;
 import ch.systemsx.cisd.yeastx.quant.dto.MSQuantificationDTO;
@@ -37,13 +35,11 @@ import ch.systemsx.cisd.yeastx.utils.JaxbXmlParser;
  * 
  * @author Tomasz Pylak
  */
-public class QuantML2Database extends AbstractDatasetLoader
+public class QuantML2Database extends AbstractDatasetLoader<IQuantMSDAO>
 {
-    private final IQuantMSDAO dao;
-
     public QuantML2Database(DataSource datasource)
     {
-        this.dao = DBUtils.getQuery(datasource, IQuantMSDAO.class);
+        super(datasource, IQuantMSDAO.class);
     }
 
     /**
@@ -68,7 +64,7 @@ public class QuantML2Database extends AbstractDatasetLoader
         for (MSQuantificationDTO quantification : quantifications.getQuantifications())
         {
             long quantificationId =
-                    dao.addQuantification(dataSet.getExperimentId(), dataSet.getId(),
+                    getDao().addQuantification(dataSet.getExperimentId(), dataSet.getId(),
                             quantification);
             uploadConcentrations(quantificationId, quantification.getConcentrations());
         }
@@ -78,20 +74,13 @@ public class QuantML2Database extends AbstractDatasetLoader
     {
         for (MSConcentrationDTO concentration : concentrations)
         {
-            long concentrationId = dao.addConcentration(quantificationId, concentration);
+            long concentrationId = getDao().addConcentration(quantificationId, concentration);
             uploadCompoundIds(concentrationId, concentration.getCompounds());
         }
     }
 
     private void uploadCompoundIds(long concentrationId, ConcentrationCompounds compounds)
     {
-        dao.addCompoundIds(concentrationId, compounds.getCompoundIds());
+        getDao().addCompoundIds(concentrationId, compounds.getCompoundIds());
     }
-
-    @Override
-    protected IGenericDAO getDao()
-    {
-        return dao;
-    }
-
 }
diff --git a/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/mzxml/MzXml2DatabaseTest.java b/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/mzxml/MzXml2DatabaseTest.java
index e95c556e8ce..6837a6cf9c7 100644
--- a/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/mzxml/MzXml2DatabaseTest.java
+++ b/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/mzxml/MzXml2DatabaseTest.java
@@ -110,7 +110,7 @@ public class MzXml2DatabaseTest
                 }
             });
 
-        new MzXml2Database(dao).uploadRun(run, dataSet);
+        new MzXml2Database(null, dao).uploadRun(run, dataSet);
         context.assertIsSatisfied();
     }
 }
-- 
GitLab