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 2014/01/31 09:54:32 UTC
svn commit: r895918 - in /websites/staging/olingo/trunk/content: ./
doc/tutorials/jpafunctionimport.html
Author: buildbot
Date: Fri Jan 31 08:54:32 2014
New Revision: 895918
Log:
Staging update by buildbot for olingo
Modified:
websites/staging/olingo/trunk/content/ (props changed)
websites/staging/olingo/trunk/content/doc/tutorials/jpafunctionimport.html
Propchange: websites/staging/olingo/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Fri Jan 31 08:54:32 2014
@@ -1 +1 @@
-1563089
+1563090
Modified: websites/staging/olingo/trunk/content/doc/tutorials/jpafunctionimport.html
==============================================================================
--- websites/staging/olingo/trunk/content/doc/tutorials/jpafunctionimport.html (original)
+++ websites/staging/olingo/trunk/content/doc/tutorials/jpafunctionimport.html Fri Jan 31 08:54:32 2014
@@ -74,7 +74,18 @@
<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>This section explains how to enable custom operations as function imports. 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>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>
+<p>Enable</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>
@@ -87,107 +98,111 @@
</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="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">olingo</span><span class="o">.</span><span class="na">odata2</span><span class="o">.</span><span class="na">jpa</span><span class="o">.</span><span class="na">processor</span><span class="o">.</span><span class="na">ref</span><span class="o">.</span><span class="na">extension</span><span class="o">;</span>
-
-<span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span>
-
-<span class="kn">import</span> <span class="nn">javax.persistence.EntityManager</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">javax.persistence.Persistence</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">javax.persistence.Query</span><span class="o">;</span>
-
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.api.annotation.edm.Facets</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.api.annotation.edm.FunctionImport</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.api.annotation.edm.Parameter</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.api.annotation.edm.Parameter.Mode</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.api.annotation.edmx.HttpMethod.Name</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.api.annotation.edmx.HttpMethod</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.api.annotation.edm.FunctionImport.ReturnType</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.api.annotation.edm.FunctionImport.Multiplicity</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.api.exception.ODataException</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.jpa.processor.ref.model.Address</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.jpa.processor.ref.model.SalesOrderHeader</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.olingo.odata2.jpa.processor.ref.model.SalesOrderItem</span><span class="o">;</span>
-
-<span class="kd">public</span> <span class="kd">class</span> <span class="nc">SalesOrderHeaderProcessor</span> <span class="o">{</span>
-
- <span class="kd">private</span> <span class="n">EntityManager</span> <span class="n">em</span><span class="o">;</span>
-
- <span class="kd">public</span> <span class="nf">SalesOrderHeaderProcessor</span><span class="o">()</span>
- <span class="n">em</span> <span class="o">=</span> <span class="n">Persistence</span><span class="o">.</span><span class="na">createEntityManagerFactory</span><span class="o">(</span><span class="s">"salesorderprocessing"</span><span class="o">)</span>
- <span class="o">.</span><span class="na">createEntityManager</span><span class="o">();</span>
- <span class="o">}</span>
-
- <span class="nd">@SuppressWarnings</span><span class="o">(</span><span class="s">"unchecked"</span><span class="o">)</span>
- <span class="nd">@FunctionImport</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"FindAllSalesOrders"</span><span class="o">,</span> <span class="n">entitySet</span> <span class="o">=</span> <span class="s">"SalesOrders"</span><span class="o">,</span> <span class="n">returnType</span> <span class="o">=</span> <span class="n">ReturnType</span><span class="o">.</span><span class="na">ENTITY_TYPE</span><span class="o">,</span> <span class="n">multiplicity</span> <span class="o">=</span> <span class="n">Multiplicity</span><span class="o">.</span><span class="na">MANY</span><span class="o">)</span>
- <span class="kd">public</span> <span class="n">List</span><span class="o"><</span><span class="n">SalesOrderHeader</span><span class="o">></span> <span class="n">findAllSalesOrders</span><span class="o">(</span>
- <span class="nd">@Parameter</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"DeliveryStatusCode"</span><span class="o">,</span> <span class="n">facets</span> <span class="o">=</span> <span class="nd">@Facets</span><span class="o">(</span><span class="n">maxLength</span> <span class="o">=</span> <span class="mi">2</span><span class="o">))</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">status</span><span class="o">)</span> <span class="o">{</span>
-
- <span class="n">Query</span> <span class="n">q</span> <span class="o">=</span> <span class="n">em</span><span class="o">.</span><span class="na">createQuery</span><span class="o">(</span><span class="s">"SELECT E1 from SalesOrderHeader E1 WHERE E1.deliveryStatus = '"</span><span class="o">+</span> <span class="n">status</span> <span class="o">+</span> <span class="s">"'"</span><span class="o">);</span>
- <span class="n">List</span><span class="o"><</span><span class="n">SalesOrderHeader</span><span class="o">></span> <span class="n">soList</span> <span class="o">=</span> <span class="o">(</span><span class="n">List</span><span class="o"><</span><span class="n">SalesOrderHeader</span><span class="o">>)</span> <span class="n">q</span><span class="o">.</span><span class="na">getResultList</span><span class="o">();</span>
- <span class="k">return</span> <span class="n">soList</span><span class="o">;</span>
- <span class="o">}</span>
-
- <span class="nd">@FunctionImport</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"CheckATP"</span><span class="o">,</span> <span class="n">returnType</span> <span class="o">=</span> <span class="n">ReturnType</span><span class="o">.</span><span class="na">SCALAR</span><span class="o">,</span> <span class="n">multiplicity</span> <span class="o">=</span> <span class="n">Multiplicity</span><span class="o">.</span><span class="na">ONE</span><span class="o">,</span> <span class="n">httpMethod</span> <span class="o">=</span> <span class="nd">@HttpMethod</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="n">Name</span><span class="o">.</span><span class="na">GET</span><span class="o">))</span>
- <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">checkATP</span><span class="o">(</span>
- <span class="nd">@Parameter</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"SoID"</span><span class="o">,</span> <span class="n">facets</span> <span class="o">=</span> <span class="nd">@Facets</span><span class="o">(</span><span class="n">nullable</span> <span class="o">=</span> <span class="kc">false</span><span class="o">),</span> <span class="n">mode</span> <span class="o">=</span> <span class="n">Mode</span><span class="o">.</span><span class="na">IN</span><span class="o">)</span> <span class="kd">final</span> <span class="n">Long</span> <span class="n">soID</span><span class="o">,</span>
- <span class="nd">@Parameter</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"LiId"</span><span class="o">,</span> <span class="n">facets</span> <span class="o">=</span> <span class="nd">@Facets</span><span class="o">(</span><span class="n">nullable</span> <span class="o">=</span> <span class="kc">false</span><span class="o">),</span> <span class="n">mode</span> <span class="o">=</span> <span class="n">Mode</span><span class="o">.</span><span class="na">IN</span><span class="o">)</span> <span class="kd">final</span> <span class="n">Long</span> <span class="n">lineItemID</span><span class="o">)</span> <span class="o">{</span>
- <span class="k">if</span> <span class="o">(</span><span class="n">soID</span> <span class="o">==</span> <span class="mi">2L</span><span class="o">)</span> <span class="o">{</span>
- <span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
- <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
- <span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
- <span class="o">}</span>
- <span class="o">}</span>
-
- <span class="nd">@FunctionImport</span><span class="o">(</span><span class="n">returnType</span> <span class="o">=</span> <span class="n">ReturnType</span><span class="o">.</span><span class="na">ENTITY_TYPE</span><span class="o">,</span> <span class="n">entitySet</span> <span class="o">=</span> <span class="s">"SalesOrders"</span><span class="o">)</span>
- <span class="kd">public</span> <span class="n">SalesOrderHeader</span> <span class="nf">calculateNetAmount</span><span class="o">(</span>
- <span class="nd">@Parameter</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"SoID"</span><span class="o">,</span> <span class="n">facets</span> <span class="o">=</span> <span class="nd">@Facets</span><span class="o">(</span><span class="n">nullable</span> <span class="o">=</span> <span class="kc">false</span><span class="o">))</span> <span class="kd">final</span> <span class="n">Long</span> <span class="n">soID</span><span class="o">)</span>
- <span class="kd">throws</span> <span class="n">ODataException</span> <span class="o">{</span>
-
- <span class="k">if</span> <span class="o">(</span><span class="n">soID</span> <span class="o"><=</span> <span class="mi">0L</span><span class="o">)</span> <span class="o">{</span>
- <span class="k">throw</span> <span class="k">new</span> <span class="nf">ODataException</span><span class="o">(</span><span class="s">"Invalid SoID"</span><span class="o">);</span>
- <span class="o">}</span>
-
- <span class="n">Query</span> <span class="n">q</span> <span class="o">=</span> <span class="n">em</span><span class="o">.</span><span class="na">createQuery</span><span class="o">(</span><span class="s">"SELECT E1 from SalesOrderHeader E1 WHERE E1.soId = "</span><span class="o">+</span> <span class="n">soID</span> <span class="o">+</span> <span class="s">"l"</span><span class="o">);</span>
- <span class="k">if</span> <span class="o">(</span><span class="n">q</span><span class="o">.</span><span class="na">getResultList</span><span class="o">().</span><span class="na">isEmpty</span><span class="o">())</span> <span class="o">{</span>
- <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
- <span class="o">}</span>
- <span class="n">SalesOrderHeader</span> <span class="n">so</span> <span class="o">=</span> <span class="o">(</span><span class="n">SalesOrderHeader</span><span class="o">)</span> <span class="n">q</span><span class="o">.</span><span class="na">getResultList</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="kt">double</span> <span class="n">amount</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
- <span class="k">for</span> <span class="o">(</span><span class="n">SalesOrderItem</span> <span class="n">soi</span> <span class="o">:</span> <span class="n">so</span><span class="o">.</span><span class="na">getSalesOrderItem</span><span class="o">())</span> <span class="o">{</span>
- <span class="n">amount</span> <span class="o">=</span> <span class="n">amount</span> <span class="o">+</span> <span class="o">(</span><span class="n">soi</span><span class="o">.</span><span class="na">getAmount</span><span class="o">()</span> <span class="o">*</span> <span class="n">soi</span><span class="o">.</span><span class="na">getDiscount</span><span class="o">()</span> <span class="o">*</span> <span class="n">soi</span><span class="o">.</span><span class="na">getQuantity</span><span class="o">());</span>
- <span class="o">}</span>
- <span class="n">so</span><span class="o">.</span><span class="na">setNetAmount</span><span class="o">(</span><span class="n">amount</span><span class="o">);</span>
- <span class="k">return</span> <span class="n">so</span><span class="o">;</span>
- <span class="o">}</span>
-
- <span class="nd">@SuppressWarnings</span><span class="o">(</span><span class="s">"unchecked"</span><span class="o">)</span>
- <span class="nd">@FunctionImport</span><span class="o">(</span><span class="n">returnType</span> <span class="o">=</span> <span class="n">ReturnType</span><span class="o">.</span><span class="na">COMPLEX_TYPE</span><span class="o">)</span>
- <span class="kd">public</span> <span class="n">Address</span> <span class="nf">getAddress</span><span class="o">(</span>
- <span class="nd">@Parameter</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"SoID"</span><span class="o">,</span> <span class="n">facets</span> <span class="o">=</span> <span class="nd">@Facets</span><span class="o">(</span><span class="n">nullable</span> <span class="o">=</span> <span class="kc">false</span><span class="o">))</span> <span class="kd">final</span> <span class="n">Long</span> <span class="n">soID</span><span class="o">)</span> <span class="o">{</span>
- <span class="n">Query</span> <span class="n">q</span> <span class="o">=</span> <span class="n">em</span><span class="o">.</span><span class="na">createQuery</span><span class="o">(</span><span class="s">"SELECT E1 from SalesOrderHeader E1 WHERE E1.soId = "</span> <span class="o">+</span> <span class="n">soID</span> <span class="o">+</span> <span class="s">"l"</span><span class="o">);</span>
- <span class="n">List</span><span class="o"><</span><span class="n">SalesOrderHeader</span><span class="o">></span> <span class="n">soList</span> <span class="o">=</span> <span class="o">(</span><span class="n">List</span><span class="o"><</span><span class="n">SalesOrderHeader</span><span class="o">>)</span> <span class="n">q</span><span class="o">.</span><span class="na">getResultList</span><span class="o">();</span>
- <span class="k">if</span> <span class="o">(!</span><span class="n">soList</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">())</span> <span class="o">{</span>
- <span class="k">return</span> <span class="n">soList</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="na">getBuyerAddress</span><span class="o">();</span>
- <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
- <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
- <span class="o">}</span>
- <span class="o">}</span>
-
- <span class="cm">/*</span>
-<span class="cm"> * This method will not be transformed into Function</span>
-<span class="cm"> * Import. Function Import with return type as void is not</span>
-<span class="cm"> * supported yet.</span>
-<span class="cm"> */</span>
- <span class="nd">@FunctionImport</span><span class="o">(</span><span class="n">returnType</span> <span class="o">=</span> <span class="n">ReturnType</span><span class="o">.</span><span class="na">NONE</span><span class="o">)</span>
- <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span>
- <span class="nd">@Parameter</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"SoID"</span><span class="o">,</span> <span class="n">facets</span> <span class="o">=</span> <span class="nd">@Facets</span><span class="o">(</span><span class="n">nullable</span> <span class="o">=</span> <span class="kc">false</span><span class="o">))</span> <span class="kd">final</span> <span class="n">Long</span> <span class="n">soID</span><span class="o">)</span> <span class="o">{</span>
- <span class="k">return</span><span class="o">;</span>
- <span class="o">}</span>
-<span class="o">}</span>
+</li>
+</ol>
+<h5 id="sample-code">Sample Code</h5>
+<div class="codehilite"><pre> <span class="p">:::</span><span class="n">java</span>
+ <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">Facets</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">FunctionImport</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">Parameter</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">Parameter</span><span class="p">.</span><span class="n">Mode</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">edmx</span><span class="p">.</span><span class="n">HttpMethod</span><span class="p">.</span><span class="n">Name</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">edmx</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">FunctionImport</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">FunctionImport</span><span class="p">.</span><span class="n">Multiplicity</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="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>"<span class="n">salesorderprocessing</span>"<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>"<span class="n">unchecked</span>"<span class="p">)</span>
+ <span class="p">@</span><span class="n">FunctionImport</span><span class="p">(</span><span class="n">name</span> <span class="p">=</span> "<span class="n">FindAllSalesOrders</span>"<span class="p">,</span> <span class="n">entitySet</span> <span class="p">=</span> "<span class="n">SalesOrders</span>"<span class="p">,</span> <span class="n">returnType</span> <span class="p">=</span> <span class="n">ReturnType</span><span class="p">.</span><span class="n">ENTITY_TYPE</span><span class="p">,</span> <span class="n">multiplicity</span> <span class="p">=</span> <span class="n">Multiplicity</span><span class="p">.</span><span class="n">MANY</span><span class="p">)</span>
+ <span class="n">public</span> <span class="n">List</span><span class="o"><</span><span class="n">SalesOrderHeader</span><span class="o">></span> <span class="n">findAllSalesOrders</span><span class="p">(</span>
+ <span class="p">@</span><span class="n">Parameter</span><span class="p">(</span><span class="n">name</span> <span class="p">=</span> "<span class="n">DeliveryStatusCode</span>"<span class="p">,</span> <span class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span class="n">Facets</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>"<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">'"+ status + "'</span>"<span class="p">);</span>
+ <span class="n">List</span><span class="o"><</span><span class="n">SalesOrderHeader</span><span class="o">></span> <span class="n">soList</span> <span class="p">=</span> <span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">SalesOrderHeader</span><span class="o">></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">FunctionImport</span><span class="p">(</span><span class="n">name</span> <span class="p">=</span> "<span class="n">CheckATP</span>"<span class="p">,</span> <span class="n">returnType</span> <span class="p">=</span> <span class="n">ReturnType</span><span class="p">.</span><span class="n">SCALAR</span><span class="p">,</span> <span class="n">multiplicity</span> <span class="p">=</span> <span class="n">Multiplicity</span><span class="p">.</span><span class="n">ONE</span><span class="p">,</span> <span class="n">httpMethod</span> <span class="p">=</span> <span class="p">@</span><span class="n">HttpMethod</span><span class="p">(</span><span class="n">name</span> <span class="p">=</span> <span class="n">Name</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">Parameter</span><span class="p">(</span><span class="n">name</span> <span class="p">=</span> "<span class="n">SoID</span>"<span class="p">,</span> <span class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span class="n">Facets</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">mode</span> <span class="p">=</span> <span class="n">Mode</span><span class="p">.</span><span class="n">IN</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">Parameter</span><span class="p">(</span><span class="n">name</span> <span class="p">=</span> "<span class="n">LiId</span>"<span class="p">,</span> <span class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span class="n">Facets</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">mode</span> <span class="p">=</span> <span class="n">Mode</span><span class="p">.</span><span class="n">IN</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">FunctionImport</span><span class="p">(</span><span class="n">returnType</span> <span class="p">=</span> <span class="n">ReturnType</span><span class="p">.</span><span class="n">ENTITY_TYPE</span><span class="p">,</span> <span class="n">entitySet</span> <span class="p">=</span> "<span class="n">SalesOrders</span>"<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">Parameter</span><span class="p">(</span><span class="n">name</span> <span class="p">=</span> "<span class="n">SoID</span>"<span class="p">,</span> <span class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span class="n">Facets</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"><</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>"<span class="n">Invalid</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>"<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> "<span class="o">+</span> <span class="n">soID</span> <span class="o">+</span> "<span class="n">l</span>"<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>"<span class="n">unchecked</span>"<span class="p">)</span>
+ <span class="p">@</span><span class="n">FunctionImport</span><span class="p">(</span><span class="n">returnType</span> <span class="p">=</span> <span class="n">ReturnType</span><span class="p">.</span><span class="n">COMPLEX_TYPE</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">Parameter</span><span class="p">(</span><span class="n">name</span> <span class="p">=</span> "<span class="n">SoID</span>"<span class="p">,</span> <span class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span class="n">Facets</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>"<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> " <span class="o">+</span> <span class="n">soID</span> <span class="o">+</span> "<span class="n">l</span>"<span class="p">);</span>
+ <span class="n">List</span><span class="o"><</span><span class="n">SalesOrderHeader</span><span class="o">></span> <span class="n">soList</span> <span class="p">=</span> <span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">SalesOrderHeader</span><span class="o">></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">getBuyerAddress</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="o">/*</span>
+ <span class="o">*</span> <span class="n">This</span> <span class="n">method</span> <span class="n">will</span> <span class="n">not</span> <span class="n">be</span> <span class="n">transformed</span> <span class="n">into</span> <span class="n">Function</span>
+ <span class="o">*</span> <span class="n">Import</span><span class="p">.</span> <span class="n">Function</span> <span class="n">Import</span> <span class="n">with</span> <span class="k">return</span> <span class="n">type</span> <span class="n">as</span> <span class="n">void</span> <span class="n">is</span> <span class="n">not</span>
+ <span class="o">*</span> <span class="n">supported</span> <span class="n">yet</span><span class="p">.</span>
+ <span class="o">*/</span>
+ <span class="p">@</span><span class="n">FunctionImport</span><span class="p">(</span><span class="n">returnType</span> <span class="p">=</span> <span class="n">ReturnType</span><span class="p">.</span><span class="n">NONE</span><span class="p">)</span>
+ <span class="n">public</span> <span class="n">void</span> <span class="n">process</span><span class="p">(</span>
+ <span class="p">@</span><span class="n">Parameter</span><span class="p">(</span><span class="n">name</span> <span class="p">=</span> "<span class="n">SoID</span>"<span class="p">,</span> <span class="n">facets</span> <span class="p">=</span> <span class="p">@</span><span class="n">Facets</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="k">return</span><span class="p">;</span>
+ <span class="p">}</span>
+ <span class="p">}</span>
</pre></div>
-</li>
+<ol>
<li>
<p>Create a Java class by implementing the interface <em>org.apache.olingo.odata2.processor.api.jpa.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>
@@ -215,6 +230,34 @@
<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/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_1">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="o">\</span><span class="n">r</span>
+ <span class="n">public</span> <span class="n">OrderValue</span> <span class="n">orderValue</span><span class="p">(</span><span class="o">\</span><span class="n">r</span>
+
+ <span class="p">@</span><span class="n">EdmFunctionImportParameter</span><span class="p">(</span><span class="n">name</span> <span class="p">=</span> "<span class="n">SoId</span>"<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="o">\</span><span class="n">r</span>
+ <span class="n">Query</span> <span class="n">q</span> <span class="p">=</span> <span class="n">em</span><span class="o">\</span><span class="n">r</span>
+
+ <span class="p">.</span><span class="n">createQuery</span><span class="p">(</span>"<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> "<span class="o">\</span><span class="n">r</span>
+ <span class="o">+</span> <span class="n">soID</span> <span class="o">+</span> "<span class="n">l</span>"<span class="p">);</span><span class="o">\</span><span class="n">r</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="o">\</span><span class="n">r</span>
+ <span class="k">return</span> <span class="n">null</span><span class="p">;</span><span class="o">\</span><span class="n">r</span>
+ <span class="p">}</span><span class="o">\</span><span class="n">r</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="o">\</span><span class="n">r</span>
+ <span class="n">double</span> <span class="n">amount</span> <span class="p">=</span> 0<span class="p">;</span><span class="o">\</span><span class="n">r</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="o">\</span><span class="n">r</span>
+ <span class="n">amount</span> <span class="p">=</span> <span class="n">amount</span><span class="o">\</span><span class="n">r</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="o">\</span><span class="n">r</span>
+ <span class="p">}</span><span class="o">\</span><span class="n">r</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="o">\</span><span class="n">r</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="o">\</span><span class="n">r</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="o">\</span><span class="n">r</span>
+ <span class="k">return</span> <span class="n">orderValue</span><span class="p">;</span><span class="o">\</span><span class="n">r</span>
+</pre></div>