/*
* Copyright (C) 2009 The Android Open Source Project
*
* 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.sugree.util;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.util.Log;
import java.util.List;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import com.sugree.util.entity.Message;
import org.xmlpull.v1.XmlPullParserException;
import com.sugree.util.parser.RssPullParser;
/**
* Helper methods to simplify talking with and parsing responses from a
* lightweight Wiktionary API. Before making any requests, you should call
* {@link #prepareUserAgent(Context)} to generate a User-Agent string based on
* your application package name and version.
*/
public class FeedHelper {
private static final String TAG = "FeedHelper";
private static final int HTTP_STATUS_OK = 200;
private byte[] sBuffer = new byte[25600];
private String sUserAgent = null;
private String sEncoding = null;
public class ApiException extends Exception {
public ApiException(String detailMessage, Throwable throwable) {
super(detailMessage, throwable);
}
public ApiException(String detailMessage) {
super(detailMessage);
}
}
public class ParseException extends Exception {
public ParseException(String detailMessage, Throwable throwable) {
super(detailMessage, throwable);
}
}
public FeedHelper(Context context, int uaTemplate) {
try {
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
sUserAgent = String.format(context.getString(uaTemplate),
info.packageName, info.versionName);
} catch(NameNotFoundException e) {
Log.e(TAG, "Couldn't find package information in PackageManager", e);
}
}
public FeedHelper(Context context, int uaTemplate, String encoding) {
sEncoding = encoding;
try {
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
sUserAgent = String.format(context.getString(uaTemplate),
info.packageName, info.versionName);
} catch(NameNotFoundException e) {
Log.e(TAG, "Couldn't find package information in PackageManager", e);
}
}
public List<Message> getRSSContent(String url) throws ApiException, IOException, ParseException {
InputStream is = getUrlContent(url);
return getRSSContent(is);
}
public List<Message> getRSSContent(InputStream is) throws ParseException {
try {
//return new SaxFeedParser(is).parse();
return new RssPullParser(is, sEncoding).parse();
} catch (Exception e) {
throw new ParseException("Invalid RSS "+e.toString(), e);
}
}
protected synchronized InputStream getUrlContent(String url) throws ApiException {
if (sUserAgent == null) {
throw new ApiException("User-Agent string must be prepared");
}
// Create client and set our specific user-agent string
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
request.setHeader("User-Agent", sUserAgent);
try {
HttpResponse response = client.execute(request);
// Check if server response is valid
StatusLine status = response.getStatusLine();
if (status.getStatusCode() != HTTP_STATUS_OK) {
throw new ApiException("Invalid response from server: " +
status.toString());
}
// Pull content stream from response
HttpEntity entity = response.getEntity();
return entity.getContent();
} catch (IOException e) {
throw new ApiException("Problem communicating with API", e);
}
}
}
|