package org.societies.orchestration.cpa.test.util; import com.google.common.base.Preconditions; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.apache.commons.lang.StringEscapeUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Element; /** * Object representing a status. */ public class Status { private transient static final JsonParser parser = new JsonParser(); private long id; private String screenName; private String createdAt; private String text; private transient JsonObject jsonObject; private transient String jsonString; protected Status() {} public long getId() { return id; } public String getText() { return text; } public String getCreatedAt() { return createdAt; } public String getScreenName() { return screenName; } public JsonObject getJsonObject() { return jsonObject; } public String getJsonString() { return jsonString; } public static Status fromJson(String json) { Preconditions.checkNotNull(json); JsonObject obj = (JsonObject) parser.parse(json); if (obj.get("html") == null) return null; Status status = new Status(); String html = obj.get("html").getAsString(); html = StringEscapeUtils.unescapeXml(html); // use some jsoup magic to parse html and fetch require elements org.jsoup.nodes.Document document = Jsoup.parse(html); Element dateElement = document.select("a[class*=tweet-timestamp]").last(); status.setCreatedAt(dateElement.text()); Element textElement = document.select("p[class*=js-tweet-text]").first(); status.setText(textElement.text()); String idRaw = parseUrlGetLastElementInPath(obj.get("url").getAsString()); status.setId(Long.parseLong(idRaw)); status.setScreenName(parseUrlGetLastElementInPath(obj.get("author_url").getAsString())); // TODO: We need to parse out the other fields. status.jsonObject = obj; status.jsonString = json; return status; } /** * Brittle implementation to get twitter data from webpage instead of api * @param html * @return */ public static Status fromHtml(String html) { Preconditions.checkNotNull(html); // use some jsoup magic to parse html and fetch require elements org.jsoup.nodes.Document document = Jsoup.parse(html); Status status = new Status(); Element dateElement = document.select("div.client-and-actions span.metadata span[title]").last(); status.setCreatedAt(dateElement.text()); Element textElement = document.select("p.js-tweet-text").first(); status.setText(textElement.text()); Element dataElement = document.select("div.permalink-tweet").first(); status.setId(Long.parseLong(dataElement.attr("data-tweet-id"))); status.setScreenName(dataElement.attr("data-screen-name")); return status; } private static String parseUrlGetLastElementInPath(String string) { String[] split = string.split("/"); String idRaw = split[split.length-1]; return idRaw; } public void setId(long id) { this.id = id; } public void setScreenName(String screenName) { this.screenName = screenName; } public void setCreatedAt(String createdAt) { this.createdAt = createdAt; } public void setText(String text) { this.text = text; } }