package com.atlassian.labs.speakeasy.product;
import com.atlassian.fecru.user.User;
import com.atlassian.fisheye.spi.data.MailMessageData;
import com.atlassian.labs.speakeasy.util.PomProperties;
import com.atlassian.templaterenderer.TemplateRenderer;
import com.cenqua.fisheye.mail.Mailer;
import com.cenqua.fisheye.user.UserManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;
public class FecruProductAccessor implements ProductAccessor {
private final Logger log = LoggerFactory.getLogger(FecruProductAccessor.class);
private final PomProperties pomProperties;
private final UserManager userManager;
private final TemplateRenderer templateRenderer;
private final Mailer mailer;
public FecruProductAccessor(PomProperties pomProperties, TemplateRenderer templateRenderer, UserManager userManager,
Mailer mailer) {
this.pomProperties = pomProperties;
this.templateRenderer = templateRenderer;
// RootConfig isn't exposed to plugins.
this.userManager = userManager;
this.mailer = mailer;
}
public String getSdkName() {
return "fecru";
}
public String getProfilePath()
{
return "/plugins/servlet/speakeasy/user";
}
public String getTargetUsernameFromCondition(Map<String, Object> context)
{
return null;
}
public String getVersion() {
return pomProperties.get("fecru.version");
}
public String getDataVersion() {
return pomProperties.get("fecru.data.version");
}
public void sendEmail(EmailOptions options) {
String toName = options.getToName();
String toEmail = options.getToEmail();
if (options.getToUsername() != null)
{
final User user = getUser(options.getToUsername());
if (user == null) {
return;
}
if (user.getEmail() == null) {
log.warn("No email found for username: " + options.getToUsername());
return;
}
toName = user.getDisplayName();
toEmail = user.getEmail();
}
try {
final MailMessageData message = new MailMessageData();
message.setFrom(options.getFromEmail());
message.setFromDisplayName(options.getFromName());
message.addRecipient(toEmail);
if (options.getReplyToEmail() != null)
{
// todo: api doesn't seem to support this?
}
message.setSubject(render(options.getSubjectTemplate(), options.getContext()));
message.setBodyText("text/plain", render(options.getBodyTemplate(), options.getContext()));
mailer.sendMessage(message);
} catch (IOException e) {
log.error("Unable to send mail", e);
}
}
private String render(String templateName, Map<String,Object> context) throws IOException {
StringWriter writer = new StringWriter();
templateRenderer.render(templateName, context, writer);
return writer.toString();
}
private User getUser(String username) {
try {
return userManager.getUser(username);
} catch (Exception e) {
log.warn("Could not find user by username: " + username, e);
return null;
}
}
}