Author: buildbot
Date: Tue May 19 07:03:07 2015
New Revision: 951835

Log:
Staging update by buildbot for olingo

Added:
    
websites/staging/olingo/trunk/content/doc/odata4/tutorials/readep/tutorial_readep.html
Removed:
    
websites/staging/olingo/trunk/content/doc/odata4/tutorials/readep/tutorial_readep.md
Modified:
    websites/staging/olingo/trunk/content/   (props changed)

Propchange: websites/staging/olingo/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Tue May 19 07:03:07 2015
@@ -1 +1 @@
-1680189
+1680190

Added: 
websites/staging/olingo/trunk/content/doc/odata4/tutorials/readep/tutorial_readep.html
==============================================================================
--- 
websites/staging/olingo/trunk/content/doc/odata4/tutorials/readep/tutorial_readep.html
 (added)
+++ 
websites/staging/olingo/trunk/content/doc/odata4/tutorials/readep/tutorial_readep.html
 Tue May 19 07:03:07 2015
@@ -0,0 +1,821 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="Apache Olingo 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="author" content="">
+    <link rel="icon" href="/favicon.ico">
+    <title>
+      Apache Olingo Library
+    </title><!-- Bootstrap core CSS -->
+    <link href="/css/bootstrap.css" rel="stylesheet" type="text/css"><!-- 
Custom styles for this template -->
+    <link href="/css/navbar.css" rel="stylesheet" type="text/css"><!-- Just 
for debugging purposes. Don't actually copy these 2 lines! -->
+    <link href="/css/offcanvas.css" rel="stylesheet" type="text/css"><!-- 
Custom styles for this template -->
+    <link rel="stylesheet" href="/css/main.css">
+    <!--[if lt IE 9]><script 
src="/js/ie8-responsive-file-warning.js"></script><![endif]-->
+
+    <script src="/js/ie-emulation-modes-warning.js" type="text/javascript">
+</script><!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
+
+    <script src="/js/ie10-viewport-bug-workaround.js" type="text/javascript">
+</script><!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and 
media queries -->
+    <!--[if lt IE 9]>
+      <script src="/js/html5shiv.min.js"></script>
+      <script src="/js/respond.min.js"></script>
+    <![endif]-->
+  </head>
+
+  <body>
+    <div class="container">
+      <!-- Static navbar -->
+      <div class="navbar navbar-default" role="navigation">
+        <div class="container-fluid">
+          <div class="navbar-header">
+            <button type="button" class="navbar-toggle" data-toggle="collapse" 
data-target=".navbar-collapse">
+              <span class="sr-only">Toggle navigation</span>
+             <span class="icon-bar"></span>
+             <span class="icon-bar"></span>
+             <span class="icon-bar"></span>
+            </button>
+              <img class="navbar-brand" src="/img/OlingoOrangeTM.png" 
style="width:62px;" >
+              <a class="navbar-brand" href="#">Apache Olingo™</a>
+          </div>
+          <div class="navbar-collapse collapse">
+            <ul class="nav navbar-nav">
+
+              <li><a href="/">Home</a></li>
+              <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="http://www.apache.org/licenses/";>License</a></li>
+
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">Download <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                      <li><a href="/doc/odata2/download.html">Download OData 
2.0 Java</a></li>
+                      <li><a href="/doc/odata4/download.html">Download OData 
4.0 Java</a></li>
+                      <li><a href="/doc/javascript/download.html">Download 
OData 4.0 JavaScript</a></li>
+                  </ul>
+              </li>
+
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">Documentation <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                    <li><a href="/doc/odata2/index.html">Documentation OData 
2.0 Java</a></li>
+                    <li><a href="/doc/odata4/index.html">Documentation OData 
4.0 Java</a></li>
+                    <li><a href="/doc/javascript/index.html">Documentation 
OData 4.0 JavaScript</a></li>
+                  </ul>
+              </li>
+              <li><a href="/support.html">Support</a></li>
+
+            </ul>
+
+                         <img class="navbar-right" height="50px" 
src="/img/asf-logo.gif">
+
+                       </div><!--/.nav-collapse -->
+        </div><!--/.container-fluid -->
+      </div><!-- Main component for a primary marketing message or call to 
action --><h1 id="how-to-build-an-odata-service-with-olingo-v4">How to build an 
OData Service with Olingo V4</h1>
+<h2 id="part-2-read-scenario-continued">Part 2: Read scenario continued</h2>
+<h3 id="introduction">Introduction</h3>
+<p>In the first tutorial, we’ve learned how to build a very simple OData 
service.<br />
+That service exposes its metadata and allows reading a list of products.<br />
+It doesn’t support accessing the URL for a single product.<br />
+And it also doesn’t support reading a single property of a product.<br />
+These 2 topics will be covered in the present tutorial.  </p>
+<p>Note that this tutorial doesn’t cover modifying operations like create, 
update and delete.
+Such operations will be the focus of the Olingo V4 tutorial no. 3</p>
+<p><strong>Note</strong><br />
+The full implementation of the OData service as described in the present 
tutorial can be found in the attached zip file that contains an Eclipse project 
that can be imported into your Eclipse workspace.</p>
+<p><strong>Disclaimer</strong><br />
+Again, in the present tutorial, We will focus only on the relevant 
implementation, in order to keep the code small and simple.
+The sample code shouldn't be reused for advanced scenarios.</p>
+<p><strong>Table of Contents</strong></p>
+<ol>
+<li>Prerequisites</li>
+<li>Preparation<ol>
+<li>Create data class</li>
+<li>Adapt the servlet class</li>
+<li>Modify the DemoEntityCollectionProcessor</li>
+<li>Create utility class</li>
+</ol>
+</li>
+<li>Implementation of Read Single Entity<ol>
+<li>Implement the EntityProcessor interface</li>
+<li>Adapt the DemoServlet class</li>
+<li>Run the service</li>
+</ol>
+</li>
+<li>Implementation of Read Single Property<ol>
+<li>Implement the PrimitiveProcessor interface</li>
+<li>Adapt the DemoServlet class</li>
+<li>Run the service</li>
+</ol>
+</li>
+<li>Summary</li>
+<li>Links</li>
+<li>Appendix: PrimitiveValueProcessor</li>
+</ol>
+<h1 id="1-prerequisites">1. Prerequisites</h1>
+<p>Follow <a 
href="http://olingo.apache.org/doc/odata4/tutorials/read/tutorial_read.html";>Tutorial
 Part 1: Read Entity Collection</a>, which also covers setting up the 
environment and running the service.</p>
+<h1 id="2-preparation">2. Preparation</h1>
+<p>Follow the <a 
href="http://olingo.apache.org/doc/odata4/tutorials/read/tutorial_read.html";>Tutorial
 Part 1: Read Entity Collection</a> or import the  <a 
href="http://olingo.apache.org/doc/odata4/tutorials/read/sample/DemoService_Tutorial_Read.zip";>sample
 project</a> into your Eclipse workspace.<br />
+Afterwards do a <em>Deploy and run</em>: it should be working.<br />
+Before we start with the actual tutorial, we need to adapt the existing code 
to meet the requirements of the present tutorial.</p>
+<h2 id="21-create-a-new-data-class">2.1. Create a new data-class</h2>
+<p>In the first tutorial, we had created a single method called 
<code>getData()</code> to provide sample data for the list of products.
+Handling the sample data will get a bit more advanced from now on, so we move 
the code into a separate class.</p>
+<p>Create a new package <em>myservice.mynamespace.data</em><br />
+Within this package, create a new class <em>Storage.java</em> to simulate the 
data layer (in a real scenario, this would be e.g. a database or any other data 
storage)</p>
+<p>Here’s the full implementation of this class:</p>
+<div class="codehilite"><pre><span class="kn">package</span> <span 
class="n">myservice</span><span class="o">.</span><span 
class="na">mynamespace</span><span class="o">.</span><span 
class="na">data</span><span class="o">;</span>
+
+<span class="kn">import</span> <span 
class="nn">java.util.ArrayList</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.util.List</span><span 
class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.util.Locale</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">myservice.mynamespace.service.DemoEdmProvider</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">myservice.mynamespace.util.Util</span><span class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.data.Entity</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.data.EntityCollection</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.data.Property</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.data.ValueType</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.edm.EdmEntitySet</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.edm.EdmEntityType</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.http.HttpStatusCode</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.server.api.ODataApplicationException</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.server.api.uri.UriParameter</span><span 
class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span 
class="nc">Storage</span> <span class="o">{</span>
+
+    <span class="kd">private</span> <span class="n">List</span><span 
class="o">&lt;</span><span class="n">Entity</span><span class="o">&gt;</span> 
<span class="n">productList</span><span class="o">;</span>
+
+    <span class="kd">public</span> <span class="nf">Storage</span><span 
class="o">()</span> <span class="o">{</span>
+        <span class="n">productList</span> <span class="o">=</span> <span 
class="k">new</span> <span class="n">ArrayList</span><span 
class="o">&lt;</span><span class="n">Entity</span><span class="o">&gt;();</span>
+        <span class="n">initSampleData</span><span class="o">();</span>
+    <span class="o">}</span>
+
+    <span class="cm">/* PUBLIC FACADE */</span>
+
+    <span class="kd">public</span> <span class="n">EntityCollection</span> 
<span class="nf">readEntitySetData</span><span class="o">(</span><span 
class="n">EdmEntitySet</span> <span class="n">edmEntitySet</span><span 
class="o">)</span><span class="kd">throws</span> <span 
class="n">ODataApplicationException</span><span class="o">{</span>
+        <span class="c1">// actually, this is only required if we have more 
than one Entity Sets</span>
+        <span class="k">if</span><span class="o">(</span><span 
class="n">edmEntitySet</span><span class="o">.</span><span 
class="na">getName</span><span class="o">().</span><span 
class="na">equals</span><span class="o">(</span><span 
class="n">DemoEdmProvider</span><span class="o">.</span><span 
class="na">ES_PRODUCTS_NAME</span><span class="o">)){</span>
+            <span class="k">return</span> <span 
class="nf">getProducts</span><span class="o">();</span>
+        <span class="o">}</span>
+
+        <span class="k">return</span> <span class="kc">null</span><span 
class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="n">Entity</span> <span 
class="nf">readEntityData</span><span class="o">(</span><span 
class="n">EdmEntitySet</span> <span class="n">edmEntitySet</span><span 
class="o">,</span> <span class="n">List</span><span class="o">&lt;</span><span 
class="n">UriParameter</span><span class="o">&gt;</span> <span 
class="n">keyParams</span><span class="o">)</span> <span 
class="kd">throws</span> <span class="n">ODataApplicationException</span><span 
class="o">{</span>
+
+        <span class="n">EdmEntityType</span> <span 
class="n">edmEntityType</span> <span class="o">=</span> <span 
class="n">edmEntitySet</span><span class="o">.</span><span 
class="na">getEntityType</span><span class="o">();</span>
+
+        <span class="c1">// actually, this is only required if we have more 
than one Entity Type</span>
+        <span class="k">if</span><span class="o">(</span><span 
class="n">edmEntityType</span><span class="o">.</span><span 
class="na">getName</span><span class="o">().</span><span 
class="na">equals</span><span class="o">(</span><span 
class="n">DemoEdmProvider</span><span class="o">.</span><span 
class="na">ET_PRODUCT_NAME</span><span class="o">)){</span>
+            <span class="k">return</span> <span 
class="nf">getProduct</span><span class="o">(</span><span 
class="n">edmEntityType</span><span class="o">,</span> <span 
class="n">keyParams</span><span class="o">);</span>
+        <span class="o">}</span>
+
+        <span class="k">return</span> <span class="kc">null</span><span 
class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="cm">/*  INTERNAL */</span>
+
+    <span class="kd">private</span> <span class="n">EntityCollection</span> 
<span class="nf">getProducts</span><span class="o">(){</span>
+        <span class="n">EntityCollection</span> <span 
class="n">retEntitySet</span> <span class="o">=</span> <span 
class="k">new</span> <span class="n">EntityCollection</span><span 
class="o">();</span>
+
+        <span class="k">for</span><span class="o">(</span><span 
class="n">Entity</span> <span class="n">productEntity</span> <span 
class="o">:</span> <span class="k">this</span><span class="o">.</span><span 
class="na">productList</span><span class="o">){</span>
+               <span class="n">retEntitySet</span><span 
class="o">.</span><span class="na">getEntities</span><span 
class="o">().</span><span class="na">add</span><span class="o">(</span><span 
class="n">productEntity</span><span class="o">);</span>
+        <span class="o">}</span>
+
+        <span class="k">return</span> <span class="n">retEntitySet</span><span 
class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">private</span> <span class="n">Entity</span> <span 
class="nf">getProduct</span><span class="o">(</span><span 
class="n">EdmEntityType</span> <span class="n">edmEntityType</span><span 
class="o">,</span> <span class="n">List</span><span class="o">&lt;</span><span 
class="n">UriParameter</span><span class="o">&gt;</span> <span 
class="n">keyParams</span><span class="o">)</span> <span 
class="kd">throws</span> <span class="n">ODataApplicationException</span><span 
class="o">{</span>
+
+        <span class="c1">// the list of entities at runtime</span>
+        <span class="n">EntityCollection</span> <span 
class="n">rt_entitySet</span> <span class="o">=</span> <span 
class="n">getProducts</span><span class="o">();</span>
+
+        <span class="cm">/*  generic approach  to find the requested entity 
*/</span>
+        <span class="n">Entity</span> <span 
class="n">rt_requestedEntity</span> <span class="o">=</span> <span 
class="n">Util</span><span class="o">.</span><span 
class="na">findEntity</span><span class="o">(</span><span 
class="n">edmEntityType</span><span class="o">,</span> <span 
class="n">rt_entitySet</span><span class="o">,</span> <span 
class="n">keyParams</span><span class="o">);</span>
+
+        <span class="k">if</span><span class="o">(</span><span 
class="n">rt_requestedEntity</span> <span class="o">==</span> <span 
class="kc">null</span><span class="o">){</span>
+            <span class="c1">// this variable is null if our data doesn&#39;t 
contain an entity for the requested key</span>
+            <span class="c1">// Throw suitable exception</span>
+            <span class="k">throw</span> <span class="k">new</span> <span 
class="nf">ODataApplicationException</span><span class="o">(</span><span 
class="s">&quot;Entity for requested key doesn&#39;t exist&quot;</span><span 
class="o">,</span>
+                                <span class="n">HttpStatusCode</span><span 
class="o">.</span><span class="na">NOT_FOUND</span><span 
class="o">.</span><span class="na">getStatusCode</span><span 
class="o">(),</span> <span class="n">Locale</span><span class="o">.</span><span 
class="na">ENGLISH</span><span class="o">);</span>
+        <span class="o">}</span>
+
+        <span class="k">return</span> <span 
class="n">rt_requestedEntity</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="cm">/* HELPER */</span>
+
+    <span class="kd">private</span> <span class="kt">void</span> <span 
class="nf">initSampleData</span><span class="o">(){</span>
+        <span class="c1">// add some sample product entities</span>
+        <span class="n">productList</span><span class="o">.</span><span 
class="na">add</span><span class="o">(</span><span class="k">new</span> <span 
class="n">Entity</span><span class="o">()</span>
+            <span class="o">.</span><span class="na">addProperty</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">Property</span><span class="o">(</span><span 
class="kc">null</span><span class="o">,</span> <span 
class="s">&quot;ID&quot;</span><span class="o">,</span> <span 
class="n">ValueType</span><span class="o">.</span><span 
class="na">PRIMITIVE</span><span class="o">,</span> <span 
class="mi">1</span><span class="o">))</span>
+            <span class="o">.</span><span class="na">addProperty</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">Property</span><span class="o">(</span><span 
class="kc">null</span><span class="o">,</span> <span 
class="s">&quot;Name&quot;</span><span class="o">,</span> <span 
class="n">ValueType</span><span class="o">.</span><span 
class="na">PRIMITIVE</span><span class="o">,</span> <span 
class="s">&quot;Notebook Basic 15&quot;</span><span class="o">))</span>
+            <span class="o">.</span><span class="na">addProperty</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">Property</span><span class="o">(</span><span 
class="kc">null</span><span class="o">,</span> <span 
class="s">&quot;Description&quot;</span><span class="o">,</span> <span 
class="n">ValueType</span><span class="o">.</span><span 
class="na">PRIMITIVE</span><span class="o">,</span>
+                                    <span class="s">&quot;Notebook Basic, 
1.7GHz - 15 XGA - 1024MB DDR2 SDRAM - 40GB&quot;</span><span 
class="o">)));</span>
+
+        <span class="n">productList</span><span class="o">.</span><span 
class="na">add</span><span class="o">(</span><span class="k">new</span> <span 
class="n">Entity</span><span class="o">()</span>
+            <span class="o">.</span><span class="na">addProperty</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">Property</span><span class="o">(</span><span 
class="kc">null</span><span class="o">,</span> <span 
class="s">&quot;ID&quot;</span><span class="o">,</span> <span 
class="n">ValueType</span><span class="o">.</span><span 
class="na">PRIMITIVE</span><span class="o">,</span> <span 
class="mi">2</span><span class="o">))</span>
+            <span class="o">.</span><span class="na">addProperty</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">Property</span><span class="o">(</span><span 
class="kc">null</span><span class="o">,</span> <span 
class="s">&quot;Name&quot;</span><span class="o">,</span> <span 
class="n">ValueType</span><span class="o">.</span><span 
class="na">PRIMITIVE</span><span class="o">,</span> <span class="s">&quot;1UMTS 
PDA&quot;</span><span class="o">))</span>
+            <span class="o">.</span><span class="na">addProperty</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">Property</span><span class="o">(</span><span 
class="kc">null</span><span class="o">,</span> <span 
class="s">&quot;Description&quot;</span><span class="o">,</span> <span 
class="n">ValueType</span><span class="o">.</span><span 
class="na">PRIMITIVE</span><span class="o">,</span>
+                                <span class="s">&quot;Ultrafast 3G UMTS/HSDPA 
Pocket PC, supports GSM network&quot;</span><span class="o">)));</span>
+
+        <span class="n">productList</span><span class="o">.</span><span 
class="na">add</span><span class="o">(</span><span class="k">new</span> <span 
class="n">Entity</span><span class="o">()</span>
+            <span class="o">.</span><span class="na">addProperty</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">Property</span><span class="o">(</span><span 
class="kc">null</span><span class="o">,</span> <span 
class="s">&quot;ID&quot;</span><span class="o">,</span> <span 
class="n">ValueType</span><span class="o">.</span><span 
class="na">PRIMITIVE</span><span class="o">,</span> <span 
class="mi">3</span><span class="o">))</span>
+            <span class="o">.</span><span class="na">addProperty</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">Property</span><span class="o">(</span><span 
class="kc">null</span><span class="o">,</span> <span 
class="s">&quot;Name&quot;</span><span class="o">,</span> <span 
class="n">ValueType</span><span class="o">.</span><span 
class="na">PRIMITIVE</span><span class="o">,</span> <span class="s">&quot;Ergo 
Screen&quot;</span><span class="o">))</span>
+            <span class="o">.</span><span class="na">addProperty</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">Property</span><span class="o">(</span><span 
class="kc">null</span><span class="o">,</span> <span 
class="s">&quot;Description&quot;</span><span class="o">,</span> <span 
class="n">ValueType</span><span class="o">.</span><span 
class="na">PRIMITIVE</span><span class="o">,</span>
+                                <span class="s">&quot;19 Optimum Resolution 
1024 x 768 @ 85Hz, resolution 1280 x 960&quot;</span><span class="o">)));</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>The <em>Public Façade</em> contains the methods that are called from 
outside.<br />
+They are data-layer-agnostic; their parameters are objects from the OData 
world.<br />
+The implementation of these methods simply delegates the logic to the internal 
methods.  </p>
+<p>The <em>internal</em> methods do know about the names of tables or columns 
and these methods know how to e.g. find a single product.</p>
+<h2 id="22-adapt-the-servlet-class">2.2. Adapt the servlet class</h2>
+<p>The <code>Data-Storage</code> class will be instantiated in the 
<code>DemoServlet</code> class and attached to the HTTP-session.<br />
+This has the advantage that our final OData service can be tested and the 
sample data can be changed and the changes will remain active until the session 
is closed.</p>
+<p>Open the class <code>myservice.mynamespace.web.DemoServlet</code></p>
+<p>Change the code such that it looks as follows:</p>
+<div class="codehilite"><pre><span class="kd">protected</span> <span 
class="kt">void</span> <span class="nf">service</span><span 
class="o">(</span><span class="n">HttpServletRequest</span> <span 
class="n">req</span><span class="o">,</span> <span 
class="n">HttpServletResponse</span> <span class="n">resp</span><span 
class="o">)</span> <span class="kd">throws</span> <span 
class="n">ServletException</span><span class="o">,</span> <span 
class="n">IOException</span> <span class="o">{</span>
+    <span class="k">try</span> <span class="o">{</span>
+        <span class="n">HttpSession</span> <span class="n">session</span> 
<span class="o">=</span> <span class="n">req</span><span 
class="o">.</span><span class="na">getSession</span><span 
class="o">(</span><span class="kc">true</span><span class="o">);</span>
+        <span class="n">Storage</span> <span class="n">storage</span> <span 
class="o">=</span> <span class="o">(</span><span class="n">Storage</span><span 
class="o">)</span> <span class="n">session</span><span class="o">.</span><span 
class="na">getAttribute</span><span class="o">(</span><span 
class="n">Storage</span><span class="o">.</span><span 
class="na">class</span><span class="o">.</span><span 
class="na">getName</span><span class="o">());</span>
+        <span class="k">if</span> <span class="o">(</span><span 
class="n">storage</span> <span class="o">==</span> <span 
class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+           <span class="n">storage</span> <span class="o">=</span> <span 
class="k">new</span> <span class="n">Storage</span><span class="o">();</span>
+           <span class="n">session</span><span class="o">.</span><span 
class="na">setAttribute</span><span class="o">(</span><span 
class="n">Storage</span><span class="o">.</span><span 
class="na">class</span><span class="o">.</span><span 
class="na">getName</span><span class="o">(),</span> <span 
class="n">storage</span><span class="o">);</span>
+        <span class="o">}</span>
+
+        <span class="c1">// create odata handler and configure it with 
EdmProvider and Processor</span>
+        <span class="n">OData</span> <span class="n">odata</span> <span 
class="o">=</span> <span class="n">OData</span><span class="o">.</span><span 
class="na">newInstance</span><span class="o">();</span>
+        <span class="n">ServiceMetadata</span> <span class="n">edm</span> 
<span class="o">=</span> <span class="n">odata</span><span 
class="o">.</span><span class="na">createServiceMetadata</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">DemoEdmProvider</span><span class="o">(),</span> <span 
class="k">new</span> <span class="n">ArrayList</span><span 
class="o">&lt;</span><span class="n">EdmxReference</span><span 
class="o">&gt;());</span>
+        <span class="n">ODataHttpHandler</span> <span class="n">handler</span> 
<span class="o">=</span> <span class="n">odata</span><span 
class="o">.</span><span class="na">createHandler</span><span 
class="o">(</span><span class="n">edm</span><span class="o">);</span>
+        <span class="n">handler</span><span class="o">.</span><span 
class="na">register</span><span class="o">(</span><span class="k">new</span> 
<span class="n">DemoEntityCollectionProcessor</span><span 
class="o">(</span><span class="n">storage</span><span class="o">));</span>
+</pre></div>
+
+
+<p>Note that we pass the instance of the <code>Storage</code> object to the 
constructor of our existing <code>DemoEntityCollectionProcessor</code>.</p>
+<p>So the next step is to adapt the <code>DemoEntityCollectionProcessor</code> 
class.</p>
+<h2 id="23-modify-the-demoentitycollectionprocessor">2.3. Modify the 
DemoEntityCollectionProcessor</h2>
+<p>In the <code>DemoEntityCollectionProcessor</code> class that we created in 
the first tutorial, we have to make 3 changes:</p>
+<h3 id="231-create-constructor">2.3.1 Create Constructor</h3>
+<p>We have to create a Constructor that takes the <code>Storage</code> 
instance and stores it as a member variable:</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span 
class="kd">class</span> <span class="nc">DemoEntityCollectionProcessor</span> 
<span class="kd">implements</span> <span 
class="n">EntityCollectionProcessor</span> <span class="o">{</span>
+
+    <span class="kd">private</span> <span class="n">OData</span> <span 
class="n">odata</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="n">Storage</span> <span 
class="n">storage</span><span class="o">;</span>
+
+    <span class="kd">public</span> <span 
class="nf">DemoEntityCollectionProcessor</span><span class="o">(</span><span 
class="n">Storage</span> <span class="n">storage</span><span class="o">)</span> 
<span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span 
class="na">storage</span> <span class="o">=</span> <span 
class="n">storage</span><span class="o">;</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<h3 id="232-delete-the-getdata-method">2.3.2. Delete the getData() method</h3>
+<p>The code that we had written in this method has been moved to the 
<code>init()</code> method of the Storage class.
+So we can delete this <code>getData()</code> method.</p>
+<h3 id="233-adapt-the-usage-of-the-getdata-method">2.3.3. Adapt the usage of 
the getData() method</h3>
+<p>After deleting the <code>getData()</code> method, we get a compile error in 
the line where this method is used.
+We replace this method invocation with a call to our <code>Storage</code> 
object:</p>
+<div class="codehilite"><pre><span class="n">EntitySet</span> <span 
class="n">entitySet</span> <span class="o">=</span> <span 
class="n">storage</span><span class="o">.</span><span 
class="na">readEntitySetData</span><span class="o">(</span><span 
class="n">edmEntitySet</span><span class="o">);</span>
+</pre></div>
+
+
+<p>The new code looks as follows:</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span 
class="kt">void</span> <span class="nf">readEntityCollection</span><span 
class="o">(</span><span class="n">ODataRequest</span> <span 
class="n">request</span><span class="o">,</span> <span 
class="n">ODataResponse</span> <span class="n">response</span><span 
class="o">,</span>
+                                <span class="n">UriInfo</span> <span 
class="n">uriInfo</span><span class="o">,</span> <span 
class="n">ContentType</span> <span class="n">responseFormat</span><span 
class="o">)</span>
+                                <span class="kd">throws</span> <span 
class="n">ODataApplicationException</span><span class="o">,</span> <span 
class="n">SerializerException</span> <span class="o">{</span>
+
+    <span class="c1">// 1st retrieve the requested EntitySet from the uriInfo 
(representation of the parsed URI)</span>
+    <span class="n">List</span><span class="o">&lt;</span><span 
class="n">UriResource</span><span class="o">&gt;</span> <span 
class="n">resourcePaths</span> <span class="o">=</span> <span 
class="n">uriInfo</span><span class="o">.</span><span 
class="na">getUriResourceParts</span><span class="o">();</span>
+    <span class="c1">// in our example, the first segment is the 
EntitySet</span>
+    <span class="n">UriResourceEntitySet</span> <span 
class="n">uriResourceEntitySet</span> <span class="o">=</span> <span 
class="o">(</span><span class="n">UriResourceEntitySet</span><span 
class="o">)</span> <span class="n">resourcePaths</span><span 
class="o">.</span><span class="na">get</span><span class="o">(</span><span 
class="mi">0</span><span class="o">);</span>
+    <span class="n">EdmEntitySet</span> <span class="n">edmEntitySet</span> 
<span class="o">=</span> <span class="n">uriResourceEntitySet</span><span 
class="o">.</span><span class="na">getEntitySet</span><span class="o">();</span>
+
+    <span class="c1">// 2nd: fetch the data from backend for this requested 
EntitySetName and deliver as EntitySet</span>
+    <span class="n">EntityCollection</span> <span 
class="n">entityCollection</span> <span class="o">=</span> <span 
class="n">storage</span><span class="o">.</span><span 
class="na">readEntitySetData</span><span class="o">(</span><span 
class="n">edmEntitySet</span><span class="o">);</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<h2 id="24-create-utility-class">2.4. Create utility class</h2>
+<p>Furthermore, we create one more class, to  host a few helper methods.<br />
+Create package <code>myservice.mynamespace.util</code>
+Within this package, create a class <code>Util.java</code></p>
+<p>Copy the following code into this class:</p>
+<div class="codehilite"><pre><span class="kn">package</span> <span 
class="n">myservice</span><span class="o">.</span><span 
class="na">mynamespace</span><span class="o">.</span><span 
class="na">util</span><span class="o">;</span>
+
+<span class="kn">import</span> <span class="nn">java.util.List</span><span 
class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.util.Locale</span><span 
class="o">;</span>
+
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.data.Entity</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.data.EntityCollection</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.edm.EdmEntitySet</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.edm.EdmEntityType</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.edm.EdmPrimitiveType</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException</span><span
 class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.edm.EdmProperty</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.edm.EdmType</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.commons.api.http.HttpStatusCode</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.server.api.ODataApplicationException</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.server.api.uri.UriInfoResource</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.server.api.uri.UriParameter</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.server.api.uri.UriResource</span><span 
class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.olingo.server.api.uri.UriResourceEntitySet</span><span 
class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span 
class="nc">Util</span> <span class="o">{</span>
+
+    <span class="kd">public</span> <span class="kd">static</span> <span 
class="n">EdmEntitySet</span> <span class="nf">getEdmEntitySet</span><span 
class="o">(</span><span class="n">UriInfoResource</span> <span 
class="n">uriInfo</span><span class="o">)</span> <span class="kd">throws</span> 
<span class="n">ODataApplicationException</span> <span class="o">{</span>
+
+        <span class="n">List</span><span class="o">&lt;</span><span 
class="n">UriResource</span><span class="o">&gt;</span> <span 
class="n">resourcePaths</span> <span class="o">=</span> <span 
class="n">uriInfo</span><span class="o">.</span><span 
class="na">getUriResourceParts</span><span class="o">();</span>
+         <span class="c1">// To get the entity set we have to interpret all 
URI segments</span>
+        <span class="k">if</span> <span class="o">(!(</span><span 
class="n">resourcePaths</span><span class="o">.</span><span 
class="na">get</span><span class="o">(</span><span class="mi">0</span><span 
class="o">)</span> <span class="k">instanceof</span> <span 
class="n">UriResourceEntitySet</span><span class="o">))</span> <span 
class="o">{</span>
+            <span class="k">throw</span> <span class="k">new</span> <span 
class="nf">ODataApplicationException</span><span class="o">(</span><span 
class="s">&quot;Invalid resource type for first segment.&quot;</span><span 
class="o">,</span>
+                                    <span class="n">HttpStatusCode</span><span 
class="o">.</span><span class="na">NOT_IMPLEMENTED</span><span 
class="o">.</span><span class="na">getStatusCode</span><span 
class="o">(),</span><span class="n">Locale</span><span class="o">.</span><span 
class="na">ENGLISH</span><span class="o">);</span>
+        <span class="o">}</span>
+
+        <span class="n">UriResourceEntitySet</span> <span 
class="n">uriResource</span> <span class="o">=</span> <span 
class="o">(</span><span class="n">UriResourceEntitySet</span><span 
class="o">)</span> <span class="n">resourcePaths</span><span 
class="o">.</span><span class="na">get</span><span class="o">(</span><span 
class="mi">0</span><span class="o">);</span>
+
+        <span class="k">return</span> <span class="n">uriResource</span><span 
class="o">.</span><span class="na">getEntitySet</span><span class="o">();</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kd">static</span> <span 
class="n">Entity</span> <span class="nf">findEntity</span><span 
class="o">(</span><span class="n">EdmEntityType</span> <span 
class="n">edmEntityType</span><span class="o">,</span>
+                                    <span class="n">EntityCollection</span> 
<span class="n">rt_entitySet</span><span class="o">,</span> <span 
class="n">List</span><span class="o">&lt;</span><span 
class="n">UriParameter</span><span class="o">&gt;</span> <span 
class="n">keyParams</span><span class="o">)</span>
+                                    <span class="kd">throws</span> <span 
class="n">ODataApplicationException</span> <span class="o">{</span>
+
+        <span class="n">List</span><span class="o">&lt;</span><span 
class="n">Entity</span><span class="o">&gt;</span> <span 
class="n">entityList</span> <span class="o">=</span> <span 
class="n">rt_entitySet</span><span class="o">.</span><span 
class="na">getEntities</span><span class="o">();</span>
+
+        <span class="c1">// loop over all entities in order to find that one 
that matches all keys in request</span>
+        <span class="c1">// an example could be e.g. contacts(ContactID=1, 
CompanyID=1)</span>
+        <span class="k">for</span><span class="o">(</span><span 
class="n">Entity</span> <span class="n">rt_entity</span> <span 
class="o">:</span> <span class="n">entityList</span><span class="o">){</span>
+            <span class="kt">boolean</span> <span class="n">foundEntity</span> 
<span class="o">=</span> <span class="n">entityMatchesAllKeys</span><span 
class="o">(</span><span class="n">edmEntityType</span><span class="o">,</span> 
<span class="n">rt_entity</span><span class="o">,</span> <span 
class="n">keyParams</span><span class="o">);</span>
+            <span class="k">if</span><span class="o">(</span><span 
class="n">foundEntity</span><span class="o">){</span>
+                <span class="k">return</span> <span 
class="n">rt_entity</span><span class="o">;</span>
+            <span class="o">}</span>
+        <span class="o">}</span>
+
+        <span class="k">return</span> <span class="kc">null</span><span 
class="o">;</span>
+    <span class="o">}</span>
+
+
+    <span class="kd">public</span> <span class="kd">static</span> <span 
class="kt">boolean</span> <span class="nf">entityMatchesAllKeys</span><span 
class="o">(</span><span class="n">EdmEntityType</span> <span 
class="n">edmEntityType</span><span class="o">,</span> <span 
class="n">Entity</span> <span class="n">rt_entity</span><span 
class="o">,</span>  <span class="n">List</span><span class="o">&lt;</span><span 
class="n">UriParameter</span><span class="o">&gt;</span> <span 
class="n">keyParams</span><span class="o">)</span>
+                                                <span class="kd">throws</span> 
<span class="n">ODataApplicationException</span> <span class="o">{</span>
+
+        <span class="c1">// loop over all keys</span>
+        <span class="k">for</span> <span class="o">(</span><span 
class="kd">final</span> <span class="n">UriParameter</span> <span 
class="n">key</span> <span class="o">:</span> <span 
class="n">keyParams</span><span class="o">)</span> <span class="o">{</span>
+            <span class="c1">// key</span>
+            <span class="n">String</span> <span class="n">keyName</span> <span 
class="o">=</span> <span class="n">key</span><span class="o">.</span><span 
class="na">getName</span><span class="o">();</span>
+            <span class="n">String</span> <span class="n">keyText</span> <span 
class="o">=</span> <span class="n">key</span><span class="o">.</span><span 
class="na">getText</span><span class="o">();</span>
+
+            <span class="c1">// Edm: we need this info for the comparison 
below</span>
+            <span class="n">EdmProperty</span> <span 
class="n">edmKeyProperty</span> <span class="o">=</span> <span 
class="o">(</span><span class="n">EdmProperty</span> <span 
class="o">)</span><span class="n">edmEntityType</span><span 
class="o">.</span><span class="na">getProperty</span><span 
class="o">(</span><span class="n">keyName</span><span class="o">);</span>
+            <span class="n">Boolean</span> <span class="n">isNullable</span> 
<span class="o">=</span> <span class="n">edmKeyProperty</span><span 
class="o">.</span><span class="na">isNullable</span><span class="o">();</span>
+            <span class="n">Integer</span> <span class="n">maxLength</span> 
<span class="o">=</span> <span class="n">edmKeyProperty</span><span 
class="o">.</span><span class="na">getMaxLength</span><span class="o">();</span>
+            <span class="n">Integer</span> <span class="n">precision</span> 
<span class="o">=</span> <span class="n">edmKeyProperty</span><span 
class="o">.</span><span class="na">getPrecision</span><span class="o">();</span>
+            <span class="n">Boolean</span> <span class="n">isUnicode</span> 
<span class="o">=</span> <span class="n">edmKeyProperty</span><span 
class="o">.</span><span class="na">isUnicode</span><span class="o">();</span>
+            <span class="n">Integer</span> <span class="n">scale</span> <span 
class="o">=</span> <span class="n">edmKeyProperty</span><span 
class="o">.</span><span class="na">getScale</span><span class="o">();</span>
+            <span class="c1">// get the EdmType in order to compare</span>
+            <span class="n">EdmType</span> <span class="n">edmType</span> 
<span class="o">=</span> <span class="n">edmKeyProperty</span><span 
class="o">.</span><span class="na">getType</span><span class="o">();</span>
+            <span class="c1">//if(EdmType instanceof EdmPrimitiveType) // do 
we need this?</span>
+            <span class="n">EdmPrimitiveType</span> <span 
class="n">edmPrimitiveType</span> <span class="o">=</span> <span 
class="o">(</span><span class="n">EdmPrimitiveType</span><span 
class="o">)</span><span class="n">edmType</span><span class="o">;</span>
+
+            <span class="c1">// Runtime data: the value of the current 
entity</span>
+            <span class="n">Object</span> <span class="n">valueObject</span> 
<span class="o">=</span> <span class="n">rt_entity</span><span 
class="o">.</span><span class="na">getProperty</span><span 
class="o">(</span><span class="n">keyName</span><span class="o">).</span><span 
class="na">getValue</span><span class="o">();</span> <span class="c1">// 
null-check is done in FWK</span>
+
+            <span class="c1">// now need to compare the valueObject with the 
keyText String</span>
+            <span class="c1">// this is done using the type.valueToString 
//</span>
+            <span class="n">String</span> <span class="n">valueAsString</span> 
<span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+            <span class="k">try</span> <span class="o">{</span>
+                <span class="n">valueAsString</span> <span class="o">=</span> 
<span class="n">edmPrimitiveType</span><span class="o">.</span><span 
class="na">valueToString</span><span class="o">(</span><span 
class="n">valueObject</span><span class="o">,</span> <span 
class="n">isNullable</span><span class="o">,</span> <span 
class="n">maxLength</span><span class="o">,</span>
+                                                                <span 
class="n">precision</span><span class="o">,</span> <span 
class="n">scale</span><span class="o">,</span> <span 
class="n">isUnicode</span><span class="o">);</span>
+            <span class="o">}</span> <span class="k">catch</span> <span 
class="o">(</span><span class="n">EdmPrimitiveTypeException</span> <span 
class="n">e</span><span class="o">)</span> <span class="o">{</span>
+                <span class="k">throw</span> <span class="k">new</span> <span 
class="nf">ODataApplicationException</span><span class="o">(</span><span 
class="s">&quot;Failed to retrieve String value&quot;</span><span 
class="o">,</span>
+                                             <span 
class="n">HttpStatusCode</span><span class="o">.</span><span 
class="na">INTERNAL_SERVER_ERROR</span><span class="o">.</span><span 
class="na">getStatusCode</span><span class="o">(),</span><span 
class="n">Locale</span><span class="o">.</span><span 
class="na">ENGLISH</span><span class="o">,</span> <span class="n">e</span><span 
class="o">);</span>
+            <span class="o">}</span>
+
+            <span class="k">if</span> <span class="o">(</span><span 
class="n">valueAsString</span> <span class="o">==</span> <span 
class="kc">null</span><span class="o">){</span>
+                <span class="k">return</span> <span 
class="kc">false</span><span class="o">;</span>
+            <span class="o">}</span>
+
+            <span class="kt">boolean</span> <span class="n">matches</span> 
<span class="o">=</span> <span class="n">valueAsString</span><span 
class="o">.</span><span class="na">equals</span><span class="o">(</span><span 
class="n">keyText</span><span class="o">);</span>
+            <span class="k">if</span><span class="o">(!</span><span 
class="n">matches</span><span class="o">){</span>
+                <span class="c1">// if any of the key properties is not found 
in the entity, we don&#39;t need to search further</span>
+                <span class="k">return</span> <span 
class="kc">false</span><span class="o">;</span>
+            <span class="o">}</span>
+        <span class="o">}</span>
+
+        <span class="k">return</span> <span class="kc">true</span><span 
class="o">;</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>These helper methods are going to be used within the implementation of the 
Processor implementations.</p>
+<hr />
+<h1 id="3-implementation-of-read-single-entity">3. Implementation of Read 
Single Entity</h1>
+<p>The user of our sample OData service is enabled to invoke the list of 
products via the following URL:</p>
+<div class="codehilite"><pre><span class="n">http</span><span 
class="p">:</span><span class="o">//</span><span 
class="n">localhost</span><span class="p">:</span>8080<span 
class="o">/</span><span class="n">DemoService</span><span 
class="o">/</span><span class="n">DemoService</span><span 
class="p">.</span><span class="n">svc</span><span class="o">/</span><span 
class="n">Products</span>
+</pre></div>
+
+
+<p>In a next step, he wants to read the details of a single product entity.
+This is done via the following URL:</p>
+<div class="codehilite"><pre><span class="n">http</span><span 
class="p">:</span><span class="o">//</span><span 
class="n">localhost</span><span class="p">:</span>8080<span 
class="o">/</span><span class="n">DemoService</span><span 
class="o">/</span><span class="n">DemoService</span><span 
class="p">.</span><span class="n">svc</span><span class="o">/</span><span 
class="n">Products</span><span class="p">(</span>3<span class="p">)</span>
+</pre></div>
+
+
+<p>From the above URL we can see that the user requests the product which has 
an ID with value 3<br />
+Whenever such a URL is requested, the Olingo library will delegate the request 
to an implementation of the Interface <code>EntityProcessor</code>.</p>
+<p>This means, we have to create a new Java class that implements the 
mentioned interface and we have to register it in the <code>DemoServlet</code> 
class (remember that all Processor-implementations have to be registered 
there).</p>
+<h2 id="31-implement-the-entityprocessor-interface">3.1. Implement the 
EntityProcessor interface</h2>
+<p>The interface 
<code>org.apache.olingo.server.api.processor.EntityProcessor</code> has 5 
methods to implement:</p>
+<ul>
+<li>
+<p><em>init(...)</em><br />
+  Here we are initialized by the Framework to pass the context objects to 
us</p>
+</li>
+<li>
+<p><em>readEntity(…)</em><br />
+  This method is relevant for reading a single entity</p>
+</li>
+<li>
+<p><em>createEntity(…)</em><br />
+  We will ignore this method in the present tutorial</p>
+</li>
+<li>
+<p><em>updateEntity(…)</em><br />
+  We will ignore this method in the present tutorial</p>
+</li>
+<li>
+<p><em>deleteEntity(…)</em><br />
+  We will ignore this method in the present tutorial</p>
+</li>
+</ul>
+<p>Let’s have a look at the implementation.</p>
+<p>First we need to implement the <code>init()</code> method, in order to 
store the <code>OData</code> object.
+Second, as described in the preparation-section, we need to create a 
constructor that takes and stores our <code>Storage</code> instance</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span 
class="kd">class</span> <span class="nc">DemoEntityProcessor</span> <span 
class="kd">implements</span> <span class="n">EntityProcessor</span> <span 
class="o">{</span>
+
+    <span class="kd">private</span> <span class="n">OData</span> <span 
class="n">odata</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="n">ServiceMetadata</span> 
<span class="n">serviceMetadata</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="n">Storage</span> <span 
class="n">storage</span><span class="o">;</span>
+
+    <span class="kd">public</span> <span 
class="nf">DemoEntityProcessor</span><span class="o">(</span><span 
class="n">Storage</span> <span class="n">storage</span><span class="o">)</span> 
<span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span 
class="na">storage</span> <span class="o">=</span> <span 
class="n">storage</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">init</span><span class="o">(</span><span class="n">OData</span> 
<span class="n">odata</span><span class="o">,</span> <span 
class="n">ServiceMetadata</span> <span class="n">serviceMetadata</span><span 
class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span 
class="na">odata</span> <span class="o">=</span> <span 
class="n">odata</span><span class="o">;</span>
+        <span class="k">this</span><span class="o">.</span><span 
class="na">serviceMetadata</span> <span class="o">=</span> <span 
class="n">serviceMetadata</span><span class="o">;</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p><strong>readEntity(...)</strong></p>
+<p>When going through the implementation, let’s keep in mind that the user 
invokes e.g. the following URL</p>
+<div class="codehilite"><pre><span class="n">http</span><span 
class="p">:</span><span class="o">//</span><span 
class="n">localhost</span><span class="p">:</span>8080<span 
class="o">/</span><span class="n">DemoService</span><span 
class="o">/</span><span class="n">DemoService</span><span 
class="p">.</span><span class="n">svc</span><span class="o">/</span><span 
class="n">Products</span><span class="p">(</span>3<span class="p">)</span>
+</pre></div>
+
+
+<p>and he receives the following response in the browser:</p>
+<div class="codehilite"><pre><span class="p">{</span>
+  <span class="err">@odata.context:</span> <span 
class="nt">&quot;$metadata#Products&quot;</span><span class="p">,</span>
+  <span class="err">ID:</span> <span class="err">3,</span>
+  <span class="err">Name:</span> <span class="nt">&quot;Ergo 
Screen&quot;</span><span class="p">,</span>
+  <span class="err">Description:</span> <span class="nt">&quot;19 Optimum 
Resolution 1024 x 768 @ 85Hz, resolution 1280 x 960&quot;</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p><strong>Steps</strong><br />
+The steps to be followed in the implementation of the 
<code>readEntity(...)</code> method are the same that we followed in the 
previous tutorial, when we implemented the 
<code>readEntityCollection(...)</code> method:</p>
+<ol>
+<li>
+<p><strong>Which data is requested?</strong><br />
+    Check the UriInfo instance for information about which 
<em>EntityCollection</em> has been requested.<br />
+    Note that in the code, we directly access the first segment of the URI and 
cast it to <code>UriResourceEntitySet</code></p>
+<p>:::java
+  UriResourceEntitySet uriResourceEntitySet = (UriResourceEntitySet) 
resourcePaths.get(0);</p>
+<p>This is only possible, because in our current sample scenario we only 
support simple URIs. In a real productive OData service, which supports 
navigation and other OData V4 features, the code would be more complex.</p>
+</li>
+<li>
+<p><strong>Fetch the data from backend</strong><br />
+    In the backend, which in our sample is represented by the 
<code>Storage</code> class, we have a list with products.
+    From this list we have to pick that one that is requested by the user.
+    The information, which one is requested, is contained in the so-called 
<em>KeyPredicates</em>.
+    In our OData model, we have only one property that is marked as “key”, 
it is the property with name <em>ID</em>
+    In other models, the key could also be composed by multiple properties. In 
such a case, all key-properties are mentioned in the URI.
+    That’s why the <em>KeyPredicate</em> information is provided as a 
list:</p>
+<div class="codehilite"><pre><span class="n">List</span><span 
class="o">&lt;</span><span class="n">UriParameter</span><span 
class="o">&gt;</span> <span class="n">keyPredicates</span> <span 
class="o">=</span> <span class="n">uriResourceEntitySet</span><span 
class="o">.</span><span class="na">getKeyPredicates</span><span 
class="o">();</span>
+</pre></div>
+
+
+<p>Now our task is to loop over all product entities that we have in our 
backend and to find that one that matches all keys. Which means that we have to 
loop over all key params.
+In our sample code, we have moved this logic to the <em>Util</em> class that 
has a <em>findEntity()</em> method, which loops over all existing product 
entities, and a <em>entityMatchesAllKeys()</em> method that checks if the given 
entity is the right one.</p>
+</li>
+<li>
+<p><strong>Transform the data</strong><br />
+    After fetching the Entity object from the backend, we have to convert it 
to an <code>InputStream</code>, using the proper <code>ODataSerializer</code> 
method:</p>
+<div class="codehilite"><pre><span class="n">ODataSerializer</span> <span 
class="n">serializer</span> <span class="o">=</span> <span 
class="k">this</span><span class="o">.</span><span class="na">odata</span><span 
class="o">.</span><span class="na">createSerializer</span><span 
class="o">(</span><span class="n">oDataFormat</span><span class="o">);</span>
+<span class="n">SerializerResult</span> <span 
class="n">serializerResult</span> <span class="o">=</span> <span 
class="n">serializer</span><span class="o">.</span><span 
class="na">entity</span><span class="o">(</span><span 
class="n">serviceMetadata</span><span class="o">,</span> <span 
class="n">entityType</span><span class="o">,</span> <span 
class="n">entity</span><span class="o">,</span> <span 
class="n">options</span><span class="o">);</span>
+<span class="n">InputStream</span> <span class="n">entityStream</span> <span 
class="o">=</span> <span class="n">serializerResult</span><span 
class="o">.</span><span class="na">getContent</span><span class="o">();</span>
+</pre></div>
+
+
+<p><strong>Note:</strong>
+The <code>ODataSerializer</code> object has to be configured with a 
<code>ContextURL</code> (in case that it is requested) and with 
<code>EntitySerializerOptions</code>. In our sample we keep the code simple, 
since we know that we don’t support advanced operations.</p>
+</li>
+<li>
+<p><strong>Configure the response</strong><br />
+    As usual, we have to set the body, the content type and the HTTP status 
code, as required by the specification.</p>
+</li>
+</ol>
+<p>The following snippet shows the implementation of the 
<code>readEntity(...)</code> method.</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span 
class="kt">void</span> <span class="nf">readEntity</span><span 
class="o">(</span><span class="n">ODataRequest</span> <span 
class="n">request</span><span class="o">,</span> <span 
class="n">ODataResponse</span> <span class="n">response</span><span 
class="o">,</span>
+                        <span class="n">UriInfo</span> <span 
class="n">uriInfo</span><span class="o">,</span> <span 
class="n">ContentType</span> <span class="n">responseFormat</span><span 
class="o">)</span>
+                        <span class="kd">throws</span> <span 
class="n">ODataApplicationException</span><span class="o">,</span> <span 
class="n">SerializerException</span> <span class="o">{</span>
+
+    <span class="c1">// 1. retrieve the Entity Type</span>
+    <span class="n">List</span><span class="o">&lt;</span><span 
class="n">UriResource</span><span class="o">&gt;</span> <span 
class="n">resourcePaths</span> <span class="o">=</span> <span 
class="n">uriInfo</span><span class="o">.</span><span 
class="na">getUriResourceParts</span><span class="o">();</span>
+    <span class="c1">// Note: only in our example we can assume that the first 
segment is the EntitySet</span>
+    <span class="n">UriResourceEntitySet</span> <span 
class="n">uriResourceEntitySet</span> <span class="o">=</span> <span 
class="o">(</span><span class="n">UriResourceEntitySet</span><span 
class="o">)</span> <span class="n">resourcePaths</span><span 
class="o">.</span><span class="na">get</span><span class="o">(</span><span 
class="mi">0</span><span class="o">);</span>
+    <span class="n">EdmEntitySet</span> <span class="n">edmEntitySet</span> 
<span class="o">=</span> <span class="n">uriResourceEntitySet</span><span 
class="o">.</span><span class="na">getEntitySet</span><span class="o">();</span>
+
+    <span class="c1">// 2. retrieve the data from backend</span>
+    <span class="n">List</span><span class="o">&lt;</span><span 
class="n">UriParameter</span><span class="o">&gt;</span> <span 
class="n">keyPredicates</span> <span class="o">=</span> <span 
class="n">uriResourceEntitySet</span><span class="o">.</span><span 
class="na">getKeyPredicates</span><span class="o">();</span>
+    <span class="n">Entity</span> <span class="n">entity</span> <span 
class="o">=</span> <span class="n">storage</span><span class="o">.</span><span 
class="na">readEntityData</span><span class="o">(</span><span 
class="n">edmEntitySet</span><span class="o">,</span> <span 
class="n">keyPredicates</span><span class="o">);</span>
+
+    <span class="c1">// 3. serialize</span>
+    <span class="n">EdmEntityType</span> <span class="n">entityType</span> 
<span class="o">=</span> <span class="n">edmEntitySet</span><span 
class="o">.</span><span class="na">getEntityType</span><span 
class="o">();</span>
+
+    <span class="n">ContextURL</span> <span class="n">contextUrl</span> <span 
class="o">=</span> <span class="n">ContextURL</span><span 
class="o">.</span><span class="na">with</span><span class="o">().</span><span 
class="na">entitySet</span><span class="o">(</span><span 
class="n">edmEntitySet</span><span class="o">).</span><span 
class="na">build</span><span class="o">();</span>
+    <span class="c1">// expand and select currently not supported</span>
+    <span class="n">EntitySerializerOptions</span> <span 
class="n">options</span> <span class="o">=</span> <span 
class="n">EntitySerializerOptions</span><span class="o">.</span><span 
class="na">with</span><span class="o">().</span><span 
class="na">contextURL</span><span class="o">(</span><span 
class="n">contextUrl</span><span class="o">).</span><span 
class="na">build</span><span class="o">();</span>
+
+    <span class="n">ODataFormat</span> <span class="n">oDataFormat</span> 
<span class="o">=</span> <span class="n">ODataFormat</span><span 
class="o">.</span><span class="na">fromContentType</span><span 
class="o">(</span><span class="n">responseFormat</span><span class="o">);</span>
+    <span class="n">ODataSerializer</span> <span class="n">serializer</span> 
<span class="o">=</span> <span class="k">this</span><span 
class="o">.</span><span class="na">odata</span><span class="o">.</span><span 
class="na">createSerializer</span><span class="o">(</span><span 
class="n">oDataFormat</span><span class="o">);</span>
+    <span class="n">SerializerResult</span> <span 
class="n">serializerResult</span> <span class="o">=</span> <span 
class="n">serializer</span><span class="o">.</span><span 
class="na">entity</span><span class="o">(</span><span 
class="n">serviceMetadata</span><span class="o">,</span> <span 
class="n">entityType</span><span class="o">,</span> <span 
class="n">entity</span><span class="o">,</span> <span 
class="n">options</span><span class="o">);</span>
+    <span class="n">InputStream</span> <span class="n">entityStream</span> 
<span class="o">=</span> <span class="n">serializerResult</span><span 
class="o">.</span><span class="na">getContent</span><span class="o">();</span>
+
+    <span class="c1">//4. configure the response object</span>
+    <span class="n">response</span><span class="o">.</span><span 
class="na">setContent</span><span class="o">(</span><span 
class="n">entityStream</span><span class="o">);</span>
+    <span class="n">response</span><span class="o">.</span><span 
class="na">setStatusCode</span><span class="o">(</span><span 
class="n">HttpStatusCode</span><span class="o">.</span><span 
class="na">OK</span><span class="o">.</span><span 
class="na">getStatusCode</span><span class="o">());</span>
+    <span class="n">response</span><span class="o">.</span><span 
class="na">setHeader</span><span class="o">(</span><span 
class="n">HttpHeader</span><span class="o">.</span><span 
class="na">CONTENT_TYPE</span><span class="o">,</span> <span 
class="n">responseFormat</span><span class="o">.</span><span 
class="na">toContentTypeString</span><span class="o">());</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<h2 id="32-adapt-the-demoservlet-class">3.2. Adapt the DemoServlet class</h2>
+<p>As we’ve learned in our first tutorial, the Processor implementations 
have to be registered on the <code>ODataHttpHandler</code> instance in the 
servlet class.
+Open the <code>DemoServlet</code> class and add the line that registers the 
<code>DemoEntityProcessor</code> instance:</p>
+<div class="codehilite"><pre><span class="c1">// create odata handler and 
configure it with EdmProvider and Processor</span>
+<span class="n">OData</span> <span class="n">odata</span> <span 
class="o">=</span> <span class="n">OData</span><span class="o">.</span><span 
class="na">newInstance</span><span class="o">();</span>
+<span class="n">ServiceMetadata</span> <span class="n">edm</span> <span 
class="o">=</span> <span class="n">odata</span><span class="o">.</span><span 
class="na">createServiceMetadata</span><span class="o">(</span><span 
class="k">new</span> <span class="n">DemoEdmProvider</span><span 
class="o">(),</span>
+<span class="k">new</span> <span class="n">ArrayList</span><span 
class="o">&lt;</span><span class="n">EdmxReference</span><span 
class="o">&gt;());</span>
+<span class="n">ODataHttpHandler</span> <span class="n">handler</span> <span 
class="o">=</span> <span class="n">odata</span><span class="o">.</span><span 
class="na">createHandler</span><span class="o">(</span><span 
class="n">edm</span><span class="o">);</span>
+<span class="n">handler</span><span class="o">.</span><span 
class="na">register</span><span class="o">(</span><span class="k">new</span> 
<span class="n">DemoEntityCollectionProcessor</span><span 
class="o">(</span><span class="n">storage</span><span class="o">));</span>
+<span class="n">handler</span><span class="o">.</span><span 
class="na">register</span><span class="o">(</span><span class="k">new</span> 
<span class="n">DemoEntityProcessor</span><span class="o">(</span><span 
class="n">storage</span><span class="o">));</span>
+</pre></div>
+
+
+<h2 id="33-run-the-service">3.3. Run the service</h2>
+<p>We have provided the implementation for the <code>readEntity(...)</code>, 
we have registered the processor and in the preparation section, we’ve 
created the <code>Storage</code> class and the <code>Util</code> class.
+After building and deploying the project, we can invoke e.g. the following 
URL:</p>
+<div class="codehilite"><pre><span class="n">http</span><span 
class="p">:</span><span class="o">//</span><span 
class="n">localhost</span><span class="p">:</span>8080<span 
class="o">/</span><span class="n">DemoService</span><span 
class="o">/</span><span class="n">DemoService</span><span 
class="p">.</span><span class="n">svc</span><span class="o">/</span><span 
class="n">Products</span><span class="p">(</span>3<span class="p">)</span>
+</pre></div>
+
+
+<p>and get the expected result:</p>
+<div class="codehilite"><pre><span class="p">{</span>
+  <span class="err">@odata.context:</span> <span 
class="nt">&quot;$metadata#Products&quot;</span><span class="p">,</span>
+  <span class="err">ID:</span> <span class="err">3,</span>
+  <span class="err">Name:</span> <span class="nt">&quot;Ergo 
Screen&quot;</span><span class="p">,</span>
+  <span class="err">Description:</span> <span class="nt">&quot;19 Optimum 
Resolution 1024 x 768 @ 85Hz, resolution 1280 x 960&quot;</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h1 id="4-implementation-of-read-single-property">4. Implementation of Read 
Single Property</h1>
+<p>In the following section, We will add the capabilities to our service that 
allows the user to invoke e.g. the following URL:</p>
+<div class="codehilite"><pre><span class="n">http</span><span 
class="p">:</span><span class="o">//</span><span 
class="n">localhost</span><span class="p">:</span>8080<span 
class="o">/</span><span class="n">DemoService</span><span 
class="o">/</span><span class="n">DemoService</span><span 
class="p">.</span><span class="n">svc</span><span class="o">/</span><span 
class="n">Products</span><span class="p">(</span>1<span class="p">)</span><span 
class="o">/</span><span class="n">Description</span>
+</pre></div>
+
+
+<p>Remember:
+As described in our first tutorial, “Description” is the name of a 
property in our OData model.</p>
+<p><img alt="datamodel" src="model1.png" title="The OData model" /></p>
+<p>When a user invokes this URL, he doesn’t want to receive the full payload 
of the entity (since usually there are more properties than in our example), 
but instead, only the value of the property he is interested in.</p>
+<p>Example result:</p>
+<div class="codehilite"><pre><span class="p">{</span>
+   <span class="err">@odata.context:</span> <span 
class="nt">&quot;$metadata#Products/Description&quot;</span><span 
class="p">,</span>
+   <span class="err">value:</span> <span class="nt">&quot;Notebook Basic, 
1.7GHz - 15 XGA - 1024MB DDR2 SDRAM - 40GB&quot;</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p><strong>Advantages:</strong><br />
+Allows more performant implementation in the backend, (e.g. SQL statement).<br 
/>
+Sends less data through the network to the client (e.g. mobile phone).  </p>
+<p><strong>Note:</strong><br />
+Don’t mix the above mentioned call with this one:</p>
+<div class="codehilite"><pre><span class="n">http</span><span 
class="p">:</span><span class="o">//</span><span 
class="n">localhost</span><span class="p">:</span>8080<span 
class="o">/</span><span class="n">DemoService</span><span 
class="o">/</span><span class="n">DemoService</span><span 
class="p">.</span><span class="n">svc</span><span class="o">/</span><span 
class="n">Products</span><span class="p">(</span>1<span class="p">)</span><span 
class="o">/</span><span class="n">Description</span><span 
class="o">/</span>$<span class="n">value</span>
+</pre></div>
+
+
+<p>Here, the response body contains only the pure value of the property, in 
plain text.
+This can be realized by implementing the interface 
<code>PropertyValueProcessor</code> (see Appendix)</p>
+<h2 id="41-implement-the-primitiveprocessor-interface">4.1. Implement the 
PrimitiveProcessor interface</h2>
+<p>The interface 
<code>org.apache.olingo.server.api.processor.PrimitiveProcessor</code> has 4 
methods to implement:</p>
+<ul>
+<li>
+<p><code>init()</code><br />
+    Here we are initialized by the Framework to pass the context objects to 
us</p>
+</li>
+<li>
+<p><code>readPrimitive</code><br />
+    This one is relevant for reading a single property of a single entity</p>
+</li>
+<li>
+<p><code>updatePrimitive</code><br />
+    We will ignore this method in the present tutorial</p>
+</li>
+<li>
+<p><code>deletePrimitive</code><br />
+    We will ignore this method in the present tutorial</p>
+</li>
+</ul>
+<p><strong>readPrimitive</strong></p>
+<p>Again, we have the following 4 steps to follow:</p>
+<ol>
+<li>
+<p>Which data is requested?<br />
+    From the <code>UriInfo</code> object, we not only have to retrieve the 
information about the <code>EntitySet</code> that is requested, but as well the 
desired property.</p>
+</li>
+<li>
+<p>Fetch the data from backend<br />
+    Based on this information, we can retrieve the backend-data for the 
entity, just like we did in the <code>readEntity()</code> method, described 
above.
+    The property value can then be extracted from it.</p>
+</li>
+<li>
+<p>Transform the data<br />
+    The third step is to serialize the backend data into an 
<code>InputStream</code> object.<br />
+    For the current use case, the <code>ODataSerializer</code> instance offers 
a method called <code>primitive(...)</code></p>
+</li>
+<li>
+<p>Configure the response<br />
+    When reading a property, we have to consider that the value of the 
property can be empty.<br />
+    If this is the case, when configuring the response object, we don’t 
provide response body and header.</p>
+<p>:::java
+public void readPrimitive(ODataRequest request, ODataResponse response,
+                        UriInfo uriInfo, ContentType responseFormat)
+                        throws ODataApplicationException, SerializerException 
{</p>
+<div class="codehilite"><pre><span class="c1">// 1. Retrieve info from 
URI</span>
+<span class="c1">// 1.1. retrieve the info about the requested entity 
set</span>
+<span class="n">List</span><span class="o">&lt;</span><span 
class="n">UriResource</span><span class="o">&gt;</span> <span 
class="n">resourceParts</span> <span class="o">=</span> <span 
class="n">uriInfo</span><span class="p">.</span><span 
class="n">getUriResourceParts</span><span class="p">();</span>
+<span class="c1">// Note: only in our example we can rely that the first 
segment is the EntitySet</span>
+<span class="n">UriResourceEntitySet</span> <span 
class="n">uriEntityset</span> <span class="o">=</span> <span 
class="p">(</span><span class="n">UriResourceEntitySet</span><span 
class="p">)</span> <span class="n">resourceParts</span><span 
class="p">.</span><span class="n">get</span><span class="p">(</span><span 
class="mh">0</span><span class="p">);</span>
+<span class="n">EdmEntitySet</span> <span class="n">edmEntitySet</span> <span 
class="o">=</span> <span class="n">uriEntityset</span><span 
class="p">.</span><span class="n">getEntitySet</span><span class="p">();</span>
+<span class="c1">// the key for the entity</span>
+<span class="n">List</span><span class="o">&lt;</span><span 
class="n">UriParameter</span><span class="o">&gt;</span> <span 
class="n">keyPredicates</span> <span class="o">=</span> <span 
class="n">uriEntityset</span><span class="p">.</span><span 
class="n">getKeyPredicates</span><span class="p">();</span>
+
+<span class="c1">// 1.2. retrieve the requested (Edm) property</span>
+<span class="c1">// the last segment is the Property</span>
+<span class="n">UriResourceProperty</span> <span class="n">uriProperty</span> 
<span class="o">=</span> <span class="p">(</span><span 
class="n">UriResourceProperty</span><span class="p">)</span> <span 
class="n">resourceParts</span><span class="p">.</span><span 
class="n">get</span><span class="p">(</span><span 
class="n">resourceParts</span><span class="p">.</span><span 
class="n">size</span><span class="p">()</span> <span class="o">-</span><span 
class="mh">1</span><span class="p">);</span>
+<span class="n">EdmProperty</span> <span class="n">edmProperty</span> <span 
class="o">=</span> <span class="n">uriProperty</span><span 
class="p">.</span><span class="n">getProperty</span><span class="p">();</span>
+<span class="n">String</span> <span class="n">edmPropertyName</span> <span 
class="o">=</span> <span class="n">edmProperty</span><span 
class="p">.</span><span class="n">getName</span><span class="p">();</span>
+<span class="c1">// in our example, we know we have only primitive types in 
our model</span>
+<span class="n">EdmPrimitiveType</span> <span class="n">edmPropertyType</span> 
<span class="o">=</span> <span class="p">(</span><span 
class="n">EdmPrimitiveType</span><span class="p">)</span> <span 
class="n">edmProperty</span><span class="p">.</span><span 
class="n">getType</span><span class="p">();</span>
+
+<span class="c1">// 2. retrieve data from backend</span>
+<span class="c1">// 2.1. retrieve the entity data, for which the property has 
to be read</span>
+<span class="n">Entity</span> <span class="n">entity</span> <span 
class="o">=</span> <span class="n">storage</span><span class="p">.</span><span 
class="n">readEntityData</span><span class="p">(</span><span 
class="n">edmEntitySet</span><span class="p">,</span> <span 
class="n">keyPredicates</span><span class="p">);</span>
+<span class="k">if</span> <span class="p">(</span><span 
class="n">entity</span> <span class="o">==</span> <span 
class="k">null</span><span class="p">)</span> <span class="p">{</span> <span 
class="c1">// Bad request</span>
+    <span class="n">throw</span> <span class="k">new</span> <span 
class="n">ODataApplicationException</span><span class="p">(</span><span 
class="s">&quot;Entity not found&quot;</span><span class="p">,</span>
+            <span class="n">HttpStatusCode</span><span class="p">.</span><span 
class="no">NOT_FOUND</span><span class="p">.</span><span 
class="n">getStatusCode</span><span class="p">(),</span> <span 
class="n">Locale</span><span class="p">.</span><span 
class="no">ENGLISH</span><span class="p">);</span>
+<span class="p">}</span>
+
+<span class="c1">// 2.2. retrieve the property data from the entity</span>
+<span class="n">Property</span> <span class="k">property</span> <span 
class="o">=</span> <span class="n">entity</span><span class="p">.</span><span 
class="n">getProperty</span><span class="p">(</span><span 
class="n">edmPropertyName</span><span class="p">);</span>
+<span class="k">if</span> <span class="p">(</span><span 
class="k">property</span> <span class="o">==</span> <span 
class="k">null</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">throw</span> <span class="k">new</span> <span 
class="n">ODataApplicationException</span><span class="p">(</span><span 
class="s">&quot;Property not found&quot;</span><span class="p">,</span>
+            <span class="n">HttpStatusCode</span><span class="p">.</span><span 
class="no">NOT_FOUND</span><span class="p">.</span><span 
class="n">getStatusCode</span><span class="p">(),</span> <span 
class="n">Locale</span><span class="p">.</span><span 
class="no">ENGLISH</span><span class="p">);</span>
+<span class="p">}</span>
+
+<span class="c1">// 3. serialize</span>
+<span class="n">Object</span> <span class="n">value</span> <span 
class="o">=</span> <span class="k">property</span><span class="p">.</span><span 
class="n">getValue</span><span class="p">();</span>
+<span class="k">if</span> <span class="p">(</span><span class="n">value</span> 
<span class="o">!=</span> <span class="k">null</span><span class="p">)</span> 
<span class="p">{</span>
+    <span class="c1">// 3.1. configure the serializer</span>
+    <span class="n">ODataFormat</span> <span class="n">format</span> <span 
class="o">=</span> <span class="n">ODataFormat</span><span 
class="p">.</span><span class="n">fromContentType</span><span 
class="p">(</span><span class="n">responseFormat</span><span class="p">);</span>
+    <span class="n">ODataSerializer</span> <span class="n">serializer</span> 
<span class="o">=</span> <span class="n">odata</span><span 
class="p">.</span><span class="n">createSerializer</span><span 
class="p">(</span><span class="n">format</span><span class="p">);</span>
+
+    <span class="n">ContextURL</span> <span class="n">contextUrl</span> <span 
class="o">=</span> <span class="n">ContextURL</span><span 
class="p">.</span><span class="k">with</span><span class="p">().</span><span 
class="n">entitySet</span><span class="p">(</span><span 
class="n">edmEntitySet</span><span class="p">).</span><span 
class="n">navOrPropertyPath</span><span class="p">(</span><span 
class="n">edmPropertyName</span><span class="p">).</span><span 
class="n">build</span><span class="p">();</span>
+    <span class="n">PrimitiveSerializerOptions</span> <span 
class="n">options</span> <span class="o">=</span> <span 
class="n">PrimitiveSerializerOptions</span><span class="p">.</span><span 
class="k">with</span><span class="p">().</span><span 
class="n">contextURL</span><span class="p">(</span><span 
class="n">contextUrl</span><span class="p">).</span><span 
class="n">build</span><span class="p">();</span>
+    <span class="c1">// 3.2. serialize</span>
+    <span class="n">SerializerResult</span> <span 
class="n">serializerResult</span> <span class="o">=</span> <span 
class="n">serializer</span><span class="p">.</span><span 
class="k">primitive</span><span class="p">(</span><span 
class="n">edmPropertyType</span><span class="p">,</span> <span 
class="k">property</span><span class="p">,</span> <span 
class="n">options</span><span class="p">);</span>
+    <span class="n">InputStream</span> <span class="n">propertyStream</span> 
<span class="o">=</span> <span class="n">serializerResult</span><span 
class="p">.</span><span class="n">getContent</span><span class="p">();</span>
+
+    <span class="c1">//4. configure the response object</span>
+    <span class="n">response</span><span class="p">.</span><span 
class="n">setContent</span><span class="p">(</span><span 
class="n">propertyStream</span><span class="p">);</span>
+    <span class="n">response</span><span class="p">.</span><span 
class="n">setStatusCode</span><span class="p">(</span><span 
class="n">HttpStatusCode</span><span class="p">.</span><span 
class="no">OK</span><span class="p">.</span><span 
class="n">getStatusCode</span><span class="p">());</span>
+    <span class="n">response</span><span class="p">.</span><span 
class="n">setHeader</span><span class="p">(</span><span 
class="n">HttpHeader</span><span class="p">.</span><span 
class="no">CONTENT_TYPE</span><span class="p">,</span> <span 
class="n">responseFormat</span><span class="p">.</span><span 
class="n">toContentTypeString</span><span class="p">());</span>
+<span class="p">}</span><span class="k">else</span><span class="p">{</span>
+    <span class="c1">// in case there&#39;s no value for the property, we can 
skip the serialization</span>
+        <span class="n">response</span><span class="p">.</span><span 
class="n">setStatusCode</span><span class="p">(</span><span 
class="n">HttpStatusCode</span><span class="p">.</span><span 
class="no">NO_CONTENT</span><span class="p">.</span><span 
class="n">getStatusCode</span><span class="p">());</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>}</p>
+</li>
+</ol>
+<h2 id="42-adapt-the-demoservlet-class">4.2. Adapt the DemoServlet class</h2>
+<p>The DemoServlet has to register a third processor:</p>
+<div class="codehilite"><pre><span class="c1">// create odata handler and 
configure it with EdmProvider and Processor</span>
+<span class="n">OData</span> <span class="n">odata</span> <span 
class="o">=</span> <span class="n">OData</span><span class="o">.</span><span 
class="na">newInstance</span><span class="o">();</span>
+<span class="n">ServiceMetadata</span> <span class="n">edm</span> <span 
class="o">=</span> <span class="n">odata</span><span class="o">.</span><span 
class="na">createServiceMetadata</span><span class="o">(</span><span 
class="k">new</span> <span class="n">DemoEdmProvider</span><span 
class="o">(),</span>
+<span class="k">new</span> <span class="n">ArrayList</span><span 
class="o">&lt;</span><span class="n">EdmxReference</span><span 
class="o">&gt;());</span>
+<span class="n">ODataHttpHandler</span> <span class="n">handler</span> <span 
class="o">=</span> <span class="n">odata</span><span class="o">.</span><span 
class="na">createHandler</span><span class="o">(</span><span 
class="n">edm</span><span class="o">);</span>
+<span class="n">handler</span><span class="o">.</span><span 
class="na">register</span><span class="o">(</span><span class="k">new</span> 
<span class="n">DemoEntityCollectionProcessor</span><span 
class="o">(</span><span class="n">storage</span><span class="o">));</span>
+<span class="n">handler</span><span class="o">.</span><span 
class="na">register</span><span class="o">(</span><span class="k">new</span> 
<span class="n">DemoEntityProcessor</span><span class="o">(</span><span 
class="n">storage</span><span class="o">));</span>
+<span class="n">handler</span><span class="o">.</span><span 
class="na">register</span><span class="o">(</span><span class="k">new</span> 
<span class="n">DemoPrimitiveProcessor</span><span class="o">(</span><span 
class="n">storage</span><span class="o">));</span>
+</pre></div>
+
+
+<h2 id="43-run-the-service">4.3. Run the service</h2>
+<p>We have provided the implementation for the <code>readPrimitive</code>, we 
have registered the processor and in the preparation section, we’ve created 
the <code>Storage</code> class and the <code>Util</code> class.
+After building and deploying the project, we can invoke e.g. the following 
URL</p>
+<div class="codehilite"><pre><span class="n">http</span><span 
class="p">:</span><span class="o">//</span><span 
class="n">localhost</span><span class="p">:</span>8080<span 
class="o">/</span><span class="n">DemoService</span><span 
class="o">/</span><span class="n">DemoService</span><span 
class="p">.</span><span class="n">svc</span><span class="o">/</span><span 
class="n">Products</span><span class="p">(</span><span class="n">ID</span><span 
class="p">=</span>3<span class="p">)</span><span class="o">/</span><span 
class="n">Description</span>
+</pre></div>
+
+
+<p>and get the expected result:</p>
+<div class="codehilite"><pre><span class="p">{</span>
+  <span class="err">@odata.context:</span> <span 
class="nt">&quot;$metadata#Products/Description&quot;</span><span 
class="p">,</span>
+  <span class="err">value:</span> <span class="nt">&quot;19 Optimum Resolution 
1024 x 768 @ 85Hz, resolution 1280 x 960&quot;</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>Of course, all other properties can be accessed in the same way:  </p>
+<div class="codehilite"><pre><span class="n">http</span><span 
class="p">:</span><span class="o">//</span><span 
class="n">localhost</span><span class="p">:</span>8080<span 
class="o">/</span><span class="n">DemoService</span><span 
class="o">/</span><span class="n">DemoService</span><span 
class="p">.</span><span class="n">svc</span><span class="o">/</span><span 
class="n">Products</span><span class="p">(</span><span class="n">ID</span><span 
class="p">=</span>3<span class="p">)</span><span class="o">/</span><span 
class="n">Name</span>
+<span class="n">http</span><span class="p">:</span><span 
class="o">//</span><span class="n">localhost</span><span 
class="p">:</span>8080<span class="o">/</span><span 
class="n">DemoService</span><span class="o">/</span><span 
class="n">DemoService</span><span class="p">.</span><span 
class="n">svc</span><span class="o">/</span><span 
class="n">Products</span><span class="p">(</span><span class="n">ID</span><span 
class="p">=</span>3<span class="p">)</span><span class="o">/</span><span 
class="n">ID</span>
+</pre></div>
+
+
+<hr />
+<h1 id="5-summary">5. Summary</h1>
+<p>In this tutorial we have learned how to implement the read operation for 
single entity and single property.
+It has been based on a simple OData model, focusing on simple sample code and 
sample data.</p>
+<p>In the next tutorial (<a 
href="/doc/odata4/tutorials/write/tutorial_write.html">Part 3: Write</a>) we 
will learn how to implement write operations, i.e. create, update and delete of 
an entity.</p>
+<hr />
+<h1 id="6-links">6. Links</h1>
+<p>Tutorial OData V4 service part 1: <a 
href="/doc/odata4/tutorials/read/tutorial_read.html">Read Entity Collection</a> 
| <a 
href="/doc/odata4/tutorials/read/sample/DemoService_Tutorial_Read.zip">sample 
project zip</a><br />
+Tutorial OData V4 service part 2: <a 
href="/doc/odata4/tutorials/readep/tutorial_readep.html">Read Entity, Read 
Property (this page)</a> | <a 
href="/doc/odata4/tutorials/readep/sample/DemoService_Tutorial_Readep.zip">sample
 project zip</a>
+Tutorial OData V4 service part 3: <a 
href="/doc/odata4/tutorials/write/tutorial_write.html">Write (Create, Update, 
Delete Entity)</a> | <a 
href="/doc/odata4/tutorials/write/sample/DemoService_Tutorial_Write.zip">sample 
project zip</a></p>
+<p>OData specification: <a href="http://odata.org/";>http://odata.org/</a>
+Olingo Javadoc: <a 
href="http://olingo.apache.org/javadoc/odata4/index.html";>http://olingo.apache.org/javadoc/odata4/index.html</a></p><div
 align="center">
+<p>Copyright © 2013-2015, The Apache Software Foundation<br>
+                                               Apache Olingo, Olingo, Apache, 
the Apache feather, and
+                               the Apache Olingo project logo are trademarks 
of the Apache Software
+                               Foundation.</p>
+        <small><a href="/doc/odata2/privacy.html">Privacy</a></small>
+      </div>
+    </div><!-- /container -->
+    <!-- Bootstrap core JavaScript
+    ================================================== -->
+    <!-- Placed at the end of the document so the pages load faster -->
+    <script src="/js/jquery.js" type="text/javascript">
+</script>
+         <script src="/js/bootstrap.js" type="text/javascript">
+         <script src="/js/offcanvas.js" type="text/javascript">
+</script>
+        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
+        <script>
+            (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
+            function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
+            e=o.createElement(i);r=o.getElementsByTagName(i)[0];
+            e.src='//www.google-analytics.com/analytics.js';
+            r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
+            ga('create','UA-44963757-1');ga('send','pageview');
+        </script>
+  </body>
+</html>


Reply via email to