You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tasks/astrid/src/com/todoroo/astrid/service/abtesting/ABTestInvoker.java

114 lines
3.6 KiB
Java

/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.service.abtesting;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.RestClient;
/**
* Invoker for communicating with the Astrid Analytics server
* @author Sam
*
*/
@SuppressWarnings("nls")
public class ABTestInvoker {
/** NOTE: these values are development values and will not work on production */
private static final String URL = "http://analytics.astrid.com/api/2/";
public static final String AB_RETENTION_METHOD = "ab_retention";
public static final String AB_ACTIVATION_METHOD = "ab_activation";
private static final String ACQUISITION_METHOD = "acquisition";
private static final String API_KEY = "ryyubd";
private static final String API_SECRET = "q9ef3i";
private static final String PREF_REPORTED_ACQUISITION = "p_reported_acq";
@Autowired private RestClient restClient;
public ABTestInvoker() {
DependencyInjectionService.getInstance().inject(this);
}
public void reportAcquisition() {
}
/**
* Posts the payload to the analytics server
* @param payload - JSONArray of data points. Created by the
* helper method in ABTestReportingService
* @return
* @throws IOException
*/
public JSONObject post(String method, JSONArray payload) throws IOException {
try {
HttpEntity postData = createPostData(payload);
String response = restClient.post(URL + method, postData);
JSONObject object = new JSONObject(response);
if (object.getString("status").equals("error")) {
throw new IOException("Error reporting ABTestEvent: " +
object.optString("message"));
}
return object;
} catch (JSONException e) {
throw new IOException(e.getMessage());
}
}
/**
* Converts the JSONArray payload into an HTTPEntity suitable for
* POSTing.
* @param payload
* @return
*/
private HttpEntity createPostData(JSONArray payload) throws IOException {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("apikey", API_KEY));
if (payload != null) {
params.add(new BasicNameValuePair("payload", payload.toString()));
}
StringBuilder sigBuilder = new StringBuilder();
for(NameValuePair entry : params) {
if(entry.getValue() == null) {
continue;
}
String key = entry.getName();
String value = entry.getValue();
sigBuilder.append(key).append(value);
}
sigBuilder.append(API_SECRET);
// String signature = DigestUtils.md5Hex(sigBuilder.toString());
// params.add(new BasicNameValuePair("sig", signature));
try {
return new UrlEncodedFormEntity(params, HTTP.UTF_8);
} catch (UnsupportedEncodingException e) {
throw new IOException("Unsupported URL encoding");
}
}
}