<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Apache Wink : 7.4 RSS</title>
	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
        <META http-equiv="Content-Type" content="text/html; charset=UTF-8">	    
    </head>

    <body>
	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
		    <tr>
			    <td valign="top" class="pagebody">
				    <div class="pageheader">
					    <span class="pagetitle">
                            Apache Wink : 7.4 RSS
                                                    </span>
				    </div>
				    <div class="pagesubheading">
					    This page last changed on Oct 15, 2009 by <font color="#0050B2">michael</font>.
				    </div>

				    <h2><a name="7.4RSS-RSSDataModel"></a>RSS Data Model</h2>


<p>RSS (Really Simple Syndication) is an XML-based document format for the syndication of web content such as weblogs and news headlines to Web sites as well as directly to user agents. Apache Wink supports the RSS 2.0 specification.</p>

<h3><a name="7.4RSS-"></a></h3>


<h3><a name="7.4RSS-%28ReallySimpleSyndication%29RSSDataModelOverview"></a>(Really Simple Syndication) RSS Data Model Overview</h3>

<p>Apache Wink provides an RSS data model for consuming and producing RSS Feeds (application/xml). All of the model classes are located under <b>org.apache.wink.common.model.rss</b> package.</p>

<h4><a name="7.4RSS-RSSFeedSupport"></a>RSS Feed Support</h4>

<p>The following table shows the RSS Feed data models and the representations in which it can be serialized and de-serialized.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'>&nbsp;</th>
<th class='confluenceTh'> Supported </th>
<th class='confluenceTh'> Media Types </th>
<th class='confluenceTh'> Data Model </th>
<th class='confluenceTh'> Provider registration </th>
</tr>
<tr>
<td class='confluenceTd'> Read </td>
<td class='confluenceTd'> Yes </td>
<td class='confluenceTd'> application/xml </td>
<td class='confluenceTd'> org.apache.wink<br clear="all" />
 .common.model<br clear="all" />
 .rss.RssFeed </td>
<td class='confluenceTd'> Not required. Registered by default </td>
</tr>
<tr>
<td class='confluenceTd'> Write </td>
<td class='confluenceTd'> Yes </td>
<td class='confluenceTd'> application/xml </td>
<td class='confluenceTd'> org.apache<br clear="all" />
 .wink.common<br clear="all" />
 .model.rss<br clear="all" />
 .RssFeed </td>
<td class='confluenceTd'> Not required. Registered by default </td>
</tr>
</tbody></table>

<h3><a name="7.4RSS-Examples"></a>Examples</h3>

<p>The following code example demonstrates reading and writing of RSS Feeds.</p>

<h4><a name="7.4RSS-ProducingRSSFeed"></a>Producing RSS Feed</h4>

<p>The following code example demonstrates the creation of an RSS Feed.</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">    @GET
    @Produces(MediaType.APPLICATION_XML)
    <span class="code-keyword">public</span> RssFeed getFeed() {
        RssFeed rss = <span class="code-keyword">new</span> RssFeed();

        RssChannel channel = <span class="code-keyword">new</span> RssChannel();
        channel.setTitle(<span class="code-quote">"Liftoff News"</span>);
        channel.setLink(<span class="code-quote">"http:<span class="code-comment">//liftoff.msfc.nasa.gov"</span>);
</span>        channel.setDescription(<span class="code-quote">"Liftoff to Space Exploration."</span>);
        channel.setPubDate(<span class="code-keyword">new</span> Date().toString());

        RssItem item = <span class="code-keyword">new</span> RssItem();
        item.setTitle(<span class="code-quote">"Star City"</span>);
        item.setLink(<span class="code-quote">"http:<span class="code-comment">//liftoff.msfc.nasa.gov/news/2003/news-starcity.asp"</span>);
</span>        item.setDescription(<span class="code-quote">"How <span class="code-keyword">do</span> Americans get ready to work with Russians aboard the International Space Station?"</span>);
        channel.getItems().add(item);

        ...

        rss.setChannel(channel);
        <span class="code-keyword">return</span> rss;
    }
}
</pre>
</div></div>

<h4><a name="7.4RSS-ConsumingRSSFeed"></a>Consuming RSS Feed</h4>

<p>The following code example demonstrates the consumption of an RSS Feed.</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">    @POST
    @Consumes(MediaType.APPLICATION_XML)
    <span class="code-keyword">public</span> void setFeed(RssFeed feed) {
        ...

        <span class="code-keyword">return</span>;
    }
</pre>
</div></div>

				    
                    			    </td>
		    </tr>
	    </table>
	    <table border="0" cellpadding="0" cellspacing="0" width="100%">
			<tr>
				<td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="images/border/spacer.gif" width="1" height="1" border="0"/></td>
			</tr>
		    <tr>
			    <td align="center"><font color="grey">Document generated by Confluence on Nov 11, 2009 06:57</font></td>
		    </tr>
	    </table>
    </body>
</html>