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/08/12 09:21:27 UTC

svn commit: r961583 - in /websites/staging/olingo/trunk/content: ./ doc/odata4/tutorials/sqo_es/tutorial_sqo_es.html

Author: buildbot
Date: Wed Aug 12 07:21:26 2015
New Revision: 961583

Log:
Staging update by buildbot for olingo

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

Propchange: websites/staging/olingo/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Wed Aug 12 07:21:26 2015
@@ -1 +1 @@
-1695428
+1695432

Modified: websites/staging/olingo/trunk/content/doc/odata4/tutorials/sqo_es/tutorial_sqo_es.html
==============================================================================
--- websites/staging/olingo/trunk/content/doc/odata4/tutorials/sqo_es/tutorial_sqo_es.html (original)
+++ websites/staging/olingo/trunk/content/doc/odata4/tutorials/sqo_es/tutorial_sqo_es.html Wed Aug 12 07:21:26 2015
@@ -180,12 +180,12 @@ The drawback of this implementation is,
 <p>We have to take care about the context URL, which is different in case that <code>$select</code> is used.
   Again, the Olingo library provides some support, which we use to build the select list that has to be passed to the ContextURL builder:</p>
 <div class="codehilite"><pre><span class="c1">// we need the property names of the $select, in order to build the context URL</span>
-<span class="n">String</span> <span class="n">selectList</span> <span class="o">=</span> <span class="n">odata</span><span class="o">.</span><span class="na">createUriHelper</span><span class="o">().</span><span class="na">buildContextURLSelectList</span><span class="o">(</span>
-<span class="n">edmEntityType</span><span class="o">,</span> <span class="kc">null</span><span class="o">,</span> <span class="n">selectOption</span><span class="o">);</span>
+<span class="n">String</span> <span class="n">selectList</span> <span class="o">=</span> <span class="n">odata</span><span class="o">.</span><span class="na">createUriHelper</span><span class="o">().</span><span class="na">buildContextURLSelectList</span><span class="o">(</span><span class="n">edmEntityType</span><span class="o">,</span>
+                                                                      <span class="kc">null</span><span class="o">,</span> <span class="n">selectOption</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="o">.</span><span class="na">entitySet</span><span class="o">(</span><span class="n">edmEntitySet</span><span class="o">)</span>
-          <span class="o">.</span><span class="na">selectList</span><span class="o">(</span><span class="n">selectList</span><span class="o">)</span>
-          <span class="o">.</span><span class="na">build</span><span class="o">();</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="o">.</span><span class="na">selectList</span><span class="o">(</span><span class="n">selectList</span><span class="o">)</span>
+                                  <span class="o">.</span><span class="na">build</span><span class="o">();</span>
 </pre></div>
 
 
@@ -194,9 +194,9 @@ The drawback of this implementation is,
 <p>Furthermore, the serializer has to know about the usage of <code>$select</code>.
   Therefore, the serializer options instance is initialized with the selectOption object that we’ve obtained above. If this object is not null, then the serializer will take care to consider the <code>$select</code> statement</p>
 <div class="codehilite"><pre><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="o">.</span><span class="na">contextURL</span><span class="o">(</span><span class="n">contextUrl</span><span class="o">)</span>
-          <span class="o">.</span><span class="na">select</span><span class="o">(</span><span class="n">selectOption</span><span class="o">)</span>
-          <span class="o">.</span><span class="na">build</span><span class="o">();</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="o">.</span><span class="na">select</span><span class="o">(</span><span class="n">selectOption</span><span class="o">)</span>
+                                                                          <span class="o">.</span><span class="na">build</span><span class="o">();</span>
 </pre></div>
 
 
@@ -205,7 +205,7 @@ The drawback of this implementation is,
 <p><strong>The full implementation of the <code>readEntityCollection()</code> method:</strong></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">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 EdmEntitySet from the uriInfo</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>
@@ -227,21 +227,21 @@ The drawback of this implementation is,
   <span class="c1">// and serialize the content: transform from the EntitySet object to InputStream</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">// we need the property names of the $select, in order to build the context URL</span>
-  <span class="n">String</span> <span class="n">selectList</span> <span class="o">=</span> <span class="n">odata</span><span class="o">.</span><span class="na">createUriHelper</span><span class="o">().</span><span class="na">buildContextURLSelectList</span><span class="o">(</span>
-                    <span class="n">edmEntityType</span><span class="o">,</span> <span class="kc">null</span><span class="o">,</span> <span class="n">selectOption</span><span class="o">);</span>
+  <span class="n">String</span> <span class="n">selectList</span> <span class="o">=</span> <span class="n">odata</span><span class="o">.</span><span class="na">createUriHelper</span><span class="o">().</span><span class="na">buildContextURLSelectList</span><span class="o">(</span><span class="n">edmEntityType</span><span class="o">,</span>
+                                                                        <span class="kc">null</span><span class="o">,</span> <span class="n">selectOption</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="o">.</span><span class="na">entitySet</span><span class="o">(</span><span class="n">edmEntitySet</span><span class="o">)</span>
-        <span class="o">.</span><span class="na">selectList</span><span class="o">(</span><span class="n">selectList</span><span class="o">)</span>
-        <span class="o">.</span><span class="na">build</span><span class="o">();</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="o">.</span><span class="na">selectList</span><span class="o">(</span><span class="n">selectList</span><span class="o">)</span>
+                                    <span class="o">.</span><span class="na">build</span><span class="o">();</span>
 
 
   <span class="c1">// adding the selectOption to the serializerOpts will tell the lib to do the job</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="o">.</span><span class="na">contextURL</span><span class="o">(</span><span class="n">contextUrl</span><span class="o">)</span>
-        <span class="o">.</span><span class="na">select</span><span class="o">(</span><span class="n">selectOption</span><span class="o">)</span>
-        <span class="o">.</span><span class="na">build</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">entityCollection</span><span class="o">(</span><span class="n">srvMetadata</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">opts</span><span class="o">);</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="o">.</span><span class="na">select</span><span class="o">(</span><span class="n">selectOption</span><span class="o">)</span>
+                                                                            <span class="o">.</span><span class="na">build</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">entityCollection</span><span class="o">(</span><span class="n">srvMetadata</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">opts</span><span class="o">);</span>
 
   <span class="c1">// 5th: configure the response object: set the body, headers and status code</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>
@@ -320,20 +320,50 @@ Therefore, we can directly access the fi
 <p><strong>Note:</strong><br />
 Most OData services will have more entity types and more navigation possibilities. In such services, it might be desired to invoke <code>$expand</code> with more than one navigation property, like for example: <a href="http://localhost:8080/DemoService/DemoService.svc/Products?$expand=Category,Supplier,Sales">http://localhost:8080/DemoService/DemoService.svc/Products?$expand=Category,Supplier,Sales</a><br />
 Such <code>$expand</code> expression is not considered in our example.  </p>
-<p>Now that we have the <code>ExpandItem</code>, the next step is to extract the navigation property from it.<br />
-For that, we have to ask the ExpandItem for its list if resource segments.<br />
+<p>Now that we have the <code>ExpandItem</code>, the next step is to extract the navigation property (<code>EdmNavicationProperty</code>) from it.  </p>
+<p>For the case of a request with <code>$expand=*</code> (to expand all navigation items which is checked via <code>expandItem.isStar()</code>), all known <code>EdmNavigationPropertyBinding</code>s from the expanded <code>EdmEntityType</code> have to be checked.
+For our (reduced) sample service we know that only one navigation exists, hence the implementation is:</p>
+<div class="codehilite"><pre><span class="k">if</span><span class="o">(</span><span class="n">expandItem</span><span class="o">.</span><span class="na">isStar</span><span class="o">())</span> <span class="o">{</span>
+  <span class="n">List</span><span class="o">&lt;</span><span class="n">EdmNavigationPropertyBinding</span><span class="o">&gt;</span> <span class="n">bindings</span> <span class="o">=</span> <span class="n">edmEntitySet</span><span class="o">.</span><span class="na">getNavigationPropertyBindings</span><span class="o">();</span>
+  <span class="c1">// we know that there are navigation bindings</span>
+  <span class="c1">// however normally in this case a check if navigation bindings exists is done</span>
+  <span class="k">if</span><span class="o">(!</span><span class="n">bindings</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">())</span> <span class="o">{</span>
+    <span class="c1">// can in our case only be &#39;Category&#39; or &#39;Products&#39;, so we can take the first</span>
+    <span class="n">EdmNavigationPropertyBinding</span> <span class="n">binding</span> <span class="o">=</span> <span class="n">bindings</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">EdmElement</span> <span class="n">property</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="na">getProperty</span><span class="o">(</span><span class="n">binding</span><span class="o">.</span><span class="na">getPath</span><span class="o">());</span>
+    <span class="c1">// we don&#39;t need to handle error cases, as it is done in the Olingo library</span>
+    <span class="k">if</span><span class="o">(</span><span class="n">property</span> <span class="k">instanceof</span> <span class="n">EdmNavigationProperty</span><span class="o">)</span> <span class="o">{</span>
+      <span class="n">edmNavigationProperty</span> <span class="o">=</span> <span class="o">(</span><span class="n">EdmNavigationProperty</span><span class="o">)</span> <span class="n">property</span><span class="o">;</span>
+    <span class="o">}</span>
+  <span class="o">}</span>
+<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<p>For the case of a request with defined name of navigation property to expand (e.g. <code>$expand=Category</code>), we have to ask the ExpandItem for its list if resource segments.<br />
 The reason why an ExpandItem can be formed by multiple segments is that a navigation property can be in a <code>ComplexType</code>, such that it would be required to address it by a path.  </p>
 <p>In our simple example, we don’t need to specify a path, therefore we can safely write  </p>
-<div class="codehilite"><pre><span class="n">UriResource</span> <span class="n">uriResource</span> <span class="o">=</span> <span class="n">expandItem</span><span class="o">.</span><span class="na">getResourcePath</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>
+<div class="codehilite"><pre><span class="o">...</span>
+<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
+  <span class="c1">// can be &#39;Category&#39; or &#39;Products&#39;, no path supported</span>
+  <span class="n">UriResource</span> <span class="n">uriResource</span> <span class="o">=</span> <span class="n">expandItem</span><span class="o">.</span><span class="na">getResourcePath</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">// we don&#39;t need to handle error cases, as it is done in the Olingo library</span>
+  <span class="k">if</span><span class="o">(</span><span class="n">uriResource</span> <span class="k">instanceof</span> <span class="n">UriResourceNavigation</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">edmNavigationProperty</span> <span class="o">=</span> <span class="o">((</span><span class="n">UriResourceNavigation</span><span class="o">)</span> <span class="n">uriResource</span><span class="o">).</span><span class="na">getProperty</span><span class="o">();</span>
+  <span class="o">}</span>
+<span class="o">}</span>
 </pre></div>
 
 
 <p>This <code>uriResource</code> corresponds to the navigation property that we want to extract.<br />
 We expect that the <code>uriResource</code> is of type <code>UriResourceNavigation</code>, such that we can cast.<br />
-The <code>UriResourceNavigation</code> can then be asked for the <code>NavigationProperty</code> which in turn delivers the corresponding <code>EdmEntityType</code>, which we’re interested in:  </p>
-<div class="codehilite"><pre><span class="k">if</span><span class="o">(</span><span class="n">uriResource</span> <span class="k">instanceof</span> <span class="n">UriResourceNavigation</span><span class="o">){</span>
-<span class="n">EdmNavigationProperty</span> <span class="n">edmNavigationProperty</span> <span class="o">=</span> <span class="o">((</span><span class="n">UriResourceNavigation</span><span class="o">)</span><span class="n">uriResource</span><span class="o">).</span><span class="na">getProperty</span><span class="o">();</span>
-<span class="n">EdmEntityType</span> <span class="n">expandEdmEntityType</span> <span class="o">=</span> <span class="n">edmNavigationProperty</span><span class="o">.</span><span class="na">getType</span><span class="o">();</span>
+The <code>UriResourceNavigation</code> can then be asked for the <code>NavigationProperty</code> which in turn delivers the corresponding <code>EdmEntityType</code>, which we’re interested in.</p>
+<p>Finally after one of above cases we have the necessary <code>EdmNavigationProperty</code> from which we need the <code>EdmEntityType</code> and the <code>name</code> of the navigation property to build the resopnse data.</p>
+<div class="codehilite"><pre><span class="k">if</span><span class="o">(</span><span class="n">edmNavigationProperty</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+  <span class="n">EdmEntityType</span> <span class="n">expandEdmEntityType</span> <span class="o">=</span> <span class="n">edmNavigationProperty</span><span class="o">.</span><span class="na">getType</span><span class="o">();</span>
+  <span class="n">String</span> <span class="n">navPropName</span> <span class="o">=</span> <span class="n">edmNavigationProperty</span><span class="o">.</span><span class="na">getName</span><span class="o">();</span>
+  <span class="o">...</span>
 </pre></div>
 
 
@@ -386,6 +416,8 @@ Also, the <code>expandOption</code> has
 </pre></div>
 
 
+<p><strong>Note:</strong><br />
+The complete <code>readEntity(...)</code> method can be found in the <em>Appendix</em> at the end of the site or together with the <code>readEntityCollection(...)</code> method in the <a href="http://www.apache.org/dyn/closer.cgi/olingo/odata4/Tutorials/DemoService_Tutorial_sqo_es.zip">sample project zip</a> (<a href="https://dist.apache.org/repos/dist/release/olingo/odata4/Tutorials/DemoService_Tutorial_sqo_es.zip.md5">md5</a>, <a href="https://dist.apache.org/repos/dist/release/olingo/odata4/Tutorials/DemoService_Tutorial_sqo_es.zip.sha512">sha512</a>, <a href="https://dist.apache.org/repos/dist/release/olingo/odata4/Tutorials/DemoService_Tutorial_sqo_es.zip.asc">pgp</a>).</p>
 <h2 id="33-implement-expand-with-options">3.3. Implement $expand with options<a class="headerlink" href="#33-implement-expand-with-options" title="Permanent link">&para;</a></h2>
 <p><strong>Background</strong></p>
 <p>As of OData v4 spec, the expand can also be further refined with system query options  </p>
@@ -479,7 +511,116 @@ The same system query option expressions
 <li><a href="http://odata.org/">Official OData Homepage</a></li>
 <li><a href="http://www.odata.org/documentation/">OData documentation</a></li>
 <li><a href="/javadoc/odata4/index.html">Olingo Javadoc</a></li>
-</ul><div align="center">
+</ul>
+<h1 id="7-appendix">7. Appendix<a class="headerlink" href="#7-appendix" title="Permanent link">&para;</a></h1>
+<h3 id="sample-code-snippets">Sample code snippets<a class="headerlink" href="#sample-code-snippets" title="Permanent link">&para;</a></h3>
+<p><strong>readEntity(...)</strong></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. apply system query options</span>
+
+  <span class="c1">// handle $select</span>
+  <span class="n">SelectOption</span> <span class="n">selectOption</span> <span class="o">=</span> <span class="n">uriInfo</span><span class="o">.</span><span class="na">getSelectOption</span><span class="o">();</span>
+  <span class="c1">// in our example, we don&#39;t have performance issues, so we can rely upon the handling in the Olingo lib</span>
+  <span class="c1">// nothing else to be done</span>
+
+  <span class="c1">// handle $expand</span>
+  <span class="n">ExpandOption</span> <span class="n">expandOption</span> <span class="o">=</span> <span class="n">uriInfo</span><span class="o">.</span><span class="na">getExpandOption</span><span class="o">();</span>
+  <span class="c1">// in our example: http://localhost:8080/DemoService/DemoService.svc/Categories(1)/$expand=Products</span>
+  <span class="c1">// or http://localhost:8080/DemoService/DemoService.svc/Products(1)?$expand=Category</span>
+  <span class="k">if</span><span class="o">(</span><span class="n">expandOption</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+    <span class="c1">// retrieve the EdmNavigationProperty from the expand expression</span>
+    <span class="c1">// Note: in our example, we have only one NavigationProperty, so we can directly access it</span>
+    <span class="n">EdmNavigationProperty</span> <span class="n">edmNavigationProperty</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+    <span class="n">ExpandItem</span> <span class="n">expandItem</span> <span class="o">=</span> <span class="n">expandOption</span><span class="o">.</span><span class="na">getExpandItems</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">expandItem</span><span class="o">.</span><span class="na">isStar</span><span class="o">())</span> <span class="o">{</span>
+      <span class="n">List</span><span class="o">&lt;</span><span class="n">EdmNavigationPropertyBinding</span><span class="o">&gt;</span> <span class="n">bindings</span> <span class="o">=</span> <span class="n">edmEntitySet</span><span class="o">.</span><span class="na">getNavigationPropertyBindings</span><span class="o">();</span>
+      <span class="c1">// we know that there are navigation bindings</span>
+      <span class="c1">// however normally in this case a check if navigation bindings exists is done</span>
+      <span class="k">if</span><span class="o">(!</span><span class="n">bindings</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">())</span> <span class="o">{</span>
+        <span class="c1">// can in our case only be &#39;Category&#39; or &#39;Products&#39;, so we can take the first</span>
+        <span class="n">EdmNavigationPropertyBinding</span> <span class="n">binding</span> <span class="o">=</span> <span class="n">bindings</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">EdmElement</span> <span class="n">property</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="na">getProperty</span><span class="o">(</span><span class="n">binding</span><span class="o">.</span><span class="na">getPath</span><span class="o">());</span>
+        <span class="c1">// we don&#39;t need to handle error cases, as it is done in the Olingo library</span>
+        <span class="k">if</span><span class="o">(</span><span class="n">property</span> <span class="k">instanceof</span> <span class="n">EdmNavigationProperty</span><span class="o">)</span> <span class="o">{</span>
+          <span class="n">edmNavigationProperty</span> <span class="o">=</span> <span class="o">(</span><span class="n">EdmNavigationProperty</span><span class="o">)</span> <span class="n">property</span><span class="o">;</span>
+        <span class="o">}</span>
+      <span class="o">}</span>
+    <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
+      <span class="c1">// can be &#39;Category&#39; or &#39;Products&#39;, no path supported</span>
+      <span class="n">UriResource</span> <span class="n">uriResource</span> <span class="o">=</span> <span class="n">expandItem</span><span class="o">.</span><span class="na">getResourcePath</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">// we don&#39;t need to handle error cases, as it is done in the Olingo library</span>
+      <span class="k">if</span><span class="o">(</span><span class="n">uriResource</span> <span class="k">instanceof</span> <span class="n">UriResourceNavigation</span><span class="o">)</span> <span class="o">{</span>
+        <span class="n">edmNavigationProperty</span> <span class="o">=</span> <span class="o">((</span><span class="n">UriResourceNavigation</span><span class="o">)</span> <span class="n">uriResource</span><span class="o">).</span><span class="na">getProperty</span><span class="o">();</span>
+      <span class="o">}</span>
+    <span class="o">}</span>
+
+    <span class="c1">// can be &#39;Category&#39; or &#39;Products&#39;, no path supported</span>
+    <span class="c1">// we don&#39;t need to handle error cases, as it is done in the Olingo library</span>
+    <span class="k">if</span><span class="o">(</span><span class="n">edmNavigationProperty</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+      <span class="n">EdmEntityType</span> <span class="n">expandEdmEntityType</span> <span class="o">=</span> <span class="n">edmNavigationProperty</span><span class="o">.</span><span class="na">getType</span><span class="o">();</span>
+      <span class="n">String</span> <span class="n">navPropName</span> <span class="o">=</span> <span class="n">edmNavigationProperty</span><span class="o">.</span><span class="na">getName</span><span class="o">();</span>
+
+      <span class="c1">// build the inline data</span>
+      <span class="n">Link</span> <span class="n">link</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Link</span><span class="o">();</span>
+      <span class="n">link</span><span class="o">.</span><span class="na">setTitle</span><span class="o">(</span><span class="n">navPropName</span><span class="o">);</span>
+      <span class="n">link</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">Constants</span><span class="o">.</span><span class="na">ENTITY_NAVIGATION_LINK_TYPE</span><span class="o">);</span>
+
+      <span class="k">if</span><span class="o">(</span><span class="n">edmNavigationProperty</span><span class="o">.</span><span class="na">isCollection</span><span class="o">()){</span> <span class="c1">// in case of Categories(1)/$expand=Products</span>
+        <span class="c1">// fetch the data for the $expand (to-many navigation) from backend</span>
+        <span class="c1">// here we get the data for the expand</span>
+        <span class="n">EntityCollection</span> <span class="n">expandEntityCollection</span> <span class="o">=</span> <span class="n">storage</span><span class="o">.</span><span class="na">getRelatedEntityCollection</span><span class="o">(</span><span class="n">entity</span><span class="o">,</span> <span class="n">expandEdmEntityType</span><span class="o">);</span>
+        <span class="n">link</span><span class="o">.</span><span class="na">setInlineEntitySet</span><span class="o">(</span><span class="n">expandEntityCollection</span><span class="o">);</span>
+      <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>  <span class="c1">// in case of Products(1)?$expand=Category</span>
+        <span class="c1">// fetch the data for the $expand (to-one navigation) from backend</span>
+        <span class="c1">// here we get the data for the expand</span>
+        <span class="n">Entity</span> <span class="n">expandEntity</span> <span class="o">=</span> <span class="n">storage</span><span class="o">.</span><span class="na">getRelatedEntity</span><span class="o">(</span><span class="n">entity</span><span class="o">,</span> <span class="n">expandEdmEntityType</span><span class="o">);</span>
+        <span class="n">link</span><span class="o">.</span><span class="na">setInlineEntity</span><span class="o">(</span><span class="n">expandEntity</span><span class="o">);</span>
+      <span class="o">}</span>
+
+      <span class="c1">// set the link - containing the expanded data - to the current entity</span>
+      <span class="n">entity</span><span class="o">.</span><span class="na">getNavigationLinks</span><span class="o">().</span><span class="na">add</span><span class="o">(</span><span class="n">link</span><span class="o">);</span>
+    <span class="o">}</span>
+  <span class="o">}</span>
+
+
+  <span class="c1">// 4. serialize</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">// we need the property names of the $select, in order to build the context URL</span>
+  <span class="n">String</span> <span class="n">selectList</span> <span class="o">=</span> <span class="n">odata</span><span class="o">.</span><span class="na">createUriHelper</span><span class="o">().</span><span class="na">buildContextURLSelectList</span><span class="o">(</span><span class="n">edmEntityType</span><span class="o">,</span> <span class="n">expandOption</span><span class="o">,</span> <span class="n">selectOption</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="o">.</span><span class="na">selectList</span><span class="o">(</span><span class="n">selectList</span><span class="o">)</span>
+                                            <span class="o">.</span><span class="na">suffix</span><span class="o">(</span><span class="n">Suffix</span><span class="o">.</span><span class="na">ENTITY</span><span class="o">)</span>
+                                            <span class="o">.</span><span class="na">build</span><span class="o">();</span>
+
+  <span class="c1">// make sure that $expand and $select are considered by the serializer</span>
+  <span class="c1">// adding the selectOption to the serializerOpts will actually tell the lib to do the job</span>
+  <span class="n">EntitySerializerOptions</span> <span class="n">opts</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="o">.</span><span class="na">contextURL</span><span class="o">(</span><span class="n">contextUrl</span><span class="o">)</span>
+                                                        <span class="o">.</span><span class="na">select</span><span class="o">(</span><span class="n">selectOption</span><span class="o">)</span>
+                                                        <span class="o">.</span><span class="na">expand</span><span class="o">(</span><span class="n">expandOption</span><span class="o">)</span>
+                                                        <span class="o">.</span><span class="na">build</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="na">fromContentType</span><span class="o">(</span><span class="n">responseFormat</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">srvMetadata</span><span class="o">,</span> <span class="n">edmEntityType</span><span class="o">,</span> <span class="n">entity</span><span class="o">,</span> <span class="n">opts</span><span class="o">);</span>
+
+  <span class="c1">// 5. 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><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