/**
* REST Web Service
*
* @author Imran, Koushik
*/
package qa.qcri.aidr.persister.api;
/*
* and open the template in the editor.
*/
import java.net.UnknownHostException;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import net.minidev.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import qa.qcri.aidr.common.values.DownloadType;
import qa.qcri.aidr.persister.collector.RedisCollectorPersister;
import qa.qcri.aidr.utils.DownloadJsonType;
import qa.qcri.aidr.utils.GenericCache;
import qa.qcri.aidr.utils.JsonDeserializer;
import qa.qcri.aidr.utils.PersisterConfigurationProperty;
import qa.qcri.aidr.utils.PersisterConfigurator;
import qa.qcri.aidr.utils.ResultStatus;
@Path("persister")
@Component
public class Persister4CollectorAPI {
private static Logger logger = Logger.getLogger(Persister4CollectorAPI.class.getName());
@Context
private UriInfo context;
public Persister4CollectorAPI() {
}
@GET
@Produces("application/json")
@Consumes("application/json")
@Path("/start")
public Response startPersister(@QueryParam("file") String fileLocation, @QueryParam("collectionCode") String collectionCode) {
String response="";
try{
fileLocation = PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.DEFAULT_PERSISTER_FILE_PATH); //OVERRIDING PATH RECEIVED FROM EXTERNAL REQUEST
if (StringUtils.isNotEmpty(fileLocation) && StringUtils.isNotEmpty(collectionCode)) {
if (GenericCache.getInstance().getPersisterObject(collectionCode) != null) {
response="A persister is already running for this collection code [" + collectionCode + "]";
return Response.ok(response).build();
}
RedisCollectorPersister p = new RedisCollectorPersister(fileLocation, collectionCode);
p.startMe();
GenericCache.getInstance().setPersisterObject(collectionCode, p);
response = "Started persisting to " + fileLocation;
return Response.ok(response).build();
}
}catch (Exception ex) {
logger.error(collectionCode + ": Failed to start persister");
}
return Response.ok(response).build();
}
@GET
@Produces("application/json")
@Consumes("application/json")
@Path("/stop")
public Response stopPersister(@QueryParam("collectionCode") String collectionCode) {
String response;
RedisCollectorPersister p = GenericCache.getInstance().getPersisterObject(collectionCode);
if (p != null) {
try {
logger.debug(collectionCode + "Aborting persister...");
GenericCache.getInstance().delPersisterObject(collectionCode);
p.suspendMe();
logger.info("Aborting done for " + collectionCode);
response = "Persistance of [" + collectionCode + "] has been stopped.";
return Response.ok(response).build();
} catch (InterruptedException ex) {
logger.error(collectionCode + ": Failed to stop persister");
}
}
response = "Unable to locate a running persister with the given collection code:[" + collectionCode + "]";
return Response.ok(response).build();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/genCSV")
public Response generateCSVFromLastestJSON(@QueryParam("collectionCode") String collectionCode,
@QueryParam("exportLimit") int exportLimit) throws UnknownHostException {
logger.info("Received request for collection: " + collectionCode);
JsonDeserializer jsonD = new JsonDeserializer();
String fileName = jsonD.generateJSON2CSV_100K_BasedOnTweetCount(collectionCode, exportLimit);
fileName = PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.PERSISTER_DOWNLOAD_URL) + collectionCode+"/"+fileName;
logger.info("Done processing request for collection: " + collectionCode + ", returning created file: " + fileName);
//return Response.ok(fileName).build();
JSONObject obj = new JSONObject();
obj.putAll(ResultStatus.getUIWrapper(collectionCode, null, fileName, true));
logger.info("Returning JSON object: " + ResultStatus.getUIWrapper(collectionCode, null, fileName, true));
return Response.ok(obj.toJSONString()).build();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/genTweetIds")
public Response generateTweetsIDSCSVFromAllJSON(@QueryParam("collectionCode") String collectionCode,
@DefaultValue("true") @QueryParam("downloadLimited") Boolean downloadLimited) throws UnknownHostException {
logger.info("Received request for collection: " + collectionCode);
JsonDeserializer jsonD = new JsonDeserializer();
Map<String, Object> result = jsonD.generateJson2TweetIdsCSV(collectionCode, downloadLimited);
String fileName = PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.PERSISTER_DOWNLOAD_URL) + collectionCode+"/" + (String) result.get("fileName");
logger.info("Done processing request for collection: " + collectionCode + ", returning created file: " + fileName);
JSONObject obj = new JSONObject();
obj.put("feedCount", result.get("count"));
if ((Integer) result.get("count") < Integer.parseInt(PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.DEFAULT_TWEETID_VOLUME_LIMIT)) ) {
obj.putAll(ResultStatus.getUIWrapper(collectionCode, null, fileName, true));
logger.info("Returning JSON object: " + ResultStatus.getUIWrapper(collectionCode, null, fileName, true));
return Response.ok(obj.toJSONString()).build();
} else {
obj.putAll(ResultStatus.getUIWrapper(collectionCode,PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.TWEET_DOWNLOAD_LIMIT_MSG_PREFIX) + PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.DEFAULT_TWEETID_VOLUME_LIMIT) + PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.TWEET_DOWNLOAD_LIMIT_MSG_SUFFIX), fileName, true));
logger.info("Returning JSON object: " + ResultStatus.getUIWrapper(collectionCode, PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.TWEET_DOWNLOAD_LIMIT_MSG_PREFIX) + PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.DEFAULT_TWEETID_VOLUME_LIMIT) + PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.TWEET_DOWNLOAD_LIMIT_MSG_SUFFIX), fileName, true));
return Response.ok(obj.toJSONString()).build();
}
}
@GET
@Produces("application/json")
@Path("/ping")
public Response ping() throws UnknownHostException {
String response = "{\"application\":\"aidr-persister\", \"status\":\"RUNNING\"}";
return Response.ok(response).build();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/genJson")
public Response generateJSONFromLastestJSON(@QueryParam("collectionCode") String collectionCode,
@DefaultValue(DownloadType.TEXT_JSON) @QueryParam("jsonType") String jsonType) throws UnknownHostException {
logger.info("Received request for collection: " + collectionCode + " with jsonType = " + jsonType);
JsonDeserializer jsonD = new JsonDeserializer();
String fileName = jsonD.generateJSON2JSON_100K_BasedOnTweetCount(collectionCode, DownloadJsonType.getDownloadJsonTypeFromString(jsonType));
fileName = PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.PERSISTER_DOWNLOAD_URL) + collectionCode+"/"+fileName;
logger.info("Done processing request for collection: " + collectionCode + ", returning created file: " + fileName);
//return Response.ok(fileName).build();
JSONObject obj = new JSONObject();
obj.putAll(ResultStatus.getUIWrapper(collectionCode, null, fileName, true));
logger.info("Returning JSON object: " + ResultStatus.getUIWrapper(collectionCode, null, fileName, true));
return Response.ok(obj.toJSONString()).build();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/genJsonTweetIds")
public Response generateTweetsIDSJSONFromAllJSON(@QueryParam("collectionCode") String collectionCode,
@DefaultValue("true") @QueryParam("downloadLimited") Boolean downloadLimited,
@DefaultValue(DownloadType.TEXT_JSON) @QueryParam("jsonType") String jsonType) throws UnknownHostException {
logger.info("Received request for collection: " + collectionCode + " with jsonType = " + jsonType);
JsonDeserializer jsonD = new JsonDeserializer();
Map<String, Object> result = jsonD.generateJson2TweetIdsJson(collectionCode, downloadLimited, DownloadJsonType.getDownloadJsonTypeFromString(jsonType));
String fileName = PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.PERSISTER_DOWNLOAD_URL) + collectionCode+"/" + (String)result.get("fileName");
logger.info("Done processing request for collection: " + collectionCode + ", returning created file: " + fileName);
//return Response.ok(fileName).build();
JSONObject obj = new JSONObject();
if ((Integer) result.get("count") < Integer.parseInt(PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.DEFAULT_TWEETID_VOLUME_LIMIT))) {
obj.putAll(ResultStatus.getUIWrapper(collectionCode, null, fileName, true));
logger.info("Returning JSON object: " + ResultStatus.getUIWrapper(collectionCode, null, fileName, true));
return Response.ok(obj.toJSONString()).build();
} else {
obj.putAll(ResultStatus.getUIWrapper(collectionCode, PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.TWEET_DOWNLOAD_LIMIT_MSG_PREFIX) + PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.DEFAULT_TWEETID_VOLUME_LIMIT) + PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.TWEET_DOWNLOAD_LIMIT_MSG_SUFFIX), fileName, true));
logger.info("Returning JSON object: " + ResultStatus.getUIWrapper(collectionCode, PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.TWEET_DOWNLOAD_LIMIT_MSG_PREFIX) + PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.DEFAULT_TWEETID_VOLUME_LIMIT) + PersisterConfigurator.getInstance().getProperty(PersisterConfigurationProperty.TWEET_DOWNLOAD_LIMIT_MSG_SUFFIX), fileName, true));
return Response.ok(obj.toJSONString()).build();
}
}
}