// $HeadURL: http://seanderickson1@forge.abcd.harvard.edu/svn/screensaver/branches/serickson/3200/web/src/main/java/edu/harvard/med/screensaver/ui/libraries/LibraryViewer.java $
// $Id: LibraryViewer.java 6946 2012-01-13 18:24:30Z seanderickson1 $
//
// 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.cells;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import org.apache.log4j.Logger;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import edu.harvard.med.screensaver.db.CellsDAO;
import edu.harvard.med.screensaver.db.GenericEntityDAO;
import edu.harvard.med.screensaver.db.datafetcher.DataFetcherUtil;
import edu.harvard.med.screensaver.db.datafetcher.EntityDataFetcher;
import edu.harvard.med.screensaver.db.hqlbuilder.HqlBuilder;
import edu.harvard.med.screensaver.model.cells.Cell;
import edu.harvard.med.screensaver.model.cells.ExperimentalCellInformation;
import edu.harvard.med.screensaver.model.screens.Screen;
import edu.harvard.med.screensaver.model.screens.ScreenType;
import edu.harvard.med.screensaver.ui.arch.datatable.model.InMemoryEntityDataModel;
import edu.harvard.med.screensaver.ui.arch.view.SearchResultContextEntityViewerBackingBean;
import edu.harvard.med.screensaver.ui.libraries.WellSearchResults;
import edu.harvard.med.screensaver.util.Pair;
/**
*/
public class CellViewer extends SearchResultContextEntityViewerBackingBean<Cell, Cell>
{
private static Logger log = Logger.getLogger(CellViewer.class);
private CellsDAO _cellsDao;
// private ScreenCellSearchResults _screenCellSearchResults;
private DataModel _reagentsScreened;
private Set<String> _wellsScreened;
private WellSearchResults _wellSearchResults;
private Cell _wellSearchCell;
private DataModel _screensAndStudiesDataModel;
/**
* @motivation for CGLIB2
*/
protected CellViewer() {
}
public CellViewer(CellViewer thisProxy, CellSearchResults cellSearchResults, WellSearchResults wellSearchResults, ScreenCellSearchResults screenCellSearchResults, GenericEntityDAO dao, CellsDAO cellsDao) {
super(thisProxy, Cell.class, BROWSE_CELLS, VIEW_CELL, dao, cellSearchResults);
_cellsDao = cellsDao;
// _screenCellSearchResults = screenCellSearchResults;
_wellSearchResults = wellSearchResults;
getIsPanelCollapsedMap().put("cellPanel", false);
getIsPanelCollapsedMap().put("reagentsScreened", true );
getIsPanelCollapsedMap().put("screensForCellPanel", true);
getIsPanelCollapsedMap().put("screensAndStudies", true);
}
@Override
protected void initializeEntity(Cell cell) {
getDao().needReadOnly(cell, Cell.experimentalCellInformationSetPath);
}
@Override
protected void initializeViewer(final Cell cell) {
// _screenCellSearchResults
// .initialize(new InMemoryEntityDataModel<ExperimentalCellInformation, Integer, ExperimentalCellInformation>(
// new EntityDataFetcher<ExperimentalCellInformation, Integer>(ExperimentalCellInformation.class, getDao()) {
// @Override
// public void addDomainRestrictions(HqlBuilder hql) {
// DataFetcherUtil.addDomainRestrictions(hql, ExperimentalCellInformation.cellProperty, cell,
// getRootAlias());
// }
// }));
_wellSearchCell = null;
_wellsScreened = _cellsDao.findCanonicalCompoundsScreenedByWellId(cell);
_screensAndStudiesDataModel = null;
}
//
// public ScreenCellSearchResults getScreenCellSearchResults() {
// return _screenCellSearchResults;
// }
public WellSearchResults getWellSearchResults()
{
if(_wellSearchCell == null && getEntity() != null && _wellsScreened != null)
{
// TODO: could reimplement wsr to show screens.
_wellSearchCell = getEntity();
_wellSearchResults.searchWellByWellId(_wellsScreened, "Compounds screened with cell: " +_wellSearchCell.getFacilityId(),
Sets.newHashSet(ScreenType.SMALL_MOLECULE));
}
return _wellSearchResults;
}
public boolean getHasReagents()
{
return _wellsScreened != null && !_wellsScreened.isEmpty();
}
public boolean getHasScreens()
{
return (getEntity() != null) && ! getEntity().getExperimentalCellInformationSet().isEmpty();
}
public DataModel getScreensAndStudiesDataModel()
{
if(_screensAndStudiesDataModel == null)
{
List<Pair<Screen,List<Cell>>> screenCellList = Lists.newArrayList();
// TODO, find out why the fetched cells.getExperimentalInformationSet only ever returns the first attached screen
Set<ExperimentalCellInformation> ecis = Sets.newHashSet(getDao().findEntitiesByProperty(ExperimentalCellInformation.class, "cell", getEntity()));
for(ExperimentalCellInformation eci:ecis) {
if(eci.getScreen() != null)
{
Screen s = eci.getScreen();
Set<ExperimentalCellInformation> otherEcis = Sets.newHashSet(getDao().findEntitiesByProperty(ExperimentalCellInformation.class, "screen", s));;
List<Cell> cells = Lists.newArrayList();
for(ExperimentalCellInformation eci1:otherEcis) {
cells.add(eci1.getCell());
}
Collections.sort(cells);
screenCellList.add(new Pair<Screen,List<Cell>>(s, cells));
// }else {
// Screen s = eci.getStudy();
// Set<ExperimentalCellInformation> otherEcis = Sets.newHashSet(getDao().findEntitiesByProperty(ExperimentalCellInformation.class, "study", s));;
// List<Cell> cells = Lists.newArrayList();
// for(ExperimentalCellInformation eci1:otherEcis) {
// cells.add(eci1.getCell());
// }
// Collections.sort(cells);
// screenCellList.add(new Pair<Screen,List<Cell>>(s, cells));
}
}
Collections.sort(screenCellList, new Comparator<Pair<Screen,List<Cell>>>() {
@Override
public int compare(Pair<Screen,List<Cell>> o1, Pair<Screen,List<Cell>> o2) {
return o1.getFirst().getFacilityId().compareTo(o2.getFirst().getFacilityId());
}});
_screensAndStudiesDataModel = new ListDataModel(screenCellList);
}
return _screensAndStudiesDataModel;
}
@Override
public String viewEntity() {
// TODO Auto-generated method stub
return super.viewEntity();
}
}