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 2015/10/07 11:10:28 UTC

svn commit: r968050 [2/2] - in /websites/staging/olingo/trunk/content: ./ doc/odata4/tutorials/action/tutorial_action.html

Modified: websites/staging/olingo/trunk/content/doc/odata4/tutorials/action/tutorial_action.html
==============================================================================
--- websites/staging/olingo/trunk/content/doc/odata4/tutorials/action/tutorial_action.html (original)
+++ websites/staging/olingo/trunk/content/doc/odata4/tutorials/action/tutorial_action.html Wed Oct  7 09:10:27 2015
@@ -104,17 +104,35 @@ h2:hover > .headerlink, h3:hover > .head
 <p><strong>Note:</strong>
 The final source code can be found in the project <a href="https://git-wip-us.apache.org/repos/asf/olingo-odata4">git repository</a>.
 A detailed description how to checkout the tutorials can be found <a href="/doc/odata4/tutorials/prerequisites/prerequisites.html">here</a>. <br />
-This tutorial can be found in subdirectory /samples/tutorials/p9_action</p>
+This tutorial can be found in subdirectory <code>/samples/tutorials/p9_action</code></p>
 <p><strong>Table of Contents</strong></p>
-<ol>
-<li>Introduction</li>
-<li>Preparation</li>
-<li>Implementation</li>
-<li>Run the implemented service</li>
-<li>Links</li>
-</ol>
+<div class="toc">
+<ul>
+<li><a href="#how-to-build-an-odata-service-with-olingo-v4">How to build an OData Service with Olingo V4</a></li>
+<li><a href="#part-6-action-imports-and-function-imports">Part 6: Action Imports and Function Imports</a><ul>
+<li><a href="#introduction">Introduction</a></li>
+</ul>
+</li>
+<li><a href="#1-introduction">1. Introduction</a></li>
+<li><a href="#2-preparation">2. Preparation</a></li>
+<li><a href="#31-implementation">3.1 Implementation</a><ul>
+<li><a href="#31-extend-the-metadata-model">3.1 Extend the Metadata model</a></li>
+<li><a href="#32-extend-the-data-store">3.2 Extend the data store</a></li>
+<li><a href="#33-extend-the-entity-collection-and-the-entity-processor-to-handle-function-imports">3.3 Extend the entity collection and the entity processor to handle function imports</a></li>
+<li><a href="#34-implement-an-action-processor">3.4 Implement an action processor</a></li>
+</ul>
+</li>
+<li><a href="#4-run-the-implemented-service">4. Run the implemented service</a></li>
+<li><a href="#5-links">5. Links</a><ul>
+<li><a href="#tutorials">Tutorials</a></li>
+<li><a href="#code-and-repository">Code and Repository</a></li>
+<li><a href="#further-reading">Further reading</a></li>
+</ul>
+</li>
+</ul>
+</div>
 <h1 id="1-introduction">1. Introduction<a class="headerlink" href="#1-introduction" title="Permanent link">&para;</a></h1>
-<p>The <a href="http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/part1-protocol/odata-v4.0-errata02-os-part1-protocol-complete.html#_Toc406398201">OData V4 specification</a> gives us a definition what Function, Actions are:</p>
+<p>The <a href="http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/part1-protocol/odata-v4.0-errata02-os-part1-protocol-complete.html#_Toc406398201">OData V4 specification</a> gives us a definition what <em>Functions</em>, <em>Actions</em> are:</p>
 <blockquote>
 <p>Operations allow the execution of custom logic on parts of a data
 model. Functions are operations that do not have side effects and may
@@ -130,14 +148,14 @@ root.</p>
 </blockquote>
 <p>In this short definition are several terms which are to be explained first. As you might expect operation is the superordinate of functions and actions. The result of operations can be:</p>
 <ul>
-<li>An entity or a collection of entities</li>
-<li>A primitive property or a collection of primitive properties</li>
-<li>A complex property or a collection of complex properties</li>
+<li>An <em>entity</em> or a <em>collection of entities</em></li>
+<li>A <em>primitive property</em> or a <em>collection of primitive properties</em></li>
+<li>A <em>complex property</em> or a <em>collection of complex properties</em></li>
 </ul>
-<p>In addition Actions can return void that means there is no return value. Function must return a value.</p>
-<p>The definition gives us some parts where function and actions can be used. First an operation can be bound or unbound. In this tutorial we will focus on unbound operations. Unbound operations are something like static methods in Java, so if one of these operations have parameters we have to pass all of them explicit to the operation. </p>
+<p>In addition an <em>Action</em> can return void that means there is no return value. A <em>Function</em> must return a value.</p>
+<p>The definition gives us some parts where function and actions can be used. First an <em>Operation</em> can be bound or unbound. In this tutorial we will focus on unbound operations. Unbound operations are something like static methods in Java, so if one of these operations have parameters we have to pass all of them explicit to the operation.</p>
 <p><strong>Example</strong></p>
-<p>For example there could be a function that calculates the VAT. The result depends on the one hand from the net price and on the other hand from the county in which the customer lives.</p>
+<p>For example there could be a function that calculates the VAT. The result depends on the one hand from the net price and on the other hand from the country in which the customer lives.</p>
 <p>Such a function can be expressed in the metadata document as follows</p>
 <div class="codehilite"><pre><span class="nt">&lt;Function</span> <span class="na">Name=</span><span class="s">&quot;CalculateVAT&quot;</span><span class="nt">&gt;</span>
      <span class="nt">&lt;Parameter</span> <span class="na">Name=</span><span class="s">&quot;NetPrice&quot;</span> <span class="na">Type=</span><span class="s">&quot;Edm.Decimal&quot;</span> <span class="na">Nullable=</span><span class="s">&quot;false&quot;</span><span class="nt">/&gt;</span>
@@ -148,10 +166,10 @@ root.</p>
 </pre></div>
 
 
-<p>To make this function statically callable we have to define a Function Import. </p>
+<p>To make this function statically callable we have to define a Function Import.</p>
 <div class="codehilite"><pre><span class="nt">&lt;EntityContainer</span> <span class="na">Name=</span><span class="s">&quot;Container&quot;</span><span class="nt">&gt;</span>
-     <span class="nt">&lt;FunctionImport</span> <span class="na">Name=</span><span class="s">&quot;StaticCalculateVAT&quot;</span> 
-                     <span class="na">Function=</span><span class="s">&quot;CalculateVAT&quot;</span> 
+     <span class="nt">&lt;FunctionImport</span> <span class="na">Name=</span><span class="s">&quot;StaticCalculateVAT&quot;</span>
+                     <span class="na">Function=</span><span class="s">&quot;CalculateVAT&quot;</span>
                      <span class="na">IncludeInServiceDocument=</span><span class="s">&quot;true&quot;</span><span class="nt">/&gt;</span>
 <span class="nt">&lt;/EntityContainer&gt;</span>
 </pre></div>
@@ -162,7 +180,7 @@ root.</p>
 </pre></div>
 
 
-<p>The definition talks about composing of functions. By default every function is Composable=false, that means there must be no further resource parts after the function call and there must also be no system query options. If a function is composable you`re be able to use system query options. Which options are allowed in particular is based on the return type of the function. Further you can navigate to properties and use Navigation Properties to navigate to related entities as well.</p>
+<p>The definition talks about composing of functions. By default every function is Composable=false, that means there must be no further resource parts after the function call and there must also be no system query options. If a function is composable you are be able to use system query options. Which options are allowed in particular is based on the return type of the function. Further you can navigate to properties and use Navigation Properties to navigate to related entities as well.</p>
 <p>The definition of Actions / Action Imports in metadata document is similar to functions.</p>
 <div class="codehilite"><pre><span class="nt">&lt;Action</span> <span class="na">Name=</span><span class="s">&quot;Reset&quot;</span><span class="nt">&gt;</span>
     <span class="nt">&lt;Parameter</span> <span class="na">Name=</span><span class="s">&quot;Amount&quot;</span> <span class="na">Type=</span><span class="s">&quot;Edm.Int32&quot;</span><span class="nt">/&gt;</span>
@@ -174,14 +192,14 @@ root.</p>
 </pre></div>
 
 
-<p>As you can see, this function does not return any value and takes one parameter “Amount” To call this action import, you have to issue an POST request to</p>
+<p>As you can see, this function does not return any value and takes one parameter “<em>Amount</em>” To call this action import, you have to issue an POST request to</p>
 <div class="codehilite"><pre><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="o">/</span><span class="n">myService</span><span class="o">/</span><span class="n">StaticReset</span>
 </pre></div>
 
 
 <p>The parameters are passed within the body of the request. In this case such a body could look like the following (JSON - Syntax):</p>
 <div class="codehilite"><pre><span class="p">{</span>
-     <span class="nt">&quot;Amount&quot;</span><span class="p">:</span> <span class="mi">2</span>
+  <span class="nt">&quot;Amount&quot;</span><span class="p">:</span> <span class="mi">2</span>
 <span class="p">}</span>
 </pre></div>
 
@@ -191,24 +209,25 @@ root.</p>
 <p>You should read the previous tutorials first to have an idea how to read entities and entity collections. In addition the following code is based on the write tutorial merged with the navigation tutorial.</p>
 <p>As a shortcut you should checkout the prepared tutorial project in the <a href="https://git-wip-us.apache.org/repos/asf/olingo-odata4">git repository</a> in folder /samples/tutorials/p9_action_preparation.</p>
 <p>Afterwards do a Deploy and run: it should be working. At this state you can perform CRUD operations and do navigations between products and categories.</p>
-<h1 id="2-implementation">2. Implementation<a class="headerlink" href="#2-implementation" title="Permanent link">&para;</a></h1>
-<p>We`ll using the given data model you are familiar with. To keep things simple we implement one function import and one action import.</p>
+<h1 id="31-implementation">3.1 Implementation<a class="headerlink" href="#31-implementation" title="Permanent link">&para;</a></h1>
+<p>We will using the given data model you are familiar with. To keep things simple we implement one function import and one action import.</p>
 <p><strong>Function Import: CountCategories</strong>  <br />
-This function takes a mandatory parameter “Amount”. The function returns a collection of categories with the very same number of related products.</p>
+This function takes a mandatory parameter “<em>Amount</em>”. The function returns a collection of categories with the very same number of related products.</p>
 <p>After finishing the implementation the definition of the function should look like this:</p>
 <div class="codehilite"><pre><span class="nt">&lt;Function</span> <span class="na">Name=</span><span class="s">&quot;CountCategories&quot;</span><span class="nt">&gt;</span>
-    <span class="nt">&lt;Parameter</span> <span class="na">Name=</span><span class="s">&quot;Amount&quot;</span> <span class="na">Type=</span><span class="s">&quot;Edm.Int32&quot;</span> <span class="na">Nullable=</span><span class="s">&quot;false&quot;</span><span class="nt">/&gt;</span>
-    <span class="nt">&lt;ReturnType</span> <span class="na">Type=</span><span class="s">&quot;Collection(OData.Demo.Category)&quot;</span><span class="nt">/&gt;</span>
+      <span class="nt">&lt;Parameter</span> <span class="na">Name=</span><span class="s">&quot;Amount&quot;</span> <span class="na">Type=</span><span class="s">&quot;Edm.Int32&quot;</span> <span class="na">Nullable=</span><span class="s">&quot;false&quot;</span><span class="nt">/&gt;</span>
+      <span class="nt">&lt;ReturnType</span> <span class="na">Type=</span><span class="s">&quot;Collection(OData.Demo.Category)&quot;</span><span class="nt">/&gt;</span>
 <span class="nt">&lt;/Function&gt;</span>
 </pre></div>
 
 
-<p>As described in the previous tutorials, the type of the response determines which processor interface will be called by the Olingo library. It is important to know, that functions are dispatched to the traditional processor interfaces. That means there are no special “FunctionProcessors”. In our case, the function returns a collection of Categories. So we have to extend the <em>DemoEntityCollectionProcessor</em>. As you will see it is possible to address a single entity by it`s  key. So we have to extend the DemoEntityProcessor as well to handle requests which responds a single entity.</p>
+<p>As described in the previous tutorials, the type of the response determines which processor interface will be called by the Olingo library. It is <strong>important to know, that functions are dispatched to the traditional processor interfaces</strong>.
+That means there are no special <code>FunctionProcessors</code>. In our case, the function returns a collection of Categories. So we have to extend the <code>DemoEntityCollectionProcessor</code>. As you will see it is possible to address a single entity by its  key. So we have to extend the <code>DemoEntityProcessor</code> as well to handle requests which responds a single entity.</p>
 <p><strong>Action Import: Reset</strong>  <br />
-This action takes an optional parameter “Amount”. The actions resets the whole data of the service and creates at most #Amount products with the related categories.</p>
-<p>After finishing the implementation the definition of the action should be like this: </p>
+This action takes an optional parameter “<em>Amount</em>”. The actions resets the whole data of the service and creates  <em># of Amount</em> products with the related categories.</p>
+<p>After finishing the implementation the definition of the action should be like this:</p>
 <div class="codehilite"><pre><span class="nt">&lt;Action</span> <span class="na">Name=</span><span class="s">&quot;Reset&quot;</span> <span class="na">IsBound=</span><span class="s">&quot;false&quot;</span><span class="nt">&gt;</span>
-     <span class="nt">&lt;Parameter</span> <span class="na">Name=</span><span class="s">&quot;Amount&quot;</span> <span class="na">Type=</span><span class="s">&quot;Edm.Int32&quot;</span><span class="nt">/&gt;</span>
+  <span class="nt">&lt;Parameter</span> <span class="na">Name=</span><span class="s">&quot;Amount&quot;</span> <span class="na">Type=</span><span class="s">&quot;Edm.Int32&quot;</span><span class="nt">/&gt;</span>
 <span class="nt">&lt;/Action&gt;</span>
 </pre></div>
 
@@ -216,12 +235,12 @@ This action takes an optional parameter
 <p>While actions are called by using HTTP Method POST is nessesary to introduce new processor interfaces for actions. So there exists a bunch of interfaces, for each return type strictly one.</p>
 <p><strong>Steps</strong>    </p>
 <ul>
-<li>Extent the Metadata model</li>
-<li>Extent the data store</li>
-<li>Extent the entity collection and the entity processor to handle function imports</li>
+<li>Extend the Metadata model</li>
+<li>Extend the data store</li>
+<li>Extend the entity collection and the entity processor to handle function imports</li>
 <li>Implement an action processor</li>
 </ul>
-<h2 id="31-extent-the-metadata-model">3.1 Extent the Metadata model<a class="headerlink" href="#31-extent-the-metadata-model" title="Permanent link">&para;</a></h2>
+<h2 id="31-extend-the-metadata-model">3.1 Extend the Metadata model<a class="headerlink" href="#31-extend-the-metadata-model" title="Permanent link">&para;</a></h2>
 <p>Create the following constants in the DemoEdmProvider. These constants are used to address the operations.</p>
 <div class="codehilite"><pre><span class="c1">// Action</span>
 <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">ACTION_RESET</span> <span class="o">=</span> <span class="s">&quot;Reset&quot;</span><span class="o">;</span>
@@ -243,100 +262,100 @@ This action takes an optional parameter
 <li>Action Imports</li>
 <li>Function Imports</li>
 </ul>
-<p>The code is simple and straight forward. First, we check which function we have to return. Then, a list of parameters and the return type are created. At the end all parts are fit together and get returned as new <em>CsdlFunction</em> Object.</p>
+<p>The code is simple and straight forward. First, we check which function we have to return. Then, a list of parameters and the return type are created. At the end all parts are fit together and get returned as new <code>CsdlFunction</code> Object.</p>
 <div class="codehilite"><pre><span class="nd">@Override</span>
 <span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">CsdlFunction</span><span class="o">&gt;</span> <span class="n">getFunctions</span><span class="o">(</span><span class="kd">final</span> <span class="n">FullQualifiedName</span> <span class="n">functionName</span><span class="o">)</span> <span class="o">{</span>
-    <span class="k">if</span> <span class="o">(</span><span class="n">functionName</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">FUNCTION_COUNT_CATEGORIES_FQN</span><span class="o">))</span> <span class="o">{</span>
-        <span class="c1">// It is allowed to overload functions, so we have to provide a list of functions for each function name</span>
-        <span class="kd">final</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">CsdlFunction</span><span class="o">&gt;</span> <span class="n">functions</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">CsdlFunction</span><span class="o">&gt;();</span>
-
-        <span class="c1">// Create the parameter for the function</span>
-        <span class="kd">final</span> <span class="n">CsdlParameter</span> <span class="n">parameterAmount</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CsdlParameter</span><span class="o">();</span>
-        <span class="n">parameterAmount</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">PARAMETER_AMOUNT</span><span class="o">);</span>
-        <span class="n">parameterAmount</span><span class="o">.</span><span class="na">setNullable</span><span class="o">(</span><span class="kc">false</span><span class="o">);</span>
-        <span class="n">parameterAmount</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">EdmPrimitiveTypeKind</span><span class="o">.</span><span class="na">Int32</span><span class="o">.</span><span class="na">getFullQualifiedName</span><span class="o">());</span>
-
-        <span class="c1">// Create the return type of the function</span>
-        <span class="kd">final</span> <span class="n">CsdlReturnType</span> <span class="n">returnType</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CsdlReturnType</span><span class="o">();</span>
-        <span class="n">returnType</span><span class="o">.</span><span class="na">setCollection</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
-        <span class="n">returnType</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ET_CATEGORY_FQN</span><span class="o">);</span>
-
-        <span class="c1">// Create the function</span>
-        <span class="kd">final</span> <span class="n">CsdlFunction</span> <span class="n">function</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CsdlFunction</span><span class="o">();</span>
-        <span class="n">function</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">FUNCTION_COUNT_CATEGORIES_FQN</span><span class="o">.</span><span class="na">getName</span><span class="o">())</span>
-                <span class="o">.</span><span class="na">setParameters</span><span class="o">(</span><span class="n">Arrays</span><span class="o">.</span><span class="na">asList</span><span class="o">(</span><span class="n">parameterAmount</span><span class="o">))</span>
-                <span class="o">.</span><span class="na">setReturnType</span><span class="o">(</span><span class="n">returnType</span><span class="o">);</span>
-        <span class="n">functions</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">function</span><span class="o">);</span>
+  <span class="k">if</span> <span class="o">(</span><span class="n">functionName</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">FUNCTION_COUNT_CATEGORIES_FQN</span><span class="o">))</span> <span class="o">{</span>
+    <span class="c1">// It is allowed to overload functions, so we have to provide a list of functions for each function name</span>
+    <span class="kd">final</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">CsdlFunction</span><span class="o">&gt;</span> <span class="n">functions</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">CsdlFunction</span><span class="o">&gt;();</span>
 
-        <span class="k">return</span> <span class="n">functions</span><span class="o">;</span>
-    <span class="o">}</span>
+    <span class="c1">// Create the parameter for the function</span>
+    <span class="kd">final</span> <span class="n">CsdlParameter</span> <span class="n">parameterAmount</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CsdlParameter</span><span class="o">();</span>
+    <span class="n">parameterAmount</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">PARAMETER_AMOUNT</span><span class="o">);</span>
+    <span class="n">parameterAmount</span><span class="o">.</span><span class="na">setNullable</span><span class="o">(</span><span class="kc">false</span><span class="o">);</span>
+    <span class="n">parameterAmount</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">EdmPrimitiveTypeKind</span><span class="o">.</span><span class="na">Int32</span><span class="o">.</span><span class="na">getFullQualifiedName</span><span class="o">());</span>
+
+    <span class="c1">// Create the return type of the function</span>
+    <span class="kd">final</span> <span class="n">CsdlReturnType</span> <span class="n">returnType</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CsdlReturnType</span><span class="o">();</span>
+    <span class="n">returnType</span><span class="o">.</span><span class="na">setCollection</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
+    <span class="n">returnType</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ET_CATEGORY_FQN</span><span class="o">);</span>
+
+    <span class="c1">// Create the function</span>
+    <span class="kd">final</span> <span class="n">CsdlFunction</span> <span class="n">function</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CsdlFunction</span><span class="o">();</span>
+    <span class="n">function</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">FUNCTION_COUNT_CATEGORIES_FQN</span><span class="o">.</span><span class="na">getName</span><span class="o">())</span>
+        <span class="o">.</span><span class="na">setParameters</span><span class="o">(</span><span class="n">Arrays</span><span class="o">.</span><span class="na">asList</span><span class="o">(</span><span class="n">parameterAmount</span><span class="o">))</span>
+        <span class="o">.</span><span class="na">setReturnType</span><span class="o">(</span><span class="n">returnType</span><span class="o">);</span>
+    <span class="n">functions</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">function</span><span class="o">);</span>
 
-    <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
+    <span class="k">return</span> <span class="n">functions</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>
 </pre></div>
 
 
-<p>We have created the function itself. To express that function can be called statically we have to override the method <em>getFunctionImports</em>.</p>
+<p>We have created the function itself. To express that function can be called statically we have to override the method <code>getFunctionImport()</code>.</p>
 <div class="codehilite"><pre><span class="nd">@Override</span>
 <span class="kd">public</span> <span class="n">CsdlFunctionImport</span> <span class="nf">getFunctionImport</span><span class="o">(</span><span class="n">FullQualifiedName</span> <span class="n">entityContainer</span><span class="o">,</span> <span class="n">String</span> <span class="n">functionImportName</span><span class="o">)</span> <span class="o">{</span>
-    <span class="k">if</span><span class="o">(</span><span class="n">entityContainer</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">CONTAINER</span><span class="o">))</span> <span class="o">{</span>
-        <span class="k">if</span><span class="o">(</span><span class="n">functionImportName</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">FUNCTION_COUNT_CATEGORIES_FQN</span><span class="o">.</span><span class="na">getName</span><span class="o">()))</span> <span class="o">{</span>
-            <span class="k">return</span> <span class="k">new</span> <span class="nf">CsdlFunctionImport</span><span class="o">()</span>
-                                <span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">functionImportName</span><span class="o">)</span>
-                                <span class="o">.</span><span class="na">setFunction</span><span class="o">(</span><span class="n">FUNCTION_COUNT_CATEGORIES_FQN</span><span class="o">)</span>
-                                <span class="o">.</span><span class="na">setEntitySet</span><span class="o">(</span><span class="n">ES_CATEGORIES_NAME</span><span class="o">)</span>
-                                <span class="o">.</span><span class="na">setIncludeInServiceDocument</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
-        <span class="o">}</span>
+  <span class="k">if</span><span class="o">(</span><span class="n">entityContainer</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">CONTAINER</span><span class="o">))</span> <span class="o">{</span>
+    <span class="k">if</span><span class="o">(</span><span class="n">functionImportName</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">FUNCTION_COUNT_CATEGORIES_FQN</span><span class="o">.</span><span class="na">getName</span><span class="o">()))</span> <span class="o">{</span>
+      <span class="k">return</span> <span class="k">new</span> <span class="nf">CsdlFunctionImport</span><span class="o">()</span>
+                <span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">functionImportName</span><span class="o">)</span>
+                <span class="o">.</span><span class="na">setFunction</span><span class="o">(</span><span class="n">FUNCTION_COUNT_CATEGORIES_FQN</span><span class="o">)</span>
+                <span class="o">.</span><span class="na">setEntitySet</span><span class="o">(</span><span class="n">ES_CATEGORIES_NAME</span><span class="o">)</span>
+                <span class="o">.</span><span class="na">setIncludeInServiceDocument</span><span class="o">(</span><span class="kc">true</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="k">return</span> <span class="kc">null</span><span class="o">;</span>
 <span class="o">}</span>
 </pre></div>
 
 
-<p>The code to define the actions and the action import is quite similar:</p>
+<p>To define the actions and the action imports the <code>getActions()</code> and <code>getActionImport()</code> methods have to be overriden and the necessary code is quite similar to the functions sample above:</p>
 <div class="codehilite"><pre><span class="nd">@Override</span>
 <span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">CsdlAction</span><span class="o">&gt;</span> <span class="n">getActions</span><span class="o">(</span><span class="kd">final</span> <span class="n">FullQualifiedName</span> <span class="n">actionName</span><span class="o">)</span> <span class="o">{</span>
-    <span class="k">if</span><span class="o">(</span><span class="n">actionName</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">ACTION_RESET_FQN</span><span class="o">))</span> <span class="o">{</span>
-        <span class="c1">// It is allowed to overload actions, so we have to provide a list of Actions for each action name</span>
-        <span class="kd">final</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">CsdlAction</span><span class="o">&gt;</span> <span class="n">actions</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">CsdlAction</span><span class="o">&gt;();</span>
-
-        <span class="c1">// Create parameters</span>
-        <span class="kd">final</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">CsdlParameter</span><span class="o">&gt;</span> <span class="n">parameters</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">CsdlParameter</span><span class="o">&gt;();</span>
-        <span class="kd">final</span> <span class="n">CsdlParameter</span> <span class="n">parameter</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CsdlParameter</span><span class="o">();</span>
-        <span class="n">parameter</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">PARAMETER_AMOUNT</span><span class="o">);</span>
-        <span class="n">parameter</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">EdmPrimitiveTypeKind</span><span class="o">.</span><span class="na">Int32</span><span class="o">.</span><span class="na">getFullQualifiedName</span><span class="o">());</span>
-        <span class="n">parameters</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">parameter</span><span class="o">);</span>
-
-        <span class="c1">// Create the Csdl Action</span>
-        <span class="kd">final</span> <span class="n">CsdlAction</span> <span class="n">action</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CsdlAction</span><span class="o">();</span>
-        <span class="n">action</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">ACTION_RESET_FQN</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span>
-        <span class="n">action</span><span class="o">.</span><span class="na">setParameters</span><span class="o">(</span><span class="n">parameters</span><span class="o">);</span>
-        <span class="n">actions</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">action</span><span class="o">);</span>
+  <span class="k">if</span><span class="o">(</span><span class="n">actionName</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">ACTION_RESET_FQN</span><span class="o">))</span> <span class="o">{</span>
+    <span class="c1">// It is allowed to overload actions, so we have to provide a list of Actions for each action name</span>
+    <span class="kd">final</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">CsdlAction</span><span class="o">&gt;</span> <span class="n">actions</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">CsdlAction</span><span class="o">&gt;();</span>
+
+    <span class="c1">// Create parameters</span>
+    <span class="kd">final</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">CsdlParameter</span><span class="o">&gt;</span> <span class="n">parameters</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">CsdlParameter</span><span class="o">&gt;();</span>
+    <span class="kd">final</span> <span class="n">CsdlParameter</span> <span class="n">parameter</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CsdlParameter</span><span class="o">();</span>
+    <span class="n">parameter</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">PARAMETER_AMOUNT</span><span class="o">);</span>
+    <span class="n">parameter</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">EdmPrimitiveTypeKind</span><span class="o">.</span><span class="na">Int32</span><span class="o">.</span><span class="na">getFullQualifiedName</span><span class="o">());</span>
+    <span class="n">parameters</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">parameter</span><span class="o">);</span>
+
+    <span class="c1">// Create the Csdl Action</span>
+    <span class="kd">final</span> <span class="n">CsdlAction</span> <span class="n">action</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CsdlAction</span><span class="o">();</span>
+    <span class="n">action</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">ACTION_RESET_FQN</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span>
+    <span class="n">action</span><span class="o">.</span><span class="na">setParameters</span><span class="o">(</span><span class="n">parameters</span><span class="o">);</span>
+    <span class="n">actions</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">action</span><span class="o">);</span>
 
-        <span class="k">return</span> <span class="n">actions</span><span class="o">;</span>
-    <span class="o">}</span>
+    <span class="k">return</span> <span class="n">actions</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="k">return</span> <span class="kc">null</span><span class="o">;</span>
 <span class="o">}</span>
 
 <span class="nd">@Override</span>
 <span class="kd">public</span> <span class="n">CsdlActionImport</span> <span class="nf">getActionImport</span><span class="o">(</span><span class="kd">final</span> <span class="n">FullQualifiedName</span> <span class="n">entityContainer</span><span class="o">,</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">actionImportName</span><span class="o">)</span> <span class="o">{</span>
-    <span class="k">if</span><span class="o">(</span><span class="n">entityContainer</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">CONTAINER</span><span class="o">))</span> <span class="o">{</span>
-        <span class="k">if</span><span class="o">(</span><span class="n">actionImportName</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">ACTION_RESET_FQN</span><span class="o">.</span><span class="na">getName</span><span class="o">()))</span> <span class="o">{</span>
-            <span class="k">return</span> <span class="k">new</span> <span class="nf">CsdlActionImport</span><span class="o">()</span>
-                            <span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">actionImportName</span><span class="o">)</span>
-                            <span class="o">.</span><span class="na">setAction</span><span class="o">(</span><span class="n">ACTION_RESET_FQN</span><span class="o">);</span>
-        <span class="o">}</span>
+  <span class="k">if</span><span class="o">(</span><span class="n">entityContainer</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">CONTAINER</span><span class="o">))</span> <span class="o">{</span>
+    <span class="k">if</span><span class="o">(</span><span class="n">actionImportName</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">ACTION_RESET_FQN</span><span class="o">.</span><span class="na">getName</span><span class="o">()))</span> <span class="o">{</span>
+      <span class="k">return</span> <span class="k">new</span> <span class="nf">CsdlActionImport</span><span class="o">()</span>
+              <span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">actionImportName</span><span class="o">)</span>
+              <span class="o">.</span><span class="na">setAction</span><span class="o">(</span><span class="n">ACTION_RESET_FQN</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="k">return</span> <span class="kc">null</span><span class="o">;</span>
 <span class="o">}</span>
 </pre></div>
 
 
 <p>Finally we have to announce these operations to the schema and the entity container.
-Add the following lines to the method <em>getSchemas()</em>:</p>
+Add the following lines to the method <code>getSchemas()</code>:</p>
 <div class="codehilite"><pre><span class="c1">// add actions</span>
 <span class="n">List</span><span class="o">&lt;</span><span class="n">CsdlAction</span><span class="o">&gt;</span> <span class="n">actions</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">CsdlAction</span><span class="o">&gt;();</span>
 <span class="n">actions</span><span class="o">.</span><span class="na">addAll</span><span class="o">(</span><span class="n">getActions</span><span class="o">(</span><span class="n">ACTION_RESET_FQN</span><span class="o">));</span>
@@ -349,7 +368,7 @@ Add the following lines to the method <e
 </pre></div>
 
 
-<p>Also add the following lines to the method <em>getEntityContainer()</em></p>
+<p>Also add the following lines to the method <code>getEntityContainer()</code></p>
 <div class="codehilite"><pre><span class="c1">// Create function imports</span>
 <span class="n">List</span><span class="o">&lt;</span><span class="n">CsdlFunctionImport</span><span class="o">&gt;</span> <span class="n">functionImports</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">CsdlFunctionImport</span><span class="o">&gt;();</span>
 <span class="n">functionImports</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">getFunctionImport</span><span class="o">(</span><span class="n">CONTAINER</span><span class="o">,</span> <span class="n">FUNCTION_COUNT_CATEGORIES</span><span class="o">));</span>
@@ -363,242 +382,245 @@ Add the following lines to the method <e
 </pre></div>
 
 
-<h2 id="32-extent-the-data-store">3.2 Extent the data store<a class="headerlink" href="#32-extent-the-data-store" title="Permanent link">&para;</a></h2>
-<p>We need two methods in the data store to read the function import <em>CountCategories</em>.</p>
+<h2 id="32-extend-the-data-store">3.2 Extend the data store<a class="headerlink" href="#32-extend-the-data-store" title="Permanent link">&para;</a></h2>
+<p>We need two methods in the data store to read the function import <code>CountCategories</code>.</p>
 <p>The first method returns a collection of entites and the second returns a single entity of this collection.</p>
 <div class="codehilite"><pre><span class="kd">public</span> <span class="n">EntityCollection</span> <span class="nf">readFunctionImportCollection</span><span class="o">(</span><span class="kd">final</span> <span class="n">UriResourceFunction</span> <span class="n">uriResourceFunction</span><span class="o">,</span> <span class="kd">final</span> <span class="n">ServiceMetadata</span> <span class="n">serviceMetadata</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">ODataApplicationException</span> <span class="o">{</span>
 
-    <span class="k">if</span><span class="o">(</span><span class="n">DemoEdmProvider</span><span class="o">.</span><span class="na">FUNCTION_COUNT_CATEGORIES</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getFunctionImport</span><span class="o">().</span><span class="na">getName</span><span class="o">()))</span> <span class="o">{</span>
-        <span class="c1">// Get the parameter of the function</span>
-        <span class="kd">final</span> <span class="n">UriParameter</span> <span class="n">parameterAmount</span> <span class="o">=</span> <span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getParameters</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="c1">// Try to convert the parameter to an Integer.</span>
-        <span class="c1">// We have to take care, that the type of parameter fits to its EDM declaration</span>
-        <span class="kt">int</span> <span class="n">amount</span><span class="o">;</span>
-        <span class="k">try</span> <span class="o">{</span>
-            <span class="n">amount</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">parameterAmount</span><span class="o">.</span><span class="na">getText</span><span class="o">());</span>
-        <span class="o">}</span> <span class="k">catch</span><span class="o">(</span><span class="n">NumberFormatException</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;Type of parameter Amount must be Edm.Int32&quot;</span><span class="o">,</span>
-                <span class="n">HttpStatusCode</span><span class="o">.</span><span class="na">BAD_REQUEST</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="kd">final</span> <span class="n">EdmEntityType</span> <span class="n">productEntityType</span> <span class="o">=</span> <span class="n">serviceMetadata</span><span class="o">.</span><span class="na">getEdm</span><span class="o">().</span><span class="na">getEntityType</span><span class="o">(</span><span class="n">DemoEdmProvider</span><span class="o">.</span><span class="na">ET_PRODUCT_FQN</span><span class="o">);</span>
-        <span class="kd">final</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Entity</span><span class="o">&gt;</span> <span class="n">resultEntityList</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="c1">// Loop over all categories and check how many products are linked</span>
-        <span class="k">for</span><span class="o">(</span><span class="kd">final</span> <span class="n">Entity</span> <span class="n">category</span> <span class="o">:</span> <span class="n">categoryList</span><span class="o">)</span> <span class="o">{</span>
-            <span class="kd">final</span> <span class="n">EntityCollection</span> <span class="n">products</span> <span class="o">=</span> <span class="n">getRelatedEntityCollection</span><span class="o">(</span><span class="n">category</span><span class="o">,</span> <span class="n">productEntityType</span><span class="o">);</span>
-            <span class="k">if</span><span class="o">(</span><span class="n">products</span><span class="o">.</span><span class="na">getEntities</span><span class="o">().</span><span class="na">size</span><span class="o">()</span> <span class="o">==</span> <span class="n">amount</span><span class="o">)</span> <span class="o">{</span>
-                <span class="n">resultEntityList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">category</span><span class="o">);</span>
-            <span class="o">}</span>
-        <span class="o">}</span>
-
-        <span class="kd">final</span> <span class="n">EntityCollection</span> <span class="n">resultCollection</span> <span class="o">=</span> <span class="k">new</span> <span class="n">EntityCollection</span><span class="o">();</span>
-        <span class="n">resultCollection</span><span class="o">.</span><span class="na">getEntities</span><span class="o">().</span><span class="na">addAll</span><span class="o">(</span><span class="n">resultEntityList</span><span class="o">);</span>
-        <span class="k">return</span> <span class="n">resultCollection</span><span class="o">;</span>
-    <span class="o">}</span> <span class="k">else</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;Function not implemented&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">ROOT</span><span class="o">);</span>
-    <span class="o">}</span>
+  <span class="k">if</span><span class="o">(</span><span class="n">DemoEdmProvider</span><span class="o">.</span><span class="na">FUNCTION_COUNT_CATEGORIES</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getFunctionImport</span><span class="o">().</span><span class="na">getName</span><span class="o">()))</span> <span class="o">{</span>
+    <span class="c1">// Get the parameter of the function</span>
+    <span class="kd">final</span> <span class="n">UriParameter</span> <span class="n">parameterAmount</span> <span class="o">=</span> <span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getParameters</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="c1">// Try to convert the parameter to an Integer.</span>
+    <span class="c1">// We have to take care, that the type of parameter fits to its EDM declaration</span>
+    <span class="kt">int</span> <span class="n">amount</span><span class="o">;</span>
+    <span class="k">try</span> <span class="o">{</span>
+      <span class="n">amount</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">parameterAmount</span><span class="o">.</span><span class="na">getText</span><span class="o">());</span>
+    <span class="o">}</span> <span class="k">catch</span><span class="o">(</span><span class="n">NumberFormatException</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;Type of parameter Amount must be Edm.Int32&quot;</span><span class="o">,</span>
+        <span class="n">HttpStatusCode</span><span class="o">.</span><span class="na">BAD_REQUEST</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="kd">final</span> <span class="n">EdmEntityType</span> <span class="n">productEntityType</span> <span class="o">=</span> <span class="n">serviceMetadata</span><span class="o">.</span><span class="na">getEdm</span><span class="o">().</span><span class="na">getEntityType</span><span class="o">(</span><span class="n">DemoEdmProvider</span><span class="o">.</span><span class="na">ET_PRODUCT_FQN</span><span class="o">);</span>
+    <span class="kd">final</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Entity</span><span class="o">&gt;</span> <span class="n">resultEntityList</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="c1">// Loop over all categories and check how many products are linked</span>
+    <span class="k">for</span><span class="o">(</span><span class="kd">final</span> <span class="n">Entity</span> <span class="n">category</span> <span class="o">:</span> <span class="n">categoryList</span><span class="o">)</span> <span class="o">{</span>
+      <span class="kd">final</span> <span class="n">EntityCollection</span> <span class="n">products</span> <span class="o">=</span> <span class="n">getRelatedEntityCollection</span><span class="o">(</span><span class="n">category</span><span class="o">,</span> <span class="n">productEntityType</span><span class="o">);</span>
+      <span class="k">if</span><span class="o">(</span><span class="n">products</span><span class="o">.</span><span class="na">getEntities</span><span class="o">().</span><span class="na">size</span><span class="o">()</span> <span class="o">==</span> <span class="n">amount</span><span class="o">)</span> <span class="o">{</span>
+        <span class="n">resultEntityList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">category</span><span class="o">);</span>
+      <span class="o">}</span>
+    <span class="o">}</span>
+
+    <span class="kd">final</span> <span class="n">EntityCollection</span> <span class="n">resultCollection</span> <span class="o">=</span> <span class="k">new</span> <span class="n">EntityCollection</span><span class="o">();</span>
+    <span class="n">resultCollection</span><span class="o">.</span><span class="na">getEntities</span><span class="o">().</span><span class="na">addAll</span><span class="o">(</span><span class="n">resultEntityList</span><span class="o">);</span>
+    <span class="k">return</span> <span class="n">resultCollection</span><span class="o">;</span>
+  <span class="o">}</span> <span class="k">else</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;Function not implemented&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">ROOT</span><span class="o">);</span>
+  <span class="o">}</span>
 <span class="o">}</span>
 
-<span class="kd">public</span> <span class="n">Entity</span> <span class="nf">readFunctionImportEntity</span><span class="o">(</span><span class="kd">final</span> <span class="n">UriResourceFunction</span> <span class="n">uriResourceFunction</span><span class="o">,</span> 
-    <span class="kd">final</span> <span class="n">ServiceMetadata</span> <span class="n">serviceMetadata</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">ODataApplicationException</span> <span class="o">{</span>
+<span class="kd">public</span> <span class="n">Entity</span> <span class="nf">readFunctionImportEntity</span><span class="o">(</span><span class="kd">final</span> <span class="n">UriResourceFunction</span> <span class="n">uriResourceFunction</span><span class="o">,</span>
+  <span class="kd">final</span> <span class="n">ServiceMetadata</span> <span class="n">serviceMetadata</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">ODataApplicationException</span> <span class="o">{</span>
 
-    <span class="kd">final</span> <span class="n">EntityCollection</span> <span class="n">entityCollection</span> <span class="o">=</span> <span class="n">readFunctionImportCollection</span><span class="o">(</span><span class="n">uriResourceFunction</span><span class="o">,</span> <span class="n">serviceMetadata</span><span class="o">);</span>
-    <span class="kd">final</span> <span class="n">EdmEntityType</span> <span class="n">edmEntityType</span> <span class="o">=</span> <span class="o">(</span><span class="n">EdmEntityType</span><span class="o">)</span> <span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getFunction</span><span class="o">().</span><span class="na">getReturnType</span><span class="o">().</span><span class="na">getType</span><span class="o">();</span>
+  <span class="kd">final</span> <span class="n">EntityCollection</span> <span class="n">entityCollection</span> <span class="o">=</span> <span class="n">readFunctionImportCollection</span><span class="o">(</span><span class="n">uriResourceFunction</span><span class="o">,</span> <span class="n">serviceMetadata</span><span class="o">);</span>
+  <span class="kd">final</span> <span class="n">EdmEntityType</span> <span class="n">edmEntityType</span> <span class="o">=</span> <span class="o">(</span><span class="n">EdmEntityType</span><span class="o">)</span> <span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getFunction</span><span class="o">().</span><span class="na">getReturnType</span><span class="o">().</span><span class="na">getType</span><span class="o">();</span>
 
-    <span class="k">return</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">entityCollection</span><span class="o">,</span> <span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getKeyPredicates</span><span class="o">());</span>
+  <span class="k">return</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">entityCollection</span><span class="o">,</span> <span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getKeyPredicates</span><span class="o">());</span>
 <span class="o">}</span>
 </pre></div>
 
 
 <p>We also create two methods to reset the data of our service.</p>
 <div class="codehilite"><pre><span class="kd">public</span> <span class="kt">void</span> <span class="nf">resetDataSet</span><span class="o">(</span><span class="kd">final</span> <span class="kt">int</span> <span class="n">amount</span><span class="o">)</span> <span class="o">{</span>
-    <span class="c1">// Replace the old lists with empty ones</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">categoryList</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="c1">// Create new sample data</span>
-    <span class="n">initProductSampleData</span><span class="o">();</span>
-    <span class="n">initCategorySampleData</span><span class="o">();</span>
-
-    <span class="c1">// Truncate the lists</span>
-    <span class="k">if</span><span class="o">(</span><span class="n">amount</span> <span class="o">&lt;</span> <span class="n">productList</span><span class="o">.</span><span class="na">size</span><span class="o">())</span> <span class="o">{</span>
-        <span class="n">productList</span> <span class="o">=</span> <span class="n">productList</span><span class="o">.</span><span class="na">subList</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="n">amount</span><span class="o">);</span>
-        <span class="c1">// Products 0, 1 are linked to category 0</span>
-        <span class="c1">// Products 2, 3 are linked to category 1</span>
-        <span class="c1">// Products 4, 5 are linked to category 2</span>
-        <span class="n">categoryList</span> <span class="o">=</span> <span class="n">categoryList</span><span class="o">.</span><span class="na">subList</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="o">(</span><span class="n">amount</span> <span class="o">/</span> <span class="mi">2</span><span class="o">)</span> <span class="o">+</span> <span class="mi">1</span><span class="o">);</span>
-    <span class="o">}</span>
+  <span class="c1">// Replace the old lists with empty ones</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">categoryList</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="c1">// Create new sample data</span>
+  <span class="n">initProductSampleData</span><span class="o">();</span>
+  <span class="n">initCategorySampleData</span><span class="o">();</span>
+
+  <span class="c1">// Truncate the lists</span>
+  <span class="k">if</span><span class="o">(</span><span class="n">amount</span> <span class="o">&lt;</span> <span class="n">productList</span><span class="o">.</span><span class="na">size</span><span class="o">())</span> <span class="o">{</span>
+    <span class="n">productList</span> <span class="o">=</span> <span class="n">productList</span><span class="o">.</span><span class="na">subList</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="n">amount</span><span class="o">);</span>
+    <span class="c1">// Products 0, 1 are linked to category 0</span>
+    <span class="c1">// Products 2, 3 are linked to category 1</span>
+    <span class="c1">// Products 4, 5 are linked to category 2</span>
+    <span class="n">categoryList</span> <span class="o">=</span> <span class="n">categoryList</span><span class="o">.</span><span class="na">subList</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="o">(</span><span class="n">amount</span> <span class="o">/</span> <span class="mi">2</span><span class="o">)</span> <span class="o">+</span> <span class="mi">1</span><span class="o">);</span>
+  <span class="o">}</span>
 <span class="o">}</span>
 
 <span class="kd">public</span> <span class="kt">void</span> <span class="nf">resetDataSet</span><span class="o">()</span> <span class="o">{</span>
-    <span class="n">resetDataSet</span><span class="o">(</span><span class="n">Integer</span><span class="o">.</span><span class="na">MAX_VALUE</span><span class="o">);</span>
+  <span class="n">resetDataSet</span><span class="o">(</span><span class="n">Integer</span><span class="o">.</span><span class="na">MAX_VALUE</span><span class="o">);</span>
 <span class="o">}</span>
 </pre></div>
 
 
-<h2 id="33-extent-the-entity-collection-and-the-entity-processor-to-handle-function-imports">3.3 Extent the entity collection and the entity processor to handle function imports<a class="headerlink" href="#33-extent-the-entity-collection-and-the-entity-processor-to-handle-function-imports" title="Permanent link">&para;</a></h2>
-<p>We start with the entity collection processor <em>DemoEntityCollectionProcessor</em>.
-To keep things simple, the first steps is to distinguish between entity collections and function imports. 
+<h2 id="33-extend-the-entity-collection-and-the-entity-processor-to-handle-function-imports">3.3 Extend the entity collection and the entity processor to handle function imports<a class="headerlink" href="#33-extend-the-entity-collection-and-the-entity-processor-to-handle-function-imports" title="Permanent link">&para;</a></h2>
+<p>We start with the entity collection processor <code>DemoEntityCollectionProcessor</code>.
+To keep things simple, the first steps is to distinguish between entity collections and function imports.
 A cleverer implementation can handle both cases in one method to avoid duplicated code.</p>
-<p>The recent implementation of the <em>readEntityCollection</em> has been moved to <em>readEntityCollectionInternal</em></p>
+<p>The recent implementation of the <code>readEntityCollection()</code> has been moved to <code>readEntityCollectionInternal()</code></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="kd">final</span> <span class="n">UriResource</span> <span class="n">firstResourceSegment</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="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
+  <span class="kd">final</span> <span class="n">UriResource</span> <span class="n">firstResourceSegment</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="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
 
-    <span class="k">if</span><span class="o">(</span><span class="n">firstResourceSegment</span> <span class="k">instanceof</span> <span class="n">UriResourceEntitySet</span><span class="o">)</span> <span class="o">{</span>
-        <span class="n">readEntityCollectionInternal</span><span class="o">(</span><span class="n">request</span><span class="o">,</span> <span class="n">response</span><span class="o">,</span> <span class="n">uriInfo</span><span class="o">,</span> <span class="n">responseFormat</span><span class="o">);</span>
-    <span class="o">}</span> <span class="k">else</span> <span class="k">if</span><span class="o">(</span><span class="n">firstResourceSegment</span> <span class="k">instanceof</span> <span class="n">UriResourceFunction</span><span class="o">)</span> <span class="o">{</span>
-        <span class="n">readFunctionImportCollection</span><span class="o">(</span><span class="n">request</span><span class="o">,</span> <span class="n">response</span><span class="o">,</span> <span class="n">uriInfo</span><span class="o">,</span> <span class="n">responseFormat</span><span class="o">);</span>
-    <span class="o">}</span> <span class="k">else</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;Not implemented&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="k">if</span><span class="o">(</span><span class="n">firstResourceSegment</span> <span class="k">instanceof</span> <span class="n">UriResourceEntitySet</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">readEntityCollectionInternal</span><span class="o">(</span><span class="n">request</span><span class="o">,</span> <span class="n">response</span><span class="o">,</span> <span class="n">uriInfo</span><span class="o">,</span> <span class="n">responseFormat</span><span class="o">);</span>
+  <span class="o">}</span> <span class="k">else</span> <span class="k">if</span><span class="o">(</span><span class="n">firstResourceSegment</span> <span class="k">instanceof</span> <span class="n">UriResourceFunction</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">readFunctionImportCollection</span><span class="o">(</span><span class="n">request</span><span class="o">,</span> <span class="n">response</span><span class="o">,</span> <span class="n">uriInfo</span><span class="o">,</span> <span class="n">responseFormat</span><span class="o">);</span>
+  <span class="o">}</span> <span class="k">else</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;Not implemented&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="o">}</span>
 </pre></div>
 
 
-<p>Like reading entity collections, the first step are analyze the URI and read the data (of the function import).</p>
-<div class="codehilite"><pre><span class="kd">private</span> <span class="kt">void</span> <span class="nf">readFunctionImportCollection</span><span class="o">(</span><span class="kd">final</span> <span class="n">ODataRequest</span> <span class="n">request</span><span class="o">,</span> <span class="kd">final</span> <span class="n">ODataResponse</span> <span class="n">response</span><span class="o">,</span> 
-    <span class="kd">final</span> <span class="n">UriInfo</span> <span class="n">uriInfo</span><span class="o">,</span> <span class="kd">final</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 step: Analyze the URI and fetch the entity collection returned by the function import</span>
-    <span class="c1">// Function Imports are always the first segment of the resource path</span>
-    <span class="kd">final</span> <span class="n">UriResource</span> <span class="n">firstSegment</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="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
-
-    <span class="k">if</span><span class="o">(!(</span><span class="n">firstSegment</span> <span class="k">instanceof</span> <span class="n">UriResourceFunction</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;Not implemented&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>
+<p>Like reading <em>entity collections</em>, the first step are analyze the URI and read the data (of the function import).</p>
+<div class="codehilite"><pre><span class="kd">private</span> <span class="kt">void</span> <span class="nf">readFunctionImportCollection</span><span class="o">(</span><span class="kd">final</span> <span class="n">ODataRequest</span> <span class="n">request</span><span class="o">,</span> <span class="kd">final</span> <span class="n">ODataResponse</span> <span class="n">response</span><span class="o">,</span>
+  <span class="kd">final</span> <span class="n">UriInfo</span> <span class="n">uriInfo</span><span class="o">,</span> <span class="kd">final</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="kd">final</span> <span class="n">UriResourceFunction</span> <span class="n">uriResourceFunction</span> <span class="o">=</span> <span class="o">(</span><span class="n">UriResourceFunction</span><span class="o">)</span> <span class="n">firstSegment</span><span class="o">;</span>
-    <span class="kd">final</span> <span class="n">EntityCollection</span> <span class="n">entityCol</span> <span class="o">=</span> <span class="n">storage</span><span class="o">.</span><span class="na">readFunctionImportCollection</span><span class="o">(</span><span class="n">uriResourceFunction</span><span class="o">,</span> <span class="n">serviceMetadata</span><span class="o">);</span>
-</pre></div>
+  <span class="c1">// 1st step: Analyze the URI and fetch the entity collection returned by the function import</span>
+  <span class="c1">// Function Imports are always the first segment of the resource path</span>
+  <span class="kd">final</span> <span class="n">UriResource</span> <span class="n">firstSegment</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="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
 
+  <span class="k">if</span><span class="o">(!(</span><span class="n">firstSegment</span> <span class="k">instanceof</span> <span class="n">UriResourceFunction</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;Not implemented&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>
 
-<p>Then the result has to be serialized. The only difference to entity sets is the way how the Edm Entity Type is determined.</p>
-<div class="codehilite"><pre>    <span class="c1">// 2nd step: Serialize the response entity</span>
-    <span class="kd">final</span> <span class="n">EdmEntityType</span> <span class="n">edmEntityType</span> <span class="o">=</span> <span class="o">(</span><span class="n">EdmEntityType</span><span class="o">)</span> <span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getFunction</span><span class="o">().</span><span class="na">getReturnType</span><span class="o">().</span><span class="na">getType</span><span class="o">();</span>
-    <span class="kd">final</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">asCollection</span><span class="o">().</span><span class="na">type</span><span class="o">(</span><span class="n">edmEntityType</span><span class="o">).</span><span class="na">build</span><span class="o">();</span>
-    <span class="n">EntityCollectionSerializerOptions</span> <span class="n">opts</span> <span class="o">=</span> <span class="n">EntityCollectionSerializerOptions</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="kd">final</span> <span class="n">ODataSerializer</span> <span class="n">serializer</span> <span class="o">=</span> <span class="n">odata</span><span class="o">.</span><span class="na">createSerializer</span><span class="o">(</span><span class="n">responseFormat</span><span class="o">);</span>
-    <span class="kd">final</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">entityCollection</span><span class="o">(</span><span class="n">serviceMetadata</span><span class="o">,</span> <span class="n">edmEntityType</span><span class="o">,</span> <span class="n">entityCol</span><span class="o">,</span> <span class="n">opts</span><span class="o">);</span>
-
-    <span class="c1">// 3rd 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">serializerResult</span><span class="o">.</span><span class="na">getContent</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>
+  <span class="kd">final</span> <span class="n">UriResourceFunction</span> <span class="n">uriResourceFunction</span> <span class="o">=</span> <span class="o">(</span><span class="n">UriResourceFunction</span><span class="o">)</span> <span class="n">firstSegment</span><span class="o">;</span>
+  <span class="kd">final</span> <span class="n">EntityCollection</span> <span class="n">entityCol</span> <span class="o">=</span> <span class="n">storage</span><span class="o">.</span><span class="na">readFunctionImportCollection</span><span class="o">(</span><span class="n">uriResourceFunction</span><span class="o">,</span> <span class="n">serviceMetadata</span><span class="o">);</span>
 </pre></div>
 
 
-<p>Next we will implement the processor to read a single entity. The implementation is quite similar to the implementation of the collection processor.</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">// The sample service supports only functions imports and entity sets.</span>
-    <span class="c1">// We do not care about bound functions and composable functions.</span>
-
-    <span class="n">UriResource</span> <span class="n">uriResource</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="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
-
-    <span class="k">if</span><span class="o">(</span><span class="n">uriResource</span> <span class="k">instanceof</span> <span class="n">UriResourceEntitySet</span><span class="o">)</span> <span class="o">{</span>
-        <span class="n">readEntityInternal</span><span class="o">(</span><span class="n">request</span><span class="o">,</span> <span class="n">response</span><span class="o">,</span> <span class="n">uriInfo</span><span class="o">,</span> <span class="n">responseFormat</span><span class="o">);</span>
-    <span class="o">}</span> <span class="k">else</span> <span class="k">if</span><span class="o">(</span><span class="n">uriResource</span> <span class="k">instanceof</span> <span class="n">UriResourceFunction</span><span class="o">)</span> <span class="o">{</span>
-        <span class="n">readFunctionImportInternal</span><span class="o">(</span><span class="n">request</span><span class="o">,</span> <span class="n">response</span><span class="o">,</span> <span class="n">uriInfo</span><span class="o">,</span> <span class="n">responseFormat</span><span class="o">);</span>
-    <span class="o">}</span> <span class="k">else</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;Only EntitySet is supported&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>
+<p>Then the result has to be serialized. The only difference to entity sets is the way how the <code>EdmEntityType</code> is determined.</p>
+<div class="codehilite"><pre>  <span class="c1">// 2nd step: Serialize the response entity</span>
+  <span class="kd">final</span> <span class="n">EdmEntityType</span> <span class="n">edmEntityType</span> <span class="o">=</span> <span class="o">(</span><span class="n">EdmEntityType</span><span class="o">)</span> <span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getFunction</span><span class="o">().</span><span class="na">getReturnType</span><span class="o">().</span><span class="na">getType</span><span class="o">();</span>
+  <span class="kd">final</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">asCollection</span><span class="o">().</span><span class="na">type</span><span class="o">(</span><span class="n">edmEntityType</span><span class="o">).</span><span class="na">build</span><span class="o">();</span>
+  <span class="n">EntityCollectionSerializerOptions</span> <span class="n">opts</span> <span class="o">=</span> <span class="n">EntityCollectionSerializerOptions</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="kd">final</span> <span class="n">ODataSerializer</span> <span class="n">serializer</span> <span class="o">=</span> <span class="n">odata</span><span class="o">.</span><span class="na">createSerializer</span><span class="o">(</span><span class="n">responseFormat</span><span class="o">);</span>
+  <span class="kd">final</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">entityCollection</span><span class="o">(</span><span class="n">serviceMetadata</span><span class="o">,</span> <span class="n">edmEntityType</span><span class="o">,</span> <span class="n">entityCol</span><span class="o">,</span> <span class="n">opts</span><span class="o">);</span>
+
+  <span class="c1">// 3rd 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">serializerResult</span><span class="o">.</span><span class="na">getContent</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>
 
-<span class="kd">private</span> <span class="kt">void</span> <span class="nf">readFunctionImportInternal</span><span class="o">(</span><span class="kd">final</span> <span class="n">ODataRequest</span> <span class="n">request</span><span class="o">,</span> <span class="kd">final</span> <span class="n">ODataResponse</span> <span class="n">response</span><span class="o">,</span>
-    <span class="kd">final</span> <span class="n">UriInfo</span> <span class="n">uriInfo</span><span class="o">,</span> <span class="kd">final</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 step: Analyze the URI and fetch the entity returned by the function import</span>
-    <span class="c1">// Function Imports are always the first segment of the resource path</span>
-    <span class="kd">final</span> <span class="n">UriResource</span> <span class="n">firstSegment</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="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
-
-    <span class="k">if</span><span class="o">(!(</span><span class="n">firstSegment</span> <span class="k">instanceof</span> <span class="n">UriResourceFunction</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;Not implemented&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>
+<p>Next we will implement the processor to read a <em>single entity</em>. The implementation is quite similar to the implementation of the collection processor.</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="kd">final</span> <span class="n">UriResourceFunction</span> <span class="n">uriResourceFunction</span> <span class="o">=</span> <span class="o">(</span><span class="n">UriResourceFunction</span><span class="o">)</span> <span class="n">firstSegment</span><span class="o">;</span>
-    <span class="kd">final</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">readFunctionImportEntity</span><span class="o">(</span><span class="n">uriResourceFunction</span><span class="o">,</span> <span class="n">serviceMetadata</span><span class="o">);</span>
+  <span class="c1">// The sample service supports only functions imports and entity sets.</span>
+  <span class="c1">// We do not care about bound functions and composable functions.</span>
 
-    <span class="k">if</span><span class="o">(</span><span class="n">entity</span> <span class="o">==</span> <span class="kc">null</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;Nothing found.&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">ROOT</span><span class="o">);</span>
-    <span class="o">}</span>
+  <span class="n">UriResource</span> <span class="n">uriResource</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="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
 
-    <span class="c1">// 2nd step: Serialize the response entity</span>
-    <span class="kd">final</span> <span class="n">EdmEntityType</span> <span class="n">edmEntityType</span> <span class="o">=</span> <span class="o">(</span><span class="n">EdmEntityType</span><span class="o">)</span> <span class="n">uriResourceFunction</span><span class="o">.</span><span class="na">getFunction</span><span class="o">().</span><span class="na">getReturnType</span><span class="o">().</span><span class="na">getType</span><span class="o">();</span>
-    <span class="kd">final</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">type</span><span class="o">(</span><span class="n">edmEntityType</span><span class="o">).</span><span class="na">build</span><span class="o">();</span>

[... 189 lines stripped ...]