<?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-6617076936068378384</id><updated>2012-01-30T21:37:44.424-08:00</updated><title type='text'>Chandu Bhavsar's Oracle ADF Blog</title><subtitle type='html'>Discussing frontiers of Oracle ADF technology not discussed elsewhere</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-3405600874161059432</id><published>2009-04-16T23:42:00.000-07:00</published><updated>2009-07-20T15:36:45.695-07:00</updated><title type='text'>Partial Page (PPR) Navigation</title><content type='html'>&lt;p/&gt;&lt;i&gt;Continuing with the theme of few past posts of examining PPR related topics:&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
This post examines a very cool functionality new in 11g called &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_ppr.htm#BGBICEHC"&gt;PPR navigation&lt;/a&gt;, about which I haven't noticed much mention elsewhere. The fundamentals of working with navigation components in ADF (which derives the functionality from JSF) are explained &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_navigate.htm"&gt;here&lt;/a&gt;. PPR navigation triggers navigation through a PPR request, which means the client does not leave the original page even with a navigation request.&lt;br /&gt;
&lt;br /&gt;
Since the &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_ppr.htm#BGBICEHC"&gt;documentation for PPR navigation&lt;/a&gt; is precise, what this blog post attempts to do is illustrate the functionality with small sample workspaces for all 3 options for this PPR Navigation option. Each of these workspaces contains an app with 2 pages, each with a command navigation button, which navigate back and forth between the pages. This is an extremely simple usecase application, the point being to illustrate only this configuration option; rather than as part of some elaborate application.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;PPR Navigation off : &lt;a href="http://sites.google.com/site/cbhavsarblog/Home/PPRNavigationOff.zip"&gt;Sample workspace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;The behaviour in this case is as with regular JSF navigation, in which the client actually switches from page to page with each navigation request. Note that altering partialSubmit attribute to true or false for command components involved in navigation has no impact on the behaviour with this option.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;PPR Navigation on : &lt;a href="http://sites.google.com/site/cbhavsarblog/Home/PPRNavigationOn.zip"&gt;Sample workspace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;This is the cool behaviour. For example, run a JSPX page such as untilted1.jspx from this app, and repeatedly click on the command navigation buttons, such that contents of untitled1.jspx and untitled2.jspx keep getting displayed; all the while the browser title stays on untitled1.jspx. As stated in the &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_ppr.htm#BGBICEHC"&gt;documentation&lt;/a&gt;, partialSubmit must be set to true for any command components involved in navigation. In the sample workspace, this is true for both command navigation buttons.&lt;br /&gt;
&lt;br /&gt;
What's more, this functionality uses the hash portion of URL, such as examples below. This means it is even possible to bookmark individual pages of the application this way.&lt;br /&gt;
&lt;br /&gt;
#%2Funtitled1.jspx%20%3F_adf.ctrl-state%3D38iv9zp5j_3&lt;br /&gt;
#%2Funtitled2.jspx%20%3F_adf.ctrl-state%3D38iv9zp5j_3&lt;br /&gt;
&lt;br /&gt;
Very cool indeed!&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;PPR Navigation onWithForcePPR : &lt;a href="http://sites.google.com/site/cbhavsarblog/Home/PPRNavigationOnWithForcePPR.zip"&gt;Sample workspace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;With this option, if a command component action is navigation, it automatically does navigation using PPR (as if the option was set to "on"). This is true irrespective of the value of partialSubmit attribute set for those components. In fact, in order to drive home the point I explicitly set partialSubmit to false for both buttons in my app; and even then with this option the application behaves with PPR navigation. Pay special attention to the &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_ppr.htm#sthref103"&gt;documentation notes&lt;/a&gt; for this option for other cases.&lt;p/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-3405600874161059432?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/3405600874161059432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=3405600874161059432' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/3405600874161059432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/3405600874161059432'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2009/04/partial-page-ppr-navigation.html' title='Partial Page (PPR) Navigation'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-4622755372238831957</id><published>2009-04-03T02:38:00.000-07:00</published><updated>2009-06-16T16:06:21.109-07:00</updated><title type='text'>Evaluating EL expressions with ADF declarative debugger</title><content type='html'>&lt;p/&gt;&lt;i&gt;I've been meaning to blog about this for quite a while, and finally found the time for it.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
ADF in 11g includes a new, very powerful declarative debugger which has been &lt;a href="http://blogs.oracle.com/DavidGiammona/2008/11/introducing_the_new_adf_declar_1.html"&gt;blogged about elsewhere&lt;/a&gt; and &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31974/web_testdebug.htm#CEGCBDJD"&gt;documented in the application developer's guide&lt;/a&gt;. This is a great developer productivity improvement tool. The guide contains &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31974/web_testdebug.htm#CEGDBFGG"&gt;section documenting setting declarative breakpoints&lt;/a&gt; and a &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31974/web_testdebug.htm#BABCBCDG"&gt;dedicated subsection explaining evaluation of EL expressions in the declarative debugger&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
What I intend to do with this post over and above this good information, is provide supplementary illustrations specifically for evaluating EL expressions. For example, consider a rich tree component such as follows. Depending on the tree node being selected, screenshots are presented evaluating various EL expressions based on the node variable. As the screenshots illustrate, this capability to evaluate EL expressions is very cool, a great developer productivity boost indeed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:tree value="#{bindings.DivisionsVO1.treeModel}" var="node"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rowSelection="single" displayRow="selected" id="t1"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;f:facet name="nodeStamp"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:switcher facetName="#{node.hierType.viewDefName}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; defaultFacet="dummy" id="s1"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;f:facet name="dummy"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:outputText value="Dummy Text" id="ot1"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/f:facet&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;f:facet name="model.view.DivisionsVO"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:commandLink actionListener="#{bindings.DivisionsExecuteWithParams.execute}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text="#{node.Description}" disabled="false"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id="cl1"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:setPropertyListener from="#{node.hierType.viewDefName}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; to="#{sessionScope.viewDefName}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type="action"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/af:commandLink&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/f:facet&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;f:facet name="model.view.ProductGroupsVO"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:commandLink actionListener="#{bindings.ProductGroupsExecuteWithParams.execute}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text="#{node.Description}" disabled="false"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id="cl2"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:setPropertyListener from="#{node.hierType.viewDefName}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; to="#{sessionScope.viewDefName}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type="action"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/af:commandLink&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/f:facet&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;f:facet name="model.view.TopLevelSpecsVO"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:commandLink actionListener="#{bindings.SpecsExecuteWithParams.execute}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text="#{node.Description}" disabled="false"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id="cl6"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:setPropertyListener from="#{node.Type}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; to="#{sessionScope.viewDefName}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type="action"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/af:commandLink&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/f:facet&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;f:facet name="model.view.SpecsVO"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:commandLink actionListener="#{bindings.SpecsExecuteWithParams.execute}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text="#{node.Description}" disabled="false"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id="cl7"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;af:setPropertyListener from="#{node.Type}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; to="#{sessionScope.viewDefName}"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type="action"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/af:commandLink&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/f:facet&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/af:switcher&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/f:facet&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/af:tree&amp;gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_jz1UAHfetGI/SdXWlYk_l7I/AAAAAAAAAEA/QufM4qLWXNU/s1600-h/debug1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_jz1UAHfetGI/SdXWlYk_l7I/AAAAAAAAAEA/QufM4qLWXNU/s400/debug1.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;p/&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;/div&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;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_jz1UAHfetGI/SdXWnJRSnsI/AAAAAAAAAEI/pldqo-k9hIo/s1600-h/debug2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_jz1UAHfetGI/SdXWnJRSnsI/AAAAAAAAAEI/pldqo-k9hIo/s400/debug2.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;p/&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;/div&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;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_jz1UAHfetGI/SdXWoyaQodI/AAAAAAAAAEQ/kT4X_VBcVqw/s1600-h/debug3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_jz1UAHfetGI/SdXWoyaQodI/AAAAAAAAAEQ/kT4X_VBcVqw/s400/debug3.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_jz1UAHfetGI/SdXWqG0NBQI/AAAAAAAAAEY/JcqpOah47hk/s1600-h/debug4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_jz1UAHfetGI/SdXWqG0NBQI/AAAAAAAAAEY/JcqpOah47hk/s400/debug4.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_jz1UAHfetGI/SdXWrsftaAI/AAAAAAAAAEg/1l8v_CihyJY/s1600-h/debug5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_jz1UAHfetGI/SdXWrsftaAI/AAAAAAAAAEg/1l8v_CihyJY/s400/debug5.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_jz1UAHfetGI/SdXWtN44cKI/AAAAAAAAAEo/BP3peYRJiFU/s1600-h/debug6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_jz1UAHfetGI/SdXWtN44cKI/AAAAAAAAAEo/BP3peYRJiFU/s400/debug6.png" /&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/6617076936068378384-4622755372238831957?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/4622755372238831957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=4622755372238831957' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/4622755372238831957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/4622755372238831957'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2009/04/evaluating-el-expressions-with-adf.html' title='Evaluating EL expressions with ADF declarative debugger'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jz1UAHfetGI/SdXWlYk_l7I/AAAAAAAAAEA/QufM4qLWXNU/s72-c/debug1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-5873873917668791748</id><published>2009-03-23T16:56:00.000-07:00</published><updated>2009-04-09T01:43:15.289-07:00</updated><title type='text'>Rationale behind ADF Faces isInitialRender flag deprecation</title><content type='html'>&lt;p/&gt;&lt;i&gt;To those who might've been visiting my blog over past few months:&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;I'm back after a long break. I had some health issues which needed to be taken care of in late November and most of December 2008. And since then, I had gotten incredibly busy with day-to-day work that left no time for blogging. So much so, that I didn't even have time to visit my own blog page to find out visitor patterns, check for user comments etc. I notice that the first user comment for this blog had been posted back in December 2008, which I haven't had chance to reply to. Hope to get to it very soon.&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Now that that's out of the way, the purpose of this post was to explain one of the points which had been touched upon in an &lt;a href="http://cbhavsar.blogspot.com/2008/11/programmatically-determining-whether.html"&gt;earlier post of mine&lt;/a&gt;. In it, I mentioned &lt;a href="http://www.oracle.com/technology/products/adf/adffaces/11/doc/adf-richclient-api/apidocs/oracle/adf/view/rich/context/AdfFacesContext.html#isInitialRender%28%29"&gt;AdfFacesContext function isInitialRender&lt;/a&gt; not functioning correctly, notwithstanding its usage discouraged in the Javadoc.&lt;br /&gt;
&lt;br /&gt;
I finally got to the bottom of why its usage is discouraged, why it doesn't work as per Javadoc description and why it doesn't matter. One sentence summary is:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;DO NOT USE THIS FUNCTION!!!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Not only is it deprecated, it doesn't work and shouldn't be expected to work. What is that all about, why is this function there in the first place? I am cutting and pasting the reasoning I received from the authoritative source behind this (as much as possible quoting verbatim, with slight contextual modifications):&lt;br /&gt;
&lt;p/&gt;&lt;div style="color: blue; font-family: Arial,Helvetica,sans-serif;"&gt;ADF doesn't have any available method to know that you are rendering a page or page fragment for the first time. Instead, it is recommended that the user use task flow method-call activities to accomplish any kind of "initial render" setup before forwarding the page for rendering. The complication is that if you have UI components in the page that perform lazy data fetching, the page will actually render using two separate HTTP requests (one for the initial page, and another one for the lazy data fetch). There is no way that ADF Faces currently exposes to detect if you are in the "lazy data fetch" request. So, in general there is no way to know if a page or page fragment is being rendered the first time.&lt;/div&gt;&lt;br /&gt;
There you have it. Reiterating: Do not use the &lt;a href="http://www.oracle.com/technology/products/adf/adffaces/11/doc/adf-richclient-api/apidocs/oracle/adf/view/rich/context/AdfFacesContext.html#isInitialRender%28%29"&gt;isInitialRender()&lt;/a&gt; function.&lt;p/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-5873873917668791748?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/5873873917668791748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=5873873917668791748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/5873873917668791748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/5873873917668791748'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2009/03/adf-faces-isinitialrender-flag-is.html' title='Rationale behind ADF Faces isInitialRender flag deprecation'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-5001995598263844035</id><published>2008-11-17T16:16:00.000-08:00</published><updated>2009-06-16T16:01:30.095-07:00</updated><title type='text'>Programmatically determining whether a request is a PPR request</title><content type='html'>&lt;p/&gt;&lt;p&gt;This post examines a very simple programmatic technique for determining whether a specific ADF Faces request is a non-PPR request or coming through a PPR. It is supported through a single call &lt;a href="http://www.oracle.com/technology/products/adf/adffaces/11/doc/adf-richclient-api/apidocs/oracle/adf/view/rich/context/AdfFacesContext.html#isPartialRequest%28javax.faces.context.FacesContext%29"&gt;isPartialRequest in class AdfFacesContext&lt;/a&gt;, and &lt;a href="http://sites.google.com/site/cbhavsarblog/Home/pprTest.zip"&gt;a small workspace illustrating this functionality&lt;/a&gt; is provided.&lt;/p&gt;&lt;p/&gt;&lt;p&gt;I was in fact planning to provide a testcase in this sample, illustrating use of related function &lt;a href="http://www.oracle.com/technology/products/adf/adffaces/11/doc/adf-richclient-api/apidocs/oracle/adf/view/rich/context/AdfFacesContext.html#isInitialRender%28%29"&gt;isInitialRender in class AdfFacesContext&lt;/a&gt; as well. That function is supposed to determine whether an ADF Faces request is the first request to render a page. Javadoc for that function strongly discourages using it directly, or its exposure as an EL variable. Notwithstanding this strong discouragement, I did not quite get it to work as expected. Either it is broken, or I'm missing something obvious about it and need clarification. Anyway, I will blog about it later separately, as and when I understand the reason for "incorrect" behaviour.&lt;/p&gt;&lt;p/&gt;&lt;p&gt;&lt;i&gt;If you stumbled upon this post searching for how to enable PPR programmatically instead, information for that is available &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_ppr.htm#BABGAGIH"&gt;here&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-5001995598263844035?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/5001995598263844035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=5001995598263844035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/5001995598263844035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/5001995598263844035'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2008/11/programmatically-determining-whether.html' title='Programmatically determining whether a request is a PPR request'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-7361981530472525773</id><published>2008-11-17T00:12:00.000-08:00</published><updated>2008-11-17T00:27:23.939-08:00</updated><title type='text'>ADF Best Practices Guide (Update to Pros and cons of various ADF configuration alternatives)</title><content type='html'>&lt;p/&gt;&lt;p&gt;As promised in &lt;a href="http://cbhavsar.blogspot.com/2008/10/pros-and-cons-of-various-adf.html"&gt;the earlier post on this blog about this topic&lt;/a&gt;, I have been poking around for more material. I came across this very well written document, which many will find useful:&lt;/p&gt;&lt;p/&gt;&lt;p&gt;&lt;a href="http://www.oracle.com/technology/products/jdev/collateral/4gl/papers/Introduction_Best_Practices.pdf"&gt;An Introduction to Oracle ADF Best Practices&lt;/a&gt;&lt;/p&gt;&lt;p/&gt;&lt;p&gt;Note however that this document was published more than 2 years ago. I'm sure the application developer community has learnt more about various configuration choices since then. As of now, I am not aware if any such updates have been distilled, or even whether any plans for update to this document are in the works. I'll try to find more information on this, and post an update here once I know anything concrete. Stay tuned.&lt;/p&gt;&lt;p/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-7361981530472525773?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/7361981530472525773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=7361981530472525773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/7361981530472525773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/7361981530472525773'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2008/11/adf-best-practices-guide-update-to-pros.html' title='ADF Best Practices Guide (Update to Pros and cons of various ADF configuration alternatives)'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-5988558412753142382</id><published>2008-11-10T02:56:00.000-08:00</published><updated>2009-06-16T16:11:23.524-07:00</updated><title type='text'>View scoped managed beans</title><content type='html'>&lt;p/&gt;This post examines a new scope for managed beans introduced in ADF 11 called "View Scope." &lt;a href="http://technology.amis.nl/blog/3210/easy-implementation-of-viewscope-or-pagescope-in-javaserver-faces-jsf-1x"&gt;In fact, going back to ADF 10, different users have attempted to implement their own viewScope such as this.&lt;/a&gt; I have personally been familiar with this new scope for quite a while (well, having been the guy responsible for requirement which led to its official implementation, since its inception) and I referred to it in &lt;a href="http://cbhavsar.blogspot.com/2008/10/pros-and-cons-of-various-adf.html"&gt;one of my earlier posts on this blog&lt;/a&gt;.&lt;p/&gt;As explained in the documentation for &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_lifecycle.htm#CHDGGGBI"&gt;object scope lifecycles&lt;/a&gt; and &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31974/adf_lifecycle.htm#CHDGGGBI"&gt;Fusion page lifecycle&lt;/a&gt;, an object with lifecycle scope of viewScope is available until the ID for current view changes.&lt;p/&gt;However, the note in both of these sections as of right now which states that "you cannot register a managed bean to this scope" is incorrect. I'm attaching &lt;a href="http://sites.google.com/site/cbhavsarblog/Home/scopeDebug.zip"&gt;a sample workspace which in fact illustrates the use of managed bean(s) registered with viewScope (along with couple of other scopes - pageFlowScope and requestScope)&lt;/a&gt;. What you cannot do with viewScope unlike standard JSF scopes is to refer to managed beans registered with this scope with an EL syntax like &lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;#{myViewScopedManagedBean.foo}&lt;/span&gt;. You must use syntax explicitly dereferencing viewScope, such as &lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;#{viewScope.myViewScopedManagedBean.foo}&lt;/span&gt;. &lt;a href="http://sites.google.com/site/cbhavsarblog/Home/scopeDebug.zip"&gt;The sample workspace I attached&lt;/a&gt; illustrates this.&lt;p/&gt;Another important section to pay attention to, in general for &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31974/web_getstarted.htm#BABBHGJA"&gt;understanding where managed beans with various scopes should be registered and the effect this placement has on their behaviour is in table 18-1 here&lt;/a&gt;. Specifically, when intending to use view scoped managed beans in a task flow, they must be registered in the task flow definition file and not adfc-config.xml.&lt;p/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-5988558412753142382?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/5988558412753142382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=5988558412753142382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/5988558412753142382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/5988558412753142382'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2008/11/view-scoped-managed-beans.html' title='View scoped managed beans'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-7709164404707092976</id><published>2008-10-14T13:55:00.000-07:00</published><updated>2009-06-16T15:53:15.829-07:00</updated><title type='text'>Using af:commandImageLink inside af:toolbar</title><content type='html'>&lt;p/&gt;I just discovered a cool thing about the af:commandImageLink component, which I haven't seen explicitly documented. At least, &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_navigate.htm#BABBDDEG"&gt;the application developer's guide&lt;/a&gt; doesn't mention it, nor have I seen it in other blogs or code samples, so here goes. &lt;p/&gt;The commandImageLink component can be included as part of an af:toolbar component as well. The &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_menu.htm#CDEDAHJG"&gt;section about toolbars in application developer's guide&lt;/a&gt; seems to mention usage of toolbar buttons as well as commandButton and commandLink inside them. Specifically, refer to following tip from that section: &lt;p/&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Toolbars can also include command buttons and command links instead of toolbar buttons. However, toolbar buttons provide additional functionality, such as opening popup menus. &lt;p/&gt;af:commandButton can also be associated with an optional icon. But, af:commandImageLink provides additional capability of optionally associating different icons on hover and depressed events. This functionality of potentially associating with 3 different icons can also be used with af:commandToolbarButton. As explained in the tip above, toolbar buttons come with extra potential functionality of popup menus. For users who don't care about extra baggage of popup menus, but desire a lightweight option inside af:toolbar (and potentially desire the option of being associated with multiple icons based on state), an alternative exists with af:commandImageLink. &lt;p/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-7709164404707092976?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/7709164404707092976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=7709164404707092976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/7709164404707092976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/7709164404707092976'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2008/10/using-afcommandimagelink-inside.html' title='Using af:commandImageLink inside af:toolbar'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-7179514530616800296</id><published>2008-10-09T02:29:00.000-07:00</published><updated>2008-10-15T00:18:35.370-07:00</updated><title type='text'>Multiple ways of specifying width for af:table and precedence rules</title><content type='html'>&lt;p/&gt;This post is about a minor functional idiosyncrasy I discovered while working on another problem. In fact, it is a corollary of configuration posted for &lt;a href="http://cbhavsar.blogspot.com/2008/10/using-panelcollection-with-master.html"&gt;an earlier blog entry&lt;/a&gt;.
&lt;p/&gt;
The issue is that af:table has a dedicated attribute called width for specifying the width of the table. But like all other ADF Faces components, it also has an inlineStyle attribute which can be used for specifying the width (along with many other style settings). There is a slight difference in the syntax for specification for each of these, e.g. width="100%" as opposed to inlineStyle="width:100%;". Well, these can potentially be conflicting settings. If both of them are specified, which one is the real setting and what are the precedence rules? By doing a quick test, the functional specification for precedence is:

&lt;ul&gt;&lt;li&gt;If width is specified through both "width" and "inlineStyle" settings, the "width" setting takes precedence and any width specified through inlineStyle is ignored.&lt;/li&gt;&lt;li&gt;Value in inlineStyle="width:whatever;" is only looked at, if no value specified in "width'".
&lt;/li&gt;&lt;/ul&gt;Simple enough. But I'm afraid I haven't seen it functionally specified explicitly like this anywhere else, hence worth calling it out here with a dedicated post.&lt;p/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-7179514530616800296?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/7179514530616800296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=7179514530616800296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/7179514530616800296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/7179514530616800296'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2008/10/multiple-ways-of-specifying-width-for.html' title='Multiple ways of specifying width for af:table and precedence rules'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-9044253859167820450</id><published>2008-10-08T12:33:00.000-07:00</published><updated>2010-03-31T17:25:33.854-07:00</updated><title type='text'>Using af:panelCollection with master-detail tables</title><content type='html'>&lt;p/&gt;&lt;p&gt;af:panelcollection is an aggregation component over components such as tree, table, treeTable for the purpose of standardizing menus, toolbars etc. I recently ran into some specific layout issues when using panelCollection with tables in a master-detail layout, which I feel are worth blogging.&lt;/p&gt;&lt;p/&gt;&lt;p&gt;Master-detail tables are typically shown one underneath another inside a panelGroupLayout component with vertical layout. With the default design-time configuration settings, I discovered that the layout for the detail table looked just plain ugly. Irrespective of any width and/or columnStretching attributes specified on the detail table, it looked squished with a forced horizontal scrollbar. My first instinct for fixing this was to surround the panelCollection inside a panelStretchLayout, thinking that its lack of stretchability inside panelGroupLayout was what was contributing to its ugliness. Unfortunately, playing around with all sorts of config settings with a panelStrechLayout thrown in ended up as a futile exercise. I must have spent close to a day poring over various component configuration documentations, trying different permutations and scratching my head wondering why none of them were working. Various conflicting constraints/conditions I was struggling with were:&lt;/p&gt;&lt;p/&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt;panelStretchLayout should not be included inside panelGroupLayout as a general rule of thumb (unless specifying sizes in fixed pixels which typically shouldn't be done for applications to preserve browser compatibility) &lt;/li&gt;
&lt;li&gt;panelGroupLayout layout=vertical can be included inside panelStretchLayout&lt;/li&gt;
&lt;li&gt;panelCollection can be stretched inside a strechable parent, however if inside a panelGroupLayout, it won't be stretchable&lt;/li&gt;
&lt;li&gt;af:table will fill up inside panelCollection if columnStretching specified&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;p/&gt;&lt;p&gt;In the end, the solution I ended up with is far simpler, almost of the "duh!" variety. It was told to me by someone with prior knowledge of having worked with this use case. I haven't seen it well documented anywhere I searched, and feel it's worth blogging here, with the hope that it will save few hours for someone in the future. The key to the solution is that it does away with panelStretchLayout altogether, and specifies a width of 100% on both the panelCollection and contained table. That's it, it's that simple!! Here is an example layout:&lt;/p&gt;&lt;p/&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_jz1UAHfetGI/SO3G4HEJ5rI/AAAAAAAAADg/YcdQqzvChFk/s1600-h/master-detail-panelCollection.bmp" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5255075007482685106" src="http://1.bp.blogspot.com/_jz1UAHfetGI/SO3G4HEJ5rI/AAAAAAAAADg/YcdQqzvChFk/s320/master-detail-panelCollection.bmp" style="cursor: pointer; float: left; margin: 0pt 10px 10px 0pt;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p/&gt;&lt;p&gt;&lt;pre class="xml" name="code"&gt;&amp;lt;?xml version='1.0' encoding='US-ASCII'?&amp;gt;
&amp;lt;jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich"&amp;gt;
  &amp;lt;jsp:directive.page contentType="text/html;charset=US-ASCII"/&amp;gt;
  &amp;lt;f:view&amp;gt;
    &amp;lt;af:document&amp;gt;
      &amp;lt;af:form&amp;gt;
        &amp;lt;af:panelGroupLayout layout="vertical"&amp;gt;
          &amp;lt;af:panelHeader text="Divisions"&amp;gt;
            &amp;lt;f:facet name="context"/&amp;gt;
            &amp;lt;f:facet name="menuBar"/&amp;gt;
            &amp;lt;f:facet name="toolbar"/&amp;gt;
            &amp;lt;f:facet name="legend"/&amp;gt;
            &amp;lt;f:facet name="info"/&amp;gt;
            &amp;lt;af:panelCollection inlineStyle="width:100%;"&amp;gt;
              &amp;lt;f:facet name="menus"/&amp;gt;
              &amp;lt;f:facet name="toolbar"/&amp;gt;
              &amp;lt;f:facet name="statusbar"/&amp;gt;
              &amp;lt;af:table var="row" width="100%" columnStretching="last"&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col1"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col1}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col2"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col2}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col3"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col3}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col4"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col4}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col5"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col5}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
              &amp;lt;/af:table&amp;gt;
            &amp;lt;/af:panelCollection&amp;gt;
          &amp;lt;/af:panelHeader&amp;gt;
          &amp;lt;af:panelHeader text="Product Groups"&amp;gt;
            &amp;lt;f:facet name="context"/&amp;gt;
            &amp;lt;f:facet name="menuBar"/&amp;gt;
            &amp;lt;f:facet name="toolbar"/&amp;gt;
            &amp;lt;f:facet name="legend"/&amp;gt;
            &amp;lt;f:facet name="info"/&amp;gt;
            &amp;lt;af:panelCollection inlineStyle="width:100%;"&amp;gt;
              &amp;lt;f:facet name="menus"/&amp;gt;
              &amp;lt;f:facet name="toolbar"/&amp;gt;
              &amp;lt;f:facet name="statusbar"/&amp;gt;
              &amp;lt;af:table var="row" columnStretching="last" width="100%"&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col1"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col1}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col2"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col2}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col3"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col3}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col4"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col4}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col5"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col5}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col6"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col6}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col7"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col7}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
                &amp;lt;af:column sortable="false" headerText="col8"&amp;gt;
                  &amp;lt;af:outputText value="#{row.col8}"/&amp;gt;
                &amp;lt;/af:column&amp;gt;
              &amp;lt;/af:table&amp;gt;
            &amp;lt;/af:panelCollection&amp;gt;
          &amp;lt;/af:panelHeader&amp;gt;
        &amp;lt;/af:panelGroupLayout&amp;gt;
      &amp;lt;/af:form&amp;gt;
    &amp;lt;/af:document&amp;gt;
  &amp;lt;/f:view&amp;gt;
&amp;lt;/jsp:root&amp;gt;
&lt;/pre&gt;&lt;/p&gt;&lt;p/&gt;&lt;p&gt;I have seen some other proposed solution elsewhere, which has deeply nested panelStrechLayout elements. Instead of using a vertical panelGroupLayout, it uses a panelAccordian and showDetailItem. A visible disadvantage of such approach is that the text for showDetailItem adds yet another unnecessary title to the master-detail layout. Even if such text is omitted, the presence of showDetailItem is waste of unnecessary real estate. From a pure configuration perspective, such solution seems a bit convoluted to me due to the multiple levels of nested panelStretchLayout components. The approach presented here is far simpler.&lt;/p&gt;&lt;p/&gt;&lt;p&gt;Check out &lt;a href="http://www.oracle.com/technology/products/adf/patterns/11/layoutBestPractices.html"&gt;general guidelines on best practices for layout design&lt;/a&gt;.&lt;/p&gt;&lt;p/&gt;&lt;p&gt;Also, &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_orgpage.htm#CACHIIAE"&gt;section 8.2.2 "Nesting Components Inside Components That Allow Stretching" from application developer's guide&lt;/a&gt; is worth going over.&lt;/p&gt;&lt;p/&gt;&lt;p&gt;&lt;i&gt;Also see couple of latest layout guides:&lt;br /&gt;
&lt;p&gt;&lt;a href="http://www.oracle.com/technology/products/adf/patterns/11/fccppattern.html"&gt;Layout Pattern: Common Component in Form&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.oracle.com/technology/products/adf/patterns/11/thlfrpattern.html"&gt;Layout Pattern: Table with Header Left, Footer Right&lt;/a&gt;&lt;/p&gt;&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Note that this trick of inlineStyle="width:100%;" cannot be arbitrarily applied to any component to force them to stretch. In particular, pay special attention to following tip from section 8.2.2 from above link:&lt;/p&gt;&lt;p/&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Tip:&lt;/span&gt;  Do not attempt to stretch any of the components in the list of components that cannot stretch by setting their width to 100%. You may get unexpected results. As stated previously, if you need one of these components to stretch, you need to wrap them in a component that can be stretched.&lt;/p&gt;&lt;p/&gt;&lt;p&gt;Since panelCollection is a component that can stretch, above tip does not apply to it in the presented sample. However, such inlineStyle configuration cannot be applied to other non-stretchable components such as panelBox.&lt;/p&gt;&lt;p/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-9044253859167820450?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/9044253859167820450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=9044253859167820450' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/9044253859167820450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/9044253859167820450'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2008/10/using-panelcollection-with-master.html' title='Using af:panelCollection with master-detail tables'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jz1UAHfetGI/SO3G4HEJ5rI/AAAAAAAAADg/YcdQqzvChFk/s72-c/master-detail-panelCollection.bmp' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-946729478674801814</id><published>2008-10-07T00:37:00.000-07:00</published><updated>2008-10-30T02:24:32.176-07:00</updated><title type='text'>Pros and cons of various ADF configuration alternatives</title><content type='html'>&lt;p/&gt;Since summer, one of the common themes I've been thinking about while wearing the "application developer hat" is: ability in Oracle ADF to achieve identical functionality with multiple configuration settings. Since ADF is a very feature rich platform and encompasses multiple technology stacks, it is natural that there is overlap of functionality among different configuration approaches. While existing knowledge base is fairly solid w.r.t. documentation of functionality for specific configurations, I haven't found a lot of discussion about pros and cons of different configurations offering identical functionality. The question which has been fascinating me for past 2-3 months is: "If I'm an application developer new to ADF platform, when faced with multiple configuration alternatives, how do I decide which one to choose? What are the pros and cons of the different options?"
&lt;p&gt;
Case in point, &lt;a href="http://cbhavsar.blogspot.com/2008/09/declarative-databinding-for-lazy.html"&gt;one of my earlier posts here&lt;/a&gt;.
&lt;p&gt;
I present pros and cons of 2 approaches for the functionality of building RichTree for the SPECS object in that post.
&lt;ul&gt;&lt;li&gt;write custom managed bean returning TreeModel using a complex hierarchical query&lt;/li&gt;&lt;li&gt;build multiple VOs and declarative databinding using non-hierarchical queries&lt;/li&gt;&lt;/ul&gt;I had to spend time building the alternate approaches and examine the pros and cons for myself. Here are few other design problems:

&lt;ol&gt;&lt;li&gt;For communication among UI components in different regions on the same view, one can choose to use the producer/consumer communication model offered by contextual events. On the other hand, one can use a view scoped managed bean to set and get the payload being communicated, use an EL expression directly accessing the state of the managed bean e.g. &lt;span style="font-family:courier new;font-size:85%;"&gt;#{viewScope.myCommunicationBean.payLoad}&lt;/span&gt; and use PPR among the different UI components for synchronization. The first approach is more declarative, however without spending time doing more experiments, it is not possible for an application developer to determine offhand if the second approach provides some other benefits. For example, maybe memory footprint or performance effiiciency?? I don't know the answer simply based on black-box knowledge of these functionalities.&lt;/li&gt;&lt;li&gt;Consider an application with 2 regions in a view - a tree on the left hand side, and master-detail on right hand side based on hierarchy type of node selection in the tree on left. One option heavy on declarative design-time would be using an af:switcher on the tree node based on its hierarchy type, and use different action links in each switch clause to generate payload for communication on right hand side. Another option would be a single tree node type with a single managed bean method as node selection listener. The selection listener could implement payload generation logic using a Java switch clause. Using the logic that a declarative solution provided by tooling should always be preferred as much as possible over one requiring writing custom managed bean code, the first option wins hands down. After all, the objective should be to minimize the amount of Java code required to be written by an application developer. But is that all there is to it? Are there any use cases at all, such that a functionality be better served by writing some cusom Java code in a managed bean, perhaps offering runtime efficiency benefits?
&lt;/li&gt;&lt;/ol&gt;I'm sure there are multitudes of such examples all over various stacks of ADF functionality. I hope to spend more time in near future examining it in detail, but I'm tossing out this post here for brainstorming purposes. Consider this post more as a stirring the pot variety, rather than offering answers to specific questions. If anyone reading this has more insight into these issues, please post in my comments.&lt;p/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-946729478674801814?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/946729478674801814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=946729478674801814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/946729478674801814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/946729478674801814'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2008/10/pros-and-cons-of-various-adf.html' title='Pros and cons of various ADF configuration alternatives'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-5442886078974852799</id><published>2008-09-29T18:01:00.000-07:00</published><updated>2009-04-04T01:32:20.927-07:00</updated><title type='text'>Determining RichTree node hierarchy type with tree node selection or row disclosure</title><content type='html'>&lt;p/&gt;There is plenty of documentation available demonstrating &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_table.htm#BABHBCIE"&gt;selection handlers&lt;/a&gt; or &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/b31973/af_table.htm#BABCBCAJ"&gt;row disclosure handlers&lt;/a&gt; for a node of an ADF RichTree. However, information on manipulation of the node data in these handlers is sketchy to come by. For a RichTree defined based on hierarchical data-binding with ADF BC objects, a specific use case is presented here: How to determine the node hierarchy type of a selected or expanded/contracted node? &lt;p&gt;For a RichTree definition such as below, assuming myFancyBean maps to a bean MyFancyBean.java, sample code for solving the use case above is presented. With a declarative databinding approach, an EL expression such as &lt;span style="font-family:courier new;"&gt;#{node.hierType.viewDefName}&lt;/span&gt; evaluates the node hierarchy type. However, such EL expression when evaluated inside a Java selection/row disclosure handler would not return the same result, due to not having appropriate context for the variable "node".   &lt;pre class="java" name="code"&gt;&amp;lt;af:tree
 value="#{bindings.myVO.treeModel}"
 var="node" rowselection="single" displayrow="selected"
 rowdisclosurelistener="{myFancyBean.handleRowDisclosure}"&amp;gt;&lt;/pre&gt;Corresponding code in a Java handler for determining node hierarchy type is presented below. For the purpose of getting the point across, this code assumes that a tree node is being expanded. Tree node contraction is not handled in this code, however equivalent code can easily be written for handling contraction by using getRemovedSet instead of getAddedSet.  &lt;pre class="java" name="code"&gt;package com.whatever;

import oracle.adf.view.rich.component.rich.data.RichTree;

import org.apache.myfaces.trinidad.event.RowDisclosureEvent;
import org.apache.myfaces.trinidad.model.RowKeySet;

import oracle.adfinternal.view.faces.model.binding.FacesCtrlHierNodeBinding;

public class MyFancyBean {
  public MyFancyBean() {

  }


  //.....

  public void handleRowDisclosure(RowDisclosureEvent rowDisclosureEvent) throws Exception {
    Object rowKey = null;

    FacesCtrlHierNodeBinding rowData = null;
    String viewDefName = null;
    RichTree tree = (RichTree)rowDisclosureEvent.getSource();
    RowKeySet rks = rowDisclosureEvent.getAddedSet();
    if (rks != null) {
       int setSize = rks.size();
       if (setSize &amp;gt; 1) {
           throw new Exception("Unexpected multiple row disclosure row sets");
       }

       if (setSize == 0)
           return;
       rowKey = rks.iterator().next();
       tree.setRowKey(rowKey);
       rowData = (FacesCtrlHierNodeBinding)tree.getRowData();

       if (rowData.getHierTypeBinding() != null) {
           viewDefName =
                   rowData.getHierTypeBinding().getStructureDefName();
       }
    }
  }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-5442886078974852799?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/5442886078974852799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=5442886078974852799' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/5442886078974852799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/5442886078974852799'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2008/09/determining-richtree-node-hierarchy.html' title='Determining RichTree node hierarchy type with tree node selection or row disclosure'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6617076936068378384.post-1520374898842205581</id><published>2008-09-29T13:51:00.000-07:00</published><updated>2008-10-15T00:07:33.486-07:00</updated><title type='text'>Declarative databinding for lazy loading RichTree based on recursive View Objects</title><content type='html'>&lt;p&gt;There have been inquiries about ability in ADF for declarative databinding a RichTree component to a recursive View Object. A recursive VO is based on a hierarchical "START WITH ... CONNECT BY" SQL clause in Oracle DB, when a table in the schema has a self-referencing foreign key to itself. Such schema design may be used for describing hierarchical organization, or any deeply nested hierarchies.
&lt;p&gt;
&lt;a href="http://forums.oracle.com/forums/thread.jspa?messageID=2629650"&gt;An example of enquiry.&lt;/a&gt;
&lt;p&gt;
&lt;a href="http://technology.amis.nl/blog/?p=2116"&gt;Solutions have been presented for custom building an ADF RichTree based on a complex hierarchical query.&lt;/a&gt; Such examples do not provide declarative databinding, and involve some Java coding.
&lt;p&gt;
Providing a lazy loading RichTree with custom Java coding involves lot more complexity, almost building your own custom databinding layer.
&lt;p&gt;
A solution is provided here for solving the requirement of a lazy loading RichTree based on self-referencing schema objects. For example, consider a database table SPECS for describing hierarchy of test suites, such that suites may have sub-suites nested upto an indefinite level. Tests are at leaf level in the hierarchy. The column "TYPE" in this table indicates whether a row corresponds to a SUITE or a TEST. The column SUITE_ID is the self referencing foreign key in this table, for referencing a sub-suite or test to its parent suite.

&lt;a href="http://3.bp.blogspot.com/_jz1UAHfetGI/SOFB_bFuoiI/AAAAAAAAAAM/C4vWG-qlEhU/s1600-h/Database+Diagram2.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5251551198350058018" style="FLOAT: left; MARGIN: 0px 10px 10px 0px" alt="" src="http://3.bp.blogspot.com/_jz1UAHfetGI/SOFB_bFuoiI/AAAAAAAAAAM/C4vWG-qlEhU/s320/Database+Diagram2.png" border="0" /&gt;&lt;/a&gt;












&lt;p&gt;&lt;/p&gt;


&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;A hierarchical query solution would involve defining a View Object with expert mode SQL query such as below, followed by building a custom TreeModel for this VO and following the solution in &lt;a href="http://technology.amis.nl/blog/?p=2116"&gt;AMIS blog link above&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;

&lt;pre class="sql" name="code"&gt;
SELECT
level, SpecsEO.ID, SpecsEO.TYPE, SpecsEO.DESCRIPTION
SpecsEO.SUITE_ID, SpecsEO.WEIGHT, SpecsEO.STATUS
FROM SPECS SpecsEO
START WITH SpecsEO.SUITE_ID IS NULL
CONNECT BY PRIOR SpecsEO.ID = SpecsEO.SUITE_ID
&lt;/pre&gt;

The alternate declarative solution proposed here does away with hierarchical queries altogether. It proposes defining 2 View Objects, a View Object for top level suites (or special case where tests are top level without being contained by any suites), and another View Object for rest of suites or tests. The top level VO breaks the recursion. &lt;p&gt;&lt;/p&gt;&lt;p&gt;TopLevelSpecsVO :&lt;/p&gt;&lt;p&gt;

&lt;pre class="sql" name="code"&gt;
SELECT
SpecsEO.ID, SpecsEO.TYPE, SpecsEO.DESCRIPTION,
SpecsEO.SUITE_ID, SpecsEO.WEIGHT, SpecsEO.STATUS
FROM SPECS SpecsEO
WHERE SpecsEO.SUITE_ID IS NULL
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;&lt;p&gt;SpecsVO :&lt;/p&gt;&lt;p&gt;
&lt;pre class="sql" name="code"&gt;
SELECT
SpecsEO.ID, SpecsEO.TYPE, SpecsEO.DESCRIPTION
SpecsEO.SUITE_ID, SpecsEO.WEIGHT, SpecsEO.STATUS
FROM SPECS SpecsEO&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;Two View links are defined:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;between TopLevelSpecsVO and SpecsVO (TopLevelSpecsVO.ID = SpecsVO.SUITE_ID)&lt;/li&gt;&lt;li&gt;between SpecsVO and SpecsVO itself (Source SpecsVO.ID = Destination SpecsVO.SUITE_ID)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;When defining databinding for RichTree, simply adding tree level rules based on above view links defines an accessor from view object SpecsVO to itself in the page definition file. This approach automatically takes care of displaying the RichTree with indefinite level of recursion. Apart from being fully declarative, another big advantage of this approach is performance. It provides a lazy loading RichTree by using caching provided by View Object layer.&lt;/p&gt;&lt;p&gt;The strongest advantage of this approach is when a hierarchical object such as this has a descendant relationship with some other object(s), and the RichTree needs to display this relationship through ADF BC backed databinding as well. For example, consider a master-detail relationship between a PRODUCT table and the SPECS table discussed above. Configuring databinding for RichTree between a PRODUCT table based VO and TopLevelSpecsVO would be a trivial exercise, facilitating a RichTree displaying hierarchy from products to test suites all the way down to tests.
&lt;/p&gt;&lt;p&gt;To the best of my knowledge, no such declarative solution would be possible were the SPECS VO defined based on a complex hierarchical query, and a TreeModel based on it with a custom managed bean. I spent considerable amount of time investigating such possibility (simply for the sake of being a devil's advocate) and all such attempts were futile. There is simply no way in the current state of the product to mix-and-match ADF BC backed databindings with custom managed bean backed databindings in a declarative fashion. If you think you can prove me wrong, please post in my comments section and let me know how.
&lt;/p&gt;&lt;p&gt;The only potential drawback of this approach which I can think of is an increase in the number of configuration objects. For each logical recursive schema object, it doubles the number of View Objects. However in my opinion (especially in the absence of out-of-the-box declarative databinding for a hierarchical object) this is a small price to play, compared to the elegance of a declarative solution with lazy loading.&lt;/p&gt;
&lt;strong&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6617076936068378384-1520374898842205581?l=cbhavsar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cbhavsar.blogspot.com/feeds/1520374898842205581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6617076936068378384&amp;postID=1520374898842205581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/1520374898842205581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6617076936068378384/posts/default/1520374898842205581'/><link rel='alternate' type='text/html' href='http://cbhavsar.blogspot.com/2008/09/declarative-databinding-for-lazy.html' title='Declarative databinding for lazy loading RichTree based on recursive View Objects'/><author><name>Chandu Bhavsar</name><uri>http://www.blogger.com/profile/09395216600445735713</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='15' src='http://3.bp.blogspot.com/-OfKh8_2z5Dw/Tyd-HXWQjAI/AAAAAAAAAFU/94IvcD5j5MY/s220/blog_profile.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jz1UAHfetGI/SOFB_bFuoiI/AAAAAAAAAAM/C4vWG-qlEhU/s72-c/Database+Diagram2.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
