org.eclipsetrader.yahoo.internal.news.RSSNewsHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipsetrader.yahoo.internal.news.RSSNewsHandler.java

Source

/*
 * Copyright (c) 2004-2011 Marco Maccaferri and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Marco Maccaferri - initial API and implementation
 */

package org.eclipsetrader.yahoo.internal.news;

import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.httpclient.HttpClient;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipsetrader.yahoo.internal.core.Util;

import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.fetcher.impl.FeedFetcherCache;
import com.sun.syndication.fetcher.impl.HashMapFeedInfoCache;
import com.sun.syndication.fetcher.impl.HttpClientFeedFetcher;

public class RSSNewsHandler implements INewsHandler {

    private FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance();
    private HttpClientFeedFetcher fetcher = new HttpClientFeedFetcher(feedInfoCache);

    public RSSNewsHandler() {
    }

    /* (non-Javadoc)
     * @see org.eclipsetrader.yahoo.internal.news.INewsHandler#parseNewsPages(java.net.URL[], org.eclipse.core.runtime.IProgressMonitor)
     */
    @Override
    public HeadLine[] parseNewsPages(URL[] url, IProgressMonitor monitor) {
        List<HeadLine> list = new ArrayList<HeadLine>();

        HttpClient client = new HttpClient();
        client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);

        for (int i = 0; i < url.length && !monitor.isCanceled(); i++) {
            monitor.subTask(url[i].toString());

            try {
                Util.setupProxy(client, url[i].getHost());

                SyndFeed feed = fetcher.retrieveFeed(url[i], client);
                for (Iterator<?> iter = feed.getEntries().iterator(); iter.hasNext();) {
                    SyndEntry entry = (SyndEntry) iter.next();

                    String link = entry.getLink();
                    if (link.lastIndexOf('*') != -1) {
                        link = link.substring(link.lastIndexOf('*') + 1);
                    }
                    link = URLDecoder.decode(link, "UTF-8");

                    String source = null;

                    String title = entry.getTitle();
                    if (title.startsWith("[$$]")) {
                        title = title.substring(4, title.length());
                    }

                    if (title.endsWith(")")) {
                        int s = title.lastIndexOf('(');
                        if (s != -1) {
                            source = title.substring(s + 1, title.length() - 1);
                            if (source.startsWith("at ")) {
                                source = source.substring(3);
                            }
                            title = title.substring(0, s - 1).trim();
                        }
                    }

                    list.add(new HeadLine(entry.getPublishedDate(), source, title, null, link));
                }
            } catch (IllegalArgumentException e) {
                // Do nothing, could be an invalid URL
            } catch (Exception e) {
                e.printStackTrace();
            }

            monitor.worked(1);
        }

        return list.toArray(new HeadLine[list.size()]);
    }
}