tag:blogger.com,1999:blog-38845839999717247462024-03-13T16:45:06.714+01:00Practical experience on Oracle productsWebLogic, ADF, Mobile, JET, SOA, WebCenter, JDeveloper, Oracle CloudAnonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.comBlogger89125tag:blogger.com,1999:blog-3884583999971724746.post-62402393575218122862017-07-16T14:36:00.003+02:002017-07-16T14:36:32.688+02:00Change, Move onAs you might noticed there was no update on this blog for more then 7 month. If you like to continue reading more about my experiences in tech please check out and if you like subscribe to the following blog: <a href="https://medium.com/enpit-developer-blog">https://medium.com/enpit-developer-blog</a><br />
<br />
Further I would like to inform you that I moved to Alumni Status in the <a href="http://www.oracle.com/technetwork/community/oracle-ace/index.html" target="_blank">Oracle ACE Program</a>. All the best to the ACE program and thanks for all the support during that time!<br />
<br />
This decision won't influence what I'll do in the future - I am still in tech and will publish about interesting content whether it is about Oracle Tech, UX, Java, Spring, AWS, Node.js, Blockchain, Ethereum, Machine Learning, Agile, Design Sprint and whatever else will be fun 🤓<br />
<div>
<br /></div>
<div>
Looking forward to welcome you as a new follower 😀</div>
<div>
<br /></div>
<div>
Andreas</div>
<div>
<a href="https://medium.com/enpit-developer-blog">https://medium.com/enpit-developer-blog</a> </div>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-5522112426793609832016-11-28T22:39:00.001+01:002016-11-28T22:39:13.073+01:00Oracle Container Cloud Service (OCCS) - Overview and first impressionsCheckout my new post on <a href="https://medium.com/enpit-developer-blog/oracle-container-cloud-service-overview-and-first-impressions-b42bd2ac308#.iohzwtrgh" target="_blank">Oracle Container Cloud Service</a>!<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-79551102797923591712016-10-11T16:15:00.000+02:002016-10-11T16:15:00.761+02:00OTN Appreciation Day: Alta UIToday it is time to say "Thank you" to the <a href="http://otn.oracle.com/" target="_blank">Oracle Technology Network (OTN)</a> for keeping up one of the worlds greatest developer community.<br />
<br />
One cool thing within the Oracle Development ecosystem I really like is the availability of an technology agnostic Design Guide, including Style, Patterns, Cookbook, etc. called <a href="http://altaui.com/" target="_blank">ALTA UI</a>. Besides containing best practices for designing great User Experiences it allows to introduce new technologies under the covers. The user does not notice if something is build in ADF, JET, MAF or technology X which implements the Alta UI Patterns.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI4DhwLSNgOBpOVV9mjeRemQXdG-6W6jQF3lExHoHUo9vP-T6HC-iortcMURWhDhmWa-ksNgLk1RODf-syZ0GJ24dAaEUbXSLOD4sjsZXP2MDVtCyE9973rfWIk-nAeZFWO2BE_d6eMg/s1600/Bildschirmfoto+2016-10-10+um+23.46.44.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI4DhwLSNgOBpOVV9mjeRemQXdG-6W6jQF3lExHoHUo9vP-T6HC-iortcMURWhDhmWa-ksNgLk1RODf-syZ0GJ24dAaEUbXSLOD4sjsZXP2MDVtCyE9973rfWIk-nAeZFWO2BE_d6eMg/s640/Bildschirmfoto+2016-10-10+um+23.46.44.png" width="640" /></a></div>
<span style="font-size: x-small;">Source: altaui.com</span><br />
<br />
<a href="http://www.oracle.com/webfolder/ux/middleware/alta/featuredDemos.html" target="_blank">Checkout some of the featured Alta UI Demos</a>.<br />
<br />
<a href="http://altaui.com/" target="_blank">Checkout Alta UI Design Pattern Library</a>.<br />
<br />
#ThanksOTNAnonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-41419018606611797692016-08-22T23:13:00.005+02:002016-08-22T23:13:59.531+02:00Oracle JET 2.1.0 released - for web and hybrid mobil app developmentToday Oracle released the new Version of Oracle JET - JavaScript Extension Toolkit for developing client-side web apps and hybrid mobile apps.<br />
<br />
The new Cookbook looks awesome.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.oracle.com/webfolder/technetwork/jet/jetCookbook.html" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img alt=" Oracle JET Cookbook" border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0PX-aWW9t8pQLDUNjJTbxUT15S42-dhd-jP0ObLWNQ7d4sHdG4nytJ7elNbY1ykfHYoGAvuRyEgpT9fadWRKG8ZPg1iI0k_OnURVseuzPePuvRDNRE_RlOxNqyMOq-KPtWYeYaERNsA/s640/Bildschirmfoto+2016-08-22+um+23.06.32.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
The Oracle JET Theme Builder also looks pretty impressive<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.oracle.com/webfolder/technetwork/jet/public_samples/JET-Theme-Builder/public_html/index.html" target="_blank"><img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXAhQqPsC-al80XvhcxOTHza4VuOlQAMPT6d1EcZMOS93LoJ49_QiGNzu4u9NQ_KzW6yEiKhl4u7f6qxkz3_Rakbs1WeaA0wXh0BEqMoFvOTzrY-ZcVUuZ10YQ9-Afecb-5CTIgcdDsQ/s640/Bildschirmfoto+2016-08-22+um+23.13.55.png" width="640" /></a></div>
<br />
<br />
Check out the updated documentation<br />
<br />
<ul>
<li><a href="http://www.oracle.com/webfolder/technetwork/jet/releaseNotes.html" target="_blank">Oracle JET 2.1.0 Release Notes</a></li>
<li><a href="http://www.oracle.com/webfolder/technetwork/jet/jetCookbook.html" target="_blank">Oracle JET 2.1.0 Cookbook</a></li>
<li><a href="https://docs.oracle.com/middleware/jet210/jet/developer/toc.htm" target="_blank">Oracle JET 2.1.0 Development Guide</a></li>
<li><a href="https://github.com/oracle/oraclejet" target="_blank">Oracle JET 2.1.0 Sourcecode</a> </li>
<li><a href="http://www.oracle.com/webfolder/technetwork/jet/public_samples/JET-Theme-Builder/public_html/index.html" target="_blank">Oracle JET 2.1.0 Theme Builder (Oracle StyleLab)</a></li>
</ul>
<div>
<br /></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-41447378074228752072016-08-20T18:14:00.003+02:002016-08-22T22:42:47.835+02:00Walkthrough Oracle Application Builder Cloud Service - Create Table based on ADF BC REST ServiceOracle is making great progress in the Cloud. One of the recently released Cloud Services is the <a href="http://cloud.oracle.com/ApplicationBuilder" target="_blank">Application Builder Cloud Service (short: ABCS)</a>.<br />
<br />
In this post I want to share my first impression in using ABCS for building modern web applications - responsive and optimized for mobile. For the backend I am using an exposed <a href="http://multikoop.blogspot.de/2016/02/adf-spotlight-rest-in-adf-1221.html" target="_blank">REST Service through ADF Business Components</a>.<br />
<br />
<h3>
Prerequisites</h3>
You have created a new ABCS application.<br />
<h3>
Start with creating Business Objects on REST Resources</h3>
First open the <b>Data Designer</b> from the Hamburger-Menu. Choose <b>New Business Object > Select from external service</b>. The following Wizard shows up<br />
<span id="goog_735896360"></span><span id="goog_735896361"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-UpGNM50hmyA8SzROzOwLV1-HavTJ1wSIWb8fD4BfXDBR4YRQ4mdr5w8kTd4uz4KDka9-zYbAusIZGpG7c7bT96_s_pZRue0Frdi9q8thLQfMZomGQrSTiGwZft0F3mNGiIl2AgbFYQ/s1600/abcs1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="299" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-UpGNM50hmyA8SzROzOwLV1-HavTJ1wSIWb8fD4BfXDBR4YRQ4mdr5w8kTd4uz4KDka9-zYbAusIZGpG7c7bT96_s_pZRue0Frdi9q8thLQfMZomGQrSTiGwZft0F3mNGiIl2AgbFYQ/s640/abcs1.png" width="640" /></a></div>
<br />
Choose "<b>Add Custom Services</b>" and provide details to your REST resource. In this case a URL to the ADF REST Services descriptor is expected.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2uMYAwTujRbsfwUDz0bTSvGqunLeKzxsYJVYFyB1pjGHVj1Qjnk07_vvjWHLqVjo1K5t10CTOb9aE5E77P5xWO8BDYPu-Es6sOoTe5eWMlwphVHGw2Cg5uoHCZEC-ALAwtSESODLWaQ/s1600/abcs2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2uMYAwTujRbsfwUDz0bTSvGqunLeKzxsYJVYFyB1pjGHVj1Qjnk07_vvjWHLqVjo1K5t10CTOb9aE5E77P5xWO8BDYPu-Es6sOoTe5eWMlwphVHGw2Cg5uoHCZEC-ALAwtSESODLWaQ/s400/abcs2.png" width="347" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
(For Authentication there are the following options: None, Basic, Oracle Cloud Account)</div>
<div class="separator" style="clear: both; text-align: left;">
After submitting the form the REST service will be parsed. The containing resources are being shown in the next wizard step.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuBNgcvBiOmGG5X1cl16jovd3l0SrVFw5bzmD1t89phhM8p82HSjGUkNdOArvnPYPX-kXxHhb9mbuz9fLeY74mzXji65LuaKG5ftEsHzDt31rfGwlpcLKaLfY3sUCAUkv0Q1-UGXZrMg/s1600/abcs3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuBNgcvBiOmGG5X1cl16jovd3l0SrVFw5bzmD1t89phhM8p82HSjGUkNdOArvnPYPX-kXxHhb9mbuz9fLeY74mzXji65LuaKG5ftEsHzDt31rfGwlpcLKaLfY3sUCAUkv0Q1-UGXZrMg/s640/abcs3.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Select the "employee" resource and go to the next step to fine tune the naming, paths and child resources if available.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPPLgpMrKo0370GToUKobeNPsZejh-Zu_2pQmamF2U2rkF6BhTb7jaZ2KXCNOl0Cudf_GJuc5COzRK3DCW4HinEpuLuoX_ETvH0oalq27lQYwyqHXLU1bEWlt4fc5P7h8fzJP0TKPkDg/s1600/abcs4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="274" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPPLgpMrKo0370GToUKobeNPsZejh-Zu_2pQmamF2U2rkF6BhTb7jaZ2KXCNOl0Cudf_GJuc5COzRK3DCW4HinEpuLuoX_ETvH0oalq27lQYwyqHXLU1bEWlt4fc5P7h8fzJP0TKPkDg/s640/abcs4.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Go to the next screen to define so called <b>Business Objects</b>. That means choose/define just the specific attributes from the REST Resource you want to use in your app. (kind of similiar to creating ADF Business components from Database table). For the chosen fields you can further adjust data types or define defaults for the UI, e.g. Label Name. (compared to ADF these are "UI hints")<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSI973ULfo1dCBnNo5PRvd6ENHtAcW8VukRPu7M8aakpbMXVqPcniohr_fG5ypeWmxnFqbfTtoAa-LYw1aUuKdwRxZ0pvNT6fawYGDp2AI0G7BNsOd1T1XvgEsAFE_0KkxPdkDxBP7Ag/s1600/abcs5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSI973ULfo1dCBnNo5PRvd6ENHtAcW8VukRPu7M8aakpbMXVqPcniohr_fG5ypeWmxnFqbfTtoAa-LYw1aUuKdwRxZ0pvNT6fawYGDp2AI0G7BNsOd1T1XvgEsAFE_0KkxPdkDxBP7Ag/s640/abcs5.png" width="640" /></a></div>
<br />
Finishing this last step the Business Object(s) are all setup to start building the UI.<br />
<br />
<h3>
Create table from Business Object</h3>
<div>
From the <b>Data Designer</b> switch to the <b>Page Designer</b>. (I am assuming here a page employees is already created).</div>
<div>
<br /></div>
<div>
Select <b>Table</b> from the <b>Components</b> Palette and <b>Drag And Drop</b> on the Page canvas. On the right side the <b>Table Creation</b> starts. Choose <i>Employee</i> <b>Business Object</b>. </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilYAB9kwGB6ZZbet4o4jCEwBwxEvQJZAo-1yx9ta1kzpknOtM4dVxncJszXfAHHGb6fjo2uPLxxLgXFd0MUcpPbeiODDhuFKK49rjeWtKEwOK0qTr_yEpVNbHGZPLU2bL3iM7mOVXUBw/s1600/abcs6.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilYAB9kwGB6ZZbet4o4jCEwBwxEvQJZAo-1yx9ta1kzpknOtM4dVxncJszXfAHHGb6fjo2uPLxxLgXFd0MUcpPbeiODDhuFKK49rjeWtKEwOK0qTr_yEpVNbHGZPLU2bL3iM7mOVXUBw/s640/abcs6.png" width="640" /></a></div>
<br />
In the next step (<b>Mapping</b>) select <b>fields</b> you want to be used for the Table <b>Columns</b>. This is done by DnD from <b>Available</b> to <b>Selected</b> Pane.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjutSIORN0QCUTIhakMqlJKMStTVbT40zZYMupPVApRnrsxg3bVq2GaHMg7a_JiwDTX3Nu9yHncr-fIFJBZIa2u2sBgLisrvAmf98MTpYgU16S4K5JTFAq7nlZjxJk1qxzTO3V98RnGcA/s1600/abcs7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjutSIORN0QCUTIhakMqlJKMStTVbT40zZYMupPVApRnrsxg3bVq2GaHMg7a_JiwDTX3Nu9yHncr-fIFJBZIa2u2sBgLisrvAmf98MTpYgU16S4K5JTFAq7nlZjxJk1qxzTO3V98RnGcA/s640/abcs7.png" width="640" /></a></div>
<br />
The table will be readonly. With just some configuration options like 'Create on/off', Edit 'on/off', Edit Screen Title, 'Delete on/off' etc. you can let ABCS generate corresponding actions and Screens. The is a great feature for many typical use cases!<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwnYfwtETQ3o-vrz_7NkLPB25Y4NVjyxAdc94FFut-v1JuC_6Dg7u_3E2soaBIqQS9D_6DjxzD7-ijtd0GTSU-mNFiSKmVwuDFniLxf4KF2DGhpETI87_zEzrl1Z8S78EJI3kGwlR0ug/s1600/abcs8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="326" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwnYfwtETQ3o-vrz_7NkLPB25Y4NVjyxAdc94FFut-v1JuC_6Dg7u_3E2soaBIqQS9D_6DjxzD7-ijtd0GTSU-mNFiSKmVwuDFniLxf4KF2DGhpETI87_zEzrl1Z8S78EJI3kGwlR0ug/s640/abcs8.png" width="640" /></a></div>
<br />
On the last wizard step you might want to configure <b>Filtering, Sorting</b> and further options like table summary for accessiblity.<br />
<br />
<h3>
Generated Edit form</h3>
As mentioned before when selecting to create the "Edit Action" ABCS generates the Edit form for you that you can further fine tune in terms of required fields, label positions, etc.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_G1L86q7ijrildhSKvRWJIdvIeyzby42sED2eUDwGfd7c_Vmh9yxM5BFvZafK8WgF7TmtUmiA0o6cEhonLatXE3xYL0E49aqeasYs5IxGxKrLuYEt-sgQuVHG5vdf65lbk0z0VFEZzQ/s1600/abcs10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_G1L86q7ijrildhSKvRWJIdvIeyzby42sED2eUDwGfd7c_Vmh9yxM5BFvZafK8WgF7TmtUmiA0o6cEhonLatXE3xYL0E49aqeasYs5IxGxKrLuYEt-sgQuVHG5vdf65lbk0z0VFEZzQ/s640/abcs10.png" width="640" /></a></div>
<br />
<h3>
Conclusion</h3>
Oracle Application Builder Cloud Service feels like ADF for the cloud era. Having APIs as your backend (not coercively a DB) you model Business Objects which are the basis to wire the desired UI components.<br />
<br />
The development experience is very smooth for basic UI development. For more advanced UI Logic custom JavaScript is needed. For reusable components <a href="http://www.enpit.de/jet" target="_blank">Oracle JET</a> (<a href="http://multikoop.blogspot.de/2015/10/oracle-jet-is-here-for-javascript-lovers.html" target="_blank">see blogpost</a>) comes into play. All you need is a browser.<br />
<br />
The resulting applications are being deployed with a push of a button on Test and Production Cloud Environments. Awesome!<br />
<br />
<h3>
Get Connected with the Community (Oracle JET and ABCS)</h3>
Be part of the <a href="https://community.oracle.com/community/cloud_computing/platform-as-a-service-paas/oracle-application-builder-cloud-service" target="_blank">ABCS Community</a> and follow the <a href="https://www.youtube.com/channel/UCFMTiIZAE6f3Ib91sY6Ms3g" target="_blank">ABCS Youtube Channel</a>. Go to <a href="https://cloud.oracle.com/ApplicationBuilder">https://cloud.oracle.com/ApplicationBuilder</a> for a trial account to get started.<br />
<br />
<h3>
Further Information</h3>
<ul>
<li><a href="https://youtu.be/R_TwOj27EJg?t=12m22s" target="_blank">Demo by enpit: Entwicklung mit Application Builder Cloud Service (ABCS) (aus ADF Spotlight Websession)</a></li>
<li><a href="http://oracle%20application%20builder%20cloud%20service%20%28abcs%29%20home/" target="_blank">Oracle Application Builder Cloud Service (ABCS) Home</a></li>
<li><a href="https://www.youtube.com/channel/UCFMTiIZAE6f3Ib91sY6Ms3g" target="_blank">Oracle Application Builder Cloud Service (ABCS) YouTube Channel</a></li>
<li><a href="https://community.oracle.com/community/cloud_computing/platform-as-a-service-paas/oracle-application-builder-cloud-service" target="_blank">Oracle Application Builder Cloud Service (ABCS) Community Forum</a></li>
<li><a href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/appbuilder/GettingStarted/GettingStarted.html" target="_blank">Oracle Application Builder Cloud Service (ABCS) Tutorial 1 (Getting Started)</a></li>
<li><a href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/appbuilder/EditingApplication/EditingApplication.html" target="_blank">Oracle Application Builder Cloud Service (ABCS) Tutorial 2 (Editing Applications)</a></li>
<li><a href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/appbuilder/StagingPublishing/StagingPublishing.html" target="_blank">Oracle Application Builder Cloud Service (ABCS) Tutorial 3 (Staging und Publishing)</a></li>
</ul>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com2tag:blogger.com,1999:blog-3884583999971724746.post-33068126752599554012016-03-28T21:59:00.002+02:002016-04-07T14:21:34.667+02:00Running Node.JS Apps and "Fat-JAR" Apps on Application Container Cloud Service<br />
With the trend of container technologies going on it is great to see Oracle is providing the so called <a href="https://cloud.oracle.com/en_US/acc" target="_blank">Application Container Cloud Service</a>. Its current architecture is based on Docker and allows to run Java SE and Node.js applications in its current version. See the the following diagram<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5GmIV9L4O0ffE9q03LQVK7okEYIkTnjWra23W8Pi4rQdwX1LTzxKuuRPSTsSpcq3VwHzs32ik-GRNp7jqqAB0L7QaQ-awMqdJ4-rkjSiUZ83KHmJ-g6fuTCLFmv_dPykBLU7rznASoA/s1600/5B60A060-B20D-4E6D-8ED3-F110EB5C60C2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="441" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5GmIV9L4O0ffE9q03LQVK7okEYIkTnjWra23W8Pi4rQdwX1LTzxKuuRPSTsSpcq3VwHzs32ik-GRNp7jqqAB0L7QaQ-awMqdJ4-rkjSiUZ83KHmJ-g6fuTCLFmv_dPykBLU7rznASoA/s640/5B60A060-B20D-4E6D-8ED3-F110EB5C60C2.png" width="640" /></a></div>
<br />
<div>
The Load Balancing, dockerizing and scaling is fully transparent. From developer perspective you are deploying a ZIP containing a <span style="font-family: "courier new" , "courier" , monospace;">manifest.json</span> with a <span style="font-family: "courier new" , "courier" , monospace;">command</span> property that states what should be executed once the deployment has been installed on the specific container.<br />
<br />
In the following figure you see the overview screen of Application Container Cloud service (ACC).<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBcqlnLDfbSy3HLkC9PMANFev1dfr-EuJyytaox0lkFR83kuO-yaWgcKF7D_6QO80Ac-xEjmooP-8Pae7LJLXT43ozP-vtfGr4oCM6fHe94EcpfoCg_eyV-WlqEcoPBkU7n1RNhtV_KQ/s1600/1290961D-8D27-41C1-8C0B-368F57006E72.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="408" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBcqlnLDfbSy3HLkC9PMANFev1dfr-EuJyytaox0lkFR83kuO-yaWgcKF7D_6QO80Ac-xEjmooP-8Pae7LJLXT43ozP-vtfGr4oCM6fHe94EcpfoCg_eyV-WlqEcoPBkU7n1RNhtV_KQ/s640/1290961D-8D27-41C1-8C0B-368F57006E72.png" width="640" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
Next lets create an app and deploy it to ACC. For Java SE lets see how that <span style="font-family: "courier new" , "courier" , monospace;">manifest.json</span> looks like</div>
<div>
<br /></div>
<div>
<b>Java SE App</b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsQIOtv103S9fnGYKzuv1v6jq-Az4sryvUjJFRXgCyt7eVgpaBXfT8Bpi9Oj6bsIzIqKqI4lHi_ae3VEv09TgPI66naM7BMWbMTa9v728Q6QujOH0vmYpRkxwpSYOr2VXWB29Y6Xz3JA/s1600/C906F05F-E0FF-457F-8323-E52E1558F33C.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsQIOtv103S9fnGYKzuv1v6jq-Az4sryvUjJFRXgCyt7eVgpaBXfT8Bpi9Oj6bsIzIqKqI4lHi_ae3VEv09TgPI66naM7BMWbMTa9v728Q6QujOH0vmYpRkxwpSYOr2VXWB29Y6Xz3JA/s640/C906F05F-E0FF-457F-8323-E52E1558F33C.png" width="640" /></a></div>
<div>
<br />
The important properties are <span style="font-family: "courier new" , "courier" , monospace;">runtime / majorVersion</span> and <span style="font-family: "courier new" , "courier" , monospace;">command</span>. It states that the deployment needs Java 8. The application is started with the given "java -jar ..." command. Currently two working samples are provided, one works with embedded Tomcat the other works with Grizzly Http Server. Here is how a typical Main.java class would look like<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh49tAzFuesAUuFfMT8CKty1qyc8RXjStHGST7H7OCDItYCAXmBxU39e5T5Pfgeel1Rkbc0ElExE8jR8p9EivwnkS5bpFW60TCvW7i8-9k83EXR6qBJiv7Xy9pitTAJq6CKwO1-YqTsHg/s1600/26BD5AD9-F46A-44E6-B691-922D7A57AB11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="363" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh49tAzFuesAUuFfMT8CKty1qyc8RXjStHGST7H7OCDItYCAXmBxU39e5T5Pfgeel1Rkbc0ElExE8jR8p9EivwnkS5bpFW60TCvW7i8-9k83EXR6qBJiv7Xy9pitTAJq6CKwO1-YqTsHg/s640/26BD5AD9-F46A-44E6-B691-922D7A57AB11.png" width="640" /></a></div>
<br /></div>
<div>
The PORT and HOSTNAME are given from the environment. So it is in control of the application container cloud service.<br />
<br />
<b>Node.js App</b><br />
For a Node.js app that <span style="font-family: "courier new" , "courier" , monospace;">manifest.json</span> looks like<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfb453xmcVtUFZBBcFkajTaMYfJF5PYtkrMvocMKUpV5U_aXv9Za099BVsOVqPlkQVtdsxkgbFBiqvhHAihrH9rN5eVwmF7ciFYkrT1y26x5G0ZxaSwnt8GZfcPzGCIxq9OcJLrESVsQ/s1600/1A742480-6CDB-48AD-8676-1A4334115095.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfb453xmcVtUFZBBcFkajTaMYfJF5PYtkrMvocMKUpV5U_aXv9Za099BVsOVqPlkQVtdsxkgbFBiqvhHAihrH9rN5eVwmF7ciFYkrT1y26x5G0ZxaSwnt8GZfcPzGCIxq9OcJLrESVsQ/s320/1A742480-6CDB-48AD-8676-1A4334115095.png" width="320" /></a></div>
<br /></div>
<div>
It expects a file <span style="font-family: "courier new" , "courier" , monospace;">server.js</span> as the main entry point. There is an <a href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/apaas/node-basicRest/nodecloud-REST.html" target="_blank">official Node.js sample application (together with a Tutorial)</a>. In my example I am going to create a connection to Oracle Database Cloud Service (via oracle nodedb driver) and expose DEPARTMENTS as a read online REST Resource.<br />
<br />
The most interesting part here is how to retrieve the CONNECT String to the Database.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge7-E33UNHV3nLBJ5KWFBAezAMeg6ANGilDdPANTZznVNvnMuCu0zC1z8dUPqPFCpnql3IDtgOrxwU3VuQxOXHNKDPRGRprTzq-XpRVdJWTl-d-86ESpFiYIqODEiHbtV2JgAwYz_pzQ/s1600/9A2A0BD2-DE0E-4091-84D8-7DA3832E5E7E.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge7-E33UNHV3nLBJ5KWFBAezAMeg6ANGilDdPANTZznVNvnMuCu0zC1z8dUPqPFCpnql3IDtgOrxwU3VuQxOXHNKDPRGRprTzq-XpRVdJWTl-d-86ESpFiYIqODEiHbtV2JgAwYz_pzQ/s640/9A2A0BD2-DE0E-4091-84D8-7DA3832E5E7E.png" width="640" /></a></div>
<br />
For testing on local machine defaults are used. Once deployed the CONNECT String is given as an environment property (beyond PORT, USER, etc).<br />
<br />
Hint: All the JavaScript modules except native add-ons like node-oracledb should be included in the ZIP bundle.<br />
<br />
<b>Deployment</b><br />
The deployment is quite straightforward from the ACC UI using the "upload application archive" option. Further you can provide initial values for number of "Instances" and Memory.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmmlG1bNWwepLpSGzX3mpxbrADYJvJiriVDoIQ8QvP6uYtTNO9egq7B453AfqRGGExBFKZesmtUY8_5-zgLMO6ynBlV2AuoLLU5BSL-jFAWRR5j2weDknxRZ75131SvFX7srpyWDII8A/s1600/C648DAB3-CD27-4B34-B1EE-AA9416CFE1F5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmmlG1bNWwepLpSGzX3mpxbrADYJvJiriVDoIQ8QvP6uYtTNO9egq7B453AfqRGGExBFKZesmtUY8_5-zgLMO6ynBlV2AuoLLU5BSL-jFAWRR5j2weDknxRZ75131SvFX7srpyWDII8A/s400/C648DAB3-CD27-4B34-B1EE-AA9416CFE1F5.png" width="376" /></a></div>
<br />
After about 5 min. the application is available through the Load balancer. For automated deployment a <a href="http://docs.oracle.com/cloud/latest/apaas_gs/APCSR/" target="_blank">REST API exists</a>.<br />
<br />
To connect to other cloud services a service binding needs to be created first. The service binding creates environment variables that are available to every application instance.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxwrmB3MUhJ7BLRzmQZvSg689axPd46bCnjbNm2rKekXl3td8JhZCTAyCwXVGItAwL8QrAZmFlr1zTVT87WigYbeTiyZvksNLM-_Z306KSEPsyV1wSUEyl60Rhmj-TWYuZCQz9nRkUVw/s1600/5EC9FE7F-C19A-4C51-B1AF-72BA518BDFD8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="433" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxwrmB3MUhJ7BLRzmQZvSg689axPd46bCnjbNm2rKekXl3td8JhZCTAyCwXVGItAwL8QrAZmFlr1zTVT87WigYbeTiyZvksNLM-_Z306KSEPsyV1wSUEyl60Rhmj-TWYuZCQz9nRkUVw/s640/5EC9FE7F-C19A-4C51-B1AF-72BA518BDFD8.png" width="640" /></a></div>
<br />
Custom environment variables can be created. For example the schema user / password you want to connect with. Unfortunately just clear text values are accepted at the moment. Would be great to have a "secret type" for passwords. Further # characters are not allowed (although my schema name is c##hr ;) ). Anyway it is no major show stopper.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBk7OibvpkwLULLXcjLEj4TZxCoootFgB_rH-P7ECWYoLSBx_U7V65CG34ZDs9jN0937aQAmLGU5wWviIVrN0kt9eCYNwirzjC8Vcu0uhV4GwojWTCVgfsz5f1XyrB1xKuFiN1hjIPog/s1600/A6152E88-DB30-4861-BEE3-72CCA05427E6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBk7OibvpkwLULLXcjLEj4TZxCoootFgB_rH-P7ECWYoLSBx_U7V65CG34ZDs9jN0937aQAmLGU5wWviIVrN0kt9eCYNwirzjC8Vcu0uhV4GwojWTCVgfsz5f1XyrB1xKuFiN1hjIPog/s400/A6152E88-DB30-4861-BEE3-72CCA05427E6.png" width="400" /></a></div>
<br />
See the sample service running in Postman<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCttM7E_CEoA7gwesklUJjyfpFYbZgTPmXNc784EP5l4HiscPECawLA3npM7AQ2s_BM9AcRpvxDzqablX0Xxgj9rHeKAlJdU1CbKdh17UJK6HXsNkoSKD2q1patxJgyWo_qvJEYI5SIw/s1600/A6114456-C75E-451E-B916-93DAC96A1E5D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="339" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCttM7E_CEoA7gwesklUJjyfpFYbZgTPmXNc784EP5l4HiscPECawLA3npM7AQ2s_BM9AcRpvxDzqablX0Xxgj9rHeKAlJdU1CbKdh17UJK6HXsNkoSKD2q1patxJgyWo_qvJEYI5SIw/s640/A6114456-C75E-451E-B916-93DAC96A1E5D.png" width="640" /></a></div>
<br />
<br />
<b>Logging / Diagnostics</b><br />
Logs are stored on the Oracle Storage Cloud Service as a zip file. To look into the log files you have to download those ZIP files on your local disc first<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFtnhofLgB1daqP7BrNs6OCFNs1dH0qKIYeps2hNBOAW3QMfCB5AegPKdMaO6AvNF3KuE64ngkXzWm4dP5I8V3YflfPPq_64kRYksxSABKgOKHRsW180V4rWU2Du4qocAX2tbkQukQUw/s1600/AEAD8AAC-DFA3-4881-8020-91B9EE8DDFE2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFtnhofLgB1daqP7BrNs6OCFNs1dH0qKIYeps2hNBOAW3QMfCB5AegPKdMaO6AvNF3KuE64ngkXzWm4dP5I8V3YflfPPq_64kRYksxSABKgOKHRsW180V4rWU2Du4qocAX2tbkQukQUw/s640/AEAD8AAC-DFA3-4881-8020-91B9EE8DDFE2.png" width="640" /></a></div>
<br />
For Java SE Apps a <a href="https://docs.oracle.com/cloud/latest/apaas_gs/DVCJV/GUID-70D59FA2-04D3-40B1-8F8E-8131300E25C7.htm#DVCJV-GUID-70D59FA2-04D3-40B1-8F8E-8131300E25C7" target="_blank">Flight Recording</a> is possible.<br />
<br /></div>
<div>
<b>Summary</b><br />
<br />
The first public release of ACC looks quite promising. For the next versions my wishlist would contain<br />
- Online Log Viewer<br />
- Monitoring RAM / CPU Usage / Requests online<br />
- Automatic Scaling<br />
- Service discovery<br />
- Security ?<br />
- Adding environment variables of type "secret". (Currently you can only provide variables in clear text)<br />
- Packaging improvements, maybe some mvn acc:install or CLI Tooling<br />
<br />
<br />
Looking forward to new features in the future versions. There is potential for a modern microservice platform.<br />
<br />
<b>Samples Code</b><br />
Explore the Node.JS sample code on <a href="https://github.com/enpit/enpit.sample.acc-node-hrapi">https://github.com/enpit/enpit.sample.acc-node-hrapi</a><br />
The <a href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/griz_jersey_intro/files/jersey-service.zip" target="_blank">Java SE jersey based code</a> is available from Oracle.<br />
<br /></div>
<h3>
Further Information</h3>
<ul>
<li><a href="http://docs.oracle.com/cloud/latest/apaas_gs/index.html" target="_blank">Get Started with Application Container Cloud Service (ACC)</a></li>
<li><a href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/apaas/acc-getting-started/welcome.html#overview" target="_blank">Tutorial: Getting started with Application Container Cloud Service</a></li>
<li><a href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/apaas/acc-getting-started/files/employees-web-app.zip" target="_blank">Sample embedded Tomcat webapp</a></li>
<li><a href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/apaas/node-basicRest/nodecloud-REST.html" target="_blank">Tutorial for Node.js app</a></li>
<li><a href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/griz_jersey_intro/Grizzly-Jersey-Intro.html" target="_blank">Tutorial for Java SE App</a></li>
<li><a href="http://docs.oracle.com/cloud/latest/apaas_gs/APCSR/" target="_blank">REST API for Oracle Application Container Cloud</a></li>
<li><a href="https://github.com/oracle/node-oracledb" target="_blank">Node OracleDB Driver</a></li>
<li><a href="https://blogs.oracle.com/opal/entry/node_in_the_cloud_oracle" target="_blank">Node in the Oracle Cloud</a></li>
</ul>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-43012900081820192732016-02-09T00:23:00.003+01:002016-02-09T00:25:08.430+01:00ADF Spotlight: REST in ADF 12.2.1In the recent ADF Spotlight Webconference I have given a presentation and live demo on some of the new REST features in ADF 12.2.1. The recording (in german) is on youtube: <a href="https://www.youtube.com/watch?v=SmrINlqVNPs">https://www.youtube.com/watch?v=SmrINlqVNPs</a><br />
<br />
The new REST features (to create REST resources) are implemented on top of Application Module (WebServices > REST). Here you can choose a Root View Instance, assign it to a release version and further configure the defined REST resource in a new Overview Editor.<br />
<br />
Following summarizes some of the new REST features in ADF:<br />
<h3>
Resource Versioning</h3>
Versioning is the first thing need to be configured before you can start creating REST resources. It is supported at the level of the adf-config.xml file. Here you can define different versions. Each version can be configured as <b>active</b>, <b>deprecated</b> or <b>desupported</b>. To keep things simple I recommend to use same name for internal and release name.<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ8Oczawkp1FLmrMJhR9uSxS1yjxIN0oOdZ0XGJqLcY0xwzEGllF41bbO3JrCMUoUNrdERMoYo6xJB4H3tuiD5AVm0eMoINgPzdzVLaGTh_Uql1MOUEExAfsLkauz2GCG7Y0ZK7K89kg/s1600/adfrest01.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ8Oczawkp1FLmrMJhR9uSxS1yjxIN0oOdZ0XGJqLcY0xwzEGllF41bbO3JrCMUoUNrdERMoYo6xJB4H3tuiD5AVm0eMoINgPzdzVLaGTh_Uql1MOUEExAfsLkauz2GCG7Y0ZK7K89kg/s640/adfrest01.png" width="640" /></a></div>
<br />
<br />
Versions marked as <b>desupported</b> will reply with HTTP 500 and corresponding message. They will not serve any REST Data.<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXvYFEOMJXLDG2S56zU1oBagD3dRAhjpqpQxgAqaL94tDYuY5R_P_J_ODqEy9M0TvYKUgJUyD51jZMH8kDx8jVjIijUQah9ZXLwJtUttEFBnphJv7rf4iKdcGFmlzOHhMQuyYHokyWNQ/s1600/adfrest03.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXvYFEOMJXLDG2S56zU1oBagD3dRAhjpqpQxgAqaL94tDYuY5R_P_J_ODqEy9M0TvYKUgJUyD51jZMH8kDx8jVjIijUQah9ZXLwJtUttEFBnphJv7rf4iKdcGFmlzOHhMQuyYHokyWNQ/s640/adfrest03.png" width="640" /></a></div>
<br />
<br />
Versions marked as <b>deprecated</b> will work. If you invoke the URL for v2 metadata you will get information that there is a successor-version:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8EwojhtxW91sRVtK0LgetLY2TcqatUO_nDpSMjpGF_06qTn9de3UVAz18fAmaME0GpM11hzh44pkgADVEAlQtSOL2kUm8uAx_IKN-VkDm4E13O5nknJeLnn6MVgUpmx3CPSivx_-PCg/s1600/adfrest02.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="452" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8EwojhtxW91sRVtK0LgetLY2TcqatUO_nDpSMjpGF_06qTn9de3UVAz18fAmaME0GpM11hzh44pkgADVEAlQtSOL2kUm8uAx_IKN-VkDm4E13O5nknJeLnn6MVgUpmx3CPSivx_-PCg/s640/adfrest02.png" width="640" /></a></div>
<br />
<br />
It implements the HATEOAS principle and therefore is very developer friendly.<br />
<br />
<h3>
Read, Create, Update, Delete Out-of-the-box</h3>
<div>
By default all REST HTTP Methods are exposed on a resource. GET for read, POST for Create, DELETE for Delete. To partially update a resource (only some attributes e.g.) the PATCH method is exposed. For PUT you need to provide all attributes (It will do kind of a replace).<br />
<br />
<b><span style="color: red;">Important</span></b>: When working with the REST API it is important to set the <b>Content-Type </b>to <b>application/vnd.oracle.adf.description+json</b> otherwise there will be the following exception:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">oracle.adf.internal.model.rest.core.exception.CannotParseContentException: The PayloadParser could not be found in the ResourceProcessingContext.</span><br />
<br />
See the following Postman PATCH sample:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGyNhGzUZRzYTdmZxjoiyITwMSR6EToFKWuRG1S1Db872582G5TwAc7wYlhy6muU0BY356TVu9eO4ZODsXXN_ohFCQF4URwD66JF1m-4xKppmqmBtobAW6u2wO-yz2UFII1Oq94_Ctrw/s1600/adfrest06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGyNhGzUZRzYTdmZxjoiyITwMSR6EToFKWuRG1S1Db872582G5TwAc7wYlhy6muU0BY356TVu9eO4ZODsXXN_ohFCQF4URwD66JF1m-4xKppmqmBtobAW6u2wO-yz2UFII1Oq94_Ctrw/s640/adfrest06.png" width="640" /></a></div>
<br />
<h3>
Pagination for collections by default</h3>
<div>
Having a REST collection ADF automatically exposes parameters for pagination. Just append limit und offset as URL parameters and your good to go. see next pic to get a feeling how the parameters affect the response:</div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib0iwT1EZC0PWivZRmqXXQQckDXgo37HFR4wlw2NR-tpBwMdVfHftO9K-Wi8DfQExLTPFN4AL38Sj7zOEPNlfvJM3wVTfp9s7VQSIfy75QBFpZJWbaAxiaYSmaulacMVlNm5rzpBIoLw/s1600/adfrest07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib0iwT1EZC0PWivZRmqXXQQckDXgo37HFR4wlw2NR-tpBwMdVfHftO9K-Wi8DfQExLTPFN4AL38Sj7zOEPNlfvJM3wVTfp9s7VQSIfy75QBFpZJWbaAxiaYSmaulacMVlNm5rzpBIoLw/s640/adfrest07.png" width="640" /></a></div>
<div>
<br /></div>
<h3>
Children and LOVs as sub-resource</h3>
<div>
This is also a pretty great feature. </div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4hMIBUWCUuQP-whaQFLs1MkDigbCRBng_zttcjj3B5DZyLetYim3lLLPXm5EmBaw8Dr6pUsh2498sC-0bSYko43xuH5_-cYx1r5p-JyLA7aEm9ycW9RgkxlJwOOcyUCLRvlADFGYbTQ/s1600/adfrest08.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="59" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4hMIBUWCUuQP-whaQFLs1MkDigbCRBng_zttcjj3B5DZyLetYim3lLLPXm5EmBaw8Dr6pUsh2498sC-0bSYko43xuH5_-cYx1r5p-JyLA7aEm9ycW9RgkxlJwOOcyUCLRvlADFGYbTQ/s200/adfrest08.png" width="200" /></a>By a simple configuration child view object instance will be exposed a sub-resources.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Configured LOVs on specific attributes will by default be exposed as sub-resources too. See example in postman:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyStnIEDdr6wyx6xc1dGSfAbwtEIRIvuKaYmF_k64mEpY22pHLDscJH6IkNygBKhZj1n2sUaO1LfXGEG99tEdm4lMrSk3AyM6WfrbpCJAzBdMR7j7AK18p38phyphenhyphen2EauVk8V95TpEmFCw/s1600/adfrest09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyStnIEDdr6wyx6xc1dGSfAbwtEIRIvuKaYmF_k64mEpY22pHLDscJH6IkNygBKhZj1n2sUaO1LfXGEG99tEdm4lMrSk3AyM6WfrbpCJAzBdMR7j7AK18p38phyphenhyphen2EauVk8V95TpEmFCw/s640/adfrest09.png" width="640" /></a></div>
<div>
<br /></div>
<h3>
<b>Attribute Shaping</b></h3>
By default all attributes of a View Object will be exposed in the REST resource. If you want to expose only a subset of the attributes you can define "Service Shapes" on the View Object<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfHhTnl0D6ShDrM3Fwj2xcTex8l4Ehf1JdaNcnWkb_NSyhGgkSpBpCCoyRcOVs7MDuvdAev2yr0jnp9mVqj7pd_sL5f2ajytHXFoa6wnhyMnxeKTWh2TYLqkgDPxzDawEU4WKx8zaDkw/s1600/adfrest04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="284" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfHhTnl0D6ShDrM3Fwj2xcTex8l4Ehf1JdaNcnWkb_NSyhGgkSpBpCCoyRcOVs7MDuvdAev2yr0jnp9mVqj7pd_sL5f2ajytHXFoa6wnhyMnxeKTWh2TYLqkgDPxzDawEU4WKx8zaDkw/s640/adfrest04.png" width="640" /></a></div>
<br />
and use those to customize the REST resource (Tab: Attributes)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBaG0aPPJQHONjYcQPGJE-UjHpF9KIzgQgOxIgn_0jtt133fFmN_lLNZnKHyVkwiK7Fmw8MYApTlenOLs1uwCIbdzjLPyJgwQzHcN7vgi9hoXpp7EvsSKwH4l4soaZF9fn8LC0eS6Kng/s1600/adfrest05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBaG0aPPJQHONjYcQPGJE-UjHpF9KIzgQgOxIgn_0jtt133fFmN_lLNZnKHyVkwiK7Fmw8MYApTlenOLs1uwCIbdzjLPyJgwQzHcN7vgi9hoXpp7EvsSKwH4l4soaZF9fn8LC0eS6Kng/s640/adfrest05.png" width="640" /></a></div>
<br />
<br />
<h3>
Security</h3>
<h3>
<div style="font-size: medium; font-weight: normal;">
Securing ADF REST Resources is quite powerful. It works just like with Pages / Taskflow Permission. You just need to run the ADF Security Wizard on the RESTWebService project.</div>
</h3>
<h3>
More features</h3>
<h4>
Canonical Link</h4>
<h3>
<div style="font-size: medium; font-weight: normal;">
The canonical link is used to link to a resource that represents the full representation (of REST resource). This can be an "internal" defined View Object or an external (by pointing to the corresponding) ADF Connection.<br />
<br />
See details in the Dev Guide: <a href="https://docs.oracle.com/middleware/1221/adf/develop/GUID-8F85F6FA-1A13-4111-BBDB-1195445CB630.htm#ADFFD54027" target="_blank">How to expose canonical Resources</a></div>
</h3>
<h4>
RowFinder Key</h4>
<div>
With RowFinder configuration it is possible to change the URL of a resource from e.g. /employees/100 to /employees/SKING</div>
<div>
<br /></div>
<div>
<h4>
Expose Custom Methods in the ADF REST Resource</h4>
<div>
To be evaluated ;) The ADF Documentation is not very clear about that topic.</div>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div>
--</div>
Sample Code: <a href="https://github.com/enpit/enpit.sample.adf1221.restsandbox">https://github.com/enpit/enpit.sample.adf1221.restsandbox</a><br />
<h3>
Further information</h3>
<ul>
<li>Great test tool for REST APIs: Postman ( <a href="https://www.getpostman.com/">https://www.getpostman.com/</a> )</li>
<li><a href="https://docs.oracle.com/middleware/1221/adf/develop/GUID-8F85F6FA-1A13-4111-BBDB-1195445CB630.htm#ADFFD589" target="_blank">ADF 12.2.1 DevGuide: 16 Creating RESTful Web Services with Application Module</a></li>
<li><a href="http://docs.oracle.com/middleware/1221/adf/develop/GUID-589F3905-5A8D-402D-B2D2-3BEEB2D7DDD4.htm#ADFFD54082" target="_blank">ADF 12.2.1 DevGuide: 22 Consuming RESTful Web Services Using the ADF REST Framework</a></li>
</ul>
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com1tag:blogger.com,1999:blog-3884583999971724746.post-58815033440704411862015-12-16T23:59:00.000+01:002015-12-20T12:28:58.421+01:00WebLogic 12.2.1 on DockerProbably everybody in IT has noticed the rising of <a href="http://www.docker.com/" target="_blank">Docker</a> in last 2 years. Since March 2015 Oracle has certified WebLogic Server on Docker. This is good news. Beyond all buzz around containerization and Docker in particular there is great use for it. Especially during development or testing of an application for WebLogic you can benefit without too much investment (time, skills). Further, since the first day of WebLogic 12.2.1 release it is certified on Docker.<br />
<br />
In preparation for one of my last talks lately I decided to checkout this new version. Subsequently are my experiences so far.<br />
<br />
Using the following Environment: WebLogic 12.2.1, Mac OS 10.11 , Docker 1.9, Docker Compose 1.5 . I will not go into Docker details here. There is a lot of introductorily Docker content available on the web.<br />
<h3>
WebLogic on Docker Overview</h3>
<div>
There are no prepackaged WebLogic Docker images available (basically because of user licence agreements) so the images must be build manually from Dockerfiles (provided at GitHub). The following figure shows the needed layers of images to actually start running containers.</div>
<div>
<ul>
<li><b>oraclelinux image</b> - officially available from Docker Hub</li>
<li><b>weblogic binaries image</b> - must be build from Dockerfile (Available on GitHub)</li>
<li><b>weblogic (empty) domain image</b> - must be build from Dockerfile (Available on GitHub)</li>
<li>application image - must be build from custom Dockerfile (its your turn)</li>
</ul>
</div>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJckd-8OjuefiT_7TG9KHzK4-MOZIvZ27jnxG41KDFyHqQDLlvxujr1Z2yUbJV3E06YwFo72ckUEbVxffnqURlIpI1qpJBA2jTu1e3odmk3A32cMVBQdf456weF7YF5YlMBiI5r4-3g/s400/wlsdocker01.png" width="400" /></div>
<div>
<br /></div>
<div>
<what are="" going="" here="" show="" to="" we=""></what></div>
<h3>
Prerequisites</h3>
<ol>
<li>Learn some Docker basic skills (if it is new to you)</li>
<li>Download Docker Toolbox 1.9. It exists for Linux / Windows / Mac. It makes you getting started "to docker" in seconds. (On Win / Mac it installs VirtualBox if needed)</li>
<li>Git Clone <a href="https://github.com/oracle/docker/tree/master/OracleWebLogic">https://github.com/oracle/docker/tree/master/OracleWebLogic</a> (<span style="color: #38761d;">Update 12/20/15: it has been updated to</span> <a href="https://github.com/oracle/docker-images/tree/master/OracleWebLogic">https://github.com/oracle/docker-images/tree/master/OracleWebLogic</a></li>
<li>Download JDK 8u60 <a href="http://download.oracle.com/otn/java/jdk/8u60-b27/jdk-8u60-linux-x64.rpm">http://download.oracle.com/otn/java/jdk/8u60-b27/jdk-8u60-linux-x64.rpm</a></li>
<li>Download WebLogic 12.2.1 Binaries (I am building the DEV/QUICK Version here. So it is: fmw_12.2.1.0.0_wls_quick.jar)</li>
<li>Copy the JDK / WLS Binaries into the cloned workspace /OracleWebLogic/dockerfiles/12.2.1</li>
</ol>
<h3>
How To: Build WebLogic 12.2.1 Developer Image</h3>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">dockerfiles ak$ sh <b>buildDockerImage.sh -v 12.2.1 -d</b></span></div>
<div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">Building image 'oracle/weblogic:12.2.1-dev' based on 'developer' distribution...</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">Sending build context to Docker daemon 1.204 GB</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">Step 1 : FROM oraclelinux:7.0</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">7.0: Pulling from library/oraclelinux</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">f359075ce4d8: Pull complete</span></div>
</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">..</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">..</span></div>
<div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">Successfully built 251b87118c43</span></div>
<div>
<br /></div>
<div>
WebLogic Docker Image for 'developer' 12.2.1 is ready to be extended: oracle/weblogic:12.2.1-dev</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">dockerfiles ak$ <b>docker images</b></span></div>
</div>
<div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">oracle/weblogic 12.2.1-dev 234ea4e45bc7 44 hours ago 1.738 GB</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">oraclelinux 7.0 707f44423637 7 weeks ago 197.2 MB</span></div>
</div>
<div>
<br /></div>
<br />
<h3>
How To: Build WebLogic 12.2.1 Sample (Empty Domain) Image</h3>
This is pretty straightforward. Just change into the sample directory and kick off the docker build.<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">samples/1221-domain$ <b>docker build -t enpit/samplewls:12.2.1-dev .</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">akmac2:1221-domain ak$ <b>docker images</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>enpit/samplewls</b> <b>12.2.1-dev</b> 3861d745a0bc 44 hours ago 1.739 GB</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>oracle/weblogic</b> <b>12.2.1-dev</b> 234ea4e45bc7 44 hours ago 1.738 GB</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>oraclelinux</b> <b>7.0</b> 707f44423637 7 weeks ago 197.2 MB</span><br />
<br />
At this point you have an image from that you can run weblogic containers. Having some Shell scripts included the image supports different types of containers to run. This is because of WebLogic Domain concept. See next Fig.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAQ6PAs1d49KIlUws_6W_vwkuvMvrERWobygUKTZ7IrJp9G1RbmGZ63JoDLjg-PqJx0iH5lj3dMf8A4e_eeDAD8UR-guetn6bdd2nXEAXLZHUIPauxLzqHxZcHfguNmviMke9rQ3ICAA/s400/wlsdocker02.png" width="400" /></div>
<br />
<br />
<br />
<h3>
Run WebLogic AdminServer Container (the "Docker-Way")</h3>
Nothing easier then that:<br />
<span style="font-family: "courier new" , "courier" , monospace;">akmac2:1221-domain ak$ <b>docker run -d -p 8001:8001 --name=wlsadmin enpit/samplewls:12.2.1-dev</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">545cc33b8703586b1cc9098bbffe5d48ae6810c031c5104a8828b6718eb9fd03</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">akmac2:1221-domain ak$</span><br />
<br />
The container starts the default command from the Dockerfile which in this case is "startWebLogic.sh"<br />
(Providing a name is optional but it helps to better identify the running container)<br />
<br />
The easiest way to get the right IP / URL to access the Admin Console is looking at the Kitematic UI in the "Ports" Tab<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit32TwRWPtwrhY1GTd96_gdqS9fifgdqJmHMEDRI1tp_4cQW477f7DQoJy1gNUSPZkgvtqqhflIt1CFn8kWn-NhcbMvHNCJARSpR56gAx02WuuqGqBNsKwh_4j0SLHeJ4FYjHms0gSaw/s640/wlsdocker05.png" width="640" /></div>
<br />
So in my case I access the WebLogic Admin Console http://192.168.99.100:8001/console . Logging in with defaults weblogic / welcome1. With the above command you can now start as many AdminServers (in its own WebLogic Domain) as you want.<br />
<h3>
Extend WebLogic Domain with Managed Servers (Classical WebLogic Topology) </h3>
Starting Managed Server Containers is also straightforward (if the Dockerfile is working for you. I had to make some modifications. See later)<br />
<span style="font-family: "courier new" , "courier" , monospace;">akmac2:1221-domain ak$ <b>docker run -d --name=wlsms1 --link wlsadmin:wlsadmin -p 7001:7001 enpit/samplewls:12.2.1-dev createServer.sh</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">bd8d53209781ea52096fba166fa6190b336366f3c0673b0a7452822a0e6d7a44</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">akmac2:1221-domain ak$</span><br />
<br />
To add another managed server just run with different name parameter and map the container 7001 port to a different host (docker machine) port if you want to access the managed server directly<br />
<span style="font-family: "courier new" , "courier" , monospace;">akmac2:1221-domain ak$ <b>docker run -d --name=<span style="color: red;">wlsms2</span> --link wlsadmin:wlsadmin -p <span style="color: red;">7003</span>:7001 enpit/samplewls:12.2.1-dev createServer.sh</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">7389bfa89ffe0e07a286a9a88e3b0a3f30a77a33f464af4f8264efdc00ae7313</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">akmac2:1221-domain ak$</span><br />
..<br />
<br />
The createServer.sh Skript connects to the admin server, extends the domain by a machine (the container) and a managed server entry. Further it starts the NodeManager.<br />
<br />
In the Admin Console you should notice the new machines and Managed Servers. (The managed server must be started manually; the createServer.sh Script is not doing it (<span style="color: #38761d;">Update 12/20/15: the scripts has been updated so managed server starts automatically</span>)). In my sample I then have the following configuration<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYD__sVwMkIs88dt9o-Nlw4WvqLRP8qSQA2riJIcYBQ-MU_BOXzrvCQQ4B4_RwL75ULu31ZAI1XYw2lE7GCShBRE2oBCU7qoco-n620SWy9rW710L3kSnsjvTHdzhAIgHV3v-U8XGFig/s640/wlsdocker06.png" width="640" /></div>
<br />
<span style="color: #38761d;">(Update 12/20/15: the following two issues might have been fixed in GitHub Repo)</span><br />
Note: In order to make the above "createServer.sh" work for me I had to do the following modifications (and rebuilding the image of course)<br />
(1) Issue: createServer.sh file not found ....<br />
Adjust the sample 1221-domain/ <a href="https://github.com/oracle/docker-images/blob/master/OracleWebLogic/samples/1221-domain/Dockerfile.emptydomain" target="_blank">Dockerfile.emptydomain</a>.<br />
<br />
Fix: I added the following underneath the statement "USER root"<br />
<span style="font-family: "courier new" , "courier" , monospace;">RUN chmod +x /u01/oracle/*.sh && chown oracle:oracle -R /u01/oracle</span><br />
<br />
(2) Issue: When the "createServer.sh-container" started and I try to start the managed server through Admin Console (that actually is done through the NodeManager) the process just hangs after a while... To fix that I modified the file<br />
<a href="https://github.com/oracle/docker-images/blob/master/OracleWebLogic/samples/1221-domain/container-scripts/add-server.py" target="_blank">1221-domain/container-scripts/add-server.py</a>:<br />
Change the arguments for starting the managed server with additional argument.<br />
<span style="font-family: "courier new" , "courier" , monospace;">..</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">arguments = '-Djava.security.egd=file:/dev/<b>./</b>urandom -</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">..</span><br />
(It is a known "issue" on headless systems because of missing keyboard/mouse input entropy for random device)<br />
<br />
<i>Note: After making those changes and rebuild the "empty wls domain image" the "createServer.sh"-script worked as expected for me. But I noticed an increase in the image size from 1.7GB to 2.3GB. Not sure where it comes from. Maybe because I tried some other changes to make the Dockerfile work for me. I need to investigate more and/or file an issue on that. </i><br />
<h3>
Building an Java EE Application Image</h3>
Well, that's pretty straightforward. I took some existing WAR file from a tutorial (shoppingcart.war) and dockerized that app by creating a WLST Deploy script and of course a Dockerfile (that extends the WebLogic 12.2.1 Dev Domain Image)<br />
<br />
Here is the Dockerfile:<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6RhJYxXP49DIStkOp0wDfNpC34CVXZqJCD4panLsOGSoXdMwRLkiI7Ocd_fhW8szNsnGYSnt11M-WTvy6eEe3Y4VSKU67FwsvUEzJ4vBI4-d2f0tHaQv_oaHgWBtw2MZL9qYgpftv7A/s640/Bildschirmfoto+2015-12-16+um+22.46.07.png" width="640" /></div>
<br />
And here the sample deploy WLST script:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9KYCenIq6pbNJqX81fjPZ6Hfp_0jRQ195Cy45m1QwOkPXQydqoUqSypKH4wla1vMuZCZEdbqcYSsgTbgtDSspbQkgeRsRNmfhUmYQGWpgi6ZpBMnFJFTlA8kJcgdBi_vuJg9VcWZeow/s1600/Bildschirmfoto+2015-12-16+um+22.46.42.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9KYCenIq6pbNJqX81fjPZ6Hfp_0jRQ195Cy45m1QwOkPXQydqoUqSypKH4wla1vMuZCZEdbqcYSsgTbgtDSspbQkgeRsRNmfhUmYQGWpgi6ZpBMnFJFTlA8kJcgdBi_vuJg9VcWZeow/s640/Bildschirmfoto+2015-12-16+um+22.46.42.png" width="640" /></a></div>
<br />
Notice that the Admin Server is started during the build time in order to deploy to the AdminServer.<br />
To build the sample Java EE application you need to run:<br />
<span style="font-family: "courier new" , "courier" , monospace;">docker build -t enpit/shoppingcart:1.0-dev .</span><br />
<br />
Now you have a dockerized simple Java EE application that you can run with<br />
<br />
<div class="p1">
<span style="font-family: "courier new" , "courier" , monospace;"><span class="s1">docker run -d -p 8001:8001 </span><span class="s2">enpit/shoppingcart:1.0-dev</span></span></div>
<h3>
Composing and Running Multi-Container Applications</h3>
Well this should be a post for itself. But to give you an impression for more complex scenarios: Typically you will run a database or more services that you WebLogic application is based on. Sure it is possible to link containers as shown in the previous sections but with more services it becomes a tedious task. Docker Compose helps to configure a multi-container environment that can simply be started with a single command: <span style="font-family: "courier new" , "courier" , monospace;">docker-compose up</span><br />
<br />
The following docker-compose.yml file configures and links an oracle database-xe container and a weblogic container.<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzT4D77OGZwYfZTNO53BYrlYLxMO0c0AU8r01s4IhN9QEAYECH5FM38-mRv0M_jq9mRZJkpXJKmmHoVEnUmRvDBp8xfLOOxZZtmsLYB9WA7ksIDQvGnDTmimzGHvYO9bUxqi4AJH1vYw/s640/wlsdocker09.png" width="640" /></div>
<br />
Here is the sample output docker compose provides (if running without -d option)<br />
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">akmac2:1221-testds-app ak$ <b>docker-compose up</b></span></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">Creating <span style="color: red;">1221testdsapp_oracledb_1</span></span></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">Creating <span style="color: #6aa84f;">1221testdsapp_wlsadmin_1</span></span></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">Attaching to 1221testdsapp_oracledb_1, 1221testdsapp_wlsadmin_1</span></span></div>
<div class="p1">
<span style="font-family: "courier new" , "courier" , monospace;"><span class="s2"><span style="color: red;">oracledb_1 | </span></span><span class="s1"><span style="color: red;">Starting Oracle Net Listener.</span></span></span></div>
<br />
<div class="p2">
<span style="color: #6aa84f; font-family: "courier new" , "courier" , monospace;"><span class="s1">wlsadmin_1 | </span><span class="s3">..</span></span></div>
<div class="p2">
<span style="color: #6aa84f; font-family: "courier new" , "courier" , monospace;"><span class="s1">wlsadmin_1 | </span><span class="s3">..</span></span></div>
<div class="p2">
</div>
<div class="p1">
<span style="font-family: "courier new" , "courier" , monospace;"><span class="s1"><span style="color: red;">oracledb_1 | </span></span><span class="s2"><span style="color: red;">Starting Oracle Database 11g Express Edition instance.</span></span></span></div>
<div class="p1">
<span class="s2"><span style="color: #6aa84f; font-family: "courier new" , "courier" , monospace;">wlsadmin_1 | ..</span></span></div>
<div class="p1">
<span class="s2"><span style="color: #6aa84f; font-family: "courier new" , "courier" , monospace;">wlsadmin_1 | ..</span></span></div>
<div class="p1">
<span class="s2"><span style="color: #6aa84f; font-family: "courier new" , "courier" , monospace;">
</span></span></div>
<div class="p1">
<span style="color: #6aa84f; font-family: "courier new" , "courier" , monospace;"><span class="s1">wlsadmin_1 | </span><span class="s2"><dec 10:19:14="" 16="" 2015="" gmt="" pm=""><notice><weblogicserver><bea-000365><server changed="" running.="" state="" to="">Dec 16, 2015 10:19:14 PM GMT Notice WebLogicServer BEA-000360 The server started in RUNNING mode.</server></bea-000365></weblogicserver></notice></dec></span></span></div>
<br />
This should just give you an idea that simple Docker containers are just the beginning. With Docker Compose (and Docker Swarm) there is more to come.<br />
<h3>
Summary and Conclusion</h3>
Docker is fun and fast. It is easy to get started. The official provided WebLogic Dockerfiles on Github from Oracle help a lot to get started quickly. But be aware of that the Dockerfiles not meant to be perfect. Its an example how to get started and build your own WebLogic Docker images. The sample domain had to be adjusted otherwise the WebLogic JVM process did not start for me. But since the Dockerfiles are shared on GitHub it's easy to contribute. Bruno Borges and Monica Riccelli from Oracle are doing a great job in making all that to work and being certified by Oracle. Thank you guys!<br />
<br />
For a long time WebLogic user it is untypical why port 8001 is used as default HTTP AdminServer Port. Why not running it on 7001 and use 8001 for Managed Server? or 7003, 7005 etc for managed server. ? (Note to me: Open an discussion on GitHub and fix that)<br />
<br />
When running the ManagedServer (MS) type of container the MS is not started automatically. With some WLST scripting it could be improved I think.<br />
<br />
Using docker-compose it should be possible to set up a cluster configuration and easily run it with: <span style="font-family: "courier new" , "courier" , monospace;">docker-compose up</span>.<br />
<br />
With Docker 1.9 Networking / Persistent storage capabilities and accordingly Docker Compose and Swarm has been greatly improved. This is great news. As it is going to allow Multi-Host WebLogic Cluster Containers. (<span style="color: #38761d;">Update 12/20/15: Multi-Host WebLogic Cluster Sample has been added in the <a href="https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/1221-multihost" target="_blank">corresponding GitHub Repo</a>. Kudos to Bruno; great work!)</span><br />
<br />
So there is still changes going on but in terms of simplification and improvement. I hope to see Docker Compose And Swarm for WebLogic working soon. But it will need some time because compose/swarm is sill experimental. There might be some networking issues at the moment of this writing.<br />
<h3>
Further information</h3>
<ul>
<li><a href="http://docs.oracle.com/middleware/1221/wls/DOCKR/overvew.htm#DOCKR136" target="_blank">Oracle WebLogic 12.2.1 on Docker Documentation</a></li>
<li><a href="http://www.oracle.com/technetwork/middleware/weblogic/overview/weblogic-server-docker-containers-2491959.pdf" target="_blank">Oracle WebLogic Server on Docker Whitepaper</a> (June 2015)</li>
<li><a href="http://www.oracle.com/technetwork/middleware/ias/oracleas-supported-virtualization-089265.html">Oracle Certification Overview for Virtualization / Containerization</a> (scroll to the the bottom)</li>
<li><a href="https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=2017945.1" target="_blank">Oracle Support Policy for WebLogic 12.2.1 on Docker on MOS</a></li>
<li><a href="https://github.com/oracle/docker-images/tree/master/OracleWebLogic" target="_blank">Dockerfiles and Sample-Domains for WebLogic 12.1.3 and WebLogic 12.2.1 at Github.com</a></li>
</ul>
<br />
Check out the presentation from DOAG 2015 (GER)
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/vY7MXh1izenDBB" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com10tag:blogger.com,1999:blog-3884583999971724746.post-59096155553683981892015-11-03T01:37:00.001+01:002015-11-04T00:36:39.738+01:00Consume JSON based ADF REST Services in ADF 12.2.1 (with REST DataControl)In ADF 12.2.1 the capabilities for handling with REST services has been greatly improved. You can now expose ADF BC (ViewObjects) as REST service in JSON format. On the other hand there are improvements in the REST DataControl.<br />
<br />
In this blog post I am going to show how to consume this REST Service and create a basic ADF Table.<br />
<br />
So here is a basic REST Service for employees<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHaI-IFiYtrq05FKQ0l_jPtTbmDyHNbV_ud7Kcgym91gbXGjGmRAorkdiAQ3dV-oRXO6jKLtjF_yvrdXlE58MMgSqS9ENYUdXzwnIawGHsgomOPb2Ig3uid3Ln2ZcM9a89oxpWC2nzcQ/s1600/bb32147387-CF04-4620-BB08-0227E46C29A8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHaI-IFiYtrq05FKQ0l_jPtTbmDyHNbV_ud7Kcgym91gbXGjGmRAorkdiAQ3dV-oRXO6jKLtjF_yvrdXlE58MMgSqS9ENYUdXzwnIawGHsgomOPb2Ig3uid3Ln2ZcM9a89oxpWC2nzcQ/s400/bb32147387-CF04-4620-BB08-0227E46C29A8.png" width="400" /></a></div>
<br />
<br />
<h3>
REST DataControl with JSON Support</h3>
From „New Gallery“ open the following wizard<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFMAb2r9gDpGNatG8UKm_k0Az2cMRq6cN8LMRFRpOHpHSXQfs3EcjJfA24KBRI0VHij7KvrQNOhGHXwN-gvdrvdyKVNj8k95YtFWwRiF_zZNteRERL0wfNLIeqn0wE74cmKyGpYCiRlg/s1600/bbBE481466-DA4C-4645-9D60-B6B3998B51CF.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="76" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFMAb2r9gDpGNatG8UKm_k0Az2cMRq6cN8LMRFRpOHpHSXQfs3EcjJfA24KBRI0VHij7KvrQNOhGHXwN-gvdrvdyKVNj8k95YtFWwRiF_zZNteRERL0wfNLIeqn0wE74cmKyGpYCiRlg/s400/bbBE481466-DA4C-4645-9D60-B6B3998B51CF.png" width="400" /></a></div>
<br />
<br />
The create web service data control wizard launches. Choose REST option.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRh2BYsdcSBTbnlu5jhaj6qodRaChaCYSLi4VApA2o5E6ednnzn_X4az7JVX92i0Dioj4V6AZYCtTH71LVu9NiTVzqd7ZKHIueQYCnWyfccDRym1RaobDfsgIZ__8L9r0Sgjh0m5aoQQ/s1600/bb0BEA9380-BBD8-4442-AD40-C9DA0344F3BA.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRh2BYsdcSBTbnlu5jhaj6qodRaChaCYSLi4VApA2o5E6ednnzn_X4az7JVX92i0Dioj4V6AZYCtTH71LVu9NiTVzqd7ZKHIueQYCnWyfccDRym1RaobDfsgIZ__8L9r0Sgjh0m5aoQQ/s400/bb0BEA9380-BBD8-4442-AD40-C9DA0344F3BA.png" width="400" /></a></div>
<br />
<br />
Next you can decide whether you consume a REST service, that has been exposed through ADF BC Application Module or a generic REST service. The difference here is that the ADF based REST service exposes additional meta data that describes the structure and types of the return JSON structure. This makes it possible to automatically get a type-aware DataControl on REST/JSON service which is generically not the case. See next screenshot to get a feel of the feature of an ADF REST Service and this particular describe feature.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtQnkk8BZPPs-J4idwKwhIyhWXqmVayxWP9pXTyPxx9f4akrJz0YFDtM7xSXU4h4r-2127Lgai58XFbPvKU84CbrxaDcdt7hcmeQqYlYieT-qMaYgMQx-qyE8nxJaha5g1b0N41TNQfw/s1600/bb39ACAA62-AFEE-46EC-BD62-3DD7DF047923.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtQnkk8BZPPs-J4idwKwhIyhWXqmVayxWP9pXTyPxx9f4akrJz0YFDtM7xSXU4h4r-2127Lgai58XFbPvKU84CbrxaDcdt7hcmeQqYlYieT-qMaYgMQx-qyE8nxJaha5g1b0N41TNQfw/s400/bb39ACAA62-AFEE-46EC-BD62-3DD7DF047923.png" width="400" /></a></div>
<br />
<br />
<br />
So lets add an ADF REST Connection<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKki9V4Y5yyo2VTf7a0hsJ07XGzOxbs6SkQTQIplaUvkrliXiWaBA6VhEsclNRySro_CaD4Bj4G7OiPFlhABKV2nnQmkYxAUgBT-RpBjyD3zXd7rphOc7y2t7ANK1KHcA-MSeMLOX38Q/s1600/bb28CB86C5-7D80-4989-B773-EAD54AC4979F.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKki9V4Y5yyo2VTf7a0hsJ07XGzOxbs6SkQTQIplaUvkrliXiWaBA6VhEsclNRySro_CaD4Bj4G7OiPFlhABKV2nnQmkYxAUgBT-RpBjyD3zXd7rphOc7y2t7ANK1KHcA-MSeMLOX38Q/s400/bb28CB86C5-7D80-4989-B773-EAD54AC4979F.png" width="352" /></a></div>
<br />
<br />
Important note: Do include the version name and resource name, but do not include any URL parameters.<br />
<br />
Next it is possible to choose from Security Policies<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi68Bcqz7jSsg-G28G_cBEWbUvHa1FHXWNfe9d9I3dTF3Z9wfIJp3BNZRC0w5yFiKT14kLRdnlUB1hY3B5S-NmdvvZUh9p0bf_k4U0MWOVn4_-0MfAnJPp8rq18UpLnRE0bRa7YNx4ykA/s1600/bb5879798E-0CDF-4B67-8919-70C1F9C92658.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi68Bcqz7jSsg-G28G_cBEWbUvHa1FHXWNfe9d9I3dTF3Z9wfIJp3BNZRC0w5yFiKT14kLRdnlUB1hY3B5S-NmdvvZUh9p0bf_k4U0MWOVn4_-0MfAnJPp8rq18UpLnRE0bRa7YNx4ykA/s400/bb5879798E-0CDF-4B67-8919-70C1F9C92658.png" width="400" /></a></div>
<br />
Since in this example we do not use any security just skip this page.<br />
<br />
Next you can choose to add all resources or specific one. in this case I have only one resource exposed<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_diJQetFc_LvYuklbBm4_Xl5rLEfyCrbJnP42TJGOa-1HTpub11z9KOS712f5QJMFtEkPrB9Ghcqjfcvba3R0CZ0FzLsNAuOL9TXoWPuhkJ42FrvgCwZYVYLLPmA3_KFwO7CTQn45fA/s1600/bb21493890-9EDF-4281-97E2-B2BE2763F6E9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="122" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_diJQetFc_LvYuklbBm4_Xl5rLEfyCrbJnP42TJGOa-1HTpub11z9KOS712f5QJMFtEkPrB9Ghcqjfcvba3R0CZ0FzLsNAuOL9TXoWPuhkJ42FrvgCwZYVYLLPmA3_KFwO7CTQn45fA/s400/bb21493890-9EDF-4281-97E2-B2BE2763F6E9.png" width="400" /></a></div>
<br />
<br />
Click Next and Finish.<br />
<br />
=> The DataControl will be created. Every attribute type is correctly derived from the rest metadata (ADF REST service specific).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuUHcNP-UoVUgHiI3aDVicUlC1j_xBnNOAGTeEX1RMmuBwxksCX0uBVfO4F53nGOVK-NgAybW1gOqzWWa4E-XmfLdMdQBUSqkXUvsR1Djhi-cPskUQt1bNpbcR_ORahieP7eRN2aLwew/s1600/bbF7285427-AD43-40F2-A76B-047C5DBF63DF.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuUHcNP-UoVUgHiI3aDVicUlC1j_xBnNOAGTeEX1RMmuBwxksCX0uBVfO4F53nGOVK-NgAybW1gOqzWWa4E-XmfLdMdQBUSqkXUvsR1Djhi-cPskUQt1bNpbcR_ORahieP7eRN2aLwew/s400/bbF7285427-AD43-40F2-A76B-047C5DBF63DF.png" width="400" /></a></div>
<br />
<br />
(Interesting to note, that EmployeeId is not marked as the primary key. Although it is in the ADF BC ViewObject definition from which the service has been previously created. Well it is because of the REST nature of this Collection. Resources typically must not match every attribute of an ADF ViewObject. It could be a subset. Therefore the canonical attribute represents the primary key which is typically the URL to the canonical resource. In our case the canonical resource is the resource itself :))<br />
<br />
Next steps are as easy as with any other DataControl. Just create an ADF table via drag and drop<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLn68Fr-kPd1rTFRXeez6lmdSmXdv1FnQViUx81uCa_gXJs8QdCDl-O9kHi7woAUzeMkXZt6NHZ-CI7ZPV_EgAq63ftWDvioZs1rciqB7XOK6HF3lQcNU3hXkH89BQhrD1EXHNTzI_yQ/s1600/bb7AB40D60-A6E6-47C1-B6EF-641447420EC5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLn68Fr-kPd1rTFRXeez6lmdSmXdv1FnQViUx81uCa_gXJs8QdCDl-O9kHi7woAUzeMkXZt6NHZ-CI7ZPV_EgAq63ftWDvioZs1rciqB7XOK6HF3lQcNU3hXkH89BQhrD1EXHNTzI_yQ/s400/bb7AB40D60-A6E6-47C1-B6EF-641447420EC5.png" width="400" /></a></div>
<br />
Run the page.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-aECojehiu7vxUE-7vTPNfgImgIgtQu76219yKu_BIUPyB8UBGMQHnAaJR0SAk6x-WwvOuQ_LQTbR1jq6mxzmRljriMQiNfvvmb99cyxBGAqQEdqyp72Uon4wSqGLDiEVqu0w0i0v8Q/s1600/bbAF453DE1-482E-45AC-9984-66FBDD4A44A1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-aECojehiu7vxUE-7vTPNfgImgIgtQu76219yKu_BIUPyB8UBGMQHnAaJR0SAk6x-WwvOuQ_LQTbR1jq6mxzmRljriMQiNfvvmb99cyxBGAqQEdqyp72Uon4wSqGLDiEVqu0w0i0v8Q/s400/bbAF453DE1-482E-45AC-9984-66FBDD4A44A1.png" width="400" /></a></div>
<br />
<br />
Table is displayed. Filtering works BTW too. Nice.<br />
<br />
Since we are consuming an ADF REST Service lets see if we can update a record. Therefore Drag and Drop the „Commit“ Operation from the Data Control. Create a button and name it „Save changes“. For a simple testcase we change the salary from initially 10000 to 5000. Press „Save changes"<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBQ446ApShZRsEvCI3jJXHU9e4851kol2bmW9nqPF-m95Qa_NQVhO48ELDlQl25Xl4ax84AsRaI76Xm5u3MIETqq3gccp_78Q14TzlVLUXDNJ1Upbqa8z2K5QuVMKYvqlH_vUhQ3LbMg/s1600/bbAC0DA18F-CE50-4270-9C00-174CD1DA0B09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="88" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBQ446ApShZRsEvCI3jJXHU9e4851kol2bmW9nqPF-m95Qa_NQVhO48ELDlQl25Xl4ax84AsRaI76Xm5u3MIETqq3gccp_78Q14TzlVLUXDNJ1Upbqa8z2K5QuVMKYvqlH_vUhQ3LbMg/s400/bbAC0DA18F-CE50-4270-9C00-174CD1DA0B09.png" width="400" /></a></div>
<br />
<br />
Looking into the database you will notice the change<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuQ1I0WEjkXCS4ahVEXW8L7BPQlCAijVZe0FLMsdBxFJEL28PPewVnFhQ0_yhm2gWG-zSdTP7nptxu17Lb9noao5m_YYfWEN6QeisJ4AB5arLjqCP1mIJ9szVfRDwCtqSgIhNPh4tmvw/s1600/bbFA2A7E6A-B991-4E90-BF7B-9177058BD43F.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="40" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuQ1I0WEjkXCS4ahVEXW8L7BPQlCAijVZe0FLMsdBxFJEL28PPewVnFhQ0_yhm2gWG-zSdTP7nptxu17Lb9noao5m_YYfWEN6QeisJ4AB5arLjqCP1mIJ9szVfRDwCtqSgIhNPh4tmvw/s400/bbFA2A7E6A-B991-4E90-BF7B-9177058BD43F.png" width="400" /></a></div>
<br />
<br />
Pretty cool.<br />
<br />
<h3>
Issues</h3>
Removing the Filter results in an NullPointerException. Hhhm that is disappointing. Looks like nobody has tested this so far ;).<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIOmKkJ9S10Dv4q-w0ydXBOTM7k94pqbhgzDEbgrwpa2h1AkhLOzkoNU9DAWlm1cibFCszKvD662C-WKWErvUPbcKgIoNp4hE6bGL0gsqjKSyNtTlnKf6dOZ6AYPrh093CsKAVc2GpKg/s1600/bb4FAF75F5-7C16-4000-B141-B8B3BBD471A7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIOmKkJ9S10Dv4q-w0ydXBOTM7k94pqbhgzDEbgrwpa2h1AkhLOzkoNU9DAWlm1cibFCszKvD662C-WKWErvUPbcKgIoNp4hE6bGL0gsqjKSyNtTlnKf6dOZ6AYPrh093CsKAVc2GpKg/s400/bb4FAF75F5-7C16-4000-B141-B8B3BBD471A7.png" width="400" /></a></div>
<br />
<br />
Refreshing the page the table keeps empty (Not data to display). Looks like a bug. It would not surprise me. Anyone feel free to file a SR to Oracle.<br />
<br />
<h3>
Sample applications</h3>
Provider: <a href="https://app.box.com/s/jxoor1j15wezvcnxj37wn7txwqq5m86e">enpit.sample.adf1221.restprovider.zip</a><br />
Consumer: <a href="https://app.box.com/s/gxuviq7wt2k6sxe6wtlx04pggxzdnatf">enpit.sample.adf1221.restconsumer.zip</a><br />
<h3>
Further information</h3>
<div>
ADF 12.2.1 Developers Guide:</div>
<div>
<br /></div>
16.3.1 How to Expose Canonical Resources in the ADF REST Resource<br />
22 Consuming RESTful Web Services Using the ADF REST Framework<br />
<br />Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com1tag:blogger.com,1999:blog-3884583999971724746.post-20158828769333240152015-10-28T01:59:00.002+01:002015-10-28T01:59:34.512+01:00Oracle JET is here - for JavaScript loversOracle makes a big move towards client side HTML5 enterprise application development - based on a collection of proven open source JavaScript tools: <a href="http://www.oracle.com/jet" target="_blank">Oracle JET</a> - the JavaScript Extension Toolkit. After 3 years of active development and internal usage for its Cloud products at Open World 2015 it has been made publicly available.<br />
<br />
To get a feel of an Oracle JET application check out the <a href="http://www.oracle.com/webfolder/technetwork/jet/public_samples/WorkBetter/public_html/index.html" target="_blank">"WorkBetter" JET Demo</a>:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.oracle.com/webfolder/technetwork/jet/public_samples/WorkBetter/public_html/index.html" target="_blank"><img alt=" Oracle JET Demo Application" border="0" height="441" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvW7ULeiWf1i0YZOn6s9J5kEb1DyzlbT3Q6aBt_U7oN_Mh_O2tLlgmeT642If8J5vX5uwYzFH5psxgqvU5O2nLyU9OhzllZYvikyw70Iq02mcsCETr83bJNAgAsHrZdYVQiWi0HJ1TlQ/s640/5D446625-DAB1-4B14-BD49-9DCD2E01B959.png" width="640" /></a></div>
<br />
Oracle JET provides a rich set of <a href="http://www.oracle.com/webfolder/technetwork/jet/uiComponents-formControls.html" target="_blank">Oracle JET UI components</a> that you can use out of the box (based on Alta UI). The documentation contains code snippets which can be used to integrate the desired UI controls in your application. (If you are a business user (with a certain affinity and love for IT) you will be able to use Oracle JET components inside "Oracle Application Build Cloud Service" )<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.oracle.com/webfolder/technetwork/jet/uiComponents-formControls.html" target="_blank"><img alt=" Oracle JET UI Components" border="0" height="393" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZm6s4lKL2YHB9yIaq42QmZXu4wDBgp9tay3luunU9-qS8yR_nMNJQQ9VTGXdMzsMCXdu4tqqntgWysoDa0doBWwapPJ7IHTGo31BqguteijDLP85z9G5yUH-ok_zCfIs5olM2Y_FQtQ/s640/758DECE5-D981-4371-9BBF-376FFF376D0B.png" width="640" /></a></div>
<br />
For data visualization it is almost the complete set you may know from ADF. This is pretty cool.<br />
<br />
<h3>
Oracle JET (Enterprise) Features</h3>
Comparing to other UI Toolkits it is great to see that important aspects of every enterprise application has been addressed.<br />
<br />
<ul>
<li>Support for localization & internationalization</li>
<li>UI Components are implementing the latest WCAG 2.0 / WAI-ARIA accessibility guidelines</li>
<li>Theming support - Default is Alta UI</li>
<li>Security - Oracle JET API provides the oj.OAuth authorization plugin which supports the OAuth 2.0 open protocol</li>
</ul>
<br />
<h3>
Oracle JET Technical Base</h3>
Obviously the core of Oracle JETs stack is based on HTML5 / JavaScript / CSS3. For certain aspects it uses proven JavaScript Libraries for Binding, Templating and Modularization.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="116" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi02wEVvO3xXynbstymLdrLZWY2a6w8stfzfuQMRPbiGoNpZ41KqG40AcrDZJcFAdqztzDCzBb8nHZWIEyQR1mLcngdA7e7Tpybi-bdB_PB8sUnUJiG_ONLwjMoolntWPtXU9P-u7r3MA/s640/51EE33B2-62D7-49C5-B837-340239D645A6.png" width="640" /></div>
<br />
<br />
<h3>
How does it compare to ADF</h3>
Well,<br />
Oracle ADF Faces - for Java developers looking for a set of JSF components implementing Alta UI<br />
Oracle JET - for JavaScript developers looking for a set of components implementing Alta UI<br />
<br />
In the Javascript ecosystem there are a lot of changes. If you do not want to deal with all of that ADF is the right choice. If you love Javascript and want to embrace every new JavaScript libraries then Oracle JET is for you.<br />
<h3>
Further Information on Oracle JET</h3>
<div>
I have put together most of the interesting things to get started on Oracle JET. BTW, For next year it is announced that it is going to be available open source on GitHub!</div>
<div>
<br /></div>
Oracle JET - Getting Started<br />
<a href="http://www.oracle.com/webfolder/technetwork/jet/globalGetStarted.html">http://www.oracle.com/webfolder/technetwork/jet/globalGetStarted.html</a><br />
<br />
Oracle JET Quickstart Basics<br />
<a href="http://www.oracle.com/webfolder/technetwork/jet/public_samples/OracleJET_QuickStartBasic/public_html/index.html">http://www.oracle.com/webfolder/technetwork/jet/public_samples/OracleJET_QuickStartBasic/public_html/index.html</a><br />
<div>
<br /></div>
Oracle JET UI Controls Overview<br />
<a href="http://www.oracle.com/webfolder/technetwork/jet/uiComponents-formControls.html">http://www.oracle.com/webfolder/technetwork/jet/uiComponents-formControls.html</a><br />
<br />
Oracle JET Hands On Lab<br />
<a href="http://www.oracle.com/webfolder/technetwork/jet/globalExamples-HOL.html">http://www.oracle.com/webfolder/technetwork/jet/globalExamples-HOL.html</a><br />
<br />
Oracle JET Developers Guide<br />
<a href="http://docs.oracle.com/middleware/jet112/jet/developer/toc.htm">http://docs.oracle.com/middleware/jet112/jet/developer/toc.htm</a><br />
<br />
Oracle JET Community<br />
<a href="https://community.oracle.com/community/development_tools/oracle-jet">https://community.oracle.com/community/development_tools/oracle-jet</a><br />
<br />
Oracle JET Quick Demo on Youtube<br />
<a href="https://www.youtube.com/embed/Qf7s-VVVpwo">https://www.youtube.com/embed/Qf7s-VVVpwo</a><br />
<br />
Oracle Alta UI<br />
<a href="http://www.oracle.com/webfolder/ux/middleware/alta/index.html">http://www.oracle.com/webfolder/ux/middleware/alta/index.html</a><br />
<br />
<br />
<h3>
Keep up to date with Oracle JET</h3>
Oracle JET YouTube Channel<br />
<a href="https://www.youtube.com/channel/UCcPYy1QhTNyR6fPAGLEsSTw/feed">https://www.youtube.com/channel/UCcPYy1QhTNyR6fPAGLEsSTw/feed</a><br />
<div>
<br /></div>
Oracle JET on Twitter<br />
<a href="https://twitter.com/OracleJET">https://twitter.com/OracleJET</a><br />
<br />
Oracle JET on Google+<br />
<a href="https://plus.google.com/111856587728259117930">https://plus.google.com/111856587728259117930</a>Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-47543187153108296212015-10-24T07:58:00.001+02:002015-10-24T07:58:05.637+02:00ADF 12cR2 (12.2.1) with lots of new features available - as part of Fusion Middleware 12.2.1 release, including WebLogic, SOA, WebCenter and Forms/ReportsJust before Open World 2015 & JavaOne open its doors for Oracles annual conference in San Francisco the long awaited ADF / WebLogic 12.2.1 has been released as part of Fusion Middleware 12.2.1.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://jdevadf.oracle.com/workbetter/faces/index.jsf" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-QrAuqxsuj-kE1YlY6p4BU4XaR8kYXl02H75GFDdxCyVXp4JbGL9g1LkEJ99G9AJBkI8m_c8L_TrEzDTvdTR0up3pscnZtieeKpd7qLqn7b-Eo9wt_ZRhyGnuwPbBiKWPIzfMGRKtaw/s1600/adf1221-workbetter.png" /></a></div>
<br />
<br />
The most interesting Updates to JDeveloper & ADF & WebLogic in terms of platform are<br />
<br />
<ul>
<li>It runs on JDK 1.8. JDeveloper supports 1.8 features</li>
<li>Full Java EE 7 Support</li>
<li>Integration with Java Cloud Service (not only SaaS Extention and Developer Cloud Service, git etc)</li>
<li>Better Maven integration</li>
</ul>
<div>
On the feature list of ADF 12.2.1 there are mainly these cool things available</div>
<div>
<ul>
<li>REST Service DataControl + REST from ApplicationModules</li>
<li>Responsive Layout features (af:matchMediaBehavior) and new Responsive Template (Masonry layout)</li>
<li>Remote Regions - Consume Taskflows remotely</li>
<li>Improved Data Visualization components</li>
</ul>
</div>
<br />
I am really looking forward to try out the many new features.<br />
<h3>
Further Information</h3>
<div>
<ul>
<li><a href="http://www.oracle.com/technetwork/developer-tools/jdev/documentation/1213nf-2222743.html" target="_blank">ADF 12.2.1 - New Features</a></li>
<li><a href="http://docs.oracle.com/middleware/1221/adf/docs.htm" target="_blank">ADF 12.2.1 - Documentation</a></li>
<li><a href="http://www.oracle.com/technetwork/developer-tools/jdev/documentation/122-cert-2708091.html" target="_blank">ADF 12.2.1 - Certification Information</a></li>
<li><a href="http://www.oracle.com/technetwork/developer-tools/jdev/downloads/index.html" target="_blank">Download JDeveloper & ADF 12.2.1</a></li>
<li><a href="http://jdevadf.oracle.com/workbetter/faces/index.jsf" target="_blank">ADF Workbetter Sample Application</a></li>
<li><a href="http://www.oracle.com/technetwork/middleware/fusion-middleware/downloads/index.html" target="_blank">Download WebLogic 12.2.1</a></li>
<li><a href="https://github.com/oracle/docker/tree/master/OracleWebLogic/dockerfiles/12.2.1" target="_blank">WebLogic 12.2.1 Docker files</a></li>
</ul>
</div>
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-17080255240830925112015-10-11T23:34:00.000+02:002016-11-05T13:07:56.317+01:00Designing Custom APIs for Oracle Mobile Cloud Service (MCS) right from the BrowserOne of the powerful and cool new features in Oracle Mobile Cloud Service is the hub for Custom APIs. From the architectural perspective Custom APIs are consisting of two parts: The „Design“ and „Implementation“ Part. In this post I am going to focus on the first part.<br />
<div>
<br /></div>
<div>
Within MCS it is possible to create the API interface right in the browser or by uploading a so called <a href="http://raml.org/" target="_blank">RAML</a> document that describes the API resources. Having done this you can provide some sample data being able to test and implement against the newly created API.</div>
<div>
<br /></div>
<div>
Focus of this post is to show how to design an API right in MCS UI and test it.</div>
<h3>
How to do it</h3>
<div>
Goto Development > APIs</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLECWWMKP4KPEdreDcZwXnZ2YudbNYBo26IEGk5lBLbUgNMEZ33WH9hXPIwnactNHVkbqvdwsZJCpy2ykOj4wt6OhmZxRVwR-2EAAbEq1j3EaVIF-CQ_E8ds0IUhKRTeyv7wVu98Nx6Q/s1600/EA983F5A-F453-4CEC-862A-154A70CE6F2D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="449" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLECWWMKP4KPEdreDcZwXnZ2YudbNYBo26IEGk5lBLbUgNMEZ33WH9hXPIwnactNHVkbqvdwsZJCpy2ykOj4wt6OhmZxRVwR-2EAAbEq1j3EaVIF-CQ_E8ds0IUhKRTeyv7wVu98Nx6Q/s640/EA983F5A-F453-4CEC-862A-154A70CE6F2D.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Click „New API"</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdH3yfTfYykY7R3Dvr5wocsJ-LGU2bhMCb1liIwkA1IVkR3_v8QCBRw0FXYD2JoFDUjlrTHMbG4BbYMzgNVfhoIl3f3ABhAadBv1FaES4MZRfea9ed3Av7u3DNrNlnlOLiqkc3t8xOXg/s1600/927AC529-2338-4A0A-A358-D6C5B797CCD5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="393" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdH3yfTfYykY7R3Dvr5wocsJ-LGU2bhMCb1liIwkA1IVkR3_v8QCBRw0FXYD2JoFDUjlrTHMbG4BbYMzgNVfhoIl3f3ABhAadBv1FaES4MZRfea9ed3Av7u3DNrNlnlOLiqkc3t8xOXg/s640/927AC529-2338-4A0A-A358-D6C5B797CCD5.png" width="640" /></a></div>
<br />
<div>
<br /></div>
<div>
If you have a RAML document at this point in time you can upload it to define the Resources for your API. If not it is possible to create it on the fly (as shown in this post).</div>
<div>
<br /></div>
<div>
Next: Click „Create“. It will take you to the „Designer“ View. You will see the general configuration of your Custom API.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibvqjLFHdO4bVTJqSYucY0dmtTX23mUznmldef17I_3jYbErw4BKk3qEs_o6Hg6jzgTROi0XINDSLFA2BGyjiOv4r-7pownbJh3jw4Ti9kf2ccSRXVP1AO1lgD1m3hyru5qOXz0KMfIw/s1600/BDFFED42-4DDF-4413-9378-9761B2321004.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="363" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibvqjLFHdO4bVTJqSYucY0dmtTX23mUznmldef17I_3jYbErw4BKk3qEs_o6Hg6jzgTROi0XINDSLFA2BGyjiOv4r-7pownbJh3jw4Ti9kf2ccSRXVP1AO1lgD1m3hyru5qOXz0KMfIw/s640/BDFFED42-4DDF-4413-9378-9761B2321004.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Next Step is to create a new REST Resource which is done in the „Endpoints“ section</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe-KqxyjPY9vOFHX1Tzy-vGKv0jFPwptcU1cWPiViIGxOkhrkO5DS30ZZ9c_-BNjHxXBKY2rU1MQORM0C8iM323nHSBxMKaFyWu0uwNYbP1p9e2cZkUt7ajJmoesluqZOg57ld8NSVBQ/s1600/06582DE1-3FA7-47E5-A724-DDC8F75A208B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="345" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe-KqxyjPY9vOFHX1Tzy-vGKv0jFPwptcU1cWPiViIGxOkhrkO5DS30ZZ9c_-BNjHxXBKY2rU1MQORM0C8iM323nHSBxMKaFyWu0uwNYbP1p9e2cZkUt7ajJmoesluqZOg57ld8NSVBQ/s640/06582DE1-3FA7-47E5-A724-DDC8F75A208B.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Clicking on „New Resources“ creates a new form entry to fill in the „path“ and a Resource „Display Name".</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV1tux5a3oqsZtwOxnSbcZpbY4eVyr6EaisapwLZCyn27Cletw6lFjRLU90wvegSuYQDz7cFghX9jw34SQApEdcJTV5gOvDVCQM6QGdgzL8VBKc09hPQQJrDtAHA6LNmjZH2tgFnOPbg/s1600/AB8A1700-AC19-49E4-9944-EDF886629D15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="136" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV1tux5a3oqsZtwOxnSbcZpbY4eVyr6EaisapwLZCyn27Cletw6lFjRLU90wvegSuYQDz7cFghX9jw34SQApEdcJTV5gOvDVCQM6QGdgzL8VBKc09hPQQJrDtAHA6LNmjZH2tgFnOPbg/s640/AB8A1700-AC19-49E4-9944-EDF886629D15.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Having done this the desired methods (GET, PUT, POST, etc) should be defined. Click „Methods“ for that and take action form the select list of possible methods.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqohqx6-NfdPYATp1RzBx_qL_S67oVvraKo-MnDjGQm0uhAt5d0-ZO1Qh-RtPVqs8GI8gAMdNOY24glEodfgkE2uuqnFWTemDUUzjP8LJJLa7R05_H1earQXA4Qq4ajZX_4PSQlB4w7Q/s1600/3A10C9E4-EE52-4D31-B969-7475D5D45B4A.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqohqx6-NfdPYATp1RzBx_qL_S67oVvraKo-MnDjGQm0uhAt5d0-ZO1Qh-RtPVqs8GI8gAMdNOY24glEodfgkE2uuqnFWTemDUUzjP8LJJLa7R05_H1earQXA4Qq4ajZX_4PSQlB4w7Q/s320/3A10C9E4-EE52-4D31-B969-7475D5D45B4A.png" width="226" /></a></div>
<div>
<br /></div>
<div>
-</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgvoPEaaPhWUFWCiWHmzzGwWtuVejfaB1it_wHt6WBfA0A4pfBxFL9qliYWWgACX3mTLvCboGsXHyQQ8noWpgg1RSftYQUyc2EDC6e2nt6mmcUvvHNZ6ecLcS2_l-bIa1k_F8yHNDyIA/s1600/B476FEC0-E4FA-4FAB-97C7-DDE24B4C833A.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgvoPEaaPhWUFWCiWHmzzGwWtuVejfaB1it_wHt6WBfA0A4pfBxFL9qliYWWgACX3mTLvCboGsXHyQQ8noWpgg1RSftYQUyc2EDC6e2nt6mmcUvvHNZ6ecLcS2_l-bIa1k_F8yHNDyIA/s640/B476FEC0-E4FA-4FAB-97C7-DDE24B4C833A.png" width="640" /></a></div>
<div>
<br /></div>
<div>
As seen from the screenshot above you can further refine the GET method with parameters etc.</div>
<div>
In order to get a specific employee record you may want to create a „sub-resource“ wich is also supported by the MCS API Designer. Click on the ‚+‘ therefore</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsT1pgqKkyi5W9LhCHY7SfkUgZOc7MsmMSloxfqVADsjO-81DmUBPfDI2dVUYrPG_sxQFqD265FkhDnbgVCxQvanodEteU4h_15SK50tHltnnxqfwZgVRrOe3R_614-lMADnSD7mtBpw/s1600/68A4A7CF-6BAA-4069-A246-BEE79A2C0A86.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsT1pgqKkyi5W9LhCHY7SfkUgZOc7MsmMSloxfqVADsjO-81DmUBPfDI2dVUYrPG_sxQFqD265FkhDnbgVCxQvanodEteU4h_15SK50tHltnnxqfwZgVRrOe3R_614-lMADnSD7mtBpw/s320/68A4A7CF-6BAA-4069-A246-BEE79A2C0A86.png" width="320" /></a></div>
<div>
<br /></div>
<div>
The nested resource is dynamic (employee_id in this case)</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgamZd7X89Oi5wJ8_CuOV_tVbQESfKiyriQmELQ1PPP67p__m4HjYLZ07EKxF0nhr6RIIzLLmST3ng8n1A1IFNMNKhA7FTAtxauJTlnaf77cRyZzIeRHh04g_ohJgN3sNiPvMTpe3chlg/s1600/8F43FA02-77EF-4E0E-9117-435BBF38EA0A.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="257" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgamZd7X89Oi5wJ8_CuOV_tVbQESfKiyriQmELQ1PPP67p__m4HjYLZ07EKxF0nhr6RIIzLLmST3ng8n1A1IFNMNKhA7FTAtxauJTlnaf77cRyZzIeRHh04g_ohJgN3sNiPvMTpe3chlg/s640/8F43FA02-77EF-4E0E-9117-435BBF38EA0A.png" width="640" /></a></div>
<div>
<br /></div>
<div>
And of course same procedure to add methods to a nested resource</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdF3ODhbBqeTzOt581BehCp1E3smvrlSQBkIWk_2tvWayIGubypx1ridp0123jVBhOlS1YjEzPUmOAylPqp59WZ1laFU6nYSjEyM4qOEs5JdyhIH7JzxL0nvXVx-jtGhRoN-kqipvutA/s1600/37AE90FF-969D-47C9-B6D0-7BFEEB26E797.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdF3ODhbBqeTzOt581BehCp1E3smvrlSQBkIWk_2tvWayIGubypx1ridp0123jVBhOlS1YjEzPUmOAylPqp59WZ1laFU6nYSjEyM4qOEs5JdyhIH7JzxL0nvXVx-jtGhRoN-kqipvutA/s320/37AE90FF-969D-47C9-B6D0-7BFEEB26E797.png" width="259" /></a></div>
<div>
<br /></div>
<div>
See result after adding the GET method to a nested resource.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikQjtY5q7fgQM7raWvZjAXOriyiZyXRY7srZI1DIcYBx6cdnoGKE1RGdEtd74PRjZI9YZhJJSX6tL7uVZdVUo7eO_6e_AdAjs6y6JG9D7Lc6kKY-5bskkcLVBJGuCs1YaIzTtPEu9Qpg/s1600/E6868EAB-8605-4BAE-8EDB-D114FEA99333.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="328" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikQjtY5q7fgQM7raWvZjAXOriyiZyXRY7srZI1DIcYBx6cdnoGKE1RGdEtd74PRjZI9YZhJJSX6tL7uVZdVUo7eO_6e_AdAjs6y6JG9D7Lc6kKY-5bskkcLVBJGuCs1YaIzTtPEu9Qpg/s640/E6868EAB-8605-4BAE-8EDB-D114FEA99333.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Because the app developer might want to be able to implement against the new API early in development (without fully functional API service backend) you can provide some testdata in the „Responses“ tab.</div>
<div>
<br /></div>
<div>
Choose „Add Media Type“ - application/json - and paste your example/test response.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1yqC7WQjHngNX02QYnsUL9CIBluGO_Nc9mKJ3QTARU8WvNzQVz6_Fx9Ee5Hxl7eHxDzwNvFBhb5RpkV4-jx29ovSyksIXmxoqBfj0SkuhFP3rMvg26NbecO4LnydkzRXX9jJnAupBLQ/s1600/6CC5B379-4127-4749-9027-BB70398521CE.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="432" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1yqC7WQjHngNX02QYnsUL9CIBluGO_Nc9mKJ3QTARU8WvNzQVz6_Fx9Ee5Hxl7eHxDzwNvFBhb5RpkV4-jx29ovSyksIXmxoqBfj0SkuhFP3rMvg26NbecO4LnydkzRXX9jJnAupBLQ/s640/6CC5B379-4127-4749-9027-BB70398521CE.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Save your work. Click on the „Test“ Button on top-right.</div>
<div>
<br /></div>
<div>
Choose the desired resource to test. You will be prompted to fill in a sample id for „employee id“ - path parameter and associate with some mobile backend. Provide Username/Password except you configured the API for anonymous access (security tab, not covered here)</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ6EHe7ulJd4OSPpHqk0zwyzP4eTAnsPYCMSMGaNy1TvIdkEx4AwZ7Eyxph3AEBcCxQo0CRTn9JXcSxafBtsnqwNYHjv_FP_YjqglbNUdUmtQz3CKYSwa1G1QumZRTnZNQJivz02071w/s1600/51AB6D73-FF78-427C-9450-5A1880F65FFB.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="470" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ6EHe7ulJd4OSPpHqk0zwyzP4eTAnsPYCMSMGaNy1TvIdkEx4AwZ7Eyxph3AEBcCxQo0CRTn9JXcSxafBtsnqwNYHjv_FP_YjqglbNUdUmtQz3CKYSwa1G1QumZRTnZNQJivz02071w/s640/51AB6D73-FF78-427C-9450-5A1880F65FFB.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Click on „Test Endpoint“ to see the HTTP Status code + body result.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiBVbzHwprzK23yx3c5FVSfF0FaSasJq7P2TaugIcTI0iQpee1d1FC3CTIgtnp5GYKR9fUrhTa5iXqNoRJ61jl26Ni3xohwSGTcBVCKmNHE1fwksKbqo7qgMlz4C7pJE3eLR1NRv2aXw/s1600/FC47C40A-CFBA-4F9F-9558-11DC606D3E6F.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiBVbzHwprzK23yx3c5FVSfF0FaSasJq7P2TaugIcTI0iQpee1d1FC3CTIgtnp5GYKR9fUrhTa5iXqNoRJ61jl26Ni3xohwSGTcBVCKmNHE1fwksKbqo7qgMlz4C7pJE3eLR1NRv2aXw/s640/FC47C40A-CFBA-4F9F-9558-11DC606D3E6F.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
That concludes the basic steps needed to design and test a Custom API in MCS. </div>
<div>
Cool stuff!</div>
<h3>
Further Information</h3>
<div>
<ul>
<li><a href="https://apexapps.oracle.com/pls/apex/f?p=44785:265:0::::P265_CONTENT_ID:10890" target="_blank">Viewlet: Tour of API Designer</a></li>
<li><a href="http://docs.oracle.com/cloud/latest/mobilecs_gs/MCSUA/GUID-92703CA0-893D-4245-AF0E-A482886EBC95.htm#MCSUA-GUID-92703CA0-893D-4245-AF0E-A482886EBC95" target="_blank">MCS User Guide cp. 12 / Custom API Design</a></li>
<li><a href="http://docs.oracle.com/cloud/latest/mobilecs_gs/MCSUA/GUID-92703CA0-893D-4245-AF0E-A482886EBC95.htm#MCSUA3408" target="_blank">API Design Considerations</a></li>
<li><a href="http://docs.oracle.com/cloud/latest/mobilecs_gs/MCSUA/GUID-92703CA0-893D-4245-AF0E-A482886EBC95.htm#MCSUA374" target="_blank">More about RAML</a></li>
<li><a href="http://raml.org/" target="_blank">RAML -Restful Modeling Language</a></li>
</ul>
</div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-62587184935481367022015-10-04T19:32:00.000+02:002016-11-05T13:06:48.471+01:00Setting up a Mobile Backend in Oracle Mobile Cloud Service (MCS)A mobile app typically needs to access some services from the outer world. That might be some generic services for user management, storage/database, notifications, etc. (so called Platform APIs) or some business domain/app specific APIs - called Custom APIs.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8PliropwQX73Eeyb2b-3JdvNctQNdw9NqcX7dRwQF9ILOLxvco9aLUD2raF2isGKKupUjpW2ft1x2Byvzd6Jg9X8434sA7OGKo6CeHHbh4yaUio0Bp8Q9ZGB9HoRgzXkJJPm6-v3eXg/s1600/DE798E4F-A7FD-4A63-8736-45F50C23FFA4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8PliropwQX73Eeyb2b-3JdvNctQNdw9NqcX7dRwQF9ILOLxvco9aLUD2raF2isGKKupUjpW2ft1x2Byvzd6Jg9X8434sA7OGKo6CeHHbh4yaUio0Bp8Q9ZGB9HoRgzXkJJPm6-v3eXg/s640/DE798E4F-A7FD-4A63-8736-45F50C23FFA4.png" width="640" /></a></div>
<br />
<br />
In Oracle Mobile Cloud Service all services are exposed through a mobile backend. The mobile backend can be versioned and is associated with a User Realm. To access services from a mobile backend the app needs to know the unique ‚mobile-backend-id‘ and the app must be registered with the mobile backend. That registration is done in the settings of the mobile backend from within the MCS UI. So in short: the mobile backend acts as a secure container for APIs.<br />
<br />
<h3>
Creating and Configuring a Mobile Backend</h3>
Step 1: (Prerequisite) Setup User Realm with Users And Roles. Checkout the <a href="http://docs.oracle.com/cloud/latest/mobilecs_gs/MCSGU/mcs-gs-ums.html" target="_blank">Getting Started on User Management</a> or the <a href="https://www.youtube.com/watch?v=cOXFNIs_dnk" target="_blank">MCS Video on "Defining Users and Properties in Realms</a>". It is pretty straight forward. The focus in this post is on mobile backend.<br />
<br />
Step 2: In MCS goto „Development“ > Mobile Backends<br />
Click „New Mobile Backend“ to open the wizard<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_nlbAugjpxRgR3_-YuhuvUVHpUHFyAn3-fik7ljZlCrmWujaVgGRsS9idpGoqLQ5eCh_vT85OeUzCeouLYBtVERcANfA6MT8cQgBQ2Qn81DxzPGFXwlUgx2A0zMRHnVPO5EAby_RFiQ/s1600/EEE94B3B-8C51-4308-B1D0-F1CE5AFC97ED.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_nlbAugjpxRgR3_-YuhuvUVHpUHFyAn3-fik7ljZlCrmWujaVgGRsS9idpGoqLQ5eCh_vT85OeUzCeouLYBtVERcANfA6MT8cQgBQ2Qn81DxzPGFXwlUgx2A0zMRHnVPO5EAby_RFiQ/s400/EEE94B3B-8C51-4308-B1D0-F1CE5AFC97ED.png" width="400" /></a></div>
<br />
Enter a name for your backend and click „Create“.<br />
Next you will be navigated to the „Settings“-Tab of the newly created Backend.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSXShKsB3GEWhgY-_4vLoyv9lM80Fe1Kh2QJrePfCym2gh1Vi6uV-bK3z4Y2aaWFP8q-U64qTDfo-e5Vtlm2ZizicswLtjOJN-x_k_n-RJureAqf37bjrGzyji3Uhja2JCtt6oUajV9Q/s1600/B5C27D3A-AEE7-42D0-B4EC-A119BFF383B8.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSXShKsB3GEWhgY-_4vLoyv9lM80Fe1Kh2QJrePfCym2gh1Vi6uV-bK3z4Y2aaWFP8q-U64qTDfo-e5Vtlm2ZizicswLtjOJN-x_k_n-RJureAqf37bjrGzyji3Uhja2JCtt6oUajV9Q/s640/B5C27D3A-AEE7-42D0-B4EC-A119BFF383B8.png" width="640" /></a></div>
<br />
<br />
In the settings the information is displayed which is needed in order to connect an app through this mobile backend: Base URL, Backend ID, Anonymous Key (for anonymous access) and Application Key. For each registered application a new application id is generated.<br />
<br />
Step 3: Associated Mobile Backend with a user realm<br />
By default every newly created mobile backend is associated with the Default Realm. To change this open your mobile backend in MCS and goto „Users“ and Choose „Change User Realm"<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdOzi0gV9rlH25Y_FIiWASbko1KcsFFwZWqz5-xpVgZkkXSh8mELk9BvCtkJFYpdcfZHkYF2e0P-LgfOiR9QjYqj88ahduNtK9ximfxVWbapIUEPWQIY0BbKVR3WHOquK-9_vRxwX_Vw/s1600/90F3A1A9-AB3E-4FB1-842C-EE072D09DFDB.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="456" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdOzi0gV9rlH25Y_FIiWASbko1KcsFFwZWqz5-xpVgZkkXSh8mELk9BvCtkJFYpdcfZHkYF2e0P-LgfOiR9QjYqj88ahduNtK9ximfxVWbapIUEPWQIY0BbKVR3WHOquK-9_vRxwX_Vw/s640/90F3A1A9-AB3E-4FB1-842C-EE072D09DFDB.png" width="640" /></a></div>
<br />
<br />
Step 4: Add Custom APIs<br />
Open your mobile backend and goto APIs<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO69MZNbhzmx-kYB-fayvPNAwMvB3q4_GK50ZbQ-8OiMDyUskrbm0CRHW_zpurB8ocDXLpjLKPTesR6dXT8M8_LZapHzNELKRFnpQjmWygFsXZVOxX7BohOeQrpE31fEB6DfWkRetFZA/s1600/5C645245-C0B2-49C6-AD05-D30A5FC86A3C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO69MZNbhzmx-kYB-fayvPNAwMvB3q4_GK50ZbQ-8OiMDyUskrbm0CRHW_zpurB8ocDXLpjLKPTesR6dXT8M8_LZapHzNELKRFnpQjmWygFsXZVOxX7BohOeQrpE31fEB6DfWkRetFZA/s640/5C645245-C0B2-49C6-AD05-D30A5FC86A3C.png" width="640" /></a></div>
<br />
Now you can select an existing custom API or create a new API on the fly.<br />
„Select APIs“ takes you to the API Catalog to select an API<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_VejyFF6eaV9AnYicMiP6MSjMw9pXdhoQdHPBuJFx-i-GtJhVUSKEQuvQx7GHWIEeGbO8EzOIDYyhBWreZSkE90MWUcAN8IAfyWT9seyZTofHo9gx1Lzf_kgB6gQLS1tq_LB5Vafbzw/s1600/01B6931C-FBAA-4064-9635-5B9CEF63AF71.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_VejyFF6eaV9AnYicMiP6MSjMw9pXdhoQdHPBuJFx-i-GtJhVUSKEQuvQx7GHWIEeGbO8EzOIDYyhBWreZSkE90MWUcAN8IAfyWT9seyZTofHo9gx1Lzf_kgB6gQLS1tq_LB5Vafbzw/s200/01B6931C-FBAA-4064-9635-5B9CEF63AF71.png" width="200" /></a></div>
<br />
<br />
Click on the „+“ to add the API to your mobile backend. In this sample the HR API will be associated with my HR Mobile Backend.<br />
<br />
That’s all for a basic mobile backend.<br />
<br />
<h3>
Test the mobile backend</h3>
(1) Right from within MCS it is possible to make a first test on the API<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEith9DjofpozJmDv4Gun-JnZz3kiTcQzp5Plea3KF3-VwWzq0VdJKeFL_7IqrpvqGd2LMkBLFH0cb1YGWWgJlcpUG6WSFTGK7D0P_t_V5cJDmgA0GV2mpmekHkLFZI-s4Uro9vFIT11zQ/s1600/17E610EB-A57B-4E61-B32F-FE94EA0008F1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="348" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEith9DjofpozJmDv4Gun-JnZz3kiTcQzp5Plea3KF3-VwWzq0VdJKeFL_7IqrpvqGd2LMkBLFH0cb1YGWWgJlcpUG6WSFTGK7D0P_t_V5cJDmgA0GV2mpmekHkLFZI-s4Uro9vFIT11zQ/s640/17E610EB-A57B-4E61-B32F-FE94EA0008F1.png" width="640" /></a></div>
<br />
<br />
(2) Because everything in MCS mobile backend is exposed as REST service you can simply use cURL for quick tests, e.g.<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$ <span style="background-color: yellow;"><b>curl -i -u username:password -H „oracle-mobile-backend-id: c3a65860-f3a8-XYZ2-af44-061b8dc6143c" -H "Content-Type: application/json;" --request GET http://<hostname>:7201/mobile/custom/hr/employees</hostname></b></span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><b style="background-color: lime;">HTTP/1.1 200 OK</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Date: Fri, 24 Jul 2015 16:45:53 GMT</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Transfer-Encoding: chunked</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Content-Type: application/json</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Oracle-Mobile-Test: Response Generated from RAML</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">oracle-mobile-runtime-version: 15.3.3-201507070814</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">X-ORACLE-DMS-ECID: 155856d5d1d09189:53b26884:14ebd8aed21:-8000-000000000000d67e</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">X-Powered-By: Servlet/2.5 JSP/2.1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Set-Cookie: JSESSIONID=BnjQVyrB6vhWKQhsR1pYsrkbQnQXwR2ZRD5NJ5QlTWNKPhQ4hXjn!15090744; path=/; HttpOnly</span><br />
<br />
<br />
<h3>
Connect to the mobile backend</h3>
Next you can go in your mobile app development environment to code against the mobile backend. For iOS and Android there are MCS SKDs available. You can download them right from the MCS Portal. Check out the user guide how to connect with the specific SDKs (see links below).<br />
<br />
Interesting to note: For Oracle MAF no special MCS SDK is available. But stay tuned - there will be some MAF MCS Utilities available shortly with support for MCS. Further more there is an MCS SDK for Xamarin which is great news. Checkout the <a href="https://components.xamarin.com/view/oraclemcs" target="_blank">Xamarin Oracle Mobile Cloud Service SDK 1.0</a>. It shows the MCS might have a bright future for enterprise mobile backends. I hope to see it!<br />
<br />
What's next? Design and Implementation of Custom APIs for the "mobile service developer" and consuming the Services for the "mobile app developer".<br />
<br />
<h3>
Further information</h3>
<br />
<ul>
<li><a href="http://docs.oracle.com/cloud/latest/mobilecs_gs/MCSUA/GUID-2E3B0B63-6DE6-4CF8-9FC1-BCA6F4EF4F7E.htm#MCSUA-GUID-2E3B0B63-6DE6-4CF8-9FC1-BCA6F4EF4F7E" target="_blank">Mobile Cloud Service User Guide: -3 Mobile Backends</a></li>
<li><a href="https://www.youtube.com/watch?v=GuHY3qvZZIs" target="_blank">YouTube: MCS 05. A Mobile Backend Overview</a></li>
<li><a href="https://www.youtube.com/watch?v=35heHd8Psko" target="_blank">YouTube: MCS 07. Testing Mobile Backends</a></li>
<li><a href="http://docs.oracle.com/cloud/latest/mobilecs_gs/MCSUA/GUID-B9B3FEB0-7B52-4691-B410-4D8DF70D7933.htm#MCSUA-GUID-B9B3FEB0-7B52-4691-B410-4D8DF70D7933" target="_blank">Mobile Cloud Service User Guide: Connect to mobile cloud service with Android SDK</a></li>
<li><a href="http://docs.oracle.com/cloud/latest/mobilecs_gs/MCSUA/GUID-0593D33E-1826-4460-BDD9-63A5AAE551B7.htm#MCSUA-GUID-0593D33E-1826-4460-BDD9-63A5AAE551B7" target="_blank">Mobile Cloud Service User Guide: Connect to mobile cloud service with iOS SDK</a></li>
<li><a href="https://components.xamarin.com/view/oraclemcs" target="_blank">Xamarin Oracle Mobile Cloud Service SDK 1.0</a></li>
</ul>
<br />
<br />Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-64940550107548350842015-07-23T02:08:00.001+02:002015-07-24T19:33:58.639+02:00Getting Started with Oracle Mobile Cloud Service (MCS)Mobile Application Development is often reduced to the tasks needed for implementing an app using some mobile framework like iOS, Android, Oracle MAF or some other hybrid framework. In reality there is a lot more work to do for making a mobile to work: manage user access, creating services, handle push notifications, monitor usage, etc etc.<br />
<br />
<a href="http://cloud.oracle.com/mobile" target="_blank">Oracle Mobile Cloud Service (MCS)</a> provides a central cloud service for developing, deploying, maintaining, monitoring, and analyzing your mobile apps. From the architecture perspective it looks like the following<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk94MOLnPSXO8tX7vcIE5kaoBdUfwbm-othB4Q2TFOxuJc2f8qzDC2cv5GTMirt5PdqvlToRqqXSBDsHUc_hWammIDOHiE5McFzlx-1VpWhs9UjeLZ0xNz96nZoIAkz4o27ccKuh8Lag/s1600/71361340-2867-48A7-AC46-48F7CF9E090F.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="305" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk94MOLnPSXO8tX7vcIE5kaoBdUfwbm-othB4Q2TFOxuJc2f8qzDC2cv5GTMirt5PdqvlToRqqXSBDsHUc_hWammIDOHiE5McFzlx-1VpWhs9UjeLZ0xNz96nZoIAkz4o27ccKuh8Lag/s640/71361340-2867-48A7-AC46-48F7CF9E090F.png" width="640" /></a></div>
<br />
<br />
To get started check out the <a href="https://www.youtube.com/playlist?list=PL2ux0DjE-RYey0XMkraERMKoXpKxZVwIo" target="_blank">MCS Introduction video from the Oracle Mobile Youtube Channel</a>.<br />
<br />
In the next posts I am going to show some of the features and how to work with Oracle Mobile Cloud Service. Stay tuned!<br />
<br />
To get started smoothly I have put together the most useful content around Mobile Cloud Service.<br />
<br />
<b>Useful Learning Resources</b><br />
<br />
<ul>
<li><a href="https://www.youtube.com/user/OracleMobilePlatform" target="_blank">Oracle Mobile Platform Youtube Channel</a></li>
<li><a href="https://apexapps.oracle.com/pls/apex/f?p=44785:2:104390759825187:::2,CIR,RIR:P2_PRODUCT_ID,P2_PRODUCT_ID2,P2_RELEASE_ID:3277,3527," target="_blank">Oracle Learning Library: Video Introduction and Tutorials</a></li>
</ul>
<br />
<br />
<b>Documentation</b><br />
<br />
<ul>
<li><a href="https://docs.oracle.com/cloud/latest/mobilecs_gs/index.html" target="_blank">Mobile Cloud Service User Guide</a></li>
<li><a href="https://docs.oracle.com/cloud/latest/mobilecs_gs/MCSRA/mcs-api-reference.html" target="_blank">Mobile Cloud Service REST API Reference</a> </li>
</ul>
<br />
<br />
<b>Tutorial</b><br />
<br />
<ul>
<li><a href="https://docs.oracle.com/cloud/latest/mobilecs_gs/index.html" target="_blank">Mobile Cloud Service - Getting Started Tutorials</a></li>
<li><a href="http://www.oracle.com/webfolder/technetwork/tutorials/cloud/ocms/OCMS_MBE_OBE_tutorial.html" target="_blank">OBE MCS Tutorial</a></li>
<li><a href="http://www.oracle.com/webfolder/technetwork/tutorials/cloud/ocms/files/mcs_materials.zip" target="_blank">OBE MCS Tutorial Files</a></li>
</ul>
<br />
<br />Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-73272518033075241282015-05-15T18:56:00.000+02:002015-05-15T18:56:26.327+02:00ADF DVT NBox visualisation component in ADF 11.1.1.9With the arrival of ADF 11.1.1.9 a new visualisation component is included. The NBox.<br />
<blockquote class="tr_bq">
"The ADF NBox is an interactive data visualization tool that allows users to view data displayed in a grid across two dimensions, each dimension representing a range of data. Customizable nodes representing data items are displayed in the cells formed by the intersection of the two dimensions." (Source: Oracle Documentation)</blockquote>
I never heard of the NBox before so I had to give it a try. I am quite impressive so far! Take a look<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHUK_13vwET6la5ZURqeDDhxtsIrZ93KvrJQPpNAeu3R9oKxQt7TVubcXPRNIxHbJ5ZHUeiGHvLxI9y6-hNWrziqTgKvE0vQEEA7yW1wVamBhWNzz-eXWsb3fRTukuxnHAE_Z2Pluv1A/s1600/1A13EEE1-06A4-49C7-898A-51D8DB615ADC.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHUK_13vwET6la5ZURqeDDhxtsIrZ93KvrJQPpNAeu3R9oKxQt7TVubcXPRNIxHbJ5ZHUeiGHvLxI9y6-hNWrziqTgKvE0vQEEA7yW1wVamBhWNzz-eXWsb3fRTukuxnHAE_Z2Pluv1A/s400/1A13EEE1-06A4-49C7-898A-51D8DB615ADC.png" width="400" /></a></div>
<br />
<h3>
Use Case Description</h3>
In my sample for the NBox component I would like to display Employees on the dimensions „Origin“ (Country) and „Income“ (Salary).<br />
<br />
<h3>
How To</h3>
Step 1: Create a Read-Only ViewObject on the HR.EMP_DETAILS_VIEW Database View. That View includes all needed data for the use case. Nothing special here. So I am not going into details.<br />
<br />
Step 2: Create a transient attribute to calculate the salaryLevel (lower, middle, upper - so that’s just my simple idea to divide Employees into 3 Salary-Groups so to say). I am doing this by a groovy expression: "<span style="font-family: Courier New, Courier, monospace;"><b>Salary < 5000.0 ? 'lower' : (Salary < 10000.0 ? 'middle' : 'upper‘)</b></span>"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzdASvTjJ-TQkFEZGcnsyO0y7EKyKD-Fa4gmlYFmVcNeN9INmTgrrReEJruIPweq0tAfyDp_9RPBiK_ZSvdiiqyx4qblmEcwjVGRWfOKk5LvDz_MIbR5uj_V8Yq785snyiTSrWDP7S4A/s1600/34EB7A34-845B-4F67-87B3-02624ACEFF5E.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzdASvTjJ-TQkFEZGcnsyO0y7EKyKD-Fa4gmlYFmVcNeN9INmTgrrReEJruIPweq0tAfyDp_9RPBiK_ZSvdiiqyx4qblmEcwjVGRWfOKk5LvDz_MIbR5uj_V8Yq785snyiTSrWDP7S4A/s400/34EB7A34-845B-4F67-87B3-02624ACEFF5E.png" width="400" /></a></div>
<br />
<br />
Step 3: Create transient attribute to calculate an CountryDiscriminator. My idea here is to categorize every employee by the following Country-groups: US, UK and „Others“. To achieve that I am using the following groovy expression: "<span style="font-family: Courier New, Courier, monospace;"><b>CountryId in ['US', 'UK']?CountryId:’OTHER'</b></span>"<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4LPRocoJ0AyjWtXt6nEIr7LCfE2fBi-mxrtEiv91HBrTSCVKJrosKlrj2rsBoYLiBoi4nNt71DnFGs_YbA9RyYdGIu93yxN8NrMn48I0kH1Rvf4DnCPsetXPRY3az6pz-n6_F_wByXA/s1600/A37EB88F-8C42-4770-A5C9-34DD772D39E4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="123" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4LPRocoJ0AyjWtXt6nEIr7LCfE2fBi-mxrtEiv91HBrTSCVKJrosKlrj2rsBoYLiBoi4nNt71DnFGs_YbA9RyYdGIu93yxN8NrMn48I0kH1Rvf4DnCPsetXPRY3az6pz-n6_F_wByXA/s400/A37EB88F-8C42-4770-A5C9-34DD772D39E4.png" width="400" /></a></div>
<br />
<br />
That’s all you need on the model side. The rest is done on the UI Layer.<br />
<br />
Step 4: Open the „Data Controls“ palette and drag&drop the Collection „EmpDetailsView1“ onto the view (JSPX). Choose NBox from contextual menu.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI3nxV4TQQ4ojorZNa0Z5HrLeflTVqh-Qa4HmYTK8ftwgZev39pREVrUD1OxPwPeK-fM1s55LGvOEGG_rqPUCnIFBk-5Im6iSiLyU3KTzXy1QOW5rDmee0VML0WfPwX7SmgIhw-W8Rzg/s1600/614B446F-2936-46E9-8255-FD6745D01816.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI3nxV4TQQ4ojorZNa0Z5HrLeflTVqh-Qa4HmYTK8ftwgZev39pREVrUD1OxPwPeK-fM1s55LGvOEGG_rqPUCnIFBk-5Im6iSiLyU3KTzXy1QOW5rDmee0VML0WfPwX7SmgIhw-W8Rzg/s400/614B446F-2936-46E9-8255-FD6745D01816.png" width="400" /></a></div>
<br />
<br />
Dialog opens to configure the Rows und Columns. Enter the column und row numbers, assign values and labels. In this example there are exactly 3 rows and 3 columns. The values should exactly match your values from the transient attributes.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj43g7sj4-aeLVQ8hNIqI1WSv23YFfbzYEnq2t2s8gS5urSBQKu42mmVHCme8GjeGtuR9Ei2qr2sph12x-LeghrpL0W-YHFKpRFmlXop0aRVxPwmJcXek2bNApu2baSev9PD-HMJ4AjxQ/s1600/7E965F16-1A2C-499F-942C-8A32F3146FEF.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj43g7sj4-aeLVQ8hNIqI1WSv23YFfbzYEnq2t2s8gS5urSBQKu42mmVHCme8GjeGtuR9Ei2qr2sph12x-LeghrpL0W-YHFKpRFmlXop0aRVxPwmJcXek2bNApu2baSev9PD-HMJ4AjxQ/s400/7E965F16-1A2C-499F-942C-8A32F3146FEF.png" width="400" /></a></div>
<br />
<br />
Click: Next<br />
<br />
The NBoxes nodes are going to be „Employee Names“ Each node will be stamped by the SalaryLevel (for income dimension) and CountryDiscriminator (for origin dimension)<br />
<br />
In the Node-tab define the grouping by „JobTitle“. Choose color as Node classifier.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0xGf1sPplHaG8EI05eOQ13yq64W-HH8Ocg3hGmdZO3fGxkaFBurr-_IYPefNdMuF3yezGuw7iycQdCrbATvWptYJLRTLj5d7JtS_WXHQn9dGD8WUasdwPC9xdWFZrE3YI_CUO_aKXXg/s1600/A20BE584-FF67-4A37-9ED8-A4911A693327.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="257" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0xGf1sPplHaG8EI05eOQ13yq64W-HH8Ocg3hGmdZO3fGxkaFBurr-_IYPefNdMuF3yezGuw7iycQdCrbATvWptYJLRTLj5d7JtS_WXHQn9dGD8WUasdwPC9xdWFZrE3YI_CUO_aKXXg/s400/A20BE584-FF67-4A37-9ED8-A4911A693327.png" width="400" /></a></div>
<br />
<br />
Click Tab: Indicator<br />
Define the grouping by ‚DepartmentId“. Choose „Shape“ as indicator. (color is already used for the Job title classification)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge7-mFzpULLrWsgU-09MWAv35btRgqt6I-8SdYPDdK6k7O1LHudqDCWBnBUeoawrIbvL8LWQpY2SHV5yYJ93qPN2HhCZROds5_56qDPT37TPgcOXEE_LvvueLGgLoWZ3mAoJoe7PgTBQ/s1600/6CC7D458-BD1C-481A-AFD5-3EC5FCC272E8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="102" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge7-mFzpULLrWsgU-09MWAv35btRgqt6I-8SdYPDdK6k7O1LHudqDCWBnBUeoawrIbvL8LWQpY2SHV5yYJ93qPN2HhCZROds5_56qDPT37TPgcOXEE_LvvueLGgLoWZ3mAoJoe7PgTBQ/s400/6CC7D458-BD1C-481A-AFD5-3EC5FCC272E8.png" width="400" /></a></div>
<br />
<br />
Click: Finish-Button<br />
<br />
The generated JSPX code will look like the following snippet. The data is bound against a tree binding.<br />
<br />
<script src="https://gist.github.com/multikoop/d9767d65a9740239b1a0.js"></script><br />
<br />
<h3>
Conclusion</h3>
The NBox component is quite rich. With some basic understanding it is very easy to transform data into meaningful and easy to read information! Beyond the given use case there are a lot more ways to visualize data. It’s worth to take a look into the documentation. Have fun!<br />
<br />
<h3>
Download Sourcecode</h3>
<a href="https://github.com/enpit/enpit.sample.adf.nbox">https://github.com/enpit/enpit.sample.adf.nbox</a><br />
<br />
<h3>
Further Information</h3>
From ADF Web UI Guide 11.1.1.9<br />
- 23.2.3 NBox Use Cases and Examples<br />
- 26 Using NBox Components<br />
<br />
From ADF Fusion Developer Guide 11.1.1.9<br />
- 26.5 Creating Databound NBoxes<br />
<br />
<h3>
Issues</h3>
(1) As you can see from the screenshot of the „Create NBox“ dialog the „Next“-Button is disabled although everything required is filled in. The Button gets enabled once you click in some of the cells.<br />
(2) In the second step of the „Create NBox“ sample the „Back“-Button is disabled although there is no reason. Workaround: fill in both required fields Row/ Column. Then the Back-Button gets enabled.Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-59030015581524412332015-04-21T00:27:00.001+02:002015-04-21T00:27:41.070+02:00Java Cloud Service Webcast on April 24th 2015<div class="p1">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnM9vHYUHHngWYdyUYZKPV8W6IwPGmjwpJS30AAGR9IIlbXrwj2s-WFGvKAFx6iS7q0qIWVJP6fzYPMw4BC0VuHPuP46p-QZannZA-Qbb3m6LLpT1Lsj4sUSfsAcKK8DBedmATtNiQNw/s1600/Bildschirmfoto+2015-04-20+um+23.08.27.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnM9vHYUHHngWYdyUYZKPV8W6IwPGmjwpJS30AAGR9IIlbXrwj2s-WFGvKAFx6iS7q0qIWVJP6fzYPMw4BC0VuHPuP46p-QZannZA-Qbb3m6LLpT1Lsj4sUSfsAcKK8DBedmATtNiQNw/s1600/Bildschirmfoto+2015-04-20+um+23.08.27.png" height="128" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">[Source: Oracle]</td></tr>
</tbody></table>
<span class="s1">Oracle Java Cloud Service is a part of the platform service offerings in Oracle Public Cloud Services. Powered by Oracle WebLogic Server, it provides a platform for developing and deploying new or existing Java EE applications.</span></div>
<div class="p1">
<br /></div>
<div class="p1">
<span class="s1">Schedule: April 24</span><span class="s2"><sup>th</sup></span><span class="s1"> 2015 15:00-16:00 CET (Berlin time)</span></div>
<div class="p2">
<span class="s3">Presenters: <span class="s4"><a href="http://https/ro.linkedin.com/in/cosmintudor">Cosmin Tudor</a> and</span> <a href="https://www.linkedin.com/in/kress"><span class="s4">Jürgen Kress</span></a></span></div>
<div class="p2">
<span class="s3">Registration: <a href="http://w.on24.com/r.htm?e=981008&s=1&k=E5C9328823CA56BB48AE71246B621A8E"><span class="s4">register here</span></a></span></div>
<div class="p1">
<br /></div>
<div class="p1">
<span class="s1">In this webcast Cosmin & Jürgen will provide both an overview presentation and a short demo that will cover the new Oracle Java Cloud Services - Platform as a Service offerings and the integration with other Oracle Cloud offerings like: Developer Cloud Services, Database Cloud Services, Documents Cloud Services ...</span></div>
<div class="p1">
<span class="s1"><br /></span>
In about <b>1 hour</b> the following topics will be covered:</div>
<ul class="ul1">
<li class="li1"><span class="s1">Java Cloud Services:</span></li>
<ul class="ul2">
<li class="li1"><span class="s1">Java Cloud Services PaaS and PaaS – Virtual Image</span></li>
<li class="li1"><span class="s1">Java Cloud Services SaaS Extensions</span></li>
<li class="li1"><span class="s1">Management and Administration:</span></li>
<ul class="ul3">
<li class="li1"><span class="s1">Provisioning</span></li>
<li class="li1"><span class="s1">Backup and Recovery</span></li>
<li class="li1"><span class="s1">Patching</span></li>
<li class="li1"><span class="s1">Scaling</span></li>
<li class="li1"><span class="s1">REST API</span></li>
</ul>
<li class="li1"><span class="s1">Coherence Cloud Services</span></li>
<li class="li1"><span class="s1">Storage Cloud Services</span></li>
<li class="li1"><span class="s1">Compute Cloud Services</span></li>
</ul>
<li class="li1"><span class="s1">Developer Cloud Services</span></li>
<li class="li1"><span class="s1">Database Cloud Services</span></li>
</ul>
<div class="p1">
<br /></div>
<div class="p2">
Looking forward to it! Hope to see you in the webcast!<br />
<br /></div>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-23101707128482260882015-03-08T22:45:00.001+01:002015-03-08T22:51:26.488+01:00#ofmForum 2015 in Budapest has rocked!Last week I attended the <a href="http://www.tinyurl.com/ofmForum2015" target="_blank">Oracle Fusion Middleware Partner Community Forum 2015</a> in Budapest. Over 150 participants from Europe, US and even Latin America (Peru, Costa Rica, Mexico, Venezuela) joined the great event where various Oracle Product Managers and Oracle Partners exchanged their experiences with the community. Jürgen Kress - well known from his <a href="https://soacommunity.wordpress.com/" target="_blank">soacommunity</a> & <a href="http://weblogiccommunity.com/" target="_blank">weblogiccommunity</a> blogs - and his team hosted a great event at a <a href="http://budapest.boscolohotels.com/de/" target="_blank">great location</a>! Thanks a lot!<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVx5om-JICB6NxgEdFY1q3eRMIumtdZ8eDWCC6PcIO9Q4ss36Ac5iGTMOPCdzN4BkvrfG7eZiY-cxTfjsf1A2uz49pFDxm_m8Hy6oaiqKsvOKiJjRLOcYlSAfSHVgb1Xr7DOcIP4elTQ/s1600/IMG_6127.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVx5om-JICB6NxgEdFY1q3eRMIumtdZ8eDWCC6PcIO9Q4ss36Ac5iGTMOPCdzN4BkvrfG7eZiY-cxTfjsf1A2uz49pFDxm_m8Hy6oaiqKsvOKiJjRLOcYlSAfSHVgb1Xr7DOcIP4elTQ/s1600/IMG_6127.JPG" height="300" width="400" /></a></div>
<h3>
</h3>
<h3>
The Digital Transformation is just starting</h3>
We got an update about Oracles overall cloud & mobile strategy that drives the digital transformation. Nowadays there is a huge demand on business agility due to disruptive technologies and market shifts. <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDM8QV437gzUL2NyMLoEzkY4q3ZTgTtM3Lr-l6FrvTFyB9ryV5kcFUFUxPaoxzs2aRJ8mkxCsuCMKjQGxXQu7HtyyfrVeNyxqlkH6bG9y__WTbSCun5tzvJ8jHKA3dTBCLtLnzhfvcWA/s1600/IMG_6030.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDM8QV437gzUL2NyMLoEzkY4q3ZTgTtM3Lr-l6FrvTFyB9ryV5kcFUFUxPaoxzs2aRJ8mkxCsuCMKjQGxXQu7HtyyfrVeNyxqlkH6bG9y__WTbSCun5tzvJ8jHKA3dTBCLtLnzhfvcWA/s1600/IMG_6030.JPG" height="300" width="400" /></a></div>
<br />
Oracles answer to these requirements are the upcoming Cloud Services<br />
<br />
<ul>
<li>Integration Cloud Service (ICS)</li>
<li>Process Cloud Service (PCS)</li>
<li>Mobile Cloud Service (MCS)</li>
</ul>
<div>
and SaaS solutions running on Oracles PaaS (Database Cloud Service, Java Cloud Service). The main focus for the upcoming releases for Oracle SOA/BPM/ACM 12c is on stability & improvements.</div>
<div>
<br /></div>
<div>
The nice thing about the ofmForum is that there wasn't just slides but on the most products real working demos. On day 2 there were 3 parallel tracks dedicated for SOA, BPM/ACM and WebLogic&Mobile. The experts gave demos on API Catalog, API Manager, StreamExplorer, Event Processing, Mobile Alta UI & OSB Integration for SOAP to REST transformations, MAF, ICS, PCS, MCS and the Java Cloud Service (JCS) plus Developer Cloud Service. Really a lot of new acronyms to learn ;)</div>
<div>
<br /></div>
<div>
Day 3/4 was dedicated to 4 parallel Workshops with a lot of hands-on sessions. (SOA, BPM/ACM, Mobile Application Framework (MAF), Multichannel Enablement). I attended the Multichannel workshop. Based on an existing SOAP-Webservice we used OSB 12c to transform it (without coding) to a REST JSON based service. On top of that we built a mobile app with MAF. In the end I had a running MAF application on my real iOS device.</div>
<h3>
<br /></h3>
<h3>
Networking & Get-together</h3>
<div>
Besides the cool and new technologies there were a lot of chances to network and get in touch with Oracle Product Managers and Partners. I enjoyed it a lot meeting persons I only knew from twitter or blogs. Thanks for all the great conversations! Further, Budapest is an amazing city! Good food, wine & bars and historical locations. Thanks Jürgen and Oracle for the nice dinner in the <a href="http://www.spoonrestaurants.hu/" target="_blank">spoon restaurant</a>. And if you are in Budapest check out the <a href="http://www.tripadvisor.de/Attraction_Review-g274887-d668397-Reviews-Szimpla_Kert-Budapest_Central_Hungary.html" target="_blank">Simpla Kertmozi</a>, a pretty cool "ruin bar":)</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<br /></div>
<div>
I am really looking forward for the next OFM Forum 2016. Which location will be next?</div>
<div>
<br /></div>
<h3>
Further information</h3>
<div>
See more cool pictures of the event in the twitter stream <a href="https://twitter.com/hashtag/ofmForum" target="_blank">#ofmForum</a></div>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-69597386225287808882015-02-25T00:47:00.000+01:002015-02-25T00:47:05.405+01:00Oracle ACE Director Confirmation and Fusion Middleware Forum 2015 in Budapest<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggxWeBWoIoPCOaJQWJq9HBim98YT1Dx4SwTl_WO1OWZYsEgOl1ikP_wrvRt37tMpZpxsV9cxI-ruUwbU1giZSwMSyJD5fXhmi05tJGehFj9YuZzhwS_utpy9M44pBqBju6uJb62DBksQ/s1600/2015-01-ak-ace.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggxWeBWoIoPCOaJQWJq9HBim98YT1Dx4SwTl_WO1OWZYsEgOl1ikP_wrvRt37tMpZpxsV9cxI-ruUwbU1giZSwMSyJD5fXhmi05tJGehFj9YuZzhwS_utpy9M44pBqBju6uJb62DBksQ/s1600/2015-01-ak-ace.jpg" height="300" width="400" /></a>I am happy to say having been nominated as Oracle ACE Director and being accepted lately. Big thanks to the ACE Program and everyone who was involved and made this happen. I feel really honoured! It motivates me to participate and contribute more with the community.<br />
<br />
It is challenging doing the daily business, taking time for conferences, writing blog posts, sharing Oracle FMW Content through social media channels, enjoying free time with family, etc. Anyway whenever time permits I will try to continue with content contribution for Oracle ADF, WebCenter, WebLogic, Cloud Services, MAF! Hope you enjoyed my existing posts so far and will enjoy it in future :) @oracleace thanks for the nice welcome gifts!<br />
<br />
<br />
<a href="https://apex.oracle.com/pls/apex/f?p=19297:4:108433313279073::NO:4:P4_ID:11500" target="_blank">Find my ACE Profile page here.</a><br />
<br />
<br />
<h3>
Oracle Fusion Middleware Forum 2015</h3>
This year I am going to attend the annual OFM Forum in Budapest with lots of great presentations and Hands-On. It is organized by the SOA Community (led by Jürgen Kress). I am looking forward to meet with the community and see what Oracle plans for the upcoming FMW & Cloud Services.<br />
<br />
SOA Suite 12c & Integration Cloud Service<br />
BPM Suite 12c & Process Cloud Service<br />
Mobile & Development tools & Mobile Cloud Service<br />
WebLogic 12c & Java Cloud & Developer Cloud Service<br />
<br />
<br />
There are 6 days left to register ;)<br />
March 3-4, 2015, 10:30 AM - 5:00 PM<br />
<a href="http://www.tinyurl.com/ofmForum2015" target="_blank">Check out the Agenda and Registration!</a><br />
<br />
<br />
<h3>
More Information</h3>
<br />
<ul>
<li><a href="http://www.oracle.com/technetwork/community/oracle-ace/index.html" target="_blank">Oracle ACE Program</a></li>
<li><a href="http://www.tinyurl.com/ofmForum2015" target="_blank">Oracle Fusion Middleware Forum 2015</a></li>
</ul>
<br />
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-9775411557453629722015-01-25T15:54:00.004+01:002015-01-25T15:54:48.353+01:00ADF 12c Deck component Overview & Programmer examplesThis year the german ADF Community resumed with "ADF Spotlight" - a series of 30 min Webcasts. It was my turn to give use cases and a programmers overview for the ADF 12c deck component. Since I like to share with the international community I made an english version of the few slides.<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/43872961" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="425"> </iframe><br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://de.slideshare.net/multikoop/adf-spotlight-adf-12c-deck-component-overview-and-progammer-examples" target="_blank" title="ADF Spotlight: ADF 12c Deck component overview and progammer examples">ADF Spotlight: ADF 12c Deck component overview and progammer examples</a> </strong> from <strong><a href="https://www.slideshare.net/multikoop" target="_blank">Andreas Koop</a></strong> </div>
<br />
<a href="https://app.box.com/s/bbsp4zwq3v6mn67bf9ftsffo2h5325fr" target="_blank">Download Sample: enpit.sample.adf1213.deck-jdev1213-v2.zip</a> (It contains the use case for Image -> Detail and Slideshow)<br />
<h3>
Further information</h3>
<br />
<ul>
<li><a href="https://docs.oracle.com/middleware/1213/adf/tag-reference-faces/tagdoc/af_deck.html" target="_blank">ADF 12.1.4 Deck TagLibrary Documentation</a></li>
<li><a href="http://andrejusb.blogspot.de/2014/12/custom-adf-application-with-new-adf-12c.html" target="_blank">ADF Deck in a grid (WorkBetter Sample)</a></li>
</ul>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-8269118662279213212014-11-16T20:07:00.002+01:002014-11-16T20:49:17.271+01:00Create RESTful Services and deploy to Oracle Java Cloud Service with Netbeans<div class="">
In preparation to one of my DOAG 2014 talks „Java WebApps and Services in Oracle Cloud" I created a new trial account for Oracle Java Cloud Service (<a class="" href="http://cloud.oracle.com/">http://cloud.oracle.com</a>) two weeks ago. Now was the time to create a RESTful Service and deploy it to the cloud and make it accessible to public. </div>
<div class="">
<br class="" /></div>
<div class="">
Last time I tried the Oracle Cloud I used exclusively JDeveloper, this time I made my experience with Netbeans. From my point of view Netbeans has pretty good support for generating RESTService from Database tables. In a couple of minutes it is possible to create CRUD Operations and make it accesible by a REST endpoint. No matter what content type you prefer, by using JAXB XML and JSON content types are both automatically available. </div>
<div class="">
<br class="" /></div>
<b class="">Prerequites</b><br />
<div class="">
Step 1: Create an Oracle Java Cloud Service trial account (fee less for 30 days) </div>
<div class="">
<span class="" style="font-family: Arial;">Step 2: Download and install Netbeans Version 8.01 (<a class="" href="http://www.netbeans.org/">http://www.netbeans.org</a>)</span><br />
<div class="" style="font-family: Arial;">
Step 3: Make sure to install the Oracle Cloud plugin (1.5) in Netbeans </div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH3xRc4FhV5N49TSR0WGyuAn5xaXWgPDGBacx3S1EEGeM8I6rq7vo1bkakBBKH0jjfw4YBLX8oSCoboexgQj8IZMFwQ5bYtg5vyBpXl_rD71xDjPeCMB5zbAGgotddW_EoWKsJeERehw/s1600/fe100c2077f42ec9e642b05eb2e480b4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH3xRc4FhV5N49TSR0WGyuAn5xaXWgPDGBacx3S1EEGeM8I6rq7vo1bkakBBKH0jjfw4YBLX8oSCoboexgQj8IZMFwQ5bYtg5vyBpXl_rD71xDjPeCMB5zbAGgotddW_EoWKsJeERehw/s1600/fe100c2077f42ec9e642b05eb2e480b4.png" height="110" width="400" /></a></div>
</div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
Step 4: Download and Install (just unpack) Oracle Java Cloud Service - Saas Extension SDK (release 14.1.12.0 Find it here: <a class="" href="http://www.oracle.com/technetwork/middleware/weblogic/downloads/java-cloud-sdk-1848874.html">http://www.oracle.com/technetwork/middleware/weblogic/downloads/java-cloud-sdk-1848874.html</a>) </div>
<div class="" style="font-family: Arial;">
Step 5: Next add your Oracle Cloud account as Cloud Provider to Netbeans (Goto „Services" Tab and provide your cloud account details) </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG5Reek9I19igINpZqL-1MqIILJ9M7tM0sv8l8JG-ufN1Wkjvs_sHhjn3cGqC5RlC0iYxnX3bk9wwQWLtAELUPmceDyEu4auIN7yZt4MDl2vzgfKercq12QmQccri7ibOlRle-jsQwqA/s1600/ebedd28efd9f602167fde1607f7a3e02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG5Reek9I19igINpZqL-1MqIILJ9M7tM0sv8l8JG-ufN1Wkjvs_sHhjn3cGqC5RlC0iYxnX3bk9wwQWLtAELUPmceDyEu4auIN7yZt4MDl2vzgfKercq12QmQccri7ibOlRle-jsQwqA/s1600/ebedd28efd9f602167fde1607f7a3e02.png" height="226" width="400" /></a></div>
</div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
Step 6: Add a WebLogic Service Instance under ‚Services Tab', so you are able to test the RESTService locally prior to deploying to Oracle Cloud. (I am not going into detail in this post for that task) </div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
Step 7: Make sure to deploy your DB Schema objects plus data into Oracle Database Cloud Service (when subscribing to Java Cloud Service you will get the DB Service as well). See in my previous posts for more details. </div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
<b class="">HowTo develop RESTService with Netbeans</b></div>
<div class="" style="font-family: Arial;">
Everything is setup for cloud deployment. Now let's create a simple REST-Service on top of the HR DB Tables EMPLOYEES and DEPARTMENTS. </div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
Step 1: Start Netbeans, Create new Project Wizard from Type „Maven / Web Application" </div>
<div class="" style="font-family: Arial;">
Step 2: Enter your desired groupId, ArtefactId etc. </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjjalJ6pM_cHWMsXt9lhdXjTxGISnczFXy8XBUwZl9j8zXBAro6F2uevOr5hurK50yvDEIND5FwEEfu7xsZ1dFcvVuhHY032EeFO4lXVqiaZJwfAz3JsC-5ERSNWNoIUpbnjxgvn8pbw/s1600/e08c4645008ac7789a9e8f90edfe48a6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjjalJ6pM_cHWMsXt9lhdXjTxGISnczFXy8XBUwZl9j8zXBAro6F2uevOr5hurK50yvDEIND5FwEEfu7xsZ1dFcvVuhHY032EeFO4lXVqiaZJwfAz3JsC-5ERSNWNoIUpbnjxgvn8pbw/s1600/e08c4645008ac7789a9e8f90edfe48a6.png" height="171" width="400" /></a></div>
<br /></div>
<div class="" style="font-family: Arial;">
Step 3: Choose Oracle WebLogic as ‚Server' and Java EE Version 5. </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhme4CmStajivszXzFZijknQIvfuYVu-HYZcTQ7knNZvES4OZCAuKa4mKxSPQQn5sda2v4TlWQu0it6iJejJkRdhZE_P9PRmrRGVNYnkTWoBkfQWi9k-nHaEpTcbT9hbroqqmUauvJkbw/s1600/c1ba05dc17f3b684cbfe9eb2de35fd58.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhme4CmStajivszXzFZijknQIvfuYVu-HYZcTQ7knNZvES4OZCAuKa4mKxSPQQn5sda2v4TlWQu0it6iJejJkRdhZE_P9PRmrRGVNYnkTWoBkfQWi9k-nHaEpTcbT9hbroqqmUauvJkbw/s1600/c1ba05dc17f3b684cbfe9eb2de35fd58.png" height="81" width="400" /></a></div>
<br /></div>
<div class="" style="font-family: Arial;">
Click Finish. </div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
Step 3: Start „RESTFul Services from Database" Wizard </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj95W1v85MO1dIKhchktUd-WWDCR949x_H2D6EyOW9-VELwCaS-Wn_PfO9m87HOYdFPt9WvV1Yz-CwepERJz-FIHQSABAhFY7LsrBcfo-IsOCxeD3ZTtXGwIlC3dqm1-WQ6wNsV9xyISg/s1600/a43646ea935392e1eb5442588a264591.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj95W1v85MO1dIKhchktUd-WWDCR949x_H2D6EyOW9-VELwCaS-Wn_PfO9m87HOYdFPt9WvV1Yz-CwepERJz-FIHQSABAhFY7LsrBcfo-IsOCxeD3ZTtXGwIlC3dqm1-WQ6wNsV9xyISg/s1600/a43646ea935392e1eb5442588a264591.png" height="40" width="400" /></a></div>
<br /></div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
Step 4: Make a connection to your local database and select the desired Tables. </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXAlrUQtWGPFvTqdLovRCO-Mjpv8d7zSyfJzGBeoMNerSkkPrR4EAeyrt59opnTdHzUPsyIq3U3k_8PpJlxZrsDuyewZ-i-HDNoH5S8unQHNbl1Ti_NSILyfkV3fiKMBw0Vye2clB-YQ/s1600/d5a4d1a6749424fd851b89beaf36b285.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXAlrUQtWGPFvTqdLovRCO-Mjpv8d7zSyfJzGBeoMNerSkkPrR4EAeyrt59opnTdHzUPsyIq3U3k_8PpJlxZrsDuyewZ-i-HDNoH5S8unQHNbl1Ti_NSILyfkV3fiKMBw0Vye2clB-YQ/s1600/d5a4d1a6749424fd851b89beaf36b285.png" height="290" width="400" /></a></div>
<br /></div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
Step 5: Review and adapt Package-Settings if desired </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXbNdQQeGF1IZj09qAEm-PNVDjsU6KBE9MKW7zF8g_AQuiv8rBTs8B4N25opKZgofUEOgrqQDQ-vJslToLAxJX6g8ajQWq8X80QLlZlg6ybqX0SIj1DswTEB_lCXzlUlR-h6m_KlyxwQ/s1600/3e7c0cc6d51c70a9ab1e6b86591a0613.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXbNdQQeGF1IZj09qAEm-PNVDjsU6KBE9MKW7zF8g_AQuiv8rBTs8B4N25opKZgofUEOgrqQDQ-vJslToLAxJX6g8ajQWq8X80QLlZlg6ybqX0SIj1DswTEB_lCXzlUlR-h6m_KlyxwQ/s1600/3e7c0cc6d51c70a9ab1e6b86591a0613.png" height="280" width="400" /></a></div>
<br /></div>
<div class="" style="font-family: Arial;">
Next: </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNcneQdAVPX5A7KKXjnFuW4ju9PX864ugDmvjKSH8nSqP_WvUsQfe6Xm5u2P9buOvBKZd-tPClDTW29vhRrp-qFEKlPpNJpF0kwWV-Oc8Hnc6fUPHYi95Xvwj3kXGp_P-Zq95xyu9hDg/s1600/80a87dc122abb49bf2cc04ad9dac8fc6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNcneQdAVPX5A7KKXjnFuW4ju9PX864ugDmvjKSH8nSqP_WvUsQfe6Xm5u2P9buOvBKZd-tPClDTW29vhRrp-qFEKlPpNJpF0kwWV-Oc8Hnc6fUPHYi95Xvwj3kXGp_P-Zq95xyu9hDg/s1600/80a87dc122abb49bf2cc04ad9dac8fc6.png" height="87" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</div>
<div class="" style="font-family: Arial;">
Confirm your input and let Netbeans generate the source code. If you like you can make some adjustments to the generated code. Typically I would change the REST resource path. (in my sample: to „employees") </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiti92c6XFSp-p4XrrikVpldCHnJPGhz8-74DeHfm6k-JT8XJWxBbopE5JuuNcRP_B4mHBrqbeyKmaNglSi8seg4mQu-gKLOEeakNM3bag6u-jwTfD7Le2USjQLV-io-QxT2soWY0qknw/s1600/28a2a442e27761b7ba62417760cea6e5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiti92c6XFSp-p4XrrikVpldCHnJPGhz8-74DeHfm6k-JT8XJWxBbopE5JuuNcRP_B4mHBrqbeyKmaNglSi8seg4mQu-gKLOEeakNM3bag6u-jwTfD7Le2USjQLV-io-QxT2soWY0qknw/s1600/28a2a442e27761b7ba62417760cea6e5.png" height="157" width="400" /></a></div>
<br /></div>
<div class="" style="font-family: Arial;">
<br /></div>
<div class="" style="font-family: Arial;">
Step 6: In order beeing deployable to Oracle Cloud we need to make further some adjustments. That </div>
<div class="" style="font-family: Arial;">
is </div>
<div class="" style="font-family: Arial;">
Adjustment 1: web.xml </div>
<div class="" style="font-family: Arial;">
(1) We need to change the servlet class from org.glassfish.jersey.servlet.ServletContainer to com.sun.jersey.spi.container.servlet.ServletContainer because the prior class is not available on the cloud server. (2) Further add an <login-config /> if you want to make the Service publicly (without authentication) available. </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivhY4WtydptbkGb2YHq9LAUCy73qUrtXEIPM-5-oCKH6S1_EjM5Ci7-jOrVoxG4DjzlWcwBzErvnFTt2gCJ8TPpVVK_znm14kgICEvZUINJlYNfHdntXGy3lTcuphLx_Z9O_ZJMY_d7A/s1600/1b89310bcc93a5645a218e7147d887b8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivhY4WtydptbkGb2YHq9LAUCy73qUrtXEIPM-5-oCKH6S1_EjM5Ci7-jOrVoxG4DjzlWcwBzErvnFTt2gCJ8TPpVVK_znm14kgICEvZUINJlYNfHdntXGy3lTcuphLx_Z9O_ZJMY_d7A/s1600/1b89310bcc93a5645a218e7147d887b8.png" height="215" width="400" /></a></div>
</div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
Adjustment 2: weblogic.xml </div>
<div class="" style="font-family: Arial;">
Add a library reference to jax-rs 1.1 </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicXVIM-5JyPmtDxVOXEKPBi1FHSNOSzNZc5d2T0Rp_rZ5nqA3vUY5lpSLkUt_B5MWwJi1WLWGYizDH-ucgsRe7Wt60kXfkksheUlHEzUs_zl6VAHbJp34qRFShyphenhyphenfAJqMHV8utAJHoIuQ/s1600/a42b7195fcb725a5bffcd45acd72b4fc.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicXVIM-5JyPmtDxVOXEKPBi1FHSNOSzNZc5d2T0Rp_rZ5nqA3vUY5lpSLkUt_B5MWwJi1WLWGYizDH-ucgsRe7Wt60kXfkksheUlHEzUs_zl6VAHbJp34qRFShyphenhyphenfAJqMHV8utAJHoIuQ/s1600/a42b7195fcb725a5bffcd45acd72b4fc.png" height="210" width="400" /></a></div>
</div>
<div class="" style="font-family: Arial;">
Adjustment 3: persistence.xml </div>
<div class="" style="font-family: Arial;">
Configure your Cloud DB Service name as JNDI Data Source</div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5S6vuHrTtxV9S-Qh3OpXUf6aKLjLTNHZZxsXtNHU3LF5nfNzpZULtvHv3ivXxvsi7VxGGoFj2rHMJ7pk-L0SKtApASPDiQ-daX6VNPZgdOppvTxCWY2AmQNCJPfdeXMZOqxBIpzN74w/s1600/8bdad2d92e1c88719db7aa53628e052c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5S6vuHrTtxV9S-Qh3OpXUf6aKLjLTNHZZxsXtNHU3LF5nfNzpZULtvHv3ivXxvsi7VxGGoFj2rHMJ7pk-L0SKtApASPDiQ-daX6VNPZgdOppvTxCWY2AmQNCJPfdeXMZOqxBIpzN74w/s1600/8bdad2d92e1c88719db7aa53628e052c.png" height="38" width="400" /></a></div>
<br class="" /></div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
<b class="">Deploy RESTService to the cloud</b></div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
Step 1: Open Project Properties, Choose ‚Oracle Cloud Remote" Server Type, Java EE Version 5 </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin74obrema_nZbz8oAXuuABDk38WVE3msplAP6brsGSUeBEriNHewOdOCJGzSeV1yUwcbUtE7kA3S8hqUAhJV0uVoqt4QwH_OvYQQpMmUKAHETfuKm8KyiIZB5BoU-9PL-k_ThgOBpHQ/s1600/69a849b9c40ef044a4837fb783c02991.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin74obrema_nZbz8oAXuuABDk38WVE3msplAP6brsGSUeBEriNHewOdOCJGzSeV1yUwcbUtE7kA3S8hqUAhJV0uVoqt4QwH_OvYQQpMmUKAHETfuKm8KyiIZB5BoU-9PL-k_ThgOBpHQ/s1600/69a849b9c40ef044a4837fb783c02991.png" height="190" width="400" /></a></div>
</div>
<div class="" style="font-family: Arial;">
<br /></div>
<div class="" style="font-family: Arial;">
Step 2: Execute ‚Run' </div>
<div class="" style="font-family: Arial;">
The cloud deployment will start...</div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHEUfE5HWd9tg1yE9pL2GDPRKsNBNCBjxDLEcSn3ZB2GvOijXdMcuDy-t9pGMgv2cE4cTsp2WvHmzL3WEIz5yyjgDMOoLj6pQmCAHXQhjO_gAoF5kEWmXRUaKv33kzHnpruGUftgnHgQ/s1600/b494f799c7e651dd7deff030616bb305.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHEUfE5HWd9tg1yE9pL2GDPRKsNBNCBjxDLEcSn3ZB2GvOijXdMcuDy-t9pGMgv2cE4cTsp2WvHmzL3WEIz5yyjgDMOoLj6pQmCAHXQhjO_gAoF5kEWmXRUaKv33kzHnpruGUftgnHgQ/s1600/b494f799c7e651dd7deff030616bb305.png" height="102" width="400" /></a></div>
<br class="" /></div>
<div class="" style="font-family: Arial;">
The WAR file will be virus scanned... </div>
<div class="" style="font-family: Arial;">
And Finally deployed to the cloud.</div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
<b class="">Test the cloud RESTService</b></div>
<div class="" style="font-family: Arial;">
Here is my REST Service url for departments <a class="" href="https://jcssaasextensitrial9655-deenpitconsultrial83769.java.us2.oraclecloudapps.com/HRRestService/webresources/departments">https://jcssaasextensitrial9655-deenpitconsultrial83769.java.us2.oraclecloudapps.com/HRRestService/webresources/departments</a> </div>
<div class="" style="font-family: Arial;">
If using Chrome install the Postman extension to test the Service. e.g. to test different content types. JSON, XML </div>
<div class="" style="font-family: Arial;">
….<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0aei6lGLgn65ujva0j3j5Fgvmu7epWUECI9z11M5C5VQEE7Yn0BC7MDPpZdaYcX0jSuM8YcNRC5wUycR_9a6guWo_g9LHdgnM28rhvWXHhsaFdPF3wIS-ab-0O9ydHz6xfeWSlp-i9Q/s1600/fcaa1f751e741a242bb56107a7aa5e4c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0aei6lGLgn65ujva0j3j5Fgvmu7epWUECI9z11M5C5VQEE7Yn0BC7MDPpZdaYcX0jSuM8YcNRC5wUycR_9a6guWo_g9LHdgnM28rhvWXHhsaFdPF3wIS-ab-0O9ydHz6xfeWSlp-i9Q/s1600/fcaa1f751e741a242bb56107a7aa5e4c.png" height="375" width="400" /></a></div>
<br /></div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
<b class="">Administer Oracle Java Cloud Service from within Netbeans</b></div>
<div class="" style="font-family: Arial;">
Right under the Service Tab your able to Open the Apps, Start, Stop or Undeploy. </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf_2TZdzTvXll5TMDcMbnRC-EbwO_tWB-4i-Q3yfeDdKIai4KDA-zeam1Si1rZNc68J0nfbow_P89q3Gx1jXeC1VtWP-xIbApxMUymS4AiydN9ldxJl9GLNatGR4CtIfoNiQFiF7lRfg/s1600/981a93ceff279b3474eccbfceda32f80-706995.png" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf_2TZdzTvXll5TMDcMbnRC-EbwO_tWB-4i-Q3yfeDdKIai4KDA-zeam1Si1rZNc68J0nfbow_P89q3Gx1jXeC1VtWP-xIbApxMUymS4AiydN9ldxJl9GLNatGR4CtIfoNiQFiF7lRfg/s320/981a93ceff279b3474eccbfceda32f80-706995.png" id="BLOGGER_PHOTO_ID_6082374660631683026" /></a></div>
</div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
To view the Job Status and Logs open the corresponding view from the Oracle Cloud entry. </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5at_12I7xEPkWEA7cyP2WDpRoXiNzm1d2575aGdp_IX8Cf79q75uG1MCZQ3i_4SQW7wtkOyjQSdNujqHsi1rFB8ACbc-hSxd8XsDNnl_6r_vX4GFRaNhf6XzB782gSM-g5Mcjl9pQeA/s1600/3d1d43344a48b4b467102ca2e7166e47-709075.png" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5at_12I7xEPkWEA7cyP2WDpRoXiNzm1d2575aGdp_IX8Cf79q75uG1MCZQ3i_4SQW7wtkOyjQSdNujqHsi1rFB8ACbc-hSxd8XsDNnl_6r_vX4GFRaNhf6XzB782gSM-g5Mcjl9pQeA/s320/3d1d43344a48b4b467102ca2e7166e47-709075.png" id="BLOGGER_PHOTO_ID_6082374671876527154" /></a></div>
</div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
<b class="">Troubleshooting</b></div>
<div class="" style="font-family: Arial;">
<div class="">
If something goes wrong open the Cloud Job View and Logs Tab to check the details, e.g. if a deployment fails. (1) ClassNotFound Exception </div>
<div class="">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDiOWCzkHlDA-8LKtx2EVkQkbkJmXd0c1O60sNJaihzYzXf2dXvLbdc7PcRz1_JcA1Ey_VPbouuiP75ijPdcmFy66xFqR5edI3RpwEkdZnCVH4ZEpsh-XPL2P16Wzu27gZs0j1Wkra5Q/s1600/60e180630aa966a02eefd109ec72e3ce.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDiOWCzkHlDA-8LKtx2EVkQkbkJmXd0c1O60sNJaihzYzXf2dXvLbdc7PcRz1_JcA1Ey_VPbouuiP75ijPdcmFy66xFqR5edI3RpwEkdZnCVH4ZEpsh-XPL2P16Wzu27gZs0j1Wkra5Q/s1600/60e180630aa966a02eefd109ec72e3ce.png" height="118" width="400" /></a></div>
</div>
<div class="">
<br class="" /></div>
<div class="">
Solution in that particular case is: Use com.sun.jersey.spi.container.servlet.ServletContainer instead of org.glassfish.jersey.servlet.ServletContainer. </div>
<div class="">
<br class="" /></div>
</div>
<div class="" style="font-family: Arial;">
(2) java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder </div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
Solution: Somehow the generated POM had a fixed reference to JAX-RS Library which is provided from the cloud server. So I changed that dependency </div>
<div class="" style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Lo4ARCPOt3GqGV1AUM5W_tdUmDZ5paB8oAk3d0Khy2jkn7gAmPCVLFrljaZs8CHmqJPt2HoMueXqiniQ__kob86odrmM2NQMlYAgMsP34wIimutLaoA6O4L84LtceCCSME-9bOsizg/s1600/5ab7da410bf17d556f4f336c534718eb-713158.png" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Lo4ARCPOt3GqGV1AUM5W_tdUmDZ5paB8oAk3d0Khy2jkn7gAmPCVLFrljaZs8CHmqJPt2HoMueXqiniQ__kob86odrmM2NQMlYAgMsP34wIimutLaoA6O4L84LtceCCSME-9bOsizg/s320/5ab7da410bf17d556f4f336c534718eb-713158.png" id="BLOGGER_PHOTO_ID_6082374687547229474" /></a></div>
</div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
<b class="">Conclusion</b></div>
<div class="" style="font-family: Arial;">
- Having everything setup (Cloud SDK, local WebLogic Servece, DB Objects in the Cloud Service) it is quite easy to build and deploy RESTful services. </div>
<div class="" style="font-family: Arial;">
- Why is the SDK not bundled with the Netbeans Oracle Cloud Plugin? <br />
- I wish there would be that kind of wizard (RESTful Services from Database) for JDeveloper ;)</div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
<b class="">Download S</b>ample: <a href="https://app.box.com/s/5chd09ve7mgswhgzjofz" target="_blank">enpit.training.cloud.hrservice-netbeans801.zip </a></div>
<div class="" style="font-family: Arial;">
<br class="" /></div>
<div class="" style="font-family: Arial;">
<b class="">Further Information</b></div>
<div class="" style="font-family: Arial;">
- <a class="" href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/JCS-JAXRS/jcs_jaxrs.html">http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/JCS-JAXRS/jcs_jaxrs.html</a> (Tutorial)</div>
<div class="" style="font-family: Arial;">
- See also: <a class="" href="http://www.oracle.com/technetwork/articles/java/enterprise-cloud-2227135.html">http://www.oracle.com/technetwork/articles/java/enterprise-cloud-2227135.html</a> (Build with NetBeans IDE, Deploy to Oracle Java Cloud Service) </div>
<div class="" style="font-family: Arial;">
<span class="" style="font-size: 13px;"><br class="" /></span></div>
</div>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-27292725777572223772014-09-03T22:48:00.000+02:002014-09-03T22:49:53.715+02:00Annotation Driven Bean and EJB DataControls in ADF 12c<!--?xml version="1.0" encoding="UTF-8" standalone="no"?--> <br />
<div style="font-family: Arial;">
So as the trend of using annotations over XML configurations goes on and on in software development there is no exception to ADF. Many developers asked for more annotations to configure metadata on Bean DataControls. Since ADF 12c finally there is support for annotations on Bean and EJB DataControls. Let's have a look on it.</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
<b>Sample POJO DataModel</b></div>
<div style="font-family: Arial;">
In my sample I am using a simple Data Model that I want to expose as Bean DataControl to check the new annotation features. We use simple POJOs „Person and a PersonService". See next figure<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOEK652CPXoaImY72chTF9n6h1VWt7P4-cc__-VUD7n_o8MeSzYP7MFAfPu4x_R9BImEApa1oeux09dOdgFNprw4aozUwrcpakNoneSjloS8OWPHsy8D46fKEcFtaY7tKAzP7_9egpHg/s1600/94510a8b9800ec8997eda4a0d77720e3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOEK652CPXoaImY72chTF9n6h1VWt7P4-cc__-VUD7n_o8MeSzYP7MFAfPu4x_R9BImEApa1oeux09dOdgFNprw4aozUwrcpakNoneSjloS8OWPHsy8D46fKEcFtaY7tKAzP7_9egpHg/s1600/94510a8b9800ec8997eda4a0d77720e3.png" height="257" width="400" /></a></div>
<br /></div>
<div style="font-family: Arial;">
<span id="goog_863663472"></span><span id="goog_863663473"></span><br /></div>
<div style="font-family: Arial;">
Next we want to see some of the annotation features in action.</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
<b>Primary Key Definition</b></div>
<div style="font-family: Arial;">
In order to make your DataModel functioning correctly in most cases you should define a primary key. You can do this now with the @Id-Annotation: (No need to generate an XML file for these kind of metadata)</div>
<div style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2DBoh-BsgcupvPtB3jLiZiX4aVFmJrhNJ2023PUDOyK97v_ByPwo91sY59X1oN5-8c5tQv7wjFtJNywtJF5AU5ZIsL2PD3CXLwV-5bPAwzMpVoN-96bw-yOpe7Gd6E-u1bgDqVO-a3w/s1600/4409978f42b62e8314a55ac03dfca749.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2DBoh-BsgcupvPtB3jLiZiX4aVFmJrhNJ2023PUDOyK97v_ByPwo91sY59X1oN5-8c5tQv7wjFtJNywtJF5AU5ZIsL2PD3CXLwV-5bPAwzMpVoN-96bw-yOpe7Gd6E-u1bgDqVO-a3w/s1600/4409978f42b62e8314a55ac03dfca749.png" height="133" width="320" /></a></div>
<br /></div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
(If using JPA-based entity classes make sure to use the javax.persistence.Id annotation)</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
<b>Setting UI Hints</b></div>
<div style="font-family: Arial;">
To set specific UI Hints like label, tooltip, display, width, height, autoSubmit, controlType, formatType, format, timezoneId, etc. you can leverage the @AttributeHint, @DateFormatter and @Formatter Annotations. Further it is possible to define custom properties through @Property annotations</div>
<div style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeeRFGylBTbn0JpKCXV7XecmUHFX60W2ZAPOU8QnGJq6FeEPEAsZN7cl-sm1XRzSzSkI275H3onTRmj8tDVmh_Kk5mfmmnSKI1ZRbkzqlBif77b8EdktbxTwfBDO85bvyfUcX_Mlq92g/s1600/9b64daa916a1082b3034e7c931bb9fa6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeeRFGylBTbn0JpKCXV7XecmUHFX60W2ZAPOU8QnGJq6FeEPEAsZN7cl-sm1XRzSzSkI275H3onTRmj8tDVmh_Kk5mfmmnSKI1ZRbkzqlBif77b8EdktbxTwfBDO85bvyfUcX_Mlq92g/s1600/9b64daa916a1082b3034e7c931bb9fa6.png" height="379" width="640" /></a></div>
<br /></div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
See the whole feature list for UI Hints here: <a href="http://docs.oracle.com/middleware/1213/adf/develop-data-controls/data-controls-ejb.htm#ADFDC996">http://docs.oracle.com/middleware/1213/adf/develop-data-controls/data-controls-ejb.htm#ADFDC996</a></div>
<div style="font-family: Arial;">
<br /></div>
<div>
<blockquote class="tr_bq">
<span style="background-color: yellow;"><span style="font-family: Verdana, sans-serif;">Note a: If you set UI hints for an attribute both using annotations and in an XML data control structure file, the settings in the data control structure file take precedence.</span></span> </blockquote>
<blockquote class="tr_bq">
<span style="background-color: yellow;"><span style="font-family: Verdana, sans-serif;">Note b: When you apply annotations for UI hints, you can not see the affect of the hints in the design-time view of pages that you create based on the data controls. However, you can test and verify the hints using the ADF Model Tester. </span></span></blockquote>
</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
BTW: Everything looks easy so far, but: The most challenging part for me was to recognize that these annotations only work on METHOD level and not on FIELD level although there are no compile errors! It felt natural for me to put these annotations on fields, but believe me, it won't have any effect in ADF 12.1.3. So remember</div>
<div style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjb-aGtyEbhLl3tqZ3WEvNmldDcuXdRRMrZu0tiKNP6buAjecJAxcTXtc2l4gL4l5lV35B2gAhbG5PXFo2cYxbqEYKf_1qqkI0bW9wROI0WOvRzlS15oKCFOb8MO-tKkVz1RKP677khw/s1600/9ec7dd500196eef88e0eb42814c18382.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjb-aGtyEbhLl3tqZ3WEvNmldDcuXdRRMrZu0tiKNP6buAjecJAxcTXtc2l4gL4l5lV35B2gAhbG5PXFo2cYxbqEYKf_1qqkI0bW9wROI0WOvRzlS15oKCFOb8MO-tKkVz1RKP677khw/s1600/9ec7dd500196eef88e0eb42814c18382.png" height="182" width="640" /></a></div>
<br /></div>
<div style="font-family: Arial;">
Interesting to note: The @Id Annotation works also on FIELD level!</div>
<div style="font-family: Arial;">
<b><br /></b>
<b>Testing the result</b><br />
Running the sample we see that the annotation driven meta data is recognized correctly. It has been applied to Table Column Headers and Form Labels, Formatters and Input-Types.
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7Fb6wwhl3_j62CosWDOUJ8fXN7s7hcmPSdTbfhncwDbVD3NyWj6xCPV7fWIJPHleicnqK4t_4fVE-n_5UCeC2PXDQJLmy6i0HfpPkwpFVSg4-gxR0TpzO6szf-TKhTQ-ZCNRYOAVxbQ/s1600/a4688d87f4850dd3cef16987a8a8bd93.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7Fb6wwhl3_j62CosWDOUJ8fXN7s7hcmPSdTbfhncwDbVD3NyWj6xCPV7fWIJPHleicnqK4t_4fVE-n_5UCeC2PXDQJLmy6i0HfpPkwpFVSg4-gxR0TpzO6szf-TKhTQ-ZCNRYOAVxbQ/s1600/a4688d87f4850dd3cef16987a8a8bd93.png" height="411" width="640" /></a></div>
<br />
<br /></div>
<div style="font-family: Arial;">
<b>Setting AccessMode for Collections</b></div>
<div style="font-family: Arial;">
For collections you can define the AccessMode (Scroll, Range-Paging or None).</div>
<div style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6WqBKc7kr_48726P1U5UaMGcZSSS66bGSYOg2OVooZLrvWOM5qlbX4zla6XQUJUYgSYTdEmtuA7p7LZNii6qPhAzLFNBIY9HRB6ZAL69ekP9FmCA-uhQ8TGuCszh7v_v0EhQBlYk7hg/s1600/43d180fc48a632fd7a4f63194a854fac.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6WqBKc7kr_48726P1U5UaMGcZSSS66bGSYOg2OVooZLrvWOM5qlbX4zla6XQUJUYgSYTdEmtuA7p7LZNii6qPhAzLFNBIY9HRB6ZAL69ekP9FmCA-uhQ8TGuCszh7v_v0EhQBlYk7hg/s1600/43d180fc48a632fd7a4f63194a854fac.png" height="60" width="400" /></a></div>
<br /></div>
<div style="font-family: Arial;">
For SCROLLABLE or RANGE_PAGING Mode to work correctly you need to implement the following method signatures (for every collection) </div>
<div style="font-family: Arial;" title="Page 68">
<div>
<br /></div>
<div>
<span style="font-family: Courier;">List<</span><span style="font-family: Courier; font-style: oblique;">Person</span><span style="font-family: Courier;">> get<i>Persons</i></span><span style="font-family: Courier;">(int firstResult, int maxResults)</span></div>
<div>
<span style="font-family: Courier;">long get<i>Persons</i></span><span style="font-family: Courier;">Size() </span></div>
<div>
<br /></div>
</div>
<div style="font-family: Arial;">
<blockquote class="tr_bq">
<span style="background-color: yellow;">Note: These annotations only work on getter methods.</span></blockquote>
</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
<b>Testing Metadata Using the Oracle ADF Model Tester </b></div>
<div style="font-family: Arial;">
For EJB and Bean Data Controls you can go to the DataControls.dcx file select the given DataControl and exceute „Run" from the context menu.</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8eE0pA-5SgdJ8OpJR-GTaQBq-RWvYNd7VoO3kXVcEAOByPyE5m0wFdfMN_JwB5eVgEh88kUnKUd49uGCQIAXJzpoFP50NTTyHu9PXNhN2WE5X5vxJuFbJemPV2wWhLg2WBqU6DApHrQ/s1600/d1536140f3a9b44074e6add2d24e3291-751481.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8eE0pA-5SgdJ8OpJR-GTaQBq-RWvYNd7VoO3kXVcEAOByPyE5m0wFdfMN_JwB5eVgEh88kUnKUd49uGCQIAXJzpoFP50NTTyHu9PXNhN2WE5X5vxJuFbJemPV2wWhLg2WBqU6DApHrQ/s320/d1536140f3a9b44074e6add2d24e3291-751481.png" height="116" id="BLOGGER_PHOTO_ID_6054633657739631154" width="200" /></a><br />
=> This is pretty cool. As your deployment roundtrips can be reduced ;)</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
<b>Gotchas</b></div>
<div style="font-family: Arial;">
First everything looks promising. But if you try to do some real world developer roundtrips some gotchas appear. Commenting some annotation out, testing changes etc you notice that some information are not refreshing properly inside JDeveloper. So, e.g.</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
Step 1: Change primary key definition</div>
<div style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWq6DFo26U1OHDqBydJVjHNC8TqgzL4ThjGPvdo8s21F_McLHlvHyPCPX4vIZnQCNR2P6U2hda56AcjxU9SoS7dCz3NTkH_qysEflOwCXyTMR4SgE0_ShaWAarkFcPEidPNFV_CHvrwQ/s1600/7213d16b1f4f938df50ebebc27565e25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWq6DFo26U1OHDqBydJVjHNC8TqgzL4ThjGPvdo8s21F_McLHlvHyPCPX4vIZnQCNR2P6U2hda56AcjxU9SoS7dCz3NTkH_qysEflOwCXyTMR4SgE0_ShaWAarkFcPEidPNFV_CHvrwQ/s1600/7213d16b1f4f938df50ebebc27565e25.png" height="136" width="400" /></a></div>
<br /></div>
<div style="font-family: Arial;">
Step 2: Open DataControls.dcx</div>
<div style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB6Z-hUbx1Wf0KyUGKlqXyOEvZ1zyf6jTO91eH2_JnL-oT6we2RJpk5Ljc1YyxT9C3M4t4cq7Y_I7M9I5EKb2YJNjLB5GisBHSd5Qw8SJkjDLXjS7iJUzVlHSa1sFbPxqizjqKJ9paBg/s1600/5c178de022c50d3533a3e0b2004f28e8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB6Z-hUbx1Wf0KyUGKlqXyOEvZ1zyf6jTO91eH2_JnL-oT6we2RJpk5Ljc1YyxT9C3M4t4cq7Y_I7M9I5EKb2YJNjLB5GisBHSd5Qw8SJkjDLXjS7iJUzVlHSa1sFbPxqizjqKJ9paBg/s1600/5c178de022c50d3533a3e0b2004f28e8.png" height="151" width="400" /></a></div>
<br /></div>
<div style="font-family: Arial;">
=> The change is recognized correctly by the DataControls Editor.</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
Step 3: Go to the structure definition file (Person.xml)</div>
<div style="font-family: Arial;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh10jZoHkYlH2GIt0Z2s5TMFSb-uPhhVNVpd-7lYseDte_ILCerZzqsD-3s2fxJgcbPHgpv85bp4yv54U2nOuDxTvLZrBSNqwuAdCQRnTPhSNV7xUPPJxshTlMybMDFGoJ5BlRa_F0lg/s1600/4f97f04030e1868dcfe099819c6f9e17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh10jZoHkYlH2GIt0Z2s5TMFSb-uPhhVNVpd-7lYseDte_ILCerZzqsD-3s2fxJgcbPHgpv85bp4yv54U2nOuDxTvLZrBSNqwuAdCQRnTPhSNV7xUPPJxshTlMybMDFGoJ5BlRa_F0lg/s1600/4f97f04030e1868dcfe099819c6f9e17.png" height="225" width="400" /></a></div>
<br /></div>
<div style="font-family: Arial;">
=> The old attribute is still displayed as primary key! Expected: firstname, because of the recent changes. Hhhm. Is this a bug? It could lead to frustration and unexpected behaviour. Workaround is to close the JDeveloper application and open it again. Looks like a caching/synchronization failure.</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
<b>Conclusion</b></div>
<div style="font-family: Arial;">
The support for annotations is getting better in ADF. Besides some caching problems at design time views there is missing support for Validation. As <a href="http://en.wikipedia.org/wiki/Bean_Validation" target="_blank">JSR 303 (Bean Validation)</a> is Java industry standard and widely adopted it would be cool to see ADF moving in that direction too! At this time Validations on POJO DataModel must be done in the DataControl structure files per entity. Due to the "sparse bean nature" the XML file only for the given entities needs to be generated.</div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
<b>Download</b></div>
<div style="font-family: Arial;">
Sample application build with JDeveloper 12.1.3: <a href="https://app.box.com/s/toxm4ssgycg6nk3nykpm">enpit.sample.dc.annotations-jdev1213.zip</a></div>
<div style="font-family: Arial;">
<br /></div>
<div style="font-family: Arial;">
<b>Further information</b></div>
<div style="font-family: Arial;">
<br />
<ul>
<li><a href="http://docs.oracle.com/middleware/1213/adf/develop-data-controls/data-controls-bean.htm#A10366116" target="_blank">Oracle ADF 12.1.3 Documentation: 4.8 Using Annotations to Declare Metadata for Bean Data Controls</a></li>
<li><a href="http://docs.oracle.com/middleware/1213/adf/develop-data-controls/index.html" target="_blank">Oracle ADF 12.1.3 Developing Applications with Oracle ADF Data Controls</a></li>
<li><a href="http://multikoop.blogspot.de/2013/07/adf-12c-model-driven-lov-with-bean-data.html" target="_blank">See also my sample for Model-Driven LOVs in ADF 12.1.2</a></li>
</ul>
</div>
<div style="font-family: Arial;">
<span style="font-size: 13px;"><br /></span></div>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com3tag:blogger.com,1999:blog-3884583999971724746.post-1578021864778981972014-07-29T02:04:00.000+02:002014-07-29T02:04:05.790+02:00Using FlexSlider as Declarative Component in ADFIn the www there are a lot of cool photo slideshow components which one might want to use in ADF applications too. For example the <a href="http://www.woothemes.com/flexslider/" target="_blank">FlexSlider</a>.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3HMiYyUimofA2PcQTrxL3L5uLm63LjJGZd-DyB5BeU-LNLmyZ7RLHUT8_EBrTx-GuEh5aWq-8qsKBbf8uxpuhD_kkxOQpSZRuKbjKor6BgMc5Bh2_h-RZ3TOFENaNjh2pVq6icz82pg/s1600/03013451eed4ccb06c8fd01f1eeff6c6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3HMiYyUimofA2PcQTrxL3L5uLm63LjJGZd-DyB5BeU-LNLmyZ7RLHUT8_EBrTx-GuEh5aWq-8qsKBbf8uxpuhD_kkxOQpSZRuKbjKor6BgMc5Bh2_h-RZ3TOFENaNjh2pVq6icz82pg/s1600/03013451eed4ccb06c8fd01f1eeff6c6.png" height="350" width="400" /></a></div>
<br />
<br />
Technically it should be easy to be integrated, e.g. like<br />
..<br />
<flexslider:FlexSlider animation="fade“ id=" fs1="" imagelist="#{someBean.imageList}" /><br />
..<br />
<h3>
Environment</h3>
The following sample is based on ADF 11.1.1.7<br />
<h3>
How to do it</h3>
Well - in theory - it is quite simple. Take a look at the plain JavaScript/HTML Sample from <a href="http://www.woothemes.com/flexslider/" target="_blank">http://www.woothemes.com/flexslider/</a><u> </u>and put all necessary files in your component project which will be bundled as ADF Library for reuse. However based on your use cases (integrate inside a fragment based taskflow) there will be some challenges.<br />
- How to deal with more then one instance on one page<br />
- How to hook the javascript, which typically hooks into the onload javascript phase<br />
<br />
$(window).load(function() {<br />
$('.flexslider').flexslider({<br />
animation: "fade" /* or "slide" */<br />
});<br />
});<br />
<br />
<br />
So here is my solution.<br />
Step 1: Setup an ADF component project und copy all relevant files from the FlexSlider<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Mwt7Jji3m2ZwJnp6JRSr2NlMom1i6P_-86pVbRqlY8Yi47k5NMbLQTWz2Nqe6mZXcL_1o0V1rLyKb4wOv2r5ywdfpcnkM3KVaMJ6S1iwx6aut5-lB_fjpMo4arHusS6kW_tfIGZOuA/s1600/ca5020879dbbeed726f11fddaaed5471.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Mwt7Jji3m2ZwJnp6JRSr2NlMom1i6P_-86pVbRqlY8Yi47k5NMbLQTWz2Nqe6mZXcL_1o0V1rLyKb4wOv2r5ywdfpcnkM3KVaMJ6S1iwx6aut5-lB_fjpMo4arHusS6kW_tfIGZOuA/s1600/ca5020879dbbeed726f11fddaaed5471.png" height="233" width="320" /></a></div>
<br />
<br />
Step 2: Next create the declarative component FlexSlider.jspx (by using the JDeveloper wizard, generate the component class and TagLibrary). The important part is to generate a unique id for the slider DIV and to make sure to call the needed javascript method to setup the slideshow. The FlexSlider.jspx looks as follows<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrUNokEGI0gkmS8-8Xb_wt5RKMVpnTsiblfR_n9YtUMT7ztGUhhKiKxgJkrHtVsZEaOA2nCFNdNMsQLvMlBdGI1KhVTlA8egkuwO18pCAxJ15TAOxB4GAJ3VSn70YOw2pPj4m2TuNxLQ/s1600/e7f0a82705d3855385baae2af144b317.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrUNokEGI0gkmS8-8Xb_wt5RKMVpnTsiblfR_n9YtUMT7ztGUhhKiKxgJkrHtVsZEaOA2nCFNdNMsQLvMlBdGI1KhVTlA8egkuwO18pCAxJ15TAOxB4GAJ3VSn70YOw2pPj4m2TuNxLQ/s1600/e7f0a82705d3855385baae2af144b317.png" height="396" width="640" /></a></div>
<br />
<br />
and for the FlexSlider.java define the following methods<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyjTAsI4183jDOcqdN3dX_TuwpdhqwBei3oucl2WNxstIjqZ6XYoDgJcgW882wEisnzrXCzAwTID5V5JV3znnFffeKgOadrth79lP5h0NJaXal_-Jn8iez1q4QxGkAb_cV_hTn-9RqHQ/s1600/50b0f1c6d49e24896b82b048065d20f8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyjTAsI4183jDOcqdN3dX_TuwpdhqwBei3oucl2WNxstIjqZ6XYoDgJcgW882wEisnzrXCzAwTID5V5JV3znnFffeKgOadrth79lP5h0NJaXal_-Jn8iez1q4QxGkAb_cV_hTn-9RqHQ/s1600/50b0f1c6d49e24896b82b048065d20f8.png" height="364" width="640" /></a></div>
<br />
<br />
<br />
To make the Javascript call we use a known trick to bind the Call to a getter on an af:outputText with visible=„false“.<br />
<h3>
How to use it</h3>
Define a simple bean (or could also be a DataControl) that serves a List of Images<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl5MSlBKurPVGhM5xzCmFkUIOVZFvxHWzCvRmtbjPz6GfzSlmABab2aGvPEMCAFX9Gf432JofdncQcPTtDHJHusP8CtOdxJWtC3STlFpkiCeNNKGqAvTDyB3_HBw1H-A6zPPBUBYL_fw/s1600/3555165e3b83e30b09d65c853b4306ce.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl5MSlBKurPVGhM5xzCmFkUIOVZFvxHWzCvRmtbjPz6GfzSlmABab2aGvPEMCAFX9Gf432JofdncQcPTtDHJHusP8CtOdxJWtC3STlFpkiCeNNKGqAvTDyB3_HBw1H-A6zPPBUBYL_fw/s1600/3555165e3b83e30b09d65c853b4306ce.png" height="277" width="400" /></a></div>
<br />
<br />
Drop the declarative component „FlexSlider“ from the component palette onto the given page and bind the given list via EL<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_5pOqmd2Lf8bf3K80HhnfElbVh-itC2GmQKuKUEp_6oXqlaa4eDE0fijeUSAO0fW_kOT8mrSQTRrY4jY_RvbM3HbI1gRyYlhvciqXMCUbbpukq0KIjy2aG0nzuihX0LF7KlQxifqHPA/s1600/55ca8e46543b374dac3036bd597c1a6c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_5pOqmd2Lf8bf3K80HhnfElbVh-itC2GmQKuKUEp_6oXqlaa4eDE0fijeUSAO0fW_kOT8mrSQTRrY4jY_RvbM3HbI1gRyYlhvciqXMCUbbpukq0KIjy2aG0nzuihX0LF7KlQxifqHPA/s1600/55ca8e46543b374dac3036bd597c1a6c.png" height="40" width="640" /></a></div>
<br />
<br />
As result you will get a reusable UI component to integrate slideshows into ADF applications.<br />
<h3>
Gotchas</h3>
The font resources like ttf, eot, woff, svg (that are referenced from the flexslider.css and are being used as the previous/next font-icons) are not served as expected from the ADF Library which holds the custom component. For now the workaround is to copy these resource into your master viewcontroller project. This way you make sure that all resources are loaded.<br />
<br />
See ADF EMG Issue <a href="https://java.net/jira/browse/ADFEMG-244" target="_blank">https://java.net/jira/browse/ADFEMG-244</a> for the current progress.<br />
<h3>
Download</h3>
<a href="https://app.box.com/s/xpm7pow9j9r2mse0egvo" target="_blank">enpit.sample.flexslider-jdev11117.zip</a><br />
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-79594337138208197012014-07-13T03:54:00.000+02:002014-07-13T03:54:24.560+02:00ADF Mobile rebrands to Oracle MAF (Mobile Application Framework) - New Name, New Features, Growing Community!Shortly after the release of ADF 12.1.3 the cross-platform mobile development framework ADF Mobile was rebranded to <a href="http://www.oracle.com/technetwork/developer-tools/maf/overview/index.html" target="_blank">Oracle MAF (Mobile Application Framework)</a>. Nothing has changed on the technical foundation of that mobile framework. It is still based on Apache Cordova, HTML5/CSS3, Java, and offers the possibility to develop offline-capable apps with the help of an embedded SQLite database. The developed hybrid apps run on iOS and Android-based smartphones and tablets.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><img alt="Oracle MAF (Mobile Application Framework) - Build Once , Run anyware" class="aligncenter wp-image-1832" src="http://www.enpit.de/wp-content/uploads/2014/07/oracle-maf-developmentprocess-1024x461.png" height="271" style="margin-left: auto; margin-right: auto;" width="601" /></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Oracle MAF Overview</td></tr>
</tbody></table>
The migration of ADF Mobile Apps to Oracle MAF runs smoothly. The migration is totaly transparent when opening the existing app in JDeveloper 12.1.3/Oracle MAF 2.0 Extension. Excellent!<br />
<br />
A highlight of Oracle MAF is that Apache Cordova plugins (eg barcode scanner plugins) can be integrated. The included sample apps have a showcase for reading barcodes. This is very handy! The integrated barcode scanner gives rise to many new and interesting fields of action. Hope to blog about that in more detail in near future. Stay tuned!<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: center;"><tbody>
<tr><td style="text-align: center;"><img alt="Oracle MAF - Finally integrated BarCode Scanner " class="aligncenter wp-image-1831" src="http://www.enpit.de/wp-content/uploads/2014/07/oracle-maf-barcodeapp.png" height="211" style="margin-left: auto; margin-right: auto;" width="600" /></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Oracle MAF 2.0 - Barcode Scanner Integration included</td></tr>
</tbody></table>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
I won't list all the new features here, since it is well announced by Shay Shmeltzer <a href="https://blogs.oracle.com/jdeveloperpm/entry/say_hello_to_the_new" target="_blank">here (Say hello to the new Oracle MAF)</a> and <a href="https://blogs.oracle.com/mobile/entry/oracle_mobile_application_framework_hits" target="_blank">here (Oracle MAF hits the street)</a>.<br />
<br />
Besides the "rebranding" many new "channels" were launched, such as a forum for technical issues, a community at G+, Twitter and Facebook. I have checked all that and summarized the most important links. A lot of activity is going on! Enjoy Exploring;)<br />
<h3>
Oracle Mobile Application Framework (MAF)</h3>
<ul>
<li><a href="https://blogs.oracle.com/mobile/entry/oracle_mobile_application_framework_hits" target="_blank" title="Oracle MAF 2.0 Announcement">Oracle MAF Announcement</a></li>
<li><a href="http://www.oracle.com/technetwork/developer-tools/maf/overview/index.html" target="_blank" title="Oracle MAF Produktseite">Oracle MAF Produktseite</a></li>
<li><a href="http://download.oracle.com/otn_hosted_doc/maf/MAF-Overview-Short/index.html" target="_blank" title="Oracle MAF Overview Video">Oracle MAF Overview Video</a></li>
<li><a href="http://www.oracle.com/technetwork/developer-tools/maf/documentation/oraclemaf-datasheet-2220993.pdf" target="_blank" title="Oracle MAF Data Sheet">Oracle MAF Data Sheet</a></li>
<li><a href="http://www.oracle.com/technetwork/developer-tools/maf/learnmore/mafsamples-2227357.html" target="_blank" title="Oracle MAF Samples">Oracle MAF Samples</a></li>
<li><a href="https://wikis.oracle.com/display/ADFMobileDesign/Home" target="_blank" title="Oracle MAF Design">Oracle MAF Design: One Solution for Multiple Platforms</a></li>
<li><a href="http://docs.oracle.com/middleware/mobile200/mobile/index.html" target="_blank" title="Oracle MAF 2.0 Documentation Library">Oracle MAF Documentation Library (2.0.0.0.0)</a></li>
<li><a href="http://www.oracle.com/us/corporate/pricing/technology-price-list-070617.pdf" target="_blank" title="Oracle MAF Pricelist">Oralce MAF Pricelist</a></li>
</ul>
<h3>
Oracle Mobile Community and Forum</h3>
<ul>
<li><a href="https://community.oracle.com/community/developer/english/oracle-mobile/oraclemaf" target="_blank" title="Oracle MAF Forum">Oracle MAF Forum</a></li>
<li><a href="https://plus.google.com/communities/109041800198364610931" target="_blank" title="Oracle MAF G+ Community">Oracle MAF G+ Community</a></li>
<li><a href="https://plus.google.com/106054685387588647781/posts" target="_blank" title="Oracle MAF G+ Page">Oracle MAF G+ Page</a></li>
<li><a href="https://www.facebook.com/OracleMAF" target="_blank" title="Oracle MAF on Facebook">Oracle MAF on Facebook</a></li>
<li><a href="http://twitter.com/OracleMobile" target="_blank" title="Oracle MAF on Twitter">Oracle MAF on Twitter</a></li>
<li><a href="https://www.youtube.com/user/oraclemobileplatform" target="_blank" title="Oracle Mobile Plattform on YouTube">Oracle Mobile Platform YouTube Channel</a></li>
</ul>
<h3>
What others write</h3>
<ul>
<li><a href="http://www.heise.de/developer/meldung/Hybride-Apps-mit-Oracles-Mobile-Application-Framework-2243692.html" target="_blank" title="Oracle MAF in den Heise.de News">Oracle MAF bei heise.de</a></li>
<li><a href="http://www.doag.org/home/aktuelle-news/article/oracle-adf-mobile-heisst-jetzt-oracle-maf.html" target="_blank" title="Oracle ADF Mobile heißt jetzt Oracle MAF">DOAG.news: Oracle ADF Mobile heißt jetzt Oracle MAF</a></li>
<li><a href="http://www.marketwatch.com/story/oracle-accelerates-development-and-extensibility-of-mobile-applications-with-oracle-mobile-application-framework-2014-06-30" target="_blank" title="Beschleunigte Entwicklung von Mobile Apps mit Oracle MAF">Oracle Accelerates Development and Extensibility of Mobile Applications With Oracle Mobile Application Framework</a></li>
</ul>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com4tag:blogger.com,1999:blog-3884583999971724746.post-11610730633571997402014-06-30T10:05:00.000+02:002014-06-30T10:13:30.328+02:00How to use the Deck component (ADF 12.1.3 New Feature)<div>
With the arrival of ADF 12.1.3 many new features has been introduced. One of those features is the brand new deck ui component. In this blogpost I want to give an example on how to use that new component.</div>
<div>
<h3>
<b>Use Case</b></h3>
</div>
<div>
The use case is quite simple. Arrange pictures of soccer players in a grid. Once clicked on a picture it is flipped. On the backside you can see more details for the given player. Clicking once again on the card it flips back and shows the picture again. Let's look at the result: </div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju5piH0aJpLGkn4PTo9wZSoKz1Uk14WtDIOZx6tUgAgk60C3EBtIuIwHhyphenhyphenq9mA8vT_-Eemwg5KIEo1gjeK3v7av-lj1ttJgy2lfpv3rEwvxH2Tlaps-xMFtsDiRMP2T8gzCrtSwFYHDg/s1600/dff3f302dc972c0c2f618ab49da18a6c-740043.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju5piH0aJpLGkn4PTo9wZSoKz1Uk14WtDIOZx6tUgAgk60C3EBtIuIwHhyphenhyphenq9mA8vT_-Eemwg5KIEo1gjeK3v7av-lj1ttJgy2lfpv3rEwvxH2Tlaps-xMFtsDiRMP2T8gzCrtSwFYHDg/s320/dff3f302dc972c0c2f618ab49da18a6c-740043.png" id="BLOGGER_PHOTO_ID_6030612288544753170" /></a></div>
<div>
Now clicking on the first pic it flips (with an animated transition) and show details. </div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK608Vn70cvICOZaLi5BFTnfJxpRfxZ-3wg1m7R1vAKPCjewtp8gG1ENDXExYhtP5EpRDdsTRVfZlLBPNkOFQZ-QjGeh494bNqkUSHRgfdN-mEtzYHtrJPkwRHq_ysWR7BUXSdzv6-wA/s1600/f4a8227de671bbccb636800811a456a4-743960.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK608Vn70cvICOZaLi5BFTnfJxpRfxZ-3wg1m7R1vAKPCjewtp8gG1ENDXExYhtP5EpRDdsTRVfZlLBPNkOFQZ-QjGeh494bNqkUSHRgfdN-mEtzYHtrJPkwRHq_ysWR7BUXSdzv6-wA/s320/f4a8227de671bbccb636800811a456a4-743960.png" id="BLOGGER_PHOTO_ID_6030612304940899058" /></a></div>
<div>
<br /></div>
<div>
<h3>
<b>How to implement</b></h3>
</div>
<div>
To implement the described use case create a panelGridLayout first with the following properties</div>
<div>
<br />
<ul>
<li>row: Fixed height</li>
<li>cell: Fixed width, halign="stretch" and valign="stretch"</li>
</ul>
</div>
<div>
<br /></div>
<div>
Inside each cell place the new af:deck component with two links as child components and two transition operations. </div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5LcoX9SPG6GKmMTn3_ph84RjH5YaXeJaySRF-VfDtE8fRcovkJEyHuMq7Lt3VsbNpk_B3QGQ0kqbCzmLbMVHMdRSJp0GMnyqC7p_K02IxwDP4URR23ZNQMQ9JeHGbpdPshYZmYqlY2g/s1600/1634da766a8a9be9d14c8fefcb90e137-746533.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5LcoX9SPG6GKmMTn3_ph84RjH5YaXeJaySRF-VfDtE8fRcovkJEyHuMq7Lt3VsbNpk_B3QGQ0kqbCzmLbMVHMdRSJp0GMnyqC7p_K02IxwDP4URR23ZNQMQ9JeHGbpdPshYZmYqlY2g/s320/1634da766a8a9be9d14c8fefcb90e137-746533.png" id="BLOGGER_PHOTO_ID_6030612312688298514" /></a></div>
<div>
The commandLinks act as clickable cards on the deck. Each transition operation defines the desired animation when transitioning from one card to another. There are a lot of out-of-the-box transitions available as you can see in the screenshot. </div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkxSoHwpQzRNc_asbwIIiRoRYrncsK00u-PifgyEDJicUmD8MTrIarIZhgLqkj2AH_R1V71gUby_-7br4P7StZ7-v0hS6oNPE3MD0eE5rlFJjWmE5Ymx8g9LStibXkyWAFSkUlGg6KIg/s1600/183db43f74a7661c7ff8a44416d323c3-749190.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkxSoHwpQzRNc_asbwIIiRoRYrncsK00u-PifgyEDJicUmD8MTrIarIZhgLqkj2AH_R1V71gUby_-7br4P7StZ7-v0hS6oNPE3MD0eE5rlFJjWmE5Ymx8g9LStibXkyWAFSkUlGg6KIg/s320/183db43f74a7661c7ff8a44416d323c3-749190.png" id="BLOGGER_PHOTO_ID_6030612324929728482" /></a></div>
<div>
Which card is currently displayed on the deck is controlled by the <b>displayedChild</b> attribute. It expects the component id of the given child ui component (in this case the af:commandLinks). The interesting piece of JSF Code for the sample to work is as follows:<br />
<br />
<script src="https://gist.github.com/multikoop/a83b45cfffd40fe37723.js"></script>
</div>
<div>
To make the sample complete a backing bean is needed to handle the action events on each command link. Main task of the action listeners is to change the displayedChild attribut on the deck component and repaint it on the client (through a partial refresh)<br />
</div>
<script src="https://gist.github.com/multikoop/d668716779e25df9d309.js"></script>
<div>
</div>
<div>
<h3>
Download</h3>
<div>
<a href="https://app.box.com/s/zpzz4fdxz7nleg4xhae4" target="_blank">Download the sample application - built with JDeveloper 12.1.3: enpit.sample.adf1213.deck-jdev1213.zip</a></div>
<h3>
Observations</h3>
</div>
<div>
While implementing the deck sample I did not want to use the deprecated af:commandLink. But converting it to af:link implies a JSF compilation error. So I switched back to the deprecated component.</div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdx__xYl1fp6WOafxmJPOGLcm3CU233tGcLVZ11lXrKdECIc6VUiOmXZw4ZWRTEGY4WDRYTg54D3jqKWCJb7_EQpV6WmvRYymtQlCFzFU5KUR4fb5FPnqK__6qoYgUFDh3VxyhUBLP8Q/s1600/d4eb3f9f7fdbda2f0330c24bbcf774c6-751588.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdx__xYl1fp6WOafxmJPOGLcm3CU233tGcLVZ11lXrKdECIc6VUiOmXZw4ZWRTEGY4WDRYTg54D3jqKWCJb7_EQpV6WmvRYymtQlCFzFU5KUR4fb5FPnqK__6qoYgUFDh3VxyhUBLP8Q/s320/d4eb3f9f7fdbda2f0330c24bbcf774c6-751588.png" id="BLOGGER_PHOTO_ID_6030612335897878274" /></a><span style="font-size: 13px;"><br /></span></div>
<div>
Looks like the new Link Component is not fully compatible. Is this a bug?</div>
<div>
<h3>
<b>Further Information</b></h3>
</div>
<div>
<ul>
<li>See more af:deck demos at the official JDev/ADF Demo <a href="http://jdevadf.oracle.com/adf-richclient-demo/faces/visualDesigns/deck.jspx">http://jdevadf.oracle.com/adf-richclient-demo/faces/visualDesigns/deck.jspx</a>, <a href="http://jdevadf.oracle.com/adf-richclient-demo/faces/components/deck.jspx">http://jdevadf.oracle.com/adf-richclient-demo/faces/components/deck.jspx</a></li>
<li>See af:deck documentation in the ADF 12.1.3 Web Developers Guide <a href="http://docs.oracle.com/middleware/1213/adf/develop-faces/adf-faces-layout.htm#ADFUI13833">http://docs.oracle.com/middleware/1213/adf/develop-faces/adf-faces-layout.htm#ADFUI13833</a></li>
<li>See af:deck Tag Library Description: <a href="http://docs.oracle.com/middleware/1213/adf/tag-reference-faces/tagdoc/af_deck.html">http://docs.oracle.com/middleware/1213/adf/tag-reference-faces/tagdoc/af_deck.html</a></li>
</ul>
</div>
<div>
<br /></div>
<div>
<br style="font-family: Arial; font-size: medium;" /></div>Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com0tag:blogger.com,1999:blog-3884583999971724746.post-62239500296617904272014-06-07T12:17:00.001+02:002014-06-07T12:17:24.923+02:00Create RESTful services on top of ADF Business Components<!--?xml version="1.0" encoding="UTF-8" standalone="no"?--> <br />
<div style="font-family: Arial; font-size: medium;">
<h3>
<b>Introduction</b></h3>
</div>
<div style="font-family: Arial; font-size: medium;">
Creating SOAP Services on top of ADF Model is for a long time quite easy and convenient. In JDeveloper: Open an ApplicationModule goto WebService Tab and create a Service Interface by exposing some given ViewObject Instances or custom Service methods. See <a href="http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52adf-1735897.html">http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52adf-1735897.html</a> (<span style="font-size: 13px;">Consume Early, Consume Often</span>) for more details and great explanation or take a look in the official Oracle documentation <a href="http://docs.oracle.com/cd/E23943_01/web.1111/b31974/bcextservices.htm#CJAJGIEB">http://docs.oracle.com/cd/E23943_01/web.1111/b31974/bcextservices.htm#CJAJGIEB</a> (<span style="font-size: 13px;">11 Integrating Service-Enabled Application Modules</span>)</div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
<h3>
<b>Options to create RESTful Services on top ob ADF BC Model</b></h3>
</div>
<div style="font-family: Arial; font-size: medium;">
Creating a RESTful Service Fassade on top of existing ADF Business Components Model is not that straightforward. From different „announcements" we know that Oracle plans to generate RESTful Services ADF BC SDO (Service Data Object) in the future. But for now we need a custom solution.</div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
Exploring various possibilities I came up with the following</div>
<div style="font-family: Arial; font-size: medium;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLRtSUFh38meESbys4mfl_il6kvyyPy3-B41vt7Qe7e-ZK0hb205NLMLyKZWCWdhe864FHO0weA399iMW3iLt-WMpcdzkbDKLhfVfwNKfll2o3mZpQEkGXt1MiQqunc1VtOpdTPbECIQ/s1600/9d0080ae04a3f07213b734c0e95fab3e.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLRtSUFh38meESbys4mfl_il6kvyyPy3-B41vt7Qe7e-ZK0hb205NLMLyKZWCWdhe864FHO0weA399iMW3iLt-WMpcdzkbDKLhfVfwNKfll2o3mZpQEkGXt1MiQqunc1VtOpdTPbECIQ/s1600/9d0080ae04a3f07213b734c0e95fab3e.png" height="337" width="640" /></a></div>
<br /></div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
Note that the Service Facade is optional but recommended in terms of „separation of concerns", „service virtualization", „clean code", etc. Watch the youtube ADF Insider Essentials for the detailed explanation of the Service Facade Pattern.</div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
Going from top to bottom in the diagram we have the following options</div>
<div style="font-family: Arial; font-size: medium;">
a) ADF BC -> SDO Service Interface -> WebService -> SOAP </div>
<div style="font-family: Arial; font-size: medium;">
b) ADF BC -> SDO Service Interface -> Inject EJB in REST-Resource -> REST</div>
<div style="font-family: Arial; font-size: medium;">
c) ADF BC -> Use AM Instance programmatically in REST-Resource ->REST</div>
<div style="font-family: Arial; font-size: medium;">
d) this one is planned for some 12.1.3+ release (and in future will be the default option to expose RESTful Services for a given ADF BC Model).</div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
In this post I am covering case b. I did not find a sample on the web yet. So I give it a try cause it looks like THE pragmatic approach so far.</div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
<h3>
<b>Howto</b></h3>
</div>
<div style="font-family: Arial; font-size: medium;">
For the example I am using JDeveloper 12.1.2 and the corresponding Runtim ADF 12.1.2. In order to understand the next steps I assume you know the basics of ADF and JDeveloper.</div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
1. Create ADF BC SDO SOAP Service for an Application Module:</div>
<div style="font-family: Arial; font-size: medium;">
Open the AM in „Overview", goto "Web Service" Tab. Now open the dialog to create the service interface.</div>
<div style="font-family: Arial; font-size: medium;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQgpXcaVMcfJbovTUxC-PsTUkTrhfePDm80x1EAxMTz3qSU2uu5gzE6c4Q9e8QCRiOSaHR42rzO3CM3c_U9W7sBBrUavwoKM71mkz3T9Aci3QwB6a_RMOq2T01Yjc80TMY1xG-bQ6V1A/s1600/1_8bc020dfeb9e79fe0422a3e239255622.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQgpXcaVMcfJbovTUxC-PsTUkTrhfePDm80x1EAxMTz3qSU2uu5gzE6c4Q9e8QCRiOSaHR42rzO3CM3c_U9W7sBBrUavwoKM71mkz3T9Aci3QwB6a_RMOq2T01Yjc80TMY1xG-bQ6V1A/s1600/1_8bc020dfeb9e79fe0422a3e239255622.png" height="247" width="640" /></a></div>
<br /></div>
<div style="font-family: Arial; font-size: medium;">
Choose the desired VO-Instances and apply you changes.</div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
JDeveloper should generate some files now. If you take a look in the *ServiceImpl.java Class you will notice that it is exposed as <i>Stateless Session EJB</i>. This is great!</div>
<div style="font-family: Arial; font-size: medium;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMMDQw5C8Kc_mHvbpEymZgdzvaFfTxui8gsECmdgoBXR5fjkZQz1ymUnI1iNviyEERA4nWSWPp0GqtXDTGOgyfXs9KXPy8uJYcLrfB_ht8mchKLoIhuB2g-41ooXQxz7n06drgegUyqQ/s1600/2_84aba64a079055e390ea0bf9ed99c114.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMMDQw5C8Kc_mHvbpEymZgdzvaFfTxui8gsECmdgoBXR5fjkZQz1ymUnI1iNviyEERA4nWSWPp0GqtXDTGOgyfXs9KXPy8uJYcLrfB_ht8mchKLoIhuB2g-41ooXQxz7n06drgegUyqQ/s1600/2_84aba64a079055e390ea0bf9ed99c114.png" height="350" width="640" /></a></div>
<br /></div>
<div style="font-family: Arial; font-size: medium;">
Because from now on you can use the EJB in a REST-Resource to expose it as RESTful-Service. That's what we are planning to do next.</div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
But before this step test your generated (SOAP-based) service first: Make sure you do not ran into the „StackOverflowException" because the SDO Service will try to traverse the ViewLinks recursively. So the following exception might be the one you will run into.</div>
<div style="font-family: Arial; font-size: medium;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2HZFUgnlniCZJpceN-C_4tY6LyIhYUO2n02CQ9dC_WBtV-N2M5MNYC8L4VCYdJItnDzePIg07lAhNI1PZ898n4ku1uWDF7MUqSIcQmbamV9CT0ahO8wNp0WahoNSBXxGndMrIwWI2Qw/s1600/7bec40daf04be447886d5aabdf611827-741811.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2HZFUgnlniCZJpceN-C_4tY6LyIhYUO2n02CQ9dC_WBtV-N2M5MNYC8L4VCYdJItnDzePIg07lAhNI1PZ898n4ku1uWDF7MUqSIcQmbamV9CT0ahO8wNp0WahoNSBXxGndMrIwWI2Qw/s320/7bec40daf04be447886d5aabdf611827-741811.png" id="BLOGGER_PHOTO_ID_6022124153157573650" /></a></div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
To fix this, open the corresponding ViewLink and uncheck the property „Generate Property in SDO"</div>
<div style="font-family: Arial; font-size: medium;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikppUBa_ii4j47rTNj7m3VdodbnfrJYgdJpnijHxReq1J5mdg0z8y8xlp8RkNFDn4k1ErqKYwJ1oJPupNMQJZI2Xpkk1riWmal6umGo2Mrxzx90VqxLd0y78LDzlNUXqZJ4us0G3Jh6A/s1600/3_2c02150a1909fbcd99a4eb0b96897734.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikppUBa_ii4j47rTNj7m3VdodbnfrJYgdJpnijHxReq1J5mdg0z8y8xlp8RkNFDn4k1ErqKYwJ1oJPupNMQJZI2Xpkk1riWmal6umGo2Mrxzx90VqxLd0y78LDzlNUXqZJ4us0G3Jh6A/s1600/3_2c02150a1909fbcd99a4eb0b96897734.png" height="329" width="640" /></a></div>
<br /></div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
2. Next: Create a new Project for the RESTful Service</div>
<div style="font-family: Arial; font-size: medium;">
Use the right project template from the NEW-Wizard</div>
<div style="font-family: Arial; font-size: medium;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidSI4ZaZOLjN76wQJXmel5liC1cOAtvVdEhGJ8kNHtTQY_-1GEsbmhshwdMuZOTMTSsOnyz_5DX6P_U-lixbSn-m3vOdWlU2SRSAus5BHEcrPxdiji_E_3JKASRaMbeqVH1BZFuRDNeg/s1600/e91d391a67d74cb2c0e17a897e93aa47-746670.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidSI4ZaZOLjN76wQJXmel5liC1cOAtvVdEhGJ8kNHtTQY_-1GEsbmhshwdMuZOTMTSsOnyz_5DX6P_U-lixbSn-m3vOdWlU2SRSAus5BHEcrPxdiji_E_3JKASRaMbeqVH1BZFuRDNeg/s320/e91d391a67d74cb2c0e17a897e93aa47-746670.png" id="BLOGGER_PHOTO_ID_6022124170437200130" /></a></div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
Open the NEW-Wizard again and create a RESTful service from new</div>
<div style="font-family: Arial; font-size: medium;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpbyv0Hm6SkA_1NV1oOYDklsuziuP0rq4yKWNqImCXOsdkJhKsuhZHh-jrP-oGWqVAV-c9CmjAFbqzW4AsoV8z4b_VhiYB_lJJERCFDy6R9dkMp68uNmFPgi3eGwuBWjZ20-BNHiaM8w/s1600/97c0286f9eac3d6e9b761c9f545eb339-748386.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpbyv0Hm6SkA_1NV1oOYDklsuziuP0rq4yKWNqImCXOsdkJhKsuhZHh-jrP-oGWqVAV-c9CmjAFbqzW4AsoV8z4b_VhiYB_lJJERCFDy6R9dkMp68uNmFPgi3eGwuBWjZ20-BNHiaM8w/s320/97c0286f9eac3d6e9b761c9f545eb339-748386.png" id="BLOGGER_PHOTO_ID_6022124177077443202" /></a></div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
Deselect the Checkbox in front of GET-Method. We are going to do that later in Sourcecode.</div>
<div style="font-family: Arial; font-size: medium;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHu4nNet57oo0DvVZNAN_Qvk1hZbggro4gGYEcJlhhm3CI21e-Ih-NyRi1fdyuk5XoBUKWEY5LSQq4zJN9fp6EcTaQkmH7TQDdAgHwR-lc-fF9J6Lfmwq7IbbpnqUshOP86HHyqGUBng/s1600/c662b05f877d8f28c68103b6997c631d-750860.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHu4nNet57oo0DvVZNAN_Qvk1hZbggro4gGYEcJlhhm3CI21e-Ih-NyRi1fdyuk5XoBUKWEY5LSQq4zJN9fp6EcTaQkmH7TQDdAgHwR-lc-fF9J6Lfmwq7IbbpnqUshOP86HHyqGUBng/s320/c662b05f877d8f28c68103b6997c631d-750860.png" id="BLOGGER_PHOTO_ID_6022124188718187938" /></a></div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
Finish. => This should generate a Java class and configure the project with the Jersey Library.</div>
<div style="font-family: Arial; font-size: medium;">
For the sample to complete the project needs on more adjustment in the project properties. </div>
<div style="font-family: Arial; font-size: medium;">
- One more Library (Context and Dependency Injection CDI)</div>
<div style="font-family: Arial; font-size: medium;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmj4Osf0u4aMJK96VKxpYdPMBUC1Y3Ut3l5E0g2lyWqIqhp_iRPpomxGOpMHKDr6F7jMwteC_MswpphLKa9yDgrV7HXu3UAy9BFP0YUcu9zHjIDxajLDLbCH1We-P8ufHTHxBb1JUS8g/s1600/180ff7721eb0af0a2d699537eca0deaa-753530.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmj4Osf0u4aMJK96VKxpYdPMBUC1Y3Ut3l5E0g2lyWqIqhp_iRPpomxGOpMHKDr6F7jMwteC_MswpphLKa9yDgrV7HXu3UAy9BFP0YUcu9zHjIDxajLDLbCH1We-P8ufHTHxBb1JUS8g/s320/180ff7721eb0af0a2d699537eca0deaa-753530.png" id="BLOGGER_PHOTO_ID_6022124199175867250" /></a></div>
<div style="font-family: Arial; font-size: medium;">
and a dependency to the Model-Project because the RESTfulWebService project need access to the application module.</div>
<div style="font-family: Arial; font-size: medium;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvhffntb8RRIDxkQXDKGbCyWWYcRMjkaYrua70qiImPVavzLURpdLvY25KLOBseOuq6GJj4TzRDB61lbt_Kh-J1eKP2U4kbzu_R3AYSZ6IKLq-UVPAmOuLeY1BZUyzpdGAvwNIZ9oMqg/s1600/df514c9f2b94c98edc2913d4754a4a2b-756118.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvhffntb8RRIDxkQXDKGbCyWWYcRMjkaYrua70qiImPVavzLURpdLvY25KLOBseOuq6GJj4TzRDB61lbt_Kh-J1eKP2U4kbzu_R3AYSZ6IKLq-UVPAmOuLeY1BZUyzpdGAvwNIZ9oMqg/s320/df514c9f2b94c98edc2913d4754a4a2b-756118.png" id="BLOGGER_PHOTO_ID_6022124212620242626" /></a></div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
Thats all for the project setup.</div>
<div style="font-family: Arial; font-size: medium;">
<br /></div>
<div style="font-family: Arial; font-size: medium;">
3. Add some classes, annotations and the methods you want to expose</div>
<div style="font-family: Arial; font-size: 13px;">
<br /></div>
<div style="font-family: Arial; font-size: 13px;">
<div>
import javax.ejb.EJB;</div>
<div>
<br /></div>
<div>
import javax.inject.Singleton;</div>
<div>
<br /></div>
<div>
import javax.ws.rs.GET;</div>
<div>
import javax.ws.rs.Path;</div>
<div>
import javax.ws.rs.PathParam;</div>
<div>
import javax.ws.rs.Produces;</div>
<div>
<br /></div>
<div>
import oracle.jbo.service.errors.ServiceException;</div>
<div>
<br /></div>
<div>
@Singleton</div>
<div>
@Path("api")</div>
<div>
public class HrRESTResource {</div>
<div>
</div>
<div>
@EJB</div>
<div>
HRAppModuleService serviceBean;</div>
<div>
</div>
<div>
public HrRESTResource() {</div>
<div>
}</div>
<div>
</div>
<div>
/**</div>
<div>
* getEmployeesView1: generated method. Do not modify.</div>
<div>
*/</div>
<div>
@GET</div>
<div>
@Path("emp/{empId}")</div>
<div>
@Produces(value = { "application/json", "application/xml" })</div>
<div>
public EmpResult getEmployeesView1(@PathParam("empId") Integer employeeId) throws ServiceException {</div>
<div>
</div>
<div>
EmployeesViewSDO empSDO = serviceBean.getEmployeesView1(employeeId);</div>
<div>
</div>
<div>
EmpResult result = new EmpResult();</div>
<div>
result.setEmployee(empSDO);</div>
<div>
</div>
<div>
return result;</div>
<div>
}</div>
<div>
</div>
<div>
@GET</div>
<div>
@Path("depts")</div>
<div>
@Produces(value = { "application/json", "application/xml" })</div>
<div>
public DeptResult findAllDepartments() throws ServiceException {</div>
<div>
DeptResult result = new DeptResult();</div>
<div>
result.setDepartmentList(serviceBean.findDepartmentsView1(null, null));</div>
<div>
</div>
<div>
return result;</div>
<div>
</div>
<div>
}</div>
<div>
}</div>
<div>
<br /></div>
<div>
<u>Important note: For what ever reason you need to annotate the REST-Resource with @javax.inject.Singleton. Otherwise the EJB-Injection won't work.</u></div>
<div>
<u><br /></u></div>
<div>
Just reuse the SDO-Entity-classes (eg. EmployeesViewSDO), but wrap them inside a custom „Result"-class which should be annotated with @XmlRootElement (JAX-B Standard). </div>
<div>
<span style="font-family: Andale Mono;"><br class="Apple-interchange-newline" />@XmlRootElement</span><br />
<div>
<span style="font-family: Andale Mono;">public class DeptResult {</span></div>
<div>
<span style="font-family: Andale Mono;"> public DeptResult() {</span></div>
<div>
<span style="font-family: Andale Mono;"> super();</span></div>
<div>
<span style="font-family: Andale Mono;"> }</span></div>
<div>
<span style="font-family: Andale Mono;"> </span></div>
<div>
<span style="font-family: Andale Mono;"> @XmlElement(name="departments")</span></div>
<div>
<span style="font-family: Andale Mono;"> private List<DepartmentsViewSDO> departmentList;</span></div>
<div>
<span style="font-family: Andale Mono;"><br /></span></div>
<div>
<span style="font-family: Andale Mono;"> public void setDepartmentList(List<DepartmentsViewSDO> departmentList) {</span></div>
<div>
<span style="font-family: Andale Mono;"> this.departmentList = departmentList;</span></div>
<div>
<span style="font-family: Andale Mono;"> }</span></div>
<div>
<span style="font-family: Andale Mono;"><br /></span></div>
<div>
<span style="font-family: Andale Mono;"> public List<DepartmentsViewSDO> getDepartmentList() {</span></div>
<div>
<span style="font-family: Andale Mono;"> return departmentList;</span></div>
<div>
<span style="font-family: Andale Mono;"> }</span></div>
<div>
<span style="font-family: Andale Mono;">}</span></div>
</div>
<div>
See attached sample application for the whole source code.</div>
</div>
<div style="font-family: Arial; font-size: 13px;">
<br /></div>
<div style="font-family: Arial; font-size: 13px;">
4. Run an see the RESTful service in action</div>
<div style="font-family: Arial; font-size: 13px;">
<br /></div>
<div style="font-family: Arial; font-size: 13px;">
<div>
As a result we will get the proper JSON structure</div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRHfrpNKEX_UEj1Em-I7ZWFLMvAsCCgzcCvzyvqqMo0MsWTs_AACqo2p2bWxLoRrxwuzsbYbMnb7TEBQQ1QKssDMx6M7c_wO2i19dtLdwo7Uhc6nScbXYyDZUJhyphenhyphenhFYD59l4CuMAkzLg/s1600/bc53cabbc8da50ea669d806a4638fdce-758174.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRHfrpNKEX_UEj1Em-I7ZWFLMvAsCCgzcCvzyvqqMo0MsWTs_AACqo2p2bWxLoRrxwuzsbYbMnb7TEBQQ1QKssDMx6M7c_wO2i19dtLdwo7Uhc6nScbXYyDZUJhyphenhyphenhFYD59l4CuMAkzLg/s320/bc53cabbc8da50ea669d806a4638fdce-758174.png" id="BLOGGER_PHOTO_ID_6022124222918567266" /></a></div>
<div>
<br /></div>
</div>
<div style="font-family: Arial; font-size: 13px;">
<br /></div>
<div style="font-family: Arial; font-size: 13px;">
if changing the accept- Header to: application/xml we will get XML-Result. </div>
<div style="font-family: Arial; font-size: 13px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ8K5mH9Kb5HCROUixVWQ12DZ9_XpC7gpfJcmmtXylwoi1JZOapyQojxCyM6RndWc5hRytgXjthNKv5EvsqfzjxeQwQAGx1VKovugi3aXUbPPlYFidcaUBH2EuBsDPrvVxR9B7OFbIDg/s1600/71b3519a0cd48d1399871cf05b270df6-760213.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ8K5mH9Kb5HCROUixVWQ12DZ9_XpC7gpfJcmmtXylwoi1JZOapyQojxCyM6RndWc5hRytgXjthNKv5EvsqfzjxeQwQAGx1VKovugi3aXUbPPlYFidcaUBH2EuBsDPrvVxR9B7OFbIDg/s320/71b3519a0cd48d1399871cf05b270df6-760213.png" id="BLOGGER_PHOTO_ID_6022124230128363586" /></a></div>
<div style="font-family: Arial; font-size: 13px;">
<br /></div>
<div style="font-family: Arial; font-size: 13px;">
This is pretty cool. Because we can reuse the generated ADF BC SDO SOAP Service Layer as EJB for the REST Fassade.</div>
<div style="font-family: Arial; font-size: 13px;">
<br />
Download sample application, based on Version ADF 12.1.2: <a href="https://app.box.com/s/zoc6ivzsm7ihmpy7idh6" target="_blank">enpit.sample.adf12.restadfbc-jdev1212.zip</a></div>
<div style="font-family: Arial; font-size: 13px;">
<br /></div>
<div style="font-family: Arial; font-size: 13px;">
<b>More Information</b></div>
<div style="font-family: Arial; font-size: 13px;">
<br /></div>
<div>
<br />
<ul>
<li style="font-family: Arial; font-size: 13px;">(Integrating Service-Enabled Application Module, 11.1.2.4) <a href="http://docs.oracle.com/cd/E37975_01/web.111240/e16182/bcextservices.htm#CJAJGIEB">http://docs.oracle.com/cd/E37975_01/web.111240/e16182/bcextservices.htm#CJAJGIEB</a></li>
<li><span style="font-family: Arial; font-size: x-small;"><a href="http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52adf-1735897.html" target="_blank">Consume Early, Consume Often (Oracle Magazin, by Frank Nimphius)</a></span></li>
</ul>
</div>
<div style="font-family: Arial; font-size: 13px;">
<br /></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04129837159001672919noreply@blogger.com7