Search in sources :

Example 1 with FeedFetcherCache

use of com.sun.syndication.fetcher.impl.FeedFetcherCache in project Openfire by igniterealtime.

the class HttpClientWithTimeoutFeedFetcher method retrieveFeed.

/**
	 * @see com.sun.syndication.fetcher.FeedFetcher#retrieveFeed(java.net.URL)
	 */
@Override
public SyndFeed retrieveFeed(URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException {
    if (feedUrl == null) {
        throw new IllegalArgumentException("null is not a valid URL");
    }
    // TODO Fix this
    //System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
    HttpClient client = new HttpClient();
    HttpConnectionManager conManager = client.getHttpConnectionManager();
    conManager.getParams().setParameter("http.connection.timeout", 3000);
    conManager.getParams().setParameter("http.socket.timeout", 3000);
    if (getCredentialSupplier() != null) {
        client.getState().setAuthenticationPreemptive(true);
        // TODO what should realm be here?
        Credentials credentials = getCredentialSupplier().getCredentials(null, feedUrl.getHost());
        if (credentials != null) {
            client.getState().setCredentials(null, feedUrl.getHost(), credentials);
        }
    }
    System.setProperty("httpclient.useragent", "Openfire Admin Console: v" + XMPPServer.getInstance().getServerInfo().getVersion().getVersionString());
    String urlStr = feedUrl.toString();
    FeedFetcherCache cache = getFeedInfoCache();
    if (cache != null) {
        // retrieve feed
        HttpMethod method = new GetMethod(urlStr);
        method.addRequestHeader("Accept-Encoding", "gzip");
        try {
            if (isUsingDeltaEncoding()) {
                method.setRequestHeader("A-IM", "feed");
            }
            // get the feed info from the cache
            // Note that syndFeedInfo will be null if it is not in the cache
            SyndFeedInfo syndFeedInfo = cache.getFeedInfo(feedUrl);
            if (syndFeedInfo != null) {
                method.setRequestHeader("If-None-Match", syndFeedInfo.getETag());
                if (syndFeedInfo.getLastModified() instanceof String) {
                    method.setRequestHeader("If-Modified-Since", (String) syndFeedInfo.getLastModified());
                }
            }
            method.setFollowRedirects(true);
            int statusCode = client.executeMethod(method);
            fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, urlStr);
            handleErrorCodes(statusCode);
            SyndFeed feed = getFeed(syndFeedInfo, urlStr, method, statusCode);
            syndFeedInfo = buildSyndFeedInfo(feedUrl, urlStr, method, feed, statusCode);
            cache.setFeedInfo(new URL(urlStr), syndFeedInfo);
            // the feed may have been modified to pick up cached values
            // (eg - for delta encoding)
            feed = syndFeedInfo.getSyndFeed();
            return feed;
        } finally {
            method.releaseConnection();
        }
    } else {
        // cache is not in use
        HttpMethod method = new GetMethod(urlStr);
        try {
            method.setFollowRedirects(true);
            int statusCode = client.executeMethod(method);
            fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, urlStr);
            handleErrorCodes(statusCode);
            return getFeed(null, urlStr, method, statusCode);
        } finally {
            method.releaseConnection();
        }
    }
}
Also used : SyndFeed(com.sun.syndication.feed.synd.SyndFeed) GetMethod(org.apache.commons.httpclient.methods.GetMethod) SyndFeedInfo(com.sun.syndication.fetcher.impl.SyndFeedInfo) FeedFetcherCache(com.sun.syndication.fetcher.impl.FeedFetcherCache) URL(java.net.URL)

Example 2 with FeedFetcherCache

use of com.sun.syndication.fetcher.impl.FeedFetcherCache in project Openfire by igniterealtime.

the class HttpClientWithTimeoutFeedFetcher method buildSyndFeedInfo.

/**
     * @param feedUrl
     * @param urlStr
     * @param method
     * @param feed
     * @return SyndFeedInfo
     * @throws MalformedURLException
     */
private SyndFeedInfo buildSyndFeedInfo(URL feedUrl, String urlStr, HttpMethod method, SyndFeed feed, int statusCode) throws MalformedURLException {
    SyndFeedInfo syndFeedInfo;
    syndFeedInfo = new SyndFeedInfo();
    // this may be different to feedURL because of 3XX redirects
    syndFeedInfo.setUrl(new URL(urlStr));
    syndFeedInfo.setId(feedUrl.toString());
    Header imHeader = method.getResponseHeader("IM");
    if (imHeader != null && imHeader.getValue().indexOf("feed") >= 0 && isUsingDeltaEncoding()) {
        FeedFetcherCache cache = getFeedInfoCache();
        if (cache != null && statusCode == 226) {
            // client is setup to use http delta encoding and the server supports it and has returned a delta encoded response
            // This response only includes new items
            SyndFeedInfo cachedInfo = cache.getFeedInfo(feedUrl);
            if (cachedInfo != null) {
                SyndFeed cachedFeed = cachedInfo.getSyndFeed();
                // set the new feed to be the orginal feed plus the new items
                feed = combineFeeds(cachedFeed, feed);
            }
        }
    }
    Header lastModifiedHeader = method.getResponseHeader("Last-Modified");
    if (lastModifiedHeader != null) {
        syndFeedInfo.setLastModified(lastModifiedHeader.getValue());
    }
    Header eTagHeader = method.getResponseHeader("ETag");
    if (eTagHeader != null) {
        syndFeedInfo.setETag(eTagHeader.getValue());
    }
    syndFeedInfo.setSyndFeed(feed);
    return syndFeedInfo;
}
Also used : SyndFeed(com.sun.syndication.feed.synd.SyndFeed) SyndFeedInfo(com.sun.syndication.fetcher.impl.SyndFeedInfo) FeedFetcherCache(com.sun.syndication.fetcher.impl.FeedFetcherCache) URL(java.net.URL)

Aggregations

SyndFeed (com.sun.syndication.feed.synd.SyndFeed)2 FeedFetcherCache (com.sun.syndication.fetcher.impl.FeedFetcherCache)2 SyndFeedInfo (com.sun.syndication.fetcher.impl.SyndFeedInfo)2 URL (java.net.URL)2 GetMethod (org.apache.commons.httpclient.methods.GetMethod)1