package com.atlassian.labs.speakeasy.product; import com.atlassian.labs.speakeasy.util.PomProperties; import com.atlassian.sal.api.user.UserManager; import com.atlassian.sal.api.user.UserProfile; import com.atlassian.templaterenderer.TemplateRenderer; import com.google.common.collect.Maps; import com.opensymphony.user.test.RemoteTestRunner; import org.apache.axis.utils.Admin; import org.apache.commons.mail.Email; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.SimpleEmail; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.mail.MessagingException; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.StringWriter; import java.util.Arrays; import java.util.Map; import static com.google.common.collect.Maps.newHashMap; /** * */ public class RefappProductAccessor implements ProductAccessor { private final PomProperties pomProperties; private final UserManager userManager; private final TemplateRenderer templateRenderer; private final Logger log = LoggerFactory.getLogger(RefappProductAccessor.class); public RefappProductAccessor(PomProperties pomProperties, UserManager userManager, TemplateRenderer templateRenderer) { this.pomProperties = pomProperties; this.userManager = userManager; this.templateRenderer = templateRenderer; } public String getSdkName() { return "refapp"; } public String getProfilePath() { return "/plugins/servlet/speakeasy/user"; } public String getTargetUsernameFromCondition(Map<String, Object> context) { return null; } public String getVersion() { return pomProperties.get("refapp.version"); } public String getDataVersion() { return ""; } public void sendEmail(EmailOptions options) { String toName = options.getToName(); String toEmail = options.getToEmail(); if (options.getToUsername() != null) { UserProfile to = userManager.getUserProfile(options.getToUsername()); if (to != null) { toName = to.getFullName(); toEmail = to.getEmail(); } else { log.warn("Cannot find profile for user '" + options.getToUsername()); return; } } Map<String,Object> context = newHashMap(options.getContext()); context.put("toFullName", toName); Email email = new SimpleEmail(); try { email.setHostName("localhost"); email.setSmtpPort(2525); email.setFrom(options.getFromEmail(), options.getFromName()); email.setSubject("[test] " + render(options.getSubjectTemplate(), context)); email.setMsg(render(options.getBodyTemplate(), context)); email.addTo(toEmail); if (options.getReplyToEmail() != null) { email.setReplyTo(Arrays.asList(new InternetAddress(options.getReplyToEmail()))); } email.send(); } catch (EmailException e) { log.error("Unable to send email", e); if (log.isDebugEnabled()) { ByteArrayOutputStream bout = new ByteArrayOutputStream(); try { email.getMimeMessage().writeTo(bout); log.debug("Sent email:\n" + new String(bout.toByteArray())); } catch (MessagingException ex) { throw new RuntimeException(ex); } catch (IOException e1) { throw new RuntimeException(e1); } } } catch (IOException e) { log.error("Unable to send email", e); } catch (AddressException e) { log.error("Invalid reply to address: " + options.getReplyToEmail(), e); } } private String render(String templateName, Map<String,Object> context) throws IOException { StringWriter writer = new StringWriter(); templateRenderer.render(templateName, context, writer); return writer.toString(); } }