// $HeadURL$ // $Id$ // // Copyright © 2006, 2010, 2011, 2012 by the President and Fellows of Harvard College. // // Screensaver is an open-source project developed by the ICCB-L and NSRB labs // at Harvard Medical School. This software is distributed under the terms of // the GNU General Public License. package edu.harvard.med.screensaver.io.libraries; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.google.common.collect.Sets; import org.apache.log4j.Logger; import org.joda.time.LocalDate; import org.springframework.beans.factory.annotation.Autowired; import edu.harvard.med.screensaver.db.DAOTransaction; import edu.harvard.med.screensaver.db.LibrariesDAO; import edu.harvard.med.screensaver.io.libraries.smallmolecule.LibraryContentsVersionReference; import edu.harvard.med.screensaver.model.activities.AdministrativeActivity; import edu.harvard.med.screensaver.model.activities.AdministrativeActivityType; import edu.harvard.med.screensaver.model.libraries.Library; import edu.harvard.med.screensaver.model.libraries.LibraryContentsVersion; import edu.harvard.med.screensaver.model.libraries.ReagentVendorIdentifier; import edu.harvard.med.screensaver.model.libraries.Well; import edu.harvard.med.screensaver.model.screens.ScreenType; import edu.harvard.med.screensaver.model.users.AdministratorUser; import edu.harvard.med.screensaver.test.AbstractSpringPersistenceTest; public class WellsSdfDataExporterTest extends AbstractSpringPersistenceTest { private static Logger log = Logger.getLogger(WellsSdfDataExporterTest.class); @Autowired protected LibrariesDAO librariesDao; @Autowired protected edu.harvard.med.screensaver.service.libraries.LibraryCreator libraryCreator; private WellListDAOTransaction _wellListDAOTransaction; class WellListDAOTransaction implements DAOTransaction { public void runTransaction() { Library library = dataFactory.newInstance(Library.class); library.setScreenType(ScreenType.SMALL_MOLECULE); library.setStartPlate(1); library.setEndPlate(1); libraryCreator.createWells(library); LibraryContentsVersion lcv1 = library.createContentsVersion(dataFactory.newInstance(AdministratorUser.class)); Set<Well> wellSet = library.getWells(); for (Well well : wellSet) { well.createSmallMoleculeReagent(new ReagentVendorIdentifier("vendor", well.getWellKey().toString()), "molfile " + lcv1.getVersionNumber() + " for well " + well.getWellKey(), "", "", null, null, null); } library.getLatestContentsVersion().release(new AdministrativeActivity((AdministratorUser) library.getLatestContentsVersion().getLoadingActivity().getPerformedBy(), new LocalDate(), AdministrativeActivityType.LIBRARY_CONTENTS_VERSION_RELEASE)); LibraryContentsVersion lcv2 = library.createContentsVersion(dataFactory.newInstance(AdministratorUser.class)); for (Well well : wellSet) { well.createSmallMoleculeReagent(new ReagentVendorIdentifier("vendor2", well.getWellKey().toString()), "molfile " + lcv2.getVersionNumber() + " for well " + well.getWellKey(), "", "", null, null, null); } genericEntityDao.persistEntity(library); } } @Override protected void setUp() throws Exception { super.setUp(); _wellListDAOTransaction = new WellListDAOTransaction(); genericEntityDao.doInTransaction(_wellListDAOTransaction); } public void testExportWellsDataToSDF() throws IOException { LibraryContentsVersionReference lcvRef = new LibraryContentsVersionReference(); WellsSdfDataExporter wellsDataExporter = new WellsSdfDataExporter(genericEntityDao, lcvRef); Set<String> wellKeys = new HashSet<String>(); wellKeys.add("00001:A01"); wellKeys.add("00001:A02"); wellKeys.add("00001:A03"); LibraryContentsVersion lcv1 = genericEntityDao.findEntityByProperty(LibraryContentsVersion.class, "versionNumber", Integer.valueOf(1)); LibraryContentsVersion lcv2 = genericEntityDao.findEntityByProperty(LibraryContentsVersion.class, "versionNumber", Integer.valueOf(2)); InputStream exportedData = wellsDataExporter.export(wellKeys.iterator()); verifyExpectedWellsExported(wellKeys, lcv1, exportedData); lcvRef.setValue(lcv1); exportedData = wellsDataExporter.export(wellKeys.iterator()); verifyExpectedWellsExported(wellKeys, lcv1, exportedData); lcvRef.setValue(lcv2); exportedData = wellsDataExporter.export(wellKeys.iterator()); verifyExpectedWellsExported(wellKeys, lcv2, exportedData); } private void verifyExpectedWellsExported(Set<String> wellKeys, LibraryContentsVersion lcv, InputStream exportedData) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(exportedData)); String line; Pattern p = Pattern.compile("molfile (.+) for well (.+)"); Set<String> actualVersionNumbers = new HashSet<String>(); Set<String> actualWellKeys = new HashSet<String>(); while ((line = reader.readLine()) != null) { Matcher m = p.matcher(line); if (m.matches()) { actualVersionNumbers.add(m.group(1)); actualWellKeys.add(m.group(2)); } } reader.close(); assertEquals("library contents version numbers", Sets.newHashSet(lcv.getVersionNumber().toString()), actualVersionNumbers); assertEquals("exported well molfiles", wellKeys, actualWellKeys); } }