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 2013/12/03 13:37:44 UTC

svn commit: r888924 - in /websites/staging/olingo/trunk/content: ./ doc/tutorials/Olingo_Tutorial_AdvancedReadWrite_Batch.html

Author: buildbot
Date: Tue Dec  3 12:37:44 2013
New Revision: 888924

Log:
Staging update by buildbot for olingo

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

Propchange: websites/staging/olingo/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Tue Dec  3 12:37:44 2013
@@ -1 +1 @@
-1547369
+1547370

Added: websites/staging/olingo/trunk/content/doc/tutorials/Olingo_Tutorial_AdvancedReadWrite_Batch.html
==============================================================================
--- websites/staging/olingo/trunk/content/doc/tutorials/Olingo_Tutorial_AdvancedReadWrite_Batch.html (added)
+++ websites/staging/olingo/trunk/content/doc/tutorials/Olingo_Tutorial_AdvancedReadWrite_Batch.html Tue Dec  3 12:37:44 2013
@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
+    <head>
+        <meta charset="utf-8">
+            <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+                <title></title>
+                <meta name="description" content="Apache Olingo (incubating) provides libraries which enable developers to implement OData producers and OData consumers. The available OData Java library implements OData version 2.0. In future on goal is to provide an OData 4.0 compliant library once the OData standard is published at OASIS. The focus within the community is currently on the Java technology but it is up to the community to discuss if other environments find interest.">
+                    <meta name="viewport" content="width=device-width">
+                        
+		<link rel="stylesheet" href="/css/bootstrap.min.css">
+                            <style>
+                                body {
+                                    padding-top: 60px;
+                                    padding-bottom: 40px;
+                                }
+                                </style>
+		<link rel="stylesheet" href="/css/bootstrap-responsive.min.css">
+		<link rel="stylesheet" href="/css/main.css">
+                                    
+		<script src="j/s/vendor/modernizr-2.6.2-respond-1.1.0.min.js"></script>
+                                    </head>
+    <body>
+        <!--[if lt IE 7]>
+         <p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
+         <![endif]-->
+        
+        <!-- This code is taken from http://twitter.github.com/bootstrap/examples/hero.html -->
+        <div class="navbar navbar-inverse  navbar-fixed-top">
+            <div class="navbar-inner">
+                <div class="container">
+                    <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+                        <span class="icon-bar"></span>
+                        <span class="icon-bar"></span>
+                        <span class="icon-bar"></span>
+                    </a>
+                    <a class="brand" href="#">Apache Olingo™</a>
+                    <div class="nav-collapse collapse">
+                        <ul class="nav">
+                            <li class="dropdown">
+                                <a href="#" class="dropdown-toggle" data-toggle="dropdown">ASF <b class="caret"></b></a>
+                                <ul class="dropdown-menu">
+                                    <li><a href="http://www.apache.org/foundation/">ASF Home</a></li>
+                                    <li><a href="http://projects.apache.org/">Projects</a></li>
+                                    <li><a href="http://people.apache.org/">People</a></li>
+                                    <li><a href="http://www.apache.org/foundation/getinvolved.html">Get Involved</a></li>
+                                    <li><a href="http://www.apache.org/dyn/closer.cgi">Download</a></li>
+									<li><a href="http://www.apache.org/security/">Security</a></li>
+                                    <li><a href="http://www.apache.org/foundation/sponsorship.html">Support Apache</a></li>
+                                </ul>
+                            </li>
+                            <li><a href="/">Home</a></li>
+                            <li><a href="/download.html">Download</a></li>
+                            <li><a href="/documentation.html">Documentation</a></li>
+                            <li><a href="/support.html">Support</a></li>
+                        </ul>
+                        <form class="navbar-form pull-right" name="search" id="search" action="http://www.google.com/search" method="get">
+                            <input value="olingo.incubator.apache.org" name="sitesearch" type="hidden"/>
+                            <input class="span2" type="text" name="q" id="query">
+                                <input class="btn"type="submit" id="submit" value="Search">
+                                    </form>
+                    </div><!--/.nav-collapse -->
+                </div>
+            </div>
+        </div>
+        
+        <div class="container">
+            
+            
+            
+            <h1 id="batch">Batch</h1>
+<h3 id="how-to-process-an-odata-batch-request">How to process an OData Batch Request</h3>
+<h5 id="implement-the-method-executebatch-of-the-class-odatasingleprocessor">Implement the method executeBatch of the class ODataSingleProcessor.</h5>
+<ul>
+<li>Use the method <code>EntityProvider.parseBatchRequest(contentType, content, batchProperties)</code> in order to parse the Batch Request Body. As a result you get a list with batch parts. Each part separately represents a ChangeSet or a query operation. </li>
+<li>Call <code>handler.handleBathPart(batchRequestPart)</code> while looping over the list. The handler delegates the processing of a batch part depending on the type of that batch part. </li>
+<li>When all batch parts are completely processed, use the method <code>EntityProvider.writeBatchResponse(final List&lt;BatchResponsePart&gt; batchResponseParts)</code> in order to write all responses in one Batch Response. 
+The following example shows a possible implementation:</li>
+</ul>
+<p><strong>Sample Code</strong></p>
+<div class="codehilite"><pre><span class="p">@</span><span class="n">Override</span>
+  <span class="n">public</span> <span class="n">ODataResponse</span> <span class="n">executeBatch</span><span class="p">(</span><span class="n">final</span> <span class="n">BatchHandler</span> <span class="n">handler</span><span class="p">,</span> <span class="n">final</span> <span class="n">String</span> <span class="n">contentType</span><span class="p">,</span> <span class="n">final</span> <span class="n">InputStream</span> <span class="n">content</span><span class="p">)</span> <span class="n">throws</span> <span class="n">ODataException</span> <span class="p">{</span>
+    <span class="n">ODataResponse</span> <span class="n">batchResponse</span><span class="p">;</span>
+    <span class="n">List</span><span class="o">&lt;</span><span class="n">BatchResponsePart</span><span class="o">&gt;</span> <span class="n">batchResponseParts</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">BatchResponsePart</span><span class="o">&gt;</span><span class="p">();</span>
+    <span class="n">PathInfo</span> <span class="n">pathInfo</span> <span class="p">=</span> <span class="n">getContext</span><span class="p">().</span><span class="n">getPathInfo</span><span class="p">();</span>
+    <span class="n">EntityProviderBatchProperties</span> <span class="n">batchProperties</span> <span class="p">=</span> <span class="n">EntityProviderBatchProperties</span><span class="p">.</span><span class="n">init</span><span class="p">().</span><span class="n">pathInfo</span><span class="p">(</span><span class="n">pathInfo</span><span class="p">).</span><span class="n">build</span><span class="p">();</span>
+    <span class="n">List</span><span class="o">&lt;</span><span class="n">BatchRequestPart</span><span class="o">&gt;</span> <span class="n">batchRequestParts</span> <span class="p">=</span> <span class="n">EntityProvider</span><span class="p">.</span><span class="n">parseBatchRequest</span><span class="p">(</span><span class="n">contentType</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">batchProperties</span><span class="p">);</span>
+    <span class="k">for</span> <span class="p">(</span><span class="n">BatchPart</span> <span class="n">batchPart</span> <span class="p">:</span> <span class="n">batchRequestParts</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">BatchResponsePart</span> <span class="n">processedBatchPart</span> <span class="p">=</span> <span class="n">handler</span><span class="p">.</span><span class="n">handleBatchPart</span><span class="p">(</span><span class="n">batchRequestPart</span><span class="p">)</span>
+      <span class="n">batchResponseParts</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">processedBatchPart</span><span class="p">);</span>
+    <span class="p">}</span>
+    <span class="n">batchResponse</span> <span class="p">=</span> <span class="n">EntityProvider</span><span class="p">.</span><span class="n">writeBatchResponse</span><span class="p">(</span><span class="n">batchResponseParts</span><span class="p">);</span>
+    <span class="k">return</span> <span class="n">batchResponse</span><span class="p">;</span>
+  <span class="p">}</span>
+</pre></div>
+
+
+<p><strong>NOTE:</strong> The parameter batchProperties of the method parseBatchRequest contains OData URI informations as PathInfo-object. These informations are necessary for the parsing, that's why the PathInfo-object should not be null.</p>
+<h5 id="implement-the-method-executechangeset-of-the-class-odatasingleprocessor">Implement the method executeChangeSet of the class ODataSingleProcessor.</h5>
+<p>In order to process a request invoke <code>handler.handleRequest(request)</code>, that delegates a handling of the request to the request handler and provides ODataResponse. 
+Define a rollback semantics that may be applied when a request within a ChangeSet fails. 
+The following example shows a possible implementation:</p>
+<div class="codehilite"><pre><span class="p">@</span><span class="n">Override</span>
+ <span class="n">public</span> <span class="n">BatchResponsePart</span> <span class="n">executeChangeSet</span><span class="p">(</span><span class="n">final</span> <span class="n">BatchHandler</span> <span class="n">handler</span><span class="p">,</span> <span class="n">final</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ODataRequest</span><span class="o">&gt;</span> <span class="n">requests</span><span class="p">)</span> <span class="n">throws</span> <span class="n">ODataException</span> <span class="p">{</span>
+    <span class="n">List</span><span class="o">&lt;</span><span class="n">ODataResponse</span><span class="o">&gt;</span> <span class="n">responses</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ODataResponse</span><span class="o">&gt;</span><span class="p">();</span>
+    <span class="k">for</span> <span class="p">(</span><span class="n">ODataRequest</span> <span class="n">request</span> <span class="p">:</span> <span class="n">requests</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">ODataResponse</span> <span class="n">response</span> <span class="p">=</span> <span class="n">handler</span><span class="p">.</span><span class="n">handleRequest</span><span class="p">(</span><span class="n">request</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">getStatus</span><span class="p">().</span><span class="n">getStatusCode</span><span class="p">()</span> <span class="o">&gt;</span><span class="p">=</span> <span class="n">HttpStatusCodes</span><span class="p">.</span><span class="n">BAD_REQUEST</span><span class="p">.</span><span class="n">getStatusCode</span><span class="p">())</span> <span class="p">{</span>
+        <span class="o">//</span> <span class="n">Rollback</span>
+        <span class="n">List</span><span class="o">&lt;</span><span class="n">ODataResponse</span><span class="o">&gt;</span> <span class="n">errorResponses</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ODataResponse</span><span class="o">&gt;</span><span class="p">(</span>1<span class="p">);</span>
+        <span class="n">errorResponses</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">response</span><span class="p">);</span>
+        <span class="k">return</span> <span class="n">BatchResponsePart</span><span class="p">.</span><span class="n">responses</span><span class="p">(</span><span class="n">errorResponses</span><span class="p">).</span><span class="n">changeSet</span><span class="p">(</span><span class="n">false</span><span class="p">).</span><span class="n">build</span><span class="p">();</span>
+      <span class="p">}</span>
+      <span class="n">responses</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">response</span><span class="p">);</span>
+    <span class="p">}</span>
+    <span class="k">return</span> <span class="n">BatchResponsePart</span><span class="p">.</span><span class="n">responses</span><span class="p">(</span><span class="n">responses</span><span class="p">).</span><span class="n">changeSet</span><span class="p">(</span><span class="n">true</span><span class="p">).</span><span class="n">build</span><span class="p">();</span>
+  <span class="p">}</span>
+</pre></div>
+
+
+<p><strong>NOTE:</strong> If a request within a ChangeSet fails, a Batch Response Part contains only the error response and the flag changeSet is set to false.</p>
+<h5 id="batch-request-body-example">Batch Request Body Example</h5>
+<div class="codehilite"><pre><span class="o">--</span><span class="n">batch_123</span>
+<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">multipart</span><span class="o">/</span><span class="n">mixed</span><span class="p">;</span> <span class="n">boundary</span><span class="p">=</span><span class="n">changeset_321</span>
+
+<span class="o">--</span><span class="n">changeset_321</span>
+<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">application</span><span class="o">/</span><span class="n">http</span>
+<span class="n">Content</span><span class="o">-</span><span class="n">Transfer</span><span class="o">-</span><span class="n">Encoding</span><span class="p">:</span> <span class="n">binary</span>
+
+<span class="n">PUT</span> <span class="n">Employees</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">)</span><span class="o">/</span><span class="n">EmployeeName</span> <span class="n">HTTP</span><span class="o">/</span>1<span class="p">.</span>1
+<span class="n">Content</span><span class="o">-</span><span class="n">Length</span><span class="p">:</span> 100
+<span class="n">DataServiceVersion</span><span class="p">:</span> 1<span class="p">.</span>0
+<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">application</span><span class="o">/</span><span class="n">json</span><span class="p">;</span><span class="n">odata</span><span class="p">=</span><span class="n">verbose</span>
+<span class="n">MaxDataServiceVersion</span><span class="p">:</span> 2<span class="p">.</span>0
+
+<span class="p">{</span>&quot;<span class="n">EmployeeName</span>&quot;<span class="p">:</span>&quot;<span class="n">Frederic</span> <span class="n">Fall</span> <span class="n">MODIFIED</span>&quot;<span class="p">}</span>
+
+<span class="o">--</span><span class="n">changeset_321</span><span class="o">--</span>
+
+<span class="o">--</span><span class="n">batch_123</span>
+<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">application</span><span class="o">/</span><span class="n">http</span>
+<span class="n">Content</span><span class="o">-</span><span class="n">Transfer</span><span class="o">-</span><span class="n">Encoding</span><span class="p">:</span> <span class="n">binary</span>
+
+<span class="n">GET</span> <span class="n">Employees</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">)</span><span class="o">/</span><span class="n">EmployeeName</span>?$<span class="n">format</span><span class="p">=</span><span class="n">json</span> <span class="n">HTTP</span><span class="o">/</span>1<span class="p">.</span>1
+<span class="n">Accept</span><span class="p">:</span> <span class="n">application</span><span class="o">/</span><span class="n">atomsvc</span><span class="o">+</span><span class="n">xml</span><span class="p">;</span><span class="n">q</span><span class="p">=</span>0<span class="p">.</span>8<span class="p">,</span> <span class="n">application</span><span class="o">/</span><span class="n">json</span><span class="p">;</span><span class="n">odata</span><span class="p">=</span><span class="n">verbose</span><span class="p">;</span><span class="n">q</span><span class="p">=</span>0<span class="p">.</span>5<span class="p">,</span> <span class="o">*/*</span><span class="p">;</span><span class="n">q</span><span class="p">=</span>0<span class="p">.</span>1
+<span class="n">MaxDataServiceVersion</span><span class="p">:</span> 2<span class="p">.</span>0
+
+
+<span class="o">--</span><span class="n">batch_123</span><span class="o">--</span>
+</pre></div>
+
+
+<p><strong>NOTE:</strong></p>
+<ul>
+<li>A Content-Type header of the Batch Request must specify a content type of "multipart/mixed" and a boundary parameter. </li>
+<li>Each Batch Part is separated by the boundary string, that must occur at the beginning of a line, following a CRLF. </li>
+<li>The boundary of the ChangeSet should be different from that used by the Batch. </li>
+</ul>
+<h5 id="request-line-of-a-single-request">Request Line of a single request</h5>
+<p>The following request lines of a single request (e.g. a retrieve request) will be accepted:</p>
+<ul>
+<li>GET http://<scheme>/<service_name>/<resource_path> HTTP/1.1 - the request line with an absolute URI </li>
+<li>GET <resource_path> HTTP/1.1 - the request line that contains a relative-path reference 
+Query Options can optionally follow the Resource Path.</li>
+</ul>
+<p><strong>Note:</strong> An absolute-path reference like /<service_name>/<resource_path> will not be accepted</p>
+<h5 id="content-id">Content-ID</h5>
+<p>The new entity may be referenced by subsequent requests within the same ChangeSet by referring to the Content-Id value. $<contentIdValue> acts as an alias for the Resource Path of the new entity.
+In order to refer the new entity the Request URI must begin with $<contentIdValue>:</p>
+<div class="codehilite"><pre><span class="n">POST</span> <span class="n">Customers</span> <span class="n">HTTP</span><span class="o">/</span>1<span class="p">.</span>1
+<span class="n">Content</span><span class="o">-</span><span class="n">ID</span><span class="p">:</span> <span class="n">newCustomer</span>
+<span class="p">...</span>
+<span class="n">PUT</span> $<span class="n">newCustomer</span><span class="o">/</span><span class="n">Name</span> <span class="n">HTTP</span><span class="o">/</span>1<span class="p">.</span>1
+</pre></div>
+
+
+<p><strong>Note:</strong> Requests in different ChangeSets cannot reference one another, even if they are in the same Batch</p>
+<h3 id="references">References</h3>
+<p><a href="http://www.odata.org/documentation/odata-v2-documentation/batch-processing/" title="External Link">http://www.odata.org/documentation/odata-v2-documentation/batch-processing/</a></p>
+            
+            
+            
+            
+            <hr>
+            
+            <footer>
+                <h5>Disclaimer</h5>
+                
+                <p>Apache Olingo™ is an effort undergoing incubation at The Apache Software Foundation (ASF) sponsored by the Apache Incubator PMC. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p>
+                
+                <p>&copy; Copyright 2013 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</p>
+				<hr>
+				<div align="center"><small><a href="/doc/privacy.html">Privacy</a></small></div>
+            </footer>
+            
+        </div> <!-- /container -->
+        
+        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
+        <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.1.min.js"><\/script>')</script>
+        
+        <script src="js/vendor/bootstrap.min.js"></script>
+        
+        <script src="js/main.js"></script>
+        
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-44963757-1', 'apache.org');
+  ga('send', 'pageview');
+
+</script>    </body>
+</html>