// $HeadURL: // http://seanderickson1@forge.abcd.harvard.edu/svn/screensaver/branches/lincs/ui-cleanup/core/src/main/java/edu/harvard/med/screensaver/io/screens/ScreenCreator.java // $ // $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.io.screens; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.ParseException; import org.apache.log4j.Logger; import edu.harvard.med.screensaver.db.DAOTransaction; import edu.harvard.med.screensaver.db.DAOTransactionRollbackException; import edu.harvard.med.screensaver.db.GenericEntityDAO; import edu.harvard.med.screensaver.db.UsersDAO; import edu.harvard.med.screensaver.io.CommandLineApplication; import edu.harvard.med.screensaver.model.screens.Screen; import edu.harvard.med.screensaver.model.screens.ScreenDataSharingLevel; import edu.harvard.med.screensaver.model.screens.ScreenType; import edu.harvard.med.screensaver.model.users.LabHead; import edu.harvard.med.screensaver.model.users.ScreeningRoomUser; import edu.harvard.med.screensaver.service.screens.ScreenGenerator; import edu.harvard.med.screensaver.util.StringUtils; /** * Command-line application that creates a new screen in the database. * * @author <a mailto="andrew_tolopko@hms.harvard.edu">Andrew Tolopko</a> */ public class ScreenCreator { private static Logger log = Logger.getLogger(ScreenCreator.class); @SuppressWarnings("static-access") public static void main(String[] args) throws ParseException { final CommandLineApplication app = new CommandLineApplication(args); app.addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName("first name").withLongOpt("lead-screener-first-name").create("lf")); app.addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName("last name").withLongOpt("lead-screener-last-name").create("ll")); app.addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName("email").withLongOpt("lead-screener-email").create("le")); app.addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName("first name").withLongOpt("lab-head-first-name").create("hf")); app.addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName("last name").withLongOpt("lab-head-last-name").create("hl")); app.addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName("email").withLongOpt("lab-head-email").create("he")); List<String> desc = new ArrayList<String>(); for (ScreenType t : EnumSet.allOf(ScreenType.class)) desc.add(t.name()); app.addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName("screen type").withLongOpt("screen-type").withDescription(StringUtils.makeListString(desc, ", ")).create("st")); app.addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName("summary").withLongOpt("summary").create("s")); app.addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName("title").withLongOpt("title").create("t")); app.addCommandLineOption(OptionBuilder.hasArg().withArgName("protocol").withLongOpt("protocol").create("p")); app.addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName("#").withLongOpt("facilityId").create("i")); app.addCommandLineOption(OptionBuilder.hasArg(false).withLongOpt("replace").withDescription("replace an existing Screen with the same facilityId").create("r")); app.processOptions(/* acceptDatabaseOptions= */false, /* acceptAdminUserOptions= */true); try { execute(app); } catch (Exception e) { log.error("Failed to create the screen", e); System.exit(1); } } private static void execute(final CommandLineApplication app) { final GenericEntityDAO dao = (GenericEntityDAO) app.getSpringBean("genericEntityDao"); final UsersDAO usersDAO = (UsersDAO) app.getSpringBean("usersDao"); final ScreenGenerator screenGenerator = (ScreenGenerator) app.getSpringBean("screenGenerator"); final String facilityId = app.getCommandLineOptionValue("i"); boolean replace = app.isCommandLineFlagSet("r"); Screen screen = dao.findEntityByProperty(Screen.class, "facilityId", facilityId); if (screen != null) { if (!replace) { throw new RuntimeException("screen " + facilityId + " already exists (use --replace flag to delete existing screen first)"); } dao.deleteEntity(screen); log.error("deleted existing screen " + facilityId); } dao.doInTransaction(new DAOTransaction() { @Override public void runTransaction() { try { String lsfn = app.getCommandLineOptionValue("lf"); String lsln = app.getCommandLineOptionValue("ll"); String lse = app.getCommandLineOptionValue("le"); String lhfn = app.getCommandLineOptionValue("hf"); String lhln = app.getCommandLineOptionValue("hl"); String lhe = app.getCommandLineOptionValue("he"); ScreenType screenType = app.getCommandLineOptionEnumValue("st", ScreenType.class); LabHead labHead = usersDAO.findSRU(LabHead.class, lhfn, lhln, lhe); if(labHead == null) { throw new RuntimeException("could not find existing user for " + lhfn + " " + lhln + ", " + lhe); } ScreeningRoomUser screener = usersDAO.findSRU(ScreeningRoomUser.class, lsfn, lsln, lse); if(screener == null) { throw new RuntimeException("could not find existing user for " + lsfn + " " + lsln + ", " + lse); } Screen screen = screenGenerator.createPrimaryScreen(app.findAdministratorUser(), screener, screenType); screen.setFacilityId(facilityId); screen.setTitle(app.getCommandLineOptionValue("t")); screen.setLabHead(labHead); screen.setDataSharingLevel(ScreenDataSharingLevel.SHARED); // TODO: create command line param screen.setSummary(app.getCommandLineOptionValue("s")); if (app.isCommandLineFlagSet("p")) { screen.setPublishableProtocol(app.getCommandLineOptionValue("p")); } dao.persistEntity(screen); } catch (Exception e) { throw new DAOTransactionRollbackException(e); } } }); log.info("Screen created"); } }