// $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.Collection; import java.util.List; import java.util.Set; import java.util.SortedSet; 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.hibernate.Session; import org.joda.time.LocalDate; import org.springframework.transaction.annotation.Transactional; import edu.harvard.med.screensaver.db.GenericEntityDAO; import edu.harvard.med.screensaver.db.Query; import edu.harvard.med.screensaver.db.datafetcher.SetBasedDataFetcher; import edu.harvard.med.screensaver.db.hqlbuilder.HqlBuilder; import edu.harvard.med.screensaver.db.hqlbuilder.JoinType; import edu.harvard.med.screensaver.model.activities.Activity; import edu.harvard.med.screensaver.model.activities.AdministrativeActivity; import edu.harvard.med.screensaver.model.activities.AdministrativeActivityType; import edu.harvard.med.screensaver.model.libraries.Copy; import edu.harvard.med.screensaver.model.libraries.Library; import edu.harvard.med.screensaver.model.libraries.Plate; import edu.harvard.med.screensaver.model.libraries.PlateActivity; import edu.harvard.med.screensaver.model.users.ScreensaverUser; import edu.harvard.med.screensaver.ui.arch.datatable.column.DateColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.IntegerColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.TableColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.TextColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.UserNameColumn; import edu.harvard.med.screensaver.ui.arch.datatable.model.InMemoryDataModel; import edu.harvard.med.screensaver.ui.arch.searchresults.EntityBasedEntitySearchResults; public class LibraryCopyPlateCommentSearchResults extends EntityBasedEntitySearchResults<PlateActivity,Integer> { private static Logger log = Logger.getLogger(LibraryCopyPlateCommentSearchResults.class); private GenericEntityDAO _dao; private LibraryViewer _libraryViewer; private LibraryCopyViewer _libraryCopyViewer; private enum Mode { ALL, COPY, LIBRARY }; private Mode _mode; protected LibraryCopyPlateCommentSearchResults() {} public LibraryCopyPlateCommentSearchResults(GenericEntityDAO dao, LibraryViewer libraryViewer, LibraryCopyViewer libraryCopyViewer) { _dao = dao; _libraryViewer = libraryViewer; _libraryCopyViewer = libraryCopyViewer; getIsPanelCollapsedMap().put("lcpcsr", true); } @Override public void searchAll() { _mode = Mode.ALL; setTitle(""); throw new UnsupportedOperationException("should only be used to find comment update activities for a set of entities"); } @Transactional public void searchForCopy(Copy copy) { _mode = Mode.COPY; copy = _dao.reloadEntity(copy, true, Copy.plates.to(Plate.updateActivities).to(Activity.performedBy)); setTitle("Plate Comments for Copy: " + copy.getName()); initialize(copy.getPlates().values()); } @Transactional public void searchForLibrary(Library library) { _mode = Mode.LIBRARY; library = _dao.reloadEntity(library, true, Library.copies.to(Copy.plates).to(Plate.updateActivities).to(Activity.performedBy)); setTitle("Plate Comments for Library " + library.getLibraryName()); List<Plate> plates = Lists.newArrayList(); for (Copy copy : library.getCopies()) { plates.addAll(copy.getPlates().values()); } initialize(plates); } @Transactional public void searchForPlates(String title, Set<Integer> plateIds) { _mode = Mode.ALL; setTitle("Plate Comments for: " + title); final HqlBuilder builder = new HqlBuilder(); builder.select("p").distinctProjectionValues(); builder.from(Plate.class, "p"); builder.from("p", Plate.updateActivities, "a", JoinType.LEFT_FETCH); builder.from("a", Activity.performedBy, "pb", JoinType.LEFT_FETCH); builder.whereIn("p", "id", plateIds); log.info("builder.toHql(): " + builder.toHql() + ", " + plateIds); Query<Plate> query = new Query<Plate>() { @Override public List<Plate> execute(Session session) { return builder.toQuery(session, true).list(); } }; initialize(_dao.runQuery(query)); } private void initialize(Collection<Plate> plates) { SortedSet<PlateActivity> comments = Sets.newTreeSet(); for (Plate plate : plates) { //plate = _dao.reloadEntity(plate); for (AdministrativeActivity ae : plate.getUpdateActivitiesOfType(AdministrativeActivityType.COMMENT)) { comments.add(new PlateActivity(plate, ae)); } } initialize(new InMemoryDataModel<PlateActivity>(new SetBasedDataFetcher<PlateActivity,Integer>(comments))); } @Override protected List<? extends TableColumn<PlateActivity,?>> buildColumns() { List<TableColumn<PlateActivity,?>> columns = Lists.newArrayList(); columns.add(new IntegerColumn<PlateActivity>("Plate", "Plate number", TableColumn.UNGROUPED) { @Override public Integer getCellValue(PlateActivity ae) { return ae.getPlate().getPlateNumber(); } }); columns.add(new TextColumn<PlateActivity>("Copy", "The library copy containing the plate", TableColumn.UNGROUPED) { @Override public String getCellValue(PlateActivity ae) { return ae.getPlate().getCopy().getName(); } @Override public boolean isCommandLink() { return true; } @Override public Object cellAction(PlateActivity ae) { getIsPanelCollapsedMap().put("lcpcsr", true); return _libraryCopyViewer.viewEntity(ae.getPlate().getCopy()); } }); Iterables.getLast(columns).setVisible(_mode != Mode.COPY); columns.add(new TextColumn<PlateActivity>("Library", "The library containing the plate", TableColumn.UNGROUPED) { @Override public String getCellValue(PlateActivity ae) { return ae.getPlate().getCopy().getLibrary().getLibraryName(); } @Override public boolean isCommandLink() { return true; } @Override public Object cellAction(PlateActivity ae) { getIsPanelCollapsedMap().put("lcpcsr", true); return _libraryViewer.viewEntity(ae.getPlate().getCopy().getLibrary()); } }); Iterables.getLast(columns).setVisible(_mode == Mode.ALL); columns.add(new TextColumn<PlateActivity>("Comment", "Comment", TableColumn.UNGROUPED) { @Override public String getCellValue(PlateActivity activity) { return activity.getAdministrativeActivity().getComments(); } }); columns.add(new DateColumn<PlateActivity>("Comment Date", "The date that a corresponding real-world activity was performed", TableColumn.UNGROUPED) { @Override protected LocalDate getDate(PlateActivity pa) { return pa.getAdministrativeActivity().getDateOfActivity(); } }); columns.add(new UserNameColumn<PlateActivity,ScreensaverUser>(null, "Comment by", "The administrator who made the comment", TableColumn.UNGROUPED, null) { @Override public ScreensaverUser getUser(PlateActivity ae) { return (ScreensaverUser) ae.getAdministrativeActivity().getPerformedBy(); } }); return columns; } }