/**
* @author Koushik Sinha
* Last modified: 11/01/2014
*
* The TaggerJsonOutputAdpater class implements Tagger specific
* json object format. Specifically, it can return null if the
* nominal_labels field in a json message is null.
*
*/
package qa.qcri.aidr.output.utils;
import org.apache.log4j.Logger;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class TaggerJsonOutputAdapter {
// Logger setup
private static Logger logger = Logger.getLogger(TaggerJsonOutputAdapter.class);
private String crisisCode = null;
public TaggerJsonOutputAdapter() {}
public String getCrisisCode() {
return crisisCode;
}
public void setCrisisCode(String crisisCode) {
this.crisisCode = crisisCode;
}
public String buildJsonString(String rawJsonString, boolean rejectNullFlag) {
Gson jsonObject = new GsonBuilder().serializeNulls().disableHtmlEscaping()
.serializeSpecialFloatingPointValues() //.setPrettyPrinting()
.create();
// remove top-level array: we are only dealing with JsonObjects from REDIS in aidr-output
if (rawJsonString.startsWith("[")) // should never happen
rawJsonString = rawJsonString.substring(1, rawJsonString.length()-1);
try {
JsonParser parser = new JsonParser();
JsonObject obj = (JsonObject) parser.parse(rawJsonString);
JsonElement tweetData = null;
JsonElement timestamp = null;
String id = null;
JsonObject userData = null;
JsonElement screen_name = null;
JsonObject aidrData = null;
JsonArray nominalLabels;
crisisCode = null;
if (obj.has("text")) { // should always be true
tweetData = obj.get("text"); // get the tweet text string
if (obj.has("created_at")) {
timestamp = obj.get("created_at");
}
if (obj.has("id_str")) {
id = obj.get("id_str").getAsString();
}
if (obj.has("user")) {
userData = (JsonObject) obj.get("user");
screen_name = userData.get("screen_name");
}
// Added as per pivotal story #90581110
JsonObject geo = null;
JsonArray coordinates = null;
if (obj.has("coordinates") && !obj.get("coordinates").isJsonNull()) {
geo = (JsonObject) obj.get("coordinates");
if (!geo.get("coordinates").isJsonNull()) {
coordinates = geo.get("coordinates").getAsJsonArray();
}
}
if (obj.has("aidr")) { // should always be true
aidrData = (JsonObject) obj.get("aidr"); // get the aidr JSON object
// extract relevant fields from the aidr JSON object
JsonElement crisisCode = null;
if (aidrData.has("crisis_code")) { // should always be true
crisisCode = aidrData.get("crisis_code");
setCrisisCode(crisisCode.getAsString());
}
JsonElement crisisName = null;
if (aidrData.has("crisis_name")) // should always be true
crisisName = aidrData.get("crisis_name");
if (aidrData.has("nominal_labels") && !aidrData.get("nominal_labels").isJsonNull()) { // if false, then something wrong in AIDR setup
nominalLabels = aidrData.get("nominal_labels").getAsJsonArray();
} else {
nominalLabels = new JsonArray();
}
// Now populate the return object
JsonReturnClass jsonObj = new JsonReturnClass();
jsonObj.setText(tweetData);
jsonObj.created_at = timestamp;
jsonObj.setCrisis_code(crisisCode);
jsonObj.setCrisis_name(crisisName);
jsonObj.nominal_labels.addAll(nominalLabels);
jsonObj.setGeo(geo);
if (coordinates != null) {
jsonObj.setLongitude(coordinates.get(0).getAsDouble());
jsonObj.setLatitude(coordinates.get(1).getAsDouble());
}
jsonObj.setId(id);
jsonObj.setScreen_name(screen_name);
if (!isemptyNominalLabels(nominalLabels))
return jsonObject.toJson(jsonObj);
if (rejectNullFlag)
return null; // returning "null" to meet Tagger's specific front-end requirements
else
return jsonObject.toJson(jsonObj);
}
}
} catch (Exception e) {
logger.error("Exception in json parsing for string: " + rawJsonString, e);
}
// no group label called "aidr" or "text" present
if (rejectNullFlag)
return null; // returning "null" to meet Tagger's specific front-end requirements
else
return jsonObject.toJson(new JsonObject());
}
private boolean isemptyNominalLabels(JsonArray nominalLabels) {
if (nominalLabels.size() == 0)
return true;
else
return false;
}
public class JsonReturnClass {
private JsonElement created_at = null;
private JsonElement text = null;
private JsonElement crisis_code = null;
private JsonElement crisis_name = null;
private JsonObject geo = null;
private Double latitude = null;
private Double longitude = null;
private String id = null;
private JsonElement screen_name = null;
private JsonArray nominal_labels;
public JsonElement getText() {
return text;
}
public void setText(JsonElement text) {
this.text = text;
}
public JsonElement getCrisis_code() {
return crisis_code;
}
public void setCrisis_code(JsonElement crisis_code) {
this.crisis_code = crisis_code;
}
public JsonElement getCrisis_name() {
return crisis_name;
}
public void setCrisis_name(JsonElement crisis_name) {
this.crisis_name = crisis_name;
}
public JsonElement getScreen_name() {
return screen_name;
}
public void setScreen_name(JsonElement screen_name) {
this.screen_name = screen_name;
}
public JsonReturnClass() {
nominal_labels = new JsonArray();
}
public JsonElement getDate() {
return created_at;
}
public JsonElement getCrisisCode() {
return crisis_code;
}
public JsonElement getCrisisName() {
return crisis_name;
}
public JsonArray getNominalLabels() {
JsonArray arr = new JsonArray();
if (nominal_labels != null)
arr.addAll(nominal_labels);
return arr;
}
public void setNominal_labels(JsonArray nominal_labels) {
this.nominal_labels = nominal_labels;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public JsonElement getScreenName() {
return screen_name;
}
public JsonObject getGeo() {
return geo;
}
public void setGeo(JsonObject geo) {
this.geo = geo;
}
public Double getLatitude() {
return latitude;
}
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
public Double getLongitude() {
return longitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
}
}