// $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.ui.libraries; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.apache.log4j.Logger; import org.joda.time.DateTime; import org.joda.time.LocalDate; import edu.harvard.med.lincs.screensaver.LincsScreensaverConstants; import edu.harvard.med.screensaver.db.Criterion; import edu.harvard.med.screensaver.db.GenericEntityDAO; import edu.harvard.med.screensaver.db.SortDirection; import edu.harvard.med.screensaver.db.Criterion.Operator; import edu.harvard.med.screensaver.db.datafetcher.EntityDataFetcher; import edu.harvard.med.screensaver.db.hqlbuilder.HqlBuilder; import edu.harvard.med.screensaver.model.libraries.Copy; import edu.harvard.med.screensaver.model.libraries.Library; import edu.harvard.med.screensaver.model.libraries.LibraryScreeningStatus; import edu.harvard.med.screensaver.model.libraries.LibraryType; import edu.harvard.med.screensaver.model.libraries.Plate; import edu.harvard.med.screensaver.model.libraries.Solvent; import edu.harvard.med.screensaver.model.meta.RelationshipPath; import edu.harvard.med.screensaver.model.screenresults.AssayPlate; import edu.harvard.med.screensaver.model.screens.LibraryScreening; import edu.harvard.med.screensaver.model.screens.Screen; import edu.harvard.med.screensaver.model.screens.ScreenType; import edu.harvard.med.screensaver.model.users.ScreensaverUserRole; import edu.harvard.med.screensaver.ui.arch.datatable.column.DateColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.TableColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.BooleanEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.DateEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.DateTimeEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.EnumEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.IntegerEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.TextEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.TextSetEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.model.InMemoryEntityDataModel; import edu.harvard.med.screensaver.ui.arch.searchresults.EntityBasedEntitySearchResults; import edu.harvard.med.screensaver.ui.arch.searchresults.SearchResults; /** * A {@link SearchResults} for {@link Library Libraries}. * * @author <a mailto="john_sullivan@hms.harvard.edu">John Sullivan</a> * @author <a mailto="andrew_tolopko@hms.harvard.edu">Andrew Tolopko</a> */ public class LibrarySearchResults extends EntityBasedEntitySearchResults<Library,Integer> { private static final Logger log = Logger.getLogger(LibrarySearchResults.class); public static final Set<LibraryType> LIBRARY_TYPES_TO_DISPLAY = new HashSet<LibraryType>(Arrays.asList(LibraryType.COMMERCIAL, LibraryType.KNOWN_BIOACTIVES, LibraryType.NATURAL_PRODUCTS, LibraryType.SIRNA, LibraryType.SHRNA, LibraryType.MIRNA_INHIBITOR, LibraryType.MIRNA_MIMIC, LibraryType.OTHER, LibraryType.FRAGMENT, LibraryType.ACADEMIC_COLLECTION)); private GenericEntityDAO _dao; private LibraryViewer _libraryViewer; private WellSearchResults _wellsBrowser; /** * @motivation for CGLIB2 */ protected LibrarySearchResults() { } public LibrarySearchResults(GenericEntityDAO dao, LibraryViewer libraryViewer, WellSearchResults wellsBrowser) { super(libraryViewer); _dao = dao; _libraryViewer = libraryViewer; _wellsBrowser = wellsBrowser; } @Override public void searchAll() { setTitle("Libraries"); initialize(new InMemoryEntityDataModel<Library,Integer,Library>(new EntityDataFetcher<Library,Integer>(Library.class, _dao) { @Override public void addDomainRestrictions(HqlBuilder hql) { hql.whereIn(getRootAlias(), "libraryType", LIBRARY_TYPES_TO_DISPLAY); } })); } public void searchLibraryScreenType(ScreenType screenType) { setTitle(screenType + " Libraries"); initialize(new InMemoryEntityDataModel<Library,Integer,Library>(new EntityDataFetcher<Library,Integer>(Library.class, _dao) { @Override public void addDomainRestrictions(HqlBuilder hql) { hql.whereIn(getRootAlias(), "libraryType", LIBRARY_TYPES_TO_DISPLAY); } })); TableColumn<Library,ScreenType> column = (TableColumn<Library,ScreenType>) getColumnManager().getColumn("Screen Type"); column.clearCriteria(); column.addCriterion(new Criterion<ScreenType>(Operator.EQUAL, screenType)); // [#2867] if (getScreensaverUser().isUserInRole(ScreensaverUserRole.LIBRARIES_ADMIN)) { getColumnManager().setSortColumnName("Start Plate"); getColumnManager().setSortDirection(SortDirection.DESCENDING); } } @SuppressWarnings("unchecked") protected List<? extends TableColumn<Library,?>> buildColumns() { ArrayList<TableColumn<Library,?>> columns = Lists.newArrayList(); columns.add(new TextEntityColumn<Library>(RelationshipPath.from(Library.class).toProperty("shortName"), "Short Name", "The abbreviated name for the library", TableColumn.UNGROUPED) { @Override public String getCellValue(Library library) { return library.getShortName(); } @Override public boolean isCommandLink() { return true; } @Override public Object cellAction(Library library) { return viewSelectedEntity(); } }); columns.add(new TextEntityColumn<Library>(RelationshipPath.from(Library.class).toProperty("libraryName"), "Library Name", "The full name of the library", TableColumn.UNGROUPED) { @Override public String getCellValue(Library library) { return library.getLibraryName(); } }); IntegerEntityColumn column = new IntegerEntityColumn<Library>(Library.startPlate, "Experimental Well Count", "The number of experimental wells in the library (click link to browse experimental wells)", TableColumn.UNGROUPED) { @Override public Integer getCellValue(Library library) { return library.getExperimentalWellCount(); } @Override public boolean isCommandLink() { return true; } public Object cellAction(Library library) { _wellsBrowser.searchWellsForLibrary(library); return BROWSE_WELLS; } }; columns.add(column); if (!!!getApplicationProperties().isFacility(LincsScreensaverConstants.FACILITY_KEY) || !!!getScreensaverUser().isUserInRole(ScreensaverUserRole.GUEST)) { columns.add(new TextEntityColumn<Library>(RelationshipPath.from(Library.class).toProperty("provider"), "Provider", "The vendor or source that provided the library", TableColumn.UNGROUPED) { @Override public String getCellValue(Library library) { return library.getProvider(); } }); } columns.add(new EnumEntityColumn<Library,ScreenType>(RelationshipPath.from(Library.class).toProperty("screenType"), "Screen Type", "'RNAi' or 'Small Molecule'", TableColumn.UNGROUPED, ScreenType.values()) { @Override public ScreenType getCellValue(Library library) { return library.getScreenType(); } }); columns.add(new EnumEntityColumn<Library,Solvent>(RelationshipPath.from(Library.class).toProperty("solvent"), "Solvent", "Solvent used in the library wells", TableColumn.UNGROUPED, Solvent.values()) { @Override public Solvent getCellValue(Library library) { return library.getSolvent(); } }); Iterables.getLast(columns).setVisible(false); if (!!!getApplicationProperties().isFacility(LincsScreensaverConstants.FACILITY_KEY)) { columns.add(new EnumEntityColumn<Library,LibraryType>(RelationshipPath.from(Library.class).toProperty("libraryType"), "Library Type", "The type of library, e.g., 'Commercial', 'Known Bioactives', 'siRNA', etc.", TableColumn.UNGROUPED, LibraryType.values()) { @Override public LibraryType getCellValue(Library library) { return library.getLibraryType(); } }); columns.add(new BooleanEntityColumn<Library>(RelationshipPath.from(Library.class).toProperty("pool"), "Is Pool", "Whether wells contains pools of reagents or single reagents", TableColumn.UNGROUPED) { @Override public Boolean getCellValue(Library library) { return library.isPool(); } }); } columns.add(new IntegerEntityColumn<Library>( Library.startPlate, "Start Plate", "The plate number for the first plate in the library", TableColumn.UNGROUPED) { @Override public Integer getCellValue(Library library) { return library.getStartPlate(); } }); columns.add(new IntegerEntityColumn<Library>(Library.endPlate, "End Plate", "The plate number for the last plate in the library", TableColumn.UNGROUPED) { @Override public Integer getCellValue(Library library) { return library.getEndPlate(); } }); if (!!!getApplicationProperties().isFacility(LincsScreensaverConstants.FACILITY_KEY)) { columns.add(new TextSetEntityColumn<Library>(Library.copies.toProperty("name"), "Copies", "The copies that have been made of this library", TableColumn.UNGROUPED) { @Override public Set<String> getCellValue(Library library) { if (library == null) { return null; } return Sets.newTreeSet(Iterables.transform(library.getCopies(), Copy.ToName)); } }); columns.get(columns.size() - 1).setAdministrative(true); } columns.add(new EnumEntityColumn<Library,LibraryScreeningStatus>(RelationshipPath.from(Library.class).toProperty("screeningStatus"), "Screening Status", "Screening status for the library, e.g., 'Allowed', 'Not Allowed', 'Not Yet Plated', etc.", TableColumn.UNGROUPED, LibraryScreeningStatus.values()) { @Override public LibraryScreeningStatus getCellValue(Library library) { return library == null ? null : library.getScreeningStatus(); } }); columns.get(columns.size() - 1).setAdministrative(true); columns.add(new DateColumn<Library>("Date First Plated", "The earliest date on which a copy of this library was plated", TableColumn.UNGROUPED) { @Override public LocalDate getDate(Library library) { return library.getDateScreenable(); } }); if (getApplicationProperties().isFacility(LincsScreensaverConstants.FACILITY_KEY)) { columns.add(new DateEntityColumn<Library>(RelationshipPath.from(Library.class).toProperty("dateCreated"), "Date Data Received", "The date the data was received", TableColumn.UNGROUPED) { @Override protected LocalDate getDate(Library library) { return library.getDateCreated().toLocalDate(); } }); } if (getApplicationProperties().isFacility(LincsScreensaverConstants.FACILITY_KEY)) { columns.add(new DateEntityColumn<Library>(RelationshipPath.from(Library.class).toProperty("dateLoaded"), "Date Loaded", "The date the library data was loaded", TableColumn.UNGROUPED) { @Override protected LocalDate getDate(Library library) { return library.getDateLoaded()==null ? null : library.getDateLoaded().toLocalDate(); } }); } if (getApplicationProperties().isFacility(LincsScreensaverConstants.FACILITY_KEY)) { columns.add(new DateEntityColumn<Library>(RelationshipPath.from(Library.class).toProperty("datePubliclyAvailable"), "Date Publicly Available", "The date the library data was made publicly available", TableColumn.UNGROUPED) { @Override protected LocalDate getDate(Library library) { return library.getDatePubliclyAvailable()==null ? null : library.getDatePubliclyAvailable().toLocalDate(); } }); } // TableColumnManager<Library> columnManager = getColumnManager(); // columnManager.addCompoundSortColumns(columnManager.getColumn("Screen Type"), // columnManager.getColumn("Library Type"), // columnManager.getColumn("Short Name")); // columnManager.addCompoundSortColumns(columnManager.getColumn("Library Type"), // columnManager.getColumn("Short HName")); return columns; } public void searchLibrariesScreened(final Screen screen) { setTitle("Libraries Screened by screen " + screen.getFacilityId()); EntityDataFetcher<Library,Integer> dataFetcher = new EntityDataFetcher<Library,Integer>(Library.class, _dao) { @Override public void addDomainRestrictions(HqlBuilder hql) { hql. from(Screen.class, "s"). from("s", Screen.assayPlates, "ap"). from("ap", AssayPlate.plateScreened, "p"). from("p", Plate.copy, "c"). from("c", Copy.library, "l"). where("s", screen). where("l", Operator.EQUAL, getRootAlias()); } }; initialize(new InMemoryEntityDataModel<Library,Integer,Library>(dataFetcher)); getColumnManager().getColumn("Copies").setVisible(false); } public void searchLibrariesScreened(final LibraryScreening libraryScreening) { setTitle("Libraries Screened by library screening " + libraryScreening.getActivityId()); EntityDataFetcher<Library,Integer> dataFetcher = new EntityDataFetcher<Library,Integer>(Library.class, _dao) { @Override public void addDomainRestrictions(HqlBuilder hql) { hql. from(LibraryScreening.class, "ls"). from("ls", LibraryScreening.assayPlatesScreened, "ap"). from("ap", AssayPlate.plateScreened, "p"). from("p", Plate.copy, "c"). from("c", Copy.library, "l"). where("ls", libraryScreening). where("l", Operator.EQUAL, getRootAlias()); } }; initialize(new InMemoryEntityDataModel<Library,Integer,Library>(dataFetcher)); getColumnManager().getColumn("Copies").setVisible(false); } public LibraryCopySearchResults getCopiesBrowser() { return _libraryViewer.getCopiesBrowser(); } }