package org.jenkinsci.plugins.quarantine; import hudson.model.BuildListener; import hudson.model.Hudson; import hudson.model.User; import hudson.tasks.Mailer; import hudson.tasks.junit.CaseResult; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.apache.commons.jelly.JellyContext; import org.apache.commons.jelly.JellyException; import org.apache.commons.jelly.Script; import org.apache.commons.jelly.XMLOutput; import org.xml.sax.InputSource; import jenkins.model.JenkinsLocationConfiguration; public class MailNotifier { public class ResultActionPair { private final CaseResult result; private final QuarantineTestAction action; public ResultActionPair(CaseResult result, QuarantineTestAction action) { this.result = result; this.action = action; } public CaseResult getResult() { return result; } public QuarantineTestAction getAction() { return action; } } HashMap<String, List<ResultActionPair>> emailsToSend = new HashMap<String, List<ResultActionPair>>(); PrintStream logger; public MailNotifier(BuildListener build_listener) { logger = build_listener.getLogger(); } private void println(String msg) { logger.println(msg); // System.out.println(msg); } public void addResult(CaseResult result, QuarantineTestAction action) { String username = action.quarantinedByName(); if (!emailsToSend.containsKey(username)) { emailsToSend.put(username, new ArrayList<ResultActionPair>()); } emailsToSend.get(username).add(new ResultActionPair(result, action)); } public String getEmailAddress(String username) { String address = null; User u = User.get(username); if (u == null) { println("failed obtaining user for name " + username); return address; } Mailer.UserProperty p = u.getProperty(Mailer.UserProperty.class); if (p == null) { println("failed obtaining email address for user " + username); return address; } if (p.getAddress() == null) { println("failed obtaining email address (is null) for user " + username); return address; } return p.getAddress(); } public void sendEmails() { for (Map.Entry<String, List<ResultActionPair>> entry : emailsToSend.entrySet()) { sendEmail(entry.getKey(), entry.getValue()); } } private String renderEmail(String username, List<ResultActionPair> results) { ByteArrayOutputStream output; try { Script script; JellyContext ctx = new JellyContext(); ctx.setVariable("user", username); ctx.setVariable("results", results); ctx.setVariable("rootURL", Hudson.getInstance().getRootUrl()); InputStream template = getClass().getResourceAsStream("MailNotifier/message.jelly"); script = ctx.compileScript(new InputSource(template)); if (script == null) { println("[Quarantine]: failed compiling jelly script"); return null; } output = new ByteArrayOutputStream(16 * 1024); XMLOutput xmlOutput = XMLOutput.createXMLOutput(output); script.run(ctx, xmlOutput); xmlOutput.flush(); xmlOutput.close(); output.close(); } catch (JellyException e) { println("[Quarantine]: failed compiling jelly: " + e.toString()); return null; } catch (IOException e) { println("[Quarantine]: converting jelly: " + e.toString()); return null; } return output.toString(); } public void sendEmail(String username, List<ResultActionPair> results) { String address = getEmailAddress(username); if (address == null) { return; } MimeMessage msg = new MimeMessage(Mailer.descriptor().createSession()); try { msg.setFrom(new InternetAddress(JenkinsLocationConfiguration.get().getAdminAddress())); msg.setSentDate(new Date()); msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject("Failure of quarantined tests"); String message = renderEmail(username, results); if (message == null) { println("[Quarantine]: unable to render message"); return; } msg.setContent(message, "text/html"); Transport.send(msg); println("[Quarantine]: sent email to " + address); } catch (MessagingException e) { println("[Quarantine]: failed sending email: " + e.toString()); } } }