package com.cattong.weibo.impl.twitter;
import static com.cattong.commons.util.ParseUtil.escapeAngleBrackets;
import static com.cattong.commons.util.ParseUtil.getBoolean;
import static com.cattong.commons.util.ParseUtil.getDate;
import static com.cattong.commons.util.ParseUtil.getInt;
import static com.cattong.commons.util.ParseUtil.getRawString;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.cattong.commons.LibException;
import com.cattong.commons.LibResultCode;
import com.cattong.commons.ServiceProvider;
import com.cattong.commons.util.ParseUtil;
import com.cattong.entity.Status;
import com.cattong.entity.User;
class TwitterStatusAdaptor {
/**
* 从JSON字符串创建Status对象
*
* @param jsonString
* JSON字符串
* @return Status对象
* @throws LibException
*/
public static Status createStatus(String jsonString) throws LibException {
try {
JSONObject json = new JSONObject(jsonString);
return createStatus(json);
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
}
}
/**
* 从JSON字符串创建Status列表
*
* @param jsonString
* JSON字符串
* @return Status对象列表
* @throws LibException
*/
public static List<Status> createStatusList(String jsonString) throws LibException {
try {
if ("[]".equals(jsonString) || "{}".equals(jsonString)) {
return new ArrayList<Status>(0);
}
JSONArray jsonList = new JSONArray(jsonString);
int size = jsonList.length();
List<Status> statusList = new ArrayList<Status>(size);
for (int i = 0; i < size; i++) {
statusList.add(createStatus(jsonList.getJSONObject(i)));
}
return statusList;
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
}
}
public static List<Status> createSearchResultList(String jsonString) throws LibException {
try {
if ("[]".equals(jsonString) || "{}".equals(jsonString)) {
return new ArrayList<Status>(0);
}
JSONObject resultJson = new JSONObject(jsonString);
JSONArray jsonArray = resultJson.getJSONArray("results");
int size = jsonArray.length();
List<Status> statusList = new ArrayList<Status>(size);
User user = null;
Status status = null;
JSONObject json = null;
for (int i = 0; i < size; i++) {
json = jsonArray.getJSONObject(i);
user = new User();
user.setUserId(getRawString("from_user_id_str", json));
user.setScreenName(getRawString("from_user", json));
user.setName(user.getScreenName());
user.setProfileImageUrl(getRawString("profile_image_url", json));
status = new Status();
status.setStatusId(getRawString("id_str", json));
status.setText(getRawString("text", json));
status.setCreatedAt(getDate("created_at", json, "EEE, d MMM yyyy HH:mm:ss Z"));
status.setSource(ParseUtil.getUnescapedString("source", json));
//status.setInReplyToUserId(getRawString("to_user_id_str", json));
status.setRetweetCount(0);
status.setCommentCount(0);
status.setUser(user);
status.setServiceProvider(ServiceProvider.Twitter);
if (json.has("entities")) {
JSONObject entiiesJson = json.getJSONObject("entities");
if (entiiesJson.has("media")) {
JSONArray mediaArray = entiiesJson.getJSONArray("media");
String imageUrl = getRawString("media_url_https", mediaArray.getJSONObject(0));
status.setMiddlePictureUrl(imageUrl);
status.setThumbnailPictureUrl(imageUrl + ":thumb");
status.setOriginalPictureUrl(imageUrl + ":large");
}
}
statusList.add(status);
}
return statusList;
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
} catch (ParseException e) {
throw new LibException(LibResultCode.DATE_PARSE_ERROR, e);
}
}
/**
* 从JSON对象创建Status对象,包级别访问控制
*
* @param json
* JSON对象
* @return Status对象
* @throws LibException
*/
static Status createStatus(JSONObject json) throws LibException {
try {
Status status = new Status();
status.setStatusId(getRawString("id", json));
status.setText(escapeAngleBrackets(getRawString("text", json)));
status.setSource(getRawString("source", json));
status.setCreatedAt(getDate("created_at", json));
status.setTruncated(getBoolean("truncated", json));
status.setInReplyToStatusId(getRawString("in_reply_to_status_id", json));
//status.setInReplyToUserId(getRawString("in_reply_to_user_id", json));
status.setFavorited(getBoolean("favorited", json));
//status.setInReplyToScreenName(getRawString("in_reply_to_screen_name", json));
status.setRetweetCount(getInt("retweet_count", json));
status.setCommentCount(0);
if (json.has("user")) {
status.setUser(TwitterUserAdaptor.createUser(json.getJSONObject("user")));
}
if (json.has("retweeted_status")) {
status.setRetweetedStatus(createStatus(json.getJSONObject("retweeted_status")));
//官方RT形成的Status,转发后的微博文本变成 (RT 原作者ScreenName: 原微博内容),
//这里为了在列表显示时和国内几大微博统一处理,将转发后形成的新微博Text修改为RT
status.setText("RT");
}
if (json.has("entities")) {
JSONObject entiiesJson = json.getJSONObject("entities");
if (entiiesJson.has("media")) {
JSONArray mediaArray = entiiesJson.getJSONArray("media");
String imageUrl = ParseUtil.getRawString("media_url_https", mediaArray.getJSONObject(0));
/**
* We support different sizes: thumb, small, medium and large.
* The media_url defaults to medium but you can retrieve the media in different sizes
* by appending a colon + the size key
* (for example: http://p.twimg.com/ARACoSZs_QA8BDB.jpg:thumb)
*/
status.setMiddlePictureUrl(imageUrl);
status.setThumbnailPictureUrl(imageUrl + ":thumb");
status.setOriginalPictureUrl(imageUrl + ":large");
}
}
status.setServiceProvider(ServiceProvider.Twitter);
return status;
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
} catch (ParseException e) {
throw new LibException(LibResultCode.DATE_PARSE_ERROR, e);
}
}
}