<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"><channel><title>Disruptive Library Technology Jester &#187; seam</title> <atom:link href="http://dltj.org/tag/seam/feed/" rel="self" type="application/rss+xml" /><link>http://dltj.org</link> <description>We&#039;re Disrupted, We&#039;re Librarians, and We&#039;re Not Going to Take It Anymore</description> <lastBuildDate>Fri, 18 May 2012 15:43:10 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <cloud domain='dltj.org' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' /> <creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license> <item><title>Disseminators As the Core of an Object Repository</title><link>http://dltj.org/article/disseminator-centric-repository/</link> <comments>http://dltj.org/article/disseminator-centric-repository/#comments</comments> <pubDate>Thu, 26 Apr 2007 13:58:32 +0000</pubDate> <dc:creator>Peter Murray</dc:creator> <category><![CDATA[DRC]]></category> <category><![CDATA[Fedora]]></category> <category><![CDATA[asset actions]]></category> <category><![CDATA[digital libraries]]></category> <category><![CDATA[java]]></category> <category><![CDATA[restlet]]></category> <category><![CDATA[seam]]></category><guid isPermaLink="false">http://dltj.org/2007/04/disseminator-centric-repository/</guid> <description><![CDATA[I&#8217;ve been working to get JBoss Seam tied into Fedora, and along the way thought it would be wise to stop and document a core concept of this integration: the centrality of Fedora Disseminators in the the design of the &#8230; <a href="http://dltj.org/article/disseminator-centric-repository/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<abbr class="unapi-id ignore noPrint" title="http://dltj.org/2007/04/disseminator-centric-repository/"></abbr><p>I&#8217;ve been working to get JBoss Seam tied into <a href="http://www.fedora.info/" title="Fedora Digital Object Repository homepage">Fedora</a>, and along the way thought it would be wise to stop and document a core concept of this integration:  the centrality of <a href="http://www.fedora.info/download/2.2/userdocs/digitalobjects/objectModel.html#DISS" title="Overview:The Fedora Digital Object Model">Fedora Disseminators</a> in the the design of the <a href="http://info.drc.ohiolink.edu/" title="Information about the Ohio Digital Resource Commons">Ohio Digital Resource Commons</a>.  Although there is nothing specific to <a href="http://www.jboss.com/products/seam" title="JBoss Seam homepage">JBoss Seam (a Java Enterprise Edition application framework)</a> in these concepts, making an object &#8220;render itself&#8221; does make the Seam-based interface application easier to code and understand.  A disseminator-centric architecture also allows us to put our code investment where it matters the most &mdash; in the repository framework &mdash; and exploit that investment in many places.  So what does it mean to have a disseminator-centric architecture and have objects &#8220;render themselves&#8221;?</p><p><h2>How It Works</h2><br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/sequence.png" title="Sequence Diagram"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/sequence.png" alt="Sequence Diagram " style="float:right;width:50%;margin-left:1.5em;" /></a>This is a sequence diagram showing all of the pieces:</p><ul><li>Browser:  The user&#8217;s browser</li><li>DRCseam:  A JBoss Seam application that generates the user interface and performs much of the business logic.  DRCseam, however, does <strong>not</strong> render the objects or their metadata into browser-consumable artifacts.  Read on!</li><li>Fedora:  A basic Fedora digital object repository.</li><li>Disseminator:  A simple servlet that performs various transformations on object datastreams to render content usable by the browser.</li></ul><p>With these components in play, here is the description of a sequence to render a page showing the metadata for a repository item:</p><ol><li><span style="font-weight:bolder;font-style:italic">request item page</span>: The browser follows a link to an item detail page.</li><li><span style="font-weight:bolder;font-style:italic">API-A ObjectProfile</span>: The interface application asks the repository for the &#8216;Object Profile&#8217; of the item&#8230;</li><li><span style="font-weight:bolder;font-style:italic">return object profile</span>: &#8230;which the repository returns.  The interface application now knows basic details about the object:  that it exists, the creation and updated timestamps, and so forth.</li><li><span style="font-weight:bolder;font-style:italic">API-A DatastreamDissemination for fullDisplay</span>: The interface application needs the object&#8217;s metadata display, so it asks the object to &#8220;render itself&#8221; by making a call to the Fedora repository for the object&#8217;s &#8220;FullDisplay&#8221; disseminator.</li><li><span style="font-weight:bolder;font-style:italic">call getFullDisplay</span>: The Fedora repository in turn calls the object&#8217;s disseminator with the Persistent Identifier (PID) of the object as a parameter.</li><li><span style="font-weight:bolder;font-style:italic">API-A Datastream for metadata</span>: Using the object PID, the disseminator calls back to the Fedora repository for the descriptive metadata datastream (the DC datastream, in this case)&#8230;</li><li><span style="font-weight:bolder;font-style:italic">XML metadata</span>: &#8230;which the Fedora repository returns.</li><li><span style="font-weight:bolder;font-style:italic">transform metadata</span>: The disseminator performs some transformation or derivation on the  descriptive datastream to create an XHTML representation&#8230;</li><li><span style="font-weight:bolder;font-style:italic">XHTML fragment</span>: &#8230;which it returns to the Fedora software&#8230;</li><li><span style="font-weight:bolder;font-style:italic">XHTML fragment</span>: &#8230;which is returned to the interface application&#8230;</li><li><span style="font-weight:bolder;font-style:italic">XHTML page</span>: &#8230;which inserts it at the appropriate place in the XHTML page it has built and returns the XHTML page to the browser.</li></ol><p>Step #4 is where we diverge from previous architectures.  Instead of making the interface application transform the metadata into a human-readable format, the interface application calls the object&#8217;s disseminator to do the job.</p><p><h3>The Heart of It All:  The Disseminator</h3><br />The key to this architecture is <em>asking the object to &#8220;render itself&#8221;</em>.  This puts the task of creating the appropriate representation at the object level.  The object can be an image, a video, a spreadsheet, or a PDF file.  More importantly, the object can be a PDF of a journal article or a PDF of a thesis; in both cases the metadata describing that PDF file will be different (journal/volume/issue in one case and department/degree/advisor in the other).</p><p>Rather than putting special case code in the interface application to render the description of the journal article one way and the thesis another way, that special case code is bound to the object in the form of a &#8220;disseminator&#8221;.  The disseminator methods for the journal article and the thesis share the same name &mdash; <code>getFullDisplay</code> &mdash; but will return entirely different XHTML fragments &mdash; one for a journal article and one for a thesis.  For both objects, though, the interface application will make a call to the object in the Fedora repository asking for the output of each <code>getFullDisplay</code> dissemination.  In the case of a Dublin Core description, the dissemination output could look like this:</p><div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&amp;lt;table class=&quot;drc_dublinCore_table&quot;&amp;gt;
&amp;lt;tr class=&quot;drc_dublinCore_row drc_dublinCore_title&quot;&amp;gt;
&amp;lt;td class=&quot;drc_dublinCore_label drc_dublinCore_title&quot;&amp;gt;Title:&amp;lt;/td&amp;gt;
&amp;lt;td class=&quot;drc_dublinCore_value drc_dublinCore_title&quot;&amp;gt;Jester Example&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr class=&quot;drc_dublinCore_row drc_dublinCore_identifier&quot;&amp;gt;
&amp;lt;td class=&quot;drc_dublinCore_label drc_dublinCore_identifier&quot;&amp;gt;Identifier:&amp;lt;/td&amp;gt;
&amp;lt;td class=&quot;drc_dublinCore_value drc_dublinCore_identifier&quot;&amp;gt;demo:exampleObject&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;</pre></div></div><p>You&#8217;ll note that there is a liberal application of CSS styles on all of the XHTML elements, allowing for the look of the dissemination to be further transformed in the browser via CSS stylesheets.  A <code>getFullDisplay</code> dissemination for a journal article could look like this:</p><div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&amp;lt;table class=&quot;drc_ejc_table&quot;&amp;gt;
&amp;lt;tr class=&quot;drc_ejc_row drc_ejc_title&quot;&amp;gt;
&amp;lt;td class=&quot;drc_ejc_label drc_ejc_title&quot;&amp;gt;Article Title:&amp;lt;/td&amp;gt;
&amp;lt;td class=&quot;drc_ejc_value drc_ejc_title&quot;&amp;gt;Taking Advantage of Fedora Disseminations&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr class=&quot;drc_ejc_row drc_ejc_volume&quot;&amp;gt;
&amp;lt;td class=&quot;drc_ejc_label drc_ejc_volume&quot;&amp;gt;Volume:&amp;lt;/td&amp;gt;
&amp;lt;td class=&quot;drc_ejc_value drc_ejc_volume&quot;&amp;gt;3&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr class=&quot;drc_ejc_row drc_ejc_issue&quot;&amp;gt;
&amp;lt;td class=&quot;drc_ejc_label drc_ejc_issue&quot;&amp;gt;Issue:&amp;lt;/td&amp;gt;
&amp;lt;td class=&quot;drc_ejc_value drc_ejc_issue&quot;&amp;gt;2&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;</pre></div></div><p><h3>Looking at the Pieces</h3><br />There is a demonstration system set up for a short period of time that shows all of the pieces.  First, the disseminator:</p><ul><li><span class="removed_link" title="http://drc-dev.ohiolink.edu:8080/BaseDisseminator/getFullDisplay/demo:exampleObject">http://drc-dev.ohiolink.edu:8080/BaseDisseminator/getFullDisplay/demo:exampleObject</span></li></ul><p>Next, how this disseminator looks as accessed through the Fedora repository:</p><ul><li><span class="removed_link" title="http://drc-dev.ohiolink.edu:8080/fedora/get/demo:exampleObject/demo:bDefExample/getFullDisplay/">http://drc-dev.ohiolink.edu:8080/fedora/get/demo:exampleObject/demo:bDefExample/getFullDisplay/</span></li></ul><p>And finally, how this result looks through the Seam-based interface application.  (A note about this application &mdash; only this URL works at the moment even though there are other links on the page.  This is also the &#8216;trunk&#8217; version of our interface code, so it is likely to change and/or break and/or work better at any time.)</p><ul><li><span class="removed_link" title="http://drc-dev.ohiolink.edu:8080/drc/item.seam?itemId=demo%3AexampleObject">http://drc-dev.ohiolink.edu:8080/drc/item.seam?itemId=demo%3AexampleObject</span></li></ul><p><h2>Fedora Setup</h2><br />In addition to the Seam-based interface application and the disseminator code, there is setup required at the Fedora repository &mdash; specifically, the creation of a Behavior Definition (bDef) that describes the disseminators that the objects share in common and the creation of a Behavior Mechanism (bMech) that describes the implementation of that definition for a particular object type.  Below is a series of screen shots that show the steps to create the bDef and bMech.</p><p><h3>Disseminator Behavior Definition (bDef)</h3><br />Using the Fedora Admin client, under the &#8220;Builders&#8221; menu, select &#8220;Behavior Definition Builder&#8221;.  The first pane, &#8220;General&#8221; parameters, use a specific PID of &#8216;<code>demo:bDefExample</code>&#8216; and put something in for the Behavior Object Name, Behavior Object Description, and one of the Dublin Core Metadata fields.  (It doesn&#8217;t matter what you put in for these values.)<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/bdbgeneral.png" title="Fedora Admin Behavior Definition Builder “General” pane"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/bdbgeneral.png" alt="Fedora Admin Behavior Definition Builder “General” pane" style="width:85%;" /></a></p><p>Under the &#8220;Abstract Methods&#8221; pane, create new definitions for each of the disseminator methods.<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/bdbabstractmethods.png" title="Fedora Admin Behavior Definition Builder “Abstract Methods” pane"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/bdbabstractmethods.png" alt="Fedora Admin Behavior Definition Builder “Abstract Methods” pane" style="width:85%;" /></a></p><p>Under the &#8220;Documentation&#8221; pane, put something in the first entry.  Again, it doesn&#8217;t matter what is put in for these values, but they are required.<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/bdbdocumentation.png" title="Fedora Admin Behavior Definition Builder “Documentation” pane"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/bdbdocumentation.png" alt="Fedora Admin Behavior Definition Builder “Documentation” pane" style="width:85%;" /></a></p><p>Select &#8220;Ingest&#8221; at the bottom of the window, and the <code>demo:bDefExample</code> bDef will be created.  Alternatively, you could import the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/BaseDisseminator/trunk/resources/foxml/demo_bDefExample.xml?rev=774"><code>demo:bDefExample</code> saved in the DRC source code repository</span> (choose &#8220;original format&#8221; at the bottom of that page).</p><p><h3>Disseminator Mechanism Definition (bMech)</h3><br />The bMech is a little more complicated.  Under the &#8220;Builders&#8221; menu, select &#8220;Behavior Mechanism Builder&#8221;.  The first pane, &#8220;General&#8221; parameters, use a specific PID of &#8216;<code>demo:bMechExample</code>&#8216; and put something in for the Behavior Object Name, Behavior Object Description, and one of the Dublin Core Metadata fields.  (It doesn&#8217;t matter what you put in for these values.)  In the &#8220;Behavior Definition Contract&#8221; pick the bDef just created (<code>demo:bDefExample</code>).<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbgeneral.png" title="Fedora Admin Behavior Mechanism Builder “General” pane"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbgeneral.png" alt="Fedora Admin Behavior Mechanism Builder “General” pane" style="width:85%;" /></a></p><p>In the &#8220;Service Profile&#8221; pane, put in values in the &#8220;General&#8221; area (it doesn&#8217;t matter what).  In the Service Binding area, make sure the Message Protocol is <code>HTTP GET</code>, put in <code>text/html, text/xml</code> for Input MIME Types and put in <code>text/html, text/xml, text/plain</code> for Output MIME Types.<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbserviceprofile.png" title="Fedora Admin Behavior Mechanism Builder “Service Profile” pane"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbserviceprofile.png" alt="Fedora Admin Behavior Mechanism Builder “Service Profile” pane" style="width:85%;" /></a></p><p>Under the Service Methods pane, put in <code>http://localhost:8080/BaseDisseminator</code> for the Base URL.  (The disseminator is also loaded in the same servlet as the Fedora repository and the Seam interface application, and it is loaded at the &#8220;/BaseDisseminator&#8221; context path in the servlet.)  Create Service Method Definitions that correspond to the Abstract Methods in the bDef.<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbservicemethods.png" title="Fedora Admin Behavior Mechanism Builder “Service Methods” pane"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbservicemethods.png" alt="Fedora Admin Behavior Mechanism Builder “Service Methods” pane" style="width:85%;" /></a></p><p>Select &#8220;Properties&#8221; for each one of the Service Method Definitions in turn.  &#8220;echo&#8221; is a unique disseminator method that simply echos back the context parameters of the disseminator request.  This is useful for seeing exactly what the Fedora server is going to give to the disseminator.<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbservicemethods-echo.png" title="Fedora Admin Behavior Mechanism Builder “Service Methods” Definitions for “echo” Method"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbservicemethods-echo.png" alt="Fedora Admin Behavior Mechanism Builder “Service Methods” Definitions for “echo” Method" style="width:85%;" /></a></p><p>With the exception of &#8220;echo&#8221; all of the other Service Method Definitions are the same.  The Method Binding consists of the disseminator method followed by a slash and the PID placeholder followed by a question mark and &#8216;dc&#8217; equals the DC placeholder.  Since the Method Binding field has two placeholders, there are two entries in the Method Parameter Definitions area.  The first is for PID &mdash; a &#8220;Default&#8221; parameter that is required and passed by value to the disseminator.  The default value is the special value <code>$PID</code>, which the repository software will replace with the PID of the object as the disseminator is called.  The second is for DC, a &#8220;Datastream&#8221; parameter that is required and passed to the disseminator by URL reference.  The disseminator doesn&#8217;t actually use this reference to a datastream, but it is a requirement that all bMechs pass a datastream of one sort or another to the disseminator.<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbservicemethods-getfulldisplay.png" title="Fedora Admin Behavior Mechanism Builder “Service Methods” Definitions for “getFullDisplay” Method"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbservicemethods-getfulldisplay.png" alt="Fedora Admin Behavior Mechanism Builder “Service Methods” Definitions for “getFullDisplay” Method" style="width:85%;" /></a></p><p>If you have followed all of the steps so far, under the &#8220;Datastream Input&#8221; pane there will be one entry for DC in the table.  The only thing that needs to be done here is adding &#8220;text/xml&#8221; in the MIMEType column.<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbdatastreaminput.png" title="Fedora Admin Behavior Mechanism Builder “Datastream Input” pane"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbdatastreaminput.png" alt="Fedora Admin Behavior Mechanism Builder “Datastream Input” pane" style="width:90%;" /></a></p><p>Under the &#8220;Documentation&#8221; pane, put something in the first entry.  Again, it doesn&#8217;t matter what is put in for these values, but they are required.<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbdocumentation.png" title="Fedora Admin Behavior Mechanism Builder “Documentation” pane"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/bmbdocumentation.png" alt="Fedora Admin Behavior Mechanism Builder “Documentation” pane" style="width:85%;" /></a></p><p>Select &#8220;Ingest&#8221; at the bottom of the window, and the <code>demo:bMechExample</code> bMech will be created.  Alternatively, you could import the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/BaseDisseminator/trunk/resources/foxml/demo_bMechExample.xml?rev=774"><code>demo:bMechExample</code> saved in the DRC source code repository</span> (choose &#8220;original format&#8221; at the bottom of that page).</p><p><h3>Sample Object</h3><br />The last step is to add this disseminator bDef/bMech combination to an object.  Edit any object in the repository and go to the &#8220;Disseminators&#8221; pane.  If there are other disseminators already defined for this object, select &#8220;New&#8221; along the left side.  Put in a label &mdash; any label will do.  Next to &#8220;Behavior defined by&#8230;&#8221; select <code>demo:bDefExample</code>.  Then next to &#8220;Mechanism&#8221; select <code>demo:bMechExample</code>.  The admin client will prompt for a DC binding; select &#8220;Add&#8221; and choose the DC datastream in the pop-up window.<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/objectdisseminatorsdatastream.png" title="Fedora Admin Sample Object’s “Disseminators” pane in progress"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/objectdisseminatorsdatastream.png" alt="Fedora Admin Sample Object’s “Disseminators” pane in progress" style="width:85%;" /></a></p><p>Select &#8220;Save Changes&#8221; at the bottom.  The completed disseminator looks like this:<br /><a href="http://cdn.dltj.org/wp-content/uploads/2007/04/objectdisseminators.png" title="Fedora Admin Sample Object’s “Disseminators” pane completed"><img src="http://cdn.dltj.org/wp-content/uploads/2007/04/objectdisseminators.png" alt="Fedora Admin Sample Object’s “Disseminators” pane completed" style="width:85%;" /></a></p><p>There is <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/BaseDisseminator/trunk/resources/foxml/demo_exampleObject.xml?rev=774">a sample object in the DRC source code repository</span> that has the disseminator already defined.</p><p><h2>Notes</h2><br />Comments about this architecture are certainly welcome.  I&#8217;m sure I&#8217;ll be writing about it more in the future, but here are some thoughts at this point:</p><p><h3>Future Directions</h3><br />In this case, I&#8217;m using an XSLT stylesheet to transform the Dublin Core XML into an XHTML table.  That stylesheet is stored in the BaseDisseminator WAR file.  The stylesheet could just as easily be a datastream of a special &#8220;formatting&#8221; object in the repository.  One of the key distinctions of OhioLINK&#8217;s Fedora implementation is that institutions using the repository will be able to &#8220;brand&#8221; their content in any way they choose.  Having the flexibility of storing metadata transformations just like any other object in the repository would seem to be of great advantage in that scenario.</p><p>On a related front, this style of implementation would be greatly enhanced by the work of the Fedora <a href="http://www.cs.cornell.edu/payette/fedora/designs/cmda/" title="CMDA Proposal">Content Model Dissemination Architecture</a> (CMDA).  Because disseminators must be bound to specific objects rather than classes of objects, management of the variety of bMechs in a scenario such as this will likely become difficult very soon.  I&#8217;m heartened by the fact that the CMDA work is going on and will cut our management complexity dramatically when it becomes available.</p><p><h3>Acknowlegements</h3><br />These concepts are based in part on the work of the Digital Library Federation&#8217;s <a href="https://wiki.dlib.indiana.edu/display/DLFAquifer/Asset+Action+Project" title="Aquifer Digital Collections Asset Actions homepage">Aquifer Asset Actions</a> technical working group and discussions among members of the OAI <a href="http://www.openarchives.org/ore/" title="Open Archives Initiative Protocol - Object Exchange and Reuse homepage">Object Reuse and Exchange</a> technical committee as well as conversations with many Fedora developers and implementors.  Thanks, everyone.</p><p>[Update 20070426T1147 : Fixed the sample object URL.  Thanks, Jodi.]<p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/BaseDisseminator/trunk/resources/foxml/demo_exampleObject.xml?rev=774 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/BaseDisseminator/trunk/resources/foxml/demo_bMechExample.xml?rev=774 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/BaseDisseminator/trunk/resources/foxml/demo_bDefExample.xml?rev=774 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu:8080/drc/item.seam?itemId=demo%3AexampleObject on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu:8080/fedora/get/demo:exampleObject/demo:bDefExample/getFullDisplay/ on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu:8080/BaseDisseminator/getFullDisplay/demo:exampleObject on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;">The text was modified to update a link from http://rama.grainger.uiuc.edu/assetActions/ to https://wiki.dlib.indiana.edu/display/DLFAquifer/Asset+Action+Project on January 19th, 2011.</p>]]></content:encoded> <wfw:commentRss>http://dltj.org/article/disseminator-centric-repository/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Open Repositories Presentation:  Building an IR Interface Using EJB3 and JBoss Seam</title><link>http://dltj.org/article/or2007-presentation/</link> <comments>http://dltj.org/article/or2007-presentation/#comments</comments> <pubDate>Wed, 24 Jan 2007 04:12:58 +0000</pubDate> <dc:creator>Peter Murray</dc:creator> <category><![CDATA[Fedora]]></category> <category><![CDATA[Meeting]]></category> <category><![CDATA[Raw Technology]]></category> <category><![CDATA[ejb3]]></category> <category><![CDATA[icor2007]]></category> <category><![CDATA[seam]]></category><guid isPermaLink="false">http://dltj.org/2007/01/or2007-presentation/</guid> <description><![CDATA[Below is the outline of the Ohio DRC presentation from today&#8217;s FEDORA session at Open Repositories conference. Comments welcome!Executive Overview of the Ohio Digital Resource CommonsFacets of the Digital Resource Commons VisionDRC Vision (Multi-Institutional)DRC Vision (Cross-Institutional)DRC Vision (Access Control)DRC Vision &#8230; <a href="http://dltj.org/article/or2007-presentation/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<abbr class="unapi-id ignore noPrint" title="http://dltj.org/2007/01/or2007-presentation/"></abbr><p>Below is the outline of the Ohio DRC presentation from today&#8217;s FEDORA session at <a href="http://openrepositories.org/" title="Open Repositories 2007">Open Repositories</a> conference.  Comments welcome!</p><ul><li>Executive Overview of the Ohio Digital Resource Commons<ul><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide3" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">Facets of the Digital Resource Commons Vision</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide4" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">DRC Vision (Multi-Institutional)</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide5" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">DRC Vision (Cross-Institutional)</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide6" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">DRC Vision (Access Control)</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide7" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">DRC Vision (Multi-Media)</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide8" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">The DRC Vision of a Unified Content Repository</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide9" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">Virtual Content Repositories</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide10" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">DRC In Practice</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide11" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">Advantages to the Institution</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide12" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">Summary: Executive Overview of the Ohio Digital Resource Commons</a></li></ul></li><li>Underlying Technology<ul><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide14" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">Smart Repository, Thin Presentation Interface</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide15" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">Examples of Generic Methods</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide16" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">Outputs of Generic Methods Driven by content models</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide18" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">Thin Presentation Layer</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide19" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">Other Presentation Layers</a></li></ul></li><li>Project Information<ul><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide21" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">Interested? Interesting URLs&#8230;</a></li><li><a href="http://info.drc.ohiolink.edu/presentations/200701-open-repositories/#slide22" title="Building an Institutional Repository Interface Using EJB3 and JBoss Seam">For followup&#8230;</a></li></ul></li></ul>]]></content:encoded> <wfw:commentRss>http://dltj.org/article/or2007-presentation/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Building an Institutional Repository Interface Using EJB3 and JBoss Seam</title><link>http://dltj.org/article/drc-ir-ejb3-seam/</link> <comments>http://dltj.org/article/drc-ir-ejb3-seam/#comments</comments> <pubDate>Fri, 19 Jan 2007 04:00:49 +0000</pubDate> <dc:creator>Peter Murray</dc:creator> <category><![CDATA[DRC]]></category> <category><![CDATA[Fedora]]></category> <category><![CDATA[Raw Technology]]></category> <category><![CDATA[ejb3]]></category> <category><![CDATA[icor2007]]></category> <category><![CDATA[java]]></category> <category><![CDATA[programming]]></category> <category><![CDATA[seam]]></category><guid isPermaLink="false">http://dltj.org/2007/01/drc-ir-ejb3-seam/</guid> <description><![CDATA[This tour is designed to show the overall architecture of a FEDORA digital object repository application within the JBoss Seam framework while at the same time pointing out individual design decisions and extension points that are specific to the Ohio &#8230; <a href="http://dltj.org/article/drc-ir-ejb3-seam/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<abbr class="unapi-id ignore noPrint" title="http://dltj.org/2007/01/drc-ir-ejb3-seam/"></abbr><p>This tour is designed to show the overall architecture of a <a href="http://www.fedora.info/" title="Fedora">FEDORA digital object repository</a> application within the <a href="http://www.jboss.com/products/seam" title="JBoss.com - JBoss Seam">JBoss Seam framework</a> while at the same time pointing out individual design decisions and extension points that are specific to the <a href="http://drc-dev.ohiolink.edu/" title="Digital Resource Commons - Trac">Ohio Digital Resource Commons application</a>. Geared towards software developers, a familiarity with <a href="http://java.sun.com/products/servlet/" title="Java Servlet Technology">Java Servlet programming</a> is assumed, although not required.  Knowledge of JBoss Seam, <a href="http://www.hibernate.org/" title="hibernate.org - Hibernate">Hibernate</a>/<a href="http://java.sun.com/javaee/overview/faq/persistence.jsp" title="Java Persistence API FAQ">Java Persistence API</a>, <a href="http://jcp.org/en/jsr/detail?id=220" title="The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 220">EJB3</a> and <a href="http://java.sun.com/javaee/" title="Java EE at a Glance">Java EE</a> would be helpful but not required; brief explanations of core concepts of these technologies are included in this tour.</p><p>The tour is based on <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk?rev=709">revision 709 of /drc/trunk</span> and was last updated on 18-Jan-2007.</p><p>This tour will also be incorporated into a <span class="removed_link" title="http://openrepositories.org/program/fedora#session4">presentation at Open Repositories 2007 on Tuesday afternoon</span>.</p><p><h2 id="DirectoryLayout">Directory Layout</h2></p><p>The source directory tree has four major components:  &#8216;lib&#8217;, &#8216;resources&#8217;, &#8216;src&#8217;, and &#8216;view&#8217;.</p><p><strong>lib &#8211; libraries required by the application.</strong> The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/lib?rev=709">lib directory</span> contains all of the JAR libraries required by the application. Its contents is a mix of the Seam-generated skeleton (pretty much everything at the top level of the &#8216;lib&#8217; directory) and JAR libraries that are specific to the DRC application (in subdirectories of &#8216;lib&#8217; named for the library in use).  For instance, the &#8216;commons-codec-1.3&#8242; and the &#8216;hibernate-all&#8217; and the &#8216;jboss-seam&#8217; JAR files were all brought into the project via &#8216;seam-gen&#8217; while &#8216;lib/commons-net-1.4.1/commons-net-1.4.1.jar&#8217; library was added specifically for this project. A convention has been established whereby new libraries added to the project appear as entries in the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/lib/lib.properties?rev=709">lib.properties file</span> which is used by <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/build.xml?rev=709#L65">series of directives in the build.xml file</span> to setup the classpaths <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/build.xml?rev=709#L101">for compiling</span> and <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/build.xml?rev=709#L116">for building the EJB JAR</span>. This is done to make the testing and transition of new libraries into the application more explicit and easily testable. Note that the newly included library directory also includes a copy of any license file associated with that library; this is not only a requirement to use some libraries but is also a good practice to show the lineage of some of the lesser known libraries. (For an example of what is required, see the changes <span class="removed_link" title="http://drc-dev.ohiolink.edu/changeset/699%23file2">to build.xml</span> and <span class="removed_link" title="http://drc-dev.ohiolink.edu/changeset/699%23file3">to lib.properties</span> in order to bring the Apache Commons Net library into the application.)</p><p><strong>resources &#8211; configuration files and miscellaneous stuff.</strong> The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/resources?rev=709">resources directory</span> holds the various configuration files required by the application plus other files used for testing and demonstration.  Much of this was generated by the Seam-generated skeleton as well.  Some key files here are the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/resources/import.sql?rev=709">import.sql file</span> (SQL statements that are used to preload the RDBMS used by Hibernate as the mocked up repository system) and the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/resources/test-datastreams?rev=709">test-datastreams directory</span> which has sample files for each of the media types.</p><p><strong>src &#8211; Java source code.</strong> The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src?rev=709">src directory</span> contains all of the Java source code for the application.  Everything exists in a package called &#8216;edu.ohiolink.drc&#8217; with subpackages for <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/action?rev=709">classes handling actions</span> from the view component of the MVC, <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/entity?rev=709">entity beans</span> (sometimes known as Data Access Objects &#8212; or DAOs &#8212; I think), <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/exceptions?rev=709">exception classes</span> (more on this below), <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/fedora?rev=709">classes for working with FEDORA</span> (not currently used), <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler?rev=709">media type handler classes</span> (more on this below), <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/test?rev=709">unit test classes</span> (not currently used), and <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/utility?rev=709">utility classes</span>.</p><p><strong>view &#8211; XHTML templates, CSS files, and other web interface needs.</strong> The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/view?rev=709">view directory</span> holds all of the files for the &#8220;view&#8221; aspect of the Model-View-Controller paradigm. More information about the view components is below.</p><p><h2 id="EntityClasses">Entity Classes</h2></p><p>The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/entity?rev=709">entity beans package</span> has three primary entity beans defined: <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/entity/Item.java?rev=709">Item.java</span>, <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/entity/Datastream.java?rev=709">Datastream.java</span>, and <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/entity/Description.java?rev=709">Description.java</span>. (The FedoraServer.java entity bean is not used at this time.)  Item.java is the primary bean that represents an object in the repository.  Datastream.java and Description.java are component beans that only exist in the lifecycle of an Item.java bean; Datastream.java holds a representation of a FEDORA object datastream and Description.java holds a representation of a Dublin Core datastream for that object.</p><p>The Datastream and Description objects are annotated with <tt>@Embedded</tt> in the Item.java source; this is Hibernate&#8217;s way of saying that these objects do not stand on their own.  Item.java also has numerous methods marked with a <tt>@javax.persistence.Transient</tt> annotation meaning that this is information not stored in the backing Hibernate database; these methods are for the various content handlers, which will be outlined below.</p><p><h2 id="MockRepository">Mock Repository</h2></p><p>As currently configured, the entity beans pull their information from a static RDBMS using Hibernate rather than from an underlying FEDORA digital object repository. (You&#8217;ll need to go back to <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk?rev=691">revision 691</span> to see how far we got with the FEDORA integration into JBoss Seam before we switched our development focus to the presentation &#8216;view&#8217; aspects of the application.) As <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/resources/drc-ds.xml?rev=709">currently configured</span>, Hibernate uses an embedded Hypersonic SQL database for its datastore.  As part of the application deploy process, the Java EE container will instantiate a Hypersonic database and preload it with the contents of the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/resources/import.sql?rev=709">import.sql file</span>. (The import.sql file contains just three sample records at the moment:  one each for a text file, a PDF file, and a graphic file.)</p><p>All of the data for a repository object is contained in a single table record. Hibernate manages the process for us of reading that record out of the database and creating the three corresponding Java objects:  Item, Datastream and Description. (Hibernate could also handle the process of updating the underlying table record if we were to change a value in one of the Java objects.) The mapping of table column to Java object field is handled by the <tt>@Column(name="xx")</tt> annotations in the entity beans.</p><p>For Datastream, what is stored in the database is not the datastream content itself but rather a filename that points to the location of the datastream file.  The file path in this field can either be absolute (meaning a complete path starting from the root directory of the filesystem) or a relative path.  In the case of the latter, the path is relative to the deployed application&#8217;s WAR directory (something like &#8220;&#8230;/jboss-4.0.5.GA/server/default/deploy/drc.ear/drc.war/&#8221; for instance). Note that the getter/setter methods for the contentLocation are <tt>private</tt> &#8212; the rest of the application does not need to know the location of the datastreams; this will also be true when the DRC application is connected to a FEDORA digital object repository. The method marked <tt>public</tt> instead is getContent, and the implementation of getContent hides the complexity of the fact that the datastream is coming from a disk file rather than a FEDORA repository call. For the three records/repository-objects currently defined in &#8216;import.sql&#8217; there are three corresponding demo datastreams in the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/resources/test-datastreams?rev=709">test-datastreams directory</span>.</p><p>In all likelihood, this representation of the FEDORA repository will be too simple for us to move forward much further. In particular, the current notion of one datastream per repository object is too simplistic. The Datastream embedded object will likely need to be broken out into a separate table and as a corresponding distinct Java applet. (We may reach the same point soon for the Description object as well.)</p><p>By using the Entity Beans as a buffer between the business logic and the view components of the rest of the application, I hope we can minimize/localize the changes required in the future in order to replace the mock repository with a real underlying FEDORA repository.</p><p><h2 id="ViewTemplates">View Templates</h2></p><p>The preferred view technology for JBoss Seam is <a class="ext-link broken_link" href="http://facelets.dev.java.net/" title="301 Moved Permanently" rel="nofollow"><span class="icon">Facelets</span></a>, an implementation of Java Server Faces that does not require the use of Java Server Pages (JSP). Although the &#8216;.xhtml&#8217; pages in the view directory bear a passing resemblance to JSP, behind the scenes they are radically different.  Of note for us is the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/view/layout?rev=709">clean templating system</span> used to generate pages. The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/view/home.xhtml?rev=709">home.xhtml file</span> has a reference to the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/view/layout/template.xhtml?rev=709">template.xhtml file in the &#8216;layout&#8217; directory</span>. If you read through the template.xhtml file, you can see where the Facelets engine will pull in other .xhtml files in addition to the content within the <tt>&lt;ui:define name="body"&gt;</tt> tag of home.xhtml.</p><p><h2 id="ContentHandlers">Content Handlers</h2></p><p>The paradigm of handling different media types within the DRC application is guided in large part by the notion of <a class="ext-link" href="http://dltj.org/2006/05/fedora-disseminators/"><span class="icon">disseminators for FEDORA objects</span></a> and the <a class="ext-link" href="https://wiki.dlib.indiana.edu/display/DLFAquifer/Asset+Action+Project" title="Aquifer Digital Collections"><span class="icon">Digital Library Federation Aquifer Asset Actions experiments</span></a>.  The underlying concept is to push the media-specific content handling into the digital object repository and to have the presentation interface consume those content handlers as it is preparing the end-user presentation.</p><p>For instance, the DRC will need to handle content models for PDFs, images, video, and so forth.  Furthermore, how a video datastream from the Digital Video Collection is offered to the user may be different than how a video datastream from a thesis is offered to the user. Rather than embedding the complexity of making those interface decisions into the front-end DRC application, this model of content handlers pushes that complexity closer to the objects themselves by encoding those behaviors a disseminators of the object.  What the presentation layer gets from the object is a chunk of XHTML that it inserts into the dynamically generated HTML page at the right place.</p><p>There is work beginning on a framework for FEDORA disseminators at <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/BaseDisseminator/trunk?rev=691">/BaseDisseminator/trunk</span> in the source code repository; that work has been put on hold at the moment in favor of focusing on the presentation interface.  In order to prepare for the time when the presentation behaviors are encoded as FEDORA object disseminators, the current presentation layer makes use of Content Handlers for each of the media types.  The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/Handler.java?rev=709">Handler interface</span> defines the methods required by each handler and the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709">TextHandler class</span>, the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/ImageHandler.java?rev=709">ImageHandler class</span>, and the <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/PdfHandler.java?rev=709">PdfHandler class</span> implement the methods for the three media types already defined.</p><p>Of these, <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709">TextHandler class</span> is the most complete, so I&#8217;ll use it as an example.</p><ul><li>The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709#L63">getRawDatastream method</span> takes the datastream and sends it back to the browser with the HTTP headers that cause a File-Save dialog box to open.</li><li>The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709#L92">getFullDisplay method</span> returns a chunk of XHTML that presents the full metadata in a manner that can be included in a full metadata display screen.</li><li>The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709#L132">getRecordDisplay method</span> (currently unwritten) returns a chuck of XHTML used to represent the object in a list of records that resulted from a user&#8217;s search or browse request.</li><li>The <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709#L140">getThumbnail method</span> (currently unwritten) returns a static graphic thumbnail rendition of the datastream (e.g. a cover page, a key video frame, etc.).</li></ul><p>By making these content handlers distinct classes, it is anticipated that the rendering code for each of these methods can be more easily moved to FEDORA object disseminators with minimal impact to the surrounding DRC interface application.</p><p><h2 id="ExceptionHandling">Exception Handling</h2></p><p>The DRC application follows the practice suggested by Barry Ruzek in <a href="http://www.oracle.com/technetwork/articles/entarch/effective-exceptions-092345.html" title="Effective Java Exceptions">Effective Java Exceptions</a> (found via <a href="http://www.theserverside.com/news/thread.tss?thread_id=43820" title="http://www.theserverside.com/news/thread.tss?thread_id=43820">this link on The Server Side</a>).  The article can be summarized as:</p><blockquote><p>One type of exception is a <strong>contingency</strong>, which means that a process was executed that cannot succeed because of a known problem (the example he uses is that of a checking account, where the account has insufficient funds, or a check has a stop payment issued.) These problems should be handled by way of a distinct mechanism, and the code should expect to manage them.</p><p>The other type of exception is a <strong>fault</strong>, such as the IOException. A fault is typically not something that is or should be expected, and therefore handling faults should probably not be part of a normal process.</p><p>With these two classes of exception in mind, it&#8217;s easy to see what should be checked and should be unchecked: the <strong>contingencies should be checked</strong> (and descend from Exception) and the faults should be unchecked (and descend from Error).</p></blockquote><p>All unchecked exceptions generated by the application are subclasses of <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/exceptions/DrcBaseAppException.java?rev=709">DrcBaseAppException</span>. (<tt>DrcBaseApplication</tt> itself is a subclass of <tt>RuntimeException</tt>.)  For an example, see <span class="removed_link" title="http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/exceptions/NoHandlerException.java?rev=709">NoHandlerException</span>.  By setting up all of the applications exceptions to derive from this point, we have one place where logging of troubleshooting information can take place (although this part of the application has not been set up yet). Except when there is good reason to do otherwise, this pattern should be maintained.</p><p>At this point, no checked (or <em>contingency</em>) exceptions specific to the DRC have been defined.  When they are needed, though, they will follow the same basic structure with a base exception derived from <tt>Exception</tt>.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/lib?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/build.xml?rev=709#L65 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/resources?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/changeset/699%23file3 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/changeset/699%23file2 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/build.xml?rev=709#L116 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/build.xml?rev=709#L101 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/lib/lib.properties?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/view/layout?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/resources/drc-ds.xml?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk?rev=691 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/entity/Description.java?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/entity/Datastream.java?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/entity/Item.java?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/view?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/utility?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/test?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/exceptions/DrcBaseAppException.java?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709#L140 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709#L132 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709#L92 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709#L63 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/PdfHandler.java?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/ImageHandler.java?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/TextHandler.java?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/BaseDisseminator/trunk?rev=691 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/exceptions/NoHandlerException.java?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/resources/import.sql?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/resources/import.sql?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/view/layout/template.xhtml?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/fedora?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/exceptions?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/entity?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/action?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/resources/test-datastreams?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/src/edu/ohiolink/drc/handler/Handler.java?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://drc-dev.ohiolink.edu/browser/drc/trunk/view/home.xhtml?rev=709 on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://openrepositories.org/program/fedora#session4 on January 19th, 2011.</p><p style="padding:0;margin:0;font-style:italic;">The text was modified to update a link from http://rama.grainger.uiuc.edu/assetActions/ to https://wiki.dlib.indiana.edu/display/DLFAquifer/Asset+Action+Project on January 19th, 2011.</p><p style="padding:0;margin:0;font-style:italic;">The text was modified to update a link from http://dev2dev.bea.com/pub/a/2006/11/effective-exceptions.html to http://www.oracle.com/technetwork/articles/entarch/effective-exceptions-092345.html on January 20th, 2011.</p>]]></content:encoded> <wfw:commentRss>http://dltj.org/article/drc-ir-ejb3-seam/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Picking a Java Web Application Framework</title><link>http://dltj.org/article/java-framework/</link> <comments>http://dltj.org/article/java-framework/#comments</comments> <pubDate>Wed, 25 Oct 2006 15:16:21 +0000</pubDate> <dc:creator>Peter Murray</dc:creator> <category><![CDATA[DRC]]></category> <category><![CDATA[Raw Technology]]></category> <category><![CDATA[ejb3]]></category> <category><![CDATA[java]]></category> <category><![CDATA[programming]]></category> <category><![CDATA[seam]]></category> <category><![CDATA[spring framework]]></category><guid isPermaLink="false">http://dltj.org/2006/10/java-framework/</guid> <description><![CDATA[We&#8217;re beginning a new phase of our digital library development at OhioLINK and an oversimplification of one of the consequences of this new phase is that we will be developing more software from scratch rather than adapting stuff that we &#8230; <a href="http://dltj.org/article/java-framework/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<abbr class="unapi-id ignore noPrint" title="http://dltj.org/2006/10/java-framework/"></abbr><p>We&#8217;re beginning a new phase of our digital library development at OhioLINK and an oversimplification of one of the consequences of this new phase is that we will be developing more software from scratch rather than adapting stuff that we find out there on the net.  (Another consequence of this new phase is our interest in <a href="http://dltj.org/tag/librarysoa">applying the Service-Oriented Architecture paradigm to library applications</a>.)  In previous phases, we were somewhat at the mercy of whatever development framework was used in the application we were adopting.  As we start this new development where we control more of our own destiny, we wanted to take a step back and look at the available frameworks to support our development efforts.  The options we identified at the start were plain Java servlets, Apache Struts, Spring Framework, and EJB3 with JBoss SEAM.</p><p>Our analysis is admittedly by proxy rather than through direct experience.  If we had more time, we would start our new phase in each one of these (with the associated learning curve for some of them) and pick the one that worked out the best.  We have neither the luxury of time nor of excess developer talent, so we looked at what others were saying, created some sample applications, and discussed our gut reactions to each option.  In the end, we decided to start with EJB3/SEAM.</p><p><h2>Summary of Options</h2></p><p>Over the years, the Java community has developed frameworks to support the creation of applications in the Java programming language.  These frameworks consist of a combination of code libraries, programming rules, and best practices that have evolved based on the research and experience of the developer community.  Just as almost no one designs, codes, debugs, and documents their own low-level file I/O libraries any more, these frameworks provide a level of abstraction over the raw programming language that enables developers to create better code faster.</p><p>Within the web application arena, arguably the earliest successful framework was Apache Struts.  It was one of the first frameworks to promote a <em>Model-View-Controller</em> (MVC) architecture: the <em>Model</em> represents the business or database code, the <em>View</em> represents the page design code, and the <em>Controller</em> represents the navigational code.  By creating these three layers, Struts promoted a practice of design and development away from commingling database code, page design code, and control flow code in the same JavaServer Pages files.  In practice it was found that unless these three concerns are separated, larger applications become difficult to maintain.</p><p>The latest revolution in design architectures is Dependency Injection (DI).  Sometimes also referred to as Inversion of Control (or IoC), it is a programming design pattern and architectural model in which the responsibility for object creation and object linking is removed from the code of the objects themselves.  As the term &#8220;Dependency Injection&#8221; may imply, it is the <em>framework</em> that instantiates the component objects and binds them to each other through the use of setters and/or constructors rather than the components linking themselves together.  In this pattern, the objects themselves become loosely coupled, allowing for a more dynamic and testable integration of the component objects.  The creation and binding of objects is defined in an XML configuration file (Spring Framework) or via Java Annotations (EJB3).</p><p>Two primary frameworks have emerged for the Dependency Injection paradigm:  Spring Framework and EJB3.  The Spring Framework is the grandparent of subsequent IoC efforts (including EJB3).  A <i>de facto</i> standard, it is widely used in the Java programming community with a large number of tools and documentation.  EJB3 is a formal specification adopted by participants in the Java Community Process for standardizing Java-related developments.  Coupled with the JBoss SEAM framework, the EJB3/SEAM combination is roughly on par with raw technical capabilities of the Spring Framework.  SEAM removes some of the complexity of raw EJB3 by providing and preconfiguring popular choices for views (JSF) and models (Hibernate) as well as integrated AJAX-based Remoting and jPBM.  Both promote the same MVC architecture as Struts.</p><p>The distinguishing characteristics are that Spring acts as an open integration tool at the expense of a complicated XML-based configuration process whereas EJB3/SEAM is simpler in its configuration and more restrictive in what other tools can be easily brought into the framework.  In other words, Spring has a wide array of choices for the various framework components and for the most part the developer must manage the integration; EJB3/SEAM lessens the complexity of the framework by limiting the choices available for the various components to only the most popular options.  Note that there is overlap between Spring and EJB3; the Pitchfork project allows for JSR-250 (Common Annotations) dependency injection and EJB 3.0 style interception as an add-on to the Spring framework.  One should also note that a full EJB3 implementation is a kind of superset to SEAM, and if the needs of our applications go beyond that of SEAM it is possible to reduce our dependency on the SEAM framework by beginning to integrate other choices (and managing that integration ourselves).</p><p>OhioLINK staff would have a learning curve associated with both Spring and EJB3/SEAM (and Apache Struts as well, although it has been discounted as an option as a mostly dead-end architecture at this point).  On the question of whether the learning curve is greater than the effort of doing things the &#8220;plain Java&#8221; way, one can point to the large number of developers who have made the leap to these frameworks and are arguably more productive for doing so.  Since we are beginning the development of a new code base, it seems to be the ideal time to start up that learning curve with the creation and deployment of a new service.  The learning curve might be easier for Spring than for EJB3/SEAM due to the wide variety of materials already produced for Spring, although the corporate backers of EJB3/SEAM seem to be filling this gap at a steady pace.  The learning curve for EJB3/SEAM may be shallower, though, because SEAM simplifies the configuration of the framework itself.</p><p>At our development team meeting yesterday, we decided that <strong>OhioLINK will adopt a Dependency Injection (DI) paradigm</strong> over use of Apache Struts and plain Java servlets because of the anticipated large productivity gains after the learning curve.  Of the two DI/IoP frameworks widely available now, we <strong>decided to adopt EJB3 coupled with JBoss SEAM</strong>.  The standards-driven nature of EJB3 reduces the risk of adopting a technology that may not be supported in the medium-term.  It is expected that JBoss SEAM will flatten the learning curve to make EJB3 more readily understood in the short term while providing a migration path to a broader EJB3 implementation (beyond the capabilities of SEAM) if needed in the future.  The Spring Framework, to its credit, also makes it possible to envelop EJB3 objects as part of a Spring-based application, which could smooth the transition to that framework should it become necessary.  We also understand that there is some risk of &#8220;vendor lock-in&#8221; by relying on JBoss SEAM &mdash; in our limited experience, applications seemed to deploy better under JBoss Application Server as opposed to a stock Apache Tomcat 5.5 installation.  On the other hand (if the &#8220;standards&#8221; nature of EJB3 is to be trusted), it should be possible to move our code to other application servers, leaving SEAM behind, with minimal changes.  We may also be able to further flatten the learning curve by buying a support contract with JBoss in the short- to medium-term.</p><p><h2>Details about the Candidates</h2></p><p><h3>Enterprise Java Beans 3 (EJB3)</h3></p><blockquote><p>The EJB 3.0 framework is a standard framework defined by the Java Community Process (JCP) and supported by all major J2EE vendors.  [The architecture of the Spring framework is based upon the Dependency Injection (DI) design pattern.]  Open source and commercial implementations of EJB 3.0 specifications are already available from JBoss and Oracle. EJB 3.0 makes heavy use of Java annotations.</p></blockquote><ul><li>Based on standards work (the Java Community Process)</li><li>&#8220;Configuration by default&#8221; using Java Annotations backed by more complicated XML configuration files, if needed</li><li>A more compact, rigidly-defined framework stack; easier configuration, but fewer choices</li><li>Brand new (recently ratified); fewer tools, books, tutorials available</li></ul><p><h3>JBoss SEAM</h3></p><blockquote><p>JBoss Seam is a powerful new application framework to build next generation Web 2.0 applications by unifying and integrating popular service oriented architecture (SOA) technologies like AJAX, Java Server Faces (JSF), Enterprise Java Beans (EJB3), Java Portlets and Business Process Management (BPM) and workflow.</p><p>Seam has been designed from the ground up to eliminate complexity at the architecture and the API level. It enables developers to assemble complex web applications with simple annotated Plain Old Java Objects (POJOs), componentized UI widgets and very little XML. The simplicity of Seam 1.0 will enable easy integration with the JBoss Enterprise Service Bus (ESB) and Java Business Integration (JBI) in the future.</p></blockquote><ul><li>Based on EJB3</li><li>Integrates together some of the most widely adopted components such as JavaServer Faces and Hibernate</li><li>Can reportedly be used outside of JBoss Application Server (direct experience show some problems with this)</li></ul><p><h3>Spring Framework</h3></p><blockquote><p>The Spring framework is a popular but non-standard open source framework. It is primarily developed by and controlled by Interface21 Inc. The architecture of the Spring framework is based upon the Dependency Injection (DI) design pattern. Spring can work standalone or with existing application servers and makes heavy use of XML configuration files.</p></blockquote><ul><li>Explicit configuration via XML file</li><li>More flexible than EJB3/SEAM in swapping in and out various modules; yet the decisions made early on limit the ability to swap in and out later.</li><li>Several years old; widely available tools, books, tutorials</li><li><i>De facto</i> standard of an open source community with benevolent control by a corporate entity.</li></ul><p><h3>Apache Struts</h3></p><blockquote><p>Apache Struts is a free open-source framework for creating Java web applications.</p></blockquote><ul><li>(Summary opinion) Generally seen as a deprecated framework; few new projects start with Struts.</li><li>Weak integration of new techniques such as AJAX.</li></ul><p><h3>Plain Java Servlet (No Framework)</h3></p><ul><li>Must build the entire application support layer (object data storage, presentation interfaces, helper functions, etc. from scratch).</li><li>No ready-made integration of new techniques such as AJAX.</li></ul><p><h2>Background Information</h2></p><ul><li><a href="http://www.devx.com/Java/Article/32314/1954?pf=true" title="Make the Right Decision with Our Side-by-Side Comparison of Spring and EJB 3.0">Make the Right Decision with Our Side-by-Side Comparison of Spring and EJB 3.0</a></li><li><a href="http://www.devx.com/Java/Article/32447/1954?pf=true" title="Make the Right Decision with Our Side-by-Side Comparison of Spring and EJB 3.0, Part 2">Make the Right Decision with Our Side-by-Side Comparison of Spring and EJB 3.0, Part 2</a></li><li><a href="http://www.devx.com/Java/Article/31327/1954?pf=true" title="Discover Seam and Sew Up Your Java Projects Faster than Ever">Discover Seam and Sew Up Your Java Projects Faster than Ever</a></li><li><a href="http://en.wikipedia.org/wiki/Dependency_injection" title="http://en.wikipedia.org/wiki/Dependency_injection">Dependency injection &#8211; Wikipedia, the free encyclopedia</a></li><li><a href="http://www.springsource.com/products/pitchfork/pitchfork-faq" title="Pitchfork FAQ<br /> &mdash;<br /> Interface21.com">Pitchfork project frequently asked questions</a></li><li><a href="http://weblogs.java.net/blog/bleonard/archive/2006/05/trying_out_jbos_2.html" title="Brian Leonard&#039;s Blog: Trying out JBoss&#039; Seam">Trying out JBoss&#8217; Seam (Brian Leonard&#8217;s Blog)</a></li><li><a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=JBossSeamGettingStartedGuide" title="JBoss.com - Wiki - JBossSeamGettingStartedGuide">SEAM Getting Started Guide</a></li><li><span class="removed_link" title="http://seam.demo.jboss.com/">JBOSS-based SEAM demonstration site</span></li></ul><p style="padding:0;margin:0;font-style:italic;" class="removed_link">The text was modified to remove a link to http://seam.demo.jboss.com/ on January 13th, 2011.</p><p style="padding:0;margin:0;font-style:italic;">The text was modified to update a link from http://interface21.com/pitchfork/pitchfork-faq.html to http://www.springsource.com/products/pitchfork/pitchfork-faq on January 19th, 2011.</p>]]></content:encoded> <wfw:commentRss>http://dltj.org/article/java-framework/feed/</wfw:commentRss> <slash:comments>11</slash:comments> </item> </channel> </rss>
<!-- Served from: dltj.org @ 2012-05-24 16:16:26 by W3 Total Cache -->
