/*
* Adito
*
* Copyright (C) 2003-2006 3SP LTD. All Rights Reserved
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package com.adito.rss;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.adito.boot.Util;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;
/**
* Thread that wraps a {@link com.sun.syndication.io.SyndFeedInput} as is
* responsible for downloading and maintaining the current status of the feed.
* <p>
* The feed may be in one of 4 states :-
* <ul>
* <li>Loading. The feed is currently being downloaded from the source site.</li>
* <li>Loaded. The feed has successfuly been downloaded from the source site.</li>
* <li>Empty. The feed has successfuly been downloaded but was empty.</li>
* <li>Failed To Load. The feed failed to load.</li>
* </ul>
*/
public class Feed {
final static Log log = LogFactory.getLog(Feed.class);
/**
* Feed connect timeout
*/
public static final int CONNECT_TIMEOUT = 5000;
/**
* Feed read timeout
*/
public static final int READ_TIMEOUT = 5000;
/**
* Loading. The feed is currently being downloaded from the source site.
*/
public final static int STATUS_LOADING = 0;
/**
* Loaded. The feed has successfuly been downloaded from the source site.
*/
public final static int STATUS_LOADED = 1;
/**
* Empty. The feed has successfuly been downloaded but was empty.
*/
public final static int STATUS_EMPTY = 2;
/**
* Failed To Load. The feed failed to load.
*/
public final static int STATUS_FAILED_TO_LOAD = 3;
// Private instance variables
private String feedName;
private SyndFeed feed;
private int status;
private SyndFeedInput input;
private URL url;
/**
* Constructor.
*
* @param feedName feed name
* @param input feed input
* @param url location
* @throws IOException on error loading feed
* @throws FeedException
*/
public Feed(String feedName, SyndFeedInput input, URL url) throws IOException, FeedException {
super();
this.url = url;
this.feedName = feedName;
this.input = input;
this.status = STATUS_LOADING;
}
/**
* Get the feed name.
*
* @return feed
*/
public String getFeedName() {
return feedName;
}
/**
* Get the feed object. This will only be available once the feed has
* successfuly been downloaded otherwise <code>null</code> will be returned.
*
* @return feed
*/
public SyndFeed getFeed() {
return feed;
}
/**
* Get the feed status. See class documentation for details.
*
* @return status
*/
public int getStatus() {
return status;
}
void load() throws IOException, FeedException {
if (log.isInfoEnabled()) {
log.info("Retrieving RSS feeds from " + url);
}
URLConnection conx = url.openConnection();
conx.setConnectTimeout(Feed.CONNECT_TIMEOUT);
conx.setReadTimeout(Feed.READ_TIMEOUT);
InputStream inputStream = null;
try {
inputStream = conx.getInputStream();
status = STATUS_LOADING;
feed = input.build(new XmlReader(inputStream));
if (log.isInfoEnabled())
log.info("Retrieved feed " + url);
status = STATUS_LOADED;
} catch (IOException e) {
status = STATUS_FAILED_TO_LOAD;
throw e;
} catch (FeedException e) {
status = STATUS_FAILED_TO_LOAD;
throw e;
} finally {
Util.closeStream(inputStream);
}
}
}