Search in sources :

Example 1 with SimpleStringExtractorHandler

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();
    }
}
Also used : HttpRequestBase(org.apache.http.client.methods.HttpRequestBase) SimpleStringExtractorHandler(com.newsrob.util.SimpleStringExtractorHandler) ArrayList(java.util.ArrayList) HttpResponse(org.apache.http.HttpResponse) DefaultHandler(org.xml.sax.helpers.DefaultHandler) NewsRobHttpClient(com.newsrob.download.NewsRobHttpClient) SAXParser(javax.xml.parsers.SAXParser) Timing(com.newsrob.util.Timing) SAXParserFactory(javax.xml.parsers.SAXParserFactory)

Example 2 with SimpleStringExtractorHandler

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();
    }
}
Also used : HttpRequestBase(org.apache.http.client.methods.HttpRequestBase) SimpleStringExtractorHandler(com.newsrob.util.SimpleStringExtractorHandler) InputStream(java.io.InputStream) ArrayList(java.util.ArrayList) Attributes(org.xml.sax.Attributes) HttpResponse(org.apache.http.HttpResponse) DefaultHandler(org.xml.sax.helpers.DefaultHandler) SAXParser(javax.xml.parsers.SAXParser) Timing(com.newsrob.util.Timing) SAXParserFactory(javax.xml.parsers.SAXParserFactory)

Example 3 with SimpleStringExtractorHandler

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());
}
Also used : HttpRequestBase(org.apache.http.client.methods.HttpRequestBase) HashMap(java.util.HashMap) SimpleStringExtractorHandler(com.newsrob.util.SimpleStringExtractorHandler) Attributes(org.xml.sax.Attributes) HttpResponse(org.apache.http.HttpResponse) IOException(java.io.IOException) DefaultHandler(org.xml.sax.helpers.DefaultHandler) NewsRobHttpClient(com.newsrob.download.NewsRobHttpClient) SAXParser(javax.xml.parsers.SAXParser) Timing(com.newsrob.util.Timing) SAXParserFactory(javax.xml.parsers.SAXParserFactory)

Example 4 with SimpleStringExtractorHandler

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;
}
Also used : SimpleStringExtractorHandler(com.newsrob.util.SimpleStringExtractorHandler) Attributes(org.xml.sax.Attributes) IOException(java.io.IOException) SdCardStorageAdapter(com.newsrob.storage.SdCardStorageAdapter) DefaultHandler(org.xml.sax.helpers.DefaultHandler) SAXException(org.xml.sax.SAXException) SAXParser(javax.xml.parsers.SAXParser) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) File(java.io.File) SAXParserFactory(javax.xml.parsers.SAXParserFactory)

Example 5 with SimpleStringExtractorHandler

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();
    }
}
Also used : HttpRequestBase(org.apache.http.client.methods.HttpRequestBase) SimpleStringExtractorHandler(com.newsrob.util.SimpleStringExtractorHandler) ArrayList(java.util.ArrayList) Attributes(org.xml.sax.Attributes) HttpResponse(org.apache.http.HttpResponse) DefaultHandler(org.xml.sax.helpers.DefaultHandler) NewsRobHttpClient(com.newsrob.download.NewsRobHttpClient) SAXParser(javax.xml.parsers.SAXParser) Timing(com.newsrob.util.Timing) SAXParserFactory(javax.xml.parsers.SAXParserFactory)

Aggregations

SimpleStringExtractorHandler (com.newsrob.util.SimpleStringExtractorHandler)5 SAXParser (javax.xml.parsers.SAXParser)5 SAXParserFactory (javax.xml.parsers.SAXParserFactory)5 DefaultHandler (org.xml.sax.helpers.DefaultHandler)5 Timing (com.newsrob.util.Timing)4 HttpResponse (org.apache.http.HttpResponse)4 HttpRequestBase (org.apache.http.client.methods.HttpRequestBase)4 Attributes (org.xml.sax.Attributes)4 NewsRobHttpClient (com.newsrob.download.NewsRobHttpClient)3 ArrayList (java.util.ArrayList)3 IOException (java.io.IOException)2 SdCardStorageAdapter (com.newsrob.storage.SdCardStorageAdapter)1 File (java.io.File)1 InputStream (java.io.InputStream)1 HashMap (java.util.HashMap)1 ParserConfigurationException (javax.xml.parsers.ParserConfigurationException)1 SAXException (org.xml.sax.SAXException)1