// $HeadURL:
// http://seanderickson1@forge.abcd.harvard.edu/svn/screensaver/branches/iccbl/data-sharing-levels/src/edu/harvard/med/screensaver/io/screenresults/ScreenResultImporter.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.iccbl.screensaver.io.screens;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import javax.mail.MessagingException;
import javax.mail.SendFailedException;
import javax.mail.internet.InternetAddress;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.ParseException;
import org.apache.log4j.Logger;
import org.joda.time.LocalDate;
import com.google.common.collect.Lists;
import edu.harvard.med.iccbl.screensaver.io.AdminEmailApplication;
import edu.harvard.med.iccbl.screensaver.service.screens.ScreenDataSharingLevelUpdater;
import edu.harvard.med.screensaver.db.CommandLineArgumentsDatabaseConnectionSettingsResolver;
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.model.activities.AdministrativeActivity;
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.AdministratorUser;
import edu.harvard.med.screensaver.model.users.ScreensaverUser;
import edu.harvard.med.screensaver.service.EmailService;
import edu.harvard.med.screensaver.service.OperationRestrictedException;
import edu.harvard.med.screensaver.util.Pair;
/**
* Find and "expire" the private screens for which the dataPrivacyExpirationDate
* is greater than the time at which this script is run. <br/>
* "Expiration" of a screen means that the DSL is set to ScreenDataSharingLevel.MUTUAL_SCREENS,
* when it was something greater before. see {@link ScreenDataSharingLevel#MUTUAL_SCREENS} <br>
* <br>
* see [#2175] Expiration services to become notification services only.
*/
public class ScreenPrivacyExpirationUpdater extends AdminEmailApplication
{
private static final String EXPIRATION_MESSAGE_TXT_LOCATION = "../../../../../../../screenPrivacyExpirationMessage.txt";
public static int SCREEN_ACTIVITY_DATA_PRIVACY_EXPIRATION_AGE_DAYS = 365 * 2 + 30 * 2;
private ScreenDataSharingLevelUpdater _privacyUpdater = null;
private ScreenType _screenType;
public ScreenPrivacyExpirationUpdater(String[] cmdLineArgs)
{
super(cmdLineArgs);
}
public void init()
{
_privacyUpdater = (ScreenDataSharingLevelUpdater) getSpringBean("screenDataSharingLevelUpdater");
}
private static Logger log = Logger.getLogger(ScreenPrivacyExpirationUpdater.class);
public static final String[] SCREEN_TYPE_OPTION =
{
"st",
"screen type",
"screen-type",
"the screen type of the user agreements to be processed (RNAi or Small Molecule)"
};
public static final String[] ADJUST_DATA_PRIVACY_EXPIRATION_DATE_BASED_ON_ACTIVITY = {
"adjustexpiration", "days",
"adjust-expiration-on-activity-date",
"Adjust the Screen.dataPrivacyExpirationDate by the given interval (days) from the last activity"
};
public static final String[] EXPIRE_PRIVACY = {
"expireprivacy", "",
"expire-screen-privacy",
"Find and expire privacy of screens for which the dataPrivacyExpirationDate has passed."
};
public static final String[] NOTIFY_PRIVACY_EXPIRATION = {
"notifyofexpiration", "days",
"notify-privacy-expiration",
"Find screens for which the dataPrivacyExpirationDate will expire in the given interval (days) from present. " +
"Send \"expiration notifications\" to all admins having a data" +
"privacy data expiration admin role (\"dataSharingLevelAdmin\"), and the" +
"screen's PI, lead screener, and collaborators."
};
public static final String[] NOTIFY_OF_PUBLICATIONS = {
"notifyofpublications", "",
"notify-of-publications",
"Find private screens that have been published." +
"Send \"publication notifications\" to all admins having a data" +
"privacy data expiration admin role (\"dataSharingLevelAdmin\")"
};
public static final String[] EXPIRATION_EMAIL_MESSAGE_LOCATION =
{
"expirationemailfilelocation",
"file location",
"expiration-email-file-location",
"(optional) location of the message to send to users, first line of this text file is the subject, the rest is the email. " +
"Default location is relative to the location of this class, on the classpath: " + EXPIRATION_MESSAGE_TXT_LOCATION
};
public static final String[] NOTIFY_OF_OVERRIDES =
{
"notifyofoverrides", "",
"notify-of-adjust-overrides",
"(optional - " + ADJUST_DATA_PRIVACY_EXPIRATION_DATE_BASED_ON_ACTIVITY[LONG_OPTION_INDEX] +
") when using the adjust operation, whether to notify (repeatedly) " +
"of the Earliest/Last Allowed Data Privacy Expiration Dates being invoked."
};
public static final String[] TEST_ONLY = {
"testonly", "",
"test-only",
"run the entire operation specified, then roll-back."
};
@SuppressWarnings("static-access")
public static void main(String[] args)
{
final ScreenPrivacyExpirationUpdater app = new ScreenPrivacyExpirationUpdater(args);
// TODO: allow this to be optional and glean the eCommons ID from the
// environment - sde4
app.addCommandLineOption(OptionBuilder.hasArg().isRequired()
.withArgName(SCREEN_TYPE_OPTION[ARG_INDEX])
.withDescription(SCREEN_TYPE_OPTION[DESCRIPTION_INDEX])
.withLongOpt(SCREEN_TYPE_OPTION[LONG_OPTION_INDEX])
.create(SCREEN_TYPE_OPTION[SHORT_OPTION_INDEX]));
app.addCommandLineOption(OptionBuilder.hasArg()
.withArgName(ADJUST_DATA_PRIVACY_EXPIRATION_DATE_BASED_ON_ACTIVITY[ARG_INDEX])
.withDescription(ADJUST_DATA_PRIVACY_EXPIRATION_DATE_BASED_ON_ACTIVITY[DESCRIPTION_INDEX])
.withLongOpt(ADJUST_DATA_PRIVACY_EXPIRATION_DATE_BASED_ON_ACTIVITY[LONG_OPTION_INDEX])
.create(ADJUST_DATA_PRIVACY_EXPIRATION_DATE_BASED_ON_ACTIVITY[SHORT_OPTION_INDEX]));
app.addCommandLineOption(OptionBuilder
.withDescription(NOTIFY_OF_OVERRIDES[DESCRIPTION_INDEX])
.withLongOpt(NOTIFY_OF_OVERRIDES[LONG_OPTION_INDEX])
.create(NOTIFY_OF_OVERRIDES[SHORT_OPTION_INDEX]));
app.addCommandLineOption(OptionBuilder
.withDescription(EXPIRE_PRIVACY[DESCRIPTION_INDEX])
.withLongOpt(EXPIRE_PRIVACY[LONG_OPTION_INDEX])
.create(EXPIRE_PRIVACY[SHORT_OPTION_INDEX]));
app.addCommandLineOption(OptionBuilder.hasArg()
.withArgName(NOTIFY_PRIVACY_EXPIRATION[ARG_INDEX])
.withDescription(NOTIFY_PRIVACY_EXPIRATION[DESCRIPTION_INDEX])
.withLongOpt(NOTIFY_PRIVACY_EXPIRATION[LONG_OPTION_INDEX])
.create(NOTIFY_PRIVACY_EXPIRATION[SHORT_OPTION_INDEX]));
app.addCommandLineOption(OptionBuilder.hasArg()
.withArgName(EXPIRATION_EMAIL_MESSAGE_LOCATION[ARG_INDEX])
.withDescription(EXPIRATION_EMAIL_MESSAGE_LOCATION[DESCRIPTION_INDEX])
.withLongOpt(EXPIRATION_EMAIL_MESSAGE_LOCATION[LONG_OPTION_INDEX])
.create(EXPIRATION_EMAIL_MESSAGE_LOCATION[SHORT_OPTION_INDEX]));
app.addCommandLineOption(OptionBuilder
.withDescription(NOTIFY_OF_PUBLICATIONS[DESCRIPTION_INDEX])
.withLongOpt(NOTIFY_OF_PUBLICATIONS[LONG_OPTION_INDEX])
.create(NOTIFY_OF_PUBLICATIONS[SHORT_OPTION_INDEX]));
app.addCommandLineOption(OptionBuilder
.withDescription(TEST_ONLY[DESCRIPTION_INDEX])
.withLongOpt(TEST_ONLY[LONG_OPTION_INDEX])
.create(TEST_ONLY[SHORT_OPTION_INDEX]));
app.processOptions(/* acceptDatabaseOptions= */true,
/* acceptAdminUserOptions= */true);
log.info("==== Running ScreenPrivacyExpirationUpdater: " + app.toString() + "======");
final GenericEntityDAO dao = (GenericEntityDAO) app.getSpringBean("genericEntityDao");
app.init();
dao.doInTransaction(new DAOTransaction() {
public void runTransaction()
{
try {
// check that not too many options are specified
int numberOfActions = 0;
if (app.isCommandLineFlagSet(NOTIFY_PRIVACY_EXPIRATION[SHORT_OPTION_INDEX])) numberOfActions++;
if (app.isCommandLineFlagSet(NOTIFY_OF_PUBLICATIONS[SHORT_OPTION_INDEX])) numberOfActions++;
if (app.isCommandLineFlagSet(EXPIRE_PRIVACY[SHORT_OPTION_INDEX])) numberOfActions++;
if (app.isCommandLineFlagSet(ADJUST_DATA_PRIVACY_EXPIRATION_DATE_BASED_ON_ACTIVITY[SHORT_OPTION_INDEX])) numberOfActions++;
if (numberOfActions > 1)
{
log.error("May only specify one of: " +
NOTIFY_PRIVACY_EXPIRATION[SHORT_OPTION_INDEX]
+
", " +
NOTIFY_OF_PUBLICATIONS[SHORT_OPTION_INDEX]
+
", " +
EXPIRE_PRIVACY[SHORT_OPTION_INDEX]
+
", " + ADJUST_DATA_PRIVACY_EXPIRATION_DATE_BASED_ON_ACTIVITY[SHORT_OPTION_INDEX]);
System.exit(1);
}
app.setScreenType(app.getCommandLineOptionEnumValue(SCREEN_TYPE_OPTION[SHORT_OPTION_INDEX], ScreenType.class));
try {
if (app.isCommandLineFlagSet(NOTIFY_PRIVACY_EXPIRATION[SHORT_OPTION_INDEX]))
{
Integer daysAheadToNotify = app.getCommandLineOptionValue(NOTIFY_PRIVACY_EXPIRATION[SHORT_OPTION_INDEX],
Integer.class);
app.findNewExpiredAndNotifyAhead(daysAheadToNotify);
}
else if (app.isCommandLineFlagSet(NOTIFY_OF_PUBLICATIONS[SHORT_OPTION_INDEX]))
{
app.notifyOfPublications();
}
else if (app.isCommandLineFlagSet(EXPIRE_PRIVACY[SHORT_OPTION_INDEX]))
{
app.expireScreenDataSharingLevels();
}
else if (app.isCommandLineFlagSet(ADJUST_DATA_PRIVACY_EXPIRATION_DATE_BASED_ON_ACTIVITY[SHORT_OPTION_INDEX]))
{
Integer ageToExpireFromActivityDateInDays =
app.getCommandLineOptionValue(ADJUST_DATA_PRIVACY_EXPIRATION_DATE_BASED_ON_ACTIVITY[SHORT_OPTION_INDEX], Integer.class);
app.adjustDataPrivacyExpirationByActivities(ageToExpireFromActivityDateInDays);
}
else {
app.showHelpAndExit("No action specified (expire, notify of privacy expirations, notify of publications, or adjust)?");
}
}
catch (OperationRestrictedException e) {
app.sendErrorMail("Warn: Could not complete expiration service operation", "Warn: Could not complete expiration service operation", e);
throw new DAOTransactionRollbackException(e);
}
}
catch (MessagingException e) {
String msg = "Admin email operation not completed due to MessagingException";
log.error(msg + ":\nApp: " + app.toString(), e);
throw new DAOTransactionRollbackException(e);
}
if (app.isCommandLineFlagSet(TEST_ONLY[SHORT_OPTION_INDEX])) {
throw new DAOTransactionRollbackException("Rollback, testing only");
}
}
});
log.info("==== finished ScreenPrivacyExpirationUpdater ======");
}
private void setScreenType(ScreenType screenType) //
{
_screenType = screenType;
}
private void notifyOfPublications() throws MessagingException
{
List<Screen> publishedScreens = _privacyUpdater.findNewPublishedPrivate(_screenType);
if (publishedScreens.isEmpty()) {
String subject = getMessages().getMessage("admin.screens.dataPrivacyExpiration.publicationNotification.noaction.subject");
String msg = "No published private Screens.";
sendAdminEmails(subject, msg);
}
else {
// 1. send a summary email to the admin, dateSharingLevelAdmin's and recipients specified on the command line
String subject = getMessages().getMessage("admin.screens.dataPrivacyExpiration.publicationNotification.subject",
publishedScreens.size(),
new LocalDate());
StringBuilder msg = new StringBuilder(
getMessages().getMessage("admin.screens.dataPrivacyExpiration.publicationNotification.messageBoilerplate",
publishedScreens.size(), new LocalDate()));
msg.append("\n\n");
for (Screen screen : publishedScreens) {
msg.append("\nScreen with Publication:\n");
msg.append(printScreenHeader() + "\n");
msg.append(printScreen(screen) + "\n");
msg.append("Associated Users: \n");
msg.append("\t" + printUserHeader() + "\n");
for (ScreensaverUser user : screen.getAssociatedScreeningRoomUsers()) {
msg.append("\t").append(printUser(user) + "\n");
}
}
sendAdminEmails(subject, msg.toString(), _privacyUpdater.findDataSharingLevelAdminUsers());
}
}
private void adjustDataPrivacyExpirationByActivities(Integer ageToExpireFromActivityDateInDays) throws MessagingException
{
ScreenDataSharingLevelUpdater.DataPrivacyAdjustment adjustment = _privacyUpdater.adjustDataPrivacyExpirationByActivities(ageToExpireFromActivityDateInDays, findAdministratorUser(), _screenType);
if (adjustment.isEmpty(isCommandLineFlagSet(NOTIFY_OF_OVERRIDES[SHORT_OPTION_INDEX]))) {
String subject = getMessages().getMessage("admin.screens.dataPrivacyExpiration.dataPrivacyExpirationdate.adjustment.noaction.subject");
String msg = "No Screens with Activities to adjust the dataPrivacyExpirationDate";
sendAdminEmails(subject, msg);
}
else {
// Send a summary notification to this admin and recipients specified on the command line
String subject = getMessages().getMessage("admin.screens.dataPrivacyExpiration.dataPrivacyExpirationdate.adjustment.subject",
adjustment.screensAdjusted.size() + adjustment.screensAdjustedToAllowed.size(),
adjustment.screenPrivacyAdjustmentNotAllowed.size());
StringBuilder msg = new StringBuilder(
getMessages().getMessage("admin.screens.dataPrivacyExpiration.dataPrivacyExpirationdate.adjustment.messageBoilerplate",
ageToExpireFromActivityDateInDays,
adjustment.screensAdjusted.size(),
adjustment.screensAdjustedToAllowed.size(),
adjustment.screenPrivacyAdjustmentNotAllowed.size()
));
if (isCommandLineFlagSet(TEST_ONLY[SHORT_OPTION_INDEX])) {
subject = "Testing: " + subject;
msg.append("\n----TEST Only: no database changes committed.-------");
}
msg.append("\n\n");
if (!adjustment.screensAdjusted.isEmpty()) {
msg.append("\n\nAdjusted to " + ageToExpireFromActivityDateInDays + " days from the last Library Screening Activity:\n");
for (Pair<Screen,AdministrativeActivity> result : adjustment.screensAdjusted) {
Screen screen = result.getFirst();
msg.append("\nAdjusted Screen:\n");
msg.append(printScreenHeader() + "\n");
msg.append(printScreen(screen) + "\n");
msg.append("Comment: " + result.getSecond().getComments() + "\n");
msg.append("Associated Users: \n");
msg.append("\t" + printUserHeader() + "\n");
for (ScreensaverUser user : screen.getAssociatedScreeningRoomUsers()) {
msg.append("\t").append(printUser(user) + "\n");
}
}
}
if (!adjustment.screensAdjustedToAllowed.isEmpty()) {
msg.append("\n\nAdjustment to the allowed value for the screens:\n");
for (Pair<Screen,AdministrativeActivity> result : adjustment.screensAdjustedToAllowed) {
Screen screen = result.getFirst();
msg.append("\nAdjusted Screen:\n");
msg.append(printScreenHeader() + "\n");
msg.append(printScreen(screen) + "\n");
msg.append("Comment: " + result.getSecond().getComments() + "\n");
msg.append("Associated Users: \n");
msg.append("\t" + printUserHeader() + "\n");
for (ScreensaverUser user : screen.getAssociatedScreeningRoomUsers()) {
msg.append("\t").append(printUser(user) + "\n");
}
}
}
if (isCommandLineFlagSet(NOTIFY_OF_OVERRIDES[SHORT_OPTION_INDEX])
&& !adjustment.screenPrivacyAdjustmentNotAllowed.isEmpty()) {
msg.append("\n\nAdjustment not allowed for the screens:\n");
for (Pair<Screen,String> result : adjustment.screenPrivacyAdjustmentNotAllowed) {
Screen screen = result.getFirst();
msg.append("\nAdjustment overridden for Screen:\n");
msg.append(printScreenHeader() + "\n");
msg.append(printScreen(screen) + "\n");
msg.append("Comment: " + result.getSecond() + "\n");
msg.append("Associated Users: \n");
msg.append("\t" + printUserHeader() + "\n");
for (ScreensaverUser user : screen.getAssociatedScreeningRoomUsers()) {
msg.append("\t").append(printUser(user) + "\n");
}
}
}
sendAdminEmails(subject, msg.toString(), _privacyUpdater.findDataSharingLevelAdminUsers());
}
}
private void findNewExpiredAndNotifyAhead(Integer daysAheadToNotify)
throws MessagingException
{
LocalDate expireDate = new LocalDate().plusDays(daysAheadToNotify);
List<Screen> oldScreens = new ArrayList<Screen>(_privacyUpdater.findNewExpiredNotNotified(expireDate, _screenType));
// sort by DPED
Collections.sort(oldScreens, new Comparator<Screen>() {
public int compare(Screen o1, Screen o2)
{
if (o1 == null || o2 == null) return o1 == null ? o2 == null ? 0 : -1 : 1;
return o1.getDataPrivacyExpirationDate().compareTo(o2.getDataPrivacyExpirationDate());
}
});
if (oldScreens.isEmpty()) {
String subject = getMessages().getMessage("admin.screens.dataPrivacyExpiration.dataPrivacyExpirattion.warningNotification.noaction.subject", daysAheadToNotify);
String msg = "No Screens have agreements set to expire prior to: "
+ expireDate + " that have not already been notified.";
log.info(msg);
sendAdminEmails(subject, msg);
}
else {
// 1. send a summary email to the admin, dateSharingLevelAdmin's and recipients specified on the command line
String subject = getMessages().getMessage("admin.screens.dataPrivacyExpiration.dataPrivacyExpirattion.warningNotification.subject",
oldScreens.size(),
daysAheadToNotify);
StringBuilder msg =
new StringBuilder(getMessages().getMessage("admin.screens.dataPrivacyExpiration.dataPrivacyExpirattion.warningNotification.messageBoilerplate",
oldScreens.size(),
daysAheadToNotify));
if (isAdminEmailOnly()) msg.append("\n---- NOTE: sending email only to data sharing level admins ---");
if (isCommandLineFlagSet(TEST_ONLY[SHORT_OPTION_INDEX])) {
subject = "Testing: " + subject;
msg.append("\n----TEST Only: no database changes committed.-------");
}
msg.append("\nScreens expiring on or before " + EXPIRE_DATE_FORMATTER.print(expireDate) + "\n");
for (Screen screen : oldScreens) {
msg.append("\nScreen: \n");
msg.append(printScreenHeader() + "\n");
msg.append(printScreen(screen) + "\n");
msg.append("Associated Users: \n");
msg.append("\t" + printUserHeader() + "\n");
for (ScreensaverUser user : screen.getAssociatedScreeningRoomUsers()) {
msg.append("\t").append(printUser(user)).append("\n");
}
}
Pair<String,String> subjectMessage = getScreenExpireNotificationSubjectMessage(); // Note: nothing to replace
String notificationMessage = MessageFormat.format(subjectMessage.getSecond(),
"---",
"[-- a Screen Title]",
"[current screen data sharing level]",
EXPIRE_DATE_FORMATTER.print(expireDate));
msg.append("\n\n[example email]\n");
msg.append("\nSubject: " + subjectMessage.getFirst() + "\n\n");
msg.append(notificationMessage);
sendAdminEmails(subject, msg.toString(), _privacyUpdater.findDataSharingLevelAdminUsers());
if (isAdminEmailOnly() ||
( isCommandLineFlagSet(TEST_ONLY[SHORT_OPTION_INDEX]) && ! isCommandLineFlagSet(TEST_EMAIL_ONLY[SHORT_OPTION_INDEX]) )) {
for (Screen screen : oldScreens) {
_privacyUpdater.setDataPrivacyExpirationNotifiedDate(screen);
}
}
else {
// 2. For each screen, send a notification to the screen's PI, lead screener, and collaborators
List<MessagingException> exceptions = Lists.newLinkedList();
for (Screen screen : oldScreens) {
notificationMessage = MessageFormat.format(subjectMessage.getSecond(),
screen.getFacilityId(),
getScreenTitle(screen),
screen.getDataSharingLevel(),
EXPIRE_DATE_FORMATTER.print(screen.getDataPrivacyExpirationDate()));
if(sendEmails(subjectMessage.getFirst(), notificationMessage, screen.getAssociatedScreeningRoomUsers()))
{
_privacyUpdater.setDataPrivacyExpirationNotifiedDate(screen);
}
}
}
}
}
private void expireScreenDataSharingLevels()
throws MessagingException
{
LocalDate expireDate = new LocalDate();
List<Pair<Screen,AdministrativeActivity>> results = _privacyUpdater.expireScreenDataSharingLevels(expireDate, findAdministratorUser(), _screenType);
if (results.isEmpty()) {
String subject = getMessages().getMessage("admin.screens.dataPrivacyExpiration.dataPrivacyExpirattion.notification.noaction.subject");
String msg = "No Screens with SDSL > 1 have agreements dated on or before: " + expireDate;
sendAdminEmails(subject, msg);
}
else {
// Send a notification that the screens have expired to this admin and recipients specified on the command line
String subject = getMessages().getMessage("admin.screens.dataPrivacyExpiration.dataPrivacyExpirattion.notification.subject", results.size());
StringBuilder msg = new StringBuilder(
getMessages().getMessage("admin.screens.dataPrivacyExpiration.dataPrivacyExpirattion.notification.messageBoilerplate",
results.size(), new LocalDate()));
if (isCommandLineFlagSet(TEST_ONLY[SHORT_OPTION_INDEX])) {
subject = "Testing: " + subject;
msg.append("\n----TEST Only: no database changes committed.-------");
}
msg.append("\n");
for (Pair<Screen,AdministrativeActivity> result : results) {
Screen screen = result.getFirst();
msg.append("\nExpired Screen:\n");
msg.append(printScreenHeader() + "\n");
msg.append(printScreen(screen) + "\n");
msg.append("Comment: " + result.getSecond().getComments() + "\n");
msg.append("Associated Users: \n");
msg.append("\t" + printUserHeader() + "\n");
for (ScreensaverUser user : screen.getAssociatedScreeningRoomUsers()) {
msg.append("\t").append(printUser(user) + "\n");
}
}
sendAdminEmails(subject, msg.toString(), _privacyUpdater.findDataSharingLevelAdminUsers());
}
}
public static String SCREEN_PRINT_FORMAT = "|%1$-6s|%2$-12s|%3$-25s|%4$-60s";
public static String printScreenHeader()
{
return String.format(SCREEN_PRINT_FORMAT,
"#",
"Expiration",
"Sharing Level",
"Title");
}
public static String printScreen(Screen screen)
{
Object[] values = {
"" + screen.getFacilityId(),
"" + screen.getDataPrivacyExpirationDate(),
"" + screen.getDataSharingLevel(),
getScreenTitle(screen).trim()
};
return String.format(SCREEN_PRINT_FORMAT, values);
}
//TODO: move this method to the Screen object?
private static String getScreenTitle(Screen screen)
{
switch (screen.getScreenType()) {
case RNAI:
return screen.getTitle();
case SMALL_MOLECULE:
return "A screen for compounds that " + screen.getTitle();
default:
return screen.getTitle();
}
}
/**
* Return the subject first and the message second.
* Message:
* {0} Screen Number
* {1} Screen Title
* {2} timeToNotify (tbd, formatting)
*
* @throws MessagingException
*/
private Pair<String,String> getScreenExpireNotificationSubjectMessage() throws MessagingException
{
InputStream in = null;
if (isCommandLineFlagSet(EXPIRATION_EMAIL_MESSAGE_LOCATION[SHORT_OPTION_INDEX])) {
try {
in = new FileInputStream(new File(getCommandLineOptionValue(EXPIRATION_EMAIL_MESSAGE_LOCATION[SHORT_OPTION_INDEX])));
}
catch (FileNotFoundException e) {
sendErrorMail("Operation not completed for ScreenPrivacyExpirationUpdater, could not locate expiration message", toString(), e);
throw new DAOTransactionRollbackException(e);
}
}
else {
in = this.getClass().getResourceAsStream(EXPIRATION_MESSAGE_TXT_LOCATION);
}
Scanner scanner = new Scanner(in);
try {
StringBuilder builder = new StringBuilder();
String subject = scanner.nextLine(); // first line is the subject
while (scanner.hasNextLine()) {
builder.append(scanner.nextLine()).append("\n");
}
return Pair.newPair(subject, builder.toString());
}
finally {
scanner.close();
}
}
}