package org.swellrt.server.box.servlet;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.NotImplementedException;
import org.apache.velocity.Template;
import org.apache.velocity.tools.ConversionUtils;
import org.waveprotocol.box.server.account.AccountData;
import org.waveprotocol.box.server.account.HumanAccountData;
import org.waveprotocol.box.server.authentication.SessionManager;
import org.waveprotocol.box.server.persistence.AccountStore;
import org.waveprotocol.box.server.persistence.PersistenceException;
import org.waveprotocol.wave.model.wave.ParticipantId;
import com.google.inject.Inject;
public class InviteService extends BaseService {
private static final String ID_OR_EMAIL = "id-or-email";
private static final String INVITATION_EMAIL_BUNDLE = "EmailMessages";
private static final String INVITATION_TEMPLATE = "Invitation.vm";
public static final String URL = "url";
public static final String URL_TEXT = "url_text";
private final AccountStore accountStore;
private final EmailSender emailSender;
private DecoupledTemplates decTemplates;
@Inject
public InviteService(SessionManager sessionManager, AccountStore accountStore,
EmailSender emailSender, DecoupledTemplates decTemplates) {
super(sessionManager);
this.accountStore = accountStore;
this.emailSender = emailSender;
this.decTemplates = decTemplates;
}
@Override
public void execute(HttpServletRequest req, HttpServletResponse response) throws IOException {
ParticipantId participantId = sessionManager.getLoggedInUser(req);
if (participantId == null) {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return;
}
HumanAccountData hum = sessionManager.getAccountData(participantId).asHuman();
Locale locale;
if (hum != null && !hum.getId().isAnonymous()) {
if (hum.getLocale() != null) {
locale = ConversionUtils.toLocale(hum.getLocale());
}
locale = Locale.getDefault();
} else {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return;
}
String url = req.getParameter(URL);
String urlText = req.getParameter(URL_TEXT);
HashMap<String, Object> params = new HashMap<String, Object>();
String idOrEmail = req.getParameter(ID_OR_EMAIL);
String emailAddress = idOrEmail;
String nickOrEmail = idOrEmail;
List<AccountData> accounts = null;
try {
try {
accounts = accountStore.getAccountByEmail(idOrEmail);
} catch (NotImplementedException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
// try to find by username if not found by email
if (accounts == null || accounts.isEmpty()) {
AccountData acc = accountStore.getAccount(new ParticipantId(idOrEmail));
if (acc != null && !acc.getId().isAnonymous()) {
accounts.add(acc);
emailAddress = acc.asHuman().getEmail();
nickOrEmail = acc.getId().getName();
}
}
} catch (PersistenceException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
String inviter = participantId.getAddress().split("@")[0];
params.put("inviter", inviter);
params.put("url", url);
params.put("nick_or_email", nickOrEmail);
params.put("url_text", urlText);
try {
Template t = decTemplates.getTemplateFromName(INVITATION_TEMPLATE);
ResourceBundle b = decTemplates.getBundleFromName(INVITATION_EMAIL_BUNDLE, locale);
String subject = MessageFormat.format(b.getString("invitationEmailSubject"), inviter);
String body = decTemplates.getTemplateMessage(t, INVITATION_EMAIL_BUNDLE, params, locale);
emailSender.send(new InternetAddress(emailAddress), subject, body);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}