package org.activityinfo.server.util;
import com.google.common.base.Charsets;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.activityinfo.server.database.hibernate.entity.User;
import org.activityinfo.service.DeploymentConfiguration;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Client that handles subscriptions to the ActivityInfo
* mailing list
*/
@Singleton
public class MailingListClient {
private static final Logger LOGGER = Logger.getLogger(MailingListClient.class.getName());
private final String apiKey;
private final String listId;
@Inject
public MailingListClient(DeploymentConfiguration config) {
this.apiKey = config.getProperty("mailchimp.api.key");
this.listId = config.getProperty("mailchimp.list.id", "9289430112");
}
public void subscribe(User user) {
ListSubscribeMethod method = new ListSubscribeMethod();
method.apiKey = apiKey;
method.doubleOptIn = false;
method.emailAddress = user.getEmail();
method.id = listId;
method.mergeVars.email = user.getEmail();
method.mergeVars.firstName = user.getName();
try {
post(method);
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Failed to subscribe user", e);
}
}
private void post(ListSubscribeMethod method) throws Exception {
URL url = new URL("http://us4.api.mailchimp.com/1.3/?method=listSubscribe");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestProperty("Accept", "application/json");
conn.setConnectTimeout(5 * 60 * 1000);
conn.setReadTimeout(5 * 60 * 1000);
ObjectMapper mapper = new ObjectMapper();
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), Charsets.UTF_8);
String json = mapper.writeValueAsString(method);
LOGGER.fine("MailChimp: " + json);
writer.write(json);
writer.flush();
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
writer.close();
reader.close();
}
// Holds a subscriber's merge_vars info (see http://apidocs.mailchimp.com/legacy/1.3/listsubscribe.func.php )
public static class MergeVars {
@JsonProperty("EMAIL")
private String email;
@JsonProperty("FNAME")
private String firstName;
}
public static class ListSubscribeMethod {
@JsonProperty("apikey")
private String apiKey;
@JsonProperty
private String id;
@JsonProperty("email_address")
private String emailAddress;
@JsonProperty("double_optin")
private boolean doubleOptIn;
@JsonProperty("merge_vars")
private MergeVars mergeVars = new MergeVars();
}
}