/*******************************************************************************
* Copyright 2011, 2012, 2013 fanfou.com, Xiaoke, Zhang
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package com.fanfou.app.opensource.api;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.content.ContentValues;
import android.database.Cursor;
import android.text.Html;
import android.util.Log;
import com.fanfou.app.opensource.AppContext;
import com.fanfou.app.opensource.api.bean.Search;
import com.fanfou.app.opensource.api.bean.Storable;
import com.fanfou.app.opensource.http.ResponseCode;
import com.fanfou.app.opensource.http.SimpleResponse;
import com.fanfou.app.opensource.util.DateTimeHelper;
/**
* @author mcxiaoke
* @version 1.0 2011.05.04
* @version 1.1 2011.05.15
* @version 1.2 2011.05.17
* @version 1.3 2011.10.19
* @version 1.4 2011.11.11
* @version 1.5 2011.11.15
* @version 1.6 2011.11.23
* @version 1.7 2011.12.01
* @version 1.8 2011.12.16
*
*/
public final class ApiParser implements ResponseCode {
public static final String TAG = "Parser";
public static final String ID = "id";
public static final String NAME = "name";
public static final String SCREEN_NAME = "screen_name";
public static final String LOCATION = "location";
public static final String GENDER = "gender";
public static final String BIRTHDAY = "birthday";
public static final String DESCRIPTION = "description";
public static final String PROFILE_IMAGE_URL = "profile_image_url";
public static final String URL = "url";
public static final String PROTECTED = "protected";
public static final String FOLLOWERS_COUNT = "followers_count";
public static final String FRIENDS_COUNT = "friends_count";
public static final String FAVORITES_COUNT = "favourites_count";
public static final String STATUSES_COUNT = "statuses_count";
public static final String FOLLOWING = "following";
public static final String NOTIFICATIONS = "notifications";
public static final String CREATED_AT = "created_at";
public static final String UTC_OFFSET = "utc_offset";
public static final String TEXT = "text";
public static final String SOURCE = "source";
public static final String TRUNCATED = "truncated";
public static final String IN_REPLY_TO_LASTMSG_ID = "in_reply_to_lastmsg_id";
public static final String IN_REPLY_TO_USER_ID = "in_reply_to_user_id";
public static final String IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id";
public static final String FAVORITED = "favorited";
public static final String IN_REPLY_TO_SCREEN_NAME = "in_reply_to_screen_name";
public static final String SENDER_ID = "sender_id";
public static final String RECIPIENT_ID = "recipient_id";
public static final String SENDER_SCREEN_NAME = "sender_screen_name";
public static final String RECIPIENT_SCREEN_NAME = "recipient_screen_name";
public static final String SENDER = "sender";
public static final String RECIPIENT = "recipient";
public static final String USER = "user";
public static final String STATUS = "status";
public static final String PHOTO = "photo";
public static final String PHOTO_IMAGEURL = "imageurl";
public static final String PHOTO_THUMBURL = "thumburl";
public static final String PHOTO_LARGEURL = "largeurl";
public static final String QUERY = "query";
public static final String TRENDS = "trends";
public static final String TREND = "trend";
public static final String AS_OF = "as_of";
public static final String REQUEST = "request";
public static final String ERROR = "error";
static final Pattern PATTERN_SOURCE = Pattern
.compile("<a href.+blank\">(.+)</a>");
/**
* @param s
* 代表饭否日期和时间的字符串
* @return 字符串解析为对应的Date对象
*/
public static Date date(final String s) {
return DateTimeHelper.fanfouStringToDate(s);
}
public static long decodeMessageRealId(final String id) {
return 0;
}
public static long decodeStatusRealId(final String id) {
return 0;
}
public static long decodeUserRealId(final String id) {
return 0;
}
public static String error(final HttpResponse response) throws ApiException {
try {
final String content = EntityUtils.toString(response.getEntity());
if (AppContext.DEBUG) {
Log.v("Parser", "error() content=" + content);
}
if (content == null) {
return null;
}
return ApiParser.error(content);
} catch (final IOException e) {
if (AppContext.DEBUG) {
e.printStackTrace();
}
return null;
}
}
public static String error(final String error) {
if (AppContext.DEBUG) {
Log.v(ApiParser.TAG, "Parser.error() error=" + error);
}
String result = error;
try {
final JSONObject o = new JSONObject(error);
if (o.has("error")) {
result = o.getString("error");
}
} catch (final JSONException e) {
if (AppContext.DEBUG) {
e.printStackTrace();
}
result = ApiParser.parseXMLError(error);
}
return result;
}
/**
* 将Date对象解析为饭否格式的字符串
*
* @param date
* Date对象
* @return 饭否格式日期字符串
*/
public static String formatDate(final Date date) {
return DateTimeHelper.formatDate(date);
}
public static void handleJSONException(final JSONException e)
throws ApiException {
if (AppContext.DEBUG) {
Log.e(ApiParser.TAG, e.getMessage());
}
throw new ApiException(ResponseCode.ERROR_JSON_EXCEPTION,
e.getMessage(), e.getCause());
}
public static ArrayList<String> ids(final JSONArray a) throws IOException {
final ArrayList<String> ids = new ArrayList<String>();
if (a == null) {
return ids;
}
try {
for (int i = 0; i < a.length(); i++) {
ids.add(a.getString(i));
}
return ids;
} catch (final JSONException e) {
if (AppContext.DEBUG) {
e.printStackTrace();
}
}
return ids;
}
public static ArrayList<String> ids(final SimpleResponse r)
throws IOException {
return ApiParser.ids(r.getJSONArray());
}
public static ArrayList<String> ids(final String content)
throws IOException {
try {
final JSONArray a = new JSONArray(content);
return ApiParser.ids(a);
} catch (final JSONException e) {
if (AppContext.DEBUG) {
e.printStackTrace();
}
}
return new ArrayList<String>();
}
public static boolean parseBoolean(final Cursor c, final String columnName) {
return c.getInt(c.getColumnIndex(columnName)) == 1;
}
public static Date parseDate(final Cursor c, final String columnName) {
return new Date(c.getLong(c.getColumnIndex(columnName)));
}
public static int parseInt(final Cursor c, final String columnName) {
return c.getInt(c.getColumnIndex(columnName));
}
public static long parseLong(final Cursor c, final String columnName) {
return c.getLong(c.getColumnIndex(columnName));
}
public static String parseSource(final String input) {
String source = input;
final Matcher m = ApiParser.PATTERN_SOURCE.matcher(input);
if (m.find()) {
source = m.group(1);
}
// Log.e("SourceParse", "source="+source);
return source;
}
public static String parseString(final Cursor c, final String columnName) {
try {
return c.getString(c.getColumnIndexOrThrow(columnName));
} catch (final IllegalArgumentException e) {
if (AppContext.DEBUG) {
e.printStackTrace();
}
}
return null;
}
public static String parseXMLError(final String error) {
String result = error;
XmlPullParser pull;
String tag = null;
try {
pull = XmlPullParserFactory.newInstance().newPullParser();
pull.setInput(new StringReader(error));
boolean found = false;
while (!found) {
final int eventType = pull.getEventType();
switch (eventType) {
case XmlPullParser.START_TAG:
tag = pull.getName();
if (tag.equalsIgnoreCase("error")) {
result = pull.nextText();
}
break;
case XmlPullParser.END_TAG:
if (tag.equalsIgnoreCase("error")) {
found = true;
}
break;
default:
break;
}
pull.next();
}
} catch (final XmlPullParserException e) {
if (AppContext.DEBUG) {
e.printStackTrace();
}
} catch (final IOException e) {
if (AppContext.DEBUG) {
e.printStackTrace();
}
}
return result;
}
public static Search savedSearch(final JSONObject o) throws IOException {
try {
final Search s = new Search();
s.name = o.getString(ApiParser.NAME);
s.query = o.getString(ApiParser.QUERY);
return s;
} catch (final JSONException e) {
if (AppContext.DEBUG) {
Log.e(ApiParser.TAG, e.getMessage());
}
}
return null;
}
public static Search savedSearch(final SimpleResponse r) throws IOException {
return ApiParser.savedSearch(r.getJSONObject());
}
public static Search savedSearch(final String content) throws IOException {
try {
final JSONObject o = new JSONObject(content);
return ApiParser.savedSearch(o);
} catch (final JSONException e) {
if (AppContext.DEBUG) {
Log.e(ApiParser.TAG, e.getMessage());
}
}
return null;
}
public static ArrayList<Search> savedSearches(final JSONArray a)
throws IOException {
try {
final ArrayList<Search> ss = new ArrayList<Search>();
for (int i = 0; i < a.length(); i++) {
final JSONObject o = a.getJSONObject(i);
final Search s = ApiParser.savedSearch(o);
ss.add(s);
}
return ss;
} catch (final JSONException e) {
if (AppContext.DEBUG) {
Log.e(ApiParser.TAG, e.getMessage());
}
}
return new ArrayList<Search>();
}
public static ArrayList<Search> savedSearches(final SimpleResponse r)
throws IOException {
return ApiParser.savedSearches(r.getJSONArray());
}
public static List<Search> savedSearches(final String content)
throws IOException {
try {
final JSONArray a = new JSONArray(content);
return ApiParser.savedSearches(a);
} catch (final JSONException e) {
if (AppContext.DEBUG) {
Log.e(ApiParser.TAG, e.getMessage());
}
}
return new ArrayList<Search>();
}
/**
* 批量生成ContentValues Array
*
* @param <T>
* @param t
* @return
*/
public static <T> ContentValues[] toContentValuesArray(
final List<? extends Storable<T>> t) {
if ((t == null) || (t.size() == 0)) {
return null;
}
final ContentValues[] values = new ContentValues[t.size()];
for (int i = 0; i < t.size(); i++) {
values[i] = t.get(i).toContentValues();
}
return values;
}
public static <T> ContentValues[] toContentValuesArray(
final Set<? extends Storable<T>> t) {
if ((t == null) || (t.size() == 0)) {
return null;
}
final ArrayList<Storable<T>> s = new ArrayList<Storable<T>>();
s.addAll(t);
return ApiParser.toContentValuesArray(s);
// ArrayList<ContentValues> values=new ArrayList<ContentValues>();
// Iterator<? extends Storable<T>> i=t.iterator();
// while (i.hasNext()) {
// Storable<T> st=i.next();
// values.add(st.toContentValues());
// }
// return (ContentValues[]) values.toArray(new
// ContentValues[values.size()]);
}
/**
* 批量生成ContentValues List
*
* @param <T>
* @param t
* @return
*/
public static <T> List<ContentValues> toContentValuesList(
final List<? extends Storable<T>> t) {
if ((t == null) || (t.size() == 0)) {
return null;
}
final List<ContentValues> values = new ArrayList<ContentValues>();
for (final Storable<?> s : t) {
values.add(s.toContentValues());
}
return values;
}
public static Search trend(final JSONObject o) throws IOException {
try {
final Search t = new Search();
t.name = Html.fromHtml(o.getString(ApiParser.NAME)).toString();
t.query = Html.fromHtml(o.getString(ApiParser.QUERY)).toString();
return t;
} catch (final JSONException e) {
if (AppContext.DEBUG) {
e.printStackTrace();
}
}
return null;
}
public static Search trend(final SimpleResponse r) throws IOException {
return ApiParser.trend(r.getJSONObject());
}
public static Search trend(final String content) throws IOException {
try {
final JSONObject o = new JSONObject(content);
return ApiParser.trend(o);
} catch (final JSONException e) {
if (AppContext.DEBUG) {
e.printStackTrace();
}
}
return null;
}
public static ArrayList<Search> trends(final JSONObject o)
throws IOException {
final ArrayList<Search> ts = new ArrayList<Search>();
try {
final JSONArray a = o.getJSONArray(ApiParser.TRENDS);
for (int i = 0; i < a.length(); i++) {
final Search t = ApiParser.trend(a.getJSONObject(i));
ts.add(t);
}
} catch (final JSONException e) {
if (AppContext.DEBUG) {
Log.e(ApiParser.TAG, e.getMessage());
}
}
return ts;
}
public static ArrayList<Search> trends(final SimpleResponse r)
throws IOException {
return ApiParser.trends(r.getJSONObject());
}
public static ArrayList<Search> trends(final String content)
throws IOException {
try {
final JSONObject o = new JSONObject(content);
return ApiParser.trends(o);
} catch (final JSONException e) {
if (AppContext.DEBUG) {
Log.e(ApiParser.TAG, e.getMessage());
}
}
return new ArrayList<Search>();
}
}