diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java index 94315a6abf8f39033875e2b25994b18f6ef31fe1..f153d20b7aa5c255f2d0637136d77503be668cd2 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java @@ -16,11 +16,11 @@ package ch.ethz.bsse.cisd.dsu.tracking.email; +import ch.systemsx.cisd.common.mail.From; import ch.systemsx.cisd.common.mail.IMailClient; /** - * Simple encapsulation of - * {@link IMailClient#sendMessage(String, String, String, ch.systemsx.cisd.common.mail.From, String...)} + * Simple encapsulation of {@link IMailClient#sendMessage(String, String, String, From, String...)} * method parameters. * * @author Piotr Buczek @@ -33,11 +33,11 @@ public class Email private final String replyToOrNull; - private final String fromOrNull; + private final From fromOrNull; private final String[] recipients; - public Email(String subject, String content, String replyToOrNull, String fromOrNull, + public Email(String subject, String content, String replyToOrNull, From fromOrNull, String... recipients) { super(); @@ -48,6 +48,12 @@ public class Email this.recipients = recipients; } + public Email(String subject, String content, String replyToOrNull, String fromOrNull, + String... recipients) + { + this(subject, content, replyToOrNull, new From(fromOrNull), recipients); + } + public String getSubject() { return subject; @@ -63,7 +69,7 @@ public class Email return replyToOrNull; } - public String getFromOrNull() + public From getFromOrNull() { return fromOrNull; } diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java new file mode 100644 index 0000000000000000000000000000000000000000..ae91239a0c783ab6967cf46800115855f25cfade --- /dev/null +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java @@ -0,0 +1,46 @@ +/* + * Copyright 2009 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.ethz.bsse.cisd.dsu.tracking.email; + +/** + * Encapsulation of {@link Email} with a short summary of its content. + * + * @author Piotr Buczek + */ +public class EmailWithSummary +{ + private final Email email; + + private final String summary; + + public EmailWithSummary(Email email, String summary) + { + this.email = email; + this.summary = summary; + } + + public Email getEmail() + { + return email; + } + + public String getSummary() + { + return summary; + } + +} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java index b95d70da38471faab5d3040581096264d9418906..83c15ecb91602ff4294e15e9422c15c83f6b62aa 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java @@ -71,7 +71,7 @@ public class EntityTrackingEmailData } // data grouped by sequencing sample: <sequencing sample id, data> - private final Map<Long, SequencingSampleData> sequencingSampleData = + private final Map<Long, SequencingSampleData> sequencingSampleDataById = new HashMap<Long, SequencingSampleData>(0); private final List<ExternalData> dataSets = new ArrayList<ExternalData>(0); @@ -91,7 +91,7 @@ public class EntityTrackingEmailData public Collection<SequencingSampleData> getSequencingSamplesData() { - return sequencingSampleData.values(); + return sequencingSampleDataById.values(); } public List<ExternalData> getDataSets() @@ -112,7 +112,7 @@ public class EntityTrackingEmailData final Sample sequencingSample = flowLaneSample.getGeneratedFrom(); assert sequencingSample != null; - SequencingSampleData infoOrNull = sequencingSampleData.get(sequencingSample.getId()); + SequencingSampleData infoOrNull = sequencingSampleDataById.get(sequencingSample.getId()); if (infoOrNull == null) { // because sequencing samples are processed before flow lane samples @@ -127,7 +127,7 @@ public class EntityTrackingEmailData boolean newlyTracked) { final SequencingSampleData data = new SequencingSampleData(sequencingSample, newlyTracked); - sequencingSampleData.put(sequencingSample.getId(), data); + sequencingSampleDataById.put(sequencingSample.getId(), data); return data; } @@ -137,4 +137,58 @@ public class EntityTrackingEmailData dataSets.add(dataSet); } + /** short description of data kept in the structure */ + public String getDescription() + { + final StringBuilder sb = new StringBuilder(); + + // append info about tracked samples + if (getSequencingSamplesData().isEmpty()) + { + sb.append("no new samples tracked"); + } else + { + for (SequencingSampleData seqencingSampleData : getSequencingSamplesData()) + { + final int flowLaneSamplesSize = seqencingSampleData.getFlowLaneSamples().size(); + final String sequencingSampleIdentifier = + seqencingSampleData.getSequencingSample().getIdentifier(); + final boolean newlyTracked = seqencingSampleData.isNewlyTracked(); + sb.append(String.format( + "%sSequencing sample: '%s' with %d new Flow Lane samples tracked", + newlyTracked ? "new " : "", sequencingSampleIdentifier, + flowLaneSamplesSize, flowLaneSamplesSize > 0 ? ": " : "")); + for (Sample flowLaneSample : seqencingSampleData.getFlowLaneSamples()) + { + sb.append(flowLaneSample.getIdentifier() + ", "); + } + } + } + sb.append("\n"); + // append info about tracked data sets + if (getDataSets().isEmpty()) + { + sb.append("no new data sets tracked"); + } else + { + sb.append(getDataSets().size() + " new data set(s) tracked: "); + for (ExternalData dataSet : getDataSets()) + { + sb.append(dataSet.getIdentifier() + ", "); + } + } + sb.append("\n"); + return sb.toString(); + } + + // + // Object + // + + @Override + public String toString() + { + return getDescription(); + } + } 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 91066093d21e262a657220c6ac5103cc4fe6424d..2a0b97a631fd48e002f0d7a239911f9c29ae0679 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 @@ -86,20 +86,25 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat return result; } - public List<Email> generateEmails(TrackedEntities trackedEntities) + public List<EmailWithSummary> generateEmails(TrackedEntities trackedEntities) { final Collection<EntityTrackingEmailData> emailDataGroupedByRecipient = EntityTrackingEmailDataManager.groupByRecipient(trackedEntities); - final List<Email> results = new ArrayList<Email>(); + final List<EmailWithSummary> results = new ArrayList<EmailWithSummary>(); for (EntityTrackingEmailData emailData : emailDataGroupedByRecipient) { - results.add(createEmail(emailData)); + results.add(createEmailWithSummary(emailData)); } return results; } + private EmailWithSummary createEmailWithSummary(EntityTrackingEmailData emailData) + { + return new EmailWithSummary(createEmail(emailData), emailData.getDescription()); + } + private Email createEmail(EntityTrackingEmailData emailData) { String content = EmailContentGenerator.fillTemplateWithData(template, emailData); diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java index 812d6168575874908b51ae8b92d8e15be2fd038e..19c650ff288ce64a6cc694a36c5526871d0d9f36 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java @@ -26,10 +26,10 @@ import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; public interface IEntityTrackingEmailGenerator { /** - * Generates all {@link Email}s to be send containing information about + * Generates all {@link EmailWithSummary}s to be send containing information about * <var>trackedEntities</var>. * * @param trackedEntities recently tracked entities */ - List<Email> generateEmails(TrackedEntities trackedEntities); + List<EmailWithSummary> generateEmails(TrackedEntities trackedEntities); } 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 4a25c9fc885390dfe66b5799b0e682b2c5f698b0..56469105863c73333f0863b8b29257b9a8878dd7 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 @@ -21,6 +21,7 @@ import java.util.List; 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.EmailWithSummary; 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; @@ -63,75 +64,87 @@ public class TrackingBO TrackedEntities changedEntities = fetchChangedEntities(prevTrackingState, trackingServer, session); - List<Email> emails = emailGenerator.generateEmails(changedEntities); - sendEmails(emails, mailClient); + List<EmailWithSummary> emailsWithSummary = emailGenerator.generateEmails(changedEntities); + sendEmails(emailsWithSummary, mailClient); saveTrackingState(changedEntities, trackingDAO); } - private static void sendEmails(List<Email> emails, IMailClient mailClient) + private static void sendEmails(List<EmailWithSummary> emailsWithSummary, IMailClient mailClient) { - for (Email email : emails) + for (EmailWithSummary emailWithSummary : emailsWithSummary) { 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); + sendMessage(mailClient, emailWithSummary); } catch (Exception ex) { - sendErrorReport(mailClient, ex, email); + sendErrorReport(mailClient, ex, emailWithSummary); } } } - 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) + private static void sendErrorReport(IMailClient mailClient, Exception exception, + EmailWithSummary emailWithSummary) { - StringBuffer errorReportContent = new StringBuffer(); - appendLine(errorReportContent, "Dear openBIS Admin,"); - appendLine(errorReportContent, + Email email = emailWithSummary.getEmail(); + + StringBuilder errorReportContentBuilder = new StringBuilder(); + appendLine(errorReportContentBuilder, "Dear openBIS Admin,"); + appendLine(errorReportContentBuilder, "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, + appendLine(errorReportContentBuilder, "There was a failure while trying to send the email:"); + appendLine(errorReportContentBuilder, exception.getMessage()); + appendLine(errorReportContentBuilder, "The possible reason is that the recipient address is not valid."); - appendLine(errorReportContent, + appendLine(errorReportContentBuilder, "If you know the address of the recipient please correct it and forward this email to him."); - appendLine(errorReportContent, + appendLine(errorReportContentBuilder, "!!! Note that the Tracking System will not try to send this email again !!!"); - appendLine(errorReportContent, + appendLine(errorReportContentBuilder, "Please correct the recipient email address in openBIS to avoid similar problems in future."); - appendLine(errorReportContent, ""); - appendLine(errorReportContent, "Subject: " + email.getSubject()); - appendLine(errorReportContent, "Recipients: " + appendLine(errorReportContentBuilder, ""); + appendLine(errorReportContentBuilder, "Subject: " + email.getSubject()); + appendLine(errorReportContentBuilder, "Recipients: " + CollectionUtils.abbreviate(email.getRecipients(), -1)); - appendLine(errorReportContent, ""); - appendLine(errorReportContent, "Original content:"); + appendLine(errorReportContentBuilder, ""); - sendMessage(mailClient, "[Tracking] Sending an email failed", - errorReportContent.toString(), null, tryGetFromField(email), email - .getReplyToOrNull()); + StringBuilder errorReportSummaryBuilder = + new StringBuilder(errorReportContentBuilder.toString()); + + appendLine(errorReportContentBuilder, "Original content: "); + appendLine(errorReportContentBuilder, email.getContent()); + String errorReportContent = errorReportContentBuilder.toString(); + + appendLine(errorReportSummaryBuilder, "Original content summary: "); + appendLine(errorReportSummaryBuilder, emailWithSummary.getSummary()); + String errorReportSummary = errorReportSummaryBuilder.toString(); + + Email errorReportEmail = + new Email("[Tracking] Sending an email failed", errorReportContent, null, email + .getFromOrNull(), email.getReplyToOrNull()); + sendMessage(mailClient, new EmailWithSummary(errorReportEmail, errorReportSummary)); } - private static void sendMessage(IMailClient mailClient, String subject, String content, - String replyToOrNull, From fromOrNull, String... recipients) + private static void sendMessage(IMailClient mailClient, EmailWithSummary emailWithSummary) { + Email email = emailWithSummary.getEmail(); + String summary = emailWithSummary.getSummary(); + + String subject = email.getSubject(); + String content = email.getContent(); + String replyToOrNull = email.getReplyToOrNull(); + From fromOrNull = email.getFromOrNull(); + String[] recipients = email.getRecipients(); mailClient.sendMessage(subject, content, replyToOrNull, fromOrNull, recipients); - LogUtils.debug("Sending an email [" + subject + "]\n" + content); + + LogUtils.debug("Sending an email [" + subject + "]\n" + summary); } - private static void appendLine(StringBuffer sb, String msg) + private static void appendLine(StringBuilder sb, String msg) { sb.append(msg); sb.append("\n");