At work, I’ve taken on the work of migrating our RSS feeds currently being produced using JSP to ROME. Since we’ve added a few custom elements to the feeds available in Jive Forums (things like message and thread counts), I’m taking advantage of the feature in ROME that gives you the ability to programtically define namespaces in your RSS 2.0, Atom 0.3 and Atom 1.0 feeds (examples: the iTunes module and the OpenSearch module). Anyway, the code I wrote to add an item to the list of available items in a feed looked something like this:
... entry = new SyndEntryImpl(); entry.setTitle(thread.getSubject()); entry.setLink("http://mysite.com/community/threads.jspa?id=" + thread.getID()); entry.setUpdatedDate(thread.getModificationDate()); entry.setPublishedDate(thread.getCreationDate()); ... JiveForumsModule module = new JiveForumsModuleImpl(); module.setReplyCount(thread.getReplyCount()); Listmodules = new ArrayList (); modules.add(module); entry.setModules(modules); ...
This code works, but if you view the feed, you don’t get a publish date on the item. I dug into the ROME source code a bit and found that the publish date is stored as part of the Dublin Core module, which I came to find out is a ‘special’ module that always exists on a SyndEntryImpl object. Take a look at the implementation of the getModules() method on the SyndEntryImpl class:
public List getModules() { if (_modules==null) { _modules=new ArrayList(); } if (ModuleUtils.getModule(_modules,DCModule.URI)==null) { _modules.add(new DCModuleImpl()); } return _modules; }
See how the method automatically injects a DCModuleImpl into the _modules property if the DCModule doesn’t exist? Long story short, the code I wrote blew away the _modules
property on the SyndEntryImpl instance which contained a single DCModule which itself contained the publishedDate date instance. So by the time the feed was produced, the publish date I set on each SyndEntry was long gone. I should have written my code like this:
JiveForumsModule module = new JiveForumsModuleImpl(); module.setReplyCount(thread.getReplyCount()); entry.getModules().add(module);
Better yet, the ROME team could have done two things:
- Added documentation to the setModules(List modules) method that pointed out that any information in the existing DCModule instance will be lost if the provided list doesn’t contain the existing DCModule instance.
- Added a method to the SyndEntry interface called addModule(Module module).
Open source: I’m lovin it.