package ecologylab.serialization.library.rss; import java.io.File; import java.util.ArrayList; import ecologylab.net.ParsedURL; import ecologylab.serialization.ElementState; import ecologylab.serialization.SIMPLTranslationException; import ecologylab.serialization.SimplTypesScope; import ecologylab.serialization.annotations.simpl_collection; import ecologylab.serialization.annotations.simpl_nowrap; import ecologylab.serialization.annotations.simpl_tag; import ecologylab.serialization.formatenums.Format; import ecologylab.serialization.formatenums.StringFormat; /** * Alternative root element {@link ecologylab.serialization.ElementState ElementState} declarations * for RSS parser: that nasty RSS versions: .90 and 1.0. * <p/> * This is a bit of a hack, in that it makes no attempt to handle general RDF, or to support * namespace definitions with great depth. * <p/> * Those things can be done with this framework. One of these days, an application will drive * someone to develop such extensions. * * @author andruid */ // @xml_inherit @simpl_tag("rdf:RDF") public class RDFState extends ElementState // ArrayListState<Item> { @simpl_nowrap @simpl_collection("item") ArrayList<Item> items; public RDFState() { super(); } public int size() { return (items == null) ? 0 : items.size(); } /** * Get Item elements associated with a feed. * * @param i * Index of the item in this collection. * @return The ith Item object directly collected in this, or null if there are no Items. */ public Item get(int i) { return items == null ? null : items.get(i); } // protected Collection getCollection(Class thatClass) // { // return Item.class.equals(thatClass) ? // super.getCollection(thatClass) : null; // } static final String DELICIOUS_EXAMPLE = "<rdf:RDF\r\n" + " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\r\n" + " xmlns=\"http://purl.org/rss/1.0/\"\r\n" + " xmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\r\n" + " xmlns:taxo=\"http://purl.org/rss/1.0/modules/taxonomy/\"\r\n" + " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\r\n" + " xmlns:syn=\"http://purl.org/rss/1.0/modules/syndication/\"\r\n" + " xmlns:admin=\"http://webns.net/mvcb/\"\r\n" + ">\r\n" + "<description></description>\r\n" + "<items>\r\n" + " <rdf:Seq>\r\n" + " <rdf:li rdf:resource=\"http://mashable.com/2007/11/18/10-template-generators/\" />\r\n" + " <rdf:li rdf:resource=\"http://digital-photography-school.com/blog/how-to-shoot-in-direct-sunlight/\" />\r\n" + " <rdf:li rdf:resource=\"http://linuxgames07.blogspot.com/2007/11/top-ubuntu-linux-games.html\" />\r\n" + " <rdf:li rdf:resource=\"http://www.post-gazette.com/pg/07322/834852-298.stm\" />\r\n" + " <rdf:li rdf:resource=\"http://blogs.photopreneur.com/how-to-keep-your-job-and-be-a-part-time-photographer\" />\r\n" + " <rdf:li rdf:resource=\"http://www.linkinn.com/_Unique_Photography_Amzing_HDR_Collection-martin2106\" />\r\n" + " <rdf:li rdf:resource=\"http://www.debuntu.org/how-to-find-files-on-your-computer-with-find\" />\r\n" + " <rdf:li rdf:resource=\"http://blogoscoped.com/archive/2007-11-19-n27.html\" />\r\n" + " <rdf:li rdf:resource=\"http://www.themorningnews.org/archives/galleries/the_laptop_club/\" />\r\n" + " <rdf:li rdf:resource=\"http://ecoble.com/2007/11/18/250000-bottles-amazing-recycled-mexican-island-paradise/\" />\r\n" + " <rdf:li rdf:resource=\"http://www.shredderchess.com/play-chess-online.html\" />\r\n" + " <rdf:li rdf:resource=\"http://www.posterwhore.com/\" />\r\n" + " <rdf:li rdf:resource=\"http://voshy.com/videos/view.php?id=t6pnxn4k\" />\r\n" + " <rdf:li rdf:resource=\"http://bukowski.net/vault/display_man.php?show=poem1984-07-19-this_is_free_take_it_and_feel_better.jpg&inbook=&inmag=The%20Wormwood%20Review%20Vol.%2026%20No.%202%20Issue%20102&onpage=78\" />\r\n" + " <rdf:li rdf:resource=\"http://www.pinktentacle.com/2007/11/top-60-japanese-buzzwords-of-2007/\" />\r\n" + " <rdf:li rdf:resource=\"http://beta.seatquest.com/\" />\r\n" + " <rdf:li rdf:resource=\"http://www.sobercircle.com/index.asp?node=resources&section=articles&fileid=8\" />\r\n" + " <rdf:li rdf:resource=\"http://del.icio.us/B_RL_STAR\" />\r\n" + " <rdf:li rdf:resource=\"http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx\" />\r\n" + " <rdf:li rdf:resource=\"http://www.wikihow.com/Make-a-Christmas-Tree-Pop-up-Card\" />\r\n" + " <rdf:li rdf:resource=\"http://www.grokdotcom.com/2007/11/13/copywriting-101-part-2/\" />\r\n" + " <rdf:li rdf:resource=\"http://www.zappatic.net/safarimicroformats/\" />\r\n" + " </rdf:Seq>\r\n" + "\r\n" + "</items>\r\n" + "\r\n" + "<item rdf:about=\"http://209.85.165.104/search?q=cache:hQMa26l1za0J:www.ftponline.com/javapro/2003_06/online/namespace_kjones_06_23_03/+namespace+declaration+java+xml&hl=en&ct=clnk&cd=4&gl=us&client=firefox-a\">\r\n" + "<title>Java Pro Online - Output Namespace-Aware XML Documents</title>\r\n" + "<link>http://209.85.165.104/search?q=cache:hQMa26l1za0J:www.ftponline.com/javapro/2003_06/online/namespace_kjones_06_23_03/+namespace+declaration+java+xml&hl=en&ct=clnk&cd=4&gl=us&client=firefox-a</link>\r\n" + "\r\n" + "<description>.createElementNS</description>\r\n" + "<dc:creator>andruid</dc:creator>\r\n" + "<dc:date>2007-11-19T05:56:11Z</dc:date>\r\n" + "<dc:subject>ecologylab java namespace xml</dc:subject>\r\n" + "<taxo:topics>\r\n" + " <rdf:Bag>\r\n" + " <rdf:li resource=\"http://del.icio.us/tag/ecologylab\" />\r\n" + " <rdf:li resource=\"http://del.icio.us/tag/xml\" />\r\n" + " <rdf:li resource=\"http://del.icio.us/tag/java\" />\r\n" + " <rdf:li resource=\"http://del.icio.us/tag/namespace\" />\r\n" + " </rdf:Bag>\r\n" + "</taxo:topics>\r\n" + "</item>\r\n" + "\r\n" + "</rdf:RDF>"; static final ParsedURL DELICIOUS_POPULAR = ParsedURL .getAbsolute("http://del.icio.us/rss/popular/"); public static final ParsedURL DELICIOUS_FEED = ParsedURL .getAbsolute("http://del.icio.us/rss/andruid/"); public static final File outputFile = new File("/temp/rss.xml"); public static void main(String[] args) { // ElementState.setUseDOMForTranslateTo(true); try { // ParsedURL feedPURL = CNN_TOP_FEED; ParsedURL feedPURL = DELICIOUS_FEED; // DELICIOUS_POPULAR; println("Translating RSS feed: " + feedPURL + "\n"); RDFState rdfState = (RDFState) RssTranslations.get().deserialize(feedPURL, Format.XML); // RDFState rdfState = (RDFState) ElementState.translateFromXMLCharSequence(DELICIOUS_EXAMPLE, // RssTranslations.get()); ArrayList<Item> items = rdfState.items; // rssState.getChannel().getItems(); println("items: " + rdfState.size()); if (items != null) { for (Item item : items) { println("description:\t" + item.description); // FIXME! -- how do we make sure the prefix gets propagated through this call into F2XOs?! // Dc dc = (Dc) item.getNestedNameSpace("dc"); // if (dc != null) // { // dc.serialize(System.err); // System.err.println('\n'); // } } } println("\n"); SimplTypesScope.serialize(rdfState, System.err, StringFormat.XML); println("\n"); SimplTypesScope.serialize(rdfState, System.err, StringFormat.XML); // 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(); } } }