// $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.activities; import java.math.BigDecimal; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import javax.faces.model.DataModel; import javax.faces.model.ListDataModel; import javax.faces.model.SelectItem; import javax.persistence.Transient; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableSet; 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.Hibernate; import org.springframework.transaction.annotation.Transactional; import edu.harvard.med.screensaver.ScreensaverConstants; import edu.harvard.med.screensaver.db.EntityInflator; import edu.harvard.med.screensaver.db.GenericEntityDAO; import edu.harvard.med.screensaver.db.LibrariesDAO; import edu.harvard.med.screensaver.db.ScreenDAO; import edu.harvard.med.screensaver.model.MolarConcentration; import edu.harvard.med.screensaver.model.MolarUnit; import edu.harvard.med.screensaver.model.Volume; import edu.harvard.med.screensaver.model.VolumeUnit; import edu.harvard.med.screensaver.model.activities.Activity; import edu.harvard.med.screensaver.model.activities.ServiceActivity; import edu.harvard.med.screensaver.model.activities.ServiceActivityType; import edu.harvard.med.screensaver.model.cherrypicks.CherryPickAssayPlate; import edu.harvard.med.screensaver.model.cherrypicks.CherryPickLiquidTransfer; import edu.harvard.med.screensaver.model.cherrypicks.CherryPickRequest; import edu.harvard.med.screensaver.model.libraries.Copy; import edu.harvard.med.screensaver.model.libraries.CopyUsageType; import edu.harvard.med.screensaver.model.libraries.Library; import edu.harvard.med.screensaver.model.libraries.Plate; import edu.harvard.med.screensaver.model.libraries.PlateRange; import edu.harvard.med.screensaver.model.screenresults.AssayPlate; import edu.harvard.med.screensaver.model.screens.AssayProtocolType; import edu.harvard.med.screensaver.model.screens.CherryPickScreening; import edu.harvard.med.screensaver.model.screens.FundingSupport; import edu.harvard.med.screensaver.model.screens.LabActivity; import edu.harvard.med.screensaver.model.screens.LibraryScreening; import edu.harvard.med.screensaver.model.screens.Screen; import edu.harvard.med.screensaver.model.screens.Screening; import edu.harvard.med.screensaver.model.users.ScreeningRoomUser; import edu.harvard.med.screensaver.model.users.ScreensaverUser; import edu.harvard.med.screensaver.model.users.ScreensaverUserRole; import edu.harvard.med.screensaver.service.libraries.LibraryScreeningDerivedPropertiesUpdater; import edu.harvard.med.screensaver.service.screens.ScreenDerivedPropertiesUpdater; import edu.harvard.med.screensaver.ui.arch.util.JSFUtils; import edu.harvard.med.screensaver.ui.arch.util.UISelectOneBean; import edu.harvard.med.screensaver.ui.arch.util.UISelectOneEntityBean; import edu.harvard.med.screensaver.ui.arch.view.EditResult; import edu.harvard.med.screensaver.ui.arch.view.SearchResultContextEditableEntityViewerBackingBean; import edu.harvard.med.screensaver.ui.arch.view.aspects.UICommand; import edu.harvard.med.screensaver.ui.cherrypickrequests.CherryPickRequestViewer; import edu.harvard.med.screensaver.ui.cherrypickrequests.SelectableRow; import edu.harvard.med.screensaver.ui.libraries.LibrarySearchResults; import edu.harvard.med.screensaver.ui.screens.ScreenViewer; import edu.harvard.med.screensaver.ui.users.UserViewer; import edu.harvard.med.screensaver.util.StringUtils; public class ActivityViewer extends SearchResultContextEditableEntityViewerBackingBean<Activity,Activity> { private static Logger log = Logger.getLogger(ActivityViewer.class); private LibrariesDAO _librariesDao; private ScreenDAO _screenDao; private ScreenViewer _screenViewer; private UserViewer _userViewer; private CherryPickRequestViewer _cherryPickRequestViewer; private LibrarySearchResults _librarySearchResults; private ScreenDerivedPropertiesUpdater _screenDerivedPropertiesUpdater; private LibraryScreeningDerivedPropertiesUpdater _libraryScreeningDerivedPropertiesUpdater; private UISelectOneEntityBean<ScreensaverUser> _performedBy; private Screen _screen; private UISelectOneBean<AssayProtocolType> _assayProtocolType; private UISelectOneBean<MolarUnit> _concentrationType; private UISelectOneBean<VolumeUnit> _volumeTransferredPerWellToAssayPlatesType; private UISelectOneBean<VolumeUnit> _volumeTransferredPerWellFromLibraryPlatesType; private UISelectOneBean<VolumeUnit> _assayWellVolumeType; private String _concentrationValue; private String _volumeTransferredPerWellToAssayPlatesValue; private String _volumeTransferredPerWellFromLibraryPlatesValue; private String _assayWellVolumeValue; private String _fundingSupportValue; private DataModel _cherryPickPlatesDataModel; private DataModel _platesScreenedDataModel; private Integer _newPlateRangeScreenedStartPlate; private Integer _newPlateRangeScreenedEndPlate; private UISelectOneBean<String> _newPlateRangeScreenedCopy; private List<Copy> _copies; private TreeSet<Plate> _platesScreened; private boolean _editingNewEntity; private ScreeningRoomUser _servicedUser; private UISelectOneBean<Screen> _servicedScreen; /** * @motivation for CGLIB2 */ protected ActivityViewer() { } public ActivityViewer(ActivityViewer thisProxy, GenericEntityDAO dao, LibrariesDAO librariesDao, ScreenDAO screenDao, ActivitySearchResults activitiesBrowser, ScreenViewer screenViewer, UserViewer userViewer, CherryPickRequestViewer cherryPickRequestViewer, LibrarySearchResults librarySearchResults, ScreenDerivedPropertiesUpdater screenDerivedPropertiesUpdater, LibraryScreeningDerivedPropertiesUpdater libraryScreeningDerivedPropertiesUpdater) { super(thisProxy, Activity.class, BROWSE_ACTIVITIES, VIEW_ACTIVITY, dao, activitiesBrowser); _screenViewer = screenViewer; _userViewer = userViewer; _cherryPickRequestViewer = cherryPickRequestViewer; _librariesDao = librariesDao; _screenDao = screenDao; _librarySearchResults = librarySearchResults; _screenDerivedPropertiesUpdater = screenDerivedPropertiesUpdater; _libraryScreeningDerivedPropertiesUpdater = libraryScreeningDerivedPropertiesUpdater; } public UISelectOneBean<ScreensaverUser> getPerformedBy() { if (_performedBy == null) { _performedBy = new UISelectOneEntityBean<ScreensaverUser>(findPerformedByCandidates(), getEntity().getPerformedBy(), getDao()) { @Override protected String makeLabel(ScreensaverUser t) { return t.getFullNameLastFirst(); } }; } return _performedBy; } @Override final protected void updateEntityProperties(Activity entity) { if (getEntity() instanceof ServiceActivity) { getDao().needReadOnly((ServiceActivity) entity, ServiceActivity.servicedScreen); getDao().needReadOnly((ServiceActivity) entity, ServiceActivity.servicedUser); ((ServiceActivity) entity).setServicedScreen(getServicedScreen().getSelection()); if(_fundingSupportValue != null && _fundingSupportValue != ""){ FundingSupport selected = null; for(FundingSupport fs : getDao().findAllEntitiesOfType(FundingSupport.class)){ log.error("trying: " + fs.getValue()+ "," +_fundingSupportValue.equals(fs.getValue())); if(_fundingSupportValue.equals(fs.getValue())){ selected = fs; break; } } if(selected != null){ ((ServiceActivity) entity).setFundingSupport(selected); }else{ log.warn("unable to locate funding support:" + _fundingSupportValue); } } } else if (getEntity() instanceof LabActivity) { getDao().needReadOnly((LabActivity) entity, LabActivity.Screen); if (entity instanceof Screening) { ((Screening) entity).setVolumeTransferredPerWellToAssayPlates( Volume.makeVolume(_volumeTransferredPerWellToAssayPlatesValue, _volumeTransferredPerWellToAssayPlatesType.getSelection() )) ;//, RoundingMode.HALF_UP)); // auto-calculate the volumeTransferredPerWellFromLibraryPlates property, if user left it blank if (StringUtils.isEmpty(_volumeTransferredPerWellFromLibraryPlatesValue) && !!!StringUtils.isEmpty(_volumeTransferredPerWellToAssayPlatesValue)) { _volumeTransferredPerWellFromLibraryPlatesValue = ((Screening) entity).getVolumeTransferredPerWellToAssayPlates().getValue().multiply(new BigDecimal(((Screening) entity).getNumberOfReplicates())).toString(); _volumeTransferredPerWellFromLibraryPlatesType.setSelection(_volumeTransferredPerWellToAssayPlatesType.getSelection()); } ((Screening) entity).setVolumeTransferredPerWellFromLibraryPlates( Volume.makeVolume(_volumeTransferredPerWellFromLibraryPlatesValue, _volumeTransferredPerWellFromLibraryPlatesType.getSelection())); //, RoundingMode.HALF_UP)); ((Screening) entity).setAssayWellVolume(Volume.makeVolume(_assayWellVolumeValue, _assayWellVolumeType.getSelection())); //, RoundingMode.HALF_UP)); ((Screening) entity).setMolarConcentration(MolarConcentration.makeConcentration(_concentrationValue, _concentrationType.getSelection())); //, RoundingMode.HALF_UP)); } if (entity instanceof CherryPickScreening) { CherryPickScreening screening = (CherryPickScreening) entity; for (SelectableRow<CherryPickAssayPlate> row : (List<SelectableRow<CherryPickAssayPlate>>) getCherryPickPlatesDataModel().getWrappedData()) { if (row.isSelected() && !screening.getCherryPickAssayPlatesScreened().contains(row.getData())) { screening.addCherryPickAssayPlateScreened(getDao().mergeEntity(row.getData())); } else if (!row.isSelected() && screening.getCherryPickAssayPlatesScreened().contains(row.getData())) { screening.removeCherryPickAssayPlateScreened(getDao().mergeEntity(row.getData())); } } } if (entity instanceof CherryPickLiquidTransfer) { if (_editingNewEntity) { _screenDerivedPropertiesUpdater.updateTotalPlatedLabCherryPickCount(((CherryPickLiquidTransfer) entity).getScreen()); } } if (entity instanceof LibraryScreening) { LibraryScreening libraryScreening = (LibraryScreening) entity; Set<Plate> originalPlates = Sets.newHashSet(Iterables.transform(libraryScreening.getAssayPlatesScreened(), AssayPlate.ToPlate)); Set<Plate> deletedPlates = Sets.difference(originalPlates, _platesScreened); Set<Plate> addedPlates = Sets.difference(_platesScreened, originalPlates); for (Plate deletedPlate : deletedPlates) { libraryScreening.removeAssayPlatesScreened(deletedPlate); } for (Plate addedPlate : addedPlates) { libraryScreening.addAssayPlatesScreened(addedPlate); } _libraryScreeningDerivedPropertiesUpdater.updateScreeningStatistics(libraryScreening); } } // note: execute this after related entities are reattached, to avoid NonUniqueObjectExceptions entity.setPerformedBy(getPerformedBy().getSelection()); } @Override protected void initializeEntity(Activity activity) { Hibernate.initialize(activity.getPerformedBy()); if (activity instanceof ServiceActivity) { getDao().needReadOnly((ServiceActivity) activity, ServiceActivity.servicedScreen); getDao().needReadOnly((ServiceActivity) activity, ServiceActivity.servicedUser); } else if (activity instanceof LabActivity) { getDao().needReadOnly((LabActivity) activity, LabActivity.Screen); if (activity instanceof LibraryScreening) { getDao().needReadOnly((LibraryScreening) activity, LibraryScreening.Screen.to(Screen.assayPlates)); getDao().needReadOnly((LibraryScreening) activity, LibraryScreening.assayPlatesScreened.to(AssayPlate.plateScreened).to(Plate.copy).to(Copy.library)); _platesScreened = Sets.newTreeSet(Iterables.transform(((LibraryScreening) activity).getAssayPlatesScreened(), AssayPlate.ToPlate)); } if (activity instanceof CherryPickScreening) { getDao().needReadOnly((CherryPickScreening) activity, CherryPickScreening.cherryPickRequest.to(CherryPickRequest.requestedBy)); getDao().needReadOnly((CherryPickScreening) activity, CherryPickScreening.cherryPickAssayPlatesScreened); } if (activity instanceof CherryPickLiquidTransfer) { getDao().needReadOnly((CherryPickLiquidTransfer) activity, CherryPickLiquidTransfer.cherryPickAssayPlates.to(CherryPickAssayPlate.cherryPickRequest).to(CherryPickRequest.requestedBy)); } } _editingNewEntity = false; } @Override protected void initializeNewEntity(Activity activity) { super.initializeNewEntity(activity); // set null dateOfActivity, to force user to enter a valid date // TODO: this model shouldn't allow this null value, and we should really set to null at the UI component level only if (activity instanceof LibraryScreening) { activity.setDateOfActivity(null); _platesScreened = Sets.newTreeSet(); } _editingNewEntity = true; } @Override protected void initializeViewer(Activity activity) { _performedBy = null; _screen = null; _servicedScreen = null; _servicedUser = null; _cherryPickPlatesDataModel = null; _newPlateRangeScreenedStartPlate = null; _newPlateRangeScreenedEndPlate = null; _newPlateRangeScreenedCopy = null; _copies = null; _platesScreenedDataModel = null; _concentrationType = null; _concentrationValue = null; _volumeTransferredPerWellFromLibraryPlatesType = null; _volumeTransferredPerWellToAssayPlatesType = null; _volumeTransferredPerWellToAssayPlatesValue = null; _volumeTransferredPerWellFromLibraryPlatesType = null; _volumeTransferredPerWellFromLibraryPlatesValue = null; _assayWellVolumeValue = null; _assayWellVolumeType = null; _fundingSupportValue = null; } /** * @motivation hack to avoid Hibernate exceptions related to cases when the Activity.screen.{labHead,leadScreener} and * Activity.performedBy relationships are the same entity; this method returns an independently retrieved * Screen object from the LabActivity object, and so is not reattached when the Activity is saved/updated. */ @Transactional public Screen getScreen() { if (_screen == null) { if (getEntity() instanceof LabActivity) { _screen = getDao().reloadEntity(((LabActivity) getEntity()).getScreen()); } else if (getEntity() instanceof ServiceActivity) { _screen = getDao().reloadEntity(((ServiceActivity) getEntity()).getServicedScreen()); } if (_screen != null) { getDao().needReadOnly(_screen, Screen.labHead); getDao().needReadOnly(_screen, Screen.leadScreener); } } return _screen; } @Transactional public ScreeningRoomUser getServicedUser() { if (_servicedUser == null) { if (getEntity() instanceof ServiceActivity) { _servicedUser = getDao().reloadEntity(((ServiceActivity) getEntity()).getServicedUser()); } } return _servicedUser; } public UISelectOneBean<VolumeUnit> getVolumeTransferredPerWellFromLibraryPlatesType() { if (_volumeTransferredPerWellFromLibraryPlatesType == null && getEntity() instanceof LabActivity) { _volumeTransferredPerWellFromLibraryPlatesType = initVolumeType(((LabActivity) getEntity()).getVolumeTransferredPerWellFromLibraryPlates()); } return _volumeTransferredPerWellFromLibraryPlatesType; } public UISelectOneBean<VolumeUnit> getVolumeTransferredPerWellToAssayPlatesType() { if (_volumeTransferredPerWellToAssayPlatesType == null && getEntity() instanceof Screening) { _volumeTransferredPerWellToAssayPlatesType = initVolumeType(((Screening) getEntity()).getVolumeTransferredPerWellToAssayPlates()); } return _volumeTransferredPerWellToAssayPlatesType; } private UISelectOneBean<VolumeUnit> initVolumeType(Volume initialVolume) { Volume v = initialVolume; VolumeUnit unit = (v == null ? VolumeUnit.NANOLITERS : v.getUnits()); return new UISelectOneBean<VolumeUnit>(VolumeUnit.DISPLAY_VALUES, unit) { @Override protected String makeLabel(VolumeUnit t) { return t.getValue(); } }; } public String getVolumeTransferredPerWellToAssayPlatesValue() { if (_volumeTransferredPerWellToAssayPlatesValue == null) { Volume volumeTransferredPerWell = ((Screening) getEntity()).getVolumeTransferredPerWellToAssayPlates(); if (volumeTransferredPerWell != null) { _volumeTransferredPerWellToAssayPlatesValue = volumeTransferredPerWell.getDisplayValue().toString(); } } return _volumeTransferredPerWellToAssayPlatesValue; } public void setVolumeTransferredPerWellToAssayPlatesValue(String value) { _volumeTransferredPerWellToAssayPlatesValue = value; } public String getVolumeTransferredPerWellFromLibraryPlatesValue() { if (_volumeTransferredPerWellFromLibraryPlatesValue == null) { Volume volumeTransferredPerWell = ((LabActivity) getEntity()).getVolumeTransferredPerWellFromLibraryPlates(); if (volumeTransferredPerWell != null) { _volumeTransferredPerWellFromLibraryPlatesValue = volumeTransferredPerWell.getDisplayValue().toString(); } } return _volumeTransferredPerWellFromLibraryPlatesValue; } public void setVolumeTransferredPerWellFromLibraryPlatesValue(String value) { _volumeTransferredPerWellFromLibraryPlatesValue = value; } public MolarConcentration getMolarConcentration() { if (getEntity() instanceof LabActivity) { return ((LabActivity) getEntity()).getMolarConcentration(); } return null; } public UISelectOneBean<MolarUnit> getMolarConcentrationType() { try { if (getEntity() instanceof LabActivity) { if (_concentrationType == null) { setMolarConcentrationType(((LabActivity) getEntity()).getMolarConcentrationUnits()); } } return _concentrationType; } catch (Exception e) { log.error("err: " + e); return null; } } private void setMolarConcentrationType(MolarUnit unit) { _concentrationType = new UISelectOneBean<MolarUnit>(MolarUnit.DISPLAY_VALUES, unit) { @Override protected String makeLabel(MolarUnit t) { return t.getValue(); } }; } /** * This method exists to grab the value portion of the Quantity stored */ public String getMolarConcentrationValue() { if (getEntity() instanceof LabActivity) { if (_concentrationValue == null) { _concentrationValue = ((LabActivity) getEntity()).getMolarConcentrationValue(); } } return _concentrationValue; } /** * This method exists to set the value portion of the Quantity stored * @see #save() */ public void setMolarConcentrationValue(String value) { _concentrationValue = value; } public UISelectOneBean<AssayProtocolType> getAssayProtocolType() { if (_assayProtocolType == null) { _assayProtocolType = new UISelectOneBean<AssayProtocolType>(Arrays.asList(AssayProtocolType.values()), getEntity() instanceof Screening ? ((Screening) getEntity()).getAssayProtocolType() : null) { @Override protected String makeLabel(AssayProtocolType t) { return t.getValue(); } }; } return _assayProtocolType; } /** * This method exists to grab the value portion of the Quantity stored */ public String getAssayWellVolumeValue() { if (_assayWellVolumeValue == null) { if (getEntity() instanceof Screening) { Volume volume = ((Screening) getEntity()).getAssayWellVolume(); if (volume != null) { _assayWellVolumeValue = volume.getDisplayValue().toString(); } } } return _assayWellVolumeValue; } /** * This method exists to set the value portion of the Quantity stored * * @see #save() */ public void setAssayWellVolumeValue(String value) { _assayWellVolumeValue = value; } public UISelectOneBean<VolumeUnit> getAssayWellVolumeType() { try { if (_assayWellVolumeType == null) { Volume v = (getEntity() instanceof Screening ? ((Screening) getEntity()).getAssayWellVolume() : null); VolumeUnit unit = (v == null ? VolumeUnit.NANOLITERS : v.getUnits()); _assayWellVolumeType = new UISelectOneBean<VolumeUnit>(VolumeUnit.DISPLAY_VALUES, unit) { @Override protected String makeLabel(VolumeUnit t) { return t.getValue(); } }; } return _assayWellVolumeType; } catch (Exception e) { log.error("err: " + e); return null; } } @Override protected boolean validateEntity(Activity entity) { super.validateEntity(entity); boolean valid = true; if (entity instanceof Screening) { try { Volume.makeVolume(getVolumeTransferredPerWellToAssayPlatesValue(), getVolumeTransferredPerWellToAssayPlatesType().getSelection()); } catch (ArithmeticException e) { showFieldInputError("Volume Transferred Per Replicate To Assay Plates: number format error: allowed range (>= 1.0 nL, < 1.0L), in 1 nL increments", e.getLocalizedMessage()); valid = false; } catch (Exception e) { showFieldInputError("Volume Transferred Per Replicate To Assay Plates", e.getLocalizedMessage()); valid = false; } try { Volume.makeVolume(getVolumeTransferredPerWellFromLibraryPlatesValue(), getVolumeTransferredPerWellFromLibraryPlatesType().getSelection()); } catch (ArithmeticException e) { showFieldInputError("Volume Transferred Per Replicate From Library Plates: number format error: allowed range (>= 1.0 nL, < 1.0L), in 1 nL increments", e.getLocalizedMessage()); valid = false; } catch (Exception e) { showFieldInputError("Volume Transferred Per Replicate From Library Plates", e.getLocalizedMessage()); valid = false; } try { Volume.makeVolume(getAssayWellVolumeValue(), getAssayWellVolumeType().getSelection()); } catch (ArithmeticException e) { showFieldInputError("Assay Well Volume: number format error: allowed range (>= 1.0 nL, < 1.0L), in 1 nL increments", e.getLocalizedMessage()); valid = false; } catch (Exception e) { showFieldInputError("Assay Well Volume", e.getLocalizedMessage()); valid = false; } try { MolarConcentration.makeConcentration(getMolarConcentrationValue(), getMolarConcentrationType().getSelection()); //, RoundingMode.HALF_UP); } catch (ArithmeticException e) { showFieldInputError("Molar Concentration: value is out of range (1pM to 10 M), rounding not allowed", e.getLocalizedMessage()); valid = false; } catch (Exception e) { showFieldInputError("Molar Concentration", e.getLocalizedMessage()); valid = false; } } if (entity instanceof CherryPickScreening) { for (SelectableRow<CherryPickAssayPlate> row : (List<SelectableRow<CherryPickAssayPlate>>) getCherryPickPlatesDataModel().getWrappedData()) { CherryPickAssayPlate plate = row.getData(); if (row.isSelected() && !((CherryPickScreening) entity).getCherryPickAssayPlatesScreened().contains(row.getData())) { if (!plate.isPlated() || plate.isPlatedAndScreened()) { reportApplicationError("Plate " + plate.getName() + " cannot be screened because its status is " + plate.getStatusLabel()); row.setSelected(false); valid = false; } } } } return valid; } public DataModel getPlatesScreenedDataModel() { if (_platesScreenedDataModel == null) { if (getEntity() instanceof LibraryScreening) { _platesScreenedDataModel = new ListDataModel(PlateRange.splitIntoPlateCopyRanges(_platesScreened)); } } return _platesScreenedDataModel; } public Integer getNewPlateRangeScreenedStartPlate() { return _newPlateRangeScreenedStartPlate; } public void setNewPlateRangeScreenedStartPlate(Integer newPlateRangeScreenedStartPlate) { this._newPlateRangeScreenedStartPlate = newPlateRangeScreenedStartPlate; } public Integer getNewPlateRangeScreenedEndPlate() { return _newPlateRangeScreenedEndPlate; } public void setNewPlateRangeScreenedEndPlate(Integer newPlateRangeScreenedEndPlate) { this._newPlateRangeScreenedEndPlate = newPlateRangeScreenedEndPlate; } public UISelectOneBean<String> getNewPlateRangeScreenedCopy() { if (_newPlateRangeScreenedCopy == null) { _copies = getAllCopies(); SortedSet<String> copyNames = Sets.newTreeSet(Iterables.transform(_copies, Copy.ToName)); _newPlateRangeScreenedCopy = new UISelectOneBean<String>(copyNames, null, true) { @Override protected String getEmptyLabel() { return ScreensaverConstants.REQUIRED_VOCAB_FIELD_PROMPT; } }; } return _newPlateRangeScreenedCopy; } public DataModel getCherryPickPlatesDataModel() { if (_cherryPickPlatesDataModel == null) { List<SelectableRow<CherryPickAssayPlate>> rows = Lists.newArrayList(); List<CherryPickAssayPlate> plates = Lists.newArrayList(); Set<CherryPickAssayPlate> selectedPlates = Sets.newHashSet(); if (getEntity() instanceof CherryPickScreening) { CherryPickRequest cpr = new EntityInflator<CherryPickRequest>(getDao(), ((CherryPickScreening) getEntity()).getCherryPickRequest(), true). need(CherryPickRequest.requestedBy). need(CherryPickRequest.screen). need(CherryPickRequest.cherryPickAssayPlates.to(CherryPickAssayPlate.cherryPickScreenings)). need(CherryPickRequest.cherryPickAssayPlates.to(CherryPickAssayPlate.cherryPickLiquidTransfer)).inflate(); plates = cpr.getActiveCherryPickAssayPlates(); selectedPlates = ((CherryPickScreening) getEntity()).getCherryPickAssayPlatesScreened(); } else if (getEntity() instanceof CherryPickLiquidTransfer) { CherryPickLiquidTransfer cplt = (CherryPickLiquidTransfer) getEntity(); if (cplt.getCherryPickRequest() != null) { CherryPickRequest cpr = new EntityInflator<CherryPickRequest>(getDao(), cplt.getCherryPickRequest(), true). need(CherryPickRequest.requestedBy). need(CherryPickRequest.screen). need(CherryPickRequest.cherryPickAssayPlates.to(CherryPickAssayPlate.cherryPickScreenings)). need(CherryPickRequest.cherryPickAssayPlates.to(CherryPickAssayPlate.cherryPickLiquidTransfer).to(CherryPickLiquidTransfer.cherryPickAssayPlates)).inflate(); plates = cpr.getActiveCherryPickAssayPlates(); selectedPlates = cplt.getCherryPickAssayPlates(); } } for (CherryPickAssayPlate plate : plates) { rows.add(new SelectableRow<CherryPickAssayPlate>(plate, selectedPlates.contains(plate))); } _cherryPickPlatesDataModel = new ListDataModel(rows); } return _cherryPickPlatesDataModel; } public List<Copy> getAllCopies() { return getDao().findEntitiesByProperty(Copy.class, "usageType", CopyUsageType.LIBRARY_SCREENING_PLATES, true, Copy.library); } @UICommand @Transactional public String addNewPlateRangeScreened() { if (getEntity() instanceof LibraryScreening) { LibraryScreening libraryScreening = (LibraryScreening) getEntity(); if (libraryScreening.getNumberOfReplicates() == null || libraryScreening.getNumberOfReplicates() == 0) { showMessage("activities.numberOfReplicatesRequired"); return REDISPLAY_PAGE_ACTION_RESULT; } if (getNewPlateRangeScreenedCopy().getSelection() == null) { showMessage("activities.copyRequired"); return REDISPLAY_PAGE_ACTION_RESULT; } if (getNewPlateRangeScreenedStartPlate() != null && getNewPlateRangeScreenedCopy() != null) { Set<Library> librariesInPlateRange = Sets.newLinkedHashSet(); if (getNewPlateRangeScreenedEndPlate() == null) { setNewPlateRangeScreenedEndPlate(getNewPlateRangeScreenedStartPlate()); } if (getNewPlateRangeScreenedEndPlate() < getNewPlateRangeScreenedStartPlate()) { showMessage("activities.plateRangePlateNumbersReversed", getNewPlateRangeScreenedStartPlate(), getNewPlateRangeScreenedEndPlate()); return REDISPLAY_PAGE_ACTION_RESULT; } for (int plateNumber = getNewPlateRangeScreenedStartPlate(); plateNumber <= getNewPlateRangeScreenedEndPlate(); ++plateNumber) { final Plate plate = _librariesDao.findPlate(plateNumber, getNewPlateRangeScreenedCopy().getSelection()); if (plate == null) { showMessage("activities.unknownPlateNumberAndOrCopy", plateNumber, getNewPlateRangeScreenedCopy().getSelection()); return REDISPLAY_PAGE_ACTION_RESULT; } librariesInPlateRange.add(plate.getCopy().getLibrary()); if (_platesScreened.contains(plate)) { showMessage("activities.plateNumberDuplicated", plate.getPlateNumber()); return REDISPLAY_PAGE_ACTION_RESULT; } _platesScreened.add(plate); } if (librariesInPlateRange.size() > 1) { showMessage("activities.plateRangeSpansMultipleLibrariesWarning", getNewPlateRangeScreenedStartPlate(), getNewPlateRangeScreenedEndPlate(), Joiner.on(", ").join(Iterables.transform(librariesInPlateRange, Library.ToShortName))); } } _platesScreenedDataModel = null; _newPlateRangeScreenedCopy = null; _newPlateRangeScreenedEndPlate = null; _newPlateRangeScreenedStartPlate = null; } return REDISPLAY_PAGE_ACTION_RESULT; } @UICommand @Transactional public String deletePlateRange() { if (getEntity() instanceof LibraryScreening) { PlateRange plateRange = (PlateRange) getPlatesScreenedDataModel().getRowData(); for (Plate plate : plateRange) { _platesScreened.remove(plate); //libraryScreening.removeAssayPlatesScreened(plate); } _platesScreenedDataModel = null; // getDao().mergeEntity(getEntity().getScreen()); // save(); // save NOW! (see above) // edit(); // resume edit mode } return REDISPLAY_PAGE_ACTION_RESULT; } @Override protected String postEditAction(EditResult editResult) { if (getEntity() instanceof LibraryScreening) { switch (editResult) { case CANCEL_EDIT: return getThisProxy().reload(); case SAVE_EDIT: return getThisProxy().reload(); case CANCEL_NEW: return _screenViewer.reload(); case SAVE_NEW: return _screenViewer.reload(); } } else if (getEntity() instanceof CherryPickLiquidTransfer) { switch (editResult) { case CANCEL_EDIT: return getThisProxy().reload(); case SAVE_EDIT: return getThisProxy().reload(); case CANCEL_NEW: return _cherryPickRequestViewer.reload(); case SAVE_NEW: { if (((CherryPickLiquidTransfer) getEntity()).isFailed()) { _cherryPickRequestViewer.createNewAssayPlatesForFailed(); } return _cherryPickRequestViewer.reload(); } } } else if (getEntity() instanceof CherryPickScreening) { switch (editResult) { case CANCEL_EDIT: return getThisProxy().reload(); case SAVE_EDIT: return getThisProxy().reload(); case CANCEL_NEW: return _cherryPickRequestViewer.reload(); case SAVE_NEW: return _cherryPickRequestViewer.reload(); } } else if (getEntity() instanceof ServiceActivity) { switch (editResult) { case CANCEL_EDIT: return getThisProxy().reload(); case SAVE_EDIT: return getThisProxy().reload(); case CANCEL_NEW: return _userViewer.reload(); case SAVE_NEW: return _userViewer.reload(); } } return null; } @UICommand public String browseLibrariesScreened() { if (getEntity() instanceof LibraryScreening) { _librarySearchResults.searchLibrariesScreened((LibraryScreening) getEntity()); return BROWSE_LIBRARIES; } return REDISPLAY_PAGE_ACTION_RESULT; } @UICommand public String browseLibraryPlatesScreened() { if (getEntity() instanceof LibraryScreening) { _screenViewer.getPlateSearchResults().searchLibraryPlatesScreenedByLibraryScreening((LibraryScreening) getEntity()); return BROWSE_LIBRARY_PLATES_SCREENED; } return REDISPLAY_PAGE_ACTION_RESULT; } private Set<ScreensaverUser> findPerformedByCandidates() { if (getEntity() instanceof LabActivity) { return _screenDao.findLabActivityPerformedByCandidates((LabActivity) getEntity()); } else if (getEntity() instanceof ServiceActivity) { return findServiceActivityAdminUsers(); } return ImmutableSet.of(); } // TODO: refactor this into a UsersDAO method: findUsersInRole() private Set<ScreensaverUser> findServiceActivityAdminUsers() { String hql = "from ScreensaverUser where ? in elements (screensaverUserRoles)"; return Sets.newTreeSet(getDao().findEntitiesByHql(ScreensaverUser.class, hql, ScreensaverUserRole.SERVICE_ACTIVITY_ADMIN.getRoleName())); } public List<SelectItem> getServiceActivityTypeSelectItems() { return JSFUtils.createUISelectItemsWithEmptySelection(Arrays.asList(ServiceActivityType.values()), "<select>"); } public List<SelectItem> getFundingSupportSelectItems() { List<FundingSupport> fslist = getDao().findAllEntitiesOfType(FundingSupport.class); List<String> fsvalues = Lists.newArrayList(); for(FundingSupport fs:fslist){ if(!fs.isRetired()){ fsvalues.add(fs.getValue()); } } Collections.sort(fsvalues); return JSFUtils.createUISelectItemsWithEmptySelection(fsvalues,"<select>"); } public String getFundingSupportValue(){ if (getEntity() instanceof ServiceActivity) { FundingSupport fs = ((ServiceActivity)this.getEntity()).getFundingSupport(); if(fs == null){ return ""; }else{ return fs.getValue(); } } return null; } public void setFundingSupportValue(String value){ _fundingSupportValue = value; } @Transactional public UISelectOneBean<Screen> getServicedScreen() { if (getEntity() instanceof ServiceActivity && _servicedScreen == null && getServicedUser() != null) { Set<Screen> associatedScreens = getDao().reloadEntity(_servicedUser, true).getAllAssociatedScreens(); _servicedScreen = new UISelectOneEntityBean<Screen>(associatedScreens, ((ServiceActivity) getEntity()).getServicedScreen(), true, getDao()) { @Override protected String makeLabel(Screen screen) { return screen.getFacilityId() + ": " + screen.getTitle(); } }; } return _servicedScreen; } }