package org.chartsy.main.welcome.content;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.chartsy.main.managers.ProxyManager;
import org.chartsy.main.utils.NotifyUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
*
* @author viorel.gheba
*/
public class RSSFeedParser {
static final String TITLE = "title";
static final String DESCRIPTION = "description";
static final String CHANNEL = "channel";
static final String LANGUAGE = "language";
static final String LINK = "link";
static final String ITEM = "item";
static final String PUB_DATE = "pubDate";
static final String GUID = "guid";
String url;
String name;
List<FeedListener> listeners = new ArrayList<FeedListener>();
public RSSFeedParser(String feedUrl, String feedName) {
this.name = feedName;
this.url = feedUrl;
}
public void readFeed() {
org.chartsy.chatsy.chat.util.SwingWorker worker
= new org.chartsy.chatsy.chat.util.SwingWorker()
{
@Override public Object construct()
{
Feed feed = null;
try {
InputStream stream = ProxyManager.getDefault().inputStreamGET(url);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(stream);
document.normalizeDocument();
if (document != null) {
Element rss = (Element) document.getElementsByTagName("rss").item(0);
Element channel = (Element) rss.getElementsByTagName(CHANNEL).item(0);
String title = "";
String link = "";
String desc = "";
String lang = "";
NodeList nodeList = channel.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
if (element.getTagName().equals(TITLE)) title = element.getTextContent();
if (element.getTagName().equals(LINK)) link = element.getTextContent();
if (element.getTagName().equals(DESCRIPTION)) desc = element.getTextContent();
if (element.getTagName().equals(LANGUAGE)) lang = element.getTextContent();
if (element.getTagName().equals(ITEM)) break;
}
feed = new Feed(title, link, desc, lang);
feed.setFeedName(name);
nodeList = channel.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Element item = (Element) nodeList.item(i);
if (item.getTagName().equals(ITEM)) {
FeedMessage feedMessage = new FeedMessage();
NodeList itemNodeList = item.getChildNodes();
for (int j = 0; j < itemNodeList.getLength(); j++) {
Element element = (Element) itemNodeList.item(j);
if (element.getTagName().equals(TITLE)) feedMessage.setTitle(element.getTextContent());
if (element.getTagName().equals(GUID)) feedMessage.setGuid(element.getTextContent());
if (element.getTagName().equals(LINK)) feedMessage.setLink(element.getTextContent());
if (element.getTagName().equals(DESCRIPTION)) feedMessage.setDescription(element.getTextContent());
if (element.getTagName().equals(PUB_DATE)) feedMessage.setPubDate(element.getTextContent());
}
feed.getMessages().add(feedMessage);
}
}
}
}
catch (Exception e)
{
NotifyUtil.error("RSS parse error", "Could not parse " + name + " RSS Feed", false);
//Logger.getLogger(getClass().getName()).log(Level.SEVERE, "", e);
}
return feed;
}
@Override public void finished()
{
Feed feed = (Feed) get();
fireFeedFinished(feed);
}
};
worker.start();
}
public void addFeedListener(FeedListener listener)
{
listeners.add(listener);
}
public void removeFeedListener(FeedListener listener)
{
listeners.remove(listener);
}
public void fireFeedFinished(Feed feed)
{
if (feed != null)
for (FeedListener listener : listeners)
listener.fireFeedParsed(new FeedEvent(feed));
}
}