// BlogBridge -- RSS feed reader, manager, and web based service // Copyright (C) 2002-2006 by R. Pito Salas // // 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., 59 Temple Place, // Suite 330, Boston, MA 02111-1307 USA // // Contact: R. Pito Salas // mailto:pitosalas@users.sourceforge.net // More information: about BlogBridge // http://www.blogbridge.com // http://sourceforge.net/projects/blogbridge // // $Id: RDFRSS10Parser.java,v 1.1 2007/10/01 14:13:06 spyromus Exp $ // package com.salas.bb.utils.parser.impl; import com.sun.syndication.feed.WireFeed; import com.sun.syndication.feed.module.Extendable; import com.sun.syndication.feed.rss.Channel; import com.sun.syndication.feed.rss.Item; import com.sun.syndication.io.impl.DateParser; import com.salas.bb.utils.StringUtils; import org.jdom.Document; import org.jdom.Element; import org.jdom.Namespace; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Date; /** * This parser fixes the problem with RDF files that use <rss version="1.0"> header * instead of a valid <rdf:RDF ...>. */ public class RDFRSS10Parser extends com.sun.syndication.io.impl.RSS10Parser { /** * Creates a parser with a special type. */ public RDFRSS10Parser() { super("rdf_rss_1.0"); } /** * Returns <code>TRUE</code> if the broken RDF-RSS feed is detected. * * @param document source document. * * @return <code>TRUE</code> if the broken RDF-RSS feed is detected. */ public boolean isMyType(Document document) { Element root = document.getRootElement(); return "rss".equalsIgnoreCase(root.getName()) && "1.0".equals(root.getAttributeValue("version")) && root.getChild("channel") != null && root.getChild("channel", super.getRSSNamespace()) == null; } @Override protected WireFeed parseChannel(Element rssRoot) { Channel feed = (Channel)super.parseChannel(rssRoot); // Parse the pub date Element channel = rssRoot.getChild("channel", getRSSNamespace()); String pubDate = channel.getChildText("pubDate", getRSSNamespace()); if (StringUtils.isNotEmpty(pubDate)) { Date date = DateParser.parseDate(pubDate); if (date != null) feed.setPubDate(date); } return feed; } /** * Parses an item element of an RSS document looking for item information. * <p/> * It first invokes super.parseItem and then parses and injects the description property if present. * <p/> * * @param rssRoot the root element of the RSS document in case it's needed for context. * @param eItem the item element to parse. * * @return the parsed RSSItem bean. */ @Override protected Item parseItem(Element rssRoot, Element eItem) { Item item = super.parseItem(rssRoot, eItem); // Parse the pub date String pubDate = eItem.getChildText("pubDate", getRSSNamespace()); if (StringUtils.isNotEmpty(pubDate)) { Date date = DateParser.parseDate(pubDate); if (date != null) item.setPubDate(date); } return item; } /** * Returns the RSS namespace. * * @return namespace. */ protected Namespace getRSSNamespace() { // In our case no namespace is defined. return null; } /** * It looks for the 'item' elements under the 'channel' elemment. */ protected List getItems(Element rssRoot) { Element eChannel = rssRoot.getChild("channel", getRSSNamespace()); return (eChannel != null) ? eChannel.getChildren("item", getRSSNamespace()) : Collections.EMPTY_LIST; } /** * Returns the markup that isn't in the RSS spec. * * @param e element. * @param ext extendable. * @param basens namespace. * * @return always returns empty list in this parser. */ protected List extractForeignMarkup(Element e, Extendable ext, Namespace basens) { return new ArrayList(); } }