diff --git a/deep_sequencing_unit/dist/tracking/etc/tracking-email.template b/deep_sequencing_unit/dist/tracking/etc/tracking-email.template new file mode 100644 index 0000000000000000000000000000000000000000..aae6f7f5159948d8d3938dd7195c0b6c4a4e9a7a --- /dev/null +++ b/deep_sequencing_unit/dist/tracking/etc/tracking-email.template @@ -0,0 +1,10 @@ +Dear Mr./Mrs. +This email has been sent to you automatically by the openBIS system because +your have been registered as a contact person or principal investigator. + +There is progress considering your sequencing order. Below you will find all the details. + +{generated-content} + +Kind regards, + Deep Sequencing Unit Team \ No newline at end of file diff --git a/deep_sequencing_unit/dist/tracking/etc/tracking-local-database b/deep_sequencing_unit/dist/tracking/etc/tracking-local-database new file mode 100644 index 0000000000000000000000000000000000000000..6e59b385c8954de6e066fce64168fa61a62fee8f --- /dev/null +++ b/deep_sequencing_unit/dist/tracking/etc/tracking-local-database @@ -0,0 +1,2 @@ +lastSeenSequencingSampleId lastSeenFlowLaneSampleId lastSeenDatasetId +0 0 0 diff --git a/deep_sequencing_unit/dist/tracking/etc/tracking-service.properties b/deep_sequencing_unit/dist/tracking/etc/tracking-service.properties new file mode 100644 index 0000000000000000000000000000000000000000..f92ad89b3c4096e086635045710f5c031ad42596 --- /dev/null +++ b/deep_sequencing_unit/dist/tracking/etc/tracking-service.properties @@ -0,0 +1,23 @@ +openbis-user=<login> +openbis-password=<password> +openbis-server-url = https://<openbis-server-url>:8443/openbis + + +# SMTP properties. +# To test the system and save emails as files instead of sending them, +# set the smtp host to file://path-to-directory +mail.smtp.host = +mail.smtp.user = +mail.smtp.password = + +# all emails will be sent from this address +notification-email-from = openbis-noreply@bsse.ethz.ch +# all emails will have this address in the reply-to field +notification-email-reply-to = manuel.kohler@bsse.ethz.ch +# subject of all the notification emails +notification-email-subject = Status report of your sequencing order + +# Recipients that will receive notifications when entity connected with sequencing sample +# with certain AFFILIATION value. Property key should contain affiliation vocabulary term code +# with '-notification-email-contact' suffix, e.g. for 'FMI' affiliation: +FMI-affiliation-notification-email-contact = michael.stadler@fmi.ch diff --git a/deep_sequencing_unit/dist/tracking/tracking.sh b/deep_sequencing_unit/dist/tracking/tracking.sh new file mode 100755 index 0000000000000000000000000000000000000000..e892b9d665b0955d00e465af8bac4ed8c5d5b0ca --- /dev/null +++ b/deep_sequencing_unit/dist/tracking/tracking.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# +# Launch script for CISD openBIS Tracking system for Deep Sequencing Unit. +# Runs on Unix / Linux systems. +# ------------------------------------------------------------------------- + +JAR_FILE=lib/openbis-tracking-dsu-client.jar + +# +# change to installation directory +# +bin=$0 +if [ -L $bin ]; then + bin=`dirname $bin`/`readlink $bin` +fi +WD=`dirname $bin` +cd $WD +SCRIPT=./`basename $0` + +if [ "$JAVA_HOME" != "" ]; then + JAVA_BIN="$JAVA_HOME/bin/java" +else + JAVA_BIN="java" +fi + +ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" +echo -n "Starting the openBIS Tracking Client for DSU" +${JAVA_BIN} ${ALL_JAVA_OPTS} -jar $JAR_FILE "$@" \ No newline at end of file diff --git a/deep_sequencing_unit/etc/tracking-email.template b/deep_sequencing_unit/etc/tracking-email.template index 930f5d6d858630c31b3a200353d2a83696853cd6..aae6f7f5159948d8d3938dd7195c0b6c4a4e9a7a 100644 --- a/deep_sequencing_unit/etc/tracking-email.template +++ b/deep_sequencing_unit/etc/tracking-email.template @@ -1,8 +1,10 @@ Dear Mr./Mrs. -This is an automatically generated email notification from openBIS about creation of -samples and data sets for which you are a contact person, principal investigator or affiliation contact. +This email has been sent to you automatically by the openBIS system because +your have been registered as a contact person or principal investigator. + +There is progress considering your sequencing order. Below you will find all the details. {generated-content} Kind regards, - CISD Team \ No newline at end of file + Deep Sequencing Unit Team \ No newline at end of file diff --git a/deep_sequencing_unit/etc/tracking-service.properties b/deep_sequencing_unit/etc/tracking-service.properties index 7fd7fb3f68ee8374cfd293ad206016808b6d1dfb..a2206ee31c57a45fd6707c6b3dafbc30da65f6f4 100644 --- a/deep_sequencing_unit/etc/tracking-service.properties +++ b/deep_sequencing_unit/etc/tracking-service.properties @@ -1,18 +1,14 @@ openbis-user=kohleman openbis-password=xxx -openbis-server-url = http://localhost:8888/openbis/rmi-tracking +openbis-server-url = http://localhost:8888/openbis -# SMTP properties (must start with 'mail' to be considered). -mail.smtp.host = file://${root} -#mail.from = datastore_server@localhost +mail.smtp.host = file://targets mail.smtp.user = mail.smtp.password = notification-email-from = openbis-noreply@bsse.ethz.ch notification-email-reply-to = tomasz.pylak@bsse.ethz.ch -notification-email-subject = Entity creation notification -# Recipients that will receive notifications when entity connected with sequencing sample -# with certain AFFILIATION value. Property key should contain affiliation vocabulary term code -# with '-notification-email-contact' suffix, e.g. for 'FMI' affiliation: -# FMI-affiliation-notification-email-contact = fmi@bsse.ethz.ch +notification-email-subject = Status report of your sequencing order + +FMI-affiliation-notification-email-contact = fmi@bsse.ethz.ch diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java index 723f67c0c9eaabba9c902e1d7c5914f1bad02a86..91066093d21e262a657220c6ac5103cc4fe6424d 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java @@ -128,7 +128,7 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat private static final String SUBSECTION_SEPARATOR_LINE = createSeparatorLine(SUBSECTION_SEPARATOR_CHAR); - private static final String PERMLINK_LABEL = "Permlink"; + private static final String PERMLINK_LABEL = "See details in openBIS"; private static final String GENARATED_CONTENT_TARGET = "{generated-content}"; @@ -194,10 +194,8 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat // basic sample info appendAttribute(sb, PERMLINK_LABEL, sample.getPermlink()); appendAttribute(sb, "Identifier", sample.getIdentifier()); - appendNewline(sb); // sample properties - appendln(sb, "Filled sample properties:"); appendProperties(sb, sample.getProperties()); } @@ -235,7 +233,6 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat .getCode(), sequencingSample.getPermlink())); // data set properties - appendln(sb, "Filled data set properties:"); appendProperties(sb, dataSet.getProperties()); } diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java index 66011ec34c06e95605694eb3dd8797a0e8cf6eca..e61834ab2fcc3ab93dc1e1caef1fa49cbd3a3c9e 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java @@ -48,7 +48,7 @@ public class FileBasedTrackingDAO implements ITrackingDAO public void saveTrackingState(TrackingStateDTO state) { List<String> lines = new ArrayList<String>(); - lines.add("lastSeenSequencingSampleId\tlastSeenFlowLaneSampleId\tlastSeenDatasetId\n"); + lines.add("lastSeenSequencingSampleId\tlastSeenFlowLaneSampleId\tlastSeenDatasetId"); lines.add("" + state.getLastSeenSequencingSampleId() + "\t" + state.getLastSeenFlowLaneSampleId() + "\t" + state.getLastSeenDatasetId()); writeLines(new File(filePath), lines); @@ -74,13 +74,13 @@ public class FileBasedTrackingDAO implements ITrackingDAO List<TrackingStateDTO> trackingState = tabFileLoader.load(new File(filePath)); if (trackingState.size() != 1) { - throw LogUtils.environmentError("File %s has to many rows, it should have exactly 1.", - filePath); + throw LogUtils.environmentError( + "File %s has to many rows, it should have exactly 1.", filePath); } return trackingState.get(0); } catch (Exception e) { - throw LogUtils.envErr("Incorrect file format", e); + throw LogUtils.environmentError("Incorrect file format", e); } } @@ -91,8 +91,8 @@ public class FileBasedTrackingDAO implements ITrackingDAO IOUtils.writeLines(lines, "\n", new FileOutputStream(file)); } catch (IOException ex) { - throw LogUtils.envErr(String.format("Cannot save the file %s with content: %s", - file.getPath(), lines), ex); + throw LogUtils.environmentError(String.format("Cannot save the file %s with content: %s", file + .getPath(), lines), ex); } } } diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java index 750bdf40b003e8ce7d513e4cc0d0c05c893ae379..4a25c9fc885390dfe66b5799b0e682b2c5f698b0 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java @@ -22,6 +22,8 @@ import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackingStateDTO; import ch.ethz.bsse.cisd.dsu.tracking.email.Email; import ch.ethz.bsse.cisd.dsu.tracking.email.IEntityTrackingEmailGenerator; +import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils; +import ch.systemsx.cisd.common.collections.CollectionUtils; import ch.systemsx.cisd.common.mail.From; import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer; @@ -39,7 +41,7 @@ public class TrackingBO { private static final String SEQUENCING_SAMPLE_TYPE = "ILLUMINA_SEQUENCING"; - private static final String FLOW_LANE_SAMPLE_TYPE = "FLOW_LANE"; + private static final String FLOW_LANE_SAMPLE_TYPE = "ILLUMINA_FLOW_LANE"; private final ITrackingServer trackingServer; @@ -70,12 +72,71 @@ public class TrackingBO { for (Email email : emails) { - From from = (email.getFromOrNull() == null) ? null : new From(email.getFromOrNull()); - mailClient.sendMessage(email.getSubject(), email.getContent(), - email.getReplyToOrNull(), from, email.getRecipients()); + try + { + From from = tryGetFromField(email); + String[] recipients = email.getRecipients(); + String content = email.getContent(); + String subject = email.getSubject(); + String replyToOrNull = email.getReplyToOrNull(); + sendMessage(mailClient, subject, content, replyToOrNull, from, recipients); + } catch (Exception ex) + { + sendErrorReport(mailClient, ex, email); + } } } + private static From tryGetFromField(Email email) + { + return (email.getFromOrNull() == null) ? null : new From(email.getFromOrNull()); + } + + // This email could not be sent, most probably the recipient addresses were + // incorrect. + // We send the email to the administrator "replyTo' address, the admin should + // forward it to the right recipient. + private static void sendErrorReport(IMailClient mailClient, Exception exception, Email email) + { + StringBuffer errorReportContent = new StringBuffer(); + appendLine(errorReportContent, "Dear openBIS Admin,"); + appendLine(errorReportContent, + "This email has been generated automatically from the openBIS Changes Tracking system."); + appendLine(errorReportContent, "There was a failure while trying to send the email:"); + appendLine(errorReportContent, exception.getMessage()); + appendLine(errorReportContent, + "The possible reason is that the recipient address is not valid."); + appendLine(errorReportContent, + "If you know the address of the recipient please correct it and forward this email to him."); + appendLine(errorReportContent, + "!!! Note that the Tracking System will not try to send this email again !!!"); + appendLine(errorReportContent, + "Please correct the recipient email address in openBIS to avoid similar problems in future."); + appendLine(errorReportContent, ""); + appendLine(errorReportContent, "Subject: " + email.getSubject()); + appendLine(errorReportContent, "Recipients: " + + CollectionUtils.abbreviate(email.getRecipients(), -1)); + appendLine(errorReportContent, ""); + appendLine(errorReportContent, "Original content:"); + + sendMessage(mailClient, "[Tracking] Sending an email failed", + errorReportContent.toString(), null, tryGetFromField(email), email + .getReplyToOrNull()); + } + + private static void sendMessage(IMailClient mailClient, String subject, String content, + String replyToOrNull, From fromOrNull, String... recipients) + { + mailClient.sendMessage(subject, content, replyToOrNull, fromOrNull, recipients); + LogUtils.debug("Sending an email [" + subject + "]\n" + content); + } + + private static void appendLine(StringBuffer sb, String msg) + { + sb.append(msg); + sb.append("\n"); + } + private static void saveTrackingState(TrackedEntities changedEntities, ITrackingDAO trackingDAO) { TrackingStateDTO state = new TrackingStateDTO(); diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java index 1857242294bc4d556c812a289e587788b4b13e90..95ed67a83fbd01e43837cde770d90760c995fbaa 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java @@ -46,6 +46,8 @@ public class TrackingClient private static final String EMAIL_TEMPLATE_FILE = "etc/tracking-email.template"; + private static final String OPENBIS_RMI_TRACKING = "/rmi-tracking"; + public static void main(String[] args) { try @@ -81,8 +83,8 @@ public class TrackingClient private static ITrackingServer createOpenBISTrackingServer(Parameters params) { - return HttpInvokerUtils.createServiceStub(ITrackingServer.class, params - .getOpenbisServerURL(), 5); + String serviceURL = params.getOpenbisServerURL() + OPENBIS_RMI_TRACKING; + return HttpInvokerUtils.createServiceStub(ITrackingServer.class, serviceURL, 5); } private static SessionContextDTO authentificateInOpenBIS(Parameters params, diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java index a9ceb026d76a222ac1453f1763a1693359325773..a092e10d69976acd5da8e5633763df1548c00fd2 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java @@ -37,20 +37,28 @@ public class LogUtils { String causeMsg = (ex.getCause() == null) ? "" : "Error cause: " + ex.getCause().getMessage(); - notificationLog - .error("An environment exception occured why trying to send emails with changes.\n" + String fullMsg = + "An environment exception occured why trying to send emails with changes.\n" + "Check and correct the configuration.\n" + "Error details: " - + ex.getMessage() + "\n" + causeMsg); + + ex.getMessage() + "\n" + causeMsg; + notify(ex, fullMsg); } public static void notify(Throwable ex) { - notificationLog - .error("An unexpected exception occured why trying to send emails with changes.\n" - + "Error details: " + ex.getMessage()); + String fullMsg = + "An unexpected exception occured why trying to send emails with changes.\n" + + "Error details: " + ex.getMessage(); + notify(ex, fullMsg); + } + + private static void notify(Throwable ex, String fullMsg) + { + ex.printStackTrace(); + notificationLog.error(fullMsg); } - public static EnvironmentFailureException envErr(String message, Throwable exception) + public static EnvironmentFailureException environmentError(String message, Throwable exception) { String fullMsg = message + " The following exception has been thrown: " + exception.getMessage(); @@ -62,4 +70,15 @@ public class LogUtils String fullMsg = String.format(msgFormat, params); return new EnvironmentFailureException(fullMsg); } + + public static void info(String msg) + { + operationLog.info(msg); + } + + public static void debug(String msg) + { + // FIXME 2009--, Tomasz Pylak: change to debug + operationLog.info(msg); + } }