package ecologylab.serialization.library.rss;
import java.io.File;
import java.util.ArrayList;
import ecologylab.net.ParsedURL;
import ecologylab.serialization.ClassDescriptor;
import ecologylab.serialization.ElementState;
import ecologylab.serialization.FieldDescriptor;
import ecologylab.serialization.SIMPLTranslationException;
import ecologylab.serialization.SimplTypesScope;
import ecologylab.serialization.annotations.simpl_composite;
import ecologylab.serialization.annotations.simpl_scalar;
import ecologylab.serialization.formatenums.Format;
import ecologylab.serialization.formatenums.StringFormat;
/**
* {@link ecologylab.serialization.ElementState ElementState} for the root element of the RSS
* parser. In particular, this supports RSS versions such as .91, .92, .93, .94, and 2.0.
*
* @author andruid
*/
public class RssState extends ElementState
{
@simpl_scalar
float version;
@simpl_composite
Channel channel;
/**
* @return Returns the channel.
*/
public Channel getChannel()
{
return channel;
}
/**
* @param channel
* The channel to set.
*/
public void setChannel(Channel channel)
{
this.channel = channel;
}
/**
* @return Returns the version.
*/
public float getVersion()
{
return version;
}
/**
* @param version
* The version to set.
*/
public void setVersion(float version)
{
this.version = version;
}
public static final ParsedURL NYT_TECH_FEED = ParsedURL
.getAbsolute("http://www.nytimes.com/services/xml/rss/nyt/Technology.xml");
public static final ParsedURL CNN_TOP_FEED = ParsedURL
.getAbsolute("http://rss.cnn.com/rss/cnn_topstories.rss");
public static final ParsedURL BBC_FRONT_FEED = ParsedURL
.getAbsolute("http://news.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml");
public static final ParsedURL ABC_SPORTS_FEED = ParsedURL
.getAbsolute("http://my.abcnews.go.com/rsspublic/sports_rss20.xml");
public static final ParsedURL FLICKR_FEED = ParsedURL
.getAbsolute("http://www.flickr.com/services/feeds/photos_public.gne?format=rss_200&tags=sunset");
public static final ParsedURL DELICIOUS_FEED = ParsedURL
.getAbsolute("http://del.icio.us/rss/andruid/");
public static final String ABC_EXAMPLE = "<rss xmlns:media=\"http://search.yahoo.com/mrss/\" xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\" version=\"2.0\">\r\n"
+ "<channel> \r\n"
+ "\r\n"
+ "<item>\r\n"
+ " \r\n"
+ " <media:group>\r\n"
+ " <media:thumbnail url=\"http://a.abcnews.com/images/Sports/nm_patriots_071119_mn.jpg\" width=\"320\" height=\"240\" /> <media:thumbnail url=\"http://a.abcnews.com/images/Sports/nm_patriots_071119_mc.jpg\" width=\"100\" height=\"75\" /> <media:thumbnail url=\"http://a.abcnews.com/images/Sports/nm_patriots_071119_mv.jpg\" width=\"264\" height=\"198\" /> \r\n"
+ " </media:group>\r\n"
+ "\r\n"
+ " <title>Pats Steamroll Bills, Move to 10-0</title>\r\n"
+ " <link>http://feeds.feedburner.com/~r/AbcNews_Sports/~3/186994604/wireStory</link>\r\n"
+ " <guid isPermaLink=\"false\"><![CDATA[http://abcnews.go.com/Sports/wireStory?id=3884508]]></guid>\r\n"
+ " <description>Lead by Tom Brady and Randy Moss, Pats scored TDs on their first 7 possessions.<img src=\"http://feeds.feedburner.com/~r/AbcNews_Sports/~4/186994604\" height=\"1\" width=\"1\"/></description> \r\n"
+ "</item>"
+ "\r\n"
+ "</channel>\r\n"
+ "</rss>\r\n";
public static final String NS_EXAMPLE = "<rss xmlns:media=\"http://search.yahoo.com/mrss/\" version=\"2.0\">\r\n"
+ " <channel> \r\n"
+ " <item> \r\n"
+ " <media:thumbnail width=\"66\" height=\"49\" url=\"http://newsimg.bbc.co.uk/media/images/44240000/jpg/_44240298_mush66.jpg\"/> \r\n"
+ " <title>Musharraf \'will quit army soon\'</title> \r\n"
+ " <description>Pakistan\'s attorney general says he expects President Musharraf to resign as army head before 1 December.</description> \r\n"
+ " <link>http://news.bbc.co.uk/go/rss/-/2/hi/south_asia/7096381.stm</link> \r\n"
+ " <guid isPermaLink=\"false\">http://news.bbc.co.uk/2/hi/south_asia/7096381.stm</guid> \r\n"
+ " <pubDate>Thu, 15 Nov 2007 13:58:24 GMT</pubDate> \r\n"
+ " <category>South Asia</category> \r\n"
+ " </item> \r\n"
+ " <item> \r\n"
+ " <title>Canadian stun gun death on video</title> \r\n"
+ " <description>A video is released of a Polish immigrant\'s death after he was stun gunned by police at Vancouver airport.</description> \r\n"
+ " <link>http://news.bbc.co.uk/go/rss/-/2/hi/americas/7095875.stm</link> \r\n"
+ " <guid isPermaLink=\"false\">http://news.bbc.co.uk/2/hi/americas/7095875.stm</guid> \r\n"
+ " <pubDate>Thu, 15 Nov 2007 11:18:54 GMT</pubDate> \r\n"
+ " <category>Americas</category> \r\n"
+ " <media:thumbnail width=\"66\" height=\"49\" url=\"http://newsimg.bbc.co.uk/media/images/44240000/jpg/_44240669_taserpolice66.jpg\"/> \r\n"
+ " </item> \r\n"
+ " </channel>\r\n"
+ "</rss>";
public static final String FEEDBURNER_EXAMPlE = "<rss xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\" version=\"2.0\">\r\n"
+ "<channel>\r\n"
+ "<title>CNN.com</title>\r\n"
+ "\r\n"
+ "<item>\r\n"
+ "<feedburner:origLink>http://www.cnn.com/2007/POLITICS/11/16/congress.crandallmine/index.html</feedburner:origLink>\r\n"
+ "<title>Utah mine owner faces Senate panel subpoena</title>\r\n"
+ "\r\n"
+ "<guid isPermaLink=\"false\">http://www.cnn.com/2007/POLITICS/11/16/congress.crandallmine/index.html</guid>\r\n"
+ "<link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/186060716/index.html</link>\r\n"
+ "<description>A Senate subcommittee probing this summer\'s deadly Utah mine disaster has subpoenaed the mine\'s co-owner, ranking member Sen. Arlen Specter said Friday.</description>\r\n"
+ "<pubDate>Fri, 16 Nov 2007 19:53:04 EST</pubDate>\r\n"
+ "</item>\r\n"
+ "\r\n"
+ "</channel>\r\n"
+ "</rss>\r\n";
public static final String FLICKR_EXAMPLE = "<rss version=\"2.0\"\r\n"
+ " xmlns:media=\"http://search.yahoo.com/mrss/\"\r\n"
+ " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\r\n"
+ " >\r\n"
+ " <channel>\r\n"
+ " <title>Photos from everyone tagged water</title>\r\n"
+ " <link>http://www.flickr.com/photos/tags/water/</link>\r\n"
+ " <item>\r\n"
+ " <media:title>Fire-Worksing</media:title>\r\n"
+ " <title>Fire-Works</title>\r\n"
+ " <link>http://www.flickr.com/photos/meemz/2161548299/</link>\r\n"
+ " <media:title>Fire-Works</media:title>\r\n"
+ "\r\n" + " </item>\r\n"
+ "</channel>\r\n" + "</rss>\r\n";
public static final String ITEM_EXAMPLE = " <channel>\r\n"
+ " <foo>Fire-Works</foo>\r\n"
+ " <item>\r\n"
+ " <title>Fire-Works</title>\r\n"
+ " <link>http://www.flickr.com/photos/meemz/2161548299/</link>\r\n"
+
// " <media:title>Fire-Works</media:title>\r\n"
// +
"\r\n"
+ " </item>\r\n"
+ " <title>Photos from everyone tagged water</title>\r\n"
+ " <link>http://www.flickr.com/photos/tags/water/</link>\r\n"
+ "</channel>\r\n";
public static final String NABEEL_TEST = "<rss version=\"1\">"
+ "<channel>"
+ " <title>title.Nabeel</title>"
+ " <description>description.Student</description>"
+ " <link>http://www.google.com/ig</link>"
+ " <items>"
+ " <item>"
+ " <title>Item.title.Nabeel</title>"
+ " <description>Item.description.Nabeel</description>"
+ " <link>http://www.google.com/ig</link>"
+ " <guid>http://www.google.com/ig</guid>"
+ " <author>Item.author.Nabeel</author>"
+ " <category>newCat 0</category>"
+ " <category>newCat 1</category>"
+ " </item>"
+ " <item>"
+ " <title>Item.title.Nabeel</title>"
+ " <description>Item.description.Nabeel</description>"
+ " <link>http://www.google.com/ig</link>"
+ " <guid>http://www.google.com/ig</guid>"
+ " <author>Item.author.Nabeel</author>"
+ " <category>newCat 0</category>"
+ " <category>newCat 1</category>"
+ " </item>" + " </items>" + "</channel>"
+ "</rss>";
public static final File outputFile = new File("/temp/rss.xml");
public static void main(String[] args)
{
ElementState rss;
try
{
// rss = translateFromXMLCharSequence(FLICKR_EXAMPLE, RssTranslations.get());
// rss = translateFromXMLCharSequence(NABEEL_TEST, RssTranslations.get());
rss = (ElementState) RssTranslations.get().deserialize(CNN_TOP_FEED, Format.XML);
System.out.println("");
SimplTypesScope.serialize(rss, System.out, StringFormat.XML);
System.out.println("");
// RssTranslations.get().translateToXML(System.out);
}
catch (SIMPLTranslationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void mostMinimalTranlateToTest()
{
ClassDescriptor fdClassDescriptor = ClassDescriptor.getClassDescriptor(FieldDescriptor.class);
RssState rss = new RssState();
Channel channel = new Channel();
rss.channel = channel;
try
{
SimplTypesScope.serialize(rss, System.out, StringFormat.XML);
}
catch (SIMPLTranslationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void doMain()
{
try
{
// ParsedURL feedPURL = ABC_SPORTS_FEED; // CNN_TOP_FEED;
ParsedURL feedPURL = DELICIOUS_FEED; // FLICKR_FEED;
println("Translating RSS feed: " + feedPURL + "\n");
RssState rssState = (RssState) RssTranslations.get().deserialize(feedPURL, Format.XML);
// RssState rssState = (RssState) ElementState.translateFromXMLCharSequence(FLICKR_EXAMPLE,
// RssTranslations.get());
ArrayList<Item> items = rssState.getChannel().items; // rssState.getChannel().getItems();
println("items: " + items.size());
for (Item item : items)
{
println("description:\t" + item.description);
// FIXME! -- how do we make sure the prefix gets propagated through this call into F2XOs?!
// Media media = (Media) item.getNestedNameSpace("media");
// if (media != null)
// {
// Thumbnail thumbnail = media.getThumbnail();
// if (thumbnail != null)
// thumbnail.serialize(System.err);
// // media.translateToXML(System.err);
// System.err.println('\n');
// }
// Feedburner feedburner = (Feedburner) item.getNestedNameSpace("feedburner");
// if (feedburner != null)
// {
// ClassDescriptor.serialize(feedburner, System.err, StringFormat.XML);
// feedburner.serialize(System.err);
// System.err.println('\n');
// }
}
SimplTypesScope.serialize(rssState, System.err, StringFormat.XML);
println("\n");
SimplTypesScope.serialize(rssState, System.err, StringFormat.XML);
println("\n");
// RssState rssState2 = (RssState) ElementState.translateFromXMLCharSequence(retranslated,
// RssTranslations.get());
// rssState2.translateToXML(System.out);
// rssState.translateToXML(outputFile);
println("\n");
}
catch (SIMPLTranslationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}