Author: buildbot
Date: Tue May 19 12:24:56 2015
New Revision: 951871
Log:
Staging update by buildbot for olingo
Modified:
websites/staging/olingo/trunk/content/ (props changed)
websites/staging/olingo/trunk/content/doc/odata4/tutorials/read/tutorial_read.html
Propchange: websites/staging/olingo/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Tue May 19 12:24:56 2015
@@ -1 +1 @@
-1680253
+1680268
Modified:
websites/staging/olingo/trunk/content/doc/odata4/tutorials/read/tutorial_read.html
==============================================================================
---
websites/staging/olingo/trunk/content/doc/odata4/tutorials/read/tutorial_read.html
(original)
+++
websites/staging/olingo/trunk/content/doc/odata4/tutorials/read/tutorial_read.html
Tue May 19 12:24:56 2015
@@ -87,7 +87,7 @@
</div><!--/.nav-collapse -->
</div><!--/.container-fluid -->
</div><!-- Main component for a primary marketing message or call to
action --><h1 id="how-to-build-an-odata-service-with-olingo-v4">How to build an
OData Service with Olingo V4</h1>
-<p>This tutorial guides you through the steps required to write an OData
Service based on the Olingo OData 4.0 Library for Java (based on current
<em>Olingo 4.0.0-beta-02 release</em> which can be get via the <a
href="../../download.html">Download-Page</a>).</p>
+<p>This tutorial guides you through the steps required to write an OData
Service based on the Olingo OData 4.0 Library for Java (based on current
<em>Olingo 4.0.0-beta-03 release</em> which can be get via the <a
href="../../download.html">Download-Page</a>).</p>
<p>The final result can be download <a
href="sample/DemoService_Tutorial_Read.zip">here</a> (<a
href="sample/DemoService_Tutorial_Read.zip.md5">md5</a>, <a
href="sample/DemoService_Tutorial_Read.zip.sha512">sha512</a>, <a
href="sample/DemoService_Tutorial_Read.zip.asc">pgp</a>).</p>
<p>We will create a Web Application and deploy it on a local Tomcat server.
Afterwards, the OData service can be invoked from a browser and it will
provide the data according to the OData V4 specification.
@@ -218,7 +218,7 @@ Furthermore, the <em>pom.xml</em> file t
<span class="nt"><properties></span>
<span class="nt"><javax.version></span>2.5<span
class="nt"></javax.version></span>
- <span class="nt"><odata.version></span>4.0.0-beta-02<span
class="nt"></odata.version></span>
+ <span class="nt"><odata.version></span>4.0.0-beta-03<span
class="nt"></odata.version></span>
<span class="nt"><slf4j.version></span>1.7.7<span
class="nt"></slf4j.version></span>
<span class="nt"></properties></span>
@@ -358,7 +358,7 @@ Select the mentioned methods and press O
<p>Letâs have a closer look at our methods in detail.</p>
<p>First, we need to declare some constants, to be used in the code below:</p>
<div class="codehilite"><pre><span class="c1">// Service Namespace</span>
-<span class="kd">public</span> <span class="kd">static</span> <span
class="kd">final</span> <span class="n">String</span> <span
class="n">NAMESPACE</span> <span class="o">=</span> <span
class="s">"com.example.model"</span><span class="o">;</span>
+<span class="kd">public</span> <span class="kd">static</span> <span
class="kd">final</span> <span class="n">String</span> <span
class="n">NAMESPACE</span> <span class="o">=</span> <span
class="s">"OData.Demo"</span><span class="o">;</span>
<span class="c1">// EDM Container</span>
<span class="kd">public</span> <span class="kd">static</span> <span
class="kd">final</span> <span class="n">String</span> <span
class="n">CONTAINER_NAME</span> <span class="o">=</span> <span
class="s">"Container"</span><span class="o">;</span>
@@ -376,64 +376,62 @@ Select the mentioned methods and press O
<p><strong><em>getEntityType()</em></strong></p>
<p>In our example service, we want to provide a list of products to users who
call the OData service.
The user of our service, for example an app-developer, may ask: What does such
a "product" entry look like? How is it structured? Which information about a
product is provided? For example, the name of it and which data types can be
expected from these properties?<br />
-Such information is provided by the <em>EdmProvider</em>.</p>
-<p>In our example service, for modelling the <em>EntityType</em>, we have to
provide the following metadata:</p>
+Such information is provided by a <code>CsdlEdmProvider</code> (and for
convenience we extend the <code>CsdlAbstractEdmProvider</code>).</p>
+<p>In our example service, for modelling the <code>CsdlEntityType</code>, we
have to provide the following metadata:</p>
<p>The name of the EntityType: âProductâ<br />
The properties: name and type and additional info, e.g. âIDâ of type
âedm.int32â<br />
Which of the properties is the âkeyâ property: a reference to the âIDâ
property. </p>
-<div class="codehilite"><pre><span class="nd">@Override</span>
-<span class="kd">public</span> <span class="n">EntityType</span> <span
class="nf">getEntityType</span><span class="o">(</span><span
class="n">FullQualifiedName</span> <span class="n">entityTypeName</span><span
class="o">)</span> <span class="kd">throws</span> <span
class="n">ODataException</span> <span class="o">{</span>
+<div class="codehilite"><pre><span class="kd">public</span> <span
class="n">CsdlEntityType</span> <span class="nf">getEntityType</span><span
class="o">(</span><span class="n">FullQualifiedName</span> <span
class="n">entityTypeName</span><span class="o">)</span> <span
class="kd">throws</span> <span class="n">ODataException</span> <span
class="o">{</span>
- <span class="c1">// this method is called for one of the EntityTypes that
are configured in the Schema</span>
- <span class="k">if</span><span class="o">(</span><span
class="n">entityTypeName</span><span class="o">.</span><span
class="na">equals</span><span class="o">(</span><span
class="n">ET_PRODUCT_FQN</span><span class="o">)){</span>
+ <span class="c1">// this method is called for one of the EntityTypes that
are configured in the Schema</span>
+ <span class="k">if</span><span class="o">(</span><span
class="n">entityTypeName</span><span class="o">.</span><span
class="na">equals</span><span class="o">(</span><span
class="n">ET_PRODUCT_FQN</span><span class="o">)){</span>
- <span class="c1">//create EntityType properties</span>
- <span class="n">Property</span> <span class="n">id</span> <span
class="o">=</span> <span class="k">new</span> <span
class="n">Property</span><span class="o">().</span><span
class="na">setName</span><span class="o">(</span><span
class="s">"ID"</span><span class="o">).</span><span
class="na">setType</span><span class="o">(</span><span
class="n">EdmPrimitiveTypeKind</span><span class="o">.</span><span
class="na">Int32</span><span class="o">.</span><span
class="na">getFullQualifiedName</span><span class="o">());</span>
- <span class="n">Property</span> <span class="n">name</span> <span
class="o">=</span> <span class="k">new</span> <span
class="n">Property</span><span class="o">().</span><span
class="na">setName</span><span class="o">(</span><span
class="s">"Name"</span><span class="o">).</span><span
class="na">setType</span><span class="o">(</span><span
class="n">EdmPrimitiveTypeKind</span><span class="o">.</span><span
class="na">String</span><span class="o">.</span><span
class="na">getFullQualifiedName</span><span class="o">());</span>
- <span class="n">Property</span> <span class="n">description</span>
<span class="o">=</span> <span class="k">new</span> <span
class="n">Property</span><span class="o">().</span><span
class="na">setName</span><span class="o">(</span><span
class="s">"Description"</span><span class="o">).</span><span
class="na">setType</span><span class="o">(</span><span
class="n">EdmPrimitiveTypeKind</span><span class="o">.</span><span
class="na">String</span><span class="o">.</span><span
class="na">getFullQualifiedName</span><span class="o">());</span>
-
- <span class="c1">// create PropertyRef for Key element</span>
- <span class="n">PropertyRef</span> <span class="n">propertyRef</span>
<span class="o">=</span> <span class="k">new</span> <span
class="n">PropertyRef</span><span class="o">();</span>
- <span class="n">propertyRef</span><span class="o">.</span><span
class="na">setPropertyName</span><span class="o">(</span><span
class="s">"ID"</span><span class="o">);</span>
-
- <span class="c1">// configure EntityType</span>
- <span class="n">EntityType</span> <span class="n">entityType</span>
<span class="o">=</span> <span class="k">new</span> <span
class="n">EntityType</span><span class="o">();</span>
- <span class="n">entityType</span><span class="o">.</span><span
class="na">setName</span><span class="o">(</span><span
class="n">ET_PRODUCT_NAME</span><span class="o">);</span>
- <span class="n">entityType</span><span class="o">.</span><span
class="na">setProperties</span><span class="o">(</span><span
class="n">Arrays</span><span class="o">.</span><span
class="na">asList</span><span class="o">(</span><span class="n">id</span><span
class="o">,</span> <span class="n">name</span> <span class="o">,</span> <span
class="n">description</span><span class="o">));</span>
- <span class="n">entityType</span><span class="o">.</span><span
class="na">setKey</span><span class="o">(</span><span
class="n">Arrays</span><span class="o">.</span><span
class="na">asList</span><span class="o">(</span><span
class="n">propertyRef</span><span class="o">));</span>
+ <span class="c1">//create EntityType properties</span>
+ <span class="n">CsdlProperty</span> <span class="n">id</span> <span
class="o">=</span> <span class="k">new</span> <span
class="n">CsdlProperty</span><span class="o">().</span><span
class="na">setName</span><span class="o">(</span><span
class="s">"ID"</span><span class="o">).</span><span
class="na">setType</span><span class="o">(</span><span
class="n">EdmPrimitiveTypeKind</span><span class="o">.</span><span
class="na">Int32</span><span class="o">.</span><span
class="na">getFullQualifiedName</span><span class="o">());</span>
+ <span class="n">CsdlProperty</span> <span class="n">name</span> <span
class="o">=</span> <span class="k">new</span> <span
class="n">CsdlProperty</span><span class="o">().</span><span
class="na">setName</span><span class="o">(</span><span
class="s">"Name"</span><span class="o">).</span><span
class="na">setType</span><span class="o">(</span><span
class="n">EdmPrimitiveTypeKind</span><span class="o">.</span><span
class="na">String</span><span class="o">.</span><span
class="na">getFullQualifiedName</span><span class="o">());</span>
+ <span class="n">CsdlProperty</span> <span class="n">description</span>
<span class="o">=</span> <span class="k">new</span> <span
class="n">CsdlProperty</span><span class="o">().</span><span
class="na">setName</span><span class="o">(</span><span
class="s">"Description"</span><span class="o">).</span><span
class="na">setType</span><span class="o">(</span><span
class="n">EdmPrimitiveTypeKind</span><span class="o">.</span><span
class="na">String</span><span class="o">.</span><span
class="na">getFullQualifiedName</span><span class="o">());</span>
+
+ <span class="c1">// create CsdlPropertyRef for Key element</span>
+ <span class="n">CsdlPropertyRef</span> <span class="n">propertyRef</span>
<span class="o">=</span> <span class="k">new</span> <span
class="n">CsdlPropertyRef</span><span class="o">();</span>
+ <span class="n">propertyRef</span><span class="o">.</span><span
class="na">setName</span><span class="o">(</span><span
class="s">"ID"</span><span class="o">);</span>
+
+ <span class="c1">// configure EntityType</span>
+ <span class="n">CsdlEntityType</span> <span class="n">entityType</span>
<span class="o">=</span> <span class="k">new</span> <span
class="n">CsdlEntityType</span><span class="o">();</span>
+ <span class="n">entityType</span><span class="o">.</span><span
class="na">setName</span><span class="o">(</span><span
class="n">ET_PRODUCT_NAME</span><span class="o">);</span>
+ <span class="n">entityType</span><span class="o">.</span><span
class="na">setProperties</span><span class="o">(</span><span
class="n">Arrays</span><span class="o">.</span><span
class="na">asList</span><span class="o">(</span><span class="n">id</span><span
class="o">,</span> <span class="n">name</span> <span class="o">,</span> <span
class="n">description</span><span class="o">));</span>
+ <span class="n">entityType</span><span class="o">.</span><span
class="na">setKey</span><span class="o">(</span><span
class="n">Collections</span><span class="o">.</span><span
class="na">singletonList</span><span class="o">(</span><span
class="n">propertyRef</span><span class="o">));</span>
- <span class="k">return</span> <span class="n">entityType</span><span
class="o">;</span>
- <span class="o">}</span>
+ <span class="k">return</span> <span class="n">entityType</span><span
class="o">;</span>
+ <span class="o">}</span>
- <span class="k">return</span> <span class="kc">null</span><span
class="o">;</span>
+ <span class="k">return</span> <span class="kc">null</span><span
class="o">;</span>
<span class="o">}</span>
</pre></div>
<p><strong><em>getEntitySet()</em></strong></p>
-<p>The procedure for declaring the <em>EntitySets</em> is similar.
+<p>The procedure for declaring the <em>Entity Sets</em> is similar.
An <em>EntitySet</em> is a crucial resource, when an OData service is used to
request data.
In our example, we will invoke the following URL, which we expect to provide
us a list of products:</p>
<div
class="codehilite"><pre>http://localhost:8080/DemoService/DemoServlet.svc/Products
</pre></div>
-<p>When declaring an <em>EntitySet</em>, we need to define the type of entries
which are contained in the list, such as an <em>EntityType</em>.
-In our example, we set our previously created <em>EntityType</em>, which is
referred by a <em>FullQualifiedName</em>.</p>
-<div class="codehilite"><pre><span class="nd">@Override</span>
-<span class="kd">public</span> <span class="n">EntitySet</span> <span
class="nf">getEntitySet</span><span class="o">(</span><span
class="n">FullQualifiedName</span> <span class="n">entityContainer</span><span
class="o">,</span> <span class="n">String</span> <span
class="n">entitySetName</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">entityContainer</span><span class="o">.</span><span
class="na">equals</span><span class="o">(</span><span
class="n">CONTAINER</span><span class="o">)){</span>
- <span class="k">if</span><span class="o">(</span><span
class="n">entitySetName</span><span class="o">.</span><span
class="na">equals</span><span class="o">(</span><span
class="n">ES_PRODUCTS_NAME</span><span class="o">)){</span>
- <span class="n">EntitySet</span> <span class="n">entitySet</span>
<span class="o">=</span> <span class="k">new</span> <span
class="n">EntitySet</span><span class="o">();</span>
- <span class="n">entitySet</span><span class="o">.</span><span
class="na">setName</span><span class="o">(</span><span
class="n">ES_PRODUCTS_NAME</span><span class="o">);</span>
- <span class="n">entitySet</span><span class="o">.</span><span
class="na">setType</span><span class="o">(</span><span
class="n">ET_PRODUCT_FQN</span><span class="o">);</span>
+<p>When declaring an <code>EntitySet</code>, we need to define the type of
entries which are contained in the list, such as an <code>CsdlEntityType</code>.
+In our example, we set our previously created <code>CsdlEntityType</code>,
which is referred by a <em>FullQualifiedName</em>.</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span
class="n">CsdlEntitySet</span> <span class="nf">getEntitySet</span><span
class="o">(</span><span class="n">FullQualifiedName</span> <span
class="n">entityContainer</span><span class="o">,</span> <span
class="n">String</span> <span class="n">entitySetName</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">entityContainer</span><span class="o">.</span><span
class="na">equals</span><span class="o">(</span><span
class="n">CONTAINER</span><span class="o">)){</span>
+ <span class="k">if</span><span class="o">(</span><span
class="n">entitySetName</span><span class="o">.</span><span
class="na">equals</span><span class="o">(</span><span
class="n">ES_PRODUCTS_NAME</span><span class="o">)){</span>
+ <span class="n">CsdlEntitySet</span> <span class="n">entitySet</span>
<span class="o">=</span> <span class="k">new</span> <span
class="n">CsdlEntitySet</span><span class="o">();</span>
+ <span class="n">entitySet</span><span class="o">.</span><span
class="na">setName</span><span class="o">(</span><span
class="n">ES_PRODUCTS_NAME</span><span class="o">);</span>
+ <span class="n">entitySet</span><span class="o">.</span><span
class="na">setType</span><span class="o">(</span><span
class="n">ET_PRODUCT_FQN</span><span class="o">);</span>
- <span class="k">return</span> <span
class="n">entitySet</span><span class="o">;</span>
- <span class="o">}</span>
+ <span class="k">return</span> <span class="n">entitySet</span><span
class="o">;</span>
<span class="o">}</span>
+ <span class="o">}</span>
- <span class="k">return</span> <span class="kc">null</span><span
class="o">;</span>
+ <span class="k">return</span> <span class="kc">null</span><span
class="o">;</span>
<span class="o">}</span>
</pre></div>
@@ -459,55 +457,55 @@ In our example, we have only one <em>Ent
<p><strong><em>getSchemas()</em></strong></p>
-<p>Up to this point, we have declared the type of our data
(<em>EntityType</em>) and our list (<em>EntitySet</em>), and we have put it
into a container (<em>EntityContainer</em>).<br />
-Now we are required to put all these elements into a <em>Schema</em>.<br />
+<p>Up to this point, we have declared the type of our data
(<code>CsdlEntityType</code>) and our list (<code>CsdlEntitySet</code>), and we
have put it into a container (<code>CsdlEntityContainer</code>).<br />
+Now we are required to put all these elements into a
<code>CsdlSchema</code>.<br />
While the model of an OData service can have several schemas, in most cases
there will probably be only one schema.<br />
-So, in our example, we create a list of schemas, where we add one new
<em>Schema</em> object.<br />
+So, in our example, we create a list of schemas, where we add one new
<code>CsdlSchema</code> object.<br />
The schema is configured with a <em>Namespace</em>, which serves to uniquely
identify all elements.<br />
Then our elements are added to the Schema.</p>
-<div class="codehilite"><pre><span class="nd">@Override</span>
-<span class="kd">public</span> <span class="n">List</span><span
class="o"><</span><span class="n">Schema</span><span class="o">></span>
<span class="n">getSchemas</span><span class="o">()</span> <span
class="kd">throws</span> <span class="n">ODataException</span> <span
class="o">{</span>
+<div class="codehilite"><pre><span class="kd">public</span> <span
class="n">List</span><span class="o"><</span><span
class="n">CsdlSchema</span><span class="o">></span> <span
class="n">getSchemas</span><span class="o">()</span> <span
class="kd">throws</span> <span class="n">ODataException</span> <span
class="o">{</span>
- <span class="c1">// create Schema</span>
- <span class="n">Schema</span> <span class="n">schema</span> <span
class="o">=</span> <span class="k">new</span> <span
class="n">Schema</span><span class="o">();</span>
- <span class="n">schema</span><span class="o">.</span><span
class="na">setNamespace</span><span class="o">(</span><span
class="n">NAMESPACE</span><span class="o">);</span>
+ <span class="c1">// create Schema</span>
+ <span class="n">CsdlSchema</span> <span class="n">schema</span> <span
class="o">=</span> <span class="k">new</span> <span
class="n">CsdlSchema</span><span class="o">();</span>
+ <span class="n">schema</span><span class="o">.</span><span
class="na">setNamespace</span><span class="o">(</span><span
class="n">NAMESPACE</span><span class="o">);</span>
- <span class="c1">// add EntityTypes</span>
- <span class="n">List</span><span class="o"><</span><span
class="n">EntityType</span><span class="o">></span> <span
class="n">entityTypes</span> <span class="o">=</span> <span
class="k">new</span> <span class="n">ArrayList</span><span
class="o"><</span><span class="n">EntityType</span><span
class="o">>();</span>
- <span class="n">entityTypes</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span
class="n">getEntityType</span><span class="o">(</span><span
class="n">ET_PRODUCT_FQN</span><span class="o">));</span>
- <span class="n">schema</span><span class="o">.</span><span
class="na">setEntityTypes</span><span class="o">(</span><span
class="n">entityTypes</span><span class="o">);</span>
+ <span class="c1">// add EntityTypes</span>
+ <span class="n">List</span><span class="o"><</span><span
class="n">CsdlEntityType</span><span class="o">></span> <span
class="n">entityTypes</span> <span class="o">=</span> <span
class="k">new</span> <span class="n">ArrayList</span><span
class="o"><</span><span class="n">CsdlEntityType</span><span
class="o">>();</span>
+ <span class="n">entityTypes</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span
class="n">getEntityType</span><span class="o">(</span><span
class="n">ET_PRODUCT_FQN</span><span class="o">));</span>
+ <span class="n">schema</span><span class="o">.</span><span
class="na">setEntityTypes</span><span class="o">(</span><span
class="n">entityTypes</span><span class="o">);</span>
- <span class="c1">// add EntityContainer</span>
- <span class="n">schema</span><span class="o">.</span><span
class="na">setEntityContainer</span><span class="o">(</span><span
class="n">getEntityContainer</span><span class="o">());</span>
+ <span class="c1">// add EntityContainer</span>
+ <span class="n">schema</span><span class="o">.</span><span
class="na">setEntityContainer</span><span class="o">(</span><span
class="n">getEntityContainer</span><span class="o">());</span>
- <span class="c1">// finally</span>
- <span class="n">List</span><span class="o"><</span><span
class="n">Schema</span><span class="o">></span> <span
class="n">schemas</span> <span class="o">=</span> <span class="k">new</span>
<span class="n">ArrayList</span><span class="o"><</span><span
class="n">Schema</span><span class="o">>();</span>
- <span class="n">schemas</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span class="n">schema</span><span
class="o">);</span>
+ <span class="c1">// finally</span>
+ <span class="n">List</span><span class="o"><</span><span
class="n">CsdlSchema</span><span class="o">></span> <span
class="n">schemas</span> <span class="o">=</span> <span class="k">new</span>
<span class="n">ArrayList</span><span class="o"><</span><span
class="n">CsdlSchema</span><span class="o">>();</span>
+ <span class="n">schemas</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span class="n">schema</span><span
class="o">);</span>
- <span class="k">return</span> <span class="n">schemas</span><span
class="o">;</span>
+ <span class="k">return</span> <span class="n">schemas</span><span
class="o">;</span>
<span class="o">}</span>
</pre></div>
<p><strong><em>getEntityContainerInfo()</em></strong></p>
-<div class="codehilite"><pre><span class="nd">@Override</span>
-<span class="kd">public</span> <span class="n">EntityContainerInfo</span>
<span class="nf">getEntityContainerInfo</span><span class="o">(</span><span
class="n">FullQualifiedName</span> <span
class="n">entityContainerName</span><span class="o">)</span> <span
class="kd">throws</span> <span class="n">ODataException</span> <span
class="o">{</span>
+<div class="codehilite"><pre><span class="kd">public</span> <span
class="n">CsdlEntityContainer</span> <span
class="nf">getEntityContainer</span><span class="o">()</span> <span
class="kd">throws</span> <span class="n">ODataException</span> <span
class="o">{</span>
-<span class="c1">// This method is invoked when displaying the service
document at e.g. http://localhost:8080/DemoService/DemoService.svc</span>
- <span class="k">if</span><span class="o">(</span><span
class="n">entityContainerName</span> <span class="o">==</span> <span
class="kc">null</span> <span class="o">||</span> <span
class="n">entityContainerName</span><span class="o">.</span><span
class="na">equals</span><span class="o">(</span><span
class="n">CONTAINER</span><span class="o">)){</span>
- <span class="n">EntityContainerInfo</span> <span
class="n">entityContainerInfo</span> <span class="o">=</span> <span
class="k">new</span> <span class="n">EntityContainerInfo</span><span
class="o">();</span>
- <span class="n">entityContainerInfo</span><span
class="o">.</span><span class="na">setContainerName</span><span
class="o">(</span><span class="n">CONTAINER</span><span class="o">);</span>
- <span class="k">return</span> <span
class="n">entityContainerInfo</span><span class="o">;</span>
- <span class="o">}</span>
+ <span class="c1">// create EntitySets</span>
+ <span class="n">List</span><span class="o"><</span><span
class="n">CsdlEntitySet</span><span class="o">></span> <span
class="n">entitySets</span> <span class="o">=</span> <span class="k">new</span>
<span class="n">ArrayList</span><span class="o"><</span><span
class="n">CsdlEntitySet</span><span class="o">>();</span>
+ <span class="n">entitySets</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span
class="n">getEntitySet</span><span class="o">(</span><span
class="n">CONTAINER</span><span class="o">,</span> <span
class="n">ES_PRODUCTS_NAME</span><span class="o">));</span>
+
+ <span class="c1">// create EntityContainer</span>
+ <span class="n">CsdlEntityContainer</span> <span
class="n">entityContainer</span> <span class="o">=</span> <span
class="k">new</span> <span class="n">CsdlEntityContainer</span><span
class="o">();</span>
+ <span class="n">entityContainer</span><span class="o">.</span><span
class="na">setName</span><span class="o">(</span><span
class="n">CONTAINER_NAME</span><span class="o">);</span>
+ <span class="n">entityContainer</span><span class="o">.</span><span
class="na">setEntitySets</span><span class="o">(</span><span
class="n">entitySets</span><span class="o">);</span>
- <span class="k">return</span> <span class="kc">null</span><span
class="o">;</span>
+ <span class="k">return</span> <span class="n">entityContainer</span><span
class="o">;</span>
<span class="o">}</span>
</pre></div>
<p><strong>Summary:</strong><br />
We have created a class that declares the metadata of our OData service.
-We have declared the main elements of an OData service: <em>EntityType</em>,
<em>EntitySet</em>, <em>EntityContainer</em> and <em>Schema</em>.</p>
+We have declared the main elements of an OData service: <em>EntityType</em>,
<em>EntitySet</em>, <em>EntityContainer</em> and <em>Schema</em> (with us of
the according Olingo classes <code>CsdlEntityType</code>,
<code>CsdlEntitySet</code>, <code>CsdlEntityContainer</code> and
<code>CsdlSchema</code>).</p>
<p>At runtime of an OData service, such metadata can be viewed by invoking the
Metadata Document.</p>
<p>In our example invokation of the URL: <a
href="http://localhost:8080/DemoService/DemoService.svc/$metadata">http://localhost:8080/DemoService/DemoService.svc/$metadata</a></p>
<p>Give us the result below:</p>
@@ -556,16 +554,18 @@ If desired, you can proceed with impleme
In our example, we imagine that our OData service is invoked by a user who
wants to see which products are offered by a web shop.<br />
He invokes a URL and gets a list of products.<br />
Providing the list of products is the task that we are going to implement in
this chapter.</p>
-<p>The work that we have to do in this chapter can be divided into 4 tasks:
-1. Check the URI<br />
- We need to identify the requested resource and have to consider Query
Options (if available)
-2. Provide the data<br />
- Based on the URI info, we have to obtain the data from our data store (can
be e.g. a Database)
-3. Serialize the data<br />
- The data has to be transformed into the required format
-4. Configure the response<br />
- Since we are implementing a âprocessorâ, the last step is to provide
the response object</p>
-<p>These 4 steps will be considered in the implementation of the
<em>readEntityCollection()</em> method.</p>
+<p>The work that we have to do in this chapter can be divided into 4 tasks:</p>
+<ol>
+<li>Check the URI<br />
+ We need to identify the requested resource and have to consider Query
Options (if available)</li>
+<li>Provide the data<br />
+ Based on the URI info, we have to obtain the data from our data store
(can be e.g. a Database)</li>
+<li>Serialize the data<br />
+ The data has to be transformed into the required format</li>
+<li>Configure the response<br />
+ Since we are implementing a âprocessorâ, the last step is to provide
the response object</li>
+</ol>
+<p>These 4 steps will be considered in the implementation of the
<code>readEntityCollection()</code> method.</p>
<h3 id="421-background">4.2.1. Background</h3>
<p>In terms of <em>Olingo</em>, while processing a service request, a
Processor instance is invoked that is supposed to understand the (user HTTP-)
request and deliver the desired data.<br />
<em>Olingo</em> provides API for processing different kind of service
requests:<br />
@@ -574,13 +574,13 @@ Such a service request can ask for a lis
In our example, we have stated in our metadata document that We will provide a
list of âproductsâ whenever the <em>EntitySet</em> with name âProductsâ
is invoked.<br />
This means that the user of our OData service will append the
<em>EntitySet</em> name to the root URL of the service and then invoke the full
URL.<br />
This is http://localhost:8080/ExampleService1/ExampleServlet1.svc/Products
-So, whenever this URL is fired, Olingo will invoke the
<em>EntityCollectionProcessor</em> implementation of our OData service.
-Then our <em>EntityCollectionProcessor</em> implementation is expected to
provide a list of products.</p>
+So, whenever this URL is fired, Olingo will invoke the
<code>EntityCollectionProcessor</code> implementation of our OData service.
+Then our <code>EntityCollectionProcessor</code> implementation is expected to
provide a list of products.</p>
<p>As we have already mentioned, the metadata document is the contract for
providing data.
This means that when it comes to provide the actual data, we have to do it
according to the specified metadata.<br />
For example, the property names have to match, also the types of the
properties, and, if specified, the length of the strings, etc</p>
<h3 id="422-create-class">4.2.2. Create class</h3>
-<p>Within our package <em>myservice.mynamespace.service</em>, we create a Java
class <em>DemoEntityCollectionProcessor</em> that implements the interface
<em>org.apache.olingo.server.api.processor.EntityCollectionProcessor</em>.</p>
+<p>Within our package <code>myservice.mynamespace.service</code>, we create a
Java class <code>DemoEntityCollectionProcessor</code> that implements the
interface
<code>org.apache.olingo.server.api.processor.EntityCollectionProcessor</code>.</p>
<p><img alt="createJavaClass" src="createJavaClass.png" title="The Eclipse
dialog for creating a Java class" /></p>
<h3 id="423-implement-the-required-methods">4.2.3. Implement the required
methods</h3>
<p>After creation of the Java class, we can see that there are 2 methods to be
implemented:</p>
@@ -608,24 +608,23 @@ We will need it later, so we store it as
<p><strong><em>readEntityCollection()</em></strong></p>
-<p>The <em>EntityCollectionProcessor</em> exposes only one method:<br />
-<em>readEntityCollection()</em><br />
-Here we have to understand that this <em>readEntityCollection</em>-method is
invoked, when the OData service is called with an HTTP GET operation for an
entity collection.</p>
-<p>The <em>readEntityCollection</em> method is used to âreadâ the data in
the backend (this can be e.g. a database) and to deliver it to the user who
calls the OData service.</p>
+<p>The <code>EntityCollectionProcessor</code> exposes only one method:
<code>readEntityCollection(...)</code> </p>
+<p>Here we have to understand that this
<code>readEntityCollection(...)</code>-method is invoked, when the OData
service is called with an HTTP GET operation for an entity collection.</p>
+<p>The <code>readEntityCollection(...)</code> method is used to âreadâ the
data in the backend (this can be e.g. a database) and to deliver it to the user
who calls the OData service.</p>
<p>The method signature:</p>
<p>The ârequestâ parameter contains raw HTTP information. It is typically
used for creation scenario, where a request body is sent along with the
request.</p>
<p>With the second parameter, the âresponseâ object is passed to our
method in order to carry the response data. So here we have to set the response
body, along with status code and content-type header.</p>
<p>The third parameter, the âuriInfoâ, contains information about the
relevant part of the URL. This means, the segments starting after the service
name. </p>
-<p>Example:<br />
+<p><strong>Example:</strong><br />
If the user calls the following URL:<br />
<code>http://localhost:8080/DemoService/DemoService.svc/Products</code><br />
-The <em>readEntityCollection</em> method is invoked and the <em>uriInfo</em>
object contains one segment: âProductsâ </p>
+The <code>readEntityCollection(...)</code> method is invoked and the
<em>uriInfo</em> object contains one segment: âProductsâ </p>
<p>If the user calls the following URL:<br />
<code>http://localhost:8080/DemoService/DemoService.svc/Products?$filter=ID eq
1</code><br />
-Then the <em>readEntityCollection</em> method is invoked and the
<em>uriInfo</em> contains the information about the entity set and furthermore
the system query option $filter and its value.</p>
+Then the <code>readEntityCollection(...)</code> method is invoked and the
<em>uriInfo</em> contains the information about the entity set and furthermore
the system query option $filter and its value.</p>
<p>The last parameter, the âresponseFormatâ, contains information about
the content type that is requested by the user.<br />
This means that the user has the choice to receive the data either in XML or
in JSON. </p>
-<p>Example:<br />
+<p><strong>Example:</strong><br />
If the user calls the following URL:<br />
<code>http://localhost:8080/DemoService/DemoService.svc/Products?$format=application/json;odata.metadata=minimal</code></p>
<p>then the content type is:<br />
@@ -638,91 +637,93 @@ In this case as well, our readEntityColl
<p><strong>Note:</strong>
If the user doesnât specify any content type, then the default is JSON.</p>
<p>Why is this parameter needed?<br />
-Because the <em>readEntityCollection</em> method is supposed to deliver the
data in the format that is requested by the user. We will use this parameter
when creating a serializer based on it.</p>
-<p>The steps for implementating the method <em>readEntityCollection</em>
are:</p>
+Because the <code>readEntityCollection(...)</code> method is supposed to
deliver the data in the format that is requested by the user. We will use this
parameter when creating a serializer based on it.</p>
+<p>The steps for implementating the method
<code>readEntityCollection(...)</code> are:</p>
<ol>
<li>
<p>Which data is requested?<br />
- Usually, an OData service provides different <em>EntitySets</em>, so first
it is required to identify which <em>EntitySet</em> has been requested. This
information can be retrieved from the <em>uriInfo</em> object</p>
+ Usually, an OData service provides different <em>EntitySets</em>, so first
it is required to identify which <em>EntitySet</em> has been requested. This
information can be retrieved from the <em>uriInfo</em> object.</p>
</li>
<li>
<p>Fetch the data
- As a developer of the OData service, you have to know how and where the data
is stored. In many cases, this would be a database. At this point, you would
connect to your database and fetch the requested data with an appropriate SQL
statement. The data that is fetched from the data storage has to be put into an
<em>EntitySet</em> object.
- Note that this object has to be of type <em>EntitySet</em>, not
<em>EdmEntitySet</em><br />
- The package <em>org.apache.olingo.commons.api.data</em> provides interfaces
that describe the actual data, not the metadata.</p>
+ As a developer of the OData service, you have to know how and where the
data is stored. In many cases, this would be a database. At this point, you
would connect to your database and fetch the requested data with an appropriate
SQL statement. The data that is fetched from the data storage has to be put
into an <em>EntityCollection</em> object.
+ The package <code>org.apache.olingo.commons.api.data</code> provides
interfaces that describe the actual data, not the metadata.</p>
<p><img alt="datapackage" src="datapackage.png" title="The package containing
the interfaces for handling runtime data" /></p>
</li>
<li>
<p>Transform the data<br />
<em>Olingo</em> expects us to provide the data as low-level
<em>InputStream</em> object. However, <em>Olingo</em> supports us in doing so,
by providing us with a proper "serializer".
- So what we have to do is create the serializer based on the requested
content type, configure it and call it.</p>
+ So what we have to do is create the serializer based on the requested
content type, configure it and call it.</p>
</li>
<li>
<p>Configure the response<br />
- The response object has been passed to us in the method signature. We use it
to set the serialized data (the <em>InputStream</em> object).<br />
- Furthermore, we have to set the HTTP status code, which means that we have
the opportunity to do proper error handling.<br />
- And finally we have to set the content type. </p>
+ The response object has been passed to us in the method signature. We use
it to set the serialized data (the <code>InputStream</code> object).<br />
+ Furthermore, we have to set the HTTP status code, which means that we have
the opportunity to do proper error handling.<br />
+ And finally we have to set the content type. </p>
</li>
</ol>
-<p>Sample:</p>
+<p><strong>Sample:</strong></p>
<div class="codehilite"><pre><span class="kd">public</span> <span
class="kt">void</span> <span class="nf">readEntityCollection</span><span
class="o">(</span><span class="n">ODataRequest</span> <span
class="n">request</span><span class="o">,</span> <span
class="n">ODataResponse</span> <span class="n">response</span><span
class="o">,</span> <span class="n">UriInfo</span> <span
class="n">uriInfo</span><span class="o">,</span> <span
class="n">ContentType</span> <span class="n">responseFormat</span><span
class="o">)</span>
- <span class="kd">throws</span> <span
class="n">ODataApplicationException</span><span class="o">,</span> <span
class="n">SerializerException</span> <span class="o">{</span>
+ <span class="kd">throws</span> <span
class="n">ODataApplicationException</span><span class="o">,</span> <span
class="n">SerializerException</span> <span class="o">{</span>
- <span class="c1">// 1st retrieve the requested EntitySet from the uriInfo
(representation of the parsed URI)</span>
- <span class="n">List</span><span class="o"><</span><span
class="n">UriResource</span><span class="o">></span> <span
class="n">resourcePaths</span> <span class="o">=</span> <span
class="n">uriInfo</span><span class="o">.</span><span
class="na">getUriResourceParts</span><span class="o">();</span>
- <span class="c1">// in our example, the first segment is the
EntitySet:</span>
- <span class="n">UriResourceEntitySet</span> <span
class="n">uriResourceEntitySet</span> <span class="o">=</span> <span
class="o">(</span><span class="n">UriResourceEntitySet</span><span
class="o">)</span> <span class="n">resourcePaths</span><span
class="o">.</span><span class="na">get</span><span class="o">(</span><span
class="mi">0</span><span class="o">);</span>
- <span class="n">EdmEntitySet</span> <span class="n">edmEntitySet</span>
<span class="o">=</span> <span class="n">uriResourceEntitySet</span><span
class="o">.</span><span class="na">getEntitySet</span><span class="o">();</span>
-
- <span class="c1">// 2nd: fetch the data from backend for this requested
EntitySetName and delivere as EntitySet</span>
- <span class="n">EntitySet</span> <span class="n">entitySet</span> <span
class="o">=</span> <span class="n">getData</span><span class="o">(</span><span
class="n">edmEntitySet</span><span class="o">);</span>
-
- <span class="c1">// 3rd: create a serializer based on the requested format
(json)</span>
- <span class="n">ODataFormat</span> <span class="n">format</span> <span
class="o">=</span> <span class="n">ODataFormat</span><span
class="o">.</span><span class="na">fromContentType</span><span
class="o">(</span><span class="n">responseFormat</span><span class="o">);</span>
- <span class="n">ODataSerializer</span> <span class="n">serializer</span>
<span class="o">=</span> <span class="n">odata</span><span
class="o">.</span><span class="na">createSerializer</span><span
class="o">(</span><span class="n">format</span><span class="o">);</span>
-
- <span class="c1">// and serialize the content: transform from the
EntitySet object to InputStream</span>
- <span class="n">EdmEntityType</span> <span class="n">edmEntityType</span>
<span class="o">=</span> <span class="n">edmEntitySet</span><span
class="o">.</span><span class="na">getEntityType</span><span
class="o">();</span>
- <span class="n">ContextURL</span> <span class="n">contextUrl</span> <span
class="o">=</span> <span class="n">ContextURL</span><span
class="o">.</span><span class="na">with</span><span class="o">().</span><span
class="na">entitySet</span><span class="o">(</span><span
class="n">edmEntitySet</span><span class="o">).</span><span
class="na">build</span><span class="o">();</span>
-
- <span class="n">EntityCollectionSerializerOptions</span> <span
class="n">opts</span> <span class="o">=</span>
- <span
class="n">EntityCollectionSerializerOptions</span><span class="o">.</span><span
class="na">with</span><span class="o">().</span><span
class="na">contextURL</span><span class="o">(</span><span
class="n">contextUrl</span><span class="o">).</span><span
class="na">build</span><span class="o">();</span>
- <span class="n">InputStream</span> <span
class="n">serializedContent</span> <span class="o">=</span> <span
class="n">serializer</span><span class="o">.</span><span
class="na">entityCollection</span><span class="o">(</span><span
class="n">edmEntityType</span><span class="o">,</span> <span
class="n">entitySet</span><span class="o">,</span> <span
class="n">opts</span><span class="o">);</span>
-
- <span class="c1">// 4th: configure the response object: set the body,
headers and status code</span>
- <span class="n">response</span><span class="o">.</span><span
class="na">setContent</span><span class="o">(</span><span
class="n">serializedContent</span><span class="o">);</span>
- <span class="n">response</span><span class="o">.</span><span
class="na">setStatusCode</span><span class="o">(</span><span
class="n">HttpStatusCode</span><span class="o">.</span><span
class="na">OK</span><span class="o">.</span><span
class="na">getStatusCode</span><span class="o">());</span>
- <span class="n">response</span><span class="o">.</span><span
class="na">setHeader</span><span class="o">(</span><span
class="n">HttpHeader</span><span class="o">.</span><span
class="na">CONTENT_TYPE</span><span class="o">,</span> <span
class="n">responseFormat</span><span class="o">.</span><span
class="na">toContentTypeString</span><span class="o">());</span>
- <span class="o">}</span>
+ <span class="c1">// 1st we have retrieve the requested EntitySet from the
uriInfo object (representation of the parsed service URI)</span>
+ <span class="n">List</span><span class="o"><</span><span
class="n">UriResource</span><span class="o">></span> <span
class="n">resourcePaths</span> <span class="o">=</span> <span
class="n">uriInfo</span><span class="o">.</span><span
class="na">getUriResourceParts</span><span class="o">();</span>
+ <span class="n">UriResourceEntitySet</span> <span
class="n">uriResourceEntitySet</span> <span class="o">=</span> <span
class="o">(</span><span class="n">UriResourceEntitySet</span><span
class="o">)</span> <span class="n">resourcePaths</span><span
class="o">.</span><span class="na">get</span><span class="o">(</span><span
class="mi">0</span><span class="o">);</span> <span class="c1">// in our
example, the first segment is the EntitySet</span>
+ <span class="n">EdmEntitySet</span> <span class="n">edmEntitySet</span>
<span class="o">=</span> <span class="n">uriResourceEntitySet</span><span
class="o">.</span><span class="na">getEntitySet</span><span class="o">();</span>
+
+ <span class="c1">// 2nd: fetch the data from backend for this requested
EntitySetName</span>
+ <span class="c1">// it has to be delivered as EntitySet object</span>
+ <span class="n">EntityCollection</span> <span class="n">entitySet</span>
<span class="o">=</span> <span class="n">getData</span><span
class="o">(</span><span class="n">edmEntitySet</span><span class="o">);</span>
+
+ <span class="c1">// 3rd: create a serializer based on the requested format
(json)</span>
+ <span class="n">ODataFormat</span> <span class="n">format</span> <span
class="o">=</span> <span class="n">ODataFormat</span><span
class="o">.</span><span class="na">fromContentType</span><span
class="o">(</span><span class="n">responseFormat</span><span class="o">);</span>
+ <span class="n">ODataSerializer</span> <span class="n">serializer</span>
<span class="o">=</span> <span class="n">odata</span><span
class="o">.</span><span class="na">createSerializer</span><span
class="o">(</span><span class="n">format</span><span class="o">);</span>
+
+ <span class="c1">// 4th: Now serialize the content: transform from the
EntitySet object to InputStream</span>
+ <span class="n">EdmEntityType</span> <span class="n">edmEntityType</span>
<span class="o">=</span> <span class="n">edmEntitySet</span><span
class="o">.</span><span class="na">getEntityType</span><span
class="o">();</span>
+ <span class="n">ContextURL</span> <span class="n">contextUrl</span> <span
class="o">=</span> <span class="n">ContextURL</span><span
class="o">.</span><span class="na">with</span><span class="o">().</span><span
class="na">entitySet</span><span class="o">(</span><span
class="n">edmEntitySet</span><span class="o">).</span><span
class="na">build</span><span class="o">();</span>
+
+ <span class="n">EntityCollectionSerializerOptions</span> <span
class="n">opts</span> <span class="o">=</span> <span
class="n">EntityCollectionSerializerOptions</span><span class="o">.</span><span
class="na">with</span><span class="o">().</span><span
class="na">contextURL</span><span class="o">(</span><span
class="n">contextUrl</span><span class="o">).</span><span
class="na">build</span><span class="o">();</span>
+ <span class="n">SerializerResult</span> <span
class="n">serializedContent</span> <span class="o">=</span> <span
class="n">serializer</span><span class="o">.</span><span
class="na">entityCollection</span><span class="o">(</span><span
class="n">serviceMetadata</span><span class="o">,</span> <span
class="n">edmEntityType</span><span class="o">,</span> <span
class="n">entitySet</span><span class="o">,</span> <span
class="n">opts</span><span class="o">);</span>
+
+ <span class="c1">// Finally: configure the response object: set the body,
headers and status code</span>
+ <span class="n">response</span><span class="o">.</span><span
class="na">setContent</span><span class="o">(</span><span
class="n">serializedContent</span><span class="o">.</span><span
class="na">getContent</span><span class="o">());</span>
+ <span class="n">response</span><span class="o">.</span><span
class="na">setStatusCode</span><span class="o">(</span><span
class="n">HttpStatusCode</span><span class="o">.</span><span
class="na">OK</span><span class="o">.</span><span
class="na">getStatusCode</span><span class="o">());</span>
+ <span class="n">response</span><span class="o">.</span><span
class="na">setHeader</span><span class="o">(</span><span
class="n">HttpHeader</span><span class="o">.</span><span
class="na">CONTENT_TYPE</span><span class="o">,</span> <span
class="n">responseFormat</span><span class="o">.</span><span
class="na">toContentTypeString</span><span class="o">());</span>
+<span class="o">}</span>
</pre></div>
<p><strong><em>getData()</em></strong></p>
<p>We have not elaborated on fetching the actual data.
In our tutorial, to keep the code as simple as possible, we use a little
helper method that delivers some hardcoded entries.<br />
-Since we are supposed to deliver the data inside an <em>EntitySet</em>
instance, we create the instance, ask it for the (initially empty) list of
entities and add some new entities to it.<br />
-We create the entities and their properties according to what we declared in
our <em>ExampleEdmProvider</em> class. So we have to take care to provide the
correct names to the new property objects.</p>
-<div class="codehilite"><pre><span class="kd">private</span> <span
class="n">EntitySet</span> <span class="nf">getData</span><span
class="o">(</span><span class="n">EdmEntitySet</span> <span
class="n">edmEntitySet</span><span class="o">){</span>
-
- <span class="n">EntitySet</span> <span class="n">entitySet</span> <span
class="o">=</span> <span class="k">new</span> <span
class="n">EntitySetImpl</span><span class="o">();</span>
- <span class="n">List</span><span class="o"><</span><span
class="n">Entity</span><span class="o">></span> <span
class="n">entityList</span> <span class="o">=</span> <span
class="n">entitySet</span><span class="o">.</span><span
class="na">getEntities</span><span class="o">();</span>
+Since we are supposed to deliver the data inside an
<code>EntityCollection</code> instance, we create the instance, ask it for the
(initially empty) list of entities and add some new entities to it.<br />
+We create the entities and their properties according to what we declared in
our <code>DemoEdmProvider</code> class. So we have to take care to provide the
correct names to the new property objects.</p>
+<div class="codehilite"><pre><span class="kd">private</span> <span
class="n">EntityCollection</span> <span class="nf">getData</span><span
class="o">(</span><span class="n">EdmEntitySet</span> <span
class="n">edmEntitySet</span><span class="o">){</span>
+
+ <span class="n">EntityCollection</span> <span
class="n">entityCollection</span> <span class="o">=</span> <span
class="k">new</span> <span class="n">EntityCollection</span><span
class="o">();</span>
+ <span class="c1">// check for which EdmEntitySet the data is requested</span>
+ <span class="k">if</span><span class="o">(</span><span
class="n">DemoEdmProvider</span><span class="o">.</span><span
class="na">ES_PRODUCTS_NAME</span><span class="o">.</span><span
class="na">equals</span><span class="o">(</span><span
class="n">edmEntitySet</span><span class="o">.</span><span
class="na">getName</span><span class="o">()))</span> <span class="o">{</span>
+ <span class="n">List</span><span class="o"><</span><span
class="n">Entity</span><span class="o">></span> <span
class="n">entityList</span> <span class="o">=</span> <span
class="n">entityCollection</span><span class="o">.</span><span
class="na">getEntities</span><span class="o">();</span>
<span class="c1">// add some sample product entities</span>
- <span class="n">entityList</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span class="k">new</span> <span
class="n">EntityImpl</span><span class="o">()</span>
- <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">PropertyImpl</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"ID"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="mi">1</span><span class="o">))</span>
- <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">PropertyImpl</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Name"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="s">"Notebook Basic 15"</span><span class="o">))</span>
- <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">PropertyImpl</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Description"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="s">"Notebook Basic, 1.7GHz - 15 XGA - 1024MB DDR2 SDRAM -
40GB"</span><span class="o">)));</span>
- <span class="n">entityList</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span class="k">new</span> <span
class="n">EntityImpl</span><span class="o">()</span>
- <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">PropertyImpl</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"ID"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="mi">2</span><span class="o">))</span>
- <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">PropertyImpl</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Name"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span class="s">"1UMTS
PDA"</span><span class="o">))</span>
- <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">PropertyImpl</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Description"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="s">"Ultrafast 3G UMTS/HSDPA Pocket PC, supports GSM
network"</span><span class="o">)));</span>
-
- <span class="n">entityList</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span class="k">new</span> <span
class="n">EntityImpl</span><span class="o">()</span>
- <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">PropertyImpl</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"ID"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="mi">3</span><span class="o">))</span>
- <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">PropertyImpl</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Name"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span class="s">"Ergo
Screen"</span><span class="o">))</span>
- <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">PropertyImpl</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Description"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span class="s">"17
Optimum Resolution 1024 x 768 @ 85Hz, resolution 1280 x 960"</span><span
class="o">)));</span>
+ <span class="n">entityList</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span class="k">new</span> <span
class="n">Entity</span><span class="o">()</span>
+ <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">Property</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"ID"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="mi">1</span><span class="o">))</span>
+ <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">Property</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Name"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="s">"Notebook Basic 15"</span><span class="o">))</span>
+ <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">Property</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Description"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="s">"Notebook Basic, 1.7GHz - 15 XGA - 1024MB DDR2 SDRAM -
40GB"</span><span class="o">)));</span>
+
+ <span class="n">entityList</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span class="k">new</span> <span
class="n">Entity</span><span class="o">()</span>
+ <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">Property</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"ID"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="mi">2</span><span class="o">))</span>
+ <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">Property</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Name"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span class="s">"1UMTS
PDA"</span><span class="o">))</span>
+ <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">Property</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Description"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="s">"Ultrafast 3G UMTS/HSDPA Pocket PC, supports GSM
network"</span><span class="o">)));</span>
+
+ <span class="n">entityList</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span class="k">new</span> <span
class="n">Entity</span><span class="o">()</span>
+ <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">Property</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"ID"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="mi">3</span><span class="o">))</span>
+ <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">Property</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Name"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span class="s">"Ergo
Screen"</span><span class="o">))</span>
+ <span class="o">.</span><span class="na">addProperty</span><span
class="o">(</span><span class="k">new</span> <span
class="n">Property</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"Description"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span class="s">"17
Optimum Resolution 1024 x 768 @ 85Hz, resolution 1280 x 960"</span><span
class="o">)));</span>
+ <span class="o">}</span>
- <span class="k">return</span> <span class="n">entitySet</span><span
class="o">;</span>
+ <span class="k">return</span> <span class="n">entityCollection</span><span
class="o">;</span>
<span class="o">}</span>
</pre></div>
@@ -736,40 +737,37 @@ The servlet is a standard <em>HttpServle
<p>Letâs quickly do the remaining steps:</p>
<h3 id="431-create-and-implement-the-servlet">4.3.1. Create and implement the
Servlet</h3>
<p>Create a new package <em>myservice.mynamespace.web</em>.
-Create Java class with name <em>DemoServlet</em> that inherits from
<em>HttpServlet</em>.</p>
+Create Java class with name <code>DemoServlet</code> that inherits from
<code>HttpServlet</code>.</p>
<p><img alt="createJavaServletClass" src="createJavaServletClass.png"
title="Creating the servlet class" /></p>
<p>Override the <code>service()</code> method.<br />
-Basically, what we are doing here is to create an <em>ODataHttpHandler</em>,
which is a class that is provided by <em>Olingo</em>.
+Basically, what we are doing here is to create an
<code>ODataHttpHandler</code>, which is a class that is provided by
<em>Olingo</em>.
It receives the user request and if the URL conforms to the OData
specification, the request is delegated to the processor implementation of the
OData service.
This means that the handler has to be configured with all processor
implementations that have been created along with the OData service (in our
example, only one processor).
Furthermore, the <code>ODataHttpHandler</code> needs to carry the knowledge
about the <code>EdmProvider</code>.</p>
<p>This is where our two implemented classes come together, the metadata
declaration and the data provisioning.</p>
-<div class="codehilite"><pre><span class="c1">// This class represents a
standard HttpServlet implementation.</span>
-<span class="c1">// It is used as main entry point for the web application
that carries the OData service.</span>
-<span class="c1">// The implementation of this HttpServlet simply delegates
the user requests to the ODataHttpHandler</span>
-<span class="kd">public</span> <span class="kd">class</span> <span
class="nc">DemoServlet</span> <span class="kd">extends</span> <span
class="n">HttpServlet</span> <span class="o">{</span>
-
- <span class="kd">private</span> <span class="kd">static</span> <span
class="kd">final</span> <span class="kt">long</span> <span
class="n">serialVersionUID</span> <span class="o">=</span> <span
class="mi">1L</span><span class="o">;</span>
- <span class="kd">private</span> <span class="kd">static</span> <span
class="kd">final</span> <span class="n">Logger</span> <span
class="n">LOG</span> <span class="o">=</span> <span
class="n">LoggerFactory</span><span class="o">.</span><span
class="na">getLogger</span><span class="o">(</span><span
class="n">DemoServlet</span><span class="o">.</span><span
class="na">class</span><span class="o">);</span>
-
- <span class="nd">@Override</span>
- <span class="kd">protected</span> <span class="kt">void</span> <span
class="nf">service</span><span class="o">(</span><span class="kd">final</span>
<span class="n">HttpServletRequest</span> <span class="n">req</span><span
class="o">,</span> <span class="kd">final</span> <span
class="n">HttpServletResponse</span> <span class="n">resp</span><span
class="o">)</span> <span class="kd">throws</span> <span
class="n">ServletException</span><span class="o">,</span> <span
class="n">IOException</span> <span class="o">{</span>
-
- <span class="k">try</span> <span class="o">{</span>
- <span class="c1">// create odata handler and configure it with
EdmProvider and Processor</span>
- <span class="n">OData</span> <span class="n">odata</span> <span
class="o">=</span> <span class="n">OData</span><span class="o">.</span><span
class="na">newInstance</span><span class="o">();</span>
- <span class="n">ServiceMetadata</span> <span class="n">edm</span>
<span class="o">=</span> <span class="n">odata</span><span
class="o">.</span><span class="na">createServiceMetadata</span><span
class="o">(</span><span class="k">new</span> <span
class="n">ExampleEdmProvider</span><span class="o">(),</span> <span
class="k">new</span> <span class="n">ArrayList</span><span
class="o"><</span><span class="n">EdmxReference</span><span
class="o">>());</span>
- <span class="n">ODataHttpHandler</span> <span
class="n">handler</span> <span class="o">=</span> <span
class="n">odata</span><span class="o">.</span><span
class="na">createHandler</span><span class="o">(</span><span
class="n">edm</span><span class="o">);</span>
- <span class="n">handler</span><span class="o">.</span><span
class="na">register</span><span class="o">(</span><span class="k">new</span>
<span class="n">DemoEntityCollectionProcessor</span><span class="o">());</span>
-
- <span class="c1">// let the handler do the work</span>
- <span class="n">handler</span><span class="o">.</span><span
class="na">process</span><span class="o">(</span><span
class="n">req</span><span class="o">,</span> <span class="n">resp</span><span
class="o">);</span>
-
- <span class="o">}</span> <span class="k">catch</span> <span
class="o">(</span><span class="n">RuntimeException</span> <span
class="n">e</span><span class="o">)</span> <span class="o">{</span>
- <span class="n">LOG</span><span class="o">.</span><span
class="na">error</span><span class="o">(</span><span class="s">"Server
Error ocurred in DemoServlet"</span><span class="o">,</span> <span
class="n">e</span><span class="o">);</span>
- <span class="k">throw</span> <span class="k">new</span> <span
class="nf">ServletException</span><span class="o">(</span><span
class="n">e</span><span class="o">);</span>
- <span class="o">}</span>
+<div class="codehilite"><pre><span class="kd">public</span> <span
class="kd">class</span> <span class="nc">DemoServlet</span> <span
class="kd">extends</span> <span class="n">HttpServlet</span> <span
class="o">{</span>
+
+ <span class="kd">private</span> <span class="kd">static</span> <span
class="kd">final</span> <span class="kt">long</span> <span
class="n">serialVersionUID</span> <span class="o">=</span> <span
class="mi">1L</span><span class="o">;</span>
+ <span class="kd">private</span> <span class="kd">static</span> <span
class="kd">final</span> <span class="n">Logger</span> <span
class="n">LOG</span> <span class="o">=</span> <span
class="n">LoggerFactory</span><span class="o">.</span><span
class="na">getLogger</span><span class="o">(</span><span
class="n">DemoServlet</span><span class="o">.</span><span
class="na">class</span><span class="o">);</span>
+
+ <span class="nd">@Override</span>
+ <span class="kd">protected</span> <span class="kt">void</span> <span
class="nf">service</span><span class="o">(</span><span class="kd">final</span>
<span class="n">HttpServletRequest</span> <span class="n">req</span><span
class="o">,</span> <span class="kd">final</span> <span
class="n">HttpServletResponse</span> <span class="n">resp</span><span
class="o">)</span> <span class="kd">throws</span> <span
class="n">ServletException</span><span class="o">,</span> <span
class="n">IOException</span> <span class="o">{</span>
+
+ <span class="k">try</span> <span class="o">{</span>
+ <span class="c1">// create odata handler and configure it with
EdmProvider and Processor</span>
+ <span class="n">OData</span> <span class="n">odata</span> <span
class="o">=</span> <span class="n">OData</span><span class="o">.</span><span
class="na">newInstance</span><span class="o">();</span>
+ <span class="n">ServiceMetadata</span> <span class="n">edm</span> <span
class="o">=</span> <span class="n">odata</span><span class="o">.</span><span
class="na">createServiceMetadata</span><span class="o">(</span><span
class="k">new</span> <span class="n">DemoEdmProvider</span><span
class="o">(),</span> <span class="k">new</span> <span
class="n">ArrayList</span><span class="o"><</span><span
class="n">EdmxReference</span><span class="o">>());</span>
+ <span class="n">ODataHttpHandler</span> <span class="n">handler</span>
<span class="o">=</span> <span class="n">odata</span><span
class="o">.</span><span class="na">createHandler</span><span
class="o">(</span><span class="n">edm</span><span class="o">);</span>
+ <span class="n">handler</span><span class="o">.</span><span
class="na">register</span><span class="o">(</span><span class="k">new</span>
<span class="n">DemoEntityCollectionProcessor</span><span class="o">());</span>
+
+ <span class="c1">// let the handler do the work</span>
+ <span class="n">handler</span><span class="o">.</span><span
class="na">process</span><span class="o">(</span><span
class="n">req</span><span class="o">,</span> <span class="n">resp</span><span
class="o">);</span>
+
+ <span class="o">}</span> <span class="k">catch</span> <span
class="o">(</span><span class="n">RuntimeException</span> <span
class="n">e</span><span class="o">)</span> <span class="o">{</span>
+ <span class="n">LOG</span><span class="o">.</span><span
class="na">error</span><span class="o">(</span><span class="s">"Server
Error occurred in ExampleServlet"</span><span class="o">,</span> <span
class="n">e</span><span class="o">);</span>
+ <span class="k">throw</span> <span class="k">new</span> <span
class="nf">ServletException</span><span class="o">(</span><span
class="n">e</span><span class="o">);</span>
<span class="o">}</span>
+ <span class="o">}</span>
<span class="o">}</span>
</pre></div>
@@ -902,14 +900,14 @@ Our first OData service is very simple;
<p><strong>Outlook</strong></p>
<p>Further topics to be covered by follow-up tutorials: </p>
<ul>
-<li>READ scenario: reading single entity, reading property </li>
-<li>WRITE scenario: executing POST, PUT, PATCH and DELETE requests </li>
-<li>Navigation: navigating from one entity to a corresponding second
entity</li>
-<li>Data types</li>
+<li>Tutorial OData V4 service part 2: <a
href="/doc/odata4/tutorials/readep/tutorial_readep.html">Read Entity, Read
Property (this page)</a> | <a
href="/doc/odata4/tutorials/readep/sample/DemoService_Tutorial_Readep.zip">sample
project zip</a> </li>
+<li>Tutorial OData V4 service part 3: <a
href="/doc/odata4/tutorials/write/tutorial_write.html">Write (Create, Update,
Delete Entity)</a> | <a
href="/doc/odata4/tutorials/write/sample/DemoService_Tutorial_Write.zip">sample
project zip</a> </li>
+<li>Work in progress: Tutorial OData V4 service part 4: <a
href="/doc/odata4/index.html">Navigation</a> | <a
href="/doc/odata4/index.html">sample project zip</a> </li>
+<li>Work in progress: Tutorial OData V4 service part 5: <a
href="/doc/odata4/index.html">System Query Options</a> | <a
href="/doc/odata4/index.html">sample project zip</a> </li>
</ul>
<p><strong>Further reading</strong></p>
<p>OData specification: <a href="http://odata.org/">http://odata.org/</a><br />
-Olingo Javadoc: <a
href="http://olingo.apache.org/javadoc/odata4/index.html">http://olingo.apache.org/javadoc/odata4/index.html</a></p><div
align="center">
+Olingo Javadoc: <a
href="/javadoc/odata4/index.html">http://olingo.apache.org/javadoc/odata4/index.html</a></p><div
align="center">
<p>Copyright © 2013-2015, The Apache Software Foundation<br>
Apache Olingo, Olingo, Apache,
the Apache feather, and
the Apache Olingo project logo are trademarks
of the Apache Software