use of com.newsrob.util.SimpleStringExtractorHandler in project newsrob by marianokamp.
the class GRAnsweredBadRequestException method getStateChangesFromGR.
private Collection<StateChange> getStateChangesFromGR(long lastUpdated) throws IOException, ParserConfigurationException, SAXException, GRTokenExpiredException, GRAnsweredBadRequestException {
Timing t = new Timing("EntriesRetriever.getStateChangesFromGR()", context);
String url = getGoogleHost() + "/reader/api/0/stream/items/ids";
// &s=deleted/user/-/state/com.google/starred";
url += "?s=user/-/state/com.google/starred";
url += "&s=user/-/state/com.google/read";
url += "&s=" + NEWSROB_PINNED_STATE;
// &s=deleted/user/-/state/com.google/read";
url += "&n=10000&ot=" + lastUpdated;
NewsRobHttpClient httpClient = NewsRobHttpClient.newInstance(false, context);
try {
HttpRequestBase req = createGRRequest(httpClient, url);
HttpResponse response = executeGRRequest(httpClient, req, true);
throwExceptionWhenNotStatusOK(response);
final List<StateChange> stateChanges = new ArrayList<StateChange>(25);
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser parser = saxParserFactory.newSAXParser();
DefaultHandler handler = new SimpleStringExtractorHandler() {
private String currentAtomId;
// cache
String googleUserId = null;
@Override
public void receivedString(String localName, String fqn, String s) {
if ("number".equals(localName)) {
long l = Long.parseLong(s);
currentAtomId = TAG_GR_ITEM + U.longToHex(l);
} else if ("string".equals(localName)) {
boolean delete = s.startsWith("delete");
int state = -1;
if (s.endsWith("read"))
state = EntriesRetriever.StateChange.STATE_READ;
else if (s.endsWith("starred"))
state = EntriesRetriever.StateChange.STATE_STARRED;
if (state > -1) {
EntriesRetriever.StateChange sc = new EntriesRetriever.StateChange(currentAtomId, state, delete ? EntriesRetriever.StateChange.OPERATION_REMOVE : EntriesRetriever.StateChange.OPERATION_ADD);
stateChanges.add(sc);
}
}
}
};
parser.parse(NewsRobHttpClient.getUngzippedContent(response.getEntity(), context), handler);
PL.log("Entries Retriever: Number of state changes=" + stateChanges.size(), context);
if (NewsRob.isDebuggingEnabled(context))
PL.log("State Changes: " + stateChanges, context);
return stateChanges;
} finally {
httpClient.close();
t.stop();
}
}
use of com.newsrob.util.SimpleStringExtractorHandler in project newsrob by marianokamp.
the class GRAnsweredBadRequestException method getStreamIDsFromGR.
/**
* @param xt
* can be null
*/
protected long[] getStreamIDsFromGR(NewsRobHttpClient httpClient, final List<String> tags, String xt, int max) throws IOException, SAXException, ParserConfigurationException, GRTokenExpiredException, GRAnsweredBadRequestException {
if (max == 0)
return new long[0];
final String tagsLabel = String.valueOf(tags);
Timing t = new Timing("EntriesRetriever.getStreamIDsFromGR(" + tagsLabel + ") (-" + xt + ")", context);
int currentCapacity = getEntryManager().getArticleCount();
String url = getGoogleHost() + "/reader/api/0/stream/items/ids";
url += "?s=" + tags.remove(0);
for (String tag : tags) url += "&s=" + tag;
if (xt != null)
url += "&xt=" + xt;
url += "&n=" + max;
try {
HttpRequestBase req = createGRRequest(httpClient, url);
HttpResponse response = executeGRRequest(httpClient, req, true);
throwExceptionWhenNotStatusOK(response);
final List<Long> unreadIds = new ArrayList<Long>(currentCapacity * 80 / 100);
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser parser = saxParserFactory.newSAXParser();
DefaultHandler handler = new SimpleStringExtractorHandler() {
String currentName;
boolean validResponse;
@Override
public final void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
super.startElement(uri, localName, name, attributes);
currentName = attributes.getValue("name");
if (!validResponse && "/object".equals(getFullyQualifiedPathName()))
validResponse = true;
}
@Override
public final void receivedString(String localTagName, String fqn, String value) {
if ("number".equals(localTagName) && "id".equals(currentName))
unreadIds.add(Long.parseLong(value));
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
if (!validResponse)
throw new RuntimeException("Google Reader response was invalid. Proxy issue?");
}
};
InputStream is = NewsRobHttpClient.getUngzippedContent(response.getEntity(), context);
parser.parse(is, handler);
if (NewsRob.isDebuggingEnabled(context))
PL.log(TAG + ": GR returned number of articles(" + tagsLabel + ") (-" + xt + ")=" + unreadIds.size(), context);
long[] rv = new long[unreadIds.size()];
int idx = 0;
for (Long unreadId : unreadIds) rv[idx++] = unreadId;
return rv;
} finally {
t.stop();
}
}
use of com.newsrob.util.SimpleStringExtractorHandler in project newsrob by marianokamp.
the class GRAnsweredBadRequestException method updateSubscriptionList.
void updateSubscriptionList(final EntryManager entryManager, final Job job) throws IOException, ParserConfigurationException, SAXException, GRTokenExpiredException {
if (job.isCancelled())
return;
if (entryManager.getLastSyncedSubscriptions() != -1l && System.currentTimeMillis() < entryManager.getLastSyncedSubscriptions() + ONE_DAY_IN_MS) {
PL.log("Not updating subscription list this time.", context);
return;
}
PL.log("Updating subscription list.", context);
Timing t = new Timing("UpdateSubscriptionList", context);
final NewsRobHttpClient httpClient = NewsRobHttpClient.newInstance(false, context);
try {
final String url = getGoogleHost() + "/reader/api/0/subscription/list";
HttpRequestBase req = createGRRequest(httpClient, url);
HttpResponse response;
try {
response = executeGRRequest(httpClient, req, true);
} catch (GRAnsweredBadRequestException e) {
throw new IOException("GR: Bad Request.");
}
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser parser = saxParserFactory.newSAXParser();
final Map<String, String> remoteTitlesAndIds = new HashMap<String, String>(107);
DefaultHandler handler = new SimpleStringExtractorHandler() {
private String currentFeedAtomId;
private String currentString;
@Override
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
if (job.isCancelled())
throw new UpdateSubscriptionsCancelledException();
super.startElement(uri, localName, name, attributes);
String fqn = getFullyQualifiedPathName();
if ("/object/list/object".equals(fqn)) {
currentFeedAtomId = null;
} else if ("/object/list/object/string".equals(fqn)) {
currentString = attributes.getValue("name");
}
}
@Override
public void receivedString(String localName, String fqn, String s) {
if (!"/object/list/object/string".equals(fqn))
return;
if ("id".equals(currentString))
currentFeedAtomId = TAG_GR + s;
else if ("title".equals(currentString)) {
if (currentFeedAtomId != null)
remoteTitlesAndIds.put(currentFeedAtomId, s);
// entryManager.updateFeedName(currentFeedAtomId, s);
}
}
};
parser.parse(NewsRobHttpClient.getUngzippedContent(response.getEntity(), context), handler);
if (NewsRob.isDebuggingEnabled(context))
PL.log("Got subscription list with " + remoteTitlesAndIds.size() + " feeds.", context);
if (job.isCancelled())
return;
entryManager.updateFeedNames(remoteTitlesAndIds);
} finally {
httpClient.close();
t.stop();
}
entryManager.updateLastSyncedSubscriptions(System.currentTimeMillis());
}
use of com.newsrob.util.SimpleStringExtractorHandler in project newsrob by marianokamp.
the class Feed method restoreFeedsIfNeccesary.
public static final boolean restoreFeedsIfNeccesary(Context context) {
// initial startup?
final EntryManager em = EntryManager.getInstance(context);
if (em.getFeedCount() != 0)
return false;
SdCardStorageAdapter storageAdapter = new SdCardStorageAdapter(context.getApplicationContext(), false);
final String fileName = storageAdapter.getAbsolutePathForAsset(FEED_SETTINGS_FILE_NAME);
if (!new File(fileName).exists()) {
Log.w("Feed", "No " + fileName + " existing. Not trying to restore feeds.");
return false;
}
Log.i("Feed", "Trying to restore feeds.");
try {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser parser = saxParserFactory.newSAXParser();
DefaultHandler handler = new SimpleStringExtractorHandler() {
@Override
public final void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
super.startElement(uri, localName, name, attributes);
if (!"feed".equals(localName))
return;
Feed f = new Feed();
f.setAtomId(URLDecoder.decode(attributes.getValue("atomId")));
f.setTitle(URLDecoder.decode(attributes.getValue("title")));
f.setDownloadPref(Integer.parseInt(attributes.getValue("downloadPref")));
f.setDisplayPref(Integer.parseInt(attributes.getValue("displayPref")));
f.setWebScale(Float.parseFloat(attributes.getValue("webScale")));
f.setFeedScale(Float.parseFloat(attributes.getValue("feedScale")));
f.setJavaScriptEnabled(Boolean.parseBoolean(attributes.getValue("javaScriptEnabled")));
try {
f.setFitToWidthEnabled(Boolean.parseBoolean(attributes.getValue("fitToWidthEnabled")));
} catch (RuntimeException rte) {
// skip as it may be missing. Default is true then.
}
f.setNotificationEnabled(Boolean.parseBoolean(attributes.getValue("notificationEnabled")));
f.setAlternateUrl(attributes.getValue("altUrl"));
em.insert(f);
}
@Override
public void receivedString(String localTagName, String fullyQualifiedLocalName, String value) {
}
};
parser.parse(new File(fileName), handler);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Log.i("Feed", "Restored feeds. Now " + em.getFeedCount() + " feeds in database.");
return true;
}
use of com.newsrob.util.SimpleStringExtractorHandler in project newsrob by marianokamp.
the class GRAnsweredBadRequestException method discoverFeeds.
public List<DiscoveredFeed> discoverFeeds(final String query) throws ReaderAPIException, IOException, GRTokenExpiredException, ParserConfigurationException, SAXException, GRAnsweredBadRequestException {
Timing t = new Timing("discoverFeeds()", context);
final List<DiscoveredFeed> results = new ArrayList<DiscoveredFeed>();
if (query == null || query.length() == 0)
return results;
NewsRobHttpClient httpClient = NewsRobHttpClient.newInstance(false, context);
try {
final String queryPath = "/reader/api/0/feed-finder?q=";
HttpRequestBase req = createGRRequest(httpClient, getGoogleHost() + queryPath + query);
HttpResponse response = executeGRRequest(httpClient, req, true);
throwExceptionWhenNotStatusOK(response);
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser parser = saxParserFactory.newSAXParser();
DefaultHandler handler = new SimpleStringExtractorHandler() {
private DiscoveredFeed discoveredFeed;
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
super.endElement(uri, localName, name);
if (discoveredFeed != null && "entry".equals(localName)) {
// System.out.println("Added discovered feed " +
// discoveredFeed);
results.add(discoveredFeed);
discoveredFeed = null;
}
}
@Override
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
super.startElement(uri, localName, name, attributes);
// System.out.println("startElement=" + localName);
if ("entry".equals(localName)) {
discoveredFeed = new DiscoveredFeed();
// System.out.println("Created new Discovered Feed");
return;
}
if ("link".equals(localName)) {
String rel = attributes.getValue("rel");
String href = attributes.getValue("href");
if ("self".equals(rel))
return;
if (discoveredFeed != null) {
if (rel != null) {
if ("alternate".equals(rel))
discoveredFeed.alternateUrl = href;
else if ("http://www.google.com/reader/atom/relation/feed".equals(rel))
discoveredFeed.feedUrl = href;
}
} else {
DiscoveredFeed df = new DiscoveredFeed();
df.title = query;
df.feedUrl = href;
results.add(df);
}
}
// System.out.println("startElement2=" + localName);
}
@Override
public void receivedString(String localName, String fqn, String s) {
if (discoveredFeed == null)
return;
if ("title".equals(localName)) {
discoveredFeed.title = s;
} else if ("content".equals(localName)) {
discoveredFeed.snippet = s;
}
}
};
parser.parse(NewsRobHttpClient.getUngzippedContent(response.getEntity(), context), handler);
return results;
} finally {
httpClient.close();
t.stop();
}
}
Aggregations