<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5874979429188093780</id><updated>2012-02-02T22:00:33.210+01:00</updated><category term='Tuning'/><category term='OFUG'/><category term='Podcasts'/><category term='Contextual Events'/><category term='AIA'/><category term='Oracle Fusion'/><category term='UCM'/><category term='Workarounds'/><category term='Build'/><category term='Oracle Magazine'/><category term='Business Groups'/><category term='Spatial'/><category term='Integration'/><category term='Security'/><category term='Apple'/><category term='SOA'/><category term='ADF Code Corner'/><category term='WebLogic'/><category term='Testing'/><category term='Oracle OpenWorld'/><category term='ODTUG Kaleidoscope'/><category term='UKOUG'/><category term='BPM 11g'/><category term='Forms'/><category term='Events'/><category term='Traveling'/><category term='ADF Task Flow'/><category term='MDS'/><category term='ADF Query'/><category term='JDeveloper 11g'/><category term='Enterprise Manager'/><category term='Automation'/><category term='LOV'/><category term='Mobile'/><category term='WebCenter'/><category term='Red Samurai'/><category term='TopLink'/><category term='Web Services'/><category term='JDeveloper 11g R2'/><category term='BPM'/><category term='Extensions'/><category term='BPEL'/><category term='Groovy'/><category term='ADF'/><category term='Vgo Software'/><category term='RIDC'/><category term='Versioning'/><category term='Locking'/><category term='iPhone'/><category term='Apex'/><category term='Bugs'/><category term='Tree'/><category term='Linux'/><category term='Oracle Specialization'/><category term='Nomination'/><category term='Case Study'/><category term='Web Tier'/><category term='Uncategorized'/><title type='text'>Andrejus Baranovskis's Blog</title><subtitle type='html'>Blog about Oracle technology</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default?start-index=101&amp;max-results=100'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>454</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-7030147688422074511</id><published>2012-01-31T16:29:00.001+01:00</published><updated>2012-01-31T16:29:30.765+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Data Control and Session Scope Use Case to Control Web Browser Tabs</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Sometimes there are unique requirements, for example we want to allow access to application screens only from single browser tab. If application screen is accessed within the same session, but from another browser tab - access should be disabled. In order to implement such requirement, we need to track if application was already accessed from the same session - if yes, access id disabled. We can implement this by combination of Data Control and Session Scope usage.&lt;br /&gt;&lt;br /&gt;Blog reader was asking what is the difference storing variable value in Session Scope or in Data Control - &lt;a href="http://andrejusb.blogspot.com/2011/02/adf-region-communication-region-refresh.html"&gt;ADF Region Communication - Region Refresh Through Contextual Event&lt;/a&gt;. One of the main differences - Session Scope is available across session and is accessible from multiple browser tabs. Data Control is always reset for the new browser tab. Also you need to be careful not to reset Data Control, by entering into Isolated Scope TF.&lt;br /&gt;&lt;br /&gt;Download completed sample application to control Web browser tabs access - &lt;a href="http://jdevsamples.googlecode.com/files/SessionDataControlApp.zip"&gt;SessionDataControlApp.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In order to test this sample, login as redsam/welcome1 user:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-fn6O7Rz8HtM/TygB9wV4i3I/AAAAAAAAF7o/6Dw95qQJIW0/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="76" src="http://2.bp.blogspot.com/-fn6O7Rz8HtM/TygB9wV4i3I/AAAAAAAAF7o/6Dw95qQJIW0/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Open application screen:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7o6t2mi74Xg/TygCO_CQreI/AAAAAAAAF7w/U-E6R8atMxw/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="192" src="http://1.bp.blogspot.com/-7o6t2mi74Xg/TygCO_CQreI/AAAAAAAAF7w/U-E6R8atMxw/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Open second browser tab (it depends on browser settings, but in most of the cases different tabs are using same session) and access application screen - access will be restricted, by custom login implemented inside sample application:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-IpqCxNribkY/TygCnV6ET_I/AAAAAAAAF74/9W_U_-bCi_s/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="249" src="http://2.bp.blogspot.com/-IpqCxNribkY/TygCnV6ET_I/AAAAAAAAF74/9W_U_-bCi_s/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Application screen from the first tab is working well:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-qyuTxrF866w/TygDIIV884I/AAAAAAAAF8A/fKH7zuLPpJg/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="218" src="http://1.bp.blogspot.com/-qyuTxrF866w/TygDIIV884I/AAAAAAAAF8A/fKH7zuLPpJg/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;How this is implemented? Well - there is simple POJO class, which stores session Id variable:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-R_kIqo2x6bo/TygDW2Rh90I/AAAAAAAAF8I/5Smzgry2izg/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-R_kIqo2x6bo/TygDW2Rh90I/AAAAAAAAF8I/5Smzgry2izg/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ADF Data Control is generated on top of this class:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gNy6WDpzgyg/TygDlXGQQ0I/AAAAAAAAF8Q/0TsLQYMmfZ8/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-gNy6WDpzgyg/TygDlXGQQ0I/AAAAAAAAF8Q/0TsLQYMmfZ8/s320/7.png" width="214" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There is UI template, it contains &lt;i&gt;switcher&lt;/i&gt; component, with two facets - &lt;i&gt;noaccess&lt;/i&gt; and &lt;i&gt;content&lt;/i&gt;. Based on custom logic - page content is rendered inside &lt;i&gt;content&lt;/i&gt; facet, if application screen is accessed within the same session from another browser tab - &lt;i&gt;noaccess&lt;/i&gt; facet is rendered:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Jwf2rLrpaZM/TygEfm9tsdI/AAAAAAAAF8Y/eTtJdxdBjt0/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Jwf2rLrpaZM/TygEfm9tsdI/AAAAAAAAF8Y/eTtJdxdBjt0/s1600/8.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Facet rendering logic is calculated inside managed bean method:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-X73U4TtR63I/TygFBRSLLQI/AAAAAAAAF8g/gTZgo-2F_rU/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="http://3.bp.blogspot.com/-X73U4TtR63I/TygFBRSLLQI/AAAAAAAAF8g/gTZgo-2F_rU/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;UI template is enabled with Page Definition and can access Data Control methods:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-5-5RWv4C_7I/TygFKvpkdRI/AAAAAAAAF8o/h0JExjFLFAs/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="168" src="http://1.bp.blogspot.com/-5-5RWv4C_7I/TygFKvpkdRI/AAAAAAAAF8o/h0JExjFLFAs/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Custom method checks if Session Scope variable was initialized. If no - means its first access. It sets both Session Scope and Data Control variables. If Session Scope variable was already initialized - it checks if Data Control variable is empty. In case of empty Data Control variable - user is accessing application within the same session from another browser tab - access will be restricted.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-YxnhG75wtic/TygI0WlPYWI/AAAAAAAAF8w/qSLFEiD5_wc/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://2.bp.blogspot.com/-YxnhG75wtic/TygI0WlPYWI/AAAAAAAAF8w/qSLFEiD5_wc/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-7030147688422074511?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/7030147688422074511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=7030147688422074511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7030147688422074511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7030147688422074511'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2012/01/data-control-and-session-scope-use-case.html' title='Data Control and Session Scope Use Case to Control Web Browser Tabs'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-fn6O7Rz8HtM/TygB9wV4i3I/AAAAAAAAF7o/6Dw95qQJIW0/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-6901772946917086191</id><published>2012-01-21T11:32:00.000+01:00</published><updated>2012-01-21T11:39:34.970+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>How to Access Session Scope in ADF BC</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Often we need to access environment variables across all layers of ADF (Model and View-Controller). Usually we store environment variables in session scope, this makes them accessible for the duration of user session. Its common practice to retrieve values from session scope in View-Controller layer. However, is not so common to access session scope from ADF BC. Somehow there is such preconception, that its not possible to access session scope variables from ADF BC. But its possible (no need to add JSF libraries into Model) and I will explain in this short post how to do this.&lt;br /&gt;&lt;br /&gt;If we want to store custom variable values in ADF BC, we can use UserData object - &lt;b&gt;adf.userSession.userData&lt;/b&gt;. But this approach is not attractive - UserData is reset during passivation/activation and all custom variable values will be lost. Instead, we can store custom variable values in session scope. Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/SecurityFormLogin_v2.zip"&gt;SecurityFormLogin_v2.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sample application populates environment variables during Login action (it sets server name and port):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-S043xzS5zDI/TxqQ3Uw4WqI/AAAAAAAAF60/vw0NISzZv0U/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="259" src="http://2.bp.blogspot.com/-S043xzS5zDI/TxqQ3Uw4WqI/AAAAAAAAF60/vw0NISzZv0U/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Environment variables are stored in HTTP session, means accessible from session scope.&lt;br /&gt;&lt;br /&gt;Now main topic of this post, you can access HTTP session from ADF BC by getting session scope from ADF context:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-vcV2iKfFj5k/TxqReA1zAlI/AAAAAAAAF68/0u3Wr3P366w/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="199" src="http://3.bp.blogspot.com/-vcV2iKfFj5k/TxqReA1zAlI/AAAAAAAAF68/0u3Wr3P366w/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In this example, we are retrieving server name environment variable from HTTP session scope inside ADF BC prepareSession(Session)&amp;nbsp;overridden method.&lt;br /&gt;&lt;br /&gt;Let's test if value is not lost during passivation/activation. To test this, simply disable Application Module Pooling option from Application Module configuration:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-js96uoH_-Os/TxqSKfxHytI/AAAAAAAAF7E/cuNgTudHQn0/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="275" src="http://2.bp.blogspot.com/-js96uoH_-Os/TxqSKfxHytI/AAAAAAAAF7E/cuNgTudHQn0/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Open sample application, login as redsam/welcome1:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-tYzOYgLLwjg/TxqScNHHdfI/AAAAAAAAF7M/t20QGHjw5ZI/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="http://3.bp.blogspot.com/-tYzOYgLLwjg/TxqScNHHdfI/AAAAAAAAF7M/t20QGHjw5ZI/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now, because AM pooling is disabled - on each request (button click) passivation/activation happens:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-7e1MEYjD5mo/TxqUCaj-S-I/AAAAAAAAF7c/BbB2MkzBn0E/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="224" src="http://4.bp.blogspot.com/-7e1MEYjD5mo/TxqUCaj-S-I/AAAAAAAAF7c/BbB2MkzBn0E/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-6901772946917086191?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/6901772946917086191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=6901772946917086191' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6901772946917086191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6901772946917086191'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2012/01/how-to-access-session-scope-in-adf-bc.html' title='How to Access Session Scope in ADF BC'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-S043xzS5zDI/TxqQ3Uw4WqI/AAAAAAAAF60/vw0NISzZv0U/s72-c/1.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-6419350965111339521</id><published>2012-01-17T20:59:00.002+01:00</published><updated>2012-01-17T20:59:20.108+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Workarounds'/><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>What Else Can Go Wrong when Extending WebCenter Spaces</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;If you are extending WebCenter Spaces with custom ADF Task Flows - make sure to deploy custom ADF Task Flows project library as ADF Library JAR, not just as a simple JAR (more about this - &lt;a href="http://andrejusb.blogspot.com/2012/01/wrong-deployment-profile-for-extending.html"&gt;Wrong Deployment Profile to Extend WebCenter Spaces&lt;/a&gt;). What else to keep in mind? Well there is one thing, you don't want to get when extending WebCenter Spaces - &lt;i&gt;java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.application.ApplicationFactory&lt;/i&gt;. This exception will be thrown, if WebCenter Spaces workspace (one we are using to deploy custom code to WebCenter Spaces) contains invalid web.xml file. I will describe in this post how this configuration file can become invalid and how to fix it.&lt;br /&gt;&lt;br /&gt;First, let's refer to Oracle documentation specific to this subject - &lt;a href="http://www.oracle.com/technetwork/middleware/webcenter/owcs-ps4-wcs-ext-samples-wp-406559.pdf"&gt;Using WebCenter Spaces Extension Samples (11.1.1.5.0)&lt;/a&gt;. Documentation says that web.xml entries should be commented out if we don't want to deploy session timeout related custom code - means web.xml should be empty in the most of the cases:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-5wIofqsYl8Y/TxVpDv4ZpGI/AAAAAAAAF5c/noXZxMVztcQ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="66" src="http://2.bp.blogspot.com/-5wIofqsYl8Y/TxVpDv4ZpGI/AAAAAAAAF5c/noXZxMVztcQ/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Use empty web.xml from WebCenter Spaces workspace to extend WebCenter Spaces with custom library:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-rXWNyMz4MT0/TxXHqVPrxoI/AAAAAAAAF5k/ib41FoVCObY/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="147" src="http://3.bp.blogspot.com/-rXWNyMz4MT0/TxXHqVPrxoI/AAAAAAAAF5k/ib41FoVCObY/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once we are familiar with the process of extending WebCenter Spaces, what we would do now? Most likely develop one more ADF library and add it to the project inside WebCenter Spaces workspace to be uploaded to WebCenter server:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_zjeAGZhhmg/TxXJJzCgtII/AAAAAAAAF5s/xJ0hRicFSIk/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://1.bp.blogspot.com/-_zjeAGZhhmg/TxXJJzCgtII/AAAAAAAAF5s/xJ0hRicFSIk/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once new library is imported, we can deploy entire package to the WebCenter server:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-zbxsuPfQ8sg/TxXJVlCN0yI/AAAAAAAAF50/uR_0JS0KPwI/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://4.bp.blogspot.com/-zbxsuPfQ8sg/TxXJVlCN0yI/AAAAAAAAF50/uR_0JS0KPwI/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And here comes exception - &lt;i&gt;could not find Factory: javax.faces.application.ApplicationFactory&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-n2-7z8wFGl4/TxXJuXq2vTI/AAAAAAAAF58/LypZDRMW8m0/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" src="http://2.bp.blogspot.com/-n2-7z8wFGl4/TxXJuXq2vTI/AAAAAAAAF58/LypZDRMW8m0/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Obviously WebCenter Spaces extending failed, if we try to access WebCenter Spaces - it shows similar exception:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sCE_M3xsjzQ/TxXJ8BN6UdI/AAAAAAAAF6E/tFIUcxG1f0s/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="21" src="http://3.bp.blogspot.com/-sCE_M3xsjzQ/TxXJ8BN6UdI/AAAAAAAAF6E/tFIUcxG1f0s/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You can follow predefined procedure to rollback custom WebCenter Spaces library, if extending fails. But why it would break?&lt;br /&gt;&lt;br /&gt;Double check web.xml:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-MhoccGakxQs/TxXKR-__9fI/AAAAAAAAF6M/DHHtOELaDeQ/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-MhoccGakxQs/TxXKR-__9fI/AAAAAAAAF6M/DHHtOELaDeQ/s1600/7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Its not empty anymore, contains lots of entries:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-R1NENsfuS-w/TxXRZawHavI/AAAAAAAAF6U/uZg5eueGNXY/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="313" src="http://2.bp.blogspot.com/-R1NENsfuS-w/TxXRZawHavI/AAAAAAAAF6U/uZg5eueGNXY/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;How come these entries were added? Simply JDeveloper is synchronizing web.xml each time, when you add new ADF Library:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-auKjyTgRFoI/TxXRq2lkEdI/AAAAAAAAF6c/jHS7AdIZgf0/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://3.bp.blogspot.com/-auKjyTgRFoI/TxXRq2lkEdI/AAAAAAAAF6c/jHS7AdIZgf0/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It adds ADF library configuration entries, however these entries are not required when extending WebCenter Spaces and are causing extending failure. Each time after you import new ADF library, make sure web.xml stays clean:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-zD2kEMO9Gl4/TxXSL35QiMI/AAAAAAAAF6k/MU7_PQPSdLs/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="231" src="http://3.bp.blogspot.com/-zD2kEMO9Gl4/TxXSL35QiMI/AAAAAAAAF6k/MU7_PQPSdLs/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Extended WebCenter Spaces is fixed and works:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-eO4-HS72aRI/TxXTC7SqvcI/AAAAAAAAF6s/JHQJ1MomdwU/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="137" src="http://1.bp.blogspot.com/-eO4-HS72aRI/TxXTC7SqvcI/AAAAAAAAF6s/JHQJ1MomdwU/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-6419350965111339521?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/6419350965111339521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=6419350965111339521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6419350965111339521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6419350965111339521'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2012/01/what-else-can-go-wrong-when-extending.html' title='What Else Can Go Wrong when Extending WebCenter Spaces'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-5wIofqsYl8Y/TxVpDv4ZpGI/AAAAAAAAF5c/noXZxMVztcQ/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-2230293042487006083</id><published>2012-01-14T18:35:00.002+01:00</published><updated>2012-01-15T13:51:06.783+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><title type='text'>ADF Performance Marathon - 22 Hours Stress Test</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;My goal was to test how scalable is ADF framework classical stack and if it can run for longer periods of time under constant runtime access. Experiment results - yes, ADF is scalable framework. There are people who complain about ADF performance, please leave your comment if you are not happy with ADF - this post is dedicated to you. But before leaving your comment - please think about house construction process. Even when using good quality tools and materials, still there is no guarantee that materials will be assembled correctly and house construction result will be as expected. What I mean is - ADF application performance depends a lot how you are building your application, if you are following ADF best practices. Would you hire builders to build your house without previous house construction experience? Think same about ADF - would you hire developers without ADF experience to build ADF application? Yes, it happens quite often - people are building ADF applications without ADF experience. However, they tend to forget this fact, because its easier to blame framework at the end.&lt;br /&gt;&lt;br /&gt;I was running performance test with standard Oracle ADF sample application - &lt;a href="http://www.oracle.com/technetwork/developer-tools/jdev/learnmore/fod1111-407812.html"&gt;Oracle Fusion Order Demo Application For JDeveloper 11.1.1.5&lt;/a&gt;. Performance test was executed with JMeter, download test script - &lt;a href="http://jdevsamples.googlecode.com/files/AMTest_Long.jmx"&gt;AMTest_Long.jmx&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;ADF BC was configured to support 50 concurrent users (Referenced Pool Size = 50), but stress test was executed with 200 users to show ADF scalability with larger number of users.&lt;br /&gt;&lt;br /&gt;Performance test details:&lt;br /&gt;&lt;br /&gt;- Duration: 22 hours&lt;br /&gt;- Online concurrent users: 200&lt;br /&gt;- Action frequency per user: ~20 requests, break for 1 minute after each 20 requests&lt;br /&gt;- ADF Framework: 11g PS4, ADF BC, ADF Task Flows, ADF Faces&lt;br /&gt;- ADF BC Tuning: Referenced Pool Size = 50, Database Pooling enabled, DB Passivation disabled&lt;br /&gt;- Hardware: 7 GB RAM, 4 Processors&lt;br /&gt;- JVM tuning: Sun JVM defaults&lt;br /&gt;&lt;br /&gt;During this stress test each user selects different items and then is browsing shopping cart details:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2XqZgsWcBfw/TxG10PYtR0I/AAAAAAAAF34/knrRV5UBG5o/s1600/0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://4.bp.blogspot.com/-2XqZgsWcBfw/TxG10PYtR0I/AAAAAAAAF34/knrRV5UBG5o/s320/0.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In order to run long stress test, start JMeter in command line mode (otherwise JMeter will get out of memory exception after hour or so). jmeter -n -t jmeter_script:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-V5htv1a4QnA/TxG2aq2bcCI/AAAAAAAAF4A/xrNaCsgdUX8/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="195" src="http://1.bp.blogspot.com/-V5htv1a4QnA/TxG2aq2bcCI/AAAAAAAAF4A/xrNaCsgdUX8/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Stress test was started around 4 PM, January 13th&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;- Active sessions: 200&lt;br /&gt;- Request processing time: 70 ms (0.07 second)&lt;br /&gt;- Requests per minute: ~600&lt;br /&gt;- AM active instances: 50&lt;br /&gt;- AM passivations per minute: ~200 (this allows to support larger number of users, than configured by Referenced Pool Size)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zkuTuC1cIn4/TxG3_I9ND6I/AAAAAAAAF4I/8b75j16jikU/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" src="http://1.bp.blogspot.com/-zkuTuC1cIn4/TxG3_I9ND6I/AAAAAAAAF4I/8b75j16jikU/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There are 50 Active AM instances, but only 4 DB connections are used as maximum:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-EfkTsd9LzrE/TxG4SkEtrwI/AAAAAAAAF4Q/MQSSfui9qGk/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="139" src="http://2.bp.blogspot.com/-EfkTsd9LzrE/TxG4SkEtrwI/AAAAAAAAF4Q/MQSSfui9qGk/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In order to minimize DB connections usage, I have enabled DB pooling and set to store passivation data in memory instead of using database PS_TXN table, based on my previous tests - &lt;a href="http://andrejusb.blogspot.com/2011/11/stress-testing-oracle-adf-bc_16.html"&gt;Stress Testing Oracle ADF BC Applications - Do Connection Pooling and TXN Disconnect Level&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Stress test was finished around 2 PM, January 14th&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;- Active sessions: 200&lt;br /&gt;- Request processing time: 100 ms (0.1 second, increased because different set of requests applied)&lt;br /&gt;- Requests per minute: ~600&lt;br /&gt;- AM active instances: 50&lt;br /&gt;- AM passivations per minute: ~200&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-nmy82MK3e98/TxG7FZzrMhI/AAAAAAAAF4Y/YcVs6_mOu9A/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://1.bp.blogspot.com/-nmy82MK3e98/TxG7FZzrMhI/AAAAAAAAF4Y/YcVs6_mOu9A/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This shows almost no change in ADF application runtime performance, even after 22 hours of continuos runtime access - good news.&lt;br /&gt;&lt;br /&gt;There was no change in DB connections usage - it stays low:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-fw5Jz-jhwEc/TxG7QOJHVPI/AAAAAAAAF4g/YWhNLdULF-Y/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="91" src="http://1.bp.blogspot.com/-fw5Jz-jhwEc/TxG7QOJHVPI/AAAAAAAAF4g/YWhNLdULF-Y/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There are no warnings in WebLogic status:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Jt_PnMPgXPQ/TxG7a-guPEI/AAAAAAAAF4o/MogvHrm8CpM/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Jt_PnMPgXPQ/TxG7a-guPEI/AAAAAAAAF4o/MogvHrm8CpM/s1600/6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;FOD application module settings were tuned to support only 50 concurrent users, but it was working well with 200:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-nI6dDfW9cDE/TxG7uX0j2EI/AAAAAAAAF4w/F5tg6xcDx9Y/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" src="http://1.bp.blogspot.com/-nI6dDfW9cDE/TxG7uX0j2EI/AAAAAAAAF4w/F5tg6xcDx9Y/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;DB connection pooling was enabled along with virtual memory for passivation:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-XUZoLdtn3mI/TxG7568ObCI/AAAAAAAAF44/A7UIvjXn5KU/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="251" src="http://1.bp.blogspot.com/-XUZoLdtn3mI/TxG7568ObCI/AAAAAAAAF44/A7UIvjXn5KU/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;JMeter script was configured with 200 online users:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RghGH2x9X-4/TxG8OvjkKWI/AAAAAAAAF5A/8_A9ayJKI8A/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="189" src="http://1.bp.blogspot.com/-RghGH2x9X-4/TxG8OvjkKWI/AAAAAAAAF5A/8_A9ayJKI8A/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Two main loop controllers were defined, first loop controller triggers 50 loops for ~20 requests with wait time of 1 minute after all requests are executed from current iteration:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RScgkGtRVI8/TxG8gVOqYuI/AAAAAAAAF5I/pa8-rP5or4M/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-RScgkGtRVI8/TxG8gVOqYuI/AAAAAAAAF5I/pa8-rP5or4M/s320/11.png" width="299" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Second loop controller runs forever, this allows to execute really long ADF application stress test:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-OuDEWjOWMXg/TxG80NpDZxI/AAAAAAAAF5Q/q38PnmXaJmg/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="141" src="http://4.bp.blogspot.com/-OuDEWjOWMXg/TxG80NpDZxI/AAAAAAAAF5Q/q38PnmXaJmg/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-2230293042487006083?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/2230293042487006083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=2230293042487006083' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2230293042487006083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2230293042487006083'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2012/01/adf-performance-marathon-22-hours.html' title='ADF Performance Marathon - 22 Hours Stress Test'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-2XqZgsWcBfw/TxG10PYtR0I/AAAAAAAAF34/knrRV5UBG5o/s72-c/0.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-2218564978655283726</id><published>2012-01-08T17:46:00.002+01:00</published><updated>2012-01-08T17:46:11.852+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Master-Detail with One Iterator</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I will show slightly different approach how to implement Master-Detail relationship just with one iterator in ADF Bindings. Detail row collection will be fetched directly through View Link Accessor. I guess such approach is especially good, when you need to display Master-Detail data in the same table and want to declare just one iterator in ADF Bindings.&lt;br /&gt;&lt;br /&gt;Sample application implements View Link between Locations and Departments, Data Model contains Master-Detail relationship based on View Link:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Tzt8ufllUiw/TwnC4dLt0qI/AAAAAAAAF3I/8zRI7LaXr60/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-Tzt8ufllUiw/TwnC4dLt0qI/AAAAAAAAF3I/8zRI7LaXr60/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Drag &amp;amp; drop Locations table into ADF UI, Locations iterator will be defined in ADF Bindings:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-z2jbG8t__ws/TwnDUjpLcrI/AAAAAAAAF3Q/tEXAc7reI-8/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="104" src="http://1.bp.blogspot.com/-z2jbG8t__ws/TwnDUjpLcrI/AAAAAAAAF3Q/tEXAc7reI-8/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Add child Departments collection to the Locations iterator and set DepartmentName attribute to be visible:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sy2RBAzUQi8/TwnDzpO6KEI/AAAAAAAAF3Y/-C9BRDQQAw8/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="219" src="http://3.bp.blogspot.com/-sy2RBAzUQi8/TwnDzpO6KEI/AAAAAAAAF3Y/-C9BRDQQAw8/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We can reference detail rows by pointing to View Link Accessor (by View Link Accessor name - DepartmentsView). Iterator will retrieve all detail rows available and display Department Name for each:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-JlBYNmdmj_o/TwnEY1A1tHI/AAAAAAAAF3g/kyFJh9fnH7A/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="137" src="http://3.bp.blogspot.com/-JlBYNmdmj_o/TwnEY1A1tHI/AAAAAAAAF3g/kyFJh9fnH7A/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;DepartmentsView&lt;/i&gt; is View Link Accessor name (pointing to Departments and generated in Locations), you can double check this in View Link definition wizard:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-CvAuMUP5jxI/TwnErotXUGI/AAAAAAAAF3o/8ErJuTWmGSw/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://4.bp.blogspot.com/-CvAuMUP5jxI/TwnErotXUGI/AAAAAAAAF3o/8ErJuTWmGSw/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here how it looks on UI, one Location row comes with collection of Departments rows:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bW0wb2hyvJA/TwnG85loDpI/AAAAAAAAF3w/1TN0ji81yDg/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-bW0wb2hyvJA/TwnG85loDpI/AAAAAAAAF3w/1TN0ji81yDg/s320/6.png" width="275" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Sample application - &lt;a href="http://jdevsamples.googlecode.com/files/MasterDetailInlineTableApp.zip"&gt;MasterDetailInlineTableApp.zip&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-2218564978655283726?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/2218564978655283726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=2218564978655283726' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2218564978655283726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2218564978655283726'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2012/01/master-detail-with-one-iterator.html' title='Master-Detail with One Iterator'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Tzt8ufllUiw/TwnC4dLt0qI/AAAAAAAAF3I/8zRI7LaXr60/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-3572892871760984954</id><published>2012-01-07T11:38:00.002+01:00</published><updated>2012-01-07T11:40:55.210+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Bugs'/><title type='text'>Wrong Deployment Profile to Extend WebCenter Spaces</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;If you are running WebCenter Spaces portal (PS3/PS4), most likely you are looking how to extend this portal with your custom code and ADF Task Flows. There is one technical document available on OTN for this subject - &lt;a href="http://www.oracle.com/technetwork/middleware/webcenter/owcs-ps4-wcs-ext-samples-wp-406559.pdf"&gt;Using WebCenter Spaces Extension Samples (11.1.1.5.0)&lt;/a&gt;. Document is well written and explains required technical steps. However, there is one mistake in &lt;i&gt;Adding New Projects to the Sample Workspace&lt;/i&gt; chapter:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-U2kE6qB59rs/TwgeARojLjI/AAAAAAAAF14/K40LWXyslc8/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="73" src="http://1.bp.blogspot.com/-U2kE6qB59rs/TwgeARojLjI/AAAAAAAAF14/K40LWXyslc8/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It says that we should define JAR deployment profile for our custom project:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Z1VwCtWJqGg/TwgeQmnoGCI/AAAAAAAAF2A/TdGgQiFUqAw/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" src="http://4.bp.blogspot.com/-Z1VwCtWJqGg/TwgeQmnoGCI/AAAAAAAAF2A/TdGgQiFUqAw/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is incorrect, it should be ADF Library Deployment profile. JAR deployment profile is not able to package ADF specific artifacts and deployed library will be invalid (unless you are extending with plain Java classes, which is highly unlikely).&lt;br /&gt;&lt;br /&gt;So, let's create new project with custom ADF artifacts to extends WebCenter Spaces:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7E8IU76IWlA/TwgfZ6QTBwI/AAAAAAAAF2I/Khdd9RHIB5Q/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" src="http://3.bp.blogspot.com/-7E8IU76IWlA/TwgfZ6QTBwI/AAAAAAAAF2I/Khdd9RHIB5Q/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Project contains one ADF Task Flow and JSF Fragment:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-OdiyPONXnl4/TwgfjGLNFYI/AAAAAAAAF2Q/jMOaTyvIBs0/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-OdiyPONXnl4/TwgfjGLNFYI/AAAAAAAAF2Q/jMOaTyvIBs0/s320/4.png" width="227" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Select JAR deployment profile as per documentation:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2GB7JQGQnsw/Twgfpw7iblI/AAAAAAAAF2Y/Ms10UeO7dlU/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="229" src="http://3.bp.blogspot.com/-2GB7JQGQnsw/Twgfpw7iblI/AAAAAAAAF2Y/Ms10UeO7dlU/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Deploy and check JAR content - we can find only ADF Task Flow XML and Manifest file, this library is invalid:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-cLAnNj9Ch2Y/Twgf2tMnNZI/AAAAAAAAF2g/U5Y3FUpSba4/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="122" src="http://3.bp.blogspot.com/-cLAnNj9Ch2Y/Twgf2tMnNZI/AAAAAAAAF2g/U5Y3FUpSba4/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Add ADF Library Deployment profile:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UJ0-q9vBMWE/Twgf_ibLJ7I/AAAAAAAAF2o/_HdgNV8JPNY/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://4.bp.blogspot.com/-UJ0-q9vBMWE/Twgf_ibLJ7I/AAAAAAAAF2o/_HdgNV8JPNY/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now deployment package is correct and contains all required ADF artifacts:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VRYqmPwx6Z8/TwggHkr4cAI/AAAAAAAAF2w/wKbMNnBFc2k/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://4.bp.blogspot.com/-VRYqmPwx6Z8/TwggHkr4cAI/AAAAAAAAF2w/wKbMNnBFc2k/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We can add imported ADF Task Flow into WebCenter Spaces Resource Catalog registry:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2nZDCkoL-hY/TwggWsf76fI/AAAAAAAAF24/eHmQyfPNZ08/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="224" src="http://3.bp.blogspot.com/-2nZDCkoL-hY/TwggWsf76fI/AAAAAAAAF24/eHmQyfPNZ08/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Later this ADF Task Flow can be added into WebCenter Composer screens, etc.:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-O580kl9Jyn4/TwggjHGHBFI/AAAAAAAAF3A/MyQldiNZwYQ/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="223" src="http://2.bp.blogspot.com/-O580kl9Jyn4/TwggjHGHBFI/AAAAAAAAF3A/MyQldiNZwYQ/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-3572892871760984954?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/3572892871760984954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=3572892871760984954' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3572892871760984954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3572892871760984954'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2012/01/wrong-deployment-profile-for-extending.html' title='Wrong Deployment Profile to Extend WebCenter Spaces'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-U2kE6qB59rs/TwgeARojLjI/AAAAAAAAF14/K40LWXyslc8/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-2478112723702032140</id><published>2012-01-05T19:13:00.003+01:00</published><updated>2012-01-05T19:13:20.417+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BPM 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Bugs'/><title type='text'>ADF Data Control Fix for BPM 11g Human Tasks</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There is one thing worth to know about auto-generated ADF Data Control from BPM 11g Human Task. JDeveloper assigns same root package names for different BPM 11g Human Task projects, this hides ADF Data Control entry from Data Control window and prevents ADF developer from using it. Reproduced with JDeveloper 11g PS4. Workaround - manually refactor DataControls.dcx file into unique root folder.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Typically developer auto-generates or creates ADF Data Control for BPM 11g Human Task using JDeveloper wizard options. Let's generate ADF Data Control for ResourceRequest Human Task:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-WECc6Mvf-G4/TwXmA9mZ6iI/AAAAAAAAF00/jXzy54mafTk/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://4.bp.blogspot.com/-WECc6Mvf-G4/TwXmA9mZ6iI/AAAAAAAAF00/jXzy54mafTk/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Generate another ADF Data Control for ResourceApproval Human Task:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LJl8mqUxUyA/TwXmKD8AwOI/AAAAAAAAF1A/kpKkbMQcGig/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://4.bp.blogspot.com/-LJl8mqUxUyA/TwXmKD8AwOI/AAAAAAAAF1A/kpKkbMQcGig/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As result, we have two projects auto-generated with ADF Data Control for both Human Tasks. While generating these projects, there was no option to specify&amp;nbsp;preferred root package - it generates same &lt;i&gt;com.redsamurai&lt;/i&gt; for both projects:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-nB7ypG3XOoI/TwXnITkzIoI/AAAAAAAAF1M/EJBKFMYmGEo/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-nB7ypG3XOoI/TwXnITkzIoI/AAAAAAAAF1M/EJBKFMYmGEo/s320/3.png" width="232" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Open Data Controls section, you will see only one ADF Data Control available. But we should have two, one for each Human Task:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WuEKtuUp9uU/TwXna-bPbSI/AAAAAAAAF1Y/5v7CzX4D0DI/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://3.bp.blogspot.com/-WuEKtuUp9uU/TwXna-bPbSI/AAAAAAAAF1Y/5v7CzX4D0DI/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Refactor root package to be unique and DataControls.dcx file not to be on the same package path in different projects, for example append &lt;i&gt;com.redsamurai.&lt;b&gt;request&lt;/b&gt;&lt;/i&gt; name:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-iD9RgrqvZSo/TwXnrLEgSaI/AAAAAAAAF1k/yVYubopCvV8/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="229" src="http://4.bp.blogspot.com/-iD9RgrqvZSo/TwXnrLEgSaI/AAAAAAAAF1k/yVYubopCvV8/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now both ADF Data Controls show up correctly:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-aQKwPmoftWg/TwXoD-zLk3I/AAAAAAAAF1w/GOHBjBaz_Fc/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-aQKwPmoftWg/TwXoD-zLk3I/AAAAAAAAF1w/GOHBjBaz_Fc/s320/8.png" width="225" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For your reference, download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/ResourceAllocationProcessApp.zip"&gt;ResourceAllocationProcessApp.zip&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-2478112723702032140?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/2478112723702032140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=2478112723702032140' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2478112723702032140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2478112723702032140'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2012/01/adf-data-control-fix-for-bpm-11g-human.html' title='ADF Data Control Fix for BPM 11g Human Tasks'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-WECc6Mvf-G4/TwXmA9mZ6iI/AAAAAAAAF00/jXzy54mafTk/s72-c/1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5191729359120776838</id><published>2011-12-29T13:37:00.002+01:00</published><updated>2011-12-29T13:37:44.020+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Groovy with View Link Accessor</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;My last post this year, I'm closing 2011 with #106 posts and will resume early 2012 (already next week).&lt;br /&gt;&lt;br /&gt;This post is based on question logged on our public Wiki (&lt;a href="http://redsamoracle.wikispaces.com/"&gt;Red Samurai Ora-Bug Tracker&lt;/a&gt;) - &lt;a href="http://redsamoracle.wikispaces.com/message/view/Red+Samurai+Ora-Bug+Tracker/48578064"&gt;reference attributes in other view objects using groovy&lt;/a&gt;. Developer was asking how to access attributes from different View Objects using Groovy. Answer - attributes can be referenced using Groovy by View Link Accessor name, similar as we can reference in Entity Object by Association name. Pros and cons are discussed as well, and why I prefer standard View Object join.&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/ViewLinkGroovyApp.zip"&gt;ViewLinkGroovyApp.zip&lt;/a&gt;. In order to reference another View Object attribute through View Link Accessor, first we need to check if View Link Accessor is exposed in View Object. In this example I would like to reference City attribute from Locations, in Departments View Object. As we can see, View Link Accessor is not exposed yet in Departments:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-MfrtCbBRqFQ/TvxP4pzW2NI/AAAAAAAAFzI/Z7F31SzZdCY/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://3.bp.blogspot.com/-MfrtCbBRqFQ/TvxP4pzW2NI/AAAAAAAAFzI/Z7F31SzZdCY/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's edit accessors and select to be exposed in Departments, as LocationsView name:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-XEwDaOs0M5M/TvxQH-0kbaI/AAAAAAAAFzU/BjrxnyEyGs4/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="195" src="http://1.bp.blogspot.com/-XEwDaOs0M5M/TvxQH-0kbaI/AAAAAAAAFzU/BjrxnyEyGs4/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;View Link Accessor is exposed in Departments and can be referenced through Groovy:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-bOVc05hCuSQ/TvxQnWgFpKI/AAAAAAAAFzg/IPzbpeVo9oQ/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="171" src="http://1.bp.blogspot.com/-bOVc05hCuSQ/TvxQnWgFpKI/AAAAAAAAFzg/IPzbpeVo9oQ/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Add new transient attribute in Departments View Object - LocationCity:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7xzabHsCGdg/TvxRPnXPXeI/AAAAAAAAFzs/A8H2A8wS2wA/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="169" src="http://3.bp.blogspot.com/-7xzabHsCGdg/TvxRPnXPXeI/AAAAAAAAFzs/A8H2A8wS2wA/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Set default value as Expression and type such Groovy statement - LocationsView.City:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DtiY5F34tKg/TvxRfst65SI/AAAAAAAAFz4/AsQk2b2YDto/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-DtiY5F34tKg/TvxRfst65SI/AAAAAAAAFz4/AsQk2b2YDto/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This will access referenced View Object (Locations) on runtime. You should be aware, ADF will execute two SQL statements to render Departments data (instead of one by default). Second executed statement will be generated to populate Groovy script expression:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2Ksq00KmDQ4/TvxSJYd9GTI/AAAAAAAAF0E/PxphW5h3daw/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="136" src="http://4.bp.blogspot.com/-2Ksq00KmDQ4/TvxSJYd9GTI/AAAAAAAAF0E/PxphW5h3daw/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I would recommend better to use standard View Object join, based on Association - it will retrieve same value directly using SQL join, without forcing to execute second SQL statement from Groovy.&lt;br /&gt;&lt;br /&gt;Open Entity Objects section and define SQL join based on Entity Object association:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-egVJnOC7AoY/Tvxdn4h0bTI/AAAAAAAAF0Q/2S4Y7yPX9mI/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="116" src="http://3.bp.blogspot.com/-egVJnOC7AoY/Tvxdn4h0bTI/AAAAAAAAF0Q/2S4Y7yPX9mI/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Add new attribute from joined Entity - City attribute:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-IJ-KiQfHjFU/Tvxd49y99BI/AAAAAAAAF0c/zBDyfaNnP90/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://1.bp.blogspot.com/-IJ-KiQfHjFU/Tvxd49y99BI/AAAAAAAAF0c/zBDyfaNnP90/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Referenced attribute will retrieved through SQL join:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-nXh1l-I5l_o/TvxfBIdgY5I/AAAAAAAAF0o/pw3hxI1jWqc/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="82" src="http://1.bp.blogspot.com/-nXh1l-I5l_o/TvxfBIdgY5I/AAAAAAAAF0o/pw3hxI1jWqc/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I wish you great start in 2012 !&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5191729359120776838?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5191729359120776838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5191729359120776838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5191729359120776838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5191729359120776838'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/12/groovy-with-view-link-accessor.html' title='Groovy with View Link Accessor'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-MfrtCbBRqFQ/TvxP4pzW2NI/AAAAAAAAFzI/Z7F31SzZdCY/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5777440801275045681</id><published>2011-12-28T17:04:00.003+01:00</published><updated>2011-12-28T18:12:36.715+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>ADF Train - Apply Custom Train Stop Icons</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This post is based on ADF Code Corner article from Frank Nimphius - &lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/learnmore/93-differentuifortrainstops-1413952.pdf"&gt;93. Put a different Look to your Train Stop&lt;/a&gt;. Frank describes how we can control and customize ADF Train rendering. Recently I had similar requirement, additionally it was required to change standard ADF Train Stop icons with custom ones. In order to implement this requirement, I was following steps from ADF Code Corner sample #93, plus few minor additions.&lt;br /&gt;&lt;br /&gt;I didn't wanted to use ADF Skin to customize ADF Train look and feel, but control rendered icons directly. Download sample application with applied custom icons for each stop - &lt;a href="http://jdevsamples.googlecode.com/files/ADFTrainApp.zip"&gt;ADFTrainApp.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sample ADF Train contains three stops:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-pChjKc45oi8/Tvs82sLdbBI/AAAAAAAAFyA/NV4cTbOmDGs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://2.bp.blogspot.com/-pChjKc45oi8/Tvs82sLdbBI/AAAAAAAAFyA/NV4cTbOmDGs/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ADF Train UI component is implemented inside ADF Fragment UI template - no need to duplicate ADF Train UI inside each fragment. Comparing to ADF Code Corner sample #93, one more property is declared - &lt;i&gt;icon&lt;/i&gt;. This property points to managed bean method, where based on currently rendered train stop we return icon to be assigned for current stop:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0CZ4ZuEHEzo/Tvs9a4-zU5I/AAAAAAAAFyM/jcY-MokzyDU/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="140" src="http://2.bp.blogspot.com/-0CZ4ZuEHEzo/Tvs9a4-zU5I/AAAAAAAAFyM/jcY-MokzyDU/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Method retrieves activity ID for currently rendered ADF Train Stop and returns associated icon:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wuAyD9-GIMA/Tvs9vJvgAOI/AAAAAAAAFyY/tSyRtH7_Lj8/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://1.bp.blogspot.com/-wuAyD9-GIMA/Tvs9vJvgAOI/AAAAAAAAFyY/tSyRtH7_Lj8/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here is how our customized ADF Train looks - first stop is for General:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-coOuWmL-6-4/Tvs92wz0FcI/AAAAAAAAFyk/7YHijR-LseY/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://3.bp.blogspot.com/-coOuWmL-6-4/Tvs92wz0FcI/AAAAAAAAFyk/7YHijR-LseY/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Second stop is for Details:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-i4yuEZBWYgM/Tvs-DYrtcZI/AAAAAAAAFy8/7giD6ASKNrc/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://2.bp.blogspot.com/-i4yuEZBWYgM/Tvs-DYrtcZI/AAAAAAAAFy8/7giD6ASKNrc/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Third stop is for Payment:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-35EyIHFVkjI/Tvs-AnrBggI/AAAAAAAAFyw/7Ix0sKLt9A4/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="154" src="http://2.bp.blogspot.com/-35EyIHFVkjI/Tvs-AnrBggI/AAAAAAAAFyw/7Ix0sKLt9A4/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5777440801275045681?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5777440801275045681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5777440801275045681' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5777440801275045681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5777440801275045681'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/12/adf-train-apply-custom-train-stop-icons.html' title='ADF Train - Apply Custom Train Stop Icons'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-pChjKc45oi8/Tvs82sLdbBI/AAAAAAAAFyA/NV4cTbOmDGs/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-6177836320052795117</id><published>2011-12-24T09:20:00.000+01:00</published><updated>2011-12-24T09:25:11.422+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle Fusion'/><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><title type='text'>SOA &amp; WebCenter &amp; BPM &amp; WebLogic Partner Communities Event Invitation</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;strong style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: -webkit-auto;"&gt;&lt;span style="color: black; font-family: Arial, sans-serif;"&gt;INVITATION TO&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; text-align: -webkit-auto;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: Arial, sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;strong style="font-size: 13px;"&gt;&lt;span style="color: black; font-family: Arial, sans-serif;"&gt;FUSION MIDDLEWARE PARTNER COMMUNITY FORUM&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;b style="font-size: 13px;"&gt;&lt;span style="color: black; font-family: Arial, sans-serif; font-size: 13.5pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;strong style="font-size: 13px;"&gt;&lt;span style="color: red; font-family: Arial, sans-serif;"&gt;SOA&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-size: 13px;"&gt;&lt;span style="color: black; font-family: Arial, sans-serif;"&gt;&amp;nbsp;&amp;amp;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-size: 13px;"&gt;&lt;span style="color: red; font-family: Arial, sans-serif;"&gt;&amp;nbsp;WebCenter&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-size: 13px;"&gt;&lt;span style="color: black; font-family: Arial, sans-serif;"&gt;&amp;amp;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-size: 13px;"&gt;&lt;span style="color: red; font-family: Arial, sans-serif;"&gt;&amp;nbsp;BPM&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-size: 13px;"&gt;&lt;span style="color: black; font-family: Arial, sans-serif;"&gt;&amp;nbsp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-size: 13px;"&gt;&lt;span style="color: red; font-family: Arial, sans-serif;"&gt;WebLogic&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-size: 13px;"&gt;&lt;span style="color: black; font-family: Arial, sans-serif;"&gt;&amp;nbsp;Partner Communities&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: x-small;"&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: -webkit-auto;"&gt;&lt;strong&gt;&lt;span style="color: black; font-family: Arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: -webkit-auto;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 10pt;"&gt;Do you want to learn about how to sell the value of Fusion Middleware by combining SOA, BPM and WebCenter Solutions?&lt;br /&gt;&lt;br /&gt;We would like to invite you to become updated and trained at our Fusion Middleware Partner Community Forum on February 7th and 8th 2011 at the NH Hotel in Malaga, Spain.&lt;/span&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/div&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: -webkit-auto;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 10pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; width: 871px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm; width: 348px;" width="40%"&gt;&lt;table border="0" cellpadding="0" style="width: 182px;"&gt;&lt;tbody&gt;&lt;tr style="min-height: 29.25pt;"&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: red; background-image: initial; background-origin: initial; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 29.25pt; padding-bottom: 0.75pt; padding-left: 0.75pt; padding-right: 0.75pt; padding-top: 0.75pt;"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;strong&gt;&lt;span style="color: white; font-family: Arial, sans-serif;"&gt;&lt;a href="http://www.oracle.com/go/?&amp;amp;Src=7477511&amp;amp;Act=4&amp;amp;pcode=EMEAPN11110010MPP005" style="color: #1155cc;" target="_blank"&gt;&lt;span style="color: white;"&gt;Register Now&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 12pt; line-height: 18px;"&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;td style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"&gt;&lt;table border="0" cellpadding="0" style="width: 182px;"&gt;&lt;tbody&gt;&lt;tr style="min-height: 29.25pt;"&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: red; background-image: initial; background-origin: initial; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 29.25pt; padding-bottom: 0.75pt; padding-left: 0.75pt; padding-right: 0.75pt; padding-top: 0.75pt;"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;strong&gt;&lt;span style="color: white; font-family: Arial, sans-serif;"&gt;&lt;a href="http://www.oracle.com/partners/secure/news/oracle-events/1400537" style="color: #1155cc;" target="_blank"&gt;&lt;span style="color: white;"&gt;More Info&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 12pt; line-height: 18px;"&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm; width: 348px;" width="40%"&gt;&lt;/td&gt;&lt;td style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: -webkit-auto;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 10pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: -webkit-auto;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 10pt;"&gt;The event is a wonderful opportunity to:&lt;/span&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/div&gt;&lt;ul style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: -webkit-auto;" type="disc"&gt;&lt;li class="MsoNormal" style="margin-bottom: 0px; margin-left: 15px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 10pt;"&gt;learn how to sell the value of Fusion Middleware by combining SOA and WebCenter solutions&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 0px; margin-left: 15px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 10pt;"&gt;meet with Oracle SOA, BPM and WebCenter Product management&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 0px; margin-left: 15px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 10pt;"&gt;exchange knowledge and have access to competitive intelligence&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 0px; margin-left: 15px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 10pt;"&gt;learn from successful SOA, BPM, WebCenter and ADF implementations&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 0px; margin-left: 15px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 10pt;"&gt;learn about WebCenter Sites&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 0px; margin-left: 15px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 10pt;"&gt;network within the Oracle SOA Partner Community and the Oracle WebCenter Partner Community&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;span style="color: black; font-family: Arial, sans-serif; font-size: 10pt;"&gt;During this highly informative event you can learn about partner success stories, participate in an array of break out sessions and exchange information with other partners.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;span style="color: black; font-family: Arial, sans-serif; font-size: 10pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;img border="0" height="170" src="https://mail.google.com/mail/u/0/?ui=2&amp;amp;ik=1e8f7237cc&amp;amp;view=att&amp;amp;th=13460f9ca6254d76&amp;amp;attid=0.0.1.1&amp;amp;disp=emb&amp;amp;zw" width="623" /&gt;&lt;br /&gt;&lt;br /&gt;Red Samurai will be doing ADF/WebCenter Master Class session together with colleagues from&amp;nbsp;InfoMentum and VASSIT.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-6177836320052795117?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/6177836320052795117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=6177836320052795117' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6177836320052795117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6177836320052795117'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/12/soa-webcenter-bpm-weblogic-partner.html' title='SOA &amp; WebCenter &amp; BPM &amp; WebLogic Partner Communities Event Invitation'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-6242603698687598507</id><published>2011-12-21T13:03:00.002+01:00</published><updated>2011-12-21T13:03:18.958+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>How to set EAR Version for ADF Application on WebLogic</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;If it happened to deploy ADF application on WebLogic, most likely you noticed that it assigns default version V2.0 for each ADF deployment. We would like to set our own specific version, instead of having V2.0 assigned by default:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-m3staTK2cBc/TvHIUGtvsSI/AAAAAAAAFw8/LHddFiF3DZ0/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="118" src="http://3.bp.blogspot.com/-m3staTK2cBc/TvHIUGtvsSI/AAAAAAAAFw8/LHddFiF3DZ0/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This can be achieved by creating Manifest file inside root src/META-INF folder:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9CoCzYILD_k/TvHIh64PLuI/AAAAAAAAFxE/MorQ7bgwg9c/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-9CoCzYILD_k/TvHIh64PLuI/AAAAAAAAFxE/MorQ7bgwg9c/s1600/1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You must create Manifest file by yourself and it should be visible under META-INF descriptors from JDeveloper:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-eNx35K228lk/TvHIy-mC9EI/AAAAAAAAFxM/7OeKKolzxuM/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-eNx35K228lk/TvHIy-mC9EI/AAAAAAAAFxM/7OeKKolzxuM/s320/2.png" width="275" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ADF application version is specified by &lt;b&gt;Weblogic-Application-Version&lt;/b&gt; parameter inside Manifest file:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZSd8OBEGGI8/TvHJUoQ--jI/AAAAAAAAFxU/MB93qgKD6Lc/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ZSd8OBEGGI8/TvHJUoQ--jI/AAAAAAAAFxU/MB93qgKD6Lc/s1600/3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Register Manifest file with application deployment profile - include Manifest under EAR options:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DrFClPhl2Pk/TvHJnsyo7NI/AAAAAAAAFxc/9ffSrJkcOHU/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="214" src="http://4.bp.blogspot.com/-DrFClPhl2Pk/TvHJnsyo7NI/AAAAAAAAFxc/9ffSrJkcOHU/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Make sure to remove Manifest file from Application Descriptor filters - otherwise file will be included twice and deployment fail:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DSO4jOJOkQA/TvHJ21L8DxI/AAAAAAAAFxk/zQwPCbOAuUc/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="214" src="http://2.bp.blogspot.com/-DSO4jOJOkQA/TvHJ21L8DxI/AAAAAAAAFxk/zQwPCbOAuUc/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Application with our predefined version is deployed. Previos version is not removed, but is retired - we can remove it later or restore if needed:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-dSENV8DhzXc/TvHK1A6gG1I/AAAAAAAAFx0/D534imVog_g/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://3.bp.blogspot.com/-dSENV8DhzXc/TvHK1A6gG1I/AAAAAAAAFx0/D534imVog_g/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Download sample application, it includes sample Manifest file - &lt;a href="http://jdevsamples.googlecode.com/files/ADFVersionApp.zip"&gt;ADFVersionApp.zip&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-6242603698687598507?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/6242603698687598507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=6242603698687598507' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6242603698687598507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6242603698687598507'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/12/how-to-set-ear-version-for-adf.html' title='How to set EAR Version for ADF Application on WebLogic'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-m3staTK2cBc/TvHIUGtvsSI/AAAAAAAAFw8/LHddFiF3DZ0/s72-c/6.png' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-4683282963472972020</id><published>2011-12-15T04:02:00.002+01:00</published><updated>2011-12-15T04:03:56.990+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tree'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>ADF Tree - How to Autoselect/Deselect Checkbox</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;If you want to add selection checkbox to ADF tree, read this post - &lt;a href="http://andrejusb.blogspot.com/2011/12/adf-tree-how-to-add-checkbox.html"&gt;ADF Tree - How to Add Checkbox&lt;/a&gt;. Today I will describe how to implement auto-selection for the same checkbox. Checkbox selection will be calculated using Groovy, based on additional helper attribute.&lt;br /&gt;&lt;br /&gt;Download updated sample application - &lt;a href="http://jdevsamples.googlecode.com/files/TreeCheckboxApp_v2.zip"&gt;TreeCheckboxApp_v2.zip&lt;/a&gt;. This sample is extended with additional helper attribute on EO level, for Regions and Countries EOs. This is transient String type attribute - &lt;i&gt;RegionConfirmedStatus&lt;/i&gt; for Regions EO:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-pE2f9JIhOz8/TulhRR7qPvI/AAAAAAAAFwI/Ny9ys9vJ9do/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://3.bp.blogspot.com/-pE2f9JIhOz8/TulhRR7qPvI/AAAAAAAAFwI/Ny9ys9vJ9do/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;RegionConfirmed&lt;/i&gt; boolean attribute value is calculated trough Groovy, based on RegionConfirmedStatus&amp;nbsp;character&amp;nbsp;value - Y = true, else = false. This is required, otherwise boolean value is not changed directly. It works well, when value is calculated from Groovy:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-SCkeBgLP9tY/Tulh8cHBDYI/AAAAAAAAFwQ/S4pZmgraBV4/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="190" src="http://3.bp.blogspot.com/-SCkeBgLP9tY/Tulh8cHBDYI/AAAAAAAAFwQ/S4pZmgraBV4/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Same for Countries EO - CountryConfirmed attribute:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-yEkIi_yRmnU/TuliFFHUBQI/AAAAAAAAFwY/y47n09lyFA4/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/-yEkIi_yRmnU/TuliFFHUBQI/AAAAAAAAFwY/y47n09lyFA4/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On UI, ADF UI component - selectBooleanCheckbox, should be configured with value change listener and enabled with auto submit - this allows to catch checkbox change event:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-3GpYcNCG8-g/TuliXz3GsOI/AAAAAAAAFwg/oykrwZbMirE/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="127" src="http://3.bp.blogspot.com/-3GpYcNCG8-g/TuliXz3GsOI/AAAAAAAAFwg/oykrwZbMirE/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Value change listener is not changing boolean value directly, but is changing only helper attribute value (Y/N). When change is performed, Groovy is fired on EO level and recalculates main boolean attribute value used for checkbox. If we would change boolean value directly, this value is not preserved and is reset back to original value during next refresh. Helper attribute value is changed for Regions level as well as for Countries level (iterating over detail collection):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9vEwEPMqu78/TuljF_aNZjI/AAAAAAAAFwo/YiIBd8bMIls/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://1.bp.blogspot.com/-9vEwEPMqu78/TuljF_aNZjI/AAAAAAAAFwo/YiIBd8bMIls/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Implemented functionality - user selects top level node - dependent child nodes are auto-selected (and opposite on deselect):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-GMueRWa1fTM/TuljTxeKbiI/AAAAAAAAFww/E89Vec2sf14/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" src="http://4.bp.blogspot.com/-GMueRWa1fTM/TuljTxeKbiI/AAAAAAAAFww/E89Vec2sf14/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-4683282963472972020?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/4683282963472972020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=4683282963472972020' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/4683282963472972020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/4683282963472972020'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/12/adf-tree-how-to-autoselectdeselect.html' title='ADF Tree - How to Autoselect/Deselect Checkbox'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-pE2f9JIhOz8/TulhRR7qPvI/AAAAAAAAFwI/Ny9ys9vJ9do/s72-c/1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-6310200350291554840</id><published>2011-12-12T01:06:00.001+01:00</published><updated>2011-12-12T01:35:39.015+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tree'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>ADF Tree - How to Add Checkbox</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This is common request - to add checkbox next to ADF tree nodes. Obviously we should use ADF selectBooleanCheckbox component - however selectBooleanCheckbox is not&amp;nbsp;propagated&amp;nbsp;across ADF tree levels by default (applies to all ADF 11g versions). This post provides sample application for selectBooleanCheckbox rendering on different ADF tree node levels.&lt;br /&gt;&lt;br /&gt;Download sample - &lt;a href="http://jdevsamples.googlecode.com/files/TreeCheckboxApp.zip"&gt;TreeCheckBoxApp.zip&lt;/a&gt;&amp;nbsp;(tested with ADF 11g R1 PS3/PS4).&lt;br /&gt;&lt;br /&gt;Implemented tree renders two levels (Regions -&amp;gt; Countries):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9xeC5hN1XAU/TuVH8OX-exI/AAAAAAAAFvQ/I8itaOd7pig/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-9xeC5hN1XAU/TuVH8OX-exI/AAAAAAAAFvQ/I8itaOd7pig/s1600/3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Both level nodes are rendered with checkboxes. Checkbox is rendered based on transient EO attribute, Boolean type for Regions:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LXGH95i1oYc/TuVHZ07cH8I/AAAAAAAAFu4/BukQa1wKko0/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" src="http://4.bp.blogspot.com/-LXGH95i1oYc/TuVHZ07cH8I/AAAAAAAAFu4/BukQa1wKko0/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Same type attribute for Countries:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qS0euER5o6w/TuVHqQYBn_I/AAAAAAAAFvA/VoPD_Oucc9g/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="171" src="http://3.bp.blogspot.com/-qS0euER5o6w/TuVHqQYBn_I/AAAAAAAAFvA/VoPD_Oucc9g/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ADF tree binding contains both - Regions node name and checkbox definitions:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8cDmuQISgiQ/TuVH3FAZcqI/AAAAAAAAFvI/8F_0B-IMbBI/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-8cDmuQISgiQ/TuVH3FAZcqI/AAAAAAAAFvI/8F_0B-IMbBI/s320/4.png" width="265" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Similar binding for Countries:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9L_SGY7ZBGs/TuVIHHKiHyI/AAAAAAAAFvY/H3K3uyhM46M/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-9L_SGY7ZBGs/TuVIHHKiHyI/AAAAAAAAFvY/H3K3uyhM46M/s320/5.png" width="264" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ADF UI implements tree table (with selectBooleanCheckbox), first tree level is rendered from nodeStamp. As you can see both levels are getting values from &lt;i&gt;node&lt;/i&gt; variable:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wbOebxQSaRw/TuVIt5iIwDI/AAAAAAAAFvg/8xFvKFTppQc/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-wbOebxQSaRw/TuVIt5iIwDI/AAAAAAAAFvg/8xFvKFTppQc/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's run such tree - disabled checkboxes are rendered for empty level nodes - this is wrong:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-eXuUg82h3YY/TuVJCMlBMgI/AAAAAAAAFvo/GyvYhSLxIZY/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="302" src="http://2.bp.blogspot.com/-eXuUg82h3YY/TuVJCMlBMgI/AAAAAAAAFvo/GyvYhSLxIZY/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;How we can fix this? Add &lt;i&gt;rendered&lt;/i&gt; expression for both selectBooleanCheckbox components. First level checkbox should be rendered only when RegionName is not Null:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9fUcLsCkeU4/TuVJasrJpEI/AAAAAAAAFvw/oCHhgZYRkBU/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="116" src="http://3.bp.blogspot.com/-9fUcLsCkeU4/TuVJasrJpEI/AAAAAAAAFvw/oCHhgZYRkBU/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Second level accordingly, when CountryName is not Null:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ttJnd47p9Eo/TuVJhTxoIII/AAAAAAAAFv4/JDv2QzolSIc/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="177" src="http://2.bp.blogspot.com/-ttJnd47p9Eo/TuVJhTxoIII/AAAAAAAAFv4/JDv2QzolSIc/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now checkboxes are rendered correctly with ADF tree:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-bjObhImhkQE/TuVJp3TlOrI/AAAAAAAAFwA/SxXhld7OCzo/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-bjObhImhkQE/TuVJp3TlOrI/AAAAAAAAFwA/SxXhld7OCzo/s320/10.png" width="308" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-6310200350291554840?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/6310200350291554840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=6310200350291554840' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6310200350291554840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6310200350291554840'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/12/adf-tree-how-to-add-checkbox.html' title='ADF Tree - How to Add Checkbox'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-9xeC5hN1XAU/TuVH8OX-exI/AAAAAAAAFvQ/I8itaOd7pig/s72-c/3.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5677808029768590711</id><published>2011-12-11T02:19:00.001+01:00</published><updated>2011-12-11T02:46:35.429+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tree'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><title type='text'>Tuning ADF Tree - Retain View Link Accessor Rowset</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;When expanding ADF Tree node, by default - each time ADF generates new SQL statement to retrieve expanded tree level nodes. New SQL statement is generated even after collapsing and expanding same node. In most of the cases, especially when tree structure is static, we would like to avoid multiple SQL invocation for the same nodes. This can be achieved by setting &lt;i&gt;Retain View Link Accessor Rowset&lt;/i&gt; option for View Object tuning.&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/RetainViewLinkAccessorApp.zip"&gt;RetainViewLinkAccessorApp.zip&lt;/a&gt;. This sample implements 3 levels tree structure: Locations -&amp;gt; Departments -&amp;gt; Employees:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-92QehbbhR-Q/TuQGNkAIgII/AAAAAAAAFuI/913sDHEmYn0/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-92QehbbhR-Q/TuQGNkAIgII/AAAAAAAAFuI/913sDHEmYn0/s1600/2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When user expands same node of Locations (top level) two or more times, we want to retrieve previously queried Departments rows from cache, instead of&amp;nbsp;querying from database again. Go to Locations tuning section and set Retain View Link Accessor Rowset setting - this will enable Departments rowset caching:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-q0R99MadZxI/TuQGt0R4NiI/AAAAAAAAFuQ/xvM3rA7YLGw/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="311" src="http://3.bp.blogspot.com/-q0R99MadZxI/TuQGt0R4NiI/AAAAAAAAFuQ/xvM3rA7YLGw/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Set the same setting for Departments (second level), this will cache Employees rowset:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-VuOlPF3uZMc/TuQHAhv0SkI/AAAAAAAAFuY/ow8IWzXhtjM/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" src="http://2.bp.blogspot.com/-VuOlPF3uZMc/TuQHAhv0SkI/AAAAAAAAFuY/ow8IWzXhtjM/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Employees View Object represents tree leafs and can't be expanded - means no need to set tuning option (there will be no children):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PQ0SqbM1j-U/TuQHWJAXxXI/AAAAAAAAFug/TCNlwTRiZk8/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://3.bp.blogspot.com/-PQ0SqbM1j-U/TuQHWJAXxXI/AAAAAAAAFug/TCNlwTRiZk8/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When top level Locations node is expanded, SQL is generated to retrieve corresponding Departments rowset (if Locations node will be collapsed and later same node expanded again - no SQL will be generated, rowset will be retrieved from memory). SQL is generated only first time, because of our tuning - it will not be generated during subsequent collapsing/expanding of the same node:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-pCmmKKrmPA4/TuQHttRTRLI/AAAAAAAAFuo/_CJjEr_g-2s/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="77" src="http://2.bp.blogspot.com/-pCmmKKrmPA4/TuQHttRTRLI/AAAAAAAAFuo/_CJjEr_g-2s/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Tree structure:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-IjhMrNvM9fs/TuQHzJpOsdI/AAAAAAAAFuw/NtWEi9AVoJE/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-IjhMrNvM9fs/TuQHzJpOsdI/AAAAAAAAFuw/NtWEi9AVoJE/s320/6.png" width="188" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5677808029768590711?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5677808029768590711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5677808029768590711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5677808029768590711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5677808029768590711'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/12/tuning-adf-tree-retain-view-link.html' title='Tuning ADF Tree - Retain View Link Accessor Rowset'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-92QehbbhR-Q/TuQGNkAIgII/AAAAAAAAFuI/913sDHEmYn0/s72-c/2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-8906049704384136341</id><published>2011-12-03T11:56:00.001+01:00</published><updated>2011-12-03T12:25:56.388+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Workarounds'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='Bugs'/><title type='text'>Fix Rowset is Forward Only Error for ADF BC LOV Range Paging (11.1.2.1.0)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This post is based on latest production JDeveloper - 11g R2 (11.1.2.1.0). ADF BC applications typically are working with database, when SQL statements are complex and slow - its good to apply Range Paging for VO's in ADF BC. Range Paging enables ADF BC to prepare SQL statement to retrieve only predefined subset of rows from database - significantly improving data retrieval performance. LOV is one of the elements in ADF applications where we can expect lots of rows to be retrieved - means good candidate to apply Range Paging.&lt;br /&gt;&lt;br /&gt;However, if you try to apply Range Paging for LOV - it will not work. Wait wait..., but there is a workaround I will describe today. Download sample application where Range Pagine for LOV is working - &lt;a href="http://jdevsamples.googlecode.com/files/LOVRangePagingFix.zip"&gt;LOVRangePagingFix.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;First, how to define Range Paging for LOV? Open LOV VO (or alternatively you can define it directly through LOV View Accessor - no difference) and expand Tuning section. Change Access Mode property to Range Paging and set Range Size (in this example is set to 30, means ADF BC will prepare SQL select to query 30 rows only for current rowset):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Y5ZBqczswAI/TtoCWbzDzoI/AAAAAAAAFs4/ec-PhGfHdrw/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="169" src="http://3.bp.blogspot.com/-Y5ZBqczswAI/TtoCWbzDzoI/AAAAAAAAFs4/ec-PhGfHdrw/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Next define LOV, by&amp;nbsp;specifying List Data Source, etc.:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-nexFLif-h2E/TtoDEK8XpoI/AAAAAAAAFtA/Z_eW-wPm6uM/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://4.bp.blogspot.com/-nexFLif-h2E/TtoDEK8XpoI/AAAAAAAAFtA/Z_eW-wPm6uM/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Choose Input Text with List of Values as list type:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-xp4GI_nbCBc/TtoDPtRw9rI/AAAAAAAAFtI/9C4rRUjI2MU/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" src="http://2.bp.blogspot.com/-xp4GI_nbCBc/TtoDPtRw9rI/AAAAAAAAFtI/9C4rRUjI2MU/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Drag and drop LOV on ADF UI and run application. You will get &lt;b&gt;&lt;i&gt;Rowset is forward only&lt;/i&gt;&lt;/b&gt; error:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-5kGV8gJ5rcw/TtoErO42mxI/AAAAAAAAFtQ/4ToFgWX-WAA/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://1.bp.blogspot.com/-5kGV8gJ5rcw/TtoErO42mxI/AAAAAAAAFtQ/4ToFgWX-WAA/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I will tell you, how to fix this. Open VO, where LOV is defined - from structure window locate LOV definition in the source code:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-15_bbABBo4o/TtoE7PaLzKI/AAAAAAAAFtY/91ctnUJ6rLA/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-15_bbABBo4o/TtoE7PaLzKI/AAAAAAAAFtY/91ctnUJ6rLA/s1600/5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here is the trick, even we have defined our LOV to work with Range Paging, LOV wizard ignores this and sets default &lt;b&gt;ListRangeSize = -1&lt;/b&gt; (inside List Binding):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9JwpVxFkv34/TtoFljhq0GI/AAAAAAAAFtg/G-6WtXP_dv8/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="155" src="http://2.bp.blogspot.com/-9JwpVxFkv34/TtoFljhq0GI/AAAAAAAAFtg/G-6WtXP_dv8/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Its why it fails on runtime with &lt;i&gt;&lt;b&gt;Rowset is forward only&lt;/b&gt;&lt;/i&gt; error - LOV VO is enabled with Range Paging, but LOV binding itself gets configured by wizard to retrieve all rows (-1). In order to fix this, set&amp;nbsp;&lt;b&gt;ListRangeSize = 30 &lt;/b&gt;by yourself (same as Range Paging):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-wN68fQ9X_GE/TtoGzgVpkrI/AAAAAAAAFto/HoYxXfLigBA/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="152" src="http://4.bp.blogspot.com/-wN68fQ9X_GE/TtoGzgVpkrI/AAAAAAAAFto/HoYxXfLigBA/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It works well now, form is rendered:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CV0ky63nTlA/TtoG7HDj_pI/AAAAAAAAFtw/vBI1fcBDJAE/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://2.bp.blogspot.com/-CV0ky63nTlA/TtoG7HDj_pI/AAAAAAAAFtw/vBI1fcBDJAE/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;LOV is opening, Range Paging is applied:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FXkDJgkfk_k/TtoHBUVd3ZI/AAAAAAAAFt4/ve6oNEA4qwo/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-FXkDJgkfk_k/TtoHBUVd3ZI/AAAAAAAAFt4/ve6oNEA4qwo/s320/9.png" width="226" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Selected LOV value is retrieved and set:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-MhlIy_XEAwM/TtoHI5X_2YI/AAAAAAAAFuA/T-2eLKMimEw/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="148" src="http://4.bp.blogspot.com/-MhlIy_XEAwM/TtoHI5X_2YI/AAAAAAAAFuA/T-2eLKMimEw/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-8906049704384136341?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/8906049704384136341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=8906049704384136341' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/8906049704384136341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/8906049704384136341'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/12/fix-rowset-is-forward-only-for-adf-bc.html' title='Fix Rowset is Forward Only Error for ADF BC LOV Range Paging (11.1.2.1.0)'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Y5ZBqczswAI/TtoCWbzDzoI/AAAAAAAAFs4/ec-PhGfHdrw/s72-c/1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-2176407392873060103</id><published>2011-11-27T11:56:00.000+01:00</published><updated>2011-11-27T12:12:59.721+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='Bugs'/><title type='text'>JDeveloper 11g R2 IDE Application Performance Caching and Compilation Failures</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;If you are working with latest production release of JDeveloper IDE/ADF 11g R2 (11.1.2.1.0), you may face very strange issue related to ADF application compilation. JDeveloper may report that it can't find previously deleted files (for example ADF BC components). Why it still looks for un-existing (removed by developer) files and fails compilation process?&lt;br /&gt;&lt;br /&gt;JDeveloper IDE 11g R2 provides application file caching feature, to speed up design time development and file load in the IDE. However, it looks like it fails to clean up file cache after files are removed from the application, still is trying to reference old files during compilation process and fails.&lt;br /&gt;&lt;br /&gt;You will face file cache problem (this can be really frustrating), if log window reports something similar for deleted files (&lt;i&gt;unable to copy to output directory&lt;/i&gt;):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9kTt1RzIsOA/TtIZWt-NK-I/AAAAAAAAFsg/YJN2URwxx14/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="38" src="http://4.bp.blogspot.com/-9kTt1RzIsOA/TtIZWt-NK-I/AAAAAAAAFsg/YJN2URwxx14/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It says - failed to find file, hey but this file was removed by me, just few minutes ago - JDeveloper, you should update your cache :)&lt;br /&gt;&lt;br /&gt;Ah, Clean All and IDE restart will not help you this time - I did it multiple times with no luck. As you can see from the screenshot above, compiler complains about DepartmentsLovView object - this object was present before, but I removed it from the application - compilation should not fail (but it fails).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-AP_7oSqyX0s/TtIaCpPgjrI/AAAAAAAAFso/cLyvW1-kn9U/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://4.bp.blogspot.com/-AP_7oSqyX0s/TtIaCpPgjrI/AAAAAAAAFso/cLyvW1-kn9U/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;But there is always solution - open Application Properties wizard, there is IDE Performance Cache setting:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-GaTF5dfz2ZE/TtIaZzC7BRI/AAAAAAAAFsw/CVZwUtZDJfs/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://1.bp.blogspot.com/-GaTF5dfz2ZE/TtIaZzC7BRI/AAAAAAAAFsw/CVZwUtZDJfs/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It specifies IDE cache location, application file cache is stored inside .data folder. If you go and remove .data folder - compilation completes successfully.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-2176407392873060103?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/2176407392873060103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=2176407392873060103' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2176407392873060103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2176407392873060103'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/11/jdeveloper-11g-r2-ide-application.html' title='JDeveloper 11g R2 IDE Application Performance Caching and Compilation Failures'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-9kTt1RzIsOA/TtIZWt-NK-I/AAAAAAAAFsg/YJN2URwxx14/s72-c/1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-7655295564414937726</id><published>2011-11-25T20:15:00.000+01:00</published><updated>2011-11-25T20:28:37.721+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Oracle ADF 11g Table Insert with Empty Insert Row</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Guess what ADF topic remains most popular over the years - CRUD. I have several blogs on this topic, for example - &lt;a href="http://andrejusb.blogspot.com/2010/05/crud-operations-in-oracle-adf-11g-table.html"&gt;CRUD Operations in Oracle ADF 11g Table Without Auto PPR&lt;/a&gt;. Today I will describe one more scenario - how to maintain empty row, which can be used to insert new records into table.&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/TableInsertApp.zip"&gt;TableInsertApp.zip&lt;/a&gt;. This example contains ADF table with empty row in the footer:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JPXt0cgUhOU/Ts_qWyjw8-I/AAAAAAAAFrQ/g6tjwwMxLnM/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="127" src="http://1.bp.blogspot.com/-JPXt0cgUhOU/Ts_qWyjw8-I/AAAAAAAAFrQ/g6tjwwMxLnM/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;User is able to type data into empty row:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-EiyzZVzOWI8/Ts_qjrZS5EI/AAAAAAAAFrY/bUlm8twiu0w/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://4.bp.blogspot.com/-EiyzZVzOWI8/Ts_qjrZS5EI/AAAAAAAAFrY/bUlm8twiu0w/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Press Insert button and populate new row into table rowset:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wvk4pe3wMn8/Ts_qrdQlNYI/AAAAAAAAFrg/OreW9pq-rhw/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://3.bp.blogspot.com/-wvk4pe3wMn8/Ts_qrdQlNYI/AAAAAAAAFrg/OreW9pq-rhw/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Good thing - empty doesn't care about validation, because all business rules will be checked ones user hits Save button (in this case, primary key is missing):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-MKn4DJJuh_s/Ts_q5hWabPI/AAAAAAAAFro/1EUXxE0aCDc/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://4.bp.blogspot.com/-MKn4DJJuh_s/Ts_q5hWabPI/AAAAAAAAFro/1EUXxE0aCDc/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Fix validation error, now commit is successful:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-oiy48aYsXbY/Ts_rEFavCvI/AAAAAAAAFrw/V3S8-3Gk0p0/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="127" src="http://2.bp.blogspot.com/-oiy48aYsXbY/Ts_rEFavCvI/AAAAAAAAFrw/V3S8-3Gk0p0/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;How we implement empty row? Pretty easy, with SELECT ... FROM DUAL VO - JobsEntryView:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-U9vrCq3eSdA/Ts_rTBdge4I/AAAAAAAAFr4/cY5jW3jh0CE/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-U9vrCq3eSdA/Ts_rTBdge4I/AAAAAAAAFr4/cY5jW3jh0CE/s1600/6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This VO should have as many attributes, as original VO:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wPZzoS0pOA8/Ts_ra-DCZaI/AAAAAAAAFsA/Ud5jcnIJpg4/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="254" src="http://1.bp.blogspot.com/-wPZzoS0pOA8/Ts_ra-DCZaI/AAAAAAAAFsA/Ud5jcnIJpg4/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;SELECT ... FROM DUAL allows to query only 1 row into rowset. Make sure all attributes are set to be Updatable always, as well as with correct precision type, etc. (same as original VO, except we don't need validation rules):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2b5Vz4-0ZFA/Ts_rxnAj5rI/AAAAAAAAFsI/CzxMfGjbnR0/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="172" src="http://4.bp.blogspot.com/-2b5Vz4-0ZFA/Ts_rxnAj5rI/AAAAAAAAFsI/CzxMfGjbnR0/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On the UI part, each column footer is populated with corresponding attribute from our read-only VO:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-uiTZAVlcJWU/Ts_r-_QMRHI/AAAAAAAAFsQ/Se1eXXuB42o/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-uiTZAVlcJWU/Ts_r-_QMRHI/AAAAAAAAFsQ/Se1eXXuB42o/s320/9.png" width="275" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Create operation is doing deep copy of attribute values from read-only VO into main VO (and clearing insert row):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-jQZhqtFbiwM/Ts_sRNpY9yI/AAAAAAAAFsY/zt5pjUkAvk4/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://2.bp.blogspot.com/-jQZhqtFbiwM/Ts_sRNpY9yI/AAAAAAAAFsY/zt5pjUkAvk4/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-7655295564414937726?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/7655295564414937726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=7655295564414937726' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7655295564414937726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7655295564414937726'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/11/oracle-adf-11g-table-insert-with-empty.html' title='Oracle ADF 11g Table Insert with Empty Insert Row'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-JPXt0cgUhOU/Ts_qWyjw8-I/AAAAAAAAFrQ/g6tjwwMxLnM/s72-c/1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-173399729083527582</id><published>2011-11-20T19:44:00.000+01:00</published><updated>2011-11-20T19:58:52.063+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>CLIENT_STATE_MAX_TOKENS = 1 for Browser Back Button Control</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There is &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/ap_config.htm"&gt;documented&lt;/a&gt; approach which allows to control web browser back button. This approach works for ADF 11g applications implemented with pages and ADF Task Flows based on pages (doesn't work with ADF fragments).&lt;br /&gt;&lt;br /&gt;The trick is to set org.apache.myfaces.trinidad.CLIENT_STATE_MAX_TOKENS = 1. This means, ADF will preserve only one client token in memory, once user will press browser back button - this token will be lost. On the next user click - application will reset to its initial state, this will ensure predictable behavior.&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/BackButtonExpire.zip"&gt;BackButtonExpire.zip&lt;/a&gt;. This sample implements sequence of ADF Task Flows with pages, first it defines Departments call:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-UkHTbjl0to8/TslMdVlZH7I/AAAAAAAAFpk/NxybqIyDsuc/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="237" src="http://2.bp.blogspot.com/-UkHTbjl0to8/TslMdVlZH7I/AAAAAAAAFpk/NxybqIyDsuc/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Next is Employees call:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-09dAtpV5ZYg/TslMjnBqEWI/AAAAAAAAFps/ODgGr196kR8/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="http://4.bp.blogspot.com/-09dAtpV5ZYg/TslMjnBqEWI/AAAAAAAAFps/ODgGr196kR8/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Employees Task Flow contains Return activity to navigate back to Departments:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uatONyb7mrE/TslMx7jhIoI/AAAAAAAAFp0/OCj94g-_Eds/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://2.bp.blogspot.com/-uatONyb7mrE/TslMx7jhIoI/AAAAAAAAFp0/OCj94g-_Eds/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As per documentation, we set org.apache.myfaces.trinidad.CLIENT_STATE_MAX_TOKENS = 1 in web.xml:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-7sJfhGz3DAM/TslM-gHnx1I/AAAAAAAAFp8/_L1XZtj8bM4/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="121" src="http://4.bp.blogspot.com/-7sJfhGz3DAM/TslM-gHnx1I/AAAAAAAAFp8/_L1XZtj8bM4/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When we test this, lets open last Task Flow from the sequence - Employees. Press browser back button now:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-JDLspbPp_64/TslNO17ugNI/AAAAAAAAFqE/pxKNQLHHBtM/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-JDLspbPp_64/TslNO17ugNI/AAAAAAAAFqE/pxKNQLHHBtM/s320/5.png" width="279" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Page from previous Departments Task Flow is opened - however client token will be already lost, as per our configuration. This is helpful if we want to avoid broken data, now if user performs any action - current page will be reset and reloaded:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-KWsKGmPLchY/TslNrrxoWNI/AAAAAAAAFqM/CVIE2YjwTss/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-KWsKGmPLchY/TslNrrxoWNI/AAAAAAAAFqM/CVIE2YjwTss/s1600/6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Reload happens:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QyyubWmp8t4/TslNx8V_dcI/AAAAAAAAFqU/7Zyk0soyY9E/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="61" src="http://4.bp.blogspot.com/-QyyubWmp8t4/TslNx8V_dcI/AAAAAAAAFqU/7Zyk0soyY9E/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Page is reinitialized with fresh client token:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-csxgiBFp7a8/TslN360ipUI/AAAAAAAAFqc/D4gZysMxAsg/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-csxgiBFp7a8/TslN360ipUI/AAAAAAAAFqc/D4gZysMxAsg/s1600/8.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-173399729083527582?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/173399729083527582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=173399729083527582' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/173399729083527582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/173399729083527582'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/11/clientstatemaxtokens-1-for-browser-back.html' title='CLIENT_STATE_MAX_TOKENS = 1 for Browser Back Button Control'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-UkHTbjl0to8/TslMdVlZH7I/AAAAAAAAFpk/NxybqIyDsuc/s72-c/1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5212937509798756306</id><published>2011-11-20T16:38:00.000+01:00</published><updated>2011-11-20T17:06:07.381+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Custom Exception Registration for ADF BC EO Attribute</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Sometimes customers prefer to implement business logic validation completely in Java, without using ADF BC declarative/Groovy validation rules. Thats fine, we can code business logic validation in ADF and implement different custom validation methods on VO/EO level. How to report validation message from custom method on VO/EO level? We can throw JboException, but it shows up on UI as popup. When custom validation is implemented for specific attribute, we would like to attach validation message directly to the attribute itself. &lt;a href="http://blogs.oracle.com/smuenchadf/"&gt;Steve Muench&lt;/a&gt; helped us this week with EO Attribute Exception registration, I would like to share solution with you.&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/AttributeExceptionRegistrationApp.zip"&gt;AttributeExceptionRegistration.zip&lt;/a&gt;. This sample implements custom validation method on VO Row Impl class, means custom logic can be applied per row:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-vVZFIAfqwxg/TskjCsWV_CI/AAAAAAAAFo8/529am89YqaI/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="202" src="http://3.bp.blogspot.com/-vVZFIAfqwxg/TskjCsWV_CI/AAAAAAAAFo8/529am89YqaI/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If validation logic fails, we are calling our own validation failure method implemented inside EO Impl class. This method actually constructs AttrValException and attaches it to specific attribute using standard registerAttributeException(...) method. Validation message is retrieved from Message bundle. On the UI AttrValException will be rendered the same as declarative attribute level validation message declared on EO attribute. See detail code for attaching AttrValException here:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-N9o31f5eKog/Tskj-bVHuwI/AAAAAAAAFpE/oKRTqjeIUEs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://4.bp.blogspot.com/-N9o31f5eKog/Tskj-bVHuwI/AAAAAAAAFpE/oKRTqjeIUEs/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Validation message will be retrieved from Message bundle:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-iiSsvjdEFls/TskkljC3e7I/AAAAAAAAFpM/Idew0-yrDpY/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="46" src="http://3.bp.blogspot.com/-iiSsvjdEFls/TskkljC3e7I/AAAAAAAAFpM/Idew0-yrDpY/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In this example, just for demo purposes, validation is triggered in UI from separate Action Listener method - just by calling custom validation logic from VO Row Impl:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-yezg6tT8tu8/TsklDYowV-I/AAAAAAAAFpU/nO_08Bipmgw/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="158" src="http://3.bp.blogspot.com/-yezg6tT8tu8/TsklDYowV-I/AAAAAAAAFpU/nO_08Bipmgw/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Validation messages shows up nicely, directly attached to the attribute field:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-1MZeXEXv_0I/TsklT5P8dBI/AAAAAAAAFpc/ui3hekLLr0E/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="90" src="http://1.bp.blogspot.com/-1MZeXEXv_0I/TsklT5P8dBI/AAAAAAAAFpc/ui3hekLLr0E/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5212937509798756306?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5212937509798756306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5212937509798756306' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5212937509798756306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5212937509798756306'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/11/custom-exception-registration-for-adf.html' title='Custom Exception Registration for ADF BC EO Attribute'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-vVZFIAfqwxg/TskjCsWV_CI/AAAAAAAAFo8/529am89YqaI/s72-c/1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-6472188891372560942</id><published>2011-11-16T22:56:00.001+01:00</published><updated>2011-11-17T07:57:08.437+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><title type='text'>Stress Testing Oracle ADF BC Applications - Do Connection Pooling and TXN Disconnect Level</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Today I will describe how &lt;b&gt;jbo.doconnectionpooling = true&lt;/b&gt; and &lt;b&gt;jbo.txn.disconnect_level = 1&lt;/b&gt; properties affect ADF application performance. Read more about these properties - &lt;a href="http://andrejusb.blogspot.com/2011/10/adf-bc-tuning-with-do-connection.html"&gt;ADF BC Tuning with Do Connection Pooling and TXN Disconnect Level&lt;/a&gt;. Previous posts related to ADF BC application stress testing - &lt;a href="http://andrejusb.blogspot.com/2011/11/stress-testing-oracle-adf-bc_08.html"&gt;Stress Testing Oracle ADF BC Applications - Internal Connections&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We will see that with&amp;nbsp;&lt;b&gt;jbo.doconnectionpooling = true&lt;/b&gt;&amp;nbsp;and&amp;nbsp;&lt;b&gt;jbo.txn.disconnect_level = 1&lt;/b&gt;, average request processing time is faster. Performance boost is achieved, because passivation/activation circle happens in memory (data remains in memory) - data is not being stored into PS_TXN table, this allows to save execution time. After each request, we are releasing DB connection, this allows to save server resources as well. However, please keep in mind - this tuning approach is suitable mostly for such use cases, where database connection doesn't keep temporary data in database (for example - post changes or long running locks). Because of frequent database connection switch, you may loose such data.&lt;br /&gt;&lt;br /&gt;Download sample test case - &lt;a href="http://jdevsamples.googlecode.com/files/stresstest_v3.zip"&gt;stresstest_v3.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Stress test is performed with 80 concurrent users, 16000 transactions in 10 minutes (see previous posts for more details on JMeter script).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;jbo.doconnectionpooling = true&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-06POfmRPzH4/TsQ0_G55IJI/AAAAAAAAFn4/h4KCTx8zaiA/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-06POfmRPzH4/TsQ0_G55IJI/AAAAAAAAFn4/h4KCTx8zaiA/s320/4.png" width="293" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;jbo.txn.disconnect_level = 1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-A53Ec0jgGYE/TsQ1FFzS-rI/AAAAAAAAFoA/BQOd8VSN0HI/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-A53Ec0jgGYE/TsQ1FFzS-rI/AAAAAAAAFoA/BQOd8VSN0HI/s320/5.png" width="293" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;With those settings, passivation/activation happens only in memory. Average request processing time is quite interesting - it is a bit slow for initial requests, but improves with time:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SXVg5eYS7z4/TsQ1emSVBjI/AAAAAAAAFoI/AhYXUINLx6U/s1600/1a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://1.bp.blogspot.com/-SXVg5eYS7z4/TsQ1emSVBjI/AAAAAAAAFoI/AhYXUINLx6U/s320/1a.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If we compare the same type of graph, when&amp;nbsp;&lt;b&gt;jbo.doconnectionpooling = false&lt;/b&gt;&amp;nbsp;and&amp;nbsp;&lt;b&gt;jbo.txn.disconnect_level = 0&lt;/b&gt;, number of passivations/activations is reported to be the same. Average request processing time is slightly longer:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-bLtulAJ5_mI/TsQ16BUJhsI/AAAAAAAAFoQ/VPxnIj_Qkl0/s1600/1b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="147" src="http://1.bp.blogspot.com/-bLtulAJ5_mI/TsQ16BUJhsI/AAAAAAAAFoQ/VPxnIj_Qkl0/s320/1b.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Average request processing time with&amp;nbsp;&lt;b&gt;jbo.doconnectionpooling = true&lt;/b&gt;&amp;nbsp;and&amp;nbsp;&lt;b&gt;jbo.txn.disconnect_level = 1&lt;/b&gt;&amp;nbsp;is &lt;b&gt;43.12&lt;/b&gt; (ms):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-s9FTx4vUuao/TsQ2S-6nWwI/AAAAAAAAFoY/ryy82bCNgAU/s1600/2a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-s9FTx4vUuao/TsQ2S-6nWwI/AAAAAAAAFoY/ryy82bCNgAU/s1600/2a.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Average request processing time with&amp;nbsp;&lt;b&gt;jbo.doconnectionpooling = false&lt;/b&gt;&amp;nbsp;and&amp;nbsp;&lt;b&gt;jbo.txn.disconnect_level = 0&amp;nbsp;&lt;/b&gt;is &lt;b&gt;75.23&lt;/b&gt; (ms):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-MZanSmbCWSs/TsQ2mDOHsVI/AAAAAAAAFog/JQLfX3k2_PM/s1600/2b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-MZanSmbCWSs/TsQ2mDOHsVI/AAAAAAAAFog/JQLfX3k2_PM/s1600/2b.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Database connection usage with&amp;nbsp;&lt;b&gt;jbo.doconnectionpooling = true&lt;/b&gt;&amp;nbsp;and&amp;nbsp;&lt;b&gt;jbo.txn.disconnect_level = 1&lt;/b&gt;&amp;nbsp;is reduced significantly. There should not be PS_TXN passivation/activation happening, but it still reports some internal connections consumed by AM:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Yfp7-mbOgS0/TsQ26e7P_hI/AAAAAAAAFoo/oDn3HNZrNO0/s1600/3a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="141" src="http://3.bp.blogspot.com/-Yfp7-mbOgS0/TsQ26e7P_hI/AAAAAAAAFoo/oDn3HNZrNO0/s320/3a.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As expected - much more database connections are reserved with default&amp;nbsp;&lt;b&gt;jbo.doconnectionpooling = false&lt;/b&gt;&amp;nbsp;and&amp;nbsp;&lt;b&gt;jbo.txn.disconnect_level = 0&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wDV_AtGZCeA/TsQ3IYvrG3I/AAAAAAAAFow/OLowauRsriY/s1600/3b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="142" src="http://3.bp.blogspot.com/-wDV_AtGZCeA/TsQ3IYvrG3I/AAAAAAAAFow/OLowauRsriY/s320/3b.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-6472188891372560942?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/6472188891372560942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=6472188891372560942' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6472188891372560942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6472188891372560942'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/11/stress-testing-oracle-adf-bc_16.html' title='Stress Testing Oracle ADF BC Applications - Do Connection Pooling and TXN Disconnect Level'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-06POfmRPzH4/TsQ0_G55IJI/AAAAAAAAFn4/h4KCTx8zaiA/s72-c/4.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5920439102246484941</id><published>2011-11-08T11:08:00.003+01:00</published><updated>2011-11-08T11:10:59.921+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><title type='text'>Stress Testing Oracle ADF BC Applications - Internal Connections</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;We had productive discussion with &lt;a href="http://one-size-doesnt-fit-all.blogspot.com/"&gt;Chris Muir&lt;/a&gt; for my previous post - &lt;a href="http://andrejusb.blogspot.com/2011/11/stress-testing-oracle-adf-bc.html"&gt;Stress Testing Oracle ADF BC Applications - Passivation and Activation&lt;/a&gt;&amp;nbsp;(see post comments). Two questions were discussed:&lt;br /&gt;&lt;br /&gt;1. &lt;i&gt;Importance of AM Maximum Pool Size&lt;/i&gt;&lt;br /&gt;2. &lt;i&gt;Higher than expected DB connection usage during stress test&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I did additional stress tests (download JMeter config file - &lt;a href="http://jdevsamples.googlecode.com/files/AMTest.jmx"&gt;AMTest.jmx&lt;/a&gt;) and was able to get more information from test results - I would like to share with you. Download test case application updated for this post - &lt;a href="http://jdevsamples.googlecode.com/files/stresstest_v2.zip"&gt;stresstest_v2.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For stress test scenario and number of concurrent users, please refer to &lt;a href="http://andrejusb.blogspot.com/2011/11/stress-testing-oracle-adf-bc.html"&gt;blog post&lt;/a&gt; mentioned above. I'm using the same AM pool tuning settings for today post:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-mD4BbQj2RkI/Trj3IGKLumI/AAAAAAAAFnM/S0Hx7YO0OFM/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-mD4BbQj2RkI/Trj3IGKLumI/AAAAAAAAFnM/S0Hx7YO0OFM/s320/7.png" width="293" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;First lets answer:&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;&lt;i&gt;Higher than expected DB connection usage during stress test&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As we saw in the last post, when stress test with 80 concurrent users was applied (look into 3rd &lt;i&gt;Pessimistic&lt;/i&gt;&amp;nbsp;scenario), application was using more than 40 DB connections for 40 active AM instances:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Cvuizj_12KI/Trb4KmkcqTI/AAAAAAAAFmU/oCdKapCWt8Y/s1600/3c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="http://1.bp.blogspot.com/-Cvuizj_12KI/Trb4KmkcqTI/AAAAAAAAFmU/oCdKapCWt8Y/s320/3c.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We were thinking, why such behavior is happening. Finally we realized, this happens because of additional internal AM connections to support passivation/activation behavior. Why additional connections are not visible on normal load? It looks like when passivation/activation action happens really fast, additional internal connections are not reported. But on high load, when WebLogic is not able to process passivation/activation fast enough - usage of internal AM connections becomes visible.&lt;br /&gt;&lt;br /&gt;In order to prove that, we have created second data source (jdbc/HrInternalDS) on WebLogic and declared it to be used for internal AM connection - &lt;b&gt;jbo.server.internal_connection property&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-eO1CznP0zQk/Trj7XqL9ZiI/AAAAAAAAFnU/Wc_9PRxo1vQ/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://1.bp.blogspot.com/-eO1CznP0zQk/Trj7XqL9ZiI/AAAAAAAAFnU/Wc_9PRxo1vQ/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;After performing stress test with new data source configuration, we can confirm that main application data source reflects number of active AM instances, while dedicated data source for AM internal operations reports additional connections:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-idPAFWBUMZY/Trj8P7jXmlI/AAAAAAAAFnc/PIHZvRFQ50Y/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="86" src="http://2.bp.blogspot.com/-idPAFWBUMZY/Trj8P7jXmlI/AAAAAAAAFnc/PIHZvRFQ50Y/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This means its a good practice to declare separate dedicated data source for AM internal operations, if you want to maintain predictable number of database connections for application data source.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;- &lt;b&gt;Importance of AM Maximum Pool Size&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;This time I was repeating stress test multiple times, after 4 stress test (refer to &lt;i&gt;Pessimistic&lt;/i&gt; scenario) iterations WebLogic server became slower - request processing for 5th iteration slightly reduced.&lt;br /&gt;&lt;br /&gt;We can notice that from number of completed passivation/activation operations per minute - reduced to 1000 (it was 1500 before). This means passivation/activation circle started to happen slower. As result, AM pool is not able anymore to serve all 80 concurrent users with 20 AM instances (as per Referenced Pool Size). In this situation, number of active AM instances starts to grow, while finally its reaching Maximum Pool Size (30):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Hc7WIODEO-A/Trj-jqKEiaI/AAAAAAAAFnk/icEHhvBjcW0/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="159" src="http://3.bp.blogspot.com/-Hc7WIODEO-A/Trj-jqKEiaI/AAAAAAAAFnk/icEHhvBjcW0/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If there are even more online concurrent users coming, they will give NullPointer exceptions - because application physically unable to handle so many passivation/activation circles. If you will experience such situation, this means you need to increase Maximum Pool Size, as well as adjust Referenced Pool Size.&lt;br /&gt;&lt;br /&gt;If we continue stress test and move to second AM, because of high load on the server - second AM performs even less passivation/activation circles (just around 600, before it was 1500) for 80 concurrent users with Maximum Pool Size = 30:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-12-GI-Rf8L4/Trj_ZzNrEWI/AAAAAAAAFns/JMwDZurX8g0/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://2.bp.blogspot.com/-12-GI-Rf8L4/Trj_ZzNrEWI/AAAAAAAAFns/JMwDZurX8g0/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Naturally in this situation, second AM will be able to serve even less concurrent users on high load.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5920439102246484941?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5920439102246484941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5920439102246484941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5920439102246484941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5920439102246484941'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/11/stress-testing-oracle-adf-bc_08.html' title='Stress Testing Oracle ADF BC Applications - Internal Connections'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-mD4BbQj2RkI/Trj3IGKLumI/AAAAAAAAFnM/S0Hx7YO0OFM/s72-c/7.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-9114235330812234256</id><published>2011-11-06T22:14:00.001+01:00</published><updated>2011-11-07T09:40:15.726+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><title type='text'>Stress Testing Oracle ADF BC Applications - Passivation and Activation</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;When we are talking with customers about Oracle ADF performance, very often we can hear such question - "Hey, ADF works well when there are few concurrent users, how it behaves when there is more serious load?". In order to answer this question I will publish series of posts, where we will study different parameters for AM pool tuning and test AM pool configuration under stress loads. Today we will see how stable is AM pool passivation/activation mechanism.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Stress tests are implemented with JMeter. Check Chris Muir &lt;a href="http://one-size-doesnt-fit-all.blogspot.com/2010/04/configuring-apache-jmeter-specifically.html"&gt;blog&lt;/a&gt; about JMeter configuration for ADF 11g. I'm using JMeter configuration file from Chris blog, however original file is updated with internal loops to repeat session requests. JMeter allows to run stress test with multiple parallel users, each users starts its own HTTP session. It is not enough for stress test, additionally I would like to repeat user action within the same HTTP session - its why internal loops are needed, these loops allow to iterate through the same requests multiple times.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We will run 3 test scenarios (hardware: 4 virtual processors, 4 GB RAM):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Optimistic (15 concurrent users, 300 transactions in 10 minutes)&lt;/div&gt;&lt;div&gt;2. Average (25 concurrent users, 5000 transactions in 10 minutes)&lt;/div&gt;&lt;div&gt;3. Pessimistic (80 concurrent users, 16000 transactions in 10 minutes)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Each scenario consists of these steps:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Session initialization&lt;/div&gt;&lt;div&gt;2. Open Departments page (local AM)&lt;/div&gt;&lt;div&gt;3. Perform data change and Commit operation. Repeat 100 times per user, with 3 seconds wait time&lt;/div&gt;&lt;div&gt;4. Open Employees page (region imported from ADF library)&lt;/div&gt;&lt;div&gt;5. Perform data change and Commit operation. Repeat 100 times per user, with 3 seconds wait time&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;JMeter &lt;a href="http://jdevsamples.googlecode.com/files/AMTest.jmx"&gt;configuration file&lt;/a&gt; - internal loop to repeat session requests:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-aAHTBYbP9MM/Trbk4W_O76I/AAAAAAAAFkc/JSRLC2fG0qA/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://1.bp.blogspot.com/-aAHTBYbP9MM/Trbk4W_O76I/AAAAAAAAFkc/JSRLC2fG0qA/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wait time in the loop - 3 seconds:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fPBGNG1MsaE/TrblGiUsd8I/AAAAAAAAFkk/FL1X2YDKVIc/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://3.bp.blogspot.com/-fPBGNG1MsaE/TrblGiUsd8I/AAAAAAAAFkk/FL1X2YDKVIc/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Download sample application for stress test - &lt;a href="http://jdevsamples.googlecode.com/files/stresstest_v1.zip"&gt;stresstest_v1.zip&lt;/a&gt;. Sample contains two applications - main and application library. Both applications implement two AM modules, pool settings for both AM's are configured to the same values. There are two pages inside main application, first page brings data from local AM, second from imported region and related AM:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mTpkyPLERxY/TrbmYPsZttI/AAAAAAAAFks/aabkOw1_cQg/s1600/0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-mTpkyPLERxY/TrbmYPsZttI/AAAAAAAAFks/aabkOw1_cQg/s320/0.png" width="184" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second page integrates ADF region from ADF library:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8t-6rjugLXI/Trb276PEvBI/AAAAAAAAFmE/nGXxpH_yL_4/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-8t-6rjugLXI/Trb276PEvBI/AAAAAAAAFmE/nGXxpH_yL_4/s1600/3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Stress test is designed to run such scenarion, where user clicks on Submit button from ADF UI, this button calls custom method from AM interface. Custom AM method is accessing VO row, by randomized value in range based on VO rowset size. Numeric attribute value is changed (incremented by 1) for every accessed row, transaction is committed or reverted back, depending on concurrent modification. Additionally we have one transient attribute, it is set to be passivated:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-xYOR1f-akNM/Trbntf9_G4I/AAAAAAAAFk0/ftNc8JRHrJM/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="297" src="http://3.bp.blogspot.com/-xYOR1f-akNM/Trbntf9_G4I/AAAAAAAAFk0/ftNc8JRHrJM/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All 3 stress test scenarios (&lt;b&gt;Optimistic, Average and Pessimistic&lt;/b&gt;) are executed with the same AM pool configuration (for both AM's) - based on rough estimate of approximately 20 concurrent users in the system:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-lbysEx5j0OQ/TrboGCYsb-I/AAAAAAAAFk8/dG03UtPyLfc/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-lbysEx5j0OQ/TrboGCYsb-I/AAAAAAAAFk8/dG03UtPyLfc/s320/1.png" width="293" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- &lt;b&gt;Initial Pool Size = 22&lt;/b&gt; (number of AM instances created on first ever access, recommended to be 10% more than estimated number of concurrent users)&lt;/div&gt;&lt;div&gt;- &lt;b&gt;Maximum Pool Size = 30&lt;/b&gt; (number of maximum AM instances pool can create, recommended to be 20%-30% more than initial pool size)&lt;/div&gt;&lt;div&gt;- &lt;b&gt;Referenced Pool Size = 20&lt;/b&gt; (number of active AM instances, recommended to be the same as estimated number of concurrent users - to avoid frequent passivation/activation)&lt;/div&gt;&lt;div&gt;- &lt;b&gt;Minimum Available Size = 0&lt;/b&gt; (when set to 0, allows to release all AM instances after idle timeout, this helps to release reserved database connections as well. Is set to 0 for tests in stress environment, in your system you may set it to higher value, but less than referenced pool size)&lt;/div&gt;&lt;div&gt;- &lt;b&gt;Maximum Available Size = 25&lt;/b&gt; (maximum number of AM instances after pool clean-up)&lt;/div&gt;&lt;div&gt;- &lt;b&gt;Idle Instance Timeout = 300&lt;/b&gt; (AM instance is considered inactive after 5 minutes of inactivity, this if for stress test. In your system you would set it something close to Web session timeout - to prevent frequent passivation/activation)&lt;/div&gt;&lt;div&gt;- &lt;b&gt;Pool Pooling Interval &amp;nbsp;= 120&lt;/b&gt; (AM pool is cleaned every 2 minutes)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;1. Optimistic (15 concurrent users, 300 transactions in 10 minutes)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This test is performed on first ever access. As you can see, 22 AM instances are created, as per initial pool size setting. However, soon (idle time 5 mins + pool cleaning interval 2 mins) 7 AM instances are removed - because we have only 15 online users. Passivation/activation never happens (because referenced pool is set to be for 20, and we have only 15). &amp;nbsp;MainModule statistics:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_IzauI2ouHo/TrbyH_64mxI/AAAAAAAAFlE/qNNkpRe8uJY/s1600/1a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" src="http://4.bp.blogspot.com/-_IzauI2ouHo/TrbyH_64mxI/AAAAAAAAFlE/qNNkpRe8uJY/s320/1a.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Same for HrModule module:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2nsAPFLi86M/Trbyc4XAz3I/AAAAAAAAFlM/2oHGAVT1CyE/s1600/2a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://2.bp.blogspot.com/-2nsAPFLi86M/Trbyc4XAz3I/AAAAAAAAFlM/2oHGAVT1CyE/s320/2a.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Very important, because Minimum Available Size = 0, after idle time entire pool is cleaned:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-T9ZBrQrnTX8/Trby58uXVKI/AAAAAAAAFlU/NW1MJ982yWY/s1600/3a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="159" src="http://2.bp.blogspot.com/-T9ZBrQrnTX8/Trby58uXVKI/AAAAAAAAFlU/NW1MJ982yWY/s320/3a.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Same with DB connections, there is no need to wait for AM time to live, AM instances and DB connections can be released earlier - however this will trigger passivation. DB connection can be released before AM time to live, by tuning AM pool Minimum Available Size and AM Instance Timeout:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-FD6l6ArJubU/TrbzNPk929I/AAAAAAAAFlc/5tE9tGehBqE/s1600/4a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="121" src="http://2.bp.blogspot.com/-FD6l6ArJubU/TrbzNPk929I/AAAAAAAAFlc/5tE9tGehBqE/s320/4a.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;2. Average (25 concurrent users, 5000 transactions in 10 minutes)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This test with 25 online users is slightly above Referenced Pool Size = 20. We should experience passivation/activation behavior.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;AM pool allocates 20 active instances for 25 users (as per Referenced Pool Size). Passivation/activation starts to take place, in order to support all 25 users (around 500 passivation/activation circles per minute):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-bGveG2xQPYI/Trb09PnGETI/AAAAAAAAFlk/7OQOZEGtSDA/s1600/1b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="159" src="http://1.bp.blogspot.com/-bGveG2xQPYI/Trb09PnGETI/AAAAAAAAFlk/7OQOZEGtSDA/s320/1b.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Similar behavior for the second AM:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-kP-NEl8rWIY/Trb1Gy95PBI/AAAAAAAAFls/4qAwkiYOTVQ/s1600/2b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="169" src="http://2.bp.blogspot.com/-kP-NEl8rWIY/Trb1Gy95PBI/AAAAAAAAFls/4qAwkiYOTVQ/s320/2b.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;40 DB connections are used during peak time, when both AM's are active (20 + 20 active AM instances):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-mWWXDlbJhSw/Trb1Y5p0NOI/AAAAAAAAFl0/sP8Iy_sRBhc/s1600/3b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="121" src="http://1.bp.blogspot.com/-mWWXDlbJhSw/Trb1Y5p0NOI/AAAAAAAAFl0/sP8Iy_sRBhc/s320/3b.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you can see, even Maximum Pool Size = 30, active instance size is not exceeding Referenced Pool Size.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;3. Pessimistic (80 concurrent users, 16000 transactions in 10 minutes)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With 80 users, AM pool starts to passivate/activate much more (as expected). There are 20 active AM's, &amp;nbsp;as per Referenced Pool Size and those 20 AM's need to serve all 80 users. There are lots of switch activity happening - around 1500 passivation/activation circles in 1 minute:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-vNJ0jyPdzW8/TreZaMg1y5I/AAAAAAAAFmc/-Hnd-_4zqqk/s1600/1c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://3.bp.blogspot.com/-vNJ0jyPdzW8/TreZaMg1y5I/AAAAAAAAFmc/-Hnd-_4zqqk/s320/1c.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Runtime statistics for the second AM:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ops_41Ijudc/Trb3dcH7M9I/AAAAAAAAFmM/uje5mDraiVU/s1600/2c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="168" src="http://4.bp.blogspot.com/-ops_41Ijudc/Trb3dcH7M9I/AAAAAAAAFmM/uje5mDraiVU/s320/2c.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;During strong stress test, we can see that we were using at some moments more than 40 (20 per each AM) database connections (as previous test). Means AM pool during heavy stress test may maintain more active AM instances than specified by Referenced Pool Size - but still, AM size will not exceed Maximum Pool Size setting (30 in our case):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Cvuizj_12KI/Trb4KmkcqTI/AAAAAAAAFmU/oCdKapCWt8Y/s1600/3c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="http://1.bp.blogspot.com/-Cvuizj_12KI/Trb4KmkcqTI/AAAAAAAAFmU/oCdKapCWt8Y/s320/3c.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Conclusion: AM Pool is strong enough to handle stress peaks with online users greatly exceeding number of AM Pool Size and and AM Referenced Pool Size. However, in your system you should try to maintain AM Pool sizing as close as possible to expected number of online users - this will help to avoid performance costly passivation/activation operations.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-9114235330812234256?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/9114235330812234256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=9114235330812234256' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/9114235330812234256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/9114235330812234256'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/11/stress-testing-oracle-adf-bc.html' title='Stress Testing Oracle ADF BC Applications - Passivation and Activation'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-aAHTBYbP9MM/Trbk4W_O76I/AAAAAAAAFkc/JSRLC2fG0qA/s72-c/4.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-2237353859080591835</id><published>2011-11-05T20:07:00.001+01:00</published><updated>2011-11-05T20:08:00.903+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><title type='text'>Building Custom UI Shell with ADF 11g R2</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;ADF Task Flow support is improved in ADF 11g R2, now we have option to define multi task flow binding with dynamic number of regions - &lt;a href="http://download.oracle.com/docs/cd/E16162_01/web.1112/e16182/taskflows_regions.htm#CHDBDDFE"&gt;21.10 Configuring a Page To Render an Unknown Number of Regions&lt;/a&gt;. This means we can implement our own &lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/uishell-093084.html"&gt;UI Shell&lt;/a&gt; with dynamic tabs.&lt;br /&gt;&lt;br /&gt;For UI demo, watch recorded video - it shows UI for sample application (&lt;a href="http://jdevsamples.googlecode.com/files/MultiTaskFlowApp.zip"&gt;MultiTaskFlowApp.zip&lt;/a&gt;). Each tab brings region from multi task flow binding, region can be removed/added together with tab as well as selected to be current. Multi task flow binding representation with tabs, is only one of the possible variants, you can implement other UI models as well. Ah and yes, in 11g R2 - tab close icon looks much better - it comes together with tab, just like for Web browsers.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/IoOjmWsmsTk" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Documentation explains how to render multiple regions and how to close selected region - &lt;a href="http://download.oracle.com/docs/cd/E16162_01/web.1112/e16181/af_navigate.htm#CACCGCAD"&gt;20.8.3 What You May Need to Know About Removing Navigation Tabs&lt;/a&gt;. Sample application is using described concepts, but provides more advanced functionality. Instead of using &lt;i&gt;navigation pane&lt;/i&gt; component, we are generating dynamic tabs with &lt;i&gt;for each&lt;/i&gt; operator. This operator is configured to retrieve information about rendered region from multi task flow binding:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-dLPGs6j1c_A/TrWHdCn24hI/AAAAAAAAFj0/GQn3F_e0TSg/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://1.bp.blogspot.com/-dLPGs6j1c_A/TrWHdCn24hI/AAAAAAAAFj0/GQn3F_e0TSg/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Multi task flow binding points to managed bean, where we are constructing list of regions:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-zJLYlX9SEnA/TrWHpQaWlXI/AAAAAAAAFj8/SUW29ARHEGw/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="105" src="http://3.bp.blogspot.com/-zJLYlX9SEnA/TrWHpQaWlXI/AAAAAAAAFj8/SUW29ARHEGw/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Tab removal is improved as well, instead of hiding closed tab - we are removing region itself from muti task flow binding list, this means tab will be removed without any additional action:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--XL4tDR8oZc/TrWIQLkVbDI/AAAAAAAAFkE/ewiMUGd3V8s/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="175" src="http://2.bp.blogspot.com/--XL4tDR8oZc/TrWIQLkVbDI/AAAAAAAAFkE/ewiMUGd3V8s/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When menu item is selected, we want to make tab/region selected or open it, if it was closed. I have implemented custom method for this action:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-f5T-kWiEvi4/TrWIiNM43_I/AAAAAAAAFkM/Bq4Vxfajmjo/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://2.bp.blogspot.com/-f5T-kWiEvi4/TrWIiNM43_I/AAAAAAAAFkM/Bq4Vxfajmjo/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Two custom helper methods from sample application. First method checks if tab/region is loaded. Second method makes tab/region to be selected:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-3fmLuFbrPv8/TrWJcN7EqtI/AAAAAAAAFkU/Y0IGMQcuuOM/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="215" src="http://2.bp.blogspot.com/-3fmLuFbrPv8/TrWJcN7EqtI/AAAAAAAAFkU/Y0IGMQcuuOM/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-2237353859080591835?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/2237353859080591835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=2237353859080591835' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2237353859080591835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2237353859080591835'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/11/building-custom-ui-shell-with-adf-11g.html' title='Building Custom UI Shell with ADF 11g R2'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/IoOjmWsmsTk/default.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-7972004693674902279</id><published>2011-10-30T19:20:00.000+01:00</published><updated>2011-10-30T19:58:09.131+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><title type='text'>iPhone Web Application Development With ADF Mobile Browser</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This post provides sample code to cover complete use case scenario for mobile and simplify initial development phase for ADF mobile browser application. As it was presented on OOW this year, in the future we will have advanced ADF mobile support for HTML5, mobile application will leverage advanced functionalities offered by mobile frameworks. This is future, I will describe what is available today. Read more about ADF Mobile - &lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/overview/adf-mobile-096323.html"&gt;Mobile Application Development with Oracle ADF Mobile&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/MobileApp.zip"&gt;MobileApp.zip&lt;/a&gt;. This sample was created by aggregating different resources from Oracle ADF Mobile developer guide. It is designed with JDev 11g R2, but it works with JDev 11g R1 as well (just few minor changes will be needed for CSS style manager class). Additionally to information from developer guide related to mobile functionality, I went one step further and completed ADF part as well. I believe this may help to design and implement ADF mobile browser applications easier. You can use provided sample to Jump Start your mobile development with Oracle ADF.&lt;br /&gt;&lt;br /&gt;Sample application was designed and optimized for Apple iPhone, however it can run on other platforms as well. Implemented functionality:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ADF Security with Login/Logout support&lt;/li&gt;&lt;li&gt;Search screen with search results displayed in a table&lt;/li&gt;&lt;li&gt;Transition from search results screen to details screen&lt;/li&gt;&lt;li&gt;Editable details screen&lt;/li&gt;&lt;li&gt;Save/Undo functionality for editable data&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;In order to develop web applications optimized for iPhone platform, you should own Apple MacBook. If you have one, download &lt;a href="http://developer.apple.com/xcode/"&gt;Apple Xcode&lt;/a&gt; for free (development IDE from Apple) and run iPhone/iPad simulator application. Run iPhone simulator from Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/ folder. You don't need to have real iPhone, just test with simulator:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-vVeP2emnHMA/Tq2IGu-ByxI/AAAAAAAAFhU/Lqme8Qht2-I/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-vVeP2emnHMA/Tq2IGu-ByxI/AAAAAAAAFhU/Lqme8Qht2-I/s320/1.png" width="165" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you run provided sample application from JDeveloper 11g R2, or deploy to standalone WebLogic - access application through URL, directly from iPhone Safari browser:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Zvti9rJBnOU/Tq2IfB7Yz8I/AAAAAAAAFhc/N2DTxQ-AKbY/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-Zvti9rJBnOU/Tq2IfB7Yz8I/AAAAAAAAFhc/N2DTxQ-AKbY/s320/2.png" width="165" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Type username and password, authenticate into system by pressing Login button:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-CSLSfYIvRAI/Tq2IrIO2QaI/AAAAAAAAFhk/7o95CDyGAWk/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-CSLSfYIvRAI/Tq2IrIO2QaI/AAAAAAAAFhk/7o95CDyGAWk/s320/3.png" width="164" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Immediately after login, user is redirected to browse/search page. Search criteria is implemented as choice list - there are no results for default selection:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-LNq-0XOshK0/Tq2JCscNeZI/AAAAAAAAFhs/7yCGdBFn3y0/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-LNq-0XOshK0/Tq2JCscNeZI/AAAAAAAAFhs/7yCGdBFn3y0/s320/4.png" width="164" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Click on choice list and select another search criteria:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gO67rVl9VK8/Tq2JND_wG7I/AAAAAAAAFh0/_5JuvKFtZyE/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-gO67rVl9VK8/Tq2JND_wG7I/AAAAAAAAFh0/_5JuvKFtZyE/s320/5.png" width="165" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;List with results will be displayed, user will be able to click on results record:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-aDSeNqmfOxE/Tq2KFhvChuI/AAAAAAAAFh8/0l_ZGNV9SJ0/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-aDSeNqmfOxE/Tq2KFhvChuI/AAAAAAAAFh8/0l_ZGNV9SJ0/s320/6.png" width="164" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Open editable details screen with different actions:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-YRISJXXajD0/Tq2KTpcqWiI/AAAAAAAAFiE/-aJen8IuVRM/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-YRISJXXajD0/Tq2KTpcqWiI/AAAAAAAAFiE/-aJen8IuVRM/s320/7.png" width="164" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We saw application screens, now let's look into application source code. It is developed as ADF MVC application, with one difference - we cant use ADF regions, because ADF Mobile Web is implemented with Trinidad and Trinidad is not supporting ADF region tag. Model is based on ADF BC, as any regular ADF application. There is special CSS file as well, this file contains CSS tailored for mobile browsers and special mobile platform looks (iPhone skin for example):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-UEXq_MIZjjg/Tq2MYZZbdZI/AAAAAAAAFiM/4twuFUuwn5s/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-UEXq_MIZjjg/Tq2MYZZbdZI/AAAAAAAAFiM/4twuFUuwn5s/s320/8.png" width="188" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When developing ADF Mobile Web application, make sure to select ADF Mobile Browser technology:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ftzmfJcmgSo/Tq2MoijZ92I/AAAAAAAAFiU/VNCdt4ni27M/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="229" src="http://4.bp.blogspot.com/-ftzmfJcmgSo/Tq2MoijZ92I/AAAAAAAAFiU/VNCdt4ni27M/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Create JSPX pages, with mobile support, so all Trinidad tag libraries will be included. Make sure to define viewport as well, viewport is important for proper UI stretching on mobile device screen:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-bAw5BnJGOAk/Tq2NNW4MqNI/AAAAAAAAFic/QjsnfjuU4EY/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="146" src="http://2.bp.blogspot.com/-bAw5BnJGOAk/Tq2NNW4MqNI/AAAAAAAAFic/QjsnfjuU4EY/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You should use predefined style classes for different Trinidad UI components, this will allow to achieve native mobile browser look and feel (these style classes are available from custom CSS file included with sample application):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-5-jRypXir6Q/Tq2NyT0YEZI/AAAAAAAAFik/goHoPOprrJU/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="249" src="http://2.bp.blogspot.com/-5-jRypXir6Q/Tq2NyT0YEZI/AAAAAAAAFik/goHoPOprrJU/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There is some Java logic implemented as well. When user is changing search criteria choice list value, we are invoking Execute action - this will trigger VO refresh based on new bind variable value. For proper transition from browse screen to the editable details screen, we need to update current row key (otherwise details screen always will show first record available in VO rowset):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-KkrY6dN0uVU/Tq2OWoNtgOI/AAAAAAAAFis/vd2w8-nAuZY/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="218" src="http://3.bp.blogspot.com/-KkrY6dN0uVU/Tq2OWoNtgOI/AAAAAAAAFis/vd2w8-nAuZY/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When data changes are reverted from editable screen, we should stay on current record (by default focus would jump to the first record from VO rowset). This can be implemented by performing row refresh:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WsCFzfMix8k/Tq2O446qx7I/AAAAAAAAFi0/mGMs8BQ6y7A/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-WsCFzfMix8k/Tq2O446qx7I/AAAAAAAAFi0/mGMs8BQ6y7A/s320/13.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You may wonder, how we are applying search criteria. Criteria is declared to be applied directly for VO instance, in Application Module - every time when VO will be refreshed or accessed - predefined View Criteria will be applied automatically:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-7zNqyqKgTvc/Tq2PW7O7DdI/AAAAAAAAFi8/g3KXpGU-6Do/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="271" src="http://4.bp.blogspot.com/-7zNqyqKgTvc/Tq2PW7O7DdI/AAAAAAAAFi8/g3KXpGU-6Do/s320/14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There is no need to set bind variable value directly, because bind variable is predefined with Groovy expression language and retrieves value from VO implementation class method:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TxPrLnI459I/Tq2UeM3D8uI/AAAAAAAAFjE/Fb--mjv0NeY/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="184" src="http://4.bp.blogspot.com/-TxPrLnI459I/Tq2UeM3D8uI/AAAAAAAAFjE/Fb--mjv0NeY/s320/15.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This method is accessing choice list VO and gets current row, its how we are able to get retrieve search criteria parameter value:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-kXU3WqeeWps/Tq2UufMQYJI/AAAAAAAAFjM/VGbWqBppqcs/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="138" src="http://1.bp.blogspot.com/-kXU3WqeeWps/Tq2UufMQYJI/AAAAAAAAFjM/VGbWqBppqcs/s320/16.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Login action is based on standard ADF Security method:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-xOdass9MeFc/Tq2U3PLcbMI/AAAAAAAAFjU/SQY-5IdKaqQ/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="190" src="http://3.bp.blogspot.com/-xOdass9MeFc/Tq2U3PLcbMI/AAAAAAAAFjU/SQY-5IdKaqQ/s320/17.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For&amp;nbsp;successful redirect to Login page, make sure anonymous access is granted:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hzyEussP6c0/Tq2VHleoylI/AAAAAAAAFjc/uK8G_wcqoLc/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="132" src="http://4.bp.blogspot.com/-hzyEussP6c0/Tq2VHleoylI/AAAAAAAAFjc/uK8G_wcqoLc/s320/18.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-7972004693674902279?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/7972004693674902279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=7972004693674902279' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7972004693674902279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7972004693674902279'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/10/iphone-web-application-development-with.html' title='iPhone Web Application Development With ADF Mobile Browser'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-vVeP2emnHMA/Tq2IGu-ByxI/AAAAAAAAFhU/Lqme8Qht2-I/s72-c/1.png' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-7755042073005694219</id><published>2011-10-29T20:10:00.003+02:00</published><updated>2011-10-31T10:39:02.548+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='Bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><title type='text'>Experimenting with ADF BC Application Module Pool Tuning</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This week we were performing advanced ADF BC Application &amp;nbsp;Module pool tuning. There are few lessons learned, I would like to share with you. Tests were performed using latest JDeveloper/ADF release 11g R2  (11.1.2.1.0) (Build 6081). &amp;nbsp;Test case is based on sample application from &lt;a href="http://andrejusb.blogspot.com/2010/02/optimizing-oracle-adf-application-pool.html"&gt;Optimizing Oracle ADF Application Pool&lt;/a&gt; post. This sample contains two Application Modules, one is with default AM tuning settings, second AM is tuned:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;2 minutes Time to Live&lt;/li&gt;&lt;li&gt;1 minute Idle Instance Timeout &lt;/li&gt;&lt;li&gt;0.5 minute Pool Pooling Interval&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Experiment:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Deploy sample application with AM tuning into ADF Library&lt;/li&gt;&lt;li&gt;Import ADF Library into Main Application&lt;/li&gt;&lt;li&gt;Main Application contains its own local AM&lt;/li&gt;&lt;li&gt;Verify if tuning for AM from ADF Library was applied successfully&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Lessons learned:&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;There is no guarantee that AM tuning options will be applied always&lt;/li&gt;&lt;li&gt;Applied AM tuning options might depend on first AM initialized&lt;/li&gt;&lt;li&gt;AM Reserved mode might be more stable, comparing to AM Managed mode&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;AM passivation/activation relationship with database transaction:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;AM passivation happens - database transaction is lost for current user (database lock is lost)&lt;/li&gt;&lt;li&gt;Make sure no AM passivation happens during transaction period&lt;/li&gt;&lt;/ul&gt;By default, AM is running in Managed mode, this means AM is running with AM pool enabled. If we need to support critical transactional operations, we need to ensure AM Passivation will not happen during predefined period of time. However, it looks like there is no guarantee, even after applying proper tuning parameters - AM running in Managed mode, can be still passivated (even there is enough space in AM pool). This is a main reason, why you may prefer to run AM in Reserved mode, to ensure long running transactions. Read more about Managed and Reserved modes - &lt;a href="http://download.oracle.com/docs/cd/E24382_01/web.1112/e16182/bcstatemgmt.htm#BABIFCJH"&gt;43.2.2.3 About State Management Release Levels&lt;/a&gt;. Please test all tuning options carefully, before applying.&lt;br /&gt;&lt;br /&gt;Download test cases for today experiment - &lt;a href="http://jdevsamples.googlecode.com/files/DatabaseConnectionLeak_v2.zip"&gt;DatabaseConnectionLeak_v2.zip&lt;/a&gt; and &lt;a href="http://jdevsamples.googlecode.com/files/MainApp.zip"&gt;MainApp.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experiment&lt;/b&gt;: ADF BC Application Module Pool Tuning for ADF Application with Multiples AM's&lt;br /&gt;&lt;br /&gt;Test case application implements two AM's and two ADF TF's for each AM:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xnJQ3NEhUH4/Tqw8nGQy_EI/AAAAAAAAFf0/mHVMQt5oHnQ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-xnJQ3NEhUH4/Tqw8nGQy_EI/AAAAAAAAFf0/mHVMQt5oHnQ/s320/1.png" width="220" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This application is deployed into ADF library and imported into Main application.&amp;nbsp;As described above, one AM is tuned to be destroyed in 2 minutes:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-t2EnrNlioX8/Tqw9Dt-sGxI/AAAAAAAAFf8/g-ooBcNtINg/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="65" src="http://2.bp.blogspot.com/-t2EnrNlioX8/Tqw9Dt-sGxI/AAAAAAAAFf8/g-ooBcNtINg/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Main application implements two physical JSPX pages. First page brings data from local AM, second page integrates ADF regions from imported library:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-NXfViY-ab0Y/Tqw9j_5l2JI/AAAAAAAAFgE/uOAXbVdOwY0/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="189" src="http://3.bp.blogspot.com/-NXfViY-ab0Y/Tqw9j_5l2JI/AAAAAAAAFgE/uOAXbVdOwY0/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As you can see from DataBindings file for Main application, there is local Data Control usage declared:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--1xki9lVbdc/Tqw9zC-wtWI/AAAAAAAAFgM/7r9zD0TJAD4/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://2.bp.blogspot.com/--1xki9lVbdc/Tqw9zC-wtWI/AAAAAAAAFgM/7r9zD0TJAD4/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If we check the same for application packaged into ADF library, this application contains two Data Control usages - both pointing to different AM's (one AM is tuned):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8Kw8JREcym4/Tqw-Me3NVZI/AAAAAAAAFgU/IETtj90OthU/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="271" src="http://2.bp.blogspot.com/-8Kw8JREcym4/Tqw-Me3NVZI/AAAAAAAAFgU/IETtj90OthU/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Test was performed with Shared Data Control and with Isolated Data Control - there was no difference in results. Default - Shared Data Control for ADF task flow:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-yB0JEZmXfOE/Tqw-35uMVqI/AAAAAAAAFgc/hDH75I2m5xw/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-yB0JEZmXfOE/Tqw-35uMVqI/AAAAAAAAFgc/hDH75I2m5xw/s1600/6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;How to reproduce performed test:&lt;br /&gt;&lt;br /&gt;1. Run Main application and access first page - local Data Control is loaded:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WRlpphwcyF0/Tqw_C9VIj2I/AAAAAAAAFgk/mBpTLzzm8Nc/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="121" src="http://3.bp.blogspot.com/-WRlpphwcyF0/Tqw_C9VIj2I/AAAAAAAAFgk/mBpTLzzm8Nc/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;2. Press Edit button - navigate to second page. Data Control from imported library will be loaded:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ZuBWQ3SpxOk/Tqw_USYQ-sI/AAAAAAAAFgs/6m4Nu6f8Ftg/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://2.bp.blogspot.com/-ZuBWQ3SpxOk/Tqw_USYQ-sI/AAAAAAAAFgs/6m4Nu6f8Ftg/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;3. Imported library contains tuning for AM to be destroyed after 2 minutes of inactivity. This tuning option is ignored, AM instance still keeps database connection active even after 2 minutes of inactivity:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-BtDCKOr2Imw/TqxASma_oVI/AAAAAAAAFg0/-a7_-cy7oO0/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://4.bp.blogspot.com/-BtDCKOr2Imw/TqxASma_oVI/AAAAAAAAFg0/-a7_-cy7oO0/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;4. From Main application, expand Data Controls section. Expand HrModuleDataControl imported from ADF library, drag and drop EmployeesView1 into &lt;b&gt;first&lt;/b&gt; page of Main application:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-l43Woy56rD0/TqxAsCse3hI/AAAAAAAAFg8/S9T4_eBr9IM/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-l43Woy56rD0/TqxAsCse3hI/AAAAAAAAFg8/S9T4_eBr9IM/s1600/10.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NjXYOSPnLnw/TqxAvm_OdNI/AAAAAAAAFhE/nhqsQgc6cEs/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://2.bp.blogspot.com/-NjXYOSPnLnw/TqxAvm_OdNI/AAAAAAAAFhE/nhqsQgc6cEs/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;5. This time, AM from imported library gets initialized much earlier, when first page from Main application is loaded. We have different behavior now - AM tuning options are applied and AM instance is destroyed, database connection is released after 2 minutes of inactivity:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-iUobzHZx8uM/TqxBSNWuPHI/AAAAAAAAFhM/vWg6iYWmI74/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://3.bp.blogspot.com/-iUobzHZx8uM/TqxBSNWuPHI/AAAAAAAAFhM/vWg6iYWmI74/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Main goal of this post was to describe inconsistent behavior of AM pool tuning. If you will experience similar issues with AM tuning, please report through Oracle Metalink - this will help to improve AM pooling.&lt;br /&gt;&lt;br /&gt;Update - based on Chris Muir request, showing number of AM pools. There are 3 AM's and 1 active user - it creates 3 AM pools (11g R1):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-4bR_BTB2d6I/Tq5se3t54II/AAAAAAAAFjk/QeCgJANsNc0/s1600/pool_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" src="http://3.bp.blogspot.com/-4bR_BTB2d6I/Tq5se3t54II/AAAAAAAAFjk/QeCgJANsNc0/s320/pool_1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;One of 3 AM's is configured with 2 minutes time to live, but as we can see - AM instance remains active in the pool, even after 2 minutes time:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9_71T7vlShw/Tq5siTvGEZI/AAAAAAAAFjs/T4e_ElnsAIw/s1600/pool_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="134" src="http://3.bp.blogspot.com/-9_71T7vlShw/Tq5siTvGEZI/AAAAAAAAFjs/T4e_ElnsAIw/s320/pool_2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-7755042073005694219?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/7755042073005694219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=7755042073005694219' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7755042073005694219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7755042073005694219'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/10/experimenting-with-adf-bc-application.html' title='Experimenting with ADF BC Application Module Pool Tuning'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-xnJQ3NEhUH4/Tqw8nGQy_EI/AAAAAAAAFf0/mHVMQt5oHnQ/s72-c/1.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-3623432821501014767</id><published>2011-10-23T21:03:00.004+02:00</published><updated>2011-10-23T21:32:56.927+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Page Definition Variables to Store Temporary Page Values</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Back to the basics. In most of the cases data is coming from Model layer, from ADF BC or EJB. When user is changing data on the screen, frameworks takes care and preserves temporary data. However, what about such screens where we have temporary fields, without any relation with the Model layer - transient data fields. What if there is no corresponding Model implementation, and still we need to store field data between requests - where should we store it? I believer, one of the best techniques is to use Page Definition variables, this is old approach back from ADF 10g times - but it still works very well. Main advantage - we are able to store transient temporary data between requests and there is no need to define session scope bean.&lt;br /&gt;&lt;br /&gt;It happened to see scary things - developers are defining managed beans in Page Flow Scope, just because they want to make sure temporary UI values are preserved between requests :)&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/PageDefVariables.zip"&gt;PageDefVariables.zip&lt;/a&gt;. This sample implements two input components - inputText and inputNumberSlider. Both components are enabled with autoSubmit, as well as value change listener is defined for both. Once value is changed for one of the components, we recalculate total sum of both fields and display as total:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6uHvga2k-8Q/TqRgeiXp--I/AAAAAAAAFeQ/KNHloZKMo6k/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-6uHvga2k-8Q/TqRgeiXp--I/AAAAAAAAFeQ/KNHloZKMo6k/s1600/1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Both input components exist only in UI, there is no Model layer representation - user types values, total is recalculated immediately. However, we still need to store entered values, otherwise once we select number slider - partial request will be invoked and value entered for income will be lost. ADF developer would try to store input value inside Backing Bean:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-GCVvW3GSowg/TqRhLCiTioI/AAAAAAAAFeY/ERUymjWFrOY/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://4.bp.blogspot.com/-GCVvW3GSowg/TqRhLCiTioI/AAAAAAAAFeY/ERUymjWFrOY/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It would be wrong to store temporary value inside Backing Bean - this bean lifetime is as long as request, in other words - once we will enter second input value, first will be always lost. You may think to define Session or even Page Flow Scope bean - that would make it work, but why to waste server memory - only if you want to make your ADF applications slow.&lt;br /&gt;&lt;br /&gt;We can use Page Definition variables to store temporary values, these values will be preserved between requests. Open Page Definition, associated with the page, expand &lt;b&gt;executables&lt;/b&gt; and select to insert new &lt;b&gt;variable&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-G8_iv_xkwpU/TqRiHeCJe7I/AAAAAAAAFeg/H6_Z9xZZaqs/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="245" src="http://3.bp.blogspot.com/-G8_iv_xkwpU/TqRiHeCJe7I/AAAAAAAAFeg/H6_Z9xZZaqs/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Give a name and specify a type for new variable:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-8Q6ISBO0LRU/TqRiPfxON-I/AAAAAAAAFeo/RY7_TUd2cJA/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://4.bp.blogspot.com/-8Q6ISBO0LRU/TqRiPfxON-I/AAAAAAAAFeo/RY7_TUd2cJA/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In my example, I will define all three variables in the same way - for each of the fields:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-vW8ZPPgntUA/TqRiZloGztI/AAAAAAAAFew/7G3UbEj-jGU/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-vW8ZPPgntUA/TqRiZloGztI/AAAAAAAAFew/7G3UbEj-jGU/s1600/5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once variables are defined, we are not done yet with Page Definition. For every defined variable we need to define corresponding attribute (will be accessed from the page). Insert new item under &lt;b&gt;bindings&lt;/b&gt; - Attribute Value:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-stqNsadqXvc/TqRi2xktFPI/AAAAAAAAFe4/_1eZTS2Rr_g/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="294" src="http://2.bp.blogspot.com/-stqNsadqXvc/TqRi2xktFPI/AAAAAAAAFe4/_1eZTS2Rr_g/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When creating new Attribute Value, make sure to select &lt;b&gt;variables&lt;/b&gt; as Data Source and map related variable (defined one step above) name:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0S8-jFxO_sw/TqRjOlsMkgI/AAAAAAAAFfA/ycqrrj8kteE/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="206" src="http://4.bp.blogspot.com/-0S8-jFxO_sw/TqRjOlsMkgI/AAAAAAAAFfA/ycqrrj8kteE/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once all done, we should have following picture - each variable is assigned with attribute value:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-llYzJwLFU0k/TqRjbFIcsrI/AAAAAAAAFfI/_yHD5cVl5OY/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="87" src="http://4.bp.blogspot.com/-llYzJwLFU0k/TqRjbFIcsrI/AAAAAAAAFfI/_yHD5cVl5OY/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Go back to UI now, input component should have its value property mapped with attribute value (not with variable directly, because data will not be stored/retrieved) from Page Definition. For example: bindings.incomeVarAttr.inputValue:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Xfu4FrVpLyE/TqRkJ-1u0eI/AAAAAAAAFfQ/AYybObRpcsM/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="249" src="http://3.bp.blogspot.com/-Xfu4FrVpLyE/TqRkJ-1u0eI/AAAAAAAAFfQ/AYybObRpcsM/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once again - UI component value you should map with attribute value, not with variable directly:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-idCArcPUP2s/TqRkW5ChStI/AAAAAAAAFfY/4IM_1R094d0/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://3.bp.blogspot.com/-idCArcPUP2s/TqRkW5ChStI/AAAAAAAAFfY/4IM_1R094d0/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Finally, you may ask question - how to access attribute values defined in Page Definition&amp;nbsp;programmatically? Easy - use ADFUtils wrapper class. There are two methods available for your convenience - getBoundAttributeValue("name") and setBoundAttributeValue("name", value):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-fE8KMJNTiEo/TqRk87_go1I/AAAAAAAAFfg/lIReKmfC58c/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="229" src="http://4.bp.blogspot.com/-fE8KMJNTiEo/TqRk87_go1I/AAAAAAAAFfg/lIReKmfC58c/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Its how it looks on UI:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xmixIJ3fhqo/TqRlDUTVZnI/AAAAAAAAFfo/PLcC0jruy-Q/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="http://4.bp.blogspot.com/-xmixIJ3fhqo/TqRlDUTVZnI/AAAAAAAAFfo/PLcC0jruy-Q/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-3623432821501014767?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/3623432821501014767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=3623432821501014767' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3623432821501014767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3623432821501014767'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/10/page-definition-variables-to-store.html' title='Page Definition Variables to Store Temporary Page Values'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-6uHvga2k-8Q/TqRgeiXp--I/AAAAAAAAFeQ/KNHloZKMo6k/s72-c/1.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-3157531904989310170</id><published>2011-10-23T11:17:00.000+02:00</published><updated>2011-10-23T11:17:04.853+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>How To Disable Action Conditionally from Action Listener</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There are use cases, when we want to control command component action execution, based on logic from action listener. If some conditions implemented by action listener are met, we would like to prevent action execution. For today post, I will take example of WebCenter 11g PS3/PS4 navigation and explain how to prevent &lt;i&gt;pprnav&lt;/i&gt; action, when there are unsaved changes in the system.&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/EnterprisePortalApp_v10.zip"&gt;EnterprisePortalApp_v10.zip&lt;/a&gt;. This sample is typical WebCenter Portal application, it implements WebCenter navigation model. Navigation model item is defined with both - action listener and action properties - WebCenter &lt;i&gt;pprnav&lt;/i&gt; action is defined by default:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-G8lXBLoXioM/TqPU4j2nLlI/AAAAAAAAFdA/uJkrsG6Dc-0/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="151" src="http://3.bp.blogspot.com/-G8lXBLoXioM/TqPU4j2nLlI/AAAAAAAAFdA/uJkrsG6Dc-0/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In order to be able to discover unsaved changes, instead of pointing to WebCenter navigation context, action listener should point to our custom bean - navigationBean. There is custom processAction(...) method defined inside navigationBean:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-GgfD3yntEas/TqPVZRnCvOI/AAAAAAAAFdI/1oINmoW8bM0/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="129" src="http://2.bp.blogspot.com/-GgfD3yntEas/TqPVZRnCvOI/AAAAAAAAFdI/1oINmoW8bM0/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This method checks current data control frame for any unsaved changes, based on this check navigation is performed or unsaved changes message is shown.&lt;br /&gt;&lt;br /&gt;Sample application contains one task flow, where two fragments are defined. First fragment brings list of jobs, and second displays selected job and allows to edit job details:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6Jf3mfBQKso/TqPZDBVIOCI/AAAAAAAAFdQ/M_AK-KA-Ry8/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="207" src="http://4.bp.blogspot.com/-6Jf3mfBQKso/TqPZDBVIOCI/AAAAAAAAFdQ/M_AK-KA-Ry8/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We will see now, what will happen when there are unsaved changes in the second fragment and user clicks on WebCenter menu. We select job for editing:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-cMuSelLenMc/TqPZKXN4o2I/AAAAAAAAFdY/14Ik8xlOSj8/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://3.bp.blogspot.com/-cMuSelLenMc/TqPZKXN4o2I/AAAAAAAAFdY/14Ik8xlOSj8/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Open selected job details, edit data:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wN7gQRdbI2s/TqPZVR_9zqI/AAAAAAAAFdg/27YN1zJ8Tmw/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="84" src="http://2.bp.blogspot.com/-wN7gQRdbI2s/TqPZVR_9zqI/AAAAAAAAFdg/27YN1zJ8Tmw/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Without saving or reverting changes, click on any item from WebCenter menu. Our custom processAction(...) method will be invoked, where current data frame will be checked for unsaved data - unsaved changes message will be shown to the user and further navigation will be prevented. However - we loose editing screen and are navigated back to the first fragment from the task flow:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CJPNqfiL4Bc/TqPZ0rhqMDI/AAAAAAAAFdo/EXfpZXYNS8I/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://3.bp.blogspot.com/-CJPNqfiL4Bc/TqPZ0rhqMDI/AAAAAAAAFdo/EXfpZXYNS8I/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;What is the reason for this? Logically - because WebCenter menu defines &lt;i&gt;pprnav&lt;/i&gt; action by default, even we prevent further navigation from custom action listener, action method is still invoked:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Hhj2XryeB1E/TqPaMjMMHyI/AAAAAAAAFdw/yZ5M07LyGZk/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://2.bp.blogspot.com/-Hhj2XryeB1E/TqPaMjMMHyI/AAAAAAAAFdw/yZ5M07LyGZk/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There is a way to control action from action listener. If there are unsaved changes, we can get instance of RichCommandLink menu item and set action expression to be Null. Keep in mind, action method is invoked always after action listener method - this would mean that in our case, because we are setting action expression to be Null - action will not be invoked at all, when there are unsaved changes and we will stay on current fragment:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-BdziJsK-nIM/TqPa378FCzI/AAAAAAAAFd4/OUYNKAE4Tnw/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-BdziJsK-nIM/TqPa378FCzI/AAAAAAAAFd4/OUYNKAE4Tnw/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once action expression is set to be Null, it will remain as Null always for life span of current session. This means for next request we need to reset it to be &lt;i&gt;pprnav&lt;/i&gt; again. We can set action expression to be &lt;i&gt;pprnav&lt;/i&gt;, if there is unsaved data - it will be tracked during same request and action expression will be set back to Null again:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-L_MbSkWmW3M/TqPbYL5u6dI/AAAAAAAAFeA/BWsK3Emw_ow/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://3.bp.blogspot.com/-L_MbSkWmW3M/TqPbYL5u6dI/AAAAAAAAFeA/BWsK3Emw_ow/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Focus stays on current fragments, with unsaved data:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-bxzsoeFvMP0/TqPbiLTbGtI/AAAAAAAAFeI/mnlTT5oDnRU/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="87" src="http://2.bp.blogspot.com/-bxzsoeFvMP0/TqPbiLTbGtI/AAAAAAAAFeI/mnlTT5oDnRU/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-3157531904989310170?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/3157531904989310170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=3157531904989310170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3157531904989310170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3157531904989310170'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/10/how-to-disable-action-conditionally.html' title='How To Disable Action Conditionally from Action Listener'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-G8lXBLoXioM/TqPU4j2nLlI/AAAAAAAAFdA/uJkrsG6Dc-0/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5754936093955801128</id><published>2011-10-18T08:06:00.000+02:00</published><updated>2011-10-18T08:06:24.276+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Samurai'/><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Red Samurai Business Contextual Messaging Extension for Oracle WebCenter</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;We have recorded demo &lt;a href="http://www.youtube.com/watch?v=eb4mwXuUeK0"&gt;videocast&lt;/a&gt; for our WebCenter 11g extension - Business Contextual Messaging. Read more about our extensions for WebCenter - &lt;a href="http://andrejusb.blogspot.com/2011/10/red-samurai-social-enterprise.html"&gt;Red Samurai Social Enterprise Extensions for Oracle WebCenter&lt;/a&gt;. Videocast explains in detail how this extension works - very similar to Facebook, except pictures we have business data. Business Contextual Messaging extension is designed to simplify business communication within enterprise:&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Minimize emails and transfer business communication directly into enterprise system&lt;/li&gt;&lt;li&gt;Enable easier tracking and escalation of communication on business context&lt;/li&gt;&lt;li&gt;Be able to read new messages directed to business user, based on custom security&lt;/li&gt;&lt;li&gt;Check if business user is online/offline&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Extension is built using ADF 11g Faces and ADF Task Flows, consuming WebCenter Java API in the background. WebCenter Java API is used to integrate standard WebCenter Activity Stream functionality for Business Contextual Messaging approach.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Demo videocast is recorded in HD, switch to 720p and fullscreen mode on Youtube for better video quality:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/eb4mwXuUeK0?rel=0" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Complete set of WebCenter extensions from Red Samurai:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-yqcwkd9090s/To-TsYl-rcI/AAAAAAAAFaw/FkJf48njYPQ/s1600/redsam.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://1.bp.blogspot.com/-yqcwkd9090s/To-TsYl-rcI/AAAAAAAAFaw/FkJf48njYPQ/s320/redsam.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5754936093955801128?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5754936093955801128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5754936093955801128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5754936093955801128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5754936093955801128'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/10/red-samurai-business-contextual.html' title='Red Samurai Business Contextual Messaging Extension for Oracle WebCenter'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/eb4mwXuUeK0/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-4066868087372843646</id><published>2011-10-15T23:54:00.003+02:00</published><updated>2011-10-16T09:59:12.367+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><title type='text'>ADF BC Tuning with Do Connection Pooling and TXN Disconnect Level</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;For one of my previous posts, &lt;a href="http://blogs.oracle.com/smuenchadf/"&gt;Steve Muench&lt;/a&gt; was pointing out that there is option to tune data source usage in ADF by setting &lt;b&gt;jbo.doconnectionpooling = true&lt;/b&gt; and &lt;b&gt;jbo.txn.disconnect_level = 1&lt;/b&gt;. You can find Steve comment here - &lt;a href="http://andrejusb.blogspot.com/2011/09/how-to-speed-up-application.html"&gt;How To Speed Up Application Undeployment in JDeveloper 11g R2&lt;/a&gt;. If your application contains many application modules (let's say 50) and there are lots of concurrent users working at the same time, with default ADF BC settings we would reserve large number of database connections. Reserved connection will be hanging until AM instance will be destroyed. This is not what we want, especially with high number of concurrent users. If we set jbo.doconnectionpooling = true, database connection will be reserved only during HTTP request and then released. Thats not good, because lots of AM passivation/activation will happen. However, with second property - jbo.txn.disconnect_level = 1, ADF BC instead of passivating/activating &amp;nbsp;to database, will keep AM data in memory during HTTP requests. It will passivate/activate as expected, only if AM instance will be granted to another session (situation when no free AM instances in the pool). Based on chapter &lt;a href="http://download.oracle.com/docs/cd/E24382_01/web.1112/e16182/bcampool.htm#sm0301"&gt;44.2 Setting Pool Configuration Parameters&lt;/a&gt;, there is Oracle recommendation:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Leave the jbo.doconnectionpooling configuration parameter set to false for best performance without sacrificing scalability and reliability. Database connection pooling is still achieved through application module pooling. The only exception is when multiple application module pools (and therefore a large number of application module instances) share the same database, making the total available database connections the highest priority.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;But few lines below that, there is another recommendation:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;However, when minimizing the total overall number of database sessions is a priority, one situation in which it might be appropriate to use database connection pooling is when you have a large number of application module pools all needing to use database connections from the same underlying application user at the database level.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Finally chapter &lt;i&gt;44.3.2 What You May Need to Know About Database User State and jbo.doconnectionpooling = true&lt;/i&gt; says:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Alternatively, you can set jbo.txn.disconnect_level=1 (default is 0) to ensure that all application modules, view objects and row sets remain in memory and stay valid after their corresponding references to JDBC connections are dropped. Upon activation, the framework reexecutes and synchronizes the cursor positions. When used in conjunction with jbo.doconnectionpooling=true, setting jbo.txn.disconnect_level=1 reduces the memory overhead associated with this situation.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Before diving into technical experiment, lets draw some conclusion based on Oracle documentation:&lt;br /&gt;&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;If we don't have large number of concurrent users, and number of opened database connections is not priority - its better to use default ADF BC setting (jbo.doconnectionpooling = false). This will safe some performance, because it will not close/open database connection for each HTTP request&lt;/li&gt;&lt;li&gt;If opened database connections reduction is priority and there is large number of concurrent users, we can turn on database connection pooling and enable virtual memory to keep AM data in between requests (without passivating it to database). This will allow to detach AM instance from DB connection and prevent opened database connection hanging until timeout happens&lt;/li&gt;&lt;li&gt;&lt;b&gt;Please test tuning options thoroughly, before applying - every tuning have its own side effect&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;I did couple of experiments, to test how these different settings affect application performance. Download sample application with database connection pooling and virtual memory for AM instance enabled - &lt;a href="http://jdevsamples.googlecode.com/files/DoConnectionPoolingApp.zip"&gt;DoConnectionPoolingApp.zip&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sample application is fairly simple, I'm testing only navigation between different rows. First, let's test with default ADF BC settings, when database connection pooling is disabled:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2IrynrfPLwg/Tpn0q2ifIwI/AAAAAAAAFa8/r6x1_wfXWQ0/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-2IrynrfPLwg/Tpn0q2ifIwI/AAAAAAAAFa8/r6x1_wfXWQ0/s320/1.png" width="297" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In average, Next/Previous operation completes in &lt;b&gt;750 ms&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-HF188fW6Hq8/Tpn027JOpGI/AAAAAAAAFbE/OERQFX0Jvlg/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="255" src="http://3.bp.blogspot.com/-HF188fW6Hq8/Tpn027JOpGI/AAAAAAAAFbE/OERQFX0Jvlg/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Database connections are reserved for long time, until AM instance will timeout:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-JErQeQ4Kic4/Tpn1DiFo1LI/AAAAAAAAFbM/Vqpbld_Vjxo/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="116" src="http://3.bp.blogspot.com/-JErQeQ4Kic4/Tpn1DiFo1LI/AAAAAAAAFbM/Vqpbld_Vjxo/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Situation with default settings is quite clear, let's now enable database connection pooling. Also override prepareSession(Session) method in AM, you will see it will be called now for every HTTP request - make sure it doesn't break any custom logic, if any implemented in prepareSession(Session) from your system:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-YallxyZm5WM/Tpn2DZae4cI/AAAAAAAAFbU/c6ICMz2fYpM/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="43" src="http://3.bp.blogspot.com/-YallxyZm5WM/Tpn2DZae4cI/AAAAAAAAFbU/c6ICMz2fYpM/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enable database connection pooling - set Disconnect Application Module Upon Release:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0mmrG-f2vV0/Tpn2O3x8omI/AAAAAAAAFbc/N30t5RmiY2g/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-0mmrG-f2vV0/Tpn2O3x8omI/AAAAAAAAFbc/N30t5RmiY2g/s320/5.png" width="297" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Test Next/Previous actions, when database connection pooling is enabled, scroll through row set - it works significantly slower - &lt;b&gt;3 seconds&lt;/b&gt; in average:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CbDWXPA6I_c/Tpn2pNx6E3I/AAAAAAAAFbk/xSW7ha_ipi0/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://3.bp.blogspot.com/-CbDWXPA6I_c/Tpn2pNx6E3I/AAAAAAAAFbk/xSW7ha_ipi0/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is much slower, because for every HTTP request, passivation/activation to/from database happens - connection is detached from AM instance (it might be very slow, especially if VO SQL is complex, because it will be re-executed on each HTTP request):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VuE9PjTCaoM/Tpn3Heiye9I/AAAAAAAAFbs/YuRZprCpFoA/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://4.bp.blogspot.com/-VuE9PjTCaoM/Tpn3Heiye9I/AAAAAAAAFbs/YuRZprCpFoA/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We can see this from connection graph, database connection is reserved for 1 second and then returned back to the pool:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DE3zjKhW1i0/Tpn3VUC60MI/AAAAAAAAFb0/B6fYbOuXF3Q/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="http://1.bp.blogspot.com/-DE3zjKhW1i0/Tpn3VUC60MI/AAAAAAAAFb0/B6fYbOuXF3Q/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now let's enable virtual memory for ADF BC and set jbo.txn.disconnect_level = 1 (default is 0):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-74l0DeVW4_8/Tpn3lQrNEBI/AAAAAAAAFb8/rceqW54zJSQ/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-74l0DeVW4_8/Tpn3lQrNEBI/AAAAAAAAFb8/rceqW54zJSQ/s320/9.png" width="292" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With virtual memory enabled, we can scroll through row set much faster: &lt;b&gt;870 ms&lt;/b&gt; in average (it adds few ms perhaps because database connection is re-established on each HTTP request):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--Ng8ZIPaDrM/Tpn_QzCnKRI/AAAAAAAAFcE/OxlTtFYKSIY/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="255" src="http://1.bp.blogspot.com/--Ng8ZIPaDrM/Tpn_QzCnKRI/AAAAAAAAFcE/OxlTtFYKSIY/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Big advantage - database connection in most of the cases is reserved for such short time, its even not registered. Only for longer requests, we can spot that database connection is used and then immediately released back - very good:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-IYAD7ijGEEE/Tpn_oAXSepI/AAAAAAAAFcM/4rA_pouzrRw/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="118" src="http://4.bp.blogspot.com/-IYAD7ijGEEE/Tpn_oAXSepI/AAAAAAAAFcM/4rA_pouzrRw/s320/13.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's see now, how this tuning behaves in stress test environment. We set Maximum Pool Size = 1 and Referenced Pool Size = 1, this means there is space only for 1 session - second session will be activated and first always passivated:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-t2RGobsmt20/TpoAB9D3geI/AAAAAAAAFcU/EIS-l02yeFY/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-t2RGobsmt20/TpoAB9D3geI/AAAAAAAAFcU/EIS-l02yeFY/s320/14.png" width="294" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From session A, let's filter result set:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ySupmDuldUg/TpoAJ95fI_I/AAAAAAAAFcc/Sr2gHTTo320/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://1.bp.blogspot.com/-ySupmDuldUg/TpoAJ95fI_I/AAAAAAAAFcc/Sr2gHTTo320/s320/15.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Open another session B:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-KRh5JKJeNE0/TpoARGX-KEI/AAAAAAAAFck/sksKZGEyANo/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="299" src="http://3.bp.blogspot.com/-KRh5JKJeNE0/TpoARGX-KEI/AAAAAAAAFck/sksKZGEyANo/s320/16.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Session A data will not be lost, it will be passivated into database in this case, because there is no space in AM pool:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-EddlDpkK0n4/TpoAerkxywI/AAAAAAAAFcs/bbMLOGaiIUQ/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="209" src="http://2.bp.blogspot.com/-EddlDpkK0n4/TpoAerkxywI/AAAAAAAAFcs/bbMLOGaiIUQ/s320/17.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When session A will be activated, SQL will be re-executed as expected:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-UcnHB7LBBTQ/TpoAoeh8h8I/AAAAAAAAFc0/6FN0U5F5wMc/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="73" src="http://3.bp.blogspot.com/-UcnHB7LBBTQ/TpoAoeh8h8I/AAAAAAAAFc0/6FN0U5F5wMc/s320/18.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This means, even when database connection pooling is ON and virtual memory is ON, passivation/activation mechanism still works - when there is not enough space inside AM pool. Thats good, try to apply&amp;nbsp;&lt;b&gt;jbo.doconnectionpooling = true&lt;/b&gt;&amp;nbsp;and&amp;nbsp;&lt;b&gt;jbo.txn.disconnect_level = 1&lt;/b&gt;&amp;nbsp;and test to see positive/negative effect in your project.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-4066868087372843646?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/4066868087372843646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=4066868087372843646' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/4066868087372843646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/4066868087372843646'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/10/adf-bc-tuning-with-do-connection.html' title='ADF BC Tuning with Do Connection Pooling and TXN Disconnect Level'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-2IrynrfPLwg/Tpn0q2ifIwI/AAAAAAAAFa8/r6x1_wfXWQ0/s72-c/1.png' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-8608528443892287937</id><published>2011-10-11T21:00:00.000+02:00</published><updated>2011-10-25T18:02:15.782+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Samurai'/><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle OpenWorld'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Oracle Open World 2011 Slides - Texas A&amp;M University System Architecture: Oracle ADF, Oracle WebCenter Portal and Content</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Posting slides from Oracle Open World 2011 event. Together with Sreeja Sreekumaran, Technical Lead, TEES, Texas A&amp;amp;M University System, we were presenting production system and explaining technical implementation. We were focusing on:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;RSS Feeds and WebCenter MDS customization&lt;/li&gt;&lt;li&gt;WebCenter Portal Framework Menu&lt;/li&gt;&lt;li&gt;Red Samurai Messaging based on WebCenter API&lt;/li&gt;&lt;/ul&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/90AY8r-Xh50" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Advanced WebCenter Composer&lt;/li&gt;&lt;li&gt;UCM Content Presenter&lt;/li&gt;&lt;/ul&gt;It was exciting session, we completed five live demos, there was no single exception or error. Sreeja was doing production system demo and explaining various functionalities, I was talking about technical tips and tricks.&lt;br /&gt;&lt;br /&gt;You can &lt;a href="http://jdevsamples.googlecode.com/files/OOW_2923.pdf"&gt;download&lt;/a&gt; our session slides - each demo is supported with a link from the blog. It describes in detail presented solution and its implementation, sample application code is available as well.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://jdevsamples.googlecode.com/files/OOW_2923.pdf" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://3.bp.blogspot.com/-a_2J2vo4Dbc/TpSQIBOfbCI/AAAAAAAAFa0/Tx9sVFWc12Q/s320/slides.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Stay tuned - soon I will upload a set of video files for this session.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-8608528443892287937?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/8608528443892287937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=8608528443892287937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/8608528443892287937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/8608528443892287937'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/10/oracle-open-world-2011-slides-texas.html' title='Oracle Open World 2011 Slides - Texas A&amp;M University System Architecture: Oracle ADF, Oracle WebCenter Portal and Content'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/90AY8r-Xh50/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-4905571459559433917</id><published>2011-10-08T02:06:00.001+02:00</published><updated>2011-10-08T02:26:05.331+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Samurai'/><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Red Samurai Social Enterprise Extensions for Oracle WebCenter</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Oracle Open World 2011 was super exciting event for Oracle announcements - Larry Ellison announced &lt;a href="http://cloud.oracle.com/mycloud/f?p=service:social:0"&gt;Oracle Social Network on the Cloud&lt;/a&gt;. This is very important for Red Samurai, because we are inline with technology trend - Social Enterprise. Listen our &lt;a href="http://feedproxy.google.com/~r/OracleOfmRadio/~3/scDAJ6Ubqf8/10943736_Red_Samurai_100311.mp3"&gt;podcast&lt;/a&gt; with Oracle -&amp;nbsp;&lt;a href="http://blogs.oracle.com/webcenter/entry/social_enterprise_live_podcast_at"&gt;Social Enterprise: Live Podcast at Oracle OpenWorld&lt;/a&gt; as I discuss how Red Samurai is helping Oracle WebCenter customers experience the social enterprise with extensions Red Samurai has developed for Oracle WebCenter social business tailored use cases.&lt;br /&gt;&lt;br /&gt;We are focusing on five main technology areas and providing Oracle WebCenter extensions for:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Business Contextual Messaging (enterprise Facebook approach)&lt;/li&gt;&lt;li&gt;Lightweight User Presence (no external communication server required)&lt;/li&gt;&lt;li&gt;SAP/Microsoft Integration&lt;/li&gt;&lt;li&gt;Documents (extensions for Oracle UCM integration and lightweight document management)&lt;/li&gt;&lt;li&gt;Search (simplifying Search across different data sources)&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-yqcwkd9090s/To-TsYl-rcI/AAAAAAAAFaw/FkJf48njYPQ/s1600/redsam.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://1.bp.blogspot.com/-yqcwkd9090s/To-TsYl-rcI/AAAAAAAAFaw/FkJf48njYPQ/s320/redsam.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Stay tuned - soon we will release videocast for Red Samurai Business Contextual Messaging extension, implemented on top of Oracle WebCenter Services API.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-4905571459559433917?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/4905571459559433917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=4905571459559433917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/4905571459559433917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/4905571459559433917'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/10/red-samurai-social-enterprise.html' title='Red Samurai Social Enterprise Extensions for Oracle WebCenter'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-yqcwkd9090s/To-TsYl-rcI/AAAAAAAAFaw/FkJf48njYPQ/s72-c/redsam.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5708623547736521612</id><published>2011-09-25T18:23:00.001+02:00</published><updated>2011-09-29T18:14:08.743+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='Bugs'/><title type='text'>How To Speed Up Application Undeployment in JDeveloper 11g R2</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There was new patch set released this week for JDeveloper 11g R2, its called (11.1.2.1.0). I had a quick look, there are still few issues left from previos release (11.1.2.0.0), but overall this new update looks better and more stable.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Same applies for JDeveloper 11g R1.&lt;br /&gt;&lt;br /&gt;This post describes issue related to long application undeployment time. Reproduced when running on embedded WLS directly from JDev. I had this issue in (11.1.2.0.0), same reproduced with (11.1.2.1.0).&lt;br /&gt;&lt;br /&gt;Sample app is fairly basic, it contains one ADF BC AM, read-only VO and one JSF page - &lt;a href="http://jdevsamples.googlecode.com/files/ADFAppADFBCSimple11R21.zip"&gt;ADFAppADFBCSimple11R21.zip&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/--ONDR7rcVk8/Tn9HvntSkAI/AAAAAAAAFaM/jXbkXRzk1sQ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/--ONDR7rcVk8/Tn9HvntSkAI/AAAAAAAAFaM/jXbkXRzk1sQ/s320/1.png" width="257" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As per documentation chapter &lt;a href="http://download.oracle.com/docs/cd/E16162_01/web.1112/e16182/bcservices.htm#CHDJDBJB"&gt;9.3 Configuring Your Application Module Database Connection&lt;/a&gt;, 11g R2 differently than 11g R1, automatically assigns JDBC Data Source name for newly created AM - &lt;b&gt;java:comp/env/jdbc/HrDSDS&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-u2-AdtRQ-d4/Tn9JIyHwncI/AAAAAAAAFaQ/2UUw3h3hTMU/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://1.bp.blogspot.com/-u2-AdtRQ-d4/Tn9JIyHwncI/AAAAAAAAFaQ/2UUw3h3hTMU/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is good, but once we need to restart application, or even stop it from JDev:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-qjuwcSAJ4sQ/Tn9LgtHaGzI/AAAAAAAAFaU/Dt2rg7xSJnA/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="80" src="http://4.bp.blogspot.com/-qjuwcSAJ4sQ/Tn9LgtHaGzI/AAAAAAAAFaU/Dt2rg7xSJnA/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It takes in average 2 minutes to undeploy ADF app. It says - &lt;i&gt;resource pool shutting down, ignoring 1 resource still in use by applications&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-UbDtyo0CpB4/Tn9MLCyLnHI/AAAAAAAAFaY/Kc-C5cFfRb8/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://2.bp.blogspot.com/-UbDtyo0CpB4/Tn9MLCyLnHI/AAAAAAAAFaY/Kc-C5cFfRb8/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If we switch to JDBC URL type and provide connection name, as it was by default in 11gR1:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-U-ioQf0tv_8/Tn9MfIGMmbI/AAAAAAAAFac/5DlC5Hjrojc/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://1.bp.blogspot.com/-U-ioQf0tv_8/Tn9MfIGMmbI/AAAAAAAAFac/5DlC5Hjrojc/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As we can see from the log, when connection is changed to be JDBC URL type, application is undeployed just in 2 seconds:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7boP2GOOadc/Tn9NLcF9MOI/AAAAAAAAFag/aZ9ZrqaN5fI/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://3.bp.blogspot.com/-7boP2GOOadc/Tn9NLcF9MOI/AAAAAAAAFag/aZ9ZrqaN5fI/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;2 minutes vs. 2 seconds, I guess difference is obvious? :)&lt;br /&gt;&lt;br /&gt;Let's&amp;nbsp;dig&amp;nbsp;deeper.&lt;br /&gt;&lt;br /&gt;We can remove data source prefix and leave only - jdbc/HrDSDS:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-sOtx2JoX_H4/Tn9ThTHWmLI/AAAAAAAAFak/wvcJoNZarAQ/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://2.bp.blogspot.com/-sOtx2JoX_H4/Tn9ThTHWmLI/AAAAAAAAFak/wvcJoNZarAQ/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This would need to define data source on WebLogic manually, when we have prefix&amp;nbsp;java:comp/env/ it means JDev will create temporary data source automatically. I have defined jdbc/HrDSDS manually:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-IB_nGnX2fDo/Tn9TluGo3RI/AAAAAAAAFao/vM1srbBAmaQ/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="75" src="http://3.bp.blogspot.com/-IB_nGnX2fDo/Tn9TluGo3RI/AAAAAAAAFao/vM1srbBAmaQ/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Application is undeployed fast as well, same as using JDBC URL - around 2 seconds:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Y9z1aM-3vso/Tn9TxhRCRjI/AAAAAAAAFas/DKI1LwcmJr8/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="48" src="http://1.bp.blogspot.com/-Y9z1aM-3vso/Tn9TxhRCRjI/AAAAAAAAFas/DKI1LwcmJr8/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Lesson learned - in 11g R2, until it will be fixed - don't use auto generated prefix name java:comp/env for data sources. Always define data sources manually on WebLogic or use JDBC URL, as it was default in 11g R1.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5708623547736521612?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5708623547736521612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5708623547736521612' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5708623547736521612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5708623547736521612'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/09/how-to-speed-up-application.html' title='How To Speed Up Application Undeployment in JDeveloper 11g R2'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/--ONDR7rcVk8/Tn9HvntSkAI/AAAAAAAAFaM/jXbkXRzk1sQ/s72-c/1.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5787693693466841916</id><published>2011-09-21T13:45:00.003+02:00</published><updated>2011-09-21T13:54:24.308+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>How to Disable WebLogic Administrator from WebCenter 11g PS3/PS4 Portal Applications Management</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;While testing your WebCenter 11g PS3/PS4 application security, don't forget to check how portal application behaves for WebLogic administrator user. Typically we don't want to grant admin access to portal for the same user who is administering WebLogic server. Let's see how it works.&lt;br /&gt;&lt;br /&gt;Download sample application, where admin access is disabled for WebLogic administrator - &lt;a href="http://jdevsamples.googlecode.com/files/EnterprisePortalApp_v9.zip"&gt;EnterprisePortalApp_v9.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When we generate new WebCenter 11g PS3/PS4 application, JDeveloper constructs default UI template. This template is applied for portal pages. Because application is deployed on WebLogic server, and weblogic admin user is one of the users available in security provider - obviously we can login into our application as weblogic user and authentication will be completed successfully:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ljJfkXictnA/TnnKowHtgoI/AAAAAAAAFZg/0aWakFqQCqQ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="203" src="http://3.bp.blogspot.com/-ljJfkXictnA/TnnKowHtgoI/AAAAAAAAFZg/0aWakFqQCqQ/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;What about authorization? It seems like by default WebLogic administrator is granted portal admin access as well - Administration link is visible:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Ca0yzYc6dcU/TnnLONTCJDI/AAAAAAAAFZk/fJuexntVlmc/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-Ca0yzYc6dcU/TnnLONTCJDI/AAAAAAAAFZk/fJuexntVlmc/s1600/2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It depends on requirements, but in most of the cases we don't want to grant portal admin access to WebLogic administrator. How to disable it?&lt;br /&gt;&lt;br /&gt;First place to look - generated UI template. As we can see, showAdmin template attribute by default is enabled to all authenticated users. There is no much logic here, why all authenticated users should see portal Administration link:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QbNbHBxWJ6g/TnnLnwBLTpI/AAAAAAAAFZo/TBlTW8d6PAI/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="140" src="http://4.bp.blogspot.com/-QbNbHBxWJ6g/TnnLnwBLTpI/AAAAAAAAFZo/TBlTW8d6PAI/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We can fix it, by changing showAdmin value to check against Administrator role from ADF Security. Only portal administrators will be able to see Administration link:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-w-MZDKAJsqE/TnnL5YO7NSI/AAAAAAAAFZs/x7xJDinuVpM/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://3.bp.blogspot.com/-w-MZDKAJsqE/TnnL5YO7NSI/AAAAAAAAFZs/x7xJDinuVpM/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We test again, still get same result - WebLogic administrator is able to access Administration link:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-XNJmp4kPlOA/TnnMk_ZFoDI/AAAAAAAAFZw/A5jiYc4ZBso/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-XNJmp4kPlOA/TnnMk_ZFoDI/AAAAAAAAFZw/A5jiYc4ZBso/s1600/2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Seems like ADF Security role - Administrator is mapped with admin group from WebLogic. We can double check ADF Security configuration - Administrator role is mapped with our custom PortalManager group:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-XlYpr4z3sok/TnnM6DfRgyI/AAAAAAAAFZ0/1-kJDw8Gksk/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="158" src="http://1.bp.blogspot.com/-XlYpr4z3sok/TnnM6DfRgyI/AAAAAAAAFZ0/1-kJDw8Gksk/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In turn, PortalManager group is assigned for redsam and scott users only, there is no WebLogic admin here:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-VYVSpisB4Ks/TnnNLcMZ1UI/AAAAAAAAFZ4/YY1w8hwBTps/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="168" src="http://3.bp.blogspot.com/-VYVSpisB4Ks/TnnNLcMZ1UI/AAAAAAAAFZ4/YY1w8hwBTps/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ah, here is a trick. Its not visible through wizard and is hidden, you should open Source Code view for ADF Security definition. Only in Source Code view we can see, that ADF Security role "Administrator" is mapped with WebLogic admin group called - "Administrators". We can remove this mapping:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lQoUCcIHNkc/TnnNt-8p06I/AAAAAAAAFZ8/EhKWTVuUDuE/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="148" src="http://4.bp.blogspot.com/-lQoUCcIHNkc/TnnNt-8p06I/AAAAAAAAFZ8/EhKWTVuUDuE/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;WebLogic administrator will not be able anymore to perform portal application administration - link for Administration resources becomes disabled as well:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xXlyuwiW7jc/TnnODPK8C8I/AAAAAAAAFaA/DOWlHSTG-Mk/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-xXlyuwiW7jc/TnnODPK8C8I/AAAAAAAAFaA/DOWlHSTG-Mk/s1600/8.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Try to login with real portal administrator - redsam user:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ladsSOiR-zc/TnnOKsFIEtI/AAAAAAAAFaE/PHdiQV5RC64/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="223" src="http://2.bp.blogspot.com/-ladsSOiR-zc/TnnOKsFIEtI/AAAAAAAAFaE/PHdiQV5RC64/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Redsam user is granted with ADF Security role - Administrator, access to administration resources is granted:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VDrG0pbQCyQ/TnnOaUYKh6I/AAAAAAAAFaI/9rxjWSt3fu0/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-VDrG0pbQCyQ/TnnOaUYKh6I/AAAAAAAAFaI/9rxjWSt3fu0/s1600/10.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5787693693466841916?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5787693693466841916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5787693693466841916' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5787693693466841916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5787693693466841916'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/09/how-to-disable-weblogic-administrator.html' title='How to Disable WebLogic Administrator from WebCenter 11g PS3/PS4 Portal Applications Management'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-ljJfkXictnA/TnnKowHtgoI/AAAAAAAAFZg/0aWakFqQCqQ/s72-c/1.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-8317176026699531152</id><published>2011-09-16T12:30:00.002+02:00</published><updated>2011-09-16T12:35:37.115+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='UCM'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Integrating UCM Wiki Content Presenter into WebCenter 11g PS3/PS4</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;WebCenter 11g PS3/PS4 is able to store and retrieve Wiki content directly to and from Oracle UCM Content Server. Thats really good improvement comparing with early WebCenter releases, because there is no need to run separate server just to maintain static Wiki content. However, there are few tips and tricks to know, when integrating and making it work together with WebCenter Portal Framework application. This post will explain how to publish static Wiki content inside WebCenter Portal Framework application with the help of WebCenter Content Presenter ADF Task Flow.&lt;br /&gt;&lt;br /&gt;Sample application defines connection to UCM server, you should change these details according to your infrastructure:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-N7aWiX_i2Q8/TnMfZI2czWI/AAAAAAAAFYo/n4djqPVk4zA/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://2.bp.blogspot.com/-N7aWiX_i2Q8/TnMfZI2czWI/AAAAAAAAFYo/n4djqPVk4zA/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Download sample application for this post - &lt;a href="http://jdevsamples.googlecode.com/files/EnterprisePortalApp_v8.zip"&gt;EnterprisePortalApp_v8.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Menu is implemented using WebCenter Portal Framework menu model. Wiki content will be retrieved and displayed in the menu using Content Query - Static Content:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vMpNqmiN1WM/TnMf2jpY5sI/AAAAAAAAFYs/lavufYHXiIY/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-vMpNqmiN1WM/TnMf2jpY5sI/AAAAAAAAFYs/lavufYHXiIY/s320/2.png" width="298" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In WebCenter PS3/PS4, we can construct menu from list of documents dynamically, based on UCM query. Content Query retrieves Wiki documents of type text/html, by specified Tag - populated list will be converted into menu automatically (make sure Insert Folder Contents option is set):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-IAVa5QQsQr0/TnMgkg0wRbI/AAAAAAAAFYw/4MOtAG4wJi8/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" src="http://3.bp.blogspot.com/-IAVa5QQsQr0/TnMgkg0wRbI/AAAAAAAAFYw/4MOtAG4wJi8/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You may wonder, what is this Tag, which we are using to construct menu list. Tag is defined directly inside UCM, for example if we have documents stored in UCM:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-JeU830J5PLo/TnMg_WRE0EI/AAAAAAAAFY0/AjQ6bPQk23M/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="126" src="http://4.bp.blogspot.com/-JeU830J5PLo/TnMg_WRE0EI/AAAAAAAAFY0/AjQ6bPQk23M/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Each of the documents/folders can be assigned with specific Tag, we can use this tag from WebCenter menu model Content Query:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-c65cIdQFjr4/TnMhTeytGTI/AAAAAAAAFY4/JEFE8CLRMUs/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="201" src="http://2.bp.blogspot.com/-c65cIdQFjr4/TnMhTeytGTI/AAAAAAAAFY4/JEFE8CLRMUs/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here is example of menu list populated from Content Query, Wiki document is loaded based on menu selection. All such menu links, generated based on Content Query, are rendering Wiki content directly inside Content Presenter:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-EWSahTFnkCg/TnMhlRr82hI/AAAAAAAAFY8/SWUPJy0KhBE/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="124" src="http://1.bp.blogspot.com/-EWSahTFnkCg/TnMhlRr82hI/AAAAAAAAFY8/SWUPJy0KhBE/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We can edit Wiki document, because content is loaded inside Content Presenter automatically. Let's specify a link to another Wiki document available in UCM:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-JBqvRuf_Goo/TnMiAFR2pPI/AAAAAAAAFZA/XRDynNdaU2M/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="http://2.bp.blogspot.com/-JBqvRuf_Goo/TnMiAFR2pPI/AAAAAAAAFZA/XRDynNdaU2M/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Wiki document is updated inside Content Presenter, using Rich Text editor:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-35h9qjA2nqI/TnMiNIHzlGI/AAAAAAAAFZE/Zpe36pD03e0/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="167" src="http://2.bp.blogspot.com/-35h9qjA2nqI/TnMiNIHzlGI/AAAAAAAAFZE/Zpe36pD03e0/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's see what will happen, when we click on newly added link to another Wiki document:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Sbf8DGowMQs/TnMiXBwWgZI/AAAAAAAAFZI/SwpGn1l8x7M/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://1.bp.blogspot.com/-Sbf8DGowMQs/TnMiXBwWgZI/AAAAAAAAFZI/SwpGn1l8x7M/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When link to another Wiki document is clicked, WebCenter is loading Document Viewer task flow and opens referenced Wiki document:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CP-BFnsia4k/TnMirMx63fI/AAAAAAAAFZM/BHElM9bbnEs/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="201" src="http://2.bp.blogspot.com/-CP-BFnsia4k/TnMirMx63fI/AAAAAAAAFZM/BHElM9bbnEs/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Its not what we want, there is no need to open Document Viewer, we want to open Wiki document as static HTML page. Even more, when Document Viewer is opened from Wiki link, it&amp;nbsp;destroys&amp;nbsp;WebCenter menu model - portal application becomes broken (even Logout doesn't work):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-U6-60irix1A/TnMkWK6RzuI/AAAAAAAAFZQ/e2lOwdwUy2w/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="201" src="http://1.bp.blogspot.com/-U6-60irix1A/TnMkWK6RzuI/AAAAAAAAFZQ/e2lOwdwUy2w/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;But don't worry ! There is option to force Wiki links to behave as simple links and load static content - &lt;a href="http://download.oracle.com/docs/cd/E21764_01/webcenter.1111/e10148/jpsdg_wiki.htm#CIAFCGAE"&gt;31.3.5 Displaying Wiki Page Links Within Content Presenter&lt;/a&gt;. We need to update adf-config.xml file with Wiki resource handler:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DlX-Y_kSi9Y/TnMk4OiilpI/AAAAAAAAFZU/GbK_xFcSaHM/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="90" src="http://1.bp.blogspot.com/-DlX-Y_kSi9Y/TnMk4OiilpI/AAAAAAAAFZU/GbK_xFcSaHM/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's try to click on Wiki link again:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-xhroQSUSUjM/TnMlAdZ7SPI/AAAAAAAAFZY/rZic80qzkK4/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="195" src="http://2.bp.blogspot.com/-xhroQSUSUjM/TnMlAdZ7SPI/AAAAAAAAFZY/rZic80qzkK4/s320/13.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It works now ! Referenced Wiki document was loaded, even menu selection was updated automatically - thats what we need:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Zwc98rQsR5Q/TnMlNKMW0oI/AAAAAAAAFZc/n6IXxmOknVA/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://4.bp.blogspot.com/-Zwc98rQsR5Q/TnMlNKMW0oI/AAAAAAAAFZc/n6IXxmOknVA/s320/14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-8317176026699531152?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/8317176026699531152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=8317176026699531152' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/8317176026699531152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/8317176026699531152'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/09/integrating-ucm-wiki-content-presenter.html' title='Integrating UCM Wiki Content Presenter into WebCenter 11g PS3/PS4'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-N7aWiX_i2Q8/TnMfZI2czWI/AAAAAAAAFYo/n4djqPVk4zA/s72-c/1.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5255830651112933265</id><published>2011-09-15T10:49:00.001+02:00</published><updated>2011-09-15T10:49:50.370+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><title type='text'>Programmatic ADF Task Flow Router</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Blog reader is asking how to control ADF Task Flow navigation programmatically (&lt;a href="http://andrejusb.blogspot.com/2007/12/jdeveloper-11g-and-adf-task-flow.html"&gt;JDeveloper 11g and ADF Task Flow Parameters&lt;/a&gt;), in order to minimize predefined static outcomes inside ADF Task Flow diagram. I would go with simplest option and use Router activity available for ADF Task Flows. However, depending on use case, we may require to implement routing logic inside custom Java method.&lt;br /&gt;&lt;br /&gt;Sample application - &lt;a href="http://jdevsamples.googlecode.com/files/ADFConditionalNavigation.zip"&gt;ADFConditionalNavigation.zip&lt;/a&gt;, explains how to implement programmatic ADF Task Flow router inside Java bean class. This sample is implemented using latest JDeveloper 11g R2, but same logic can be applied with previous JDeveloper 11g versions as well.&lt;br /&gt;&lt;br /&gt;For the test case, I have defined three buttons, each assigned with af:setPropertyListener:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-cz98aMxbkUo/TnG3jraRg4I/AAAAAAAAFYI/wqRJkOlEc6w/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="263" src="http://1.bp.blogspot.com/-cz98aMxbkUo/TnG3jraRg4I/AAAAAAAAFYI/wqRJkOlEc6w/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Each button points to the same navigation outcome called &lt;i&gt;route&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-BEsdnnKxYAY/TnG32wKrJcI/AAAAAAAAFYM/reELfgIainI/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="82" src="http://1.bp.blogspot.com/-BEsdnnKxYAY/TnG32wKrJcI/AAAAAAAAFYM/reELfgIainI/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is the reason, why we are using af:setPropertyListener, to distinguish navigation outcome dynamically. Navigation outcome name for each of the buttons is stored inside our custom bean from View scope:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-M0WlKtDQDfE/TnG4drRYltI/AAAAAAAAFYQ/iSN3-yggHYw/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="218" src="http://1.bp.blogspot.com/-M0WlKtDQDfE/TnG4drRYltI/AAAAAAAAFYQ/iSN3-yggHYw/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There is a &lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;bug&lt;/span&gt;&lt;/b&gt; in JDeveloper 11g R2 IDE, it can't resolve managed bean methods or properties declared in any scope except session or request (see 'To' part highlighted in red). Good thing this is only IDE bug, on runtime it works well. Our managed bean is declared in view scope, to make sure stored outcome name will be available for programmatic routing:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-HfAZ30eQA_8/TnG5hlGrC9I/AAAAAAAAFYU/Sxk5Lg1zQdE/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="http://3.bp.blogspot.com/-HfAZ30eQA_8/TnG5hlGrC9I/AAAAAAAAFYU/Sxk5Lg1zQdE/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Navigation from main page is always performed only through &lt;i&gt;route&lt;/i&gt; outcome. Next we are hitting Method Call - it calls our custom method from managed bean. This custom method evaluates current dynamic outcome name and returns real outcome (which will be &lt;i&gt;jobs&lt;/i&gt; or &lt;i&gt;empls&lt;/i&gt; in our case):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-jgmHNjHMzvo/TnG6gkGKLHI/AAAAAAAAFYY/KAKLD1sacOk/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="172" src="http://4.bp.blogspot.com/-jgmHNjHMzvo/TnG6gkGKLHI/AAAAAAAAFYY/KAKLD1sacOk/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If we look into Method Call properties, we will see custom method name with routing logic (IDE bug makes it look red, same as explained above). Instead of using Fixed Outcome, &lt;b&gt;toString() = true&lt;/b&gt; option is specified. This means instead of using predefined outcome name, ADF will use return value of our custom method as navigation outcome:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RXGdZ4uhxVM/TnG7X1W3QEI/AAAAAAAAFYc/8NZKDI4ekeM/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="http://1.bp.blogspot.com/-RXGdZ4uhxVM/TnG7X1W3QEI/AAAAAAAAFYc/8NZKDI4ekeM/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's look into custom router method code. Nothing complex - we are checking value of dynamic outcome initialized from af:setPropertyListener and based on defined condition returning first or second real outcomes. First two buttons are navigating to &lt;i&gt;empls&lt;/i&gt;, third button navigates to &lt;i&gt;jobs&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-IHeL40NDFT8/TnG8DR6cMrI/AAAAAAAAFYg/B2KVHK9U1-Y/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="119" src="http://3.bp.blogspot.com/-IHeL40NDFT8/TnG8DR6cMrI/AAAAAAAAFYg/B2KVHK9U1-Y/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5255830651112933265?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5255830651112933265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5255830651112933265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5255830651112933265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5255830651112933265'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/09/programmatic-adf-task-flow-router.html' title='Programmatic ADF Task Flow Router'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-cz98aMxbkUo/TnG3jraRg4I/AAAAAAAAFYI/wqRJkOlEc6w/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-2829588461653845963</id><published>2011-09-08T21:33:00.002+02:00</published><updated>2011-09-08T21:33:51.020+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><title type='text'>Another Way to Invoke Managed Bean Method</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Typically we are calling managed bean methods through expression language in Oracle ADF. Depending on use case, it may by useful to know how to call managed bean method directly by acquiring instance of that bean.&lt;br /&gt;&lt;br /&gt;My example contains session scope bean:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-fLDIk_LdCjA/TmkWr1salEI/AAAAAAAAFX8/5n1bRG52-XY/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="103" src="http://4.bp.blogspot.com/-fLDIk_LdCjA/TmkWr1salEI/AAAAAAAAFX8/5n1bRG52-XY/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This bean implements collection of elements and contains one method to retrieve collection element by code - getElementName(String):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-rnyiQjBwVtk/TmkXjuds8lI/AAAAAAAAFYA/96pb_mfGzdQ/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://2.bp.blogspot.com/-rnyiQjBwVtk/TmkXjuds8lI/AAAAAAAAFYA/96pb_mfGzdQ/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This method accepts parameter and returns value, how we would invoke such method from another bean? There are several options, one of them is to acquire managed bean instance and call method directly - &lt;a href="http://jdevsamples.googlecode.com/files/AccessingBeanInstance.zip"&gt;AccessingBeanInstance.zip&lt;/a&gt; sample application for this post.&lt;br /&gt;&lt;br /&gt;As we can see in this example, with JSFUtils helper method bean instance is being retrieved. If its first access, bean will not be instantiated yet, so we need to create new instance. Once instance is created, we can call custom method and store same instance in session scope - so it will be reused for future requests:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-iVw6WK2t7kQ/TmkYe7xgQbI/AAAAAAAAFYE/-mxMAdpaNXg/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://4.bp.blogspot.com/-iVw6WK2t7kQ/TmkYe7xgQbI/AAAAAAAAFYE/-mxMAdpaNXg/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-2829588461653845963?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/2829588461653845963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=2829588461653845963' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2829588461653845963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2829588461653845963'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/09/another-way-to-invoke-managed-bean.html' title='Another Way to Invoke Managed Bean Method'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-fLDIk_LdCjA/TmkWr1salEI/AAAAAAAAFX8/5n1bRG52-XY/s72-c/2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-9183352003578964130</id><published>2011-09-07T08:59:00.000+02:00</published><updated>2011-09-07T08:59:26.823+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='BPM 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>ADF/WebCenter Spaces 11g/BPM Suite 11g Integration - Online Oracle University Training</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Are you interested to know how to integrate it all together - ADF, WebCenter and BPM? For 11-12 October 2011 is scheduled online training, where I will be explaining all technical details for such integration. Registration is available through &lt;a href="http://www.oracle.com/uk/education/emea-lvc-andrejus-baranovskis-456917.html?sc=WWOU11038014MPP028C003"&gt;Oracle University&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.oracle.com/uk/education/emea-lvc-andrejus-baranovskis-456917.html?sc=WWOU11038014MPP028C003" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="302" src="http://2.bp.blogspot.com/-gjyj1y2mdr4/TmcTwkrOM8I/AAAAAAAAFX4/s6EfG42CASQ/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Training agenda:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Day 1 (10:00 – 18:00 CET)&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Oracle ADF Development for BPM 11g&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This session explains in detail how to develop using Oracle ADF for BPM 11gSuite and how to implement Human Task forms following ADF development best practices. Participants will be guided with sample applications through the following topics:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ADF BC usage with Custom UI for BPM Human Task Development&amp;nbsp;&lt;/li&gt;&lt;li&gt;BPM Human Task Data Control reusability&amp;nbsp;&lt;/li&gt;&lt;li&gt;Custom ADF Task Flow based on BPM Human Task implementation&amp;nbsp;&lt;/li&gt;&lt;li&gt;ADF Rich Faces UI development for BPM Human Task&amp;nbsp;&lt;/li&gt;&lt;li&gt;Dynamic ADF UI implementation for BPM Human Tasks, based on process payload&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Day 2 (10:00 – 18:00 CET)&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;BPM 11g Integration with WebCenter Spaces 11g&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The second day is focused on deep diving into BPM 11g portal setup with WebCenter Spaces 11g. Participants will learn how to accomplish the following tasks through live demonstrations:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Extending WebCenter Spaces 11g with BPM 11g functionality&amp;nbsp;&lt;/li&gt;&lt;li&gt;Customizing BPM Process Spaces inside WebCenter Spaces 11g&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-9183352003578964130?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/9183352003578964130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=9183352003578964130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/9183352003578964130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/9183352003578964130'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/09/adfwebcenter-spaces-11gbpm-suite-11g.html' title='ADF/WebCenter Spaces 11g/BPM Suite 11g Integration - Online Oracle University Training'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-gjyj1y2mdr4/TmcTwkrOM8I/AAAAAAAAFX4/s6EfG42CASQ/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-875621197874734224</id><published>2011-09-01T21:33:00.000+02:00</published><updated>2011-09-01T21:33:44.324+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='MDS'/><title type='text'>Making It Work Together - MDS User and Seeded Customizations</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;MDS is one of the most powerful and important elements of ADF/WebCenter framework. Users can perform ADF UI personalizations on runtime through MDS, as well as developers can implement seeded MDS customizations on design time and modify ADF components for different targets. However, if you would try to enable and run both options together - MDS User and Seeded Customizations, it will not work out of the box. My today post is about how to make it work together. Before reading this post, I would highly recommend to read previous posts:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://andrejusb.blogspot.com/2011/08/further-customizing-webcenter-ps3ps4.html"&gt;Further Customizing WebCenter PS3/PS4 RSS Task Flow - RSS Items List&lt;/a&gt; (How to apply MDS Seeded Customization for standard WebCenter Task Flow)&lt;/li&gt;&lt;li&gt;&lt;a href="http://andrejusb.blogspot.com/2010/08/applying-personalization-and.html"&gt;Applying Personalization and Customization in Oracle ADF 11g and Oracle WebCenter 11g&lt;/a&gt; (How to manage UserCC and SiteCC MDS Customizations)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Sample application (&lt;a href="http://jdevsamples.googlecode.com/files/EnterprisePortalApp_v7.zip"&gt;EnterprisePortalApp_v7.zip&lt;/a&gt;) is enabled with both - MDS User and Seeded Customizations:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-koNFw17baBo/Tl_JU61wNXI/AAAAAAAAFWQ/rpUjnwl7p84/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://1.bp.blogspot.com/-koNFw17baBo/Tl_JU61wNXI/AAAAAAAAFWQ/rpUjnwl7p84/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;MDS Seeded Customizations are functional on SiteCC level, because seeded customizations should be applied on application scope. This means MDS should be configured with SiteCC class:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_g5qMgjI4wY/Tl_OGBgmo1I/AAAAAAAAFWU/cqpNICVNDPg/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://4.bp.blogspot.com/-_g5qMgjI4wY/Tl_OGBgmo1I/AAAAAAAAFWU/cqpNICVNDPg/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;All good at this point, let's login into portal application as user &lt;b&gt;redsam&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hW02wUKKzJA/Tl_OUfK2x1I/AAAAAAAAFWY/nOKQWKjC0B8/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="204" src="http://4.bp.blogspot.com/-hW02wUKKzJA/Tl_OUfK2x1I/AAAAAAAAFWY/nOKQWKjC0B8/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;MDS Seeded Customization works, we see our changes applied:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0cujWUjEULc/Tl_OzWa4xNI/AAAAAAAAFWc/XhKnbv8mNcw/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="http://1.bp.blogspot.com/-0cujWUjEULc/Tl_OzWa4xNI/AAAAAAAAFWc/XhKnbv8mNcw/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's apply user personalization now, hide few table columns - &lt;i&gt;ManagedId&lt;/i&gt;, &lt;i&gt;LocationId&lt;/i&gt;, for &lt;b&gt;redsam&lt;/b&gt; user:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-PO8d8QeTjao/Tl_Pnoj8DeI/AAAAAAAAFWg/_qqyAdPekcU/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://1.bp.blogspot.com/-PO8d8QeTjao/Tl_Pnoj8DeI/AAAAAAAAFWg/_qqyAdPekcU/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Login with different user, for example &lt;b&gt;scott&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LPb5DXp4U_U/Tl_QYcTmdsI/AAAAAAAAFWk/u2ne7qapvPM/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="202" src="http://4.bp.blogspot.com/-LPb5DXp4U_U/Tl_QYcTmdsI/AAAAAAAAFWk/u2ne7qapvPM/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We faced an issue now - MDS personalizations from user &lt;b&gt;redsam&lt;/b&gt; are visible for user &lt;b&gt;scott&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-RyEvaXf6aeM/Tl_RQRgWBQI/AAAAAAAAFWo/nTGVWfnaPG0/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://4.bp.blogspot.com/-RyEvaXf6aeM/Tl_RQRgWBQI/AAAAAAAAFWo/nTGVWfnaPG0/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This happens because MDS is configured with SiteCC class (for MDS Seeded customizations to work), so all personalizations are getting stored in application scope and are visible to every user. We can fix this by enabling our custom MDS session options factory class and programmatically merging custom UserCC and SiteCC layers (described in this blog -&amp;nbsp;&lt;a href="http://andrejusb.blogspot.com/2010/08/applying-personalization-and.html"&gt;Applying Personalization and Customization in Oracle ADF 11g and Oracle WebCenter 11g&lt;/a&gt;). Predefined&amp;nbsp;&lt;i&gt;VIEW_LAYER&lt;/i&gt; will combine both SiteCC and UserCC inside custom Session Options Factory class and allow to operate both MDS Seeded Customizations and User Personalizations without conflict:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TbVd3tRL-zE/Tl_Ttdt29NI/AAAAAAAAFWs/XH_8ObTLrmQ/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="199" src="http://3.bp.blogspot.com/-TbVd3tRL-zE/Tl_Ttdt29NI/AAAAAAAAFWs/XH_8ObTLrmQ/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Custom Session Options Factory class must be registered inside adf-config.xml, page-editor-config tag:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-jz-0hbaz0eM/Tl_T6G2BkmI/AAAAAAAAFWw/ATFS-5Xm6ok/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="http://2.bp.blogspot.com/-jz-0hbaz0eM/Tl_T6G2BkmI/AAAAAAAAFWw/ATFS-5Xm6ok/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In order for this Custom Session Options Factory to be enabled, we need to define WebCenter Composer filter inside web.xml:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7u_rI5d7rq4/Tl_UaxnC3jI/AAAAAAAAFW0/ZtU3IS1NSCk/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="82" src="http://1.bp.blogspot.com/-7u_rI5d7rq4/Tl_UaxnC3jI/AAAAAAAAFW0/ZtU3IS1NSCk/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Don't forget to define filter mapping for WebCenter Composer filter in web.xml:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-PAcr8zvaTsw/Tl_UyyvP8yI/AAAAAAAAFW4/N7IGxXSkGyQ/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="168" src="http://1.bp.blogspot.com/-PAcr8zvaTsw/Tl_UyyvP8yI/AAAAAAAAFW4/N7IGxXSkGyQ/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's perform user personalization again, after applying all the changes mentioned above - reorder &lt;i&gt;DepartmentName&lt;/i&gt; column by user &lt;b&gt;redsam&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gGz-rBkDSkM/Tl_ZabaPtJI/AAAAAAAAFXE/5LxLHiU9uuA/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="156" src="http://2.bp.blogspot.com/-gGz-rBkDSkM/Tl_ZabaPtJI/AAAAAAAAFXE/5LxLHiU9uuA/s320/14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Login as another user &lt;b&gt;scott&lt;/b&gt;, MDS Seeded Customizations are working well:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9IMIUm7x0Nk/Tl_aBScsxHI/AAAAAAAAFXI/RcKpfOpOXos/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://2.bp.blogspot.com/-9IMIUm7x0Nk/Tl_aBScsxHI/AAAAAAAAFXI/RcKpfOpOXos/s320/15.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;MDS User Personalization works now as well, personalizations from user &lt;b&gt;redsam&lt;/b&gt; are not visible anymore for user &lt;b&gt;scott&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-dS_m42lvcuM/Tl_aQ_GEskI/AAAAAAAAFXM/HQ3xr8bBKus/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="106" src="http://3.bp.blogspot.com/-dS_m42lvcuM/Tl_aQ_GEskI/AAAAAAAAFXM/HQ3xr8bBKus/s320/16.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;MDS behaves correctly now, personalizations are stored under personal MDS folder:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-eD5Bn3Wntwc/Tl_acV7aBhI/AAAAAAAAFXQ/q4PC1hniMKA/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://3.bp.blogspot.com/-eD5Bn3Wntwc/Tl_acV7aBhI/AAAAAAAAFXQ/q4PC1hniMKA/s320/17.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Okej, so it all works now. However, there is one more trick you should keep in mind, when you would apply MDS Seeded Customization next time. Custom SiteCC layer is defined with &lt;b&gt;webcenter&lt;/b&gt; value:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-EK2WhVCdd00/Tl_a1r-X-NI/AAAAAAAAFXU/auTcvF7yUiE/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="148" src="http://4.bp.blogspot.com/-EK2WhVCdd00/Tl_a1r-X-NI/AAAAAAAAFXU/auTcvF7yUiE/s320/13.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Before switching to Customization Developer mode and starting working with MDS Seeded Customization, make sure you switch temporary from SiteCC to UserCC customization class in adf-config.xml. This is needed, because we want to apply application scope customizations. Switch it back to UserCC, once seeded customization development is done:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TZVn3wh92tc/Tl_cZKgBi-I/AAAAAAAAFXY/75zFe1Cr2Is/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://3.bp.blogspot.com/-TZVn3wh92tc/Tl_cZKgBi-I/AAAAAAAAFXY/75zFe1Cr2Is/s320/18.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In Customization Developer mode:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-En1xrKJJyvY/Tl_coknqb8I/AAAAAAAAFXc/4xcRUzI4hhE/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-En1xrKJJyvY/Tl_coknqb8I/AAAAAAAAFXc/4xcRUzI4hhE/s1600/19.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Make sure customization mode is set to &lt;b&gt;webcenter&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ms9VSVHl3UU/Tl_cygtOujI/AAAAAAAAFXg/mlvVISpo-aA/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://4.bp.blogspot.com/-ms9VSVHl3UU/Tl_cygtOujI/AAAAAAAAFXg/mlvVISpo-aA/s320/20.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This will store MDS Seeded Customizations under &lt;b&gt;webcenter&lt;/b&gt; path:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-v618-ygCuQE/Tl_c_BDb3cI/AAAAAAAAFXk/nImuVX0Qseg/s1600/21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://4.bp.blogspot.com/-v618-ygCuQE/Tl_c_BDb3cI/AAAAAAAAFXk/nImuVX0Qseg/s320/21.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Same &lt;b&gt;webcenter&lt;/b&gt; name is defined for custom SiteCC layer:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6Klsh1NwKVI/Tl_dJGALA5I/AAAAAAAAFXo/ri2ezQFf9Ig/s1600/22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/-6Klsh1NwKVI/Tl_dJGALA5I/AAAAAAAAFXo/ri2ezQFf9Ig/s320/22.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once back to normal mode, don't forget to switch back to UserCC - this will ensure proper user personalization functionality:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-nsDidB6NAic/Tl_dYUgOeTI/AAAAAAAAFXs/wHkPkuKMVos/s1600/23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="http://3.bp.blogspot.com/-nsDidB6NAic/Tl_dYUgOeTI/AAAAAAAAFXs/wHkPkuKMVos/s320/23.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-875621197874734224?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/875621197874734224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=875621197874734224' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/875621197874734224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/875621197874734224'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/09/making-it-work-together-mds-user-and.html' title='Making It Work Together - MDS User and Seeded Customizations'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-koNFw17baBo/Tl_JU61wNXI/AAAAAAAAFWQ/rpUjnwl7p84/s72-c/1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-418380963725648681</id><published>2011-08-30T19:43:00.003+02:00</published><updated>2011-08-30T19:54:31.039+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle OpenWorld'/><title type='text'>Oracle Open World 2011 Sessions and Activities</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This year even more busy OOW'11 is approaching for me - abstracts are accepted for 3 Oracle Develop sessions and will be presenting on:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Texas A&amp;amp;M University System Architecture: Oracle ADF, Oracle WebCenter Portal and Content&lt;/b&gt; (&lt;b&gt;ID:&lt;/b&gt;&amp;nbsp;&lt;b&gt;2923&lt;/b&gt;) &amp;nbsp;&lt;i&gt;Texas A&amp;amp;M University System and Red Samurai Consulting technical session about Oracle ADF, WebCenter and UCM integration into one production system. My colleague from Texas A&amp;amp;M University System will explain and demo production Oracle Fusion system.&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Oracle Business Intelligence/Oracle ADF Integration Using the Action Framework&lt;/b&gt; (&lt;b&gt;ID:&amp;nbsp;4862&lt;/b&gt;) &lt;i&gt;Joined session with Mark Rittman, from Rittman Mead Consulting. We will explain how Oracle BI integrates with Oracle Fusion and ADF technologies&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Oracle ADF Enterprise Methodology Group: A+-Quality Oracle ADF Code&lt;/b&gt; (&lt;b&gt;ID:&lt;/b&gt;&amp;nbsp;&lt;b&gt;32481&lt;/b&gt;) &lt;i&gt;ADF Community is growing and getting stronger with every year, time to talk about ADF Code Quality and not only about Quantity :)&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-uh_c69T06cY/Tl0Y54-BvhI/AAAAAAAAFWM/06EqYBC5ON0/s1600/oow_sessions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="107" src="http://3.bp.blogspot.com/-uh_c69T06cY/Tl0Y54-BvhI/AAAAAAAAFWM/06EqYBC5ON0/s320/oow_sessions.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Will be attending Oracle ACE Directors briefing and Oracle WebCenter Partner Advisory Board in Redwood Shores right before OOW.&lt;br /&gt;&lt;br /&gt;I'm looking forward to catch up with all friends and colleagues, see you soon in San Francisco !&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-418380963725648681?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/418380963725648681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=418380963725648681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/418380963725648681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/418380963725648681'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/08/oracle-open-world-2011-sessions-and.html' title='Oracle Open World 2011 Sessions and Activities'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-uh_c69T06cY/Tl0Y54-BvhI/AAAAAAAAFWM/06EqYBC5ON0/s72-c/oow_sessions.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-8357552094602280769</id><published>2011-08-28T14:16:00.000+02:00</published><updated>2011-08-28T14:16:55.699+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Difference Between Fetched Row Count and Just Row Count</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;While implementing various validation rules in ADF BC, we can call two methods to get number of rows for specific entity - &lt;i&gt;getFetchedRowCount()&lt;/i&gt; and &lt;i&gt;getRowCount()&lt;/i&gt;. What's the difference between these two and what you should keep in mind? In case if Master-Detail screen is separated into two pages or two fragments - detail entity will be populated and data will be fetched only after this entity will be directly accessed. This means that &lt;i&gt;getFetchedRowCount()&lt;/i&gt; returns count for rows already loaded into memory. In contrary, &lt;i&gt;getRowCount()&lt;/i&gt; loads rows into memory (if there are no rows loaded) and then returns row count. Both of these methods are good and useful in specific use cases. ADF developer should understand the difference to avoid unexpected behavior.&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/ADFMasterDetailImpl.zip"&gt;ADFMasterDetailImpl.zip&lt;/a&gt;. This example implements simple Master-Detail relationship between Departments and Employees:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fqC-HTCqAL0/TlormxIEknI/AAAAAAAAFVw/ix6LVzNL7rI/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://3.bp.blogspot.com/-fqC-HTCqAL0/TlormxIEknI/AAAAAAAAFVw/ix6LVzNL7rI/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Master-Detail splits into two parts on UI as well, one page for Departments and another for Employees:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5LQ3jRsTNH4/Tlor7gAEjBI/AAAAAAAAFV0/izRRnpRfSw8/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="http://4.bp.blogspot.com/-5LQ3jRsTNH4/Tlor7gAEjBI/AAAAAAAAFV0/izRRnpRfSw8/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;During our experiment, we will load only Master page with Departments data and invoke &lt;i&gt;remove()&lt;/i&gt; operation. Inside &lt;i&gt;remove()&lt;/i&gt; operation, we can implement validation rule to check if any child record exist for current Master record we are deleting. Let's say we are using &lt;i&gt;getFetchedRowCount()&lt;/i&gt; method for this:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-YPztnTqVlw0/TlostPepLbI/AAAAAAAAFV4/lwlG3SW9JUY/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="139" src="http://2.bp.blogspot.com/-YPztnTqVlw0/TlostPepLbI/AAAAAAAAFV4/lwlG3SW9JUY/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Keep in mind, Detail screen is not opened yet - only Master screen records are loaded into memory. Invoke &lt;i&gt;remove()&lt;/i&gt; operation by clicking Delete button:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-yqWCqJ554EY/Tlos-imIimI/AAAAAAAAFV8/suBZ1KCAxZk/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="165" src="http://2.bp.blogspot.com/-yqWCqJ554EY/Tlos-imIimI/AAAAAAAAFV8/suBZ1KCAxZk/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There are no records fetched yet for detail, so it looks like there are no Detail records fro current Master:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-sBhWpe-2lL4/TlotL76BhRI/AAAAAAAAFWA/43FLXiiONPg/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-sBhWpe-2lL4/TlotL76BhRI/AAAAAAAAFWA/43FLXiiONPg/s1600/5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now we execute &lt;i&gt;getRowCount()&lt;/i&gt;, this method will return real count - not from memory:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-jSwd2_mj4LQ/TlowqQBmiBI/AAAAAAAAFWE/EOVRiBKH1Rw/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://4.bp.blogspot.com/-jSwd2_mj4LQ/TlowqQBmiBI/AAAAAAAAFWE/EOVRiBKH1Rw/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;After &lt;i&gt;getRowCount()&lt;/i&gt;, again is executed &lt;i&gt;getFetchedRowCount()&lt;/i&gt; method.&lt;br /&gt;&lt;br /&gt;We have learned - first there are no records loaded, we are executing &lt;i&gt;getRowCount()&lt;/i&gt; it populates records into memory. After that, getFetchedRowCount() returns correct number of rows as well:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-HGTIkzMlbJM/Tloxr4LcWvI/AAAAAAAAFWI/aWhrK5BN7o0/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-HGTIkzMlbJM/Tloxr4LcWvI/AAAAAAAAFWI/aWhrK5BN7o0/s1600/7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Hopefully this helps to understand better specific difference between two methods for row count.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-8357552094602280769?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/8357552094602280769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=8357552094602280769' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/8357552094602280769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/8357552094602280769'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/08/difference-between-fetched-row-count.html' title='Difference Between Fetched Row Count and Just Row Count'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-fqC-HTCqAL0/TlormxIEknI/AAAAAAAAFVw/ix6LVzNL7rI/s72-c/1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-7132285243521584520</id><published>2011-08-26T19:34:00.001+02:00</published><updated>2011-08-26T19:37:32.934+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle OpenWorld'/><title type='text'>ADF Enterprise Methodology Group (EMG) Sunday during OOW</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;The ADF Enterprise Methodology Group (EMG) presents a complete day of ADF developer topics on Sunday October 2nd. Action will take place - (Moscone West - room 2000). See you there !&lt;br /&gt;&lt;br /&gt;Agenda:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #555555; font-family: Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;"&gt;- 09:00 - Sten E. Vesterli&lt;br /&gt;&amp;nbsp; Session&amp;nbsp;&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=32460" style="color: black;"&gt;32460&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;b&gt;Starting an Enterprise Oracle ADF Project&lt;/b&gt;&lt;br /&gt;- 10:15 - Frank Nimphius &amp;amp; Maiko Rocha&lt;br /&gt;&amp;nbsp;&amp;nbsp; Session&amp;nbsp;&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=32480" style="color: black;"&gt;32480&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;b&gt;Learn Oracle ADF Task Flows in Only 60 Minutes&lt;/b&gt;&lt;br /&gt;- 11:30 - Andrejus Baranovskis&lt;br /&gt;&amp;nbsp;&amp;nbsp; Session&amp;nbsp;&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=32481" style="color: black;"&gt;32481&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;b&gt;A+-Quality Oracle ADF Code&lt;/b&gt;&lt;br /&gt;- 12:45 - Wilfred van der Deijl&lt;br /&gt;&amp;nbsp;&amp;nbsp; Session&amp;nbsp;&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=32500" style="color: black;"&gt;32500&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;b&gt;Transitioning from Oracle Forms to Oracle ADF&lt;/b&gt;&lt;br /&gt;- 14:00 - Steven Davelaar&lt;br /&gt;&amp;nbsp;&amp;nbsp; Session&amp;nbsp;&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=32501" style="color: black;"&gt;32501&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;b&gt;Empower Multitasking with an Oracle ADF UI Powerhouse&lt;/b&gt;&lt;br /&gt;- 15:15 - Lucas Jellema&lt;br /&gt;&amp;nbsp;&amp;nbsp; Session&amp;nbsp;&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=32502" style="color: black;"&gt;32502&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;b&gt;Gold Nuggets in Oracle ADF Faces&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-7132285243521584520?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/7132285243521584520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=7132285243521584520' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7132285243521584520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7132285243521584520'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/08/adf-enterprise-methodology-group-emg.html' title='ADF Enterprise Methodology Group (EMG) Sunday during OOW'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-3836938075964920594</id><published>2011-08-24T20:48:00.000+02:00</published><updated>2011-08-24T20:48:03.994+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><title type='text'>Proactively Controlling ADF Query Execution with Estimated Row Count</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;In ADF BC we can configure how many rows VO should return, however in the background it still will execute entire SQL statement without attaching rownum &amp;lt; X to it. We can prevent this by overriding &lt;i&gt;executeQueryForCollection&lt;/i&gt; method and checking estimated row count, before invoking actual SQL statement:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-uy-1RTboSN4/TlU9ZDsRWhI/AAAAAAAAFVU/X8VUh4M2glY/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://4.bp.blogspot.com/-uy-1RTboSN4/TlU9ZDsRWhI/AAAAAAAAFVU/X8VUh4M2glY/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As you can see, if estimated row count is higher than expected limit - we are throwing our custom JboException. This exception is handled in overriden DCErrorHandler class and reported nicely to the user:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wG46froOhaI/TlU-Pf1W1KI/AAAAAAAAFVY/9pZ15GOdQIc/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="175" src="http://2.bp.blogspot.com/-wG46froOhaI/TlU-Pf1W1KI/AAAAAAAAFVY/9pZ15GOdQIc/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You can declare your custom DCErrorHandler class through DataBindings:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wZmYvYo_48I/TlU-ifzaREI/AAAAAAAAFVc/tfalaMeyKV8/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="168" src="http://3.bp.blogspot.com/-wZmYvYo_48I/TlU-ifzaREI/AAAAAAAAFVc/tfalaMeyKV8/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;VO contains View Criteria, where we are checking for Salary attribute to be &amp;gt; X. Criteria attributes are set to be selectively required as well, to prevent blank searches:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-k6m_0xs_w9I/TlU-4EkZCiI/AAAAAAAAFVg/6bjPFV6AyS4/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://4.bp.blogspot.com/-k6m_0xs_w9I/TlU-4EkZCiI/AAAAAAAAFVg/6bjPFV6AyS4/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Blank searches will be restricted:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ozF6XnMe_x4/TlVFWL6DJPI/AAAAAAAAFVk/Xd5D5CTOgAc/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://2.bp.blogspot.com/-ozF6XnMe_x4/TlVFWL6DJPI/AAAAAAAAFVk/Xd5D5CTOgAc/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If user enters such criteria, which will bring result set exceeding predefined limit, application will terminate SQL execution and show warning message to the user:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-YMeAJqfbpMY/TlVGQPk2xmI/AAAAAAAAFVo/-xhZ66PDYkc/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://3.bp.blogspot.com/-YMeAJqfbpMY/TlVGQPk2xmI/AAAAAAAAFVo/-xhZ66PDYkc/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In case if search criteria brings less results than predefined limit, SQL is completed successfully:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-sXv4ERhmw9k/TlVGvHh_WVI/AAAAAAAAFVs/5SPu6n7OFpM/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://1.bp.blogspot.com/-sXv4ERhmw9k/TlVGvHh_WVI/AAAAAAAAFVs/5SPu6n7OFpM/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/ADFProactiveQueryPerformance.zip"&gt;ADFProactiveQueryPerformance.zip&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-3836938075964920594?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/3836938075964920594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=3836938075964920594' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3836938075964920594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3836938075964920594'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/08/proactively-controlling-adf-query.html' title='Proactively Controlling ADF Query Execution with Estimated Row Count'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-uy-1RTboSN4/TlU9ZDsRWhI/AAAAAAAAFVU/X8VUh4M2glY/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-1562307789322108654</id><published>2011-08-14T12:35:00.001+02:00</published><updated>2011-08-14T12:50:43.177+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='MDS'/><title type='text'>Further Customizing WebCenter PS3/PS4 RSS Task Flow - RSS Items List</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I have received request from blog reader, based on my previous blog post - &lt;a href="http://andrejusb.blogspot.com/2011/05/extending-webcenter-11g-ps3ps4-adf-task.html"&gt;Extending WebCenter 11g PS3/PS4 ADF Task Flows - RSS Example&lt;/a&gt;. Standard WebCenter PS3/PS4 RSS task flow is missing one very important property - number of RSS items to be rendered in the list. Request was about how to add such property and extend existing RSS task flow.&lt;br /&gt;&lt;br /&gt;Download sample application, it extends WebCenter RSS task flow through seeded MDS customizations and provides ability to specify number of RSS items to be rendered - &lt;a href="http://jdevsamples.googlecode.com/files/EnterprisePortalApp_v6.zip"&gt;EnterprisePortalApp_v6.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There is no option to add new RSS task flow parameter with seeded MDS customization, so we should follow different approach. What we can do is to append RSS feed URL with number of RSS items we want to render. I will describe below, how to customize standard WebCenter RSS task flow, in order to be able to append this property to RSS feed URL. For example, if we want to render 3 items, we will append &lt;b&gt;?rss=3&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-pyrJko82y6M/Tkef0LGe6SI/AAAAAAAAFUI/XTL9Bc3-kes/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" src="http://1.bp.blogspot.com/-pyrJko82y6M/Tkef0LGe6SI/AAAAAAAAFUI/XTL9Bc3-kes/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For 7 items, append &lt;b&gt;?rss=7&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tGOO9aT3_7w/Tkef9oTwndI/AAAAAAAAFUM/lsar32oimRU/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-tGOO9aT3_7w/Tkef9oTwndI/AAAAAAAAFUM/lsar32oimRU/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For 10 items, append &lt;b&gt;?rss=10&lt;/b&gt; and so on:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-V30exYNHMOA/TkegHtJa2AI/AAAAAAAAFUQ/fZ0phOxXYtQ/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="290" src="http://4.bp.blogspot.com/-V30exYNHMOA/TkegHtJa2AI/AAAAAAAAFUQ/fZ0phOxXYtQ/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Two RSS feeds are rendered, using extended WebCenter RSS task flow, different number of RSS items (3 and 7 as it was defined above):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-z8wSaY4__O4/Tkegkn6rqrI/AAAAAAAAFUU/oH14TfRrxZ8/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="186" src="http://4.bp.blogspot.com/-z8wSaY4__O4/Tkegkn6rqrI/AAAAAAAAFUU/oH14TfRrxZ8/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Another RSS view, with 10 items as defined above:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--dwf2pcem_s/TkegwHxr-SI/AAAAAAAAFUY/XPdwjG74M1U/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="254" src="http://2.bp.blogspot.com/--dwf2pcem_s/TkegwHxr-SI/AAAAAAAAFUY/XPdwjG74M1U/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;How we can extend WebCenter RSS task flow? For basic steps and JDeveloper configuration, follow this &lt;a href="http://andrejusb.blogspot.com/2011/05/extending-webcenter-11g-ps3ps4-adf-task.html"&gt;blog&lt;/a&gt;. Once you understand basic steps, we can move forward. Let's define managed bean in request scope, it will act as RSS helper bean and will be used to parse RSS feed URL:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-tlPumSYvPdY/TkehQeMsQNI/AAAAAAAAFUc/0IoCzhz9AGU/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="102" src="http://3.bp.blogspot.com/-tlPumSYvPdY/TkehQeMsQNI/AAAAAAAAFUc/0IoCzhz9AGU/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This bean defines two methods. &lt;b&gt;&lt;i&gt;GetRSSFeedLocation()&lt;/i&gt;&lt;/b&gt; method is to parse RSS feed URL and remove all custom parameters - otherwise original WebCenter RSS task flow functionality will not work. &lt;b&gt;&lt;i&gt;GetRSSItemsNum()&lt;/i&gt;&lt;/b&gt; method is to retrieve number of RSS items to be shown:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Irf3qgpoVHI/TkeiH-ixQYI/AAAAAAAAFUg/TQWrZoA-hkU/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-Irf3qgpoVHI/TkeiH-ixQYI/AAAAAAAAFUg/TQWrZoA-hkU/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once we have our custom methods in place, as per previous blog post - ensure that seeded MDS customizations are enabled:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-YpQBP-cSKCI/TkeiVeipLTI/AAAAAAAAFUk/tuSM_kAh7k8/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="227" src="http://4.bp.blogspot.com/-YpQBP-cSKCI/TkeiVeipLTI/AAAAAAAAFUk/tuSM_kAh7k8/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Switch to Customization Developer mode, we will modify WebCenter RSS library:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0fBPtOdgzQw/Tkeick7werI/AAAAAAAAFUo/7e7zqpmrogA/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://2.bp.blogspot.com/-0fBPtOdgzQw/Tkeick7werI/AAAAAAAAFUo/7e7zqpmrogA/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Make sure &lt;b&gt;site&lt;/b&gt; level customization context is enabled:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-UQE5t8GiZ38/TkeimGa8RuI/AAAAAAAAFUs/2UaUUr56ucE/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="142" src="http://2.bp.blogspot.com/-UQE5t8GiZ38/TkeimGa8RuI/AAAAAAAAFUs/2UaUUr56ucE/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;First customization we should apply is for RSS link:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lh-g2pVU9oE/TkeixQraZAI/AAAAAAAAFUw/ngBwFiz3f04/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="271" src="http://4.bp.blogspot.com/-lh-g2pVU9oE/TkeixQraZAI/AAAAAAAAFUw/ngBwFiz3f04/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Make sure that RSS destination is set to point to RSS feed location retrieved from our RSS helper bean:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-aimoBfrZNO8/Tkei_8tx9AI/AAAAAAAAFU0/EWrwLre_kiM/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://2.bp.blogspot.com/-aimoBfrZNO8/Tkei_8tx9AI/AAAAAAAAFU0/EWrwLre_kiM/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In order to control how many items we want to show in RSS list, we should change original RSS task flow implementation and switch af:table component with af:iterator:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2FbeFuvvj8E/TkejTo8FbyI/AAAAAAAAFU4/sHw-Y1hWJ3w/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="251" src="http://2.bp.blogspot.com/-2FbeFuvvj8E/TkejTo8FbyI/AAAAAAAAFU4/sHw-Y1hWJ3w/s320/13.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Make sure that Rows property for af:iterator point to our RSS helper bean method - it will parse RSS feed URL added parameters and return how many RSS items should be shown:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-f-gB1m43ggM/Tkejp_w3K-I/AAAAAAAAFU8/bj1YLe2X8gI/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://1.bp.blogspot.com/-f-gB1m43ggM/Tkejp_w3K-I/AAAAAAAAFU8/bj1YLe2X8gI/s320/14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Page definition for RSS viewer, contains method which constructs RSS items list. RSS feed location URL must be changed here as well to point to custom RSS helper bean:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2Iq9yc0MHmg/TkekJd1a_8I/AAAAAAAAFVA/akmrWnMM1A4/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://3.bp.blogspot.com/-2Iq9yc0MHmg/TkekJd1a_8I/AAAAAAAAFVA/akmrWnMM1A4/s320/15.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In order to review applied customizations, you can go to ADF Library Customization package and expand it:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qsytGwbUE3s/TkekZ0ntFwI/AAAAAAAAFVE/j8Wo3509iSQ/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="157" src="http://2.bp.blogspot.com/-qsytGwbUE3s/TkekZ0ntFwI/AAAAAAAAFVE/j8Wo3509iSQ/s320/16.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You will see applied customization for page definition file of RSS viewer, RSS list construction method:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QL4QyN0XlC4/TkekqLWz7UI/AAAAAAAAFVI/nj9qbOQGmeI/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" src="http://2.bp.blogspot.com/-QL4QyN0XlC4/TkekqLWz7UI/AAAAAAAAFVI/nj9qbOQGmeI/s320/17.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;RSS viewer UI customizations are stored in MDS as well - table switch with iterator:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tyQeO8sy8h8/Tkek1WS3_DI/AAAAAAAAFVM/OOClt0wZ_CY/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://4.bp.blogspot.com/-tyQeO8sy8h8/Tkek1WS3_DI/AAAAAAAAFVM/OOClt0wZ_CY/s320/18.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;RSS link customization, to retrieve RSS feed URL from custom RSS helper bean:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-5RYLUupbmmQ/Tkek_7dkO4I/AAAAAAAAFVQ/Ty60z5b3I9E/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://1.bp.blogspot.com/-5RYLUupbmmQ/Tkek_7dkO4I/AAAAAAAAFVQ/Ty60z5b3I9E/s320/19.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-1562307789322108654?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/1562307789322108654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=1562307789322108654' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/1562307789322108654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/1562307789322108654'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/08/further-customizing-webcenter-ps3ps4.html' title='Further Customizing WebCenter PS3/PS4 RSS Task Flow - RSS Items List'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-pyrJko82y6M/Tkef0LGe6SI/AAAAAAAAFUI/XTL9Bc3-kes/s72-c/1.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-1787350653905863711</id><published>2011-08-10T20:39:00.000+02:00</published><updated>2011-08-10T20:39:40.960+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><title type='text'>How to Control Long SQL Execution Time in ADF BC with VO Timeout</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Who likes, when ADF screen hangs on long running SQL query? I guess no one, so today I will describe how to take control on long running SQL queries and bring ADF screen back to life. ADF BC allows to set VO query execution timeout, we can apply this approach to limit SQL query execution time and make it predictable.&lt;br /&gt;&lt;br /&gt;We need to simulate long running query, for this purpose I have created PL/SQL function with conditionally infinite loop. Based on function parameter, if parameter value is greater than 0, loop is terminated. &lt;b&gt;This function is simulating both cases - long and fast running queries&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hXosyXwGzG8/TkLB0McWcNI/AAAAAAAAFTI/ae9Lv8nnP_Q/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://4.bp.blogspot.com/-hXosyXwGzG8/TkLB0McWcNI/AAAAAAAAFTI/ae9Lv8nnP_Q/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;PL/SQL function code, you can find it inside sample application, Model project.&amp;nbsp;In order to run sample application (&lt;a href="http://jdevsamples.googlecode.com/files/ADFSQLTimeoutSample.zip"&gt;ADFSQLTimeoutSample.zip&lt;/a&gt;) you can compile given PL/SQL function inside HR schema:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-LPouAmuJ8pQ/TkLF3wK4OsI/AAAAAAAAFTM/KDaRqAg6S9Y/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://2.bp.blogspot.com/-LPouAmuJ8pQ/TkLF3wK4OsI/AAAAAAAAFTM/KDaRqAg6S9Y/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We can define new transient attribute on VO level to invoke PL/SQL function (Query Expression) with infinite loop and slow down entire VO query:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-v2qTKljk51g/TkLGinXdyzI/AAAAAAAAFTQ/LUJ-8U9nhZg/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-v2qTKljk51g/TkLGinXdyzI/AAAAAAAAFTQ/LUJ-8U9nhZg/s320/3.png" width="277" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;VO query statement to be executed:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-_SAq0CvlsZ0/TkLGrFxUklI/AAAAAAAAFTU/ELGFHzEMRSs/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="227" src="http://3.bp.blogspot.com/-_SAq0CvlsZ0/TkLGrFxUklI/AAAAAAAAFTU/ELGFHzEMRSs/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;PL/SQL function accepts input parameter, this parameter is initialized from View Criteria bind variable, but for default VO query execution we need to make it to be required - so SQL query will not fail, when running with empty bind variable:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-OiiRLAUVTso/TkLIdb4LOPI/AAAAAAAAFTY/UK_Wb583q5w/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="202" src="http://1.bp.blogspot.com/-OiiRLAUVTso/TkLIdb4LOPI/AAAAAAAAFTY/UK_Wb583q5w/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Because bind variable is marked as Required, it will appear in the UI, so let's set Display Hint = Hide:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7WvKF5HrEkg/TkLKtIl3N2I/AAAAAAAAFTc/4y3aW6gUluw/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="http://1.bp.blogspot.com/-7WvKF5HrEkg/TkLKtIl3N2I/AAAAAAAAFTc/4y3aW6gUluw/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We have View Criteria, it will be used to execute search operation and assign bind variable value (Salary):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-oOiilPx94K4/TkLK4jtNm7I/AAAAAAAAFTg/Jo8UDak3t-g/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="251" src="http://2.bp.blogspot.com/-oOiilPx94K4/TkLK4jtNm7I/AAAAAAAAFTg/Jo8UDak3t-g/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Thats almost it about VO, AM contains one custom method, this method will be used to set VO query execution timeout limit:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fKldPwwwcSU/TkLLFxmMnuI/AAAAAAAAFTk/lOCGbd4wUW8/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://3.bp.blogspot.com/-fKldPwwwcSU/TkLLFxmMnuI/AAAAAAAAFTk/lOCGbd4wUW8/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;VO query timeout execution limit is set for VO instance, by calling &lt;b&gt;setQueryTimeOut(milliseconds)&lt;/b&gt; method:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-XgVrESPoPK0/TkLLbyeCB_I/AAAAAAAAFTo/Aww_cZ5aMms/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="292" src="http://1.bp.blogspot.com/-XgVrESPoPK0/TkLLbyeCB_I/AAAAAAAAFTo/Aww_cZ5aMms/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It is important to catch SQL exception inside executeQueryForCollection method, defined inside VO implementation class. If we don't catch exception inside this method, once timeout will happen - UI will be broken. Exception will be handled by code and reported by JboException that will be rendered in UI:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fO-90hiIJP4/TkLL8vBCrNI/AAAAAAAAFTs/WnKlcuFN-8o/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://3.bp.blogspot.com/-fO-90hiIJP4/TkLL8vBCrNI/AAAAAAAAFTs/WnKlcuFN-8o/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On controller layer, bounded ADF task flow should invoke default Method Call, it will set query timeout for certain VO instance (as described above):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-GC1kRNxTs-Y/TkLMknTfsjI/AAAAAAAAFTw/s2Ac5YG0AHo/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="http://3.bp.blogspot.com/-GC1kRNxTs-Y/TkLMknTfsjI/AAAAAAAAFTw/s2Ac5YG0AHo/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Sample application is set with maximum VO query execution time to be 6 seconds (6000 milliseconds = 6 seconds * 1000). This means, if query will be running longer than 6 seconds, it will be terminated and control will return back to the user.&lt;br /&gt;&lt;br /&gt;Here I'm doing a test now, search is done without specifying value for bind variable (Salary), this means PL/SQL procedure will enter infinite loop. However, because query execution timeout is defined for 6 seconds, it will stop and inform user about terminated long running query:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-NJ4nIPm6tWk/TkLO4ycuX_I/AAAAAAAAFT0/4Msn69koBlM/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="122" src="http://1.bp.blogspot.com/-NJ4nIPm6tWk/TkLO4ycuX_I/AAAAAAAAFT0/4Msn69koBlM/s320/13.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Provide value for Salary field, we will not enter into infinite loop and results will be returned:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-nnaUO7lbyVQ/TkLPRbcg2kI/AAAAAAAAFT4/vTzH7I5Qt18/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="http://1.bp.blogspot.com/-nnaUO7lbyVQ/TkLPRbcg2kI/AAAAAAAAFT4/vTzH7I5Qt18/s320/14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;With results rendered, lets try again to execute infinite loop. Again long running query will be terminated nicely:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-6m5AVC8pQy4/TkLPeVxN-RI/AAAAAAAAFT8/J812ZIdKEeU/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="http://1.bp.blogspot.com/-6m5AVC8pQy4/TkLPeVxN-RI/AAAAAAAAFT8/J812ZIdKEeU/s320/15.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's do a search again, including Salary value - results are returned:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9d39pGOc9is/TkLPy0mx3KI/AAAAAAAAFUA/bRMZ_EsILLk/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="http://1.bp.blogspot.com/-9d39pGOc9is/TkLPy0mx3KI/AAAAAAAAFUA/bRMZ_EsILLk/s320/16.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If we would not use query timeout, it would run forever (or at least as long, as it needs to run) and consume all server resources:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Nta7GDH3JvQ/TkLQJhVf2wI/AAAAAAAAFUE/0o4Lah4wQ8U/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="127" src="http://4.bp.blogspot.com/-Nta7GDH3JvQ/TkLQJhVf2wI/AAAAAAAAFUE/0o4Lah4wQ8U/s320/17.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-1787350653905863711?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/1787350653905863711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=1787350653905863711' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/1787350653905863711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/1787350653905863711'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/08/how-to-control-long-sql-execution-time.html' title='How to Control Long SQL Execution Time in ADF BC with VO Timeout'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-hXosyXwGzG8/TkLB0McWcNI/AAAAAAAAFTI/ae9Lv8nnP_Q/s72-c/1.png' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-8985016773017207640</id><published>2011-08-08T17:17:00.003+02:00</published><updated>2011-08-08T18:44:02.834+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Solving WCUserProfile Class Loader Error for WebCenter PS3/PS4 ADF Applications</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;While helping to migrate several WebCenter applications to WebCenter PS3/PS4, several times I saw same issue related to WebCenter User Profile - WebLogic Class Loader was failing to load WCUserProfile class. Symptoms: when opening any WebCenter task flow with embedded User Profile functionality, it throws &lt;i&gt;loader constraint violation: loader (instance of weblogic/utils/classloaders/GenericClassLoader) previously initiated loading for a different type with name "oracle/webcenter/peopleconnections/ profile/WCUserProfile"&lt;/i&gt; error:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-zNqs0aPruns/Tj_8PuZpo2I/AAAAAAAAFS4/HFGxaAyF0C8/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="207" src="http://3.bp.blogspot.com/-zNqs0aPruns/Tj_8PuZpo2I/AAAAAAAAFS4/HFGxaAyF0C8/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In both cases, when I looked through weblogic.xml configuration file available in WEB-INF folder, I found that "Prefer loading classes from WEB-INF" setting was set:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-X3f4thm1Q-w/Tj_9WspWu3I/AAAAAAAAFS8/P1jaZxAn6c0/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://3.bp.blogspot.com/-X3f4thm1Q-w/Tj_9WspWu3I/AAAAAAAAFS8/P1jaZxAn6c0/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is not default setting for WebCenter applications, developers usually are setting it&amp;nbsp;themselves for class loading optimization purposes. It prefers to load local WEB-INF classes, instead of global WebLogic domain&amp;nbsp;registered&amp;nbsp;classes. While this setting works well with pure J2EE applications, its mixing WebCenter classes and prevents correct class loading. You should be careful, when changing weblogic.xml settings.&lt;br /&gt;&lt;br /&gt;Make it default:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QJrRtyt2pf8/Tj_9c4TivbI/AAAAAAAAFTA/viNgy67YJPs/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="163" src="http://4.bp.blogspot.com/-QJrRtyt2pf8/Tj_9c4TivbI/AAAAAAAAFTA/viNgy67YJPs/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;With "Prefer loading classes from WEB-INF" = false, WCUserProfile class is loaded correctly, profile information is returned successfully:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-pc1I-8NVkvw/Tj_9u4yiqAI/AAAAAAAAFTE/4PXkjRViZAA/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="http://2.bp.blogspot.com/-pc1I-8NVkvw/Tj_9u4yiqAI/AAAAAAAAFTE/4PXkjRViZAA/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you want to test WCUserProfile class load error with WEB-INF classes = true, download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/WebCenterUserProfileApp_v2.zip"&gt;WebCenterUserProfileApp_v2.zip&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-8985016773017207640?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/8985016773017207640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=8985016773017207640' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/8985016773017207640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/8985016773017207640'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/08/solving-wcuserprofile-class-loader.html' title='Solving WCUserProfile Class Loader Error for WebCenter PS3/PS4 ADF Applications'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-zNqs0aPruns/Tj_8PuZpo2I/AAAAAAAAFS4/HFGxaAyF0C8/s72-c/1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-1114884791663531587</id><published>2011-08-04T23:01:00.000+02:00</published><updated>2011-08-04T23:01:23.874+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><title type='text'>ADF Dialog Framework and ADF Task Flow Re-Initialization</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This post is targeted for ADF beginners, I was discussing today in the office with developers who are just starting with ADF. Its always interesting to see new developers perspective, how they understand framework and what questions they ask. One of the questions I got was about how to reset shuttle component rendered inside ADF dialog framework. By default, ADF task flow rendered inside dialog framework is set to share Data Controls with calling ADF task flow - this preserves&amp;nbsp;statefull&amp;nbsp;state and keeps selected shuttle values. The question was - how we can re-initialize ADF task flow, each time when dialog windows is being opened. We should set ADF task flow rendered inside dialog to be &lt;b&gt;isolated&lt;/b&gt; and not to share Data Control with calling task flow - this will force re-initialization of the dialog. We also should explain to new developers to be careful and not to overuse this setting, because it can break transactional logic, use more application module connections than expected, etc. General rule - use &lt;b&gt;isolated&lt;/b&gt; scope, when you really need to use it and it doesn't conflict with application logic.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/ShuttleAccessApp_v2.zip"&gt;ShuttleAccessApp_v2.zip&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This sample contains landing ADF task flow, implemented as ADF region with fragment. It calls ADF dialog framework to render ADF task flow with pages:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-gub-457HiNg/TjsGU15sffI/AAAAAAAAFSg/bNO5ypK4ikQ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="192" src="http://1.bp.blogspot.com/-gub-457HiNg/TjsGU15sffI/AAAAAAAAFSg/bNO5ypK4ikQ/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dialog page is opened, shuttle component is rendered - user selects several items:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-peCvlV037GE/TjsGfSU7KDI/AAAAAAAAFSk/9Ja73m0dF9g/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" src="http://2.bp.blogspot.com/-peCvlV037GE/TjsGfSU7KDI/AAAAAAAAFSk/9Ja73m0dF9g/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now if we close and then reopen same dialog, shuttle component will keep previously selected values. Depending on use case, may be its what you need, but sometimes you would need just the opposite - each time dialog is opened, it should be re-initialized.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Open ADF task flow, which implements dialog element:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-t93RKPBGqls/TjsH6T4S9AI/AAAAAAAAFSo/zWJ-cK9GA4w/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://3.bp.blogspot.com/-t93RKPBGqls/TjsH6T4S9AI/AAAAAAAAFSo/zWJ-cK9GA4w/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Go to Behavior section, Transaction group and uncheck "Share data controls with calling task flow" - this will make ADF task flow to run in isolated mode:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SL2xwHef7EI/TjsINJdv5vI/AAAAAAAAFSs/CylhlQc4hVc/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="129" src="http://1.bp.blogspot.com/-SL2xwHef7EI/TjsINJdv5vI/AAAAAAAAFSs/CylhlQc4hVc/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Run application again, select values from shuttle component:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_L2r-aTS0LU/TjsIUVCMLSI/AAAAAAAAFSw/_iPMXywNw3M/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://1.bp.blogspot.com/-_L2r-aTS0LU/TjsIUVCMLSI/AAAAAAAAFSw/_iPMXywNw3M/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Close/open dialog window - shuttle will be re-initialized:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-MKRKhBQCa9A/TjsIdLFEeNI/AAAAAAAAFS0/1II9OlPRWrM/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="http://4.bp.blogspot.com/-MKRKhBQCa9A/TjsIdLFEeNI/AAAAAAAAFS0/1II9OlPRWrM/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-1114884791663531587?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/1114884791663531587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=1114884791663531587' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/1114884791663531587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/1114884791663531587'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/08/adf-dialog-framework-and-adf-task-flow.html' title='ADF Dialog Framework and ADF Task Flow Re-Initialization'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-gub-457HiNg/TjsGU15sffI/AAAAAAAAFSg/bNO5ypK4ikQ/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-4529774542625901791</id><published>2011-07-31T21:47:00.000+02:00</published><updated>2011-07-31T21:47:21.579+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>How To Handle Web Browser Buttons in ADF/WebCenter Applications</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;ADF/WebCenter technology typically is used to implement transactional logic and transfer desktop applications functionality into web browser. Based on this, many questions can be asked, for example - what will happen if user press browser Refresh button during pending transaction or what will happen if browser will be closed at all during transaction. We are not asking same questions for pure web type applications, but ADF/WebCenter is different case.&lt;br /&gt;&lt;br /&gt;There is no 100% working option to control web browser buttons and to disable them from inside of our application, this would break browser security and allow hackers to lock users into specific web site. We can try to clear browser cache, etc. - but this is not working with ADF/WebCenter applications. However, there is option to inform user proactively about browser related even, that can potentially break application functionality, for example - browser will be closed, page will be refreshed by Refresh button, etc. We can catch these events and warn user from ADF/WebCenter application. I will describe in this blog post, how to implement such warning.&lt;br /&gt;&lt;br /&gt;Download sample application for this post - &lt;a href="http://jdevsamples.googlecode.com/files/EnterprisePortalApp_v5.zip"&gt;EnterprisePortalApp_v5.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sample application is based on WebCenter 11g navigation model, it loads ADF task flows and external resources:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pwuT984MlDg/TjWkY4LQr7I/AAAAAAAAFRU/rjcby3BWjSs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://4.bp.blogspot.com/-pwuT984MlDg/TjWkY4LQr7I/AAAAAAAAFRU/rjcby3BWjSs/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When authentication is succeeded, default home page is loaded. Browser Back button becomes active, because it indicates user can go back to login page. We would like to avoid this, so we can inform user with warning implemented by sample application:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9hgKkFwGONQ/TjWlUXyS8DI/AAAAAAAAFRY/ziK7NyO-E2A/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="165" src="http://3.bp.blogspot.com/-9hgKkFwGONQ/TjWlUXyS8DI/AAAAAAAAFRY/ziK7NyO-E2A/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is standard browser warning dialog and is supported by all browsers. Two options are given - to stay or to continue browser navigation. If user will choose to stay on current page, will be able to continue his work. If "Leave this Page" option will be selected - we can't guarantee correct application behavior.&lt;br /&gt;&lt;br /&gt;This warning works well when navigating between pages. However, it behaves a bit different with ADF dynamic regions or when WebCenter navigation model is loading ADF task flows, external resources into internal frame. Let's load external resource by clicking on WebCenter menu:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9YXnpje9El4/TjWmRa-V4EI/AAAAAAAAFRc/MdZsPQd6mHA/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="http://2.bp.blogspot.com/-9YXnpje9El4/TjWmRa-V4EI/AAAAAAAAFRc/MdZsPQd6mHA/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Make sure you have noticed that "Reuters Global News" menu item was selected. Now press browser Back button - page content remains the same, but menu item selection moves and makes previously selected menu item as current:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-khBPxvo7jXE/TjWmud0T_1I/AAAAAAAAFRg/nCrCRbF6D6k/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="http://2.bp.blogspot.com/-khBPxvo7jXE/TjWmud0T_1I/AAAAAAAAFRg/nCrCRbF6D6k/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is logical, because we were not using separate page to display "Reuters Global News", but it was rendered inside frame - sample application didn't catch any change in navigation. However, if we press browser Back button one more time, it would try to navigate away from home page and we would receive navigation warning:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-En84iM96yNg/TjWnqD6qzGI/AAAAAAAAFRk/y3UUW8XdgrE/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="http://4.bp.blogspot.com/-En84iM96yNg/TjWnqD6qzGI/AAAAAAAAFRk/y3UUW8XdgrE/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Press - "Stay on this Page" and open another menu item - "Jobs". Try to close browser, same navigation warning dialog will appear and ask user to confirm his action. This is good, because user is warned before closing page without doing actual logout:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-A_4GLyppVNk/TjWq4vdsJQI/AAAAAAAAFRo/1WgzDyU_dw0/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="http://4.bp.blogspot.com/-A_4GLyppVNk/TjWq4vdsJQI/AAAAAAAAFRo/1WgzDyU_dw0/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Navigation warning doesn't affect internal navigation between ADF regions, because this navigation doesn't change current page - press Edit button:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-e0hJrH0cR4I/TjWsKU5NJgI/AAAAAAAAFRs/RoDwT8cltX8/s1600/7_a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://3.bp.blogspot.com/-e0hJrH0cR4I/TjWsKU5NJgI/AAAAAAAAFRs/RoDwT8cltX8/s320/7_a.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Another ADF region will be opened, without giving any navigation warning:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xOknrC0FbkY/TjWsSViauxI/AAAAAAAAFRw/eQ6VCcYSHrM/s1600/7_b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://1.bp.blogspot.com/-xOknrC0FbkY/TjWsSViauxI/AAAAAAAAFRw/eQ6VCcYSHrM/s320/7_b.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;But if user will press "Administration" link, this will invoke navigation to new physical page, user will be warned:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-niYbJFKeKMo/TjWs5QZTG-I/AAAAAAAAFR0/qDwpQTRk6-w/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-niYbJFKeKMo/TjWs5QZTG-I/AAAAAAAAFR0/qDwpQTRk6-w/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;"Logout" link also navigates to another physical page, however it will not give navigation warning - I will explain how to handle this with JavaScript:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-w5YvveziFLQ/TjWtJDeVG9I/AAAAAAAAFR4/fpPzxj5Fjcs/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://3.bp.blogspot.com/-w5YvveziFLQ/TjWtJDeVG9I/AAAAAAAAFR4/fpPzxj5Fjcs/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's do one more test and press browser Refresh button, while "Departments" menu item is opened. Press "Leave this Page" when navigation dialog will be opened:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-uZkF4RNKNq8/TjWtirJcl8I/AAAAAAAAFR8/nDx_13Qv6VE/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://4.bp.blogspot.com/-uZkF4RNKNq8/TjWtirJcl8I/AAAAAAAAFR8/nDx_13Qv6VE/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ADF/WebCenter application will reload, but will fail to render correct data - it will show "Fetching Data..." message constantly. Also menu item selection becomes wrong. If user would choose to "Stay on this Page", it would work well - it's user responsibility to choose action. Now user would need to press previously selected menu item "Departments", but all pending data will be lost:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0-7NQN5obVk/TjWuNzjCt-I/AAAAAAAAFSA/_nQS_AY9EjY/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://3.bp.blogspot.com/-0-7NQN5obVk/TjWuNzjCt-I/AAAAAAAAFSA/_nQS_AY9EjY/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It works to control navigation in this way with all browsers, or at least with those I have tested - IE, Firefox, Google Chrome. IE test:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-o647Zm7zV7M/TjWulBagSiI/AAAAAAAAFSE/xi3zeu8NCZQ/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="142" src="http://4.bp.blogspot.com/-o647Zm7zV7M/TjWulBagSiI/AAAAAAAAFSE/xi3zeu8NCZQ/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Firefox test:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-jyVTO2px_WE/TjWuq7IFCfI/AAAAAAAAFSI/Lhcjq2GHWww/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="http://2.bp.blogspot.com/-jyVTO2px_WE/TjWuq7IFCfI/AAAAAAAAFSI/Lhcjq2GHWww/s320/13.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I will explain now, how to enable such navigation warning dialog. We need to invoke JavaScript function, during application home page load. In ADF/WebCenter applications we can invoke &lt;b&gt;onload&lt;/b&gt; JavaScript function, simply by calling it from main af:form binding method:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-k5t4F2_eKMA/TjWveCKJG1I/AAAAAAAAFSM/Y_pAFaA-h6w/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/-k5t4F2_eKMA/TjWveCKJG1I/AAAAAAAAFSM/Y_pAFaA-h6w/s320/14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I'm loading JavaScript from navigation-renderer.jspx page, because ADF/WebCenter application is using this page to load page content into frame. You are free to do the same from your home page.&lt;br /&gt;&lt;br /&gt;Form binding method, programmatically loads&amp;nbsp;&lt;b&gt;window.onbeforeunload&lt;/b&gt; JavaScript function. This function allows us to control browser navigation, and is loaded only once - on home page initialization. If we want to skip navigation check for some page, we should leave function body empty (if check for logoutAction == 0):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-vkjubqnA0PI/TjWwd714rjI/AAAAAAAAFSQ/pl797Z8aejc/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://1.bp.blogspot.com/-vkjubqnA0PI/TjWwd714rjI/AAAAAAAAFSQ/pl797Z8aejc/s320/15.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If we need to skip navigation check for specific link, we can add af:clientListener method and set JavaScript variable flag:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-52YFkAIsVC8/TjWxNDzKGQI/AAAAAAAAFSc/4pozQ11iXLM/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://4.bp.blogspot.com/-52YFkAIsVC8/TjWxNDzKGQI/AAAAAAAAFSc/4pozQ11iXLM/s320/17.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Flag value will be set through JavaScript and later evaluated from window.onbeforeunload method (see above):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-SdPiUB-IsJA/TjWxF_3mnWI/AAAAAAAAFSY/BU_aVSF48VE/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="272" src="http://4.bp.blogspot.com/-SdPiUB-IsJA/TjWxF_3mnWI/AAAAAAAAFSY/BU_aVSF48VE/s320/16.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-4529774542625901791?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/4529774542625901791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=4529774542625901791' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/4529774542625901791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/4529774542625901791'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/07/how-to-handle-web-browser-buttons-in.html' title='How To Handle Web Browser Buttons in ADF/WebCenter Applications'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-pwuT984MlDg/TjWkY4LQr7I/AAAAAAAAFRU/rjcby3BWjSs/s72-c/1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5200640093363734792</id><published>2011-07-29T20:10:00.004+02:00</published><updated>2011-07-29T20:44:37.562+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Samurai'/><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Presenting Red Samurai at Oracle User Group in Japan</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I was giving session today about Red Samurai during Oracle User Group in Japan. You can read more about Oracle community initiative (&lt;a href="http://www.facebook.com/event.php?eid=144187058991700"&gt;Oracle Lovers&lt;/a&gt;) in Japan on Facebook. Thanks to &lt;a href="http://apex.oracle.com/pls/otn/f?p=19297:4:1097542813338460::NO:4:P4_ID:3060"&gt;Mototaka Yoshida&lt;/a&gt;&amp;nbsp;Oracle ACE for inviting me to speak - it was really fun and I enjoyed a lot.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.facebook.com/event.php?eid=144187058991700" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-X_OaGKqvx8c/TjL1GWB7yvI/AAAAAAAAFRE/g134jAFg19g/s320/facebook.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Audience in the room, watching Red Samurai session in Oracle Japan Aoyama Center 13F S2:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-lAqorV4Stro/TjL7qxZ99GI/AAAAAAAAFRM/hQZ7K0twkak/s1600/201107292004000.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-lAqorV4Stro/TjL7qxZ99GI/AAAAAAAAFRM/hQZ7K0twkak/s320/201107292004000.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Session topic was - why our company is called - &lt;a href="http://redsamuraiconsulting.com/"&gt;Red Samurai&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;The answer is:&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Our Motto - &lt;i&gt;Killing Bugs&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Oracle Specialized - We are &lt;i&gt;Red&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Always Fix Problems, or We Are Dead - &lt;i&gt;Samurai&lt;/i&gt;&lt;/li&gt;&lt;li&gt;If You Have Problem and No One can Help (even Oracle) - Call Us, We Will Fix it in No Time&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;These are not just words, but proven by Oracle Awards:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://redsamuraiconsulting.com/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-5yPM1fH3Qy8/TjL3BqzJRVI/AAAAAAAAFRI/-ygI9wdXoPg/s320/redsam_awards.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5200640093363734792?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5200640093363734792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5200640093363734792' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5200640093363734792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5200640093363734792'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/07/presenting-red-samurai-at-oracle-user.html' title='Presenting Red Samurai at Oracle User Group in Japan'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-X_OaGKqvx8c/TjL1GWB7yvI/AAAAAAAAFRE/g134jAFg19g/s72-c/facebook.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-3089389915907477789</id><published>2011-07-29T17:02:00.001+02:00</published><updated>2011-07-29T17:03:24.151+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF Code Corner'/><title type='text'>ADF Code Corner Article - 087. How-to improve LOV performance with shared AM in ADF BC</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I have started to publish articles on &lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/learnmore/index-101235.html"&gt;ADF Code Corner&lt;/a&gt; hosted on Oracle OTN and managed by Frank Nimphius. You can read my first post there - &lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/learnmore/87-lov-using-shared-am-444769.pdf"&gt;087. How-to improve LOV performance with shared AM in ADF BC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/learnmore/87-lov-using-shared-am-444769.pdf" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="311" src="http://2.bp.blogspot.com/-b7u8DKDqxBI/TjLLWq3agtI/AAAAAAAAFRA/3MnbxUujxEw/s320/adfcodecorner.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Stay tuned, more articles to come !&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-3089389915907477789?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/3089389915907477789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=3089389915907477789' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3089389915907477789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3089389915907477789'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/07/adf-code-corner-article-087-how-to.html' title='ADF Code Corner Article - 087. How-to improve LOV performance with shared AM in ADF BC'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-b7u8DKDqxBI/TjLLWq3agtI/AAAAAAAAFRA/3MnbxUujxEw/s72-c/adfcodecorner.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-1367586412937963418</id><published>2011-07-23T16:46:00.000+02:00</published><updated>2011-07-23T16:46:39.869+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='UCM'/><title type='text'>Configuring Oracle UCM 11g Access Control List Security - Missing Steps</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;If you are working with Oracle UCM 11g, I can imagine you may encounter hard times, when thinking about content security architecture design. But really, its not so complex - as it looks first, just there are lots of confusion between Security Groups, Accounts and Access Control Lists (ACL). For your reference, in Oracle UCM its not enough to define security groups to protect content - &lt;a href="http://andrejusb.blogspot.com/2010/12/understanding-oracle-ucm-11g-and-oracle.html"&gt;Understanding Oracle UCM 11g and Oracle ADF 11g Security Integration&lt;/a&gt;. One of the recommended ways is to use security Accounts in combination with Security Groups to protect RWDA permissions for files and folders. However, while this approach is recommended - is not so practical. Idea of using Security Groups and Accounts combination is hardly acceptable by customers, because first is hard to understand, second is hard to maintain. Its hard to maintain, because from administration point there is no difference between Security Group and Account, but it matters for UCM.&lt;br /&gt;&lt;br /&gt;We prefer to use Access Control List (ACL) functionality to implement content security in Oracle UCM 11g. ACL was available in previous versions of UCM, before 10g and returned back in 11g. This suggests ACL being simple to understand and&amp;nbsp;preferred&amp;nbsp;solution to protect content security - &lt;a href="http://download.oracle.com/docs/cd/E21764_01/doc.1111/e10792/c03_security.htm#CDDBCIDA"&gt;5.6 Access Control List Security&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Goal of this post is to describe few missing steps from Oracle UCM 11g documentation, related to ACL configuration.&lt;br /&gt;&lt;br /&gt;Let's follow &lt;b&gt;5.6.1 Configuring Access Control List Security&lt;/b&gt; section and define &lt;i&gt;UseEntitySecurity=true&lt;/i&gt; together with &lt;i&gt;AllowQuerySafeUserColumns=true&lt;/i&gt; properties:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-MprfQyMa6Po/TirKa9ig9GI/AAAAAAAAFQE/Qk65k87OrOE/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="237" src="http://4.bp.blogspot.com/-MprfQyMa6Po/TirKa9ig9GI/AAAAAAAAFQE/Qk65k87OrOE/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This should be enough to enable ACL support, as per documentation.&lt;br /&gt;&lt;br /&gt;We can see now that two additional fields became available - &lt;b&gt;User Access List&lt;/b&gt; and &lt;b&gt;Group Access List&lt;/b&gt;&amp;nbsp;(out of scope for this post)&amp;nbsp;for folder/file configuration. Type &lt;i&gt;redsa&lt;/i&gt;&amp;nbsp;into Add User box, auto-suggest list with matching users will appear:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-P10rQWUaoXs/TirK7f0sJmI/AAAAAAAAFQI/Qe90b0Q03DY/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-P10rQWUaoXs/TirK7f0sJmI/AAAAAAAAFQI/Qe90b0Q03DY/s320/2.png" width="299" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Assign RWD permissions to redsam for the &lt;b&gt;266&lt;/b&gt; folder. You should keep in mind, this folder is enabled with Security Group called - Proposal :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-gUJUbVvJo_o/TirO40uIMyI/AAAAAAAAFQM/Bhf7J1SF_hw/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-gUJUbVvJo_o/TirO40uIMyI/AAAAAAAAFQM/Bhf7J1SF_hw/s320/3.png" width="299" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Make sure that &lt;b&gt;Force Folder Security&lt;/b&gt; is set to True - this will ensure ACL list propagation to child folders or files:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-SQ9Wx0ZNYtY/TirPT7f6gSI/AAAAAAAAFQQ/gcAdEcDFzZs/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-SQ9Wx0ZNYtY/TirPT7f6gSI/AAAAAAAAFQQ/gcAdEcDFzZs/s1600/4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For example, if we upload new file into 266 folder, this file will inherit ACL list:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-sWc7FPQ0f1c/TirWKUD0dGI/AAAAAAAAFQU/4xYCViS2UOo/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://1.bp.blogspot.com/-sWc7FPQ0f1c/TirWKUD0dGI/AAAAAAAAFQU/4xYCViS2UOo/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Another folder - &lt;b&gt;267&lt;/b&gt;, is assigned for user redsam1 with RWD permissions:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-aYNTr-jBTQw/TirWaTYyUWI/AAAAAAAAFQY/LS7OlRn8T74/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-aYNTr-jBTQw/TirWaTYyUWI/AAAAAAAAFQY/LS7OlRn8T74/s320/6.png" width="304" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's do a test now, logically thinking folder 267 should not be visible for user redsam because of ACL setup:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DgsFFx3sKfw/TirWqumI3nI/AAAAAAAAFQc/R1LYJi2HWv8/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-DgsFFx3sKfw/TirWqumI3nI/AAAAAAAAFQc/R1LYJi2HWv8/s1600/7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Its still visible, both folders are visible, when it should be visible only one:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7QEzp4QrAEw/Tirb7x5_dGI/AAAAAAAAFQg/MGduUtfyS0g/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="53" src="http://1.bp.blogspot.com/-7QEzp4QrAEw/Tirb7x5_dGI/AAAAAAAAFQg/MGduUtfyS0g/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;What was missing in UCM 11g ACL configuration guide, is &lt;b&gt;SpecialAuthGroups&lt;/b&gt; property. From WebCenter Administrator's Guide &lt;a href="http://download.oracle.com/docs/cd/E17904_01/webcenter.1111/e12405/wcadm_documents.htm#BABIGAEI"&gt;11.2.2.2 Configuring Oracle Content Server 11g to Support Item Level Security in All WebCenter Applications&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;SpecialAuthGroups is a comma separated list of security groups that contains the content on which ILS can be specified. If in a WebCenter Spaces application users are to be provided ILS support, then the security group in which all Spaces content is created must be one of the SpecialAuthGroups. For WebCenter Spaces, the security group is named the same as the Document Spaces Property's application name. (For WebCenter Portal applications, the applicationName is the name of the security group in which content is created.)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;In our case, we are using Proposal group for ACL enabled folders and files, it can be any other custom Security Group:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-72LD3lrkbtI/Tirc6x9W9vI/AAAAAAAAFQk/M5Yb0Zx8Gsg/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="105" src="http://1.bp.blogspot.com/-72LD3lrkbtI/Tirc6x9W9vI/AAAAAAAAFQk/M5Yb0Zx8Gsg/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Make sure this group is included into ACL configuration:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-csXgtuXjSrg/TirdHeOhA6I/AAAAAAAAFQo/ZmZVnzICQng/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://2.bp.blogspot.com/-csXgtuXjSrg/TirdHeOhA6I/AAAAAAAAFQo/ZmZVnzICQng/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It works now as expected, user redsam will see only those folders allowed through ACL - it works:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ftuaPdF0a80/TirdVaOp8gI/AAAAAAAAFQs/cUzgX1lNn8Q/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="48" src="http://4.bp.blogspot.com/-ftuaPdF0a80/TirdVaOp8gI/AAAAAAAAFQs/cUzgX1lNn8Q/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Folder 267 is not accessible for redsam, when going directly through URL as well, as it should be:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gdMfbU5vuZQ/Tirdlz6kAgI/AAAAAAAAFQw/TjmJgwwIgIU/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="53" src="http://2.bp.blogspot.com/-gdMfbU5vuZQ/Tirdlz6kAgI/AAAAAAAAFQw/TjmJgwwIgIU/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Major difference between UCM 10g and 11g, in 11g it runs directly integrated into WebLogic. This simplifies lots of administration and configuration tasks, for example UCM security is synchronized with WebLogic security providers. This means its enough to define Active Directory security provider for WebLogic, it will be visible for UCM as well.&lt;br /&gt;&lt;br /&gt;UCM 11g is fetching users from WebLogic security provider automatically:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--Zh4y5-HkDk/TirePO4T6_I/AAAAAAAAFQ0/jPOkbe_onDU/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="202" src="http://2.bp.blogspot.com/--Zh4y5-HkDk/TirePO4T6_I/AAAAAAAAFQ0/jPOkbe_onDU/s320/13.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;UCM role is mapped with roles from WebLogic security provider automatically as well, for example ProposalRole from UCM:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DDgMJZbV3xY/Tireh2U3miI/AAAAAAAAFQ4/7azowKh0ETU/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="206" src="http://1.bp.blogspot.com/-DDgMJZbV3xY/Tireh2U3miI/AAAAAAAAFQ4/7azowKh0ETU/s320/14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Can be used directly inside WebLogic security provider or fetched from Active Directory, etc.:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ycRKayUW7iA/TirexPtr02I/AAAAAAAAFQ8/VeA2RVxXp60/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="302" src="http://1.bp.blogspot.com/-ycRKayUW7iA/TirexPtr02I/AAAAAAAAFQ8/VeA2RVxXp60/s320/16.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-1367586412937963418?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/1367586412937963418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=1367586412937963418' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/1367586412937963418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/1367586412937963418'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/07/configuring-oracle-ucm-11g-access.html' title='Configuring Oracle UCM 11g Access Control List Security - Missing Steps'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-MprfQyMa6Po/TirKa9ig9GI/AAAAAAAAFQE/Qk65k87OrOE/s72-c/1.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-2356480606367306650</id><published>2011-07-16T23:32:00.004+02:00</published><updated>2011-07-16T23:36:16.540+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><title type='text'>ADF View State Tuning for Large WebCenter 11g PS3/PS4 Applications</title><content type='html'>While running large ADF/WebCenter 11g PS3/PS4 applications in stress test or production environment, users can experience random errors related to ADF view state token. For example such errors can be observed in the log: &lt;b&gt;StateManagerImpl restoreView Could not find saved view state for token -ejrgnqgsv&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;We can refer to section &lt;a href="http://download.oracle.com/docs/cd/E21764_01/core.1111/e10108/adf.htm#BDCBIJAB"&gt;8.2 Oracle ADF View Performance&lt;/a&gt; from Oracle Fusion Middleware Performance and Tuning Guide. It describes &lt;b&gt;org.apache.myfaces.trinidad.CLIENT_STATE_MAX_TOKENS&lt;/b&gt; property and instructs how to tune performance by reducing the size of state token cache. By default, for ADF application tokens size is set to 15 (&lt;b&gt;&lt;i&gt;I personally would recommend to set it to 25 and then measure application performance, if no performance issues, its better to keep available tokens value higher&lt;/i&gt;&lt;/b&gt;), it can be tuned to 2. When it is set to 1, ADF application will return error after browser Back button click. When we create new WebCenter application in JDeveloper, org.apache.myfaces.trinidad.CLIENT_STATE_MAX_TOKENS is set to 3, this means WebCenter application would keep only three tokens in memory. Number of tokens is set to 3, probably to reduce memory usage for heavy WebCenter applications.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Zecr6A2X3n8/TiIB_U132KI/AAAAAAAAFQA/8l4RZoFrD8A/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="138" src="http://2.bp.blogspot.com/-Zecr6A2X3n8/TiIB_U132KI/AAAAAAAAFQA/8l4RZoFrD8A/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We have noticed, when Web session timeout is set to default 30 minutes, after 10-15 minutes of user inactivity - &lt;b&gt;could not find saved view state for token&lt;/b&gt; error is be reported randomly. This is unexpected behavior, because user is not pressing browser Back button, but still gets error during inactivity, even before timeout.&lt;br /&gt;&lt;br /&gt;This means&amp;nbsp;org.apache.myfaces.trinidad.CLIENT_STATE_MAX_TOKENS = 3, as it set for WebCenter 11g PS3/PS4 applications, looks like not enough. When this value was increased to 25, state token error was not reproduced anymore.&lt;br /&gt;&lt;br /&gt;Hope this hint will help you, in case of unexpected error will be encountered for missing view state during user inactivity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-2356480606367306650?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/2356480606367306650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=2356480606367306650' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2356480606367306650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/2356480606367306650'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/07/adf-view-state-tuning-for-large.html' title='ADF View State Tuning for Large WebCenter 11g PS3/PS4 Applications'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Zecr6A2X3n8/TiIB_U132KI/AAAAAAAAFQA/8l4RZoFrD8A/s72-c/1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-7802575640200019505</id><published>2011-07-11T02:56:00.002+02:00</published><updated>2011-07-11T03:05:40.770+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Workarounds'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Bugs'/><title type='text'>Unique Key Validation for LOV Based on Reference Attribute</title><content type='html'>While ago I was blogging how to &lt;a href="http://andrejusb.blogspot.com/2009/11/defining-lov-on-reference-attribute-in.html"&gt;Define LOV on a Reference Attribute in Oracle ADF 11g&lt;/a&gt;. Such type of LOV's are defined on description text, not on key. This approach works well, however there are some limitations when applying Unique Key business rule for such type of LOV's. Because LOV is based on read-only reference attribute, and Unique Key business rule is applied for LOV key, updated in the background - Unique Key business rule is not fired correctly for LOV based on reference attribute. I have tested this with JDev PS3, PS4 and R2 releases - same behavior is reproduced - Unique Key business rule is not working for such type of LOV's. User requirement is a must, and I will describe today how to implement Unique Key validation for LOV based on reference attribute, may be not exactly following ADF best practices.&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/UniqueKeyADFSample.zip"&gt;UniqueKeyADFSample.zip&lt;/a&gt;. This sample is not using LOV based on a reference attribute approach described from the blog post mentioned above. Instead, it is using calculated attribute - &lt;b&gt;DepartmentName&lt;/b&gt;, by default this attribute is populated through SQL expression and is updateable (which is very important):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_7DRuN6npUE/ThpCMhAACKI/AAAAAAAAFO8/EjlkrI_ErHQ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://1.bp.blogspot.com/-_7DRuN6npUE/ThpCMhAACKI/AAAAAAAAFO8/EjlkrI_ErHQ/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This attribute must be set as updateable, otherwise in case of validation error - user still will see previous value. Control Hints for DepartmentName define Auto Submit = true property:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-fX_wSBv-6IE/ThpCafv-DeI/AAAAAAAAFPA/mkq2UroK0j0/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="215" src="http://4.bp.blogspot.com/-fX_wSBv-6IE/ThpCafv-DeI/AAAAAAAAFPA/mkq2UroK0j0/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Persistent LOV key attribute - &lt;b&gt;DepartmentId&lt;/b&gt;, is defined to be dependent on DepartmentName:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-l3hatZ7DXzA/ThpCrXi4rgI/AAAAAAAAFPE/NIj_cRNxV4Y/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://4.bp.blogspot.com/-l3hatZ7DXzA/ThpCrXi4rgI/AAAAAAAAFPE/NIj_cRNxV4Y/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This means, whenever DepartmentName will be changing, DepartmentId value will be updated as well.&lt;br /&gt;&lt;br /&gt;Let's return now to Unique Key business rule. This rule defines pair of attributes - DepartmentId and PhoneNumber to be unique for every row:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ci3Je9i37e0/ThpDIKoLW-I/AAAAAAAAFPI/ZU1MIqvg3BU/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://2.bp.blogspot.com/-ci3Je9i37e0/ThpDIKoLW-I/AAAAAAAAFPI/ZU1MIqvg3BU/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Business rule - Unique Key Validator, is created based on EO alternate key:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-p8BCimHwZDQ/ThpEZgOnCmI/AAAAAAAAFPM/UnmkVGalFno/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="175" src="http://1.bp.blogspot.com/-p8BCimHwZDQ/ThpEZgOnCmI/AAAAAAAAFPM/UnmkVGalFno/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;LOV is defined on calculated DepartmentName attribute and additionally returns value for DepartmentId persistent attribute:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-hh-wfG113RA/ThpFcv60YGI/AAAAAAAAFPQ/oTBZoSjRhz0/s1600/5a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="http://2.bp.blogspot.com/-hh-wfG113RA/ThpFcv60YGI/AAAAAAAAFPQ/oTBZoSjRhz0/s320/5a.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In this scenarion, because Unique Key business rule is defined on EO level, and we are changing DepartmentId by selecting another value for DepartmentName - Unique Key business rule is not fired on UI side (it works in ADF BC tester utility).&lt;br /&gt;&lt;br /&gt;One of the ways to force business rule execution, is to call validate method for current transaction - method is implemented inside AM implementation class:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-eXhbqpy24Y4/ThpGHBzIk3I/AAAAAAAAFPU/N2SZYq1y2Jw/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="84" src="http://1.bp.blogspot.com/-eXhbqpy24Y4/ThpGHBzIk3I/AAAAAAAAFPU/N2SZYq1y2Jw/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We would need to invoke this method from UI, this means declare it inside Page Definition and call after LOV value will change:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-hFZ3V876Fy0/ThpGWWmv1dI/AAAAAAAAFPY/Mn3zBf3uu1g/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://3.bp.blogspot.com/-hFZ3V876Fy0/ThpGWWmv1dI/AAAAAAAAFPY/Mn3zBf3uu1g/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When you will look through sample application, you will wonder why there is additional hidden button available - Helper:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-5r7CzZMNPGk/ThpGoKKiMwI/AAAAAAAAFPc/HNf6U_tM9_o/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-5r7CzZMNPGk/ThpGoKKiMwI/AAAAAAAAFPc/HNf6U_tM9_o/s320/9.png" width="313" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is not accidental. If we would come back to the beginning of this story, we would remember that Unique Key business rule is defined on EO level. This means business rule is fired only on submit, but not on auto submit for attribute (at least this is true for LOV attribute). It would be not convenient for user to press button, just to perform validation. So, we create hidden button and invoke it programmatically. Hidden button properties:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-E8ij7idk1Zg/ThpHvJJ9hCI/AAAAAAAAFPg/5iriklleg90/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-E8ij7idk1Zg/ThpHvJJ9hCI/AAAAAAAAFPg/5iriklleg90/s320/10.png" width="170" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Hidden button calls AM method to validate current transaction.&lt;br /&gt;&lt;br /&gt;LOV is defined with Value Change Listener and invokes hidden button action - once LOV value is changed, hidden button will be invoked and validate current transaction:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-XOn3l_a-dgc/ThpIbYGoJUI/AAAAAAAAFPk/hBs2gSb3MHM/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="171" src="http://4.bp.blogspot.com/-XOn3l_a-dgc/ThpIbYGoJUI/AAAAAAAAFPk/hBs2gSb3MHM/s320/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This trick allows to invoke EO level validation rule, when changing only attribute value. You may think, why not to invoke AM validate method from Value Change Listener itself - its simply still not working.&lt;br /&gt;&lt;br /&gt;Its not the end of the story yet. When transaction is validated and validation error is reported, this error is attached only with attribute from Unique Key business rule. So, even this business rule is invoked on EO level, it reports validation errors for individual attributes - tricky. So, we need to highlight failed attribute by&amp;nbsp;ourselves. We can do this by referencing attribute from Unique Key business rule, just point to &lt;b&gt;errors&lt;/b&gt; property - this would tell us about validation status and we could copy it and display for LOV:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0P0v-c2_N5I/ThpJdTcsPmI/AAAAAAAAFPo/W4aUxFifAAk/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://3.bp.blogspot.com/-0P0v-c2_N5I/ThpJdTcsPmI/AAAAAAAAFPo/W4aUxFifAAk/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For &lt;b&gt;row.bindings.DepartmentId.errors&lt;/b&gt; to work, make sure DepartmentId is declared inside tree bindings:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-nBlu-1Ad-PU/ThpJtZHCe1I/AAAAAAAAFPs/EX3yjmIGBCA/s1600/8a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-nBlu-1Ad-PU/ThpJtZHCe1I/AAAAAAAAFPs/EX3yjmIGBCA/s320/8a.png" width="262" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We can simulate Unique Key validation error:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Q8FZbpkMKjE/ThpJ5O2SvnI/AAAAAAAAFPw/EEhLoHp_WHE/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="292" src="http://2.bp.blogspot.com/-Q8FZbpkMKjE/ThpJ5O2SvnI/AAAAAAAAFPw/EEhLoHp_WHE/s320/12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Selected duplicate value is highlighted, validation error message is shown as well:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ou3l04LOX78/ThpKH0Sp4PI/AAAAAAAAFP0/czPmu2fCNNI/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" src="http://4.bp.blogspot.com/-ou3l04LOX78/ThpKH0Sp4PI/AAAAAAAAFP0/czPmu2fCNNI/s320/13.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-7802575640200019505?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/7802575640200019505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=7802575640200019505' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7802575640200019505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7802575640200019505'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/07/unique-key-validation-for-lov-based-on.html' title='Unique Key Validation for LOV Based on Reference Attribute'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-_7DRuN6npUE/ThpCMhAACKI/AAAAAAAAFO8/EjlkrI_ErHQ/s72-c/1.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-6458591137003609026</id><published>2011-07-03T23:31:00.000+02:00</published><updated>2011-07-03T23:31:03.739+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Oracle WebCenter 11g PS3/PS4 Workaround for User Session Timeout Error 404</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Most of you who are developing/using WebCenter 11g PS3/PS4 apps, probably noticed one annoying behavior related to user session timeout - &lt;b&gt;Error 404 Resource not Found&lt;/b&gt;. Starting from ADF 11g PS3, user session timeout is handled by ADF with a new session timeout warning functionality. By default, 2 minutes before session expiry, ADF informs user to resume activity, if no action was taken after 2 minutes another warning message will inform about session timeout. Once user comes back and press OK for session timeout warning - automatic redirect happens to landing login page, this behavior is controlled by ADF Security. Read more about session timeout warning functionality from Frank Nimphius blog - &lt;a href="http://blogs.oracle.com/jdevotnharvest/entry/how-to_enable_user_session_time_out_warning_jdev_11114"&gt;How-to enable user session time out warning (JDev 11.1.1.4)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;While this works well with ADF, it doesn't want to work so well with WebCenter. Mainly because WebCenter navigation model prevents ADF Security to redirect successfully to login page. However, I have found workaround for WebCenter project as well, you are free to use it, until it will be fixed in future versions. Download sample WebCenter 11g PS4 application, where user session timeout is handled properly - &lt;a href="http://jdevsamples.googlecode.com/files/EnterprisePortalApp_v4.zip"&gt;EnterprisePortalApp_v4.zip&lt;/a&gt;. I will describe below, what type of workaround is applied for this sample application.&lt;br /&gt;&lt;br /&gt;Described error is reproduced with any type of WebCenter 11g PS3/PS4 application.&lt;br /&gt;&lt;br /&gt;In order to reproduce user session timeout error, enable session timeout period for 5 minutes time:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SAYgITuKebU/ThDZvOkH4rI/AAAAAAAAFNs/Gtilk7kPBcA/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://1.bp.blogspot.com/-SAYgITuKebU/ThDZvOkH4rI/AAAAAAAAFNs/Gtilk7kPBcA/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When user session will be about to expire, we receive initial warning message:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-4GB1t6QNJrE/ThDaCCzTgeI/AAAAAAAAFNw/8SlDviz_lLs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="http://1.bp.blogspot.com/-4GB1t6QNJrE/ThDaCCzTgeI/AAAAAAAAFNw/8SlDviz_lLs/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Finally, if user takes no action, user session expires:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-t_t5AJsWhgM/ThDaM4vpJMI/AAAAAAAAFN0/1gRAcpyBVV0/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="258" src="http://4.bp.blogspot.com/-t_t5AJsWhgM/ThDaM4vpJMI/AAAAAAAAFN0/1gRAcpyBVV0/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Not in 100% of the cases, but in 95% - when user press OK, WebCenter application generated Error 404 - Not Found:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-wYr6OLxsVs0/ThDa8dr3OUI/AAAAAAAAFN4/if21OVf-ffI/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://4.bp.blogspot.com/-wYr6OLxsVs0/ThDa8dr3OUI/AAAAAAAAFN4/if21OVf-ffI/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This happens because WebCenter navigation model prevents ADF Security to redirect to login page successfully. Instead it keeps pointing to previously selected menu item from WebCenter navigation model. Since session becomes expired now, authentication is lost and we don't have access to navigation model anymore - its why &lt;b&gt;Error 404 - Not Found&lt;/b&gt; is generated.&lt;br /&gt;&lt;br /&gt;We can workaround this by defining our own filter class &lt;b&gt;WCSessionExpiryFilter&lt;/b&gt; and mapping it to Faces Servlet - this would allow to intercept all requests processed by application:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--LeGua84Dxc/ThDb4FQKqVI/AAAAAAAAFN8/nmFM4cO0a1g/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://3.bp.blogspot.com/--LeGua84Dxc/ThDb4FQKqVI/AAAAAAAAFN8/nmFM4cO0a1g/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Filter class should be predefined with initialization parameter describing URL address to redirect after session timeout will happen. In my case it will be login page - &amp;nbsp;/faces/oracle/webcenter/portalapp/pages/login.jspx:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-WN13QgUndzI/ThDdD2WeN9I/AAAAAAAAFOA/CvDdSQ-FAuY/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="77" src="http://4.bp.blogspot.com/-WN13QgUndzI/ThDdD2WeN9I/AAAAAAAAFOA/CvDdSQ-FAuY/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Main logic for this workaround is implemented inside our custom filter class, doFilter() method:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xaGhh62TEag/ThDdRCFzIaI/AAAAAAAAFOE/TRRAcEyPj9M/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="167" src="http://4.bp.blogspot.com/-xaGhh62TEag/ThDdRCFzIaI/AAAAAAAAFOE/TRRAcEyPj9M/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We are relying on ADF Security and trying to access User Principal object from request. User Principal can be Null, when user is not authenticated. Or in other words, either user is not yet logged in, or session was expired. We need to check request URI, in case if login page is accessed during request - we do nothing. But in case when User Principal is Null and request URI is not pointing to login page, we would force to redirect to login page and ignore unauthenticated navigation from WebCenter - its when user session expired:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-elixubzwzac/ThDfPG41QAI/AAAAAAAAFOI/Lbugb06jUYI/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="258" src="http://4.bp.blogspot.com/-elixubzwzac/ThDfPG41QAI/AAAAAAAAFOI/Lbugb06jUYI/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Confirm Page Expired message by pressing OK button and now we are redirected nicely to login page, thanks to our custom filter class described above:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-o3-LbFIAV9c/ThDfjwTEL9I/AAAAAAAAFOM/s5WWOTEYF6o/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="111" src="http://2.bp.blogspot.com/-o3-LbFIAV9c/ThDfjwTEL9I/AAAAAAAAFOM/s5WWOTEYF6o/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-6458591137003609026?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/6458591137003609026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=6458591137003609026' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6458591137003609026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6458591137003609026'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/07/oracle-webcenter-11g-ps3ps4-workaround.html' title='Oracle WebCenter 11g PS3/PS4 Workaround for User Session Timeout Error 404'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-SAYgITuKebU/ThDZvOkH4rI/AAAAAAAAFNs/Gtilk7kPBcA/s72-c/1.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-6307012906099633496</id><published>2011-06-26T12:22:00.002+02:00</published><updated>2011-06-26T12:28:59.434+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><title type='text'>ADF 11g R2 Improvement - ADF Table AutoHeightRows Property</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There are lots of &lt;a href="http://www.oracle.com/technetwork/developer-tools/jdev/jdev-11gr2-nf-404365.html"&gt;new features in ADF 11g R2&lt;/a&gt;, one of them improved handling for ADF Table &lt;i&gt;AutoHeightRows&lt;/i&gt; property. Read my previous blog post, to understand how this property was supported in ADF 11g R1 - &lt;a href="http://andrejusb.blogspot.com/2010/07/adf-table-autoheightrows-property.html"&gt;ADF Table AutoHeightRows Property&lt;/a&gt;. In ADF 11g R1 it was working only with &lt;i&gt;ContentDelivery&lt;/i&gt; set to &lt;b&gt;immediate&lt;/b&gt; for table component (otherwise dynamic height resizing was not happening). Good news - it works now with &lt;b&gt;all&lt;/b&gt; &lt;i&gt;ContentDelivery&lt;/i&gt; modes.&lt;br /&gt;&lt;br /&gt;Download sample application migrated to ADF 11g R2 - &lt;a href="http://jdevsamples.googlecode.com/files/ADFTableAutoHeightR2.zip"&gt;ADFTableAutoHeightR2.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;ContentDelivery&lt;/i&gt; property is set to default - &lt;i&gt;whenAvailable&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-epyPvjXie78/TgcHXfzehzI/AAAAAAAAFNc/mTDv4VYytWA/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="http://1.bp.blogspot.com/-epyPvjXie78/TgcHXfzehzI/AAAAAAAAFNc/mTDv4VYytWA/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;AutoHeightRows&lt;/i&gt; is set to be 25, dynamic height resizing happens for less than 25 rows in result set:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-zrJSs9MLgMA/TgcH6ldK-II/AAAAAAAAFNk/smaT23-brjA/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="236" src="http://4.bp.blogspot.com/-zrJSs9MLgMA/TgcH6ldK-II/AAAAAAAAFNk/smaT23-brjA/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Maximum 25 rows are shown, when result set size exceeds &lt;i&gt;AutoHeightRows&lt;/i&gt; value:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-wEUHyhZWKOw/TgcITSNjjrI/AAAAAAAAFNo/TCjrKpdkXsI/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-wEUHyhZWKOw/TgcITSNjjrI/AAAAAAAAFNo/TCjrKpdkXsI/s320/3.png" width="274" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-6307012906099633496?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/6307012906099633496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=6307012906099633496' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6307012906099633496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6307012906099633496'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/06/adf-11g-r2-improvement-adf-table.html' title='ADF 11g R2 Improvement - ADF Table AutoHeightRows Property'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-epyPvjXie78/TgcHXfzehzI/AAAAAAAAFNc/mTDv4VYytWA/s72-c/1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-979422566277737903</id><published>2011-06-25T16:09:00.005+02:00</published><updated>2011-06-27T17:27:17.849+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG Kaleidoscope'/><title type='text'>ODTUG - Oracle ADF 11g – Driving Power for SOA/BPM/WebCenter 11g Integration</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Heading to Los Angeles, &lt;b&gt;ODTUG Kscope11&lt;/b&gt; conference:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://kscope11.com/"&gt;&lt;img border="0" height="72" src="http://2.bp.blogspot.com/-0XLFpnxgB_A/TgXpXblY4gI/AAAAAAAAFNY/kODWruG7V_M/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I will be presenting there:&lt;br /&gt;&lt;br /&gt;&lt;div id="p" style="font-weight: bold;"&gt;(1) Oracle ADF 11g - Driving Power for Oracle SOA/BPM/WebCenter 11g Integration (Abstract ID:149)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="p"&gt;Andrejus Baranovskis&lt;span style="font-style: italic;"&gt;, Red Samurai Consulting&lt;/span&gt;&lt;/div&gt;&lt;div id="p" style="float: left;"&gt;Session 14,&amp;nbsp;&lt;span style="font-style: italic;"&gt;06/29/2011, 1:45 PM-2:45 PM&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div id="p"&gt;Fusion Middleware&lt;span style="font-style: italic;"&gt;&amp;nbsp;- Web Center&lt;/span&gt;&lt;/div&gt;&lt;div id="p"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="p"&gt;&lt;i&gt;Abstract:&lt;/i&gt;&lt;/div&gt;&lt;div id="p"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="p"&gt;&lt;i&gt;Oracle Fusion Middleware 11g is industry standard for enterprise applications. One of the key technical advantages of Oracle Fusion Middleware 11g is a unified approach for application development. You can implement and reuse Oracle ADF 11g applications across entire Oracle Fusion Middleware 11g stack. This session will explain how to use ADF Faces components for Human Tasks UI implementation. An application will be invoked in Oracle BPM 11g Worklist application. Also how to call Human Worklow service of Oracle SOA/BPM 11g Suite directly without using the Oracle BPM 11g Worklist application will be demonstrated. The presenter will show how to consume Human Worklow services from custom ADF Task Flows, using standard Web Service Data Control. These ADF Task Flows will implement custom screens for Human Workflow functions - initiate, approve, and reject actions. Human Task payload will be populated from ADF Business Components module. Implemented ADF Task Flows will be invoked and demonstrated inside Oracle WebCenter Spaces 11g environment.&lt;/i&gt;&lt;/div&gt;&lt;div id="p"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="p"&gt;&lt;b&gt;(2) Birds of Feather (FMW BoF) session:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Oracle Universal Content Management 11g and Oracle ADF/WebCenter 11g&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The Bof’s will take place on Monday Night in Rooms 203A, 203B, or 203C, at the Long Beach&lt;u&gt;&lt;/u&gt;&amp;nbsp;&lt;u&gt;&lt;/u&gt;Convention Center&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;,&amp;nbsp;from 7:00 p.m. to 8:30 p.m&lt;br /&gt;&lt;br /&gt;Looking forward to meet you in LA !&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-979422566277737903?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/979422566277737903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=979422566277737903' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/979422566277737903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/979422566277737903'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/06/odtug-oracle-adf-11g-driving-power-for.html' title='ODTUG - Oracle ADF 11g – Driving Power for SOA/BPM/WebCenter 11g Integration'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-0XLFpnxgB_A/TgXpXblY4gI/AAAAAAAAFNY/kODWruG7V_M/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-7111904779130841014</id><published>2011-06-19T18:04:00.002+02:00</published><updated>2011-06-19T18:43:43.540+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><title type='text'>JDev 11g R2 - ADF BC Dependency Diagram Feature</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Most of the projects tend to contain huge number of ADF BC objects and different dependencies between them. It was always very complex job, especially during refactoring, to understand these dependencies and make sure no Association or View Link is lost. With JDeveloper 11g R2, this job becomes much easier - we are given ADF BC diagrammer tool out of the box. This diagrammer tool can visualize ADF BC Association and View Link dependencies between EO's and VO's respectively.&lt;br /&gt;&lt;br /&gt;Let's generate ADF BC objects with Associations and View Links for HR schema. Departments EO will be generated among other objects, let's open it:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3RHn3XJWBQg/Tf4c32Z4DiI/AAAAAAAAFNI/5d8g1-dmVgQ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="179" src="http://4.bp.blogspot.com/-3RHn3XJWBQg/Tf4c32Z4DiI/AAAAAAAAFNI/5d8g1-dmVgQ/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ADF BC wizards are coming with additional tab - Diagram. It shows relationships between dependent objects for selected EO:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-vqZpcIHSUA8/Tf4dQutjZwI/AAAAAAAAFNM/vgmPuuVQnvk/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-vqZpcIHSUA8/Tf4dQutjZwI/AAAAAAAAFNM/vgmPuuVQnvk/s320/2.png" width="207" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Diagram relationship feature is supported for VO's as well:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-rD-3nWPS0C0/Tf4dyHt8zYI/AAAAAAAAFNQ/0PsWdhUZA-I/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="273" src="http://3.bp.blogspot.com/-rD-3nWPS0C0/Tf4dyHt8zYI/AAAAAAAAFNQ/0PsWdhUZA-I/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/ADFBCDiagram.zip"&gt;ADFBCDiagram.zip&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-7111904779130841014?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/7111904779130841014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=7111904779130841014' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7111904779130841014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7111904779130841014'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/06/jdev-11g-r2-adf-bc-dependency-diagram.html' title='JDev 11g R2 - ADF BC Dependency Diagram Feature'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-3RHn3XJWBQg/Tf4c32Z4DiI/AAAAAAAAFNI/5d8g1-dmVgQ/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-5757457871437061898</id><published>2011-06-19T17:29:00.001+02:00</published><updated>2011-06-19T17:30:27.843+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><title type='text'>How to Open ADF BC Configuration Wizard in JDev 11g R2</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;It might be misleading how to open ADF BC configuration wizard in JDev 11g R2. Same menu option exists as in previous JDev releases - right click on AM and choose &lt;i&gt;Configurations&lt;/i&gt;. This should open ADF BC configuration wizard, but in latest JDev release it opens bc4j.xcfg file and lists available configurations. However, there is no option to edit existing configurations (only add or remove):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-q9w1x2_WN84/Tf4SS_I6rOI/AAAAAAAAFM0/QYgbjMudbFU/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="http://2.bp.blogspot.com/-q9w1x2_WN84/Tf4SS_I6rOI/AAAAAAAAFM0/QYgbjMudbFU/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Property inspector displays some settings for selected configuration, but its only subset of all available properties we can define:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mMz6spGtMrw/Tf4TDqKLS3I/AAAAAAAAFM4/gdT3m5alihA/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="274" src="http://3.bp.blogspot.com/-mMz6spGtMrw/Tf4TDqKLS3I/AAAAAAAAFM4/gdT3m5alihA/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In order to open complete ADF BC configuration wizard, you should go through workaround path and open AM module wizard first and then select Configurations section there:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7niBv6Luo8c/Tf4UeW8thFI/AAAAAAAAFM8/Xa6q9tf1HPQ/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="92" src="http://1.bp.blogspot.com/-7niBv6Luo8c/Tf4UeW8thFI/AAAAAAAAFM8/Xa6q9tf1HPQ/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Select edit option for available configuration, ADF BC configuration wizard will be opened, where&amp;nbsp;we can define AM Pool parameters, etc.:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bBkngHaM15c/Tf4U75s2-nI/AAAAAAAAFNA/9PjdN8NknpM/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="254" src="http://3.bp.blogspot.com/-bBkngHaM15c/Tf4U75s2-nI/AAAAAAAAFNA/9PjdN8NknpM/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;One more thing to learn about JDev 11g R2 - JDBC Data Source is set now by default for AM database connection:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-KhM8xpfSmsM/Tf4Vj_MWCoI/AAAAAAAAFNE/t5PoO_VhREg/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-KhM8xpfSmsM/Tf4Vj_MWCoI/AAAAAAAAFNE/t5PoO_VhREg/s320/5.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-5757457871437061898?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/5757457871437061898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=5757457871437061898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5757457871437061898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/5757457871437061898'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/06/how-to-open-adf-bc-configuration-wizard.html' title='How to Open ADF BC Configuration Wizard in JDev 11g R2'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-q9w1x2_WN84/Tf4SS_I6rOI/AAAAAAAAFM0/QYgbjMudbFU/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-3490510225951302795</id><published>2011-06-13T21:13:00.007+02:00</published><updated>2011-07-03T23:54:27.119+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><title type='text'>ADF BC 11g R2 - Java Extended For Oracle Data Type Map</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There is one fundamental change in ADF BC from 11g R2. It's not recommended anymore to use &lt;b&gt;oracle.jbo.domain.Number&lt;/b&gt; type for numeric data types. As per ADF developer guide for 11g R2 - &lt;a href="http://download.oracle.com/docs/cd/E16162_01/web.1112/e16182/bcintro.htm#sm0063"&gt;New Fusion web applications should use the default Java Extended for Oracle type&lt;/a&gt;. &lt;b&gt;Java Extended For Oracle&lt;/b&gt; as Data Type Map is suggested by default, when you want to generate ADF BC, Oracle Domains type is still supported though:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_GPcBQe2qiM/TfZcC1tdIRI/AAAAAAAAFMY/0YKY9f_kHa0/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://4.bp.blogspot.com/-_GPcBQe2qiM/TfZcC1tdIRI/AAAAAAAAFMY/0YKY9f_kHa0/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;With Java Extend For Oracle we don't have anymore one single type for numbers, but &lt;i&gt;java.math.BigDecimal&lt;/i&gt;, &lt;i&gt;java.math.BigInteger&lt;/i&gt;, etc. Somehow, I will miss good &lt;i&gt;oracle.jbo.domain.Number&lt;/i&gt;, just think how complicated will be now refactoring - if we need to synchronize and change ADF BC based on customer request, we would need to care now about proper type usage. But anyhow, we should follow best practices and use Java Extended For Oracle type with new ADF applications.&lt;br /&gt;&lt;br /&gt;I saw on the OTN Forum today, one issue was reported related to &lt;i&gt;java.math.BigInteger&lt;/i&gt;&amp;nbsp;type and ADF BC - &lt;a href="http://forums.oracle.com/forums/thread.jspa?messageID=9655369"&gt;Bug: JBO-25029: Domain class BigInteger is not found. JDeveloper11.1.2.0.0&lt;/a&gt;. I wanted to reproduce it with test case - created NUMBER(20) type column (BIG_INTEGER) in database:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-whJ4kYX8wVA/TfZeUJvAFTI/AAAAAAAAFMc/1clHfM0-hxE/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://1.bp.blogspot.com/-whJ4kYX8wVA/TfZeUJvAFTI/AAAAAAAAFMc/1clHfM0-hxE/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;EO is generated with all three numeric types - &lt;i&gt;java.math.BigDecimal&lt;/i&gt;,&lt;i&gt; java.math.BigInteger&lt;/i&gt; and &lt;i&gt;java.lang.Integer&lt;/i&gt; - not too happy with this (imagine if database column precision will be changed, we would need to change type accordingly inside managed bean method and ADF BC implementation classes for certain attribute). Imagine into what horror we could end up, if we would need to refactor this EO (and 100 others), and change numeric types:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FUCINpJcKI8/TfZftLSupyI/AAAAAAAAFMg/b7A_DszaFQU/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="http://1.bp.blogspot.com/-FUCINpJcKI8/TfZftLSupyI/AAAAAAAAFMg/b7A_DszaFQU/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Run application, without doing any change for auto-generated code and you get error reported on OTN forum - domain class BigInteger is not found:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-l6Lhg4LQa0I/TfZf7rfvkAI/AAAAAAAAFMk/_YZ3HUzn_18/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="195" src="http://2.bp.blogspot.com/-l6Lhg4LQa0I/TfZf7rfvkAI/AAAAAAAAFMk/_YZ3HUzn_18/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This error happens, because EO attribute of java.math.BigInteger type is not correctly auto-generated by ADF BC - type is not specified correctly:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-dhJWc4EAMm4/TfZg6s9SsJI/AAAAAAAAFMo/USu6HSOcDAQ/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="195" src="http://2.bp.blogspot.com/-dhJWc4EAMm4/TfZg6s9SsJI/AAAAAAAAFMo/USu6HSOcDAQ/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Change &lt;b&gt;BigInteger&lt;/b&gt; into &lt;b&gt;java.math.BigInteger&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--PuaSuqydbA/TfZhFiSfCzI/AAAAAAAAFMs/B3IHut5wIv4/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/--PuaSuqydbA/TfZhFiSfCzI/AAAAAAAAFMs/B3IHut5wIv4/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It works well:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-48xsV7c4uLU/TfZhS20HixI/AAAAAAAAFMw/5jlJZboC3pc/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-48xsV7c4uLU/TfZhS20HixI/AAAAAAAAFMw/5jlJZboC3pc/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/ADFBCTypes.zip"&gt;ADFBCTypes.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update from Duncan Mills, posted on ADF EMG related to this blog:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;In the limited use case that you explain here where the data model is&amp;nbsp;changeable then you probably want to stick with the JBO Number domain.&amp;nbsp;However, this is a corner case and not representative of most systems&amp;nbsp;so the recommendation to use the new default stands.  Saying that,&amp;nbsp;we'll not be dropping the old typemap. It will be there forever, there&amp;nbsp;is just way too much code that uses it, so there is no problem with&amp;nbsp;&lt;/i&gt;&lt;i&gt;continuing to use it.&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-3490510225951302795?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/3490510225951302795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=3490510225951302795' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3490510225951302795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/3490510225951302795'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/06/adf-bc-11g-r2-java-extended-for-oracle.html' title='ADF BC 11g R2 - Java Extended For Oracle Data Type Map'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-_GPcBQe2qiM/TfZcC1tdIRI/AAAAAAAAFMY/0YKY9f_kHa0/s72-c/1.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-7770217176697763899</id><published>2011-06-13T10:50:00.000+02:00</published><updated>2011-06-13T10:50:33.231+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Samurai'/><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Texas A&amp;M Researchers Innovate &amp; Engage with WebCenter - Video</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;With Oracle WebCenter, researchers at Texas A&amp;amp;M University are able to spend more time innovating and less time on administration, allowing them to collaborate more efficiently and uncover new discoveries:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0" height="322" id="flashObj" width="486"&gt;&lt;param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9?isVid=1" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;param name="flashVars" value="videoId=985680118001&amp;playerID=1640183659&amp;playerKey=AQ~~,AAAAAFcSbzI~,OkyYKKfkn3za9MF0qI3Ufg1AerdkqfR3&amp;domain=embed&amp;dynamicStreaming=true" /&gt;&lt;param name="base" value="http://admin.brightcove.com" /&gt;&lt;param name="seamlesstabbing" value="false" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="swLiveConnect" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://c.brightcove.com/services/viewer/federated_f9?isVid=1" bgcolor="#FFFFFF" flashVars="videoId=985680118001&amp;playerID=1640183659&amp;playerKey=AQ~~,AAAAAFcSbzI~,OkyYKKfkn3za9MF0qI3Ufg1AerdkqfR3&amp;domain=embed&amp;dynamicStreaming=true" base="http://admin.brightcove.com" name="flashObj" width="486" height="322" seamlesstabbing="false" type="application/x-shockwave-flash" allowFullScreen="true" swLiveConnect="true" allowScriptAccess="always" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://redsamuraiconsulting.com/"&gt;Red Samurai&lt;/a&gt; is excited to deliver Oracle WebCenter platform solution to our customer - &lt;a href="http://tees.tamu.edu/v2/"&gt;Texas A&amp;amp;M TEES&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-7770217176697763899?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/7770217176697763899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=7770217176697763899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7770217176697763899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/7770217176697763899'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/06/texas-researchers-innovate-engage-with.html' title='Texas A&amp;M Researchers Innovate &amp; Engage with WebCenter - Video'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-6710810843015134957</id><published>2011-06-11T17:57:00.001+02:00</published><updated>2011-06-11T18:11:03.318+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g R2'/><title type='text'>ADF BC Application Module Data Control Hints for JDeveloper 11g R2 ADF Libraries</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I got a question from blog reader, based on my previous post - &lt;a href="http://andrejusb.blogspot.com/2010/10/how-to-reduce-database-connections-and.html"&gt;How To Reduce Database Connections and Reuse ViewController Layer&lt;/a&gt;. This post is based on ADF library dependencies with ADF BC objects - library is not imported directly into project, but is accessed through proxy library with implemented root Application Module - to reduce opened database connections. However, same application fails to work on design time in JDeveloper 11g R2 (latest release from this week) - IDE wizard returns error about missing Data Control objects. It works on runtime though, means there are no issues with ADF runtime, its something with IDE. However, I would not claim this as IDE bug, I believe that IDE applies best practice approach for how we should consume ADF libraries. There are few hints to keep in mind, when working with latest JDev release and consuming ADF libraries with ADF BC objects (specifically Application Modules) inside. &lt;b&gt;This applies only to those cases, when you are reusing Application Modules from ADF Libraries&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/ADFBCLibsSharedApp.zip"&gt;ADFBCLibsSharedApp.zip&lt;/a&gt;. This sample contains three ADF applications developed with JDev 11g R2 - SharedLibsApp (ADF BC reusable components), ADFBCLibsImportsApp (demo how to consume ADF BC libs on ViewController), ADFBCLibsImportsModelApp (demo how to consume ADF BC libs on Model).&lt;br /&gt;&lt;br /&gt;SharedLibsApp contains one project with reusable ADF BC objects and Application Module - LibModule, both packaged into reusable ADF library. This library is not referenced directly from other projects, but through RootLibModule AM (another project), which is also compiled into ADF library (same scenario as from blog mentioned above):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Cxu4OUwrCFg/TfOIMILtahI/AAAAAAAAFLI/_GkH8VQnH-8/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://3.bp.blogspot.com/-Cxu4OUwrCFg/TfOIMILtahI/AAAAAAAAFLI/_GkH8VQnH-8/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Root module library contains root Application Module, it nests modules from another ADF libraries:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NreMJVMCUnE/TfOIl8FHC1I/AAAAAAAAFLM/ASk0rL9Jf3w/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-NreMJVMCUnE/TfOIl8FHC1I/AAAAAAAAFLM/ASk0rL9Jf3w/s1600/2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Consumer application imports root module library:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-KWFLJd9yL1E/TfOIvWrktbI/AAAAAAAAFLQ/yaVq6a4O5Cw/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://2.bp.blogspot.com/-KWFLJd9yL1E/TfOIvWrktbI/AAAAAAAAFLQ/yaVq6a4O5Cw/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;However, what happens in newest JDev release in this scenario, for example when navigating through Page Definition elements (referenced from imported nested library through root module) - Data Control iterator is not found (this error is reported in the loop and practically kills JDev, you need restart). This happen for ADF apps implemented with previous JDev versions, its not current IDE bug:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3UFYtmGvvmo/TfOJMU9F6SI/AAAAAAAAFLU/IEZKOGEvSNo/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="194" src="http://4.bp.blogspot.com/-3UFYtmGvvmo/TfOJMU9F6SI/AAAAAAAAFLU/IEZKOGEvSNo/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;From project structure we can see, there is Library Dependency file - it points to these libraries not imported directly, but referenced from directly imported ones (in our case it points to adflibModelLib):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Y_SdatY7WW0/TfOJmJqoY6I/AAAAAAAAFLY/lcx8YsunIac/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-Y_SdatY7WW0/TfOJmJqoY6I/AAAAAAAAFLY/lcx8YsunIac/s320/5.png" width="236" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If we open Data Control tab and try to expand nested module, it also fails to be loaded:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-5_ioIUjH26Y/TfOLPhYhemI/AAAAAAAAFLc/ZE-ls4S2dgM/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-5_ioIUjH26Y/TfOLPhYhemI/AAAAAAAAFLc/ZE-ls4S2dgM/s1600/6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This clearly indicates that, ADF Library dependency fails to bring dependent library into context, its why we can't see it through Data Control.&lt;br /&gt;&lt;br /&gt;In order to fix this, you only need to add required library dependency directly:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SHBsWgwlszc/TfOLfH47whI/AAAAAAAAFLg/2FNubuAJKZA/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="172" src="http://1.bp.blogspot.com/-SHBsWgwlszc/TfOLfH47whI/AAAAAAAAFLg/2FNubuAJKZA/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now restart JDeveloper - good news JDev 11g R2 restarts really fast, so you don't need to wait that much as before.&lt;br /&gt;&lt;br /&gt;No ADF Library dependency file available anymore:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qeYK-z2cfgM/TfOL0SxLidI/AAAAAAAAFLk/XY-LE6YQxAs/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-qeYK-z2cfgM/TfOL0SxLidI/AAAAAAAAFLk/XY-LE6YQxAs/s320/8.png" width="259" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Data Control is constructed correctly this time:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-_u-CvQluwq4/TfOMLAzmR5I/AAAAAAAAFLo/VZggC7mhpdI/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-_u-CvQluwq4/TfOMLAzmR5I/AAAAAAAAFLo/VZggC7mhpdI/s1600/9.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Page Definition objects are loaded correctly as well and are accessible:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7t6GpHbSuLc/TfOMWhQEDoI/AAAAAAAAFLs/_tt8TkOkZYo/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://2.bp.blogspot.com/-7t6GpHbSuLc/TfOMWhQEDoI/AAAAAAAAFLs/_tt8TkOkZYo/s320/10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Page is loaded on runtime as well:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-689yjUM7M24/TfOMeLd1MPI/AAAAAAAAFLw/aIZO0j3POYY/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-689yjUM7M24/TfOMeLd1MPI/AAAAAAAAFLw/aIZO0j3POYY/s1600/11.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;This case is clear now, lets explore one more scenario - ADF library with ADF BC imports into Model project&lt;/b&gt;. Let say our ADF library contains two Application Modules:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ELCF8iN0Zu0/TfONE52bC3I/AAAAAAAAFL0/9RCWpUK9Mbg/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-ELCF8iN0Zu0/TfONE52bC3I/AAAAAAAAFL0/9RCWpUK9Mbg/s1600/12.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Library is imported into Model project and both Data Control instances are appearing correctly:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-1H4vsppIPLM/TfONMKObzwI/AAAAAAAAFL4/rjoR4B4f2Fw/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="http://3.bp.blogspot.com/-1H4vsppIPLM/TfONMKObzwI/AAAAAAAAFL4/rjoR4B4f2Fw/s320/13.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;However, once we enable ADF BC support for local Model project:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-K6gjT-4UlIs/TfOOAc9L2gI/AAAAAAAAFL8/Jr1L5yHXmFM/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://1.bp.blogspot.com/-K6gjT-4UlIs/TfOOAc9L2gI/AAAAAAAAFL8/Jr1L5yHXmFM/s320/14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Data Control instances are&amp;nbsp;disappearing:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-gwQC_P3FUSM/TfOOLD10t-I/AAAAAAAAFMA/Zt9dRgrMOrY/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-gwQC_P3FUSM/TfOOLD10t-I/AAAAAAAAFMA/Zt9dRgrMOrY/s320/15.png" width="263" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If we double check imported objects, both AM's are present:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-U_ehnl7kC1Y/TfOOoVmtWOI/AAAAAAAAFME/g84E3e-kXgo/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="274" src="http://2.bp.blogspot.com/-U_ehnl7kC1Y/TfOOoVmtWOI/AAAAAAAAFME/g84E3e-kXgo/s320/16.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It may look wrong for you, but I would assume its correct behavior in JDev 11g R2, even same was working in previous release. If we import AM instances into ADF BC Model project, it would not be a best practice to reference different AM's separately through Data Control - lots of database connections would be opened. Instead of exposing imported AM instances directly through Data Control, we can nest them into local AM:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-CuJKiqapTPg/TfOPNt0qePI/AAAAAAAAFMI/OnqAa5CL6DI/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-CuJKiqapTPg/TfOPNt0qePI/AAAAAAAAFMI/OnqAa5CL6DI/s320/17.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now both imported AM's are accesible from Data Control through root local AM:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Gi3_7E-9ooE/TfOPgKnXHiI/AAAAAAAAFMM/6p7msBFfrU4/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-Gi3_7E-9ooE/TfOPgKnXHiI/AAAAAAAAFMM/6p7msBFfrU4/s320/18.png" width="214" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you dont want badly to nest imported AM instances into local AM, there is still a trick you can apply - but I don't recommend it. You can open Model.jpx file and add imported AM instance there manually:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-oMa2H2zFwp0/TfOQLab8XNI/AAAAAAAAFMQ/_e0S_Lr4WkU/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://4.bp.blogspot.com/-oMa2H2zFwp0/TfOQLab8XNI/AAAAAAAAFMQ/_e0S_Lr4WkU/s320/19.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;However, this would be a bad practice - Model.jpx gets regenerated quite often automatically and you will loose your manual changes. And as I already explained, its good to nest imported AM's, to prevent large number of open database connections. When Model.jpx is changed manually, imported AM instance becomes visible - until Model.jpx is not regenerated by JDev:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-2Dhc56uhF_Q/TfOQc-BL0kI/AAAAAAAAFMU/O1PX87Va6SU/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-2Dhc56uhF_Q/TfOQc-BL0kI/AAAAAAAAFMU/O1PX87Va6SU/s320/20.png" width="255" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-6710810843015134957?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/6710810843015134957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=6710810843015134957' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6710810843015134957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6710810843015134957'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/06/adf-bc-application-module-data-control.html' title='ADF BC Application Module Data Control Hints for JDeveloper 11g R2 ADF Libraries'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Cxu4OUwrCFg/TfOIMILtahI/AAAAAAAAFLI/_GkH8VQnH-8/s72-c/1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-9080189480970509197</id><published>2011-06-07T22:58:00.001+02:00</published><updated>2011-12-30T14:50:22.992+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='WebCenter'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>WebCenter 11g PS3/PS4 Aggregating Multiple WebLogic LDAP Security Providers (Virtualize = True)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There is one tricky thing about WebCenter 11g PS3/PS4 services you should definitely know. Its related to WebLogic LDAP security providers. WebCenter always consumes only first WebLogic security provider from available providers list. Even SUFFICIENT flag is set for security provider, WebCenter still is using only first one. Thats sounds like a huge limitation, indeed it was before WebCenter 11g PS3/P4 - it was documented. But know situation is much better, we are not constrained anymore with only one single LDAP security provider configuration on WebLogic. I will describe in this blog post, how you can enable virtual aggregator for all defined security providers in WebLogic, so WebCenter will be able to retrieve user data from multiple LDAP servers. For additional info, I would recommend to read WebCenter Developer Guide - &lt;a href="http://download.oracle.com/docs/cd/E17904_01/webcenter.1111/e12405/wcadm_security_id_store.htm#WCADM8041"&gt;28.7 Aggregating Multiple Identity Store LDAP Servers Using libOVD&lt;/a&gt; and Oracle FMW Security Guide&amp;nbsp;&lt;a href="http://download.oracle.com/docs/cd/E21764_01/core.1111/e10043/idstoreadm.htm#BABFJIIA"&gt;7.3.1.1 Configuring Multi-LDAP Lookup&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sample application is based on WebCenter People Connections service - Profile:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-yLXpxMtzJDI/Te6MWidUixI/AAAAAAAAFKk/qOknYPKPj9s/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-yLXpxMtzJDI/Te6MWidUixI/AAAAAAAAFKk/qOknYPKPj9s/s1600/1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In case if we would authenticate with user from 2nd or 3rd LDAP security provider, WebCenter service would fail to retrieve user &lt;b&gt;larry&lt;/b&gt; information:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-oy7KScpM3cI/Te6MyOG6-VI/AAAAAAAAFKo/vRzyyNhsE_0/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="http://3.bp.blogspot.com/-oy7KScpM3cI/Te6MyOG6-VI/AAAAAAAAFKo/vRzyyNhsE_0/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;However as you can see, ADF authentication is completed successfully - this means security providers are configured correctly. ADF authentication works well, because first security provider is set to be SUFFICIENT, however same rule is not working for WebCenter services:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-r_YhJZHkLdk/Te6NMyUodeI/AAAAAAAAFKs/Um943ES6r-A/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="259" src="http://2.bp.blogspot.com/-r_YhJZHkLdk/Te6NMyUodeI/AAAAAAAAFKs/Um943ES6r-A/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;User &lt;b&gt;larry&lt;/b&gt; is defined inside StudentsProvider, however WebCenter is always using only first provider - ProffesorsProvider to look for users info:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-1OZjDmPr4S4/Te6NwKRmzZI/AAAAAAAAFKw/WG7mnnWd_fs/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://3.bp.blogspot.com/-1OZjDmPr4S4/Te6NwKRmzZI/AAAAAAAAFKw/WG7mnnWd_fs/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's fix this, according WebCenter PS3/PS4 and Oracle FMW Security documentation instructions. These instructions looks complex, but at the end it all fairly simple. Open Oracle FMW Enterprise Manager and select WebLogic domain, where your WebCenter application is deployed - wc_domain. From menu go to WebLogic Domain -&amp;gt; Security -&amp;gt; Security Provider Configuration:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-u4lR9_Th4hA/Te6PDdpLx-I/AAAAAAAAFK0/K5QpESZBf5E/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://3.bp.blogspot.com/-u4lR9_Th4hA/Te6PDdpLx-I/AAAAAAAAFK0/K5QpESZBf5E/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Expand Identity Store Provider and press Configure button:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-KlpnWA5ePTE/Te6PXNX-oxI/AAAAAAAAFK4/Lbbwt2AsErM/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="186" src="http://3.bp.blogspot.com/-KlpnWA5ePTE/Te6PXNX-oxI/AAAAAAAAFK4/Lbbwt2AsErM/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Add new property to Identity Store Configuration - &lt;b&gt;virtualize = true&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-AJH4Xmg2aSs/Te6Pv9_szEI/AAAAAAAAFK8/SNnoZCQp3K4/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="147" src="http://4.bp.blogspot.com/-AJH4Xmg2aSs/Te6Pv9_szEI/AAAAAAAAFK8/SNnoZCQp3K4/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This will virtually merge available security providers into one and WebCenter will be able to retrieve user information, no matter where it is defined.&lt;br /&gt;&lt;br /&gt;New property is successfully added, all security providers will be virtualized into one now - no matter what order is defined:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-C1ZWg1ohkls/Te6QT7BxjfI/AAAAAAAAFLA/8Ub8fMT6u9g/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="109" src="http://3.bp.blogspot.com/-C1ZWg1ohkls/Te6QT7BxjfI/AAAAAAAAFLA/8Ub8fMT6u9g/s320/8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Restart WebLogic server and here we go - we are cool again - user information is retrieved from LDAP, defined as second provider in the list:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ycppGB8dkig/Te6QiML_j8I/AAAAAAAAFLE/z5yTwhhTzXA/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="132" src="http://2.bp.blogspot.com/-ycppGB8dkig/Te6QiML_j8I/AAAAAAAAFLE/z5yTwhhTzXA/s320/9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Download sample application - &lt;a href="http://jdevsamples.googlecode.com/files/WebCenterUserProfileApp.zip"&gt;WebCenterUserProfileApp.zip&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-9080189480970509197?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/9080189480970509197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=9080189480970509197' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/9080189480970509197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/9080189480970509197'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/06/webcenter-11g-ps3ps4-aggregating.html' title='WebCenter 11g PS3/PS4 Aggregating Multiple WebLogic LDAP Security Providers (Virtualize = True)'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-yLXpxMtzJDI/Te6MWidUixI/AAAAAAAAFKk/qOknYPKPj9s/s72-c/1.png' height='72' width='72'/><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-6119535033137690475</id><published>2011-06-06T09:06:00.004+02:00</published><updated>2011-06-06T09:26:18.743+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Hard Core Advanced ADF Training - Last Minute Call</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There are only few seats left for &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;Hard Core Advanced ADF Training&lt;/b&gt;&lt;/span&gt; in &lt;a href="http://soacommunity.wordpress.com/2011/06/01/summer-camps-adf-bpm-webcenter/"&gt; Portugal on the 20th - 24th June with Frank Nimphius&lt;/a&gt;. Make sure you will not miss this event.&lt;br /&gt;&lt;br /&gt;If you are not scared of hard core training and ready to complete ADF exercises - this training is for you. No ADF newbies accepted - only customers/partners with ADF production systems.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://soacommunity.wordpress.com/2011/06/01/summer-camps-adf-bpm-webcenter/"&gt;Official training info from Juergen Kress&lt;/a&gt;:&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #555555; font-family: Arial, Tahoma, Verdana; font-size: 12px; line-height: 20px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 15px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;For Oracle Specialized partners who are working on the following projects / opportunities, we offer these advanced summer camps:&lt;a href="http://soacommunity.files.wordpress.com/2011/06/image.png" style="color: #008dcf; text-decoration: none;"&gt;&lt;img align="right" alt="image" border="0" height="286" src="http://soacommunity.files.wordpress.com/2011/06/image_thumb.png?w=247&amp;amp;h=286" style="border-bottom-style: none; border-bottom-width: 0px; border-color: initial; border-color: initial; border-left-style: none; border-left-width: 0px; border-right-style: none; border-right-width: 0px; border-top-style: none; border-top-width: 0px; border-width: initial; border-width: initial; display: inline; margin-left: 0px; margin-right: 0px; max-width: 100%;" title="image" width="247" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul style="list-style-type: square; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 15px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="list-style-type: square; margin-bottom: 0px; margin-left: 20px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://soacommunity.org/images/fileupload/bpm.doc"&gt;BPM Advanced training&lt;/a&gt;&lt;/li&gt;&lt;li style="list-style-type: square; margin-bottom: 0px; margin-left: 20px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://soacommunity.org/images/fileupload/adf.doc"&gt;ADF Advanced training&lt;/a&gt;&lt;/li&gt;&lt;li style="list-style-type: square; margin-bottom: 0px; margin-left: 20px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://soacommunity.org/images/fileupload/webcenter.doc"&gt;WebCenter Advanced training&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 15px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;All training sessions will be from HQ product management. The sessions will take place from June 20th until June 24th 2011 Lisbon – Portugal 2011. Participation is limited to two people per company. Registration is handled by first come first serve, please pay attention to the skill requirements, the pre-requisitions and the follow up! We will not accept people onto the training who do not match the criteria!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 15px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;b&gt;To receive future training invitation become a member in the SOA Partner Community: Visit and sign up for the SOA Community&amp;nbsp;&lt;a href="http://www.oracle.com/goto/emea/soa/index.html"&gt;www.oracle.com/goto/emea/soa&lt;/a&gt;&amp;nbsp;(&lt;a href="http://partner.oracle.com/"&gt;OPN account&lt;/a&gt;&amp;nbsp;required)&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5874979429188093780-6119535033137690475?l=andrejusb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrejusb.blogspot.com/feeds/6119535033137690475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5874979429188093780&amp;postID=6119535033137690475' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6119535033137690475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5874979429188093780/posts/default/6119535033137690475'/><link rel='alternate' type='text/html' href='http://andrejusb.blogspot.com/2011/06/hard-core-advanced-adf-training-last.html' title='Hard Core Advanced ADF Training - Last Minute Call'/><author><name>Andrejus Baranovskis</name><uri>http://www.blogger.com/profile/04468230464412457426</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_OSq71i5oy0c/TEz0YW_kjYI/AAAAAAAAEFc/jWab8rjHpWg/S220/pool.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5874979429188093780.post-4675901055229666298</id><published>2011-06-02T21:43:00.000+02:00</published><updated>2011-06-02T21:43:13.925+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='JDeveloper 11g'/><title type='text'>Understanding ADF BC View Object Instances</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Its quite easy topic, but sometimes is confusing, especially for ADF newbies. I will try to explain today, how View Object instance works and what you should know when using the same View Object instance across different ADF task flows.&lt;br /&gt;&lt;br /&gt;Sample application contains two bounded ADF task flows, both of them are referencing the same View Object instance - EmployeesView:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-x2k01fJo-Uo/Tefgd-LEX4I/AAAAAAAAFJw/zFO3zMgbSXQ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-x2k01fJo-Uo/Tefgd-LEX4I/AAAAAAAAFJw/zFO3zMgbSXQ/s320/1.png" width="226" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Same View Object instance is accessed programmatically as well, from custom Application Module method:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-sZRLSCOwi6c/Tefhd3-hGFI/AAAAAAAAFJ0/lGg8jOFk9lE/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="83" src="http://4.bp.blogspot.com/-sZRLSCOwi6c/Tefhd3-hGFI/AAAAAAAAFJ0/lGg8jOFk9lE/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As described above, Application Module is exposing single View Object instance:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PFvjr6jtils/TefiV8NjXqI/AAAAAAAAFJ4/wUyVr7b4aBo/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="146" src="http://3.bp.blogspot.com/-PFvjr6jtils/TefiV8NjXqI/AAAAAAAAFJ4/wUyVr7b4aBo/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is most typical mistake, when developers want to access the same View Object from different forms, they are assuming they can access the same View Object instance. However, this may be conflicting behavior.&lt;br /&gt;&lt;br /&gt;First ADF task flow is loaded, first record is shown:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-z4Ua4pcJ0so/TefixOSF4HI/AAAAAAAAFJ8/5V6jb9ZXKLI/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-z4Ua4pcJ0so/TefixOSF4HI/AAAAAAAAFJ8/5V6jb9ZXKLI/s320/4.png" width="282" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Open second tab, to load second ADF task flow and filter data for First Name:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-no8oAmC3cwU/TefjJIjFGhI/AAAAAAAAFKA/oU7FKpV06RA/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="99" src="http://2.bp.blogspot.com/-no8oAmC3cwU/TefjJIjFGhI/AAAAAAAAFKA/oU7FKpV06RA/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Go back to first tab - open first ADF task flow, data will be filtered as well:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fdc6yK_8X10/TefjqUyDCnI/AAAAAAAAFKE/cUy0EfSuXL8/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-fdc6yK_8X10/TefjqUyDCnI/AAAAAAAAFKE/cUy0EfSuXL8/s320/6.png" width="294" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This means, even we are using two different ADF task flows - same View Object instance is sharing same data.&lt;br /&gt;&lt;br /&gt;Custom method from Application Module is returning same results, View Instance is filtered and first row is not pointing anymore to original first row:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-4wgJH3n3TnY/Tefj9BiEbbI/AAAAAAAAFKI/af50AShvVJ4/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://3.bp.blogspot.com/-4wgJH3n3TnY/Tefj9BiEbbI/AAAAAAAAFKI/af50AShvVJ4/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Let's fix this data conflict behavior and add one more same View Object instance into Data Control:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-HzEZO2s4IvQ/Tefkcd3
