Added: 
websites/staging/olingo/trunk/content/doc/odata4/tutorials/jpafunctionimport.html
==============================================================================
--- 
websites/staging/olingo/trunk/content/doc/odata4/tutorials/jpafunctionimport.html
 (added)
+++ 
websites/staging/olingo/trunk/content/doc/odata4/tutorials/jpafunctionimport.html
 Tue Sep 16 12:34:18 2014
@@ -0,0 +1,315 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="Apache Olingo provides libraries which 
enable developers to implement OData producers and OData consumers. The 
available OData Java library implements OData version 2.0. In future on goal is 
to provide an OData 4.0 compliant library once the OData standard is published 
at OASIS. The focus within the community is currently on the Java technology 
but it is up to the community to discuss if other environments find interest.">
+    <meta name="author" content="">
+    <link rel="icon" href="/favicon.ico">
+    <title>
+      Apache Olingo
+    </title><!-- Bootstrap core CSS -->
+    <link href="/css/bootstrap.css" rel="stylesheet" type="text/css"><!-- 
Custom styles for this template -->
+    <link href="/css/navbar.css" rel="stylesheet" type="text/css"><!-- Just 
for debugging purposes. Don't actually copy these 2 lines! -->
+    <link href="/css/offcanvas.css" rel="stylesheet" type="text/css"><!-- 
Custom styles for this template -->
+    <link rel="stylesheet" href="/css/main.css">
+    <!--[if lt IE 9]><script 
src="/js/ie8-responsive-file-warning.js"></script><![endif]-->
+
+    <script src="/js/ie-emulation-modes-warning.js" type="text/javascript">
+</script><!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
+
+    <script src="/js/ie10-viewport-bug-workaround.js" type="text/javascript">
+</script><!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and 
media queries -->
+    <!--[if lt IE 9]>
+      <script src="/js/html5shiv.min.js"></script>
+      <script src="/js/respond.min.js"></script>
+    <![endif]-->
+  </head>
+
+  <body>
+    <div class="container">
+      <!-- Static navbar -->
+      <div class="navbar navbar-default" role="navigation">
+        <div class="container-fluid">
+          <div class="navbar-header">
+            <button type="button" class="navbar-toggle" data-toggle="collapse" 
data-target=".navbar-collapse">
+              <span class="sr-only">Toggle navigation</span>
+             <span class="icon-bar"></span>
+             <span class="icon-bar"></span>
+             <span class="icon-bar"></span>
+            </button>
+              <img class="navbar-brand" src="/img/OlingoOrangeTM.png" 
style="width:62px;" >
+              <a class="navbar-brand" href="#">Apache Olingo™</a>
+          </div>
+          <div class="navbar-collapse collapse">
+            <ul class="nav navbar-nav">
+
+              <li><a href="/">Home</a></li>
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">ASF <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                      <li><a href="http://www.apache.org/foundation/";>ASF 
Home</a></li>
+                      <li><a 
href="http://projects.apache.org/";>Projects</a></li>
+                      <li><a href="http://people.apache.org/";>People</a></li>
+                      <li><a 
href="http://www.apache.org/foundation/getinvolved.html";>Get Involved</a></li>
+                      <li><a 
href="http://www.apache.org/dyn/closer.cgi";>Download</a></li>
+                      <li><a 
href="http://www.apache.org/security/";>Security</a></li>
+                      <li><a 
href="http://www.apache.org/foundation/sponsorship.html";>Support Apache</a></li>
+                  </ul>
+              </li>
+
+              <li><a href="http://www.apache.org/licenses/";>License</a></li>
+
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">Download <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                      <li><a href="/doc/odata2/download.html">Download OData 
2.0 Java</a></li>
+                      <li><a href="/doc/javascript/download.html">Download 
OData 4.0 JavaScript</a></li>
+                  </ul>
+              </li>
+
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">Documentation <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                    <li><a href="/doc/odata2/index.html">Documentation OData 
2.0 Java</a></li>
+                    <li><a href="/doc/javascript/index.html">Documentation 
OData 4.0 JavaScript</a></li>
+                  </ul>
+              </li>
+              <li><a href="/support.html">Support</a></li>
+
+            </ul>
+
+                         <img class="navbar-right" height="50px" 
src="/img/asf-logo.gif">
+
+                       </div><!--/.nav-collapse -->
+        </div><!--/.container-fluid -->
+      </div><!-- Main component for a primary marketing message or call to 
action --><h1 
id="adding-function-imports-to-odata-services-with-the-jpa-processor">Adding 
Function Imports to OData Services with the JPA Processor</h1>
+<hr />
+<p>Function imports are used to perform custom operations on a JPA entity in 
addition to CRUD operations. For example, consider a scenario where you would 
like to check the availability of an item to promise on the sales order line 
items. ATP check is a custom operation that can be exposed as a function import 
in the schema of OData service.</p>
+<p>OData JPA Processor Library is enhanced to:</p>
+<ul>
+<li>
+<p>Enable Custom Operations as Function Imports</p>
+</li>
+<li>
+<p>Add non JPA entity types as Complex Types to the EDM and use the same as 
Function Imports Return Type</p>
+</li>
+</ul>
+<h3 id="enabling-custom-operations-as-function-imports">Enabling Custom 
Operations as Function Imports</h3>
+<ol>
+<li>
+<p>Create a dependency to EDM Annotation Project. This is required to use the 
annotations that are defined in the project.</p>
+<p><dependency>
+  <groupId>org.apache.olingo</groupId>
+  <artifactId>olingo-odata2-api-annotation</artifactId>
+  <version>x.x.x</version>
+  <scope>provided</scope>
+</dependency></p>
+</li>
+<li>
+<p>Create a Java class and annotate the Java methods implementing custom 
operations with Function Import and Parameter Java annotations as shown below. 
Java methods can be created in JPA entity types and these methods can be 
annotated with EDM annotations for function import.</p>
+<div class="codehilite"><pre><span class="n">package</span> <span 
class="n">org</span><span class="p">.</span><span class="n">apache</span><span 
class="p">.</span><span class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">jpa</span><span 
class="p">.</span><span class="n">processor</span><span class="p">.</span><span 
class="n">ref</span><span class="p">.</span><span 
class="n">extension</span><span class="p">;</span>
+
+<span class="n">import</span> <span class="n">java</span><span 
class="p">.</span><span class="n">util</span><span class="p">.</span><span 
class="n">List</span><span class="p">;</span>
+
+<span class="n">import</span> <span class="n">javax</span><span 
class="p">.</span><span class="n">persistence</span><span 
class="p">.</span><span class="n">EntityManager</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">javax</span><span 
class="p">.</span><span class="n">persistence</span><span 
class="p">.</span><span class="n">Persistence</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">javax</span><span 
class="p">.</span><span class="n">persistence</span><span 
class="p">.</span><span class="n">Query</span><span class="p">;</span>
+
+<span class="n">import</span> <span class="n">org</span><span 
class="p">.</span><span class="n">apache</span><span class="p">.</span><span 
class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">api</span><span 
class="p">.</span><span class="n">annotation</span><span 
class="p">.</span><span class="n">edm</span><span class="p">.</span><span 
class="n">EdmFacets</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">org</span><span 
class="p">.</span><span class="n">apache</span><span class="p">.</span><span 
class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">api</span><span 
class="p">.</span><span class="n">annotation</span><span 
class="p">.</span><span class="n">edm</span><span class="p">.</span><span 
class="n">EdmFunctionImport</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">org</span><span 
class="p">.</span><span class="n">apache</span><span class="p">.</span><span 
class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">api</span><span 
class="p">.</span><span class="n">annotation</span><span 
class="p">.</span><span class="n">edm</span><span class="p">.</span><span 
class="n">EdmFunctionImport</span><span class="p">.</span><span 
class="n">HttpMethod</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">org</span><span 
class="p">.</span><span class="n">apache</span><span class="p">.</span><span 
class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">api</span><span 
class="p">.</span><span class="n">annotation</span><span 
class="p">.</span><span class="n">edm</span><span class="p">.</span><span 
class="n">EdmFunctionImport</span><span class="p">.</span><span 
class="n">ReturnType</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">org</span><span 
class="p">.</span><span class="n">apache</span><span class="p">.</span><span 
class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">api</span><span 
class="p">.</span><span class="n">annotation</span><span 
class="p">.</span><span class="n">edm</span><span class="p">.</span><span 
class="n">EdmFunctionImport</span><span class="p">.</span><span 
class="n">ReturnType</span><span class="p">.</span><span 
class="n">Type</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">org</span><span 
class="p">.</span><span class="n">apache</span><span class="p">.</span><span 
class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">api</span><span 
class="p">.</span><span class="n">annotation</span><span 
class="p">.</span><span class="n">edm</span><span class="p">.</span><span 
class="n">EdmFunctionImportParameter</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">org</span><span 
class="p">.</span><span class="n">apache</span><span class="p">.</span><span 
class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">api</span><span 
class="p">.</span><span class="n">exception</span><span class="p">.</span><span 
class="n">ODataException</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">org</span><span 
class="p">.</span><span class="n">apache</span><span class="p">.</span><span 
class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">jpa</span><span 
class="p">.</span><span class="n">processor</span><span class="p">.</span><span 
class="n">ref</span><span class="p">.</span><span class="n">model</span><span 
class="p">.</span><span class="n">Address</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">org</span><span 
class="p">.</span><span class="n">apache</span><span class="p">.</span><span 
class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">jpa</span><span 
class="p">.</span><span class="n">processor</span><span class="p">.</span><span 
class="n">ref</span><span class="p">.</span><span class="n">model</span><span 
class="p">.</span><span class="n">SalesOrderHeader</span><span 
class="p">;</span>
+<span class="n">import</span> <span class="n">org</span><span 
class="p">.</span><span class="n">apache</span><span class="p">.</span><span 
class="n">olingo</span><span class="p">.</span><span 
class="n">odata2</span><span class="p">.</span><span class="n">jpa</span><span 
class="p">.</span><span class="n">processor</span><span class="p">.</span><span 
class="n">ref</span><span class="p">.</span><span class="n">model</span><span 
class="p">.</span><span class="n">SalesOrderItem</span><span class="p">;</span>
+
+<span class="n">public</span> <span class="n">class</span> <span 
class="n">SalesOrderHeaderProcessor</span> <span class="p">{</span>
+
+  <span class="n">private</span> <span class="n">EntityManager</span> <span 
class="n">em</span><span class="p">;</span>
+
+  <span class="n">public</span> <span 
class="n">SalesOrderHeaderProcessor</span><span class="p">()</span> <span 
class="p">{</span>
+    <span class="n">em</span> <span class="p">=</span> <span 
class="n">Persistence</span><span class="p">.</span><span 
class="n">createEntityManagerFactory</span><span class="p">(</span>&quot;<span 
class="n">salesorderprocessing</span>&quot;<span class="p">)</span>
+       <span class="p">.</span><span class="n">createEntityManager</span><span 
class="p">();</span>
+<span class="p">}</span>
+
+<span class="p">@</span><span class="n">SuppressWarnings</span><span 
class="p">(</span>&quot;<span class="n">unchecked</span>&quot;<span 
class="p">)</span>
+<span class="p">@</span><span class="n">EdmFunctionImport</span><span 
class="p">(</span><span class="n">name</span> <span class="p">=</span> 
&quot;<span class="n">FindAllSalesOrders</span>&quot;<span class="p">,</span> 
<span class="n">entitySet</span> <span class="p">=</span> &quot;<span 
class="n">SalesOrders</span>&quot;<span class="p">,</span> <span 
class="n">returnType</span> <span class="p">=</span> <span 
class="p">@</span><span class="n">ReturnType</span><span class="p">(</span>
+    <span class="n">type</span> <span class="p">=</span> <span 
class="n">Type</span><span class="p">.</span><span class="n">ENTITY</span><span 
class="p">,</span> <span class="n">isCollection</span> <span class="p">=</span> 
<span class="n">true</span><span class="p">))</span>
+<span class="n">public</span> <span class="n">List</span><span 
class="o">&lt;</span><span class="n">SalesOrderHeader</span><span 
class="o">&gt;</span> <span class="n">findAllSalesOrders</span><span 
class="p">(</span>
+    <span class="p">@</span><span 
class="n">EdmFunctionImportParameter</span><span class="p">(</span><span 
class="n">name</span> <span class="p">=</span> &quot;<span 
class="n">DeliveryStatusCode</span>&quot;<span class="p">,</span>
+        <span class="n">facets</span> <span class="p">=</span> <span 
class="p">@</span><span class="n">EdmFacets</span><span class="p">(</span><span 
class="n">maxLength</span> <span class="p">=</span> 2<span class="p">))</span> 
<span class="n">final</span> <span class="n">String</span> <span 
class="n">status</span><span class="p">)</span> <span class="p">{</span>
+
+   <span class="n">Query</span> <span class="n">q</span> <span 
class="p">=</span> <span class="n">em</span>
+       <span class="p">.</span><span class="n">createQuery</span><span 
class="p">(</span>&quot;<span class="n">SELECT</span> <span class="n">E1</span> 
<span class="n">from</span> <span class="n">SalesOrderHeader</span> <span 
class="n">E1</span> <span class="n">WHERE</span> <span class="n">E1</span><span 
class="p">.</span><span class="n">deliveryStatus</span> <span 
class="p">=</span> <span class="s">&#39;&quot;</span>
+<span class="s">           + status + &quot;&#39;</span>&quot;<span 
class="p">);</span>
+    <span class="n">List</span><span class="o">&lt;</span><span 
class="n">SalesOrderHeader</span><span class="o">&gt;</span> <span 
class="n">soList</span> <span class="p">=</span> <span class="p">(</span><span 
class="n">List</span><span class="o">&lt;</span><span 
class="n">SalesOrderHeader</span><span class="o">&gt;</span><span 
class="p">)</span> <span class="n">q</span>
+        <span class="p">.</span><span class="n">getResultList</span><span 
class="p">();</span>
+    <span class="k">return</span> <span class="n">soList</span><span 
class="p">;</span>
+<span class="p">}</span>
+
+<span class="p">@</span><span class="n">EdmFunctionImport</span><span 
class="p">(</span><span class="n">name</span> <span class="p">=</span> 
&quot;<span class="n">CheckATP</span>&quot;<span class="p">,</span> <span 
class="n">returnType</span> <span class="p">=</span> <span 
class="p">@</span><span class="n">ReturnType</span><span 
class="p">(</span><span class="n">type</span> <span class="p">=</span> <span 
class="n">Type</span><span class="p">.</span><span class="n">SIMPLE</span><span 
class="p">,</span> <span class="n">isCollection</span> <span class="p">=</span> 
<span class="n">false</span><span class="p">),</span>
+    <span class="n">httpMethod</span> <span class="p">=</span> <span 
class="n">HttpMethod</span><span class="p">.</span><span 
class="n">GET</span><span class="p">)</span>
+<span class="n">public</span> <span class="n">boolean</span> <span 
class="n">checkATP</span><span class="p">(</span>
+   <span class="p">@</span><span 
class="n">EdmFunctionImportParameter</span><span class="p">(</span><span 
class="n">name</span> <span class="p">=</span> &quot;<span 
class="n">SoID</span>&quot;<span class="p">,</span> <span 
class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span 
class="n">EdmFacets</span><span class="p">(</span><span 
class="n">nullable</span> <span class="p">=</span> <span 
class="n">false</span><span class="p">))</span> <span class="n">final</span> 
<span class="n">Long</span> <span class="n">soID</span><span class="p">,</span>
+   <span class="p">@</span><span 
class="n">EdmFunctionImportParameter</span><span class="p">(</span><span 
class="n">name</span> <span class="p">=</span> &quot;<span 
class="n">LiId</span>&quot;<span class="p">,</span> <span 
class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span 
class="n">EdmFacets</span><span class="p">(</span><span 
class="n">nullable</span> <span class="p">=</span> <span 
class="n">false</span><span class="p">))</span> <span class="n">final</span> 
<span class="n">Long</span> <span class="n">lineItemID</span><span 
class="p">)</span> <span class="p">{</span>
+<span class="k">if</span> <span class="p">(</span><span class="n">soID</span> 
<span class="o">==</span> 2<span class="n">L</span><span class="p">)</span> 
<span class="p">{</span>
+        <span class="k">return</span> <span class="n">false</span><span 
class="p">;</span>
+      <span class="p">}</span> <span class="k">else</span> <span 
class="p">{</span>
+        <span class="k">return</span> <span class="n">true</span><span 
class="p">;</span>
+      <span class="p">}</span>
+<span class="p">}</span>
+
+<span class="p">@</span><span class="n">EdmFunctionImport</span><span 
class="p">(</span><span class="n">returnType</span> <span class="p">=</span> 
<span class="p">@</span><span class="n">ReturnType</span><span 
class="p">(</span><span class="n">type</span> <span class="p">=</span> <span 
class="n">Type</span><span class="p">.</span><span class="n">ENTITY</span><span 
class="p">,</span> <span class="n">isCollection</span> <span class="p">=</span> 
<span class="n">true</span><span class="p">),</span> <span 
class="n">entitySet</span> <span class="p">=</span> &quot;<span 
class="n">SalesOrders</span>&quot;<span class="p">)</span>
+<span class="n">public</span> <span class="n">SalesOrderHeader</span> <span 
class="n">calculateNetAmount</span><span class="p">(</span>
+    <span class="p">@</span><span 
class="n">EdmFunctionImportParameter</span><span class="p">(</span><span 
class="n">name</span> <span class="p">=</span> &quot;<span 
class="n">SoID</span>&quot;<span class="p">,</span> <span 
class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span 
class="n">EdmFacets</span><span class="p">(</span><span 
class="n">nullable</span> <span class="p">=</span> <span 
class="n">false</span><span class="p">))</span> <span class="n">final</span> 
<span class="n">Long</span> <span class="n">soID</span><span class="p">)</span>
+    <span class="n">throws</span> <span class="n">ODataException</span> <span 
class="p">{</span>
+
+<span class="k">if</span> <span class="p">(</span><span class="n">soID</span> 
<span class="o">&lt;</span><span class="p">=</span> 0<span 
class="n">L</span><span class="p">)</span> <span class="p">{</span>
+   <span class="n">throw</span> <span class="n">new</span> <span 
class="n">ODataException</span><span class="p">(</span>&quot;<span 
class="n">Invalid</span> <span class="n">SoID</span>&quot;<span 
class="p">);</span>
+<span class="p">}</span>
+
+<span class="n">Query</span> <span class="n">q</span> <span class="p">=</span> 
<span class="n">em</span>
+    <span class="p">.</span><span class="n">createQuery</span><span 
class="p">(</span>&quot;<span class="n">SELECT</span> <span class="n">E1</span> 
<span class="n">from</span> <span class="n">SalesOrderHeader</span> <span 
class="n">E1</span> <span class="n">WHERE</span> <span class="n">E1</span><span 
class="p">.</span><span class="n">soId</span> <span class="p">=</span> &quot;
+        <span class="o">+</span> <span class="n">soID</span> <span 
class="o">+</span> &quot;<span class="n">l</span>&quot;<span class="p">);</span>
+<span class="k">if</span> <span class="p">(</span><span 
class="n">q</span><span class="p">.</span><span 
class="n">getResultList</span><span class="p">().</span><span 
class="n">isEmpty</span><span class="p">())</span> <span class="p">{</span>
+  <span class="k">return</span> <span class="n">null</span><span 
class="p">;</span>
+<span class="p">}</span>
+<span class="n">SalesOrderHeader</span> <span class="n">so</span> <span 
class="p">=</span> <span class="p">(</span><span 
class="n">SalesOrderHeader</span><span class="p">)</span> <span 
class="n">q</span><span class="p">.</span><span 
class="n">getResultList</span><span class="p">().</span><span 
class="n">get</span><span class="p">(</span>0<span class="p">);</span>
+<span class="n">double</span> <span class="n">amount</span> <span 
class="p">=</span> 0<span class="p">;</span>
+<span class="k">for</span> <span class="p">(</span><span 
class="n">SalesOrderItem</span> <span class="n">soi</span> <span 
class="p">:</span> <span class="n">so</span><span class="p">.</span><span 
class="n">getSalesOrderItem</span><span class="p">())</span> <span 
class="p">{</span>
+  <span class="n">amount</span> <span class="p">=</span> <span 
class="n">amount</span>
+      <span class="o">+</span> <span class="p">(</span><span 
class="n">soi</span><span class="p">.</span><span 
class="n">getAmount</span><span class="p">()</span> <span class="o">*</span> 
<span class="n">soi</span><span class="p">.</span><span 
class="n">getDiscount</span><span class="p">()</span> <span class="o">*</span> 
<span class="n">soi</span><span class="p">.</span><span 
class="n">getQuantity</span><span class="p">());</span>
+<span class="p">}</span>
+<span class="n">so</span><span class="p">.</span><span 
class="n">setNetAmount</span><span class="p">(</span><span 
class="n">amount</span><span class="p">);</span>
+<span class="k">return</span> <span class="n">so</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="p">@</span><span class="n">SuppressWarnings</span><span 
class="p">(</span>&quot;<span class="n">unchecked</span>&quot;<span 
class="p">)</span>
+<span class="p">@</span><span class="n">EdmFunctionImport</span><span 
class="p">(</span><span class="n">returnType</span> <span class="p">=</span> 
<span class="p">@</span><span class="n">ReturnType</span><span 
class="p">(</span><span class="n">type</span> <span class="p">=</span> <span 
class="n">Type</span><span class="p">.</span><span 
class="n">COMPLEX</span><span class="p">))</span>
+<span class="n">public</span> <span class="n">Address</span> <span 
class="n">getAddress</span><span class="p">(</span>
+    <span class="p">@</span><span 
class="n">EdmFunctionImportParameter</span><span class="p">(</span><span 
class="n">name</span> <span class="p">=</span> &quot;<span 
class="n">SoID</span>&quot;<span class="p">,</span> <span 
class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span 
class="n">EdmFacets</span><span class="p">(</span><span 
class="n">nullable</span> <span class="p">=</span> <span 
class="n">false</span><span class="p">))</span> <span class="n">final</span> 
<span class="n">Long</span> <span class="n">soID</span><span class="p">)</span> 
<span class="p">{</span>
+  <span class="n">Query</span> <span class="n">q</span> <span 
class="p">=</span> <span class="n">em</span>
+      <span class="p">.</span><span class="n">createQuery</span><span 
class="p">(</span>&quot;<span class="n">SELECT</span> <span class="n">E1</span> 
<span class="n">from</span> <span class="n">SalesOrderHeader</span> <span 
class="n">E1</span> <span class="n">WHERE</span> <span class="n">E1</span><span 
class="p">.</span><span class="n">soId</span> <span class="p">=</span> &quot;
+          <span class="o">+</span> <span class="n">soID</span> <span 
class="o">+</span> &quot;<span class="n">l</span>&quot;<span class="p">);</span>
+  <span class="n">List</span><span class="o">&lt;</span><span 
class="n">SalesOrderHeader</span><span class="o">&gt;</span> <span 
class="n">soList</span> <span class="p">=</span> <span class="p">(</span><span 
class="n">List</span><span class="o">&lt;</span><span 
class="n">SalesOrderHeader</span><span class="o">&gt;</span><span 
class="p">)</span> <span class="n">q</span>
+      <span class="p">.</span><span class="n">getResultList</span><span 
class="p">();</span>
+  <span class="k">if</span> <span class="p">(</span>!<span 
class="n">soList</span><span class="p">.</span><span 
class="n">isEmpty</span><span class="p">())</span> <span class="p">{</span>
+  <span class="k">return</span> <span class="n">soList</span><span 
class="p">.</span><span class="n">get</span><span class="p">(</span>0<span 
class="p">).</span><span class="n">getCustomer</span><span 
class="p">().</span><span class="n">getAddress</span><span class="p">();</span>
+  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+    <span class="k">return</span> <span class="n">null</span><span 
class="p">;</span>
+  <span class="p">}</span>
+<span class="p">}</span>
+
+<span class="p">@</span><span class="n">EdmFunctionImport</span><span 
class="p">(</span><span class="n">returnType</span> <span class="p">=</span> 
<span class="p">@</span><span class="n">ReturnType</span><span 
class="p">(</span><span class="n">type</span> <span class="p">=</span> <span 
class="n">Type</span><span class="p">.</span><span 
class="n">COMPLEX</span><span class="p">))</span>
+<span class="n">public</span> <span class="n">OrderValue</span> <span 
class="n">orderValue</span><span class="p">(</span>
+    <span class="p">@</span><span 
class="n">EdmFunctionImportParameter</span><span class="p">(</span><span 
class="n">name</span> <span class="p">=</span> &quot;<span 
class="n">SoId</span>&quot;<span class="p">,</span> <span 
class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span 
class="n">EdmFacets</span><span class="p">(</span><span 
class="n">nullable</span> <span class="p">=</span> <span 
class="n">false</span><span class="p">))</span> <span class="n">final</span> 
<span class="n">Long</span> <span class="n">soID</span><span class="p">)</span> 
<span class="p">{</span>
+<span class="n">Query</span> <span class="n">q</span> <span class="p">=</span> 
<span class="n">em</span>
+    <span class="p">.</span><span class="n">createQuery</span><span 
class="p">(</span>&quot;<span class="n">SELECT</span> <span class="n">E1</span> 
<span class="n">from</span> <span class="n">SalesOrderHeader</span> <span 
class="n">E1</span> <span class="n">WHERE</span> <span class="n">E1</span><span 
class="p">.</span><span class="n">soId</span> <span class="p">=</span> &quot;
+        <span class="o">+</span> <span class="n">soID</span> <span 
class="o">+</span> &quot;<span class="n">l</span>&quot;<span class="p">);</span>
+<span class="k">if</span> <span class="p">(</span><span 
class="n">q</span><span class="p">.</span><span 
class="n">getResultList</span><span class="p">().</span><span 
class="n">isEmpty</span><span class="p">())</span> <span class="p">{</span>
+  <span class="k">return</span> <span class="n">null</span><span 
class="p">;</span>
+<span class="p">}</span>
+<span class="n">SalesOrderHeader</span> <span class="n">so</span> <span 
class="p">=</span> <span class="p">(</span><span 
class="n">SalesOrderHeader</span><span class="p">)</span> <span 
class="n">q</span><span class="p">.</span><span 
class="n">getResultList</span><span class="p">().</span><span 
class="n">get</span><span class="p">(</span>0<span class="p">);</span>
+<span class="n">double</span> <span class="n">amount</span> <span 
class="p">=</span> 0<span class="p">;</span>
+<span class="k">for</span> <span class="p">(</span><span 
class="n">SalesOrderItem</span> <span class="n">soi</span> <span 
class="p">:</span> <span class="n">so</span><span class="p">.</span><span 
class="n">getSalesOrderItem</span><span class="p">())</span> <span 
class="p">{</span>
+  <span class="n">amount</span> <span class="p">=</span> <span 
class="n">amount</span>
+       <span class="o">+</span> <span class="p">(</span><span 
class="n">soi</span><span class="p">.</span><span 
class="n">getAmount</span><span class="p">()</span> <span class="o">*</span> 
<span class="n">soi</span><span class="p">.</span><span 
class="n">getDiscount</span><span class="p">()</span> <span class="o">*</span> 
<span class="n">soi</span><span class="p">.</span><span 
class="n">getQuantity</span><span class="p">());</span>
+<span class="p">}</span>
+<span class="n">OrderValue</span> <span class="n">orderValue</span> <span 
class="p">=</span> <span class="n">new</span> <span 
class="n">OrderValue</span><span class="p">();</span>
+<span class="n">orderValue</span><span class="p">.</span><span 
class="n">setAmount</span><span class="p">(</span><span 
class="n">amount</span><span class="p">);</span>
+<span class="n">orderValue</span><span class="p">.</span><span 
class="n">setCurrency</span><span class="p">(</span><span 
class="n">so</span><span class="p">.</span><span 
class="n">getCurrencyCode</span><span class="p">());</span>
+<span class="k">return</span> <span class="n">orderValue</span><span 
class="p">;</span>
+<span class="p">}</span>
+
+  <span class="p">}</span>
+</pre></div>
+
+
+</li>
+<li>
+<p>Create a Java class by implementing the interface 
<em>org.apache.olingo.odata2.jpa.processor.api.model</em> to register the 
annotated Java methods.</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span 
class="kd">class</span> <span class="nc">SalesOrderProcessingExtension</span> 
<span class="kd">implements</span> <span class="n">JPAEdmExtension</span> <span 
class="o">{</span>
+  <span class="nd">@Override</span>
+  <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">extendJPAEdmSchema</span><span class="o">(</span><span 
class="kd">final</span> <span class="n">JPAEdmSchemaView</span> <span 
class="n">arg0</span> <span class="o">{</span>
+    <span class="c1">// TODO Auto-generated method stub</span>
+  <span class="o">}</span>
+
+  <span class="nd">@Override</span>
+  <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">extendWithOperation</span><span class="o">(</span><span 
class="kd">final</span> <span class="n">JPAEdmSchemaView</span> <span 
class="n">view</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">view</span><span class="o">.</span><span 
class="na">registerOperations</span><span class="o">(</span><span 
class="n">SalesOrderHeaderProcessor</span><span class="o">.</span><span 
class="na">class</span><span class="o">,</span> <span 
class="kc">null</span><span class="o">);</span>
+  <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p><em>Note</em>: Use the method <em>extendWithOperation</em> to register the 
list of classes and the methods within the class that needs to be exposed as 
Function Imports. If the second parameter is passed null, then the OData JPA 
Processor Library would consider all the annotated methods within the class for 
Function Import. However, you could also restrict the list of methods that 
needs to be transformed into function imports within a Java class by passing an 
array of Java method names as the second parameter.</p>
+</li>
+<li>
+<p>Register the class created in step 3 with <em>ODataJPAContext</em> as shown 
below. The registration can be done during the initialization of 
<em>ODataJPAContext</em> in OData JPA Service Factory along with initializing 
persistence unit name, entity manager factory instance and optional mapping 
model.</p>
+<div class="codehilite"><pre><span class="n">oDataJPAContext</span><span 
class="o">.</span><span class="na">setJPAEdmExtension</span><span 
class="o">((</span><span class="n">JPAEdmExtension</span><span 
class="o">)</span> <span class="k">new</span> <span 
class="n">SalesOrderProcessingExtension</span><span class="o">());</span>
+</pre></div>
+
+
+<p><em>Note</em>: You must register the class because the OData JPA Processor 
Library should be informed about the list of Java methods that it needs to 
process in a project. If we do not register, then OData JPA Processor Library 
should scan all the classes and the methods in the Java project looking for EDM 
annotations. In order to avoid such overload, it is mandatory to specify the 
list of Java methods that shall be transformed into function imports in a 
class.</p>
+</li>
+</ol>
+<h3 
id="using-non-jpa-entities-added-to-the-edm-as-function-imports-return-type">Using
 Non JPA Entities added to the EDM as Function Imports Return Type</h3>
+<p><strong>Prerequisite</strong></p>
+<p>Add non JPA Entity Types as Complex Types to the EDM. See <a 
href="/doc/odata2/tutorials/ExtendingtheEDM.html">Extending the EDM Generated 
from the JPA Models</a> for more information.</p>
+<p><em>Note</em>: The Simple Name of the Java class used as the return type in 
a Function Import and the name of the EDM Complex Type should be same.</p>
+<p>Here is an example, you define the operations inside the 
<code>SalesOrderHeaderProcessor</code> class and then register this class 
inside <code>JPAEdmExtension</code> class <code>extendWithOperation</code>. </p>
+<h5 id="sample-code">Sample Code</h5>
+<div class="codehilite"><pre>     <span class="p">@</span><span 
class="n">EdmFunctionImport</span><span class="p">(</span><span 
class="n">returnType</span> <span class="p">=</span> <span 
class="p">@</span><span class="n">ReturnType</span><span 
class="p">(</span><span class="n">type</span> <span class="p">=</span> <span 
class="n">Type</span><span class="p">.</span><span 
class="n">COMPLEX</span><span class="p">))</span>
+          <span class="n">public</span> <span class="n">OrderValue</span> 
<span class="n">orderValue</span><span class="p">(</span>
+
+             <span class="p">@</span><span 
class="n">EdmFunctionImportParameter</span><span class="p">(</span><span 
class="n">name</span> <span class="p">=</span> &quot;<span 
class="n">SoId</span>&quot;<span class="p">,</span> <span 
class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span 
class="n">EdmFacets</span><span class="p">(</span><span 
class="n">nullable</span> <span class="p">=</span> <span 
class="n">false</span><span class="p">))</span> <span class="n">final</span> 
<span class="n">Long</span> <span class="n">soID</span><span class="p">)</span> 
<span class="p">{</span>
+              <span class="n">Query</span> <span class="n">q</span> <span 
class="p">=</span> <span class="n">em</span>
+
+                  <span class="p">.</span><span 
class="n">createQuery</span><span class="p">(</span>&quot;<span 
class="n">SELECT</span> <span class="n">E1</span> <span class="n">from</span> 
<span class="n">SalesOrderHeader</span> <span class="n">E1</span> <span 
class="n">WHERE</span> <span class="n">E1</span><span class="p">.</span><span 
class="n">soId</span> <span class="p">=</span> &quot;
+                    <span class="o">+</span> <span class="n">soID</span> <span 
class="o">+</span> &quot;<span class="n">l</span>&quot;<span class="p">);</span>
+              <span class="k">if</span> <span class="p">(</span><span 
class="n">q</span><span class="p">.</span><span 
class="n">getResultList</span><span class="p">().</span><span 
class="n">isEmpty</span><span class="p">())</span> <span class="p">{</span>
+              <span class="k">return</span> <span class="n">null</span><span 
class="p">;</span>
+              <span class="p">}</span>
+              <span class="n">SalesOrderHeader</span> <span 
class="n">so</span> <span class="p">=</span> <span class="p">(</span><span 
class="n">SalesOrderHeader</span><span class="p">)</span> <span 
class="n">q</span><span class="p">.</span><span 
class="n">getResultList</span><span class="p">().</span><span 
class="n">get</span><span class="p">(</span>0<span class="p">);</span>
+              <span class="n">double</span> <span class="n">amount</span> 
<span class="p">=</span> 0<span class="p">;</span>
+              <span class="k">for</span> <span class="p">(</span><span 
class="n">SalesOrderItem</span> <span class="n">soi</span> <span 
class="p">:</span> <span class="n">so</span><span class="p">.</span><span 
class="n">getSalesOrderItem</span><span class="p">())</span> <span 
class="p">{</span>
+                <span class="n">amount</span> <span class="p">=</span> <span 
class="n">amount</span>
+                    <span class="o">+</span> <span class="p">(</span><span 
class="n">soi</span><span class="p">.</span><span 
class="n">getAmount</span><span class="p">()</span> <span class="o">*</span> 
<span class="n">soi</span><span class="p">.</span><span 
class="n">getDiscount</span><span class="p">()</span> <span class="o">*</span> 
<span class="n">soi</span><span class="p">.</span><span 
class="n">getQuantity</span><span class="p">());</span>
+              <span class="p">}</span>
+              <span class="n">OrderValue</span> <span 
class="n">orderValue</span> <span class="p">=</span> <span class="n">new</span> 
<span class="n">OrderValue</span><span class="p">();</span>
+              <span class="n">orderValue</span><span class="p">.</span><span 
class="n">setAmount</span><span class="p">(</span><span 
class="n">amount</span><span class="p">);</span>
+              <span class="n">orderValue</span><span class="p">.</span><span 
class="n">setCurrency</span><span class="p">(</span><span 
class="n">so</span><span class="p">.</span><span 
class="n">getCurrencyCode</span><span class="p">());</span>
+              <span class="k">return</span> <span 
class="n">orderValue</span><span class="p">;</span>
+              <span class="p">}</span>
+</pre></div><div align="center">
+<p>Copyright © 2013-2014, The Apache Software Foundation<br>
+                                               Apache Olingo, Olingo, Apache, 
the Apache feather, and
+                               the Apache Olingo project logo are trademarks 
of the Apache Software
+                               Foundation.</p>
+        <small><a href="/doc/odata2/privacy.html">Privacy</a></small>
+      </div>
+    </div><!-- /container -->
+    <!-- Bootstrap core JavaScript
+    ================================================== -->
+    <!-- Placed at the end of the document so the pages load faster -->
+    <script src="/js/jquery.js" type="text/javascript">
+</script>
+         <script src="/js/bootstrap.js" type="text/javascript">
+         <script src="/js/offcanvas.js" type="text/javascript">
+</script>
+        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
+        <script>
+            (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
+            function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
+            e=o.createElement(i);r=o.getElementsByTagName(i)[0];
+            e.src='//www.google-analytics.com/analytics.js';
+            r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
+            ga('create','UA-44963757-1');ga('send','pageview');
+        </script>
+  </body>
+</html>

Added: 
websites/staging/olingo/trunk/content/doc/odata4/tutorials/jparedefinemetadata.html
==============================================================================
--- 
websites/staging/olingo/trunk/content/doc/odata4/tutorials/jparedefinemetadata.html
 (added)
+++ 
websites/staging/olingo/trunk/content/doc/odata4/tutorials/jparedefinemetadata.html
 Tue Sep 16 12:34:18 2014
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="Apache Olingo provides libraries which 
enable developers to implement OData producers and OData consumers. The 
available OData Java library implements OData version 2.0. In future on goal is 
to provide an OData 4.0 compliant library once the OData standard is published 
at OASIS. The focus within the community is currently on the Java technology 
but it is up to the community to discuss if other environments find interest.">
+    <meta name="author" content="">
+    <link rel="icon" href="/favicon.ico">
+    <title>
+      Apache Olingo
+    </title><!-- Bootstrap core CSS -->
+    <link href="/css/bootstrap.css" rel="stylesheet" type="text/css"><!-- 
Custom styles for this template -->
+    <link href="/css/navbar.css" rel="stylesheet" type="text/css"><!-- Just 
for debugging purposes. Don't actually copy these 2 lines! -->
+    <link href="/css/offcanvas.css" rel="stylesheet" type="text/css"><!-- 
Custom styles for this template -->
+    <link rel="stylesheet" href="/css/main.css">
+    <!--[if lt IE 9]><script 
src="/js/ie8-responsive-file-warning.js"></script><![endif]-->
+
+    <script src="/js/ie-emulation-modes-warning.js" type="text/javascript">
+</script><!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
+
+    <script src="/js/ie10-viewport-bug-workaround.js" type="text/javascript">
+</script><!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and 
media queries -->
+    <!--[if lt IE 9]>
+      <script src="/js/html5shiv.min.js"></script>
+      <script src="/js/respond.min.js"></script>
+    <![endif]-->
+  </head>
+
+  <body>
+    <div class="container">
+      <!-- Static navbar -->
+      <div class="navbar navbar-default" role="navigation">
+        <div class="container-fluid">
+          <div class="navbar-header">
+            <button type="button" class="navbar-toggle" data-toggle="collapse" 
data-target=".navbar-collapse">
+              <span class="sr-only">Toggle navigation</span>
+             <span class="icon-bar"></span>
+             <span class="icon-bar"></span>
+             <span class="icon-bar"></span>
+            </button>
+              <img class="navbar-brand" src="/img/OlingoOrangeTM.png" 
style="width:62px;" >
+              <a class="navbar-brand" href="#">Apache Olingo™</a>
+          </div>
+          <div class="navbar-collapse collapse">
+            <ul class="nav navbar-nav">
+
+              <li><a href="/">Home</a></li>
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">ASF <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                      <li><a href="http://www.apache.org/foundation/";>ASF 
Home</a></li>
+                      <li><a 
href="http://projects.apache.org/";>Projects</a></li>
+                      <li><a href="http://people.apache.org/";>People</a></li>
+                      <li><a 
href="http://www.apache.org/foundation/getinvolved.html";>Get Involved</a></li>
+                      <li><a 
href="http://www.apache.org/dyn/closer.cgi";>Download</a></li>
+                      <li><a 
href="http://www.apache.org/security/";>Security</a></li>
+                      <li><a 
href="http://www.apache.org/foundation/sponsorship.html";>Support Apache</a></li>
+                  </ul>
+              </li>
+
+              <li><a href="http://www.apache.org/licenses/";>License</a></li>
+
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">Download <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                      <li><a href="/doc/odata2/download.html">Download OData 
2.0 Java</a></li>
+                      <li><a href="/doc/javascript/download.html">Download 
OData 4.0 JavaScript</a></li>
+                  </ul>
+              </li>
+
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">Documentation <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                    <li><a href="/doc/odata2/index.html">Documentation OData 
2.0 Java</a></li>
+                    <li><a href="/doc/javascript/index.html">Documentation 
OData 4.0 JavaScript</a></li>
+                  </ul>
+              </li>
+              <li><a href="/support.html">Support</a></li>
+
+            </ul>
+
+                         <img class="navbar-right" height="50px" 
src="/img/asf-logo.gif">
+
+                       </div><!--/.nav-collapse -->
+        </div><!--/.container-fluid -->
+      </div><!-- Main component for a primary marketing message or call to 
action --><h3 id="redefining-metadata">Redefining Metadata</h3>
+<p>The OData services created from JPA models using OData JPA Processor 
Library derives the names for its elements from Java Persistence Entity 
elements. These derived (default) names can be redefined using JPA EDM mapping 
models. JPA EDM Mapping model can be used to redefine:
+<em> Schema Namespace Name
+</em> Entity Type Names
+<em> Entity Set Names<br />
+</em> Property Names
+<em> Navigation Property Names 
+</em> Complex Type Names</p>
+<p>The OData JPA Processor Library applies certain naming rules to derive the 
names for the above OData elements by default. Here are the rules:</p>
+<ol>
+<li>Schema Namespace Name is derived from Java Persistence Unit Name.</li>
+<li>Entity Type Names are derived from Java Persistence Entity Type Names.</li>
+<li>Entity Set Names are derived from EDM Entity Type Names suffixed with 
character "s".</li>
+<li>Property Names are derived from Java Persistence Entity Attribute Names. 
The initial character in the property name is converted to an upper-case 
character.</li>
+<li>Navigation Property Names are derived from Java Persistence attribute name 
representing relationships. The navigation property name is suffixed with the 
word "Details".</li>
+<li>Complex Type Names are derived from Java Persistence Embeddable type 
names.</li>
+</ol>
+<p><em>Note</em>: The names generated by applying the above rules can be 
overridden using JPA EDM Mapping models. JPA EDM mapping model can be 
maintained as an XML document according to the schema.</p>
+<h4 id="steps-to-redefine-the-metadata">Steps to Redefine the Metadata</h4>
+<ol>
+<li>Create a JPA EDM Mapping model XML according to the schema given below. In 
the XML, maintain the mapping only for those elements that needs to be 
redefined. For example, if JPA Entity Type A's name has to be redefined, then 
maintain an EDM name for the same.
+   Link to <a 
href="http://olingo.apache.org/resources/RedefiningTheMetadataSchema";>Schema</a>.</li>
+<li>Deploy the JPA EDM Mapping model XML file in the root directory of your 
web application archive (store it in the same directory as 'WEB-INF').</li>
+<li>
+<p>Pass the XML name into <em>ODataJPAContext</em>. In the method 
<em>initializeODataJPAContext</em>, pass the name of the XML document as shown 
below:</p>
+<div class="codehilite"><pre><span class="n">oDataJPAContext</span><span 
class="p">.</span><span class="n">setJPAEdmNameMappingModel</span><span 
class="p">(</span><span class="o">&lt;</span><span class="n">mapping</span> 
<span class="n">XML</span> <span class="n">filename</span> <span 
class="n">with</span> <span class="n">XML</span> <span 
class="n">extension</span><span class="o">&gt;</span><span class="p">);</span>
+</pre></div>
+
+
+</li>
+<li>
+<p>Compile, deploy and run the web application in a web server. A sample JPA 
EDM Mapping Model is provided as an example below:</p>
+</li>
+</ol>
+<h5 id="sample-jpa-edm-mapping-model">Sample JPA EDM Mapping Model</h5>
+<div class="codehilite"><pre>      <span class="cp">&lt;?xml 
version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;</span> 
+    - <span class="nt">&lt;JPAEDMMappingModel</span> <span 
class="na">xmlns=</span><span 
class="s">&quot;http://www.apache.org/olingo/odata2/jpa/processor/api/model/mapping&quot;</span><span
 class="nt">&gt;</span>
+      - <span class="nt">&lt;PersistenceUnit</span> <span 
class="na">name=</span><span 
class="s">&quot;salesorderprocessing&quot;</span><span class="nt">&gt;</span>
+          <span 
class="nt">&lt;EDMSchemaNamespace&gt;</span>SalesOrderProcessing<span 
class="nt">&lt;/EDMSchemaNamespace&gt;</span> 
+        - <span class="nt">&lt;JPAEntityTypes&gt;</span>
+          - <span class="nt">&lt;JPAEntityType</span> <span 
class="na">name=</span><span class="s">&quot;SalesOrderHeader&quot;</span><span 
class="nt">&gt;</span>
+              <span class="nt">&lt;EDMEntityType&gt;</span>SalesOrder<span 
class="nt">&lt;/EDMEntityType&gt;</span> 
+              <span class="nt">&lt;EDMEntitySet&gt;</span>SalesOrders<span 
class="nt">&lt;/EDMEntitySet&gt;</span> 
+            - <span class="nt">&lt;JPAAttributes&gt;</span>
+                <span class="nt">&lt;JPAAttribute</span> <span 
class="na">name=</span><span class="s">&quot;soId&quot;</span><span 
class="nt">&gt;</span>ID<span class="nt">&lt;/JPAAttribute&gt;</span> 
+                <span class="nt">&lt;JPAAttribute</span> <span 
class="na">name=</span><span class="s">&quot;netAmount&quot;</span><span 
class="nt">&gt;</span>NetAmount<span class="nt">&lt;/JPAAttribute&gt;</span> 
+                <span class="nt">&lt;JPAAttribute</span> <span 
class="na">name=</span><span class="s">&quot;buyerAddress&quot;</span><span 
class="nt">&gt;</span>BuyerAddressInfo<span 
class="nt">&lt;/JPAAttribute&gt;</span> 
+              <span class="nt">&lt;/JPAAttributes&gt;</span>
+            - <span class="nt">&lt;JPARelationships&gt;</span>
+                <span class="nt">&lt;JPARelationship</span> <span 
class="na">name=</span><span class="s">&quot;salesOrderItem&quot;</span><span 
class="nt">&gt;</span>SalesOrderLineItemDetails<span 
class="nt">&lt;/JPARelationship&gt;</span> 
+                <span class="nt">&lt;JPARelationship</span> <span 
class="na">name=</span><span class="s">&quot;notes&quot;</span><span 
class="nt">&gt;</span>NotesDetails<span 
class="nt">&lt;/JPARelationship&gt;</span> 
+              <span class="nt">&lt;/JPARelationships&gt;</span>
+            <span class="nt">&lt;/JPAEntityType&gt;</span>
+          - <span class="nt">&lt;JPAEntityType</span> <span 
class="na">name=</span><span class="s">&quot;SalesOrderItem&quot;</span><span 
class="nt">&gt;</span>
+              <span 
class="nt">&lt;EDMEntityType&gt;</span>SalesOrderLineItem<span 
class="nt">&lt;/EDMEntityType&gt;</span> 
+              <span 
class="nt">&lt;EDMEntitySet&gt;</span>SalesOrderLineItems<span 
class="nt">&lt;/EDMEntitySet&gt;</span> 
+            - <span class="nt">&lt;JPAAttributes&gt;</span>
+                <span class="nt">&lt;JPAAttribute</span> <span 
class="na">name=</span><span class="s">&quot;liId&quot;</span><span 
class="nt">&gt;</span>ID<span class="nt">&lt;/JPAAttribute&gt;</span> 
+                <span class="nt">&lt;JPAAttribute</span> <span 
class="na">name=</span><span class="s">&quot;soId&quot;</span><span 
class="nt">&gt;</span>SalesOrderID<span class="nt">&lt;/JPAAttribute&gt;</span> 
+              <span class="nt">&lt;/JPAAttributes&gt;</span>
+            - <span class="nt">&lt;JPARelationships&gt;</span>
+                <span class="nt">&lt;JPARelationship</span> <span 
class="na">name=</span><span class="s">&quot;salesOrderHeader&quot;</span><span 
class="nt">&gt;</span>SalesOrderHeaderDetails<span 
class="nt">&lt;/JPARelationship&gt;</span> 
+                <span class="nt">&lt;JPARelationship</span> <span 
class="na">name=</span><span class="s">&quot;materials&quot;</span><span 
class="nt">&gt;</span>MaterialDetails<span 
class="nt">&lt;/JPARelationship&gt;</span> 
+              <span class="nt">&lt;/JPARelationships&gt;</span>
+            <span class="nt">&lt;/JPAEntityType&gt;</span>
+          <span class="nt">&lt;/JPAEntityTypes&gt;</span>
+        - <span class="nt">&lt;JPAEmbeddableTypes&gt;</span>
+          - <span class="nt">&lt;JPAEmbeddableType</span> <span 
class="na">name=</span><span class="s">&quot;Address&quot;</span><span 
class="nt">&gt;</span>
+              <span class="nt">&lt;EDMComplexType&gt;</span>AddressInfo<span 
class="nt">&lt;/EDMComplexType&gt;</span> 
+            - <span class="nt">&lt;JPAAttributes&gt;</span>
+                <span class="nt">&lt;JPAAttribute</span> <span 
class="na">name=</span><span class="s">&quot;houseNumber&quot;</span><span 
class="nt">&gt;</span>Number<span class="nt">&lt;/JPAAttribute&gt;</span> 
+                <span class="nt">&lt;JPAAttribute</span> <span 
class="na">name=</span><span class="s">&quot;streetName&quot;</span><span 
class="nt">&gt;</span>Street<span class="nt">&lt;/JPAAttribute&gt;</span> 
+              <span class="nt">&lt;/JPAAttributes&gt;</span>
+            <span class="nt">&lt;/JPAEmbeddableType&gt;</span>
+          <span class="nt">&lt;/JPAEmbeddableTypes&gt;</span>
+        <span class="nt">&lt;/PersistenceUnit&gt;</span>
+      <span class="nt">&lt;/JPAEDMMappingModel&gt;</span>
+</pre></div><div align="center">
+<p>Copyright © 2013-2014, The Apache Software Foundation<br>
+                                               Apache Olingo, Olingo, Apache, 
the Apache feather, and
+                               the Apache Olingo project logo are trademarks 
of the Apache Software
+                               Foundation.</p>
+        <small><a href="/doc/odata2/privacy.html">Privacy</a></small>
+      </div>
+    </div><!-- /container -->
+    <!-- Bootstrap core JavaScript
+    ================================================== -->
+    <!-- Placed at the end of the document so the pages load faster -->
+    <script src="/js/jquery.js" type="text/javascript">
+</script>
+         <script src="/js/bootstrap.js" type="text/javascript">
+         <script src="/js/offcanvas.js" type="text/javascript">
+</script>
+        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
+        <script>
+            (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
+            function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
+            e=o.createElement(i);r=o.getElementsByTagName(i)[0];
+            e.src='//www.google-analytics.com/analytics.js';
+            r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
+            ga('create','UA-44963757-1');ga('send','pageview');
+        </script>
+  </body>
+</html>

Added: websites/staging/olingo/trunk/content/doc/odata4/tutorials/osgi.html
==============================================================================
--- websites/staging/olingo/trunk/content/doc/odata4/tutorials/osgi.html (added)
+++ websites/staging/olingo/trunk/content/doc/odata4/tutorials/osgi.html Tue 
Sep 16 12:34:18 2014
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="Apache Olingo provides libraries which 
enable developers to implement OData producers and OData consumers. The 
available OData Java library implements OData version 2.0. In future on goal is 
to provide an OData 4.0 compliant library once the OData standard is published 
at OASIS. The focus within the community is currently on the Java technology 
but it is up to the community to discuss if other environments find interest.">
+    <meta name="author" content="">
+    <link rel="icon" href="/favicon.ico">
+    <title>
+      Apache Olingo
+    </title><!-- Bootstrap core CSS -->
+    <link href="/css/bootstrap.css" rel="stylesheet" type="text/css"><!-- 
Custom styles for this template -->
+    <link href="/css/navbar.css" rel="stylesheet" type="text/css"><!-- Just 
for debugging purposes. Don't actually copy these 2 lines! -->
+    <link href="/css/offcanvas.css" rel="stylesheet" type="text/css"><!-- 
Custom styles for this template -->
+    <link rel="stylesheet" href="/css/main.css">
+    <!--[if lt IE 9]><script 
src="/js/ie8-responsive-file-warning.js"></script><![endif]-->
+
+    <script src="/js/ie-emulation-modes-warning.js" type="text/javascript">
+</script><!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
+
+    <script src="/js/ie10-viewport-bug-workaround.js" type="text/javascript">
+</script><!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and 
media queries -->
+    <!--[if lt IE 9]>
+      <script src="/js/html5shiv.min.js"></script>
+      <script src="/js/respond.min.js"></script>
+    <![endif]-->
+  </head>
+
+  <body>
+    <div class="container">
+      <!-- Static navbar -->
+      <div class="navbar navbar-default" role="navigation">
+        <div class="container-fluid">
+          <div class="navbar-header">
+            <button type="button" class="navbar-toggle" data-toggle="collapse" 
data-target=".navbar-collapse">
+              <span class="sr-only">Toggle navigation</span>
+             <span class="icon-bar"></span>
+             <span class="icon-bar"></span>
+             <span class="icon-bar"></span>
+            </button>
+              <img class="navbar-brand" src="/img/OlingoOrangeTM.png" 
style="width:62px;" >
+              <a class="navbar-brand" href="#">Apache Olingo™</a>
+          </div>
+          <div class="navbar-collapse collapse">
+            <ul class="nav navbar-nav">
+
+              <li><a href="/">Home</a></li>
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">ASF <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                      <li><a href="http://www.apache.org/foundation/";>ASF 
Home</a></li>
+                      <li><a 
href="http://projects.apache.org/";>Projects</a></li>
+                      <li><a href="http://people.apache.org/";>People</a></li>
+                      <li><a 
href="http://www.apache.org/foundation/getinvolved.html";>Get Involved</a></li>
+                      <li><a 
href="http://www.apache.org/dyn/closer.cgi";>Download</a></li>
+                      <li><a 
href="http://www.apache.org/security/";>Security</a></li>
+                      <li><a 
href="http://www.apache.org/foundation/sponsorship.html";>Support Apache</a></li>
+                  </ul>
+              </li>
+
+              <li><a href="http://www.apache.org/licenses/";>License</a></li>
+
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">Download <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                      <li><a href="/doc/odata2/download.html">Download OData 
2.0 Java</a></li>
+                      <li><a href="/doc/javascript/download.html">Download 
OData 4.0 JavaScript</a></li>
+                  </ul>
+              </li>
+
+              <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">Documentation <b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                    <li><a href="/doc/odata2/index.html">Documentation OData 
2.0 Java</a></li>
+                    <li><a href="/doc/javascript/index.html">Documentation 
OData 4.0 JavaScript</a></li>
+                  </ul>
+              </li>
+              <li><a href="/support.html">Support</a></li>
+
+            </ul>
+
+                         <img class="navbar-right" height="50px" 
src="/img/asf-logo.gif">
+
+                       </div><!--/.nav-collapse -->
+        </div><!--/.container-fluid -->
+      </div><!-- Main component for a primary marketing message or call to 
action --><h1 id="osgi-support">OSGi Support</h1>
+<p>All Apache Olingo artifacts are OSGi enabled and build as bundles. Apache 
Olingo is using the <a 
href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html";>Apache
 Felix bundle plugin for Maven</a> to generate the manifest.mf file for each 
bundle.</p>
+<p>The bundles expose the complete api 
(<code>org.apache.olingo.odata2.api.*</code>). From the implementation part 
(<code>org.apache.olingo.odata2.core.*</code>) only a minimum set of packages 
is exposed.</p>
+<p>There is a difficulty in relation to class loading because of Apache Olingo 
core bundle has to load a specific custom service implementation without having 
a direct dependency to it.</p>
+<p>In Apache Olingo OData2 Version 1.0.0 we solve this issue as follow: </p>
+<h3 id="servlet-filter-in-osgi">Servlet Filter in OSGi</h3>
+<p>It is assumed that an OData service implementation is deployed as a native 
web application (war) or as web application bundle (OSGi Enterprise Expert 
Group on the RFC66 Web Container specification). In both cases the Apache 
Olingo core bundle is not aware of this application and its classloader cannot 
load applications service factory by default. </p>
+<p>Adding this servlet filter to the service servlet configuration can solve 
this problem. The filter can bind the application classloader to the servlet 
request object, which is then used by the Apache Olingo core bundle to load 
applications factory class. </p>
+<div class="codehilite"><pre><span class="kd">public</span> <span 
class="kd">class</span> <span class="nc">ServiceFactoryFilter</span> <span 
class="kd">implements</span> <span class="n">Filter</span> <span 
class="o">{</span>
+
+  <span class="nd">@Override</span>
+  <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">doFilter</span><span class="o">(</span><span 
class="n">ServletRequest</span> <span class="n">request</span><span 
class="o">,</span> <span class="n">ServletResponse</span> <span 
class="n">response</span><span class="o">,</span> 
+     <span class="n">FilterChain</span> <span class="n">chain</span><span 
class="o">)</span> <span class="kd">throws</span> <span 
class="n">IOException</span><span class="o">,</span> <span 
class="n">ServletException</span> <span class="o">{</span>
+
+    <span class="n">request</span><span class="o">.</span><span 
class="na">setAttribute</span><span class="o">(</span><span 
class="n">ODataServiceFactory</span><span class="o">.</span><span 
class="na">FACTORY_CLASSLOADER_LABEL</span><span class="o">,</span> 
+       <span class="n">MyServiceFactory</span><span class="o">.</span><span 
class="na">class</span><span class="o">.</span><span 
class="na">getClassLoader</span><span class="o">());</span>
+
+     <span class="n">chain</span><span class="o">.</span><span 
class="na">doFilter</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="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<h3 id="extended-osgi-support">Extended OSGi Support</h3>
+<p>The filter approach works fine for servlets but the Apache Olingo library 
can be used also for different, non-servlet based scenarios.  </p>
+<h5 id="implement-own-odataapplication">Implement own ODataApplication</h5>
+<p>A service has to implement an own <code>ODataApplication</code> and return 
the service factory class:</p>
+<div class="codehilite"><pre><span class="kn">import</span> <span 
class="nn">org.apache.olingo.odata2.core.rest.app.AbstractODataApplication</span><span
 class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span 
class="nc">CarODataApplication</span> <span class="kd">extends</span> <span 
class="n">AbstractODataApplication</span> <span class="o">{</span>
+
+  <span class="nd">@Override</span>
+  <span class="kd">public</span> <span class="n">Class</span><span 
class="o">&lt;?</span> <span class="kd">extends</span> <span 
class="n">ODataServiceFactory</span><span class="o">&gt;</span> <span 
class="n">getServiceFactoryClass</span><span class="o">()</span> <span 
class="o">{</span> 
+     <span class="k">return</span> <span 
class="n">CarODataServiceFactory</span><span class="o">.</span><span 
class="na">class</span><span class="o">;</span> 
+  <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<h5 id="register-application-in-servlet-context">Register Application in 
Servlet Context</h5>
+<p>Then register the application for any JAX-RS servlet implementation. Here 
it is the Apache CXF JAX-RS servlet.</p>
+<div class="codehilite"><pre><span class="nt">&lt;servlet&gt;</span>
+  <span class="nt">&lt;servlet-name&gt;</span>CarServiceServlet<span 
class="nt">&lt;/servlet-name&gt;</span>
+  <span 
class="nt">&lt;servlet-class&gt;</span>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet<span
 class="nt">&lt;/servlet-class&gt;</span>
+  <span class="nt">&lt;init-param&gt;</span>
+    <span class="nt">&lt;param-name&gt;</span>javax.ws.rs.Application<span 
class="nt">&lt;/param-name&gt;</span>
+    <span 
class="nt">&lt;param-value&gt;</span>org.apache.olingo.odata2.sample.osgi.CarODataApplication<span
 class="nt">&lt;/param-value&gt;</span>
+  <span class="nt">&lt;/init-param&gt;</span>
+  <span class="nt">&lt;load-on-startup&gt;</span>1<span 
class="nt">&lt;/load-on-startup&gt;</span>
+<span class="nt">&lt;/servlet&gt;</span>
+</pre></div><div align="center">
+<p>Copyright © 2013-2014, The Apache Software Foundation<br>
+                                               Apache Olingo, Olingo, Apache, 
the Apache feather, and
+                               the Apache Olingo project logo are trademarks 
of the Apache Software
+                               Foundation.</p>
+        <small><a href="/doc/odata2/privacy.html">Privacy</a></small>
+      </div>
+    </div><!-- /container -->
+    <!-- Bootstrap core JavaScript
+    ================================================== -->
+    <!-- Placed at the end of the document so the pages load faster -->
+    <script src="/js/jquery.js" type="text/javascript">
+</script>
+         <script src="/js/bootstrap.js" type="text/javascript">
+         <script src="/js/offcanvas.js" type="text/javascript">
+</script>
+        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
+        <script>
+            (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
+            function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
+            e=o.createElement(i);r=o.getElementsByTagName(i)[0];
+            e.src='//www.google-analytics.com/analytics.js';
+            r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
+            ga('create','UA-44963757-1');ga('send','pageview');
+        </script>
+  </body>
+</html>


Reply via email to