- From: Laird A Popkin <laird@io.com>
- Date: Wed, 31 May 2000 03:11:46 -0500 (CDT)
- To: xml-dist-app@w3.org
<html> <head> <meta name="Author" content="Laird Popkin"> <title>RSS in ICE</title> </head> <body> <h1> RSS in ICE</h1> <p>This document is a follow-up to the discussion thread on the xml-dist-app list between Laird Popkin and David Winer. <p><br>Comparison of RSS and ICE, and proposal on how to merge RSS' functionality into ICE. Note that purely duplicating RSS' functionality spelled in terms of ICE may not be the appropriate means of merging the standards, but this should at the least serve as an interesting experiment in comparing the protocols. In addition, the comparison to RSS reminds me of one of ICE's original requirements, to allow a syndicator that simply delivers static files to be a useful, valuable subset of ICE's functionality. This scenario has not been at the top of the ICE AG's priority list, so this exercise serves as a good reminder to the ICE AG, at the very least. The widespread adoption of RSS by low-end syndicators to distribute promotional links should serve as a clear indicator of the importance of this scenario in the world of syndication. <br>This document is written in HTML, but aside from a table and some examples wrapped in <pre> tags this document is formatted to be fairly readible as plain text. If this causes real problems for any readers, i can attempt to convert the table to plain text. <h2> Comparison</h2> A brief comparison of the goals and functionality of RSS and ICE. <br> <h3> RSS</h3> RSS is an evolution of CDF intended to allow web sites to easily broadcast links to web pages in order to promote traffic to the web site. It was originally intended to enable subscription to web "channels" for offline browsing, but has proven valuable as a simple means of exchanging web content between web sites. Thus, it provides for a relatively simple set of functionality that is easily implementable: <ul> <li> delivery only of web pages</li> <li> support of pull delivery of content</li> <li> content delivered is linked to, not transported to the subscriber for display</li> <li> simple scheduling</li> <li> all content is identical for all subscribers</li> <li> no access control</li> </ul> <h3> ICE</h3> ICE is intended to support the full range of content sydication. It has a number of commercial implementations, generally targeted at businesses that wish to distribute or aggregate large volumes of content with numerous business partners. Thus, it offers a range of options including: <ul> <li> delivery of arbitrary content types, including web pages</li> <li> support of both push and pull delivery of content</li> <li> access control and customization of content</li> <li> Both "full update" and "incremental update" supported, with atomicity of updates, recovery mechanisms for error conditions, etc.</li> <li> content delivered in-line or by reference</li> <li> confirmation of delivery</li> <li> auditing of ICE operations</li> <li> rich scheduling of ICE delivery</li> <li> meta-data relating to intellectual property, usage rights, copyright, etc.</li> <li> automated negotiation of delivery and other parameters</li> <li> extensible</li> <li> syndication discovery protocol</li> </ul> Note that while ICE offers these capabilities, it is not required that they be used for any particular syndication. Beyond this, it appears valuable to formally modify ICE and to define a subset of ICE that could be implemented in order to provide comparable functionality to RSS, with comparable simplicity of implementation. One can also imagine extending RSS to incorporate ICE's functionality as a comparable phrasing of this exercise. <p>Recognizing that there is significant value in a single syndication standard that encompasses the full range of online content syndication, I propose a "straw man" proposal for expressing RSS functionality within ICE, inclugin modifications to the ICE protocol to support identical behavior as RSS. I do not expect that this proposal would be adopted "as is," but would like to use it as a starting point for an exploration of unifying the two standards. <br> <h2> Mapping RSS into ICE</h2> <p><br>I first explore mapping the RSS XML elements into ICE. I based the RSS on the <a href="http://my.netscape.com/publish/help/mnn20/ quickstart.html#rsssyntax">My Netscape Network Help</a> reference document, and the ICE on the 1.1 draft currently in the ICE AG's egroups site. <br> <br> <table BORDER WIDTH="100%" > <tr BGCOLOR="#999999"> <td>RSS</td> <td>ICE</td> <td>Note</td> </tr> <tr> <td><?xml version="1.0"?> </td> <td><?xml version="1.0"?> </td> <td>standard XML label</td> </tr> <tr> <td><!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" <br>"http://my.netscape.com/publish/formats/rss-0.91.dtd"></td> <td><!DOCTYPE ice-payload <br>SYSTEM "ice11.dtd"></td> <td>RSS mandates single, shared DTD.</td> </tr> <tr> <td><rss version="0.91" encoding= "ISO_8859-1"> </td> <td><ice payload ice.version="1.1" payload-id="1"></td> <td>one top level element, required</td> </tr> <tr> <td><channel></td> <td><ice-offer></td> <td>one required</td> </tr> <tr> <td><title>MozillaZine</title></td> <td>product-name="MozillaZine"</td> <td>one required</td> </tr> <tr> <td><description>Your source for Mozilla news, advocacy, interviews, and more!</description></td> <td>description="Your source for Mozilla news, advocacy, interviews, and more!"</td> <td>one required</td> </tr> <tr> <td><link>http://www.mozillazine.org</link></td> <td>ice-catalog's url attribute</td> <td>one required</td> </tr> <tr> <td><language>[ language code here ]</language></td> <td>ice-catalog's xml:lang attribute, or <br>ice-package's xml:lang attribute</td> <td>one required</td> </tr> <tr> <td><rating>[ PICS rating here ]</rating></td> <td>add <rating> to ice-offer</td> <td>one optional</td> </tr> <tr> <td><copyright>Copyright 1999, Mozillazine.</copyright></td> <td>ice-offer's rights-holder="Copyright 1999, MozillaZine,"</td> <td>one optional, ignored by NetCenter</td> </tr> <tr> <td><pubDate>Thu, 08 Jul 1999 07:00:00 GMT</pubDate></td> <td>ice-package attribute activation="1999-07-08T07:00:00"</td> <td>one optional, ignored by NetCenter</td> </tr> <tr> <td><lastBuildDate>Thu, 08 Jul 1999 16:20:26 GMT</lastBuildDate>< /td> <td>payload attribute timestamp="1999-7-08T16:20:26"</td> <td>one optional, ignored by NetCenter</td> </tr> <tr> <td><docs>http://my.userland.com/stories/storyReader$11</docs></ td> <td><ice-business-terms xml:lang="en-us" type="licensing" url= "http://my.userland.com/stories/storyReader$11"></ice-business- terms></td> <td>one optional, ignored by NetCenter</td> </tr> <tr> <td><managingEditor>sylv@thisdomain.com</managingEditor></td> <td><ice-contact description="Managing Editor" xml:lang="en-us" name="Sylv" url="mailto://sylv@thisdomain.com"></ice-contact></td> <td>one optional, ignored by NetCenter</td> </tr> <tr> <td><webMaster>sylv@thisdomain.com</webMaster></td> <td><ice-contact description="Webmaster" xml:lang="en-us" name= "Sylv" url="mailto://sylv@thisdomain.com"></ice-contact></td> <td>one optional, ignored by NetCenter</td> </tr> <tr> <td><image></td> <td>add image-ref to ice-offer, based on ice-item-ref</td> <td>one optional</td> </tr> <tr> <td> <title>MozillaZine</title></td> <td><ice-offer product-name="MozillaZine" <br>or image-ref's attribute name="MozillaZine"</td> <td>one required if <image></td> </tr> <tr> <td> <url>http://www.mozillazine.org/image/ mynetscape88.gif</url></td> <td>image-ref's attribute url="http://www.mozillazine.org/image/ mynetscape88.gif"</td> <td>one required if <image></td> </tr> <tr> <td> <link>http://www.mozillazine.org</link></td> <td>add url to ice-offer</td> <td>one optional if <image></td> </tr> <tr> <td> <width>[ numeric value here ]</width></td> <td>image-ref's attribute width="[ numeric value here ]"</td> <td>one optional if <image></td> </tr> <tr> <td> <height>[ numeric value here ]</height></td> <td>image-ref's attribute height="[ numeric value here ]"</td> <td>one optional if <image></td> </tr> <tr> <td> <description>Articles, discussions, builds, and more...</description></td> <td>ice-offer's attribute description="Articles, discussions, builds, and more..."</td> <td>one optional if <image></td> </tr> <tr> <td><item></td> <td><ice-item-ref></td> <td>0-15 allowed</td> </tr> <tr> <td> <title>Java2 in Navigator 5?</title></td> <td>name="Java2 in Navigator 5?"</td> <td>one required per <item></td> </tr> <tr> <td> <link>http://www.mozillazine.org/ talkback.html?article=607</link></td> <td>url="http://www.mozillazine.org/talkback.html?article=607"</td> <td>one required per <item></td> </tr> <tr> <td> <description>Will Java2 be an integrated part of Navigator 5? Read more about it in this discussion...</description> </td> <td><ice-item-ref><ice-access-control description="Will Java2 be an integrated part of Navigator 5? Read more about it in this discussion..." control-type="none"</td> <td>one optional per <item></td> </tr> <tr> <td><textinput></td> <td>add <textinput> as defined by RSS to ice-offer.</td> <td>one optional, implemented by HTTP FORM GET</td> </tr> <tr> <td> <title>Send</title></td> <td>ditto</td> <td>one required if <textinput></td> </tr> <tr> <td> <description>Comments about MozillaZine?</ description></td> <td>ditto</td> <td>one required if <textinput></td> </tr> <tr> <td> <name>[ value of name= attribute of input tag here ]</name></td> <td>ditto</td> <td>one required if <textinput></td> </tr> <tr> <td> <link>http://www.mozillazine.org/cgi-bin/ sampleonly.cgi</link></td> <td>ditto</td> <td>one required if <textinput></td> </tr> <tr> <td><skipHours></td> <td>ice-offer's ice-delivery-policy's ice-delivery-rule</td> <td>up to 24, optional, ignored by NetCenter</td> </tr> <tr> <td> <hour>7</hour></td> <td>min-update-interval="P25200S"</td> <td>optional, ignored by NetCenter</td> </tr> <tr> <td><skipDays></td> <td>above</td> <td>optional, ignored by NetCenter</td> </tr> <tr> <td> <days>Monday</days></td> <td>weekday="1"</td> <td>up to 7, required if <skipDays></td> </tr> <caption ALIGN=BOTTOM> </caption> </table> <h2> Example messages</h2> The following is an example RSS message and a comparable ICE message. Note that many RSS elements mapped above (based on the RSS specification) were not used in the RSS messages that I have seen in production, and are thus not reflected below. I believe that this makes the following messages fairly realistic reflections of how typical RSS syndications can be encoded. <br> <hr WIDTH="100%"> <center><h3>RSS Message</h3></center> <pre><?xml version="1.0"?></pre> <pre> <!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"</pre> <pre> & nbsp; "http://my.netscape.com/publish/formats/rss- 0.91.dtd"></pre> <pre> <rss version="0.91"></pre> <pre> <channel></pre> <pre> </pre> <pre> <title>MozillaZine</title></ pre> <pre> <link>http:// www.mozillazine.org</link></pre> <pre> <description>Your source for Mozilla news, advocacy,</pre> <pre> interviews, builds, and more! </description></pre> <pre> <language>en-us</language></ pre> <pre> <rating>(PICS-1.1 "http:// www.rsac.org/ratingsv01.html"</pre> <pre> l gen true comment "RSACi North America Server"</pre> <pre> for "http:// www.rsac.org" on "1996.04.16T08:15-0500"</pre> <pre> r (n 0 s 0 v 0 l 0))& lt;/rating></pre> <pre> <image></pre> <pre> <title>MozillaZine& lt;/title></pre> <pre> <url>http:// www.mozillazine.org/image/mynetscape88.gif</url></pre> <pre> <link>http:// www.mozillazine.org</link></pre> <pre> <width>88</width> </pre> <pre> <height>31</ height></pre> <pre> <description> Articles, discussions, builds, and more...</description></pre> <pre> </image></pre> <pre> </pre> <pre> <item></pre> <pre> <title>Java2 in Navigator 5?</title></pre> <pre> <link>http:// www.mozillazine.org/talkback.html?article=607</link></pre> <pre> <description>Will Java2 be an integrated part of Navigator 5?</pre> <pre> Read more about it in this discussion...</description></pre> <pre> </item></pre> <pre> </pre> <pre> <item></pre> <pre> <title>Communicator 4.61 Out</title></pre> <pre> <link>http:// www.mozillazine.org/talkback.html?article=606</link></pre> <pre> <description>The latest version of Communicator is now</pre> <pre> available. It includes security enhancements</pre> <pre> and various bug fixes.& lt;/description></pre> <pre> </item></pre> <pre> </pre> <pre> <item></pre> <pre> <title>Mozilla Dispenses with Old,</pre> <pre> Proprietary DOM</ title></pre> <pre> <link>http:// www.mozillazine.org/talkback.html?article=604</link></pre> <pre> </item></pre> <pre> </pre> <pre> <item></pre> <pre> <title>The Animation Contest is Now Closed!</title></pre> <pre> <link>http:// www.mozillazine.org/talkback.html?article=603</link></pre> <pre> </item></pre> <pre> </pre> <pre> <textinput></pre> <pre> <title>Send</ title></pre> <pre> <description> Comments about MozillaZine?</description></pre> <pre> <name>responseText& lt;/name></pre> <pre> <link>http:// www.mozillazine.org/cgi-bin/sampleonly.cgi</link></pre> <pre> </textinput></pre> <pre> </channel></pre> <pre> </pre> <pre> </rss></pre> <hr WIDTH="100%"> <center><h3>ICE Message</h3></center> <pre><?xml version="1.0"?></pre> <pre><!DOCTYPE ice-payload SYSTEM "ice11.dtd"></pre> <pre><ice-payload ice.version="1.1" payload-id="1" timestamp="1999- 7-08T16:20:26"></pre> <pre> <ice-header></pre> <pre> <ice-sender name="MozillaZine" role= "syndicator" sender-id="[ GUID ]" location="http://www.mozillazine.com/ ice-get.xml"/></pre> <pre> <ice-user-agent>Mod::ICE-RSS/0.1</user- agent> <!-- not required, but could be useful for support --></pre> <pre> </ice-header></pre> <pre> <ice-response response-id="1"></pre> <pre> <ice-code numeric="200" phrase="OK"></ code></pre> <pre> <ice-package fullupdate="true" old-state= "ICE-ANY" new-state="1999-7-08T16:20:26" package-id="1" subscription- id=""></pre> <pre> <ice-catalog name="MozillaZine's ICE/RSS server" url="http://www.mozillazine.org/" xml:lang="en-us"></ pre> <pre> <ice-image-link image-url="http://www.mozillazine.org/image/mynetscape88.gif" url= "http://www.mozillazine.org"</pre> <pre> height="88" width="31" description="Articles, discussions, builds, and more..."></ pre> <pre> </ice-image-link></ pre> <pre> <ice-offer name= "MozillaZine" description="Your source for Mozilla news, advocacy, interviews, builds, and more!"></pre> <pre> <ice- delivery-policy></pre> <pre> & nbsp; <ice-delivery-rule mode="get" url="http:// www.mozillazine.org/ice-rss.xml"/></pre> <pre> </ice- delivery-policy></pre> <pre> <rating> (PICS-1.1 "http://www.rsac.org/ratingsv01.html"</pre> <pre> l gen true comment "RSACi North America Server"</pre> <pre> for "http:/ /www.rsac.org" on "1996.04.16T08:15-0500"</pre> <pre> r (n 0 s 0 v 0 l 0))</rating></pre> <pre> & lt;textinput> <!-- straight from RSS --></pre> <pre> <title>Send</title></pre> <pre> <description>Comments about MozillaZine?</description></pre> <pre> <name>responseText</name></pre> <pre> <link>http://www.mozillazine.org/cgi-bin/sampleonly.cgi</link></ pre> <pre> </ textinput></pre> <pre> </ice-offer></pre> <pre> </ice-catalog></pre> <pre> <ice-item-link name="Java2 in Navigator 5?" url="http://www.mozillazine.org/talkback.html?article= 607"</pre> <pre> description="Will Java2 be an integrated part of Navigator 5? Read more about it in this discussion..."></pre> <pre> <ice-item-link name= "Communicator 4.61 Out" url="http://www.mozillazine.org/ talkback.html?article=606"</pre> <pre> description="The latest version of Communicator is now available. It includes security enhancements and various bug fixes."></pre> <pre> </ice-item-link></pre> <pre> <ice-item-link name="Mozilla Dispenses with Old, Proprietary DOM" url="http://www.mozillazine.org/ talkback.html?article=604"></pre> <pre> </ice-item-link></pre> <pre> <ice-item-link name="The Animation Contest is Now Closed!" url="http://www.mozillazine.org/ talkback.html?article=60></pre> <pre> </ice-item-link></pre> <pre> </ice-package></pre> <pre> </ice-response></pre> <pre></ice-payload></pre> <hr WIDTH="100%"> <br> <h3>Observations</h3> <ul> <li> The ICE encoding tends towards fewer elements with attributes, whereas the RSS encoding consists almost entirely of elements with no attributes. Encoding with attributes rather than nested elements is substantially more efficient, both in terms of code complexity and processing time, due to the simpler data structures (DOM) or collection of relevant data into events (SAX). May want to re-express the textinput structure as attributes rather than nested elements for consistency with the rest of ICE.</li> <li> I am assuming that the ice-payload will typically be delivered as a static file that is generated periodically, either on a schedule or triggered by content changes. Thus, the timestamps would be the timestamp of the last time the file was written, the payload id would simple increment, and so on. Of course, if the file is generated dynamically (i.e. the GET is to a cgi or Servlet) the entire process could be data driven. The subscriber shouldn't care, but we should make sure that the trivial, static file option is straightforward to implement.</li> <li> ICE uses a specific form of ISO8601 time, date and period specification. Since ICE specifies that (for simplicity of implementation) all periods are specified in seconds, rather than the broad range of units allowed by ISO8601, the RSS "hours" scheduling is rather cryptic looking (1 hour = a 3600 second period, or P3600S in ISO8601). We may want to consider adding hours to the allowable units, allowing the more reasonable P1H for one hour, etc. This is added code complexity, but probably more human readable. Unlike typical ICE scenarios, involving content management systems, low-end ICE-RSS syndicators may, in fact, hand-author this file for their site, in which case simplicity of expression is valuable even at the cost of somewhat more complex implementation on the receiving side. It's worth discussing, at any rate.</li> <li> Similarly, for full update packages, old-state is somewhat redundant, since it must always have the value of "ICE-ANY". I would suggest that we may want to change is attribute to #IMPLIED, defaulting to "ICE-ANY", in order to make the expression of full updates more compact.</li> <li> There are some relationships in RSS that aren't completely clear to me. For example, is <image> intended to be an image that refers to the syndicator as a whole, or to the particular channel being transmitted, or is it simple another kind of item? I interpreted it as applying to the syndicator as a whole, by encoding it in the ice-catalog (i.e. where other contact information would go).</li> <li> Encoded the ice-package in an ice-response. In principle the HTTP GET of the URL can be treated as if it were an ice-request of ice-get-package with no subscriber ID. As there is no protocol-level communication channel from the subscriber to the syndicator, the ice-package generated in a GET mode subscription cannot request confirmation from the subscriber.</li> <li> RSS doesn't have any concept of a failure code, so to duplicate RSS the ice-response's ice-code would always be 200/OK.</li> </ul> <h2> Changes to ICE</h2> The key addition to the ICE protocol is an extremely limited content deliver mode, "GET", in which the only communication between the syndicator and subscriber consists of the subscriber issuing a GET of a provided URL, and receiving the requested content. In addition, there are a small number of DTD changes that would be required to fully express RSS' functionality in ICE. This delivery mode utilizes an extremely minimal subset of ICE's functionality, but the extreme ease of implementation, and the prospect of unifying two divergent standards for content syndication to the benefit of all concerned, make this an extremely valuable scenario to explore. The changes to the ICE protocol are generally consistent with ICE's design philosophy, and of general use to a variety of syndication scenarios. <p>This scenario involves making the following changes to ICE: <ul> <li> Add PICS rating to offer. PICS ratings should be added to ice-offer. I simply adopted the RSS <rating> tag.</li> <li> Add ice-item-link, a duplicate of ice-item-ref, with the added attribute description, and the semantic that the asset is to be linked to rather than retrieved and utilized locally. Linked assets are appropriate if the syndicator wishes to take advantage of site-specific functionalty or to control, track or benefit from the actual delivery of the content. Assets encoded as ice-item-link must be served on a persistent server accessible at the provided URL for use by the general public.</li> <li> Add ice-image-link to the contents of ice-catalog and ice-package. For ice-offer it would be for display to users in selecting between offers. For ice-package it would be an alternative to ice-item-link that has additional attributes, image-url, height, and width, relevant to image links.</li> <li> Consider adding ice-image and ice-image-ref to ICE, as the height and width attributes may be useful to subscribers for images that are encoded inline or by reference.</li> <li> Add url to ice-offer, to provide a link to a web page that describes the offer more fully than can be embedded in the ice-offer. This is valuable to any ICE implementation.</li> <li> Add RSS' textinput mechanism to ice-offer. ICE does not have this concept. Add this as an optional element contained within ice-offer. Again, this is probably generally useful to ICE syndications in any delivery mode.< /li> <li> Add a delivery mechanism, get, to the delivery modes, in addition to the existing push and pull delivery modes. Get delivery would allow the subscriber to do a simpe HTTP GET of a provided URL in order to retrieve updates. As this means that the syndicator has no knowledge of the subscriber's identity or state, GET delivery is only supported for full updates of content that is not customized to particular subscribers.</li> <li>The ICE protocol does not require the negotiation process. Therefore, a subscription with get delivery could be initiated simply by having the syndicator publicize the URL from which the ice-payload can be retrieved. Of course, the standard ICE subscription discovery and negotiation mechanism can be followed for get mode subscriptions.</li> <li>In addition, for GET subscriptions, in order to simplify implementation, the only allowable elements would be: ice-payload, ice-header, ice-sender, ice-response, ice-package, ice-image-link and ice-item-link. This would allow syndicators and subscribers that support only the get mode of delivery to have an extremely simple implementation.</li> <li>Since GET subscriptions are anonymous, subscription-id for such subscriptions should be an empty string.</li> <li>Finally, in order to model RSS's bundling of subscription information into the file containing the content, I would propose adding the ice-catalog structure, containing only the single ice-subscription relevant to the ice-package, as an an optional component within the ice-package. While syndicators could provide the full ICE level of detail for themselves (contact information, etc.) the receiver can feel free to ignore all attributes not mapped above.</li> </ul> <h2>Open Issues</h2> There are a number of issues where it may make sense to adopt more of ICE's functionality even into this "simplified" model of ICE modeled on RSS. For example: <ul> <li> There may be value in supporting regular ICE inline content encoding (ice-item) and reference (ice-item-ref, type="retrieve") for GET subscriptions. As this would be new functionality for RSS, this option is not explored in this document, but it may be appropriate for a fuller merging of the protocols.</li> <li>Descriptions, names, etc., are encoded as plain text attributes in the XML. We may want to consider encoding them using the ice-text structure, which would allow alternate representations in varions languages and character encodings. RSS doesn't have alternate encodings, so I stuck to the simpler string representation for simplicity in modeling RSS.</li> <li>There are a number of RSS features that are specified but not implemented by Netcenter. If there are specified RSS features are generally not implemented by RSS users, it may be preferable not to add those features to ICE.</li> <li>RSS doesn't have the concept of failure status. If RSS "files" are dynamically built, many of the ICE error codes having to do with operational availability, permanent redirection, etc., are probably appropriate.</li> <li>One can also easily imagine it being useful to send in-band notification (ice-notify) to subscribers.</li> </ul> </body> </html>
Received on Wednesday, 31 May 2000 04:11:50 UTC