// $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.screenresults; import java.io.IOException; import java.util.List; import javax.faces.model.DataModel; import javax.faces.model.ListDataModel; import com.google.common.collect.Sets; import org.apache.log4j.Logger; import org.apache.myfaces.custom.fileupload.UploadedFile; import edu.harvard.med.screensaver.db.GenericEntityDAO; import edu.harvard.med.screensaver.io.ParseError; import edu.harvard.med.screensaver.io.ParseErrorsException; import edu.harvard.med.screensaver.io.workbook2.Workbook; import edu.harvard.med.screensaver.model.AuditedAbstractEntity; import edu.harvard.med.screensaver.model.screenresults.ScreenResult; import edu.harvard.med.screensaver.model.screens.Screen; import edu.harvard.med.screensaver.model.users.AdministratorUser; import edu.harvard.med.screensaver.service.screenresult.ScreenResultLoader; import edu.harvard.med.screensaver.ui.arch.view.AbstractBackingBean; import edu.harvard.med.screensaver.ui.arch.view.aspects.UICommand; import edu.harvard.med.screensaver.ui.screens.ScreenViewer; /** * The JSF backing bean for the screenResultImporter view. * * @author <a mailto="andrew_tolopko@hms.harvard.edu">Andrew Tolopko</a> * @author <a mailto="john_sullivan@hms.harvard.edu">John Sullivan</a> */ public class ScreenResultImporter extends AbstractBackingBean { // static data private static final String ERRORS_XLS_FILE_EXTENSION = ".errors.xls"; private static final Logger log = Logger.getLogger(ScreenResultImporter.class); // instance data private GenericEntityDAO _dao; private ScreenViewer _screenViewer; private ScreenResultLoader _screenResultLoader; private UploadedFile _uploadedFile; private String _comments; private List<? extends ParseError> _lastParseErrors; // constructors /** * @motivation for CGLIB2 */ protected ScreenResultImporter() { } public ScreenResultImporter(GenericEntityDAO dao, ScreenViewer screenViewer, ScreenResultLoader screenResultLoader) { _dao = dao; _screenViewer = screenViewer; _screenResultLoader = screenResultLoader; } public Screen getScreen() { return _screenViewer.getEntity(); } public void setUploadedFile(UploadedFile uploadedFile) { _uploadedFile = uploadedFile; } public UploadedFile getUploadedFile() { return _uploadedFile; } public String getComments() { return _comments; } public void setComments(String comments) { _comments = comments; } public boolean getHasErrors() { return _lastParseErrors != null && ! _lastParseErrors.isEmpty(); } public DataModel getImportErrors() { return new ListDataModel(_lastParseErrors); } // JSF application methods @UICommand public String cancel() { return _screenViewer.reload(); } @UICommand public String doImport() throws IOException { Screen screen = _screenViewer.getEntity(); try { ScreenResult screenResult = _screenResultLoader.parseAndLoad(screen, new Workbook("Input Stream for screen: " + screen, _uploadedFile.getInputStream()), (AdministratorUser) getScreensaverUser(), _comments, null, true); screenResult = _dao.reloadEntity(screenResult, true, ScreenResult.screen.to(AuditedAbstractEntity.updateActivities.castToSubtype(Screen.class))); showMessage("screens.screenResultDataLoaded", screenResult.getLastDataLoadingActivity().getComments()); screen = _dao.reloadEntity(screen, true, Screen.assayPlates); int assayPlatesCreated = Sets.difference(screen.getAssayPlatesDataLoaded(), screen.getAssayPlatesScreened()).size(); if (assayPlatesCreated > 0) { showMessage("screens.assayPlatesCreatedForLoadedData", assayPlatesCreated); } } catch (ParseErrorsException e) { log.info("parse errors encountered during import of ScreenResult for Screen " + screen); _lastParseErrors = e.getErrors(); return REDISPLAY_PAGE_ACTION_RESULT; } return _screenViewer.viewEntity(screen); } @UICommand public String importScreenResultData() { return IMPORT_SCREEN_RESULT_DATA; } }