You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by bu...@apache.org on 2014/01/14 18:14:49 UTC

svn commit: r894109 - in /websites/staging/olingo/trunk/content: ./ doc/tutorials/delta.html

Author: buildbot
Date: Tue Jan 14 17:14:49 2014
New Revision: 894109

Log:
Staging update by buildbot for olingo

Modified:
    websites/staging/olingo/trunk/content/   (props changed)
    websites/staging/olingo/trunk/content/doc/tutorials/delta.html

Propchange: websites/staging/olingo/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Tue Jan 14 17:14:49 2014
@@ -1 +1 @@
-1558082
+1558114

Modified: websites/staging/olingo/trunk/content/doc/tutorials/delta.html
==============================================================================
--- websites/staging/olingo/trunk/content/doc/tutorials/delta.html (original)
+++ websites/staging/olingo/trunk/content/doc/tutorials/delta.html Tue Jan 14 17:14:49 2014
@@ -73,7 +73,122 @@
             
             
             <h1 id="delta-responses">Delta Responses</h1>
-<p>tbd</p>
+<p>Delta responses is a feature on top of OData 2.0 for requesting changes. The feature is defined in OData 4.0 and this is a preliminary and lightweight implementation close to the OData 4.0 specification <a href="http://docs.oasis-open.org/odata/odata/v4.0/cos01/part1-protocol/odata-v4.0-cos01-part1-protocol.html#_Toc372793707">(see here)</a>.</p>
+<p>Because of delta responses are not defined in OData 2.0 this feature is optional.</p>
+<p>Features:
+<em> Delta Links (for Atom and Json)
+</em> Tombstones <a href="http://tools.ietf.org/html/rfc6721">RFC6721</a> for deleted entries in Atom format
+* Deleted Entries in Json as a lightweight implementation of <a href="http://docs.oasis-open.org/odata/odata-json-format/v4.0/cos01/odata-json-format-v4.0-cos01.html#_Toc372793080">Delta Responses</a> </p>
+<h3 id="use-case">Use Case</h3>
+<p>A client requests a (paged) feed. A server can add a delta link on the last feed page. Using the delta link returns only changed data of the feed to the client. Changed data are feed entries with changed properties or deleted entries.</p>
+<h3 id="implementation">Implementation</h3>
+<p>A server has to implement the <code>TombstoneCallback</code> interface:</p>
+<div class="codehilite"><pre><span class="n">public</span> <span class="n">interface</span> <span class="n">TombstoneCallback</span> <span class="n">extends</span> <span class="n">ODataCallback</span> <span class="p">{</span>
+<span class="p">...</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>Basically the implementation of this interface has to carry information about deleted data and the delta link which is realized as custom query option:</p>
+<div class="codehilite"><pre><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="p">:</span>80<span class="o">/</span><span class="n">service</span><span class="o">/</span><span class="n">Rooms</span>?!<span class="n">deltatoken</span><span class="p">=</span>1234
+</pre></div>
+
+
+<p>Finally the following code has to go into a <code>ODataSingleProcessor</code> implementation:</p>
+<div class="codehilite"><pre><span class="cm">/**</span>
+<span class="cm"> * @see EntitySetProcessor</span>
+<span class="cm"> */</span>
+<span class="p">@</span><span class="n">Override</span>
+<span class="n">public</span> <span class="n">ODataResponse</span> <span class="n">readEntitySet</span><span class="p">(</span><span class="k">final</span> <span class="n">GetEntitySetUriInfo</span> <span class="n">uriInfo</span><span class="p">,</span> <span class="k">final</span> <span class="n">String</span> <span class="n">contentType</span><span class="p">)</span> <span class="n">throws</span> <span class="n">ODataException</span> <span class="p">{</span>
+
+  <span class="p">[...]</span>
+
+  <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span> <span class="n">ODataCallback</span><span class="o">&gt;</span> <span class="n">callbacks</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span> <span class="n">ODataCallback</span><span class="o">&gt;</span><span class="p">();</span>
+  <span class="n">callbacks</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="n">TombstoneCallback</span><span class="p">.</span><span class="no">CALLBACK_KEY_TOMBSTONE</span><span class="p">,</span> <span class="n">tombstoneCallback</span><span class="p">);</span>
+
+  <span class="n">EntityProviderWriteProperties</span> <span class="n">properties</span> <span class="o">=</span> <span class="n">EntityProviderWriteProperties</span><span class="p">.</span><span class="n">serviceRoot</span><span class="p">(</span><span class="k">new</span> <span class="no">URI</span><span class="p">(</span><span class="no">BASE_URI</span><span class="p">)).</span><span class="n">callbacks</span><span class="p">(</span><span class="n">callbacks</span><span class="p">).</span><span class="n">build</span><span class="p">();</span>
+
+  <span class="k">final</span> <span class="n">ODataResponse</span> <span class="n">response</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JsonEntityProvider</span><span class="p">().</span><span class="n">writeFeed</span><span class="p">(</span><span class="n">entitySet</span><span class="p">,</span> <span class="n">roomsData</span><span class="p">,</span> <span class="n">properties</span><span class="p">);</span>
+
+  <span class="p">[...]</span>
+
+  <span class="k">return</span> <span class="n">response</span><span class="p">;</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="json-response">Json Response</h5>
+<p>This is an example for a Json response:</p>
+<div class="codehilite"><pre>    <span class="p">[...]</span>
+     <span class="p">{</span>
+        &quot;<span class="n">__metadata</span>&quot;<span class="p">:{</span>
+           &quot;<span class="n">id</span>&quot;<span class="p">:</span>&quot;<span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="p">:</span>80<span class="o">/</span><span class="n">service</span><span class="o">/</span><span class="n">Rooms</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">)</span>&quot;<span class="p">,</span>
+           &quot;<span class="n">uri</span>&quot;<span class="p">:</span>&quot;<span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="p">:</span>80<span class="o">/</span><span class="n">service</span><span class="o">/</span><span class="n">Rooms</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">)</span>&quot;<span class="p">,</span>
+           &quot;<span class="n">type</span>&quot;<span class="p">:</span>&quot;<span class="n">RefScenario</span><span class="p">.</span><span class="n">Room</span>&quot;<span class="p">,</span>
+           &quot;<span class="n">etag</span>&quot;<span class="p">:</span>&quot;<span class="n">W</span><span class="o">/\</span>&quot;2<span class="o">\</span>&quot;&quot;
+        <span class="p">},</span>
+        &quot;<span class="n">Id</span>&quot;<span class="p">:</span>&quot;2&quot;<span class="p">,</span>
+        &quot;<span class="n">Name</span>&quot;<span class="p">:</span><span class="n">null</span><span class="p">,</span>
+        &quot;<span class="n">Seats</span>&quot;<span class="p">:</span>66<span class="p">,</span>
+        &quot;<span class="n">Version</span>&quot;<span class="p">:</span>2<span class="p">,</span>
+        &quot;<span class="n">nr_Employees</span>&quot;<span class="p">:{</span>
+           &quot;<span class="n">__deferred</span>&quot;<span class="p">:{</span>
+              &quot;<span class="n">uri</span>&quot;<span class="p">:</span>&quot;<span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="p">:</span>80<span class="o">/</span><span class="n">service</span><span class="o">/</span><span class="n">Rooms</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">)</span><span class="o">/</span><span class="n">nr_Employees</span>&quot;
+           <span class="p">}</span>
+        <span class="p">},</span>
+        &quot;<span class="n">nr_Building</span>&quot;<span class="p">:{</span>
+           &quot;<span class="n">__deferred</span>&quot;<span class="p">:{</span>
+              &quot;<span class="n">uri</span>&quot;<span class="p">:</span>&quot;<span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="p">:</span>80<span class="o">/</span><span class="n">service</span><span class="o">/</span><span class="n">Rooms</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">)</span><span class="o">/</span><span class="n">nr_Building</span>&quot;
+           <span class="p">}</span>
+        <span class="p">}</span>
+     <span class="p">},</span>
+     <span class="p">{</span>
+        &quot;<span class="p">@</span><span class="n">odata</span><span class="p">.</span><span class="n">context</span>&quot;<span class="p">:</span>&quot;$<span class="n">metadata</span>#<span class="n">Rooms</span><span class="o">/</span>$<span class="n">deletedEntity</span>&quot;<span class="p">,</span>
+        &quot;<span class="n">id</span>&quot;<span class="p">:</span>&quot;<span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="p">:</span>80<span class="o">/</span><span class="n">service</span><span class="o">/</span><span class="n">Rooms</span><span class="p">(</span><span class="s">&#39;3&#39;</span><span class="p">)</span>&quot;
+     <span class="p">},</span>
+     <span class="p">{</span>
+        &quot;<span class="p">@</span><span class="n">odata</span><span class="p">.</span><span class="n">context</span>&quot;<span class="p">:</span>&quot;$<span class="n">metadata</span>#<span class="n">Rooms</span><span class="o">/</span>$<span class="n">deletedEntity</span>&quot;<span class="p">,</span>
+        &quot;<span class="n">id</span>&quot;<span class="p">:</span>&quot;<span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="p">:</span>80<span class="o">/</span><span class="n">service</span><span class="o">/</span><span class="n">Rooms</span><span class="p">(</span><span class="s">&#39;4&#39;</span><span class="p">)</span>&quot;
+     <span class="p">},</span>
+     <span class="p">{</span>
+        &quot;<span class="p">@</span><span class="n">odata</span><span class="p">.</span><span class="n">context</span>&quot;<span class="p">:</span>&quot;$<span class="n">metadata</span>#<span class="n">Rooms</span><span class="o">/</span>$<span class="n">deletedEntity</span>&quot;<span class="p">,</span>
+        &quot;<span class="n">id</span>&quot;<span class="p">:</span>&quot;<span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="p">:</span>80<span class="o">/</span><span class="n">service</span><span class="o">/</span><span class="n">Rooms</span><span class="p">(</span><span class="s">&#39;5&#39;</span><span class="p">)</span>&quot;
+     <span class="p">},</span>
+
+  <span class="p">],</span>
+  &quot;<span class="n">__delta</span>&quot;<span class="p">:</span>&quot;<span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="p">:</span>80<span class="o">/</span><span class="n">service</span><span class="o">/</span><span class="n">Rooms</span>?!<span class="n">deltatoken</span><span class="p">=</span>1234&quot;
+  <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="atom-response">Atom Response</h5>
+<p>This is an example of an Atom delta response (tombstones, RFC6721)</p>
+<div class="codehilite"><pre><span class="nt">&lt;feed</span> <span class="err">...</span><span class="nt">&gt;</span>
+
+[..]
+
+<span class="nt">&lt;entry</span> <span class="na">m:etag=</span><span class="s">&quot;W/&amp;quot;3&amp;quot;&quot;</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;id&gt;</span>http://host:80/service/Rooms(&#39;2&#39;)<span class="nt">&lt;/id&gt;</span>
+    <span class="nt">&lt;title</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span><span class="nt">&gt;</span>Rooms<span class="nt">&lt;/title&gt;</span>
+    <span class="nt">&lt;updated&gt;</span>2014-01-14T18:11:06.681+01:00<span class="nt">&lt;/updated&gt;</span>
+    <span class="nt">&lt;category</span> <span class="na">term=</span><span class="s">&quot;RefScenario.Room&quot;</span> <span class="na">scheme=</span><span class="s">&quot;http://schemas.microsoft.com/ado/2007/08/dataservices/scheme&quot;</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">&quot;Rooms(&#39;2&#39;)&quot;</span> <span class="na">rel=</span><span class="s">&quot;edit&quot;</span> <span class="na">title=</span><span class="s">&quot;Room&quot;</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">&quot;Rooms(&#39;2&#39;)/nr_Employees&quot;</span> <span class="na">rel=</span><span class="s">&quot;http://schemas.microsoft.com/ado/2007/08/dataservices/related/nr_Employees&quot;</span> <span class="na">title=</span><span class="s">&quot;nr_Employees&quot;</span> <span class="na">type=</span><span class="s">&quot;application/atom+xml;type=feed&quot;</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">&quot;Rooms(&#39;2&#39;)/nr_Building&quot;</span> <span class="na">rel=</span><span class="s">&quot;http://schemas.microsoft.com/ado/2007/08/dataservices/related/nr_Building&quot;</span> <span class="na">title=</span><span class="s">&quot;nr_Building&quot;</span> <span class="na">type=</span><span class="s">&quot;application/atom+xml;type=entry&quot;</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;content</span> <span class="na">type=</span><span class="s">&quot;application/xml&quot;</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;m:properties&gt;</span>
+        <span class="nt">&lt;d:Id&gt;</span>2<span class="nt">&lt;/d:Id&gt;</span>
+        <span class="nt">&lt;d:Name&gt;</span>Neu Schwanstein2<span class="nt">&lt;/d:Name&gt;</span>
+        <span class="nt">&lt;d:Seats&gt;</span>20<span class="nt">&lt;/d:Seats&gt;</span>
+        <span class="nt">&lt;d:Version&gt;</span>3<span class="nt">&lt;/d:Version&gt;</span>
+    <span class="nt">&lt;/m:properties&gt;</span>
+    <span class="nt">&lt;/content&gt;</span>
+<span class="nt">&lt;/entry&gt;</span>
+<span class="nt">&lt;at:deleted-entry</span> <span class="na">ref=</span><span class="s">&quot;http://host:80/service/Rooms(&#39;2&#39;)&quot;</span> <span class="na">when=</span><span class="s">&quot;2014-01-14T18:11:06.682+01:00&quot;</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;delta&quot;</span> <span class="na">href=</span><span class="s">&quot;http://host:80/service/Rooms?!deltatoken=1234&quot;</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;/feed&gt;</span>
+</pre></div>