tag:blogger.com,1999:blog-80161197894914242212024-03-12T17:21:16.924-07:00Marvin's ADF BlogStarts with research, then comes experience... and ends with the proposal to start a theory.Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.comBlogger24125tag:blogger.com,1999:blog-8016119789491424221.post-84065270479127514222013-02-09T06:20:00.002-08:002013-02-09T06:20:41.350-08:00Assertions: Not so Used but yet so PowerfulBefore I do something productive on a Saturday morning, might as well quickly blog about a not-so-commonly used feature in Java (well I practically don't see a lot of people using it that's all)... but they should!<br />
<br />
Searching the net will give you tons of result about how to use Assertion so I'm not going to go through that, what I will demonstrate is the use of Assertion in JDeveloper.<br />
<br />
I'm currently using JDeveloper 11.1.2.x but it should also work in any version of JDeveloper.<br />
<br />
So quickly, let me show you a project specific configuration called Run Configuration. If you're coming from an Eclipse background, this should be one of your "must-know" setup but in JDeveloper, it's a not required setup when running your normal BC App or ADF View App.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHGdGjgYtzW_HsmroQ07NCZYqraXwxyzElxnjkDiRlm7DRBfU7mIwsXhlp6YIIpnsGrqaW6UdzQst8dm4bcxNJEB6_JDVYmuTjBCzkLnf5dz8BZVV0zMgg6rNmMbTnBI3skBzNxDZA6SI/s1600/assertion_a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="343" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHGdGjgYtzW_HsmroQ07NCZYqraXwxyzElxnjkDiRlm7DRBfU7mIwsXhlp6YIIpnsGrqaW6UdzQst8dm4bcxNJEB6_JDVYmuTjBCzkLnf5dz8BZVV0zMgg6rNmMbTnBI3skBzNxDZA6SI/s400/assertion_a.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Choose and Configure Run Configuraitons</td></tr>
</tbody></table>
What you'll need to know thought is that this configuration is project specific, in fact, by setting the Assertion command argument in a normal java project - and running it of course - you'll right away see assertions kicking in.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSeHEYyZ5WZtH0hEZ0L27JwZ7rDNxy7vdw6Y5T3zcRMtRHDZzUWx5HGgluuloSzuOJbEPTu3vRzUlIddQntmFC3sewKAvqJ2c1M3hEu5KX84_LaR6nHn11S0fjIDwJwEaEeYskKDWlVyp3/s1600/assertion_b.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="285" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSeHEYyZ5WZtH0hEZ0L27JwZ7rDNxy7vdw6Y5T3zcRMtRHDZzUWx5HGgluuloSzuOJbEPTu3vRzUlIddQntmFC3sewKAvqJ2c1M3hEu5KX84_LaR6nHn11S0fjIDwJwEaEeYskKDWlVyp3/s400/assertion_b.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Assertion Argument</td></tr>
</tbody></table>
The part that kind'a sucks is turning it on in a running ADF View App... ok well it doesn't really suck but it wasn't straightforward to figure out.<br />
<br />
Basically, when you're starting up your Weblogic Server (Integrate), part of the domain configuration startup includes a "-da" command which basically says that by default, all assertions are off.<br />
<br />
So what does this mean, it means that even if you put "-ea" while booting up, the "-da" will cancel it out.<br />
<br />
But this comes with a lot of pros because you don't really want everything to be asserted at that point. So just make sure that when you're asserting in a ViewController - do make sure to point the exact package structure to assert.<br />
<br />
You should see something like this in your console on startup, in my case... I'm enabling assertion in all of my model classes (defined by: <b>-ea:model...</b>). Notice how I'm also highlighting the <b>-da</b> argument, you can see this in your setDomainEnv.cmd file - I don't recommend removing it though.<br />
<br />
<br />
Starting WLS with line:<br />
d:\Oracle\MW\11123~1.0\JDK160~1\bin\java -client [MORE STUFF...] <b>-ea:model...</b> [MORE STUFF...] <b> -da</b> [EVEN MORE STUFF...]<br />
.....<br />
<br />
IntegratedWebLogicServer startup time: 959 ms.<br />
IntegratedWebLogicServer started.<br />
<div>
<br /></div>
<br />
<div>
<br /></div>
<br />
<br />Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com1tag:blogger.com,1999:blog-8016119789491424221.post-65605192750830655542012-12-25T14:13:00.000-08:002012-12-27T15:21:52.130-08:00Contextual Event - Interface based Consumer - NO DataControl Yey!In my last blog, I showed how using an interface as a parameter will allow you to decouple your ADF beans even more.<br />
<br />
A couple days before Christmas, somebody in EMG forums asked about ADF utilizing too many pageDefinition files. This led me to a link by Steve Muench's blog #164 - His example basically demonstrates how you can have a manage bean be defined as an instance method in your pageDefinition.<br />
<br />
So this gave me the idea to upgrade my earlier blog to use this so that we will ultimately clean up the amount of files generated in our project.<br />
<br />
I highly recommend to go through my previous blog since it involves showing the invocation and the initial use case of the listener interface. This time though, I'll be showing the handler interface.<br />
<br />
First create an interface which our bean will implement. This interface will be defined by the requestScope bean which will represent the instance name of the pageDef. If you notice in Steve's blog, he pointed out how to use this method binding properly, the instance name has to use the $ notation for its EL Expression oppose to the normal # (I'm still looking for more resources to explain this) - just in case, this means you can't use ${requestScope.<Bean>} <b>you have to call it ${<Bean>}</b>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSrOl1Ct-FIgHjS1KQLmnUOyWCT6rkn2l4yRc3xBHnQr3LFMlYKdz6T4qJjC9aid0RiHjay8g2S8btqkN7aYxKievThLTj0bH-kjJSTFBhOa1LxAaTlvW5OBJ2X9q6esiAWIw6TfD7xT9j/s1600/ctxinterfacenodc_img_a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="103" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSrOl1Ct-FIgHjS1KQLmnUOyWCT6rkn2l4yRc3xBHnQr3LFMlYKdz6T4qJjC9aid0RiHjay8g2S8btqkN7aYxKievThLTj0bH-kjJSTFBhOa1LxAaTlvW5OBJ2X9q6esiAWIw6TfD7xT9j/s400/ctxinterfacenodc_img_a.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Interface Handler</td></tr>
</tbody></table>
<br />
Uhm.. the request scope part is only because there is no point using a bigger scope for something that is only used as needed.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMgqMqou0Nd5PsxxGNgVPYQKCOvpR9i6AzHMtYHnHEWA4mki43CwZJnF9CEkqcmP5pdz3PX-K8xOasVFi4U-ZdSs8ONvdQidYXjqz0DMY6EOwgoOOtpzgXkCS67kviR7ey01l1B5ytiZ-h/s1600/ctxinterfacenodc_img_b.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMgqMqou0Nd5PsxxGNgVPYQKCOvpR9i6AzHMtYHnHEWA4mki43CwZJnF9CEkqcmP5pdz3PX-K8xOasVFi4U-ZdSs8ONvdQidYXjqz0DMY6EOwgoOOtpzgXkCS67kviR7ey01l1B5ytiZ-h/s400/ctxinterfacenodc_img_b.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Request Bean</td></tr>
</tbody></table>
<br />
So here's the screenshots.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsxymVT9FZvJsirA10UGmk9PY_COJAqnbaGeNCVtacxzhbTRoBQ2Y4fSTjNoVOrXftzdbj3IGL777YM5JUyjk0rcCH1WQLJItOJqVf1G-blPesQx_IX6iKBIeU9tYfndFlWTTU-k9B5vUj/s1600/ctxinterfacenodc_img_c.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsxymVT9FZvJsirA10UGmk9PY_COJAqnbaGeNCVtacxzhbTRoBQ2Y4fSTjNoVOrXftzdbj3IGL777YM5JUyjk0rcCH1WQLJItOJqVf1G-blPesQx_IX6iKBIeU9tYfndFlWTTU-k9B5vUj/s400/ctxinterfacenodc_img_c.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Event Mapping - pageDef</td></tr>
</tbody></table>
And just in case you're curious which lifecycle it lands, here's the console logger of the lifecycle.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhxaATLUqzLfHIgmNkFFKv-ummRnHJnq3O0nkOSEpkQF_31hh5sXyKKeJZ5RwwNEK3yqM13bzJI-pLCCgM3bTjL5DCy3CS8w011fWcy1X6zXcmdkdMtaLRzBdUbTGEnLR4xI4W4RAZIjo7/s1600/ctxinterfacenodc_img_d.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhxaATLUqzLfHIgmNkFFKv-ummRnHJnq3O0nkOSEpkQF_31hh5sXyKKeJZ5RwwNEK3yqM13bzJI-pLCCgM3bTjL5DCy3CS8w011fWcy1X6zXcmdkdMtaLRzBdUbTGEnLR4xI4W4RAZIjo7/s400/ctxinterfacenodc_img_d.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Invoke Application Phase</td></tr>
</tbody></table>
<br />Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0tag:blogger.com,1999:blog-8016119789491424221.post-35364524110355633112012-12-10T20:53:00.000-08:002012-12-27T15:21:30.993-08:00Contextual Event - Interface based ConsumerIt's no excuse to skip blogging all year but since it's not yet the end of the year, I still have enough time to post one last hoorah for 2012.<br />
<br />
And to keep up with all the trend about contextual events, I've decided to publish an article in utilizing contextual events into an <b>Observer Bean</b> design pattern.<br />
<br />
<i>A bit of disclaimer here, I only came out with this idea while eating pizza and wondering why I can't publish a pizza order online and have any pizza company in the vicinity to cater it. All this happened an hour ago so I apologize for any small implementations I might miss... but I'll try to be brief and precise as always... moving on!</i><br />
<br />
So, to start with - I'll assume that this is already the n-th time you've read contextual events. If not, I would recommend going through the online Oracle documentation, a couple blogs by some google'able ADF authors (F.Nimphius, A.Baranovskis, and etc.).<br />
<br />
I do want to thank Jobinesh for pointing out a cool implementation in invoking contextual events. There are a couple of ways to invoke it, but I really like this one, particularly because it actually has a "contextualEvent" keyword in it. Why I like it? Well it's because of readability, and in the programmatic world - readability is key. Well good-code > readability > less-code.<br />
<br />
I've setup a starting project that runs with a single entry point page (mainIndex.jspx).<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf6kaxh4gglRLZqHvTYUa_rhx27EUMmcHWk9X-pN0JV4UfR1ODRBBcI6_R4fzqfoScfE-20T4nxJ6HeVnAEmY2jY97wew_Wog_FUO-p5CPsE9BMWbb4mQ8RWAUK3KBeZebU3kuRHWpLNap/s1600/ctxinterface_img_prep_b.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf6kaxh4gglRLZqHvTYUa_rhx27EUMmcHWk9X-pN0JV4UfR1ODRBBcI6_R4fzqfoScfE-20T4nxJ6HeVnAEmY2jY97wew_Wog_FUO-p5CPsE9BMWbb4mQ8RWAUK3KBeZebU3kuRHWpLNap/s400/ctxinterface_img_prep_b.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">mainIndex.jspx</td></tr>
</tbody></table>
The mainLayoutRegion is a simple bounded taskflow that has one fragment called mainFlowFgmt.jsff. This fragment will be our main fragment that wraps other regions as defined in the project structure. Please refer to the project structure as reference to the defined region.<br />
<br />
BoundedTaskFlows: main-layout-flow, sub-flow-alpha, sub-flow-omega<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicmdRaQt-pQQ2XA5n78k6N_yb68Ogmfmw4fyVyDDftVisCgF7t0vnaE423-hNLQpKQW-eE_PrSICk22zfa3RfZxB1SdVRUIL_eFEuubJw088p-U2krNi8LJ3_MTcf8PbNfDcyj9cCHVQMJ/s1600/ctxinterface_img_prep_c.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicmdRaQt-pQQ2XA5n78k6N_yb68Ogmfmw4fyVyDDftVisCgF7t0vnaE423-hNLQpKQW-eE_PrSICk22zfa3RfZxB1SdVRUIL_eFEuubJw088p-U2krNi8LJ3_MTcf8PbNfDcyj9cCHVQMJ/s400/ctxinterface_img_prep_c.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">mainFlowFgmt.jsff</td></tr>
</tbody></table>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAPmNOTbn_9OI2nxJc1rVGZC6wd4A1O21h9NtttGjNStscnFoiZf9n-3ILunmoj9EaZ0rk-585Us_CUrXEfsYste0XX68Eo4L2fNQD9JhO4gyGeQKuEI-e145jiWMFdGsgcOVpoeLd0LVw/s1600/ctxinterface_img_prep_d.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAPmNOTbn_9OI2nxJc1rVGZC6wd4A1O21h9NtttGjNStscnFoiZf9n-3ILunmoj9EaZ0rk-585Us_CUrXEfsYste0XX68Eo4L2fNQD9JhO4gyGeQKuEI-e145jiWMFdGsgcOVpoeLd0LVw/s400/ctxinterface_img_prep_d.png" width="250" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Project Structure</td></tr>
</tbody></table>
<br />
If I run everything, things will basically look like this (Take Note, I've labeled where the region starts).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjhxPBgyLI5Cn5lX8kLisaHkAqqzwr-aVXnBkY2Iq3SHcHpLrbigfzFzhqAxqLAloQetIViFlCnjPzzrm6m-QPCOHfZ2GadC251UWTf1pi5qLoe-wjyspjdbcXEp4R1jTouXyQB_1zf6iD/s1600/ctxinterface_img_prep_a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjhxPBgyLI5Cn5lX8kLisaHkAqqzwr-aVXnBkY2Iq3SHcHpLrbigfzFzhqAxqLAloQetIViFlCnjPzzrm6m-QPCOHfZ2GadC251UWTf1pi5qLoe-wjyspjdbcXEp4R1jTouXyQB_1zf6iD/s320/ctxinterface_img_prep_a.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Running Sample</td></tr>
</tbody></table>
So here's the plan:<br />
<br />
<ul>
<li>Wire up (queue the event) from the two buttons defined in Alpha. Both events will be unique so that we can test a couple scenarios. (<i>Haven't got the chance to code the 2nd event but you'll get the gist of it soon</i>)</li>
<li>Both events will have a <b>unique eventName</b> with <b>a no parameter definition (meaning no-payload)</b>.</li>
<li>Calling this event mockEvent!</li>
<li>Listen for the event in mainFlowFragment.</li>
<li>Listen for the event in mainIndex page.</li>
<li>Listen for the event in Omega region.</li>
<li>Use a common handler for all of these BUT each of these fragments's backingBean will be the listener to a common event handler.</li>
<li>Let me repeat that last one... Handler (DataControl) one-is-to-many Listener (Beans). </li>
<li>One more time... One datacontrol method... many backingBeans listening and being utilized by the same datacontrol method in different levels.</li>
</ul>
<div>
Here's a utility that invokes/queues the event to start the bubble of the contextualEvent. Again, code is thanks to Jobinesh.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVkC6t5O18fL1or0j401RzUbSa6fqLEocBFD_CS7kCRYDqurVGP9eGQyiz3XhLTjih0IMJunqOTy8Wrw51WFkSIzvQ94RcCoAol68uANJgZqwwIIpVhTBpEU4EOtLY3Yr_Yb9QRXnPYbq_/s1600/ctxinterface_img_design_a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVkC6t5O18fL1or0j401RzUbSa6fqLEocBFD_CS7kCRYDqurVGP9eGQyiz3XhLTjih0IMJunqOTy8Wrw51WFkSIzvQ94RcCoAol68uANJgZqwwIIpVhTBpEU4EOtLY3Yr_Yb9QRXnPYbq_/s400/ctxinterface_img_design_a.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Util.java</td></tr>
</tbody></table>
<div>
Going back to Alpha fragment. Here's the pageDef binding definition as well as the backingBean which invokes it.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhqHn4L76GvmTMdFxR-PzqbKFWhK0Gbthot3obuMUhIK_x1lCBJ41c-9N3f2BJnGOtozS_-9ZV_soNeFFHLpNYWu3DVQBnb8C_IXvUNmMfA14tvnq8mS25wDn9-YNYsgp8rc8A9kkkePAc/s1600/ctxinterface_img_design_b.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhqHn4L76GvmTMdFxR-PzqbKFWhK0Gbthot3obuMUhIK_x1lCBJ41c-9N3f2BJnGOtozS_-9ZV_soNeFFHLpNYWu3DVQBnb8C_IXvUNmMfA14tvnq8mS25wDn9-YNYsgp8rc8A9kkkePAc/s400/ctxinterface_img_design_b.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Alpha pageDef - Contains the Event Declaration</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNircw3viIIyo_fvpGwvW_ySpBzlC0MxMd-DPv7rg0pYc3yKN4GwRVkFWbVCTk3kX3gLH2uUjYdo4WkcXtLdMqRZWDBszrMxK1X8Zx6027Q8nEjW5fTqynegK81yLS6w77XCA79GxbtpCS/s1600/ctxinterface_img_design_c.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNircw3viIIyo_fvpGwvW_ySpBzlC0MxMd-DPv7rg0pYc3yKN4GwRVkFWbVCTk3kX3gLH2uUjYdo4WkcXtLdMqRZWDBszrMxK1X8Zx6027Q8nEjW5fTqynegK81yLS6w77XCA79GxbtpCS/s400/ctxinterface_img_design_c.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">AlphaBb.java</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
Here comes the fun part. I'll define a class to represent the datacontrol handler for the event but this class will cater a listener interface (Observer) so that whenever there is a listening pageDef (consumer) I will be able to define a/the oberserver (bean/method) which will handle the event. I'll also show in the code, a single backingBean handling two consuming definition from a single event (whoo!).</div>
<div>
<br /></div>
<div>
Quick ADF talk here: T<i>o be able to handle/consume an event, an event mapping has to be made. Part of the event mapping is to define the consumer as well as the method binding to handle the event. This method binding is defined by converting a class into a datacontrol (more in the developer guide).</i></div>
<div>
<br /></div>
<div>
Technically, the datacontrol (class) will still be the real listener, but because I want to allow the interface to start with the beans rather than the main listener - I am going to distribute the event with the observing beans.</div>
<div>
<br /></div>
<div>
What's the advantage?</div>
<div>
<ul>
<li>Beans will be well defined in the xml of the event map.</li>
<li>Bean methods can provide the interface. </li>
<li>So yes, you can actually point to use the pageFlowScope or any scope beans in that taskflow to handle it without touching the datacontrol again.</li>
</ul>
<div>
Less talk more code.</div>
</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYBIGT-uLzA0wBWBHSRvcz1OsjbjZiL5OdRE44XUVrZJJ2LN3BR0SlhLrjtELq2FSov8MZEVYCz_0KutPNJDvMQFy5dqwA473uCCv6bHd0hCWnd6M6bWWYJ6T3N2CDQwga5hu1lj17txA5/s1600/ctxinterface_img_map_a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYBIGT-uLzA0wBWBHSRvcz1OsjbjZiL5OdRE44XUVrZJJ2LN3BR0SlhLrjtELq2FSov8MZEVYCz_0KutPNJDvMQFy5dqwA473uCCv6bHd0hCWnd6M6bWWYJ6T3N2CDQwga5hu1lj17txA5/s1600/ctxinterface_img_map_a.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Interface Class - MockEventListener.java</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeieRYYC5_yRaiEtGjL8CRKfQvsExOq0Zz85OvW1ueqXH-qt2S3hPtZETA-RHC4WcgRrwZLFeb7-Z-HfDSWxMZjrKYKyHwaOrGiWcFiSWg9EjoAFF1XjowJxcYx3Sl99t7zaTFtbLF7FFf/s1600/ctxinterface_img_map_b.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="264" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeieRYYC5_yRaiEtGjL8CRKfQvsExOq0Zz85OvW1ueqXH-qt2S3hPtZETA-RHC4WcgRrwZLFeb7-Z-HfDSWxMZjrKYKyHwaOrGiWcFiSWg9EjoAFF1XjowJxcYx3Sl99t7zaTFtbLF7FFf/s640/ctxinterface_img_map_b.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">DataControl Class - MockEventHandler.java</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
And here's a sample mapping to my mainLayoutBb.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvTbsrfVKMSg2hDEUjdioByA4lpAMDqrMxfgpcAiUjD0IyOAfNPjFfWxBily8h__onKZ5PKWIQjpDDW7B6sJI2adydSq2lSkQGe62w2hmA82Uo3V-f-BmrKU5e4yS44C8-M1F9fuyHcNNh/s1600/ctxinterface_img_map_c.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvTbsrfVKMSg2hDEUjdioByA4lpAMDqrMxfgpcAiUjD0IyOAfNPjFfWxBily8h__onKZ5PKWIQjpDDW7B6sJI2adydSq2lSkQGe62w2hmA82Uo3V-f-BmrKU5e4yS44C8-M1F9fuyHcNNh/s400/ctxinterface_img_map_c.png" width="386" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Event Mapping pageDef - Double Consumer Same Bean!!! Notice the value.</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih_oaRcURZEAHQejQC75aYdYS9wPi_QQNFny6t2_771LoL9t3doU07B4c7h6khoNsOIXZeDdVRglp8QBAT63_z9M_J14idRbnJTgiy3Iwmh5G3tL0rCMZEXWy3NjZ1H9dbnvHyPJPboCzR/s1600/ctxinterface_img_map_d.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih_oaRcURZEAHQejQC75aYdYS9wPi_QQNFny6t2_771LoL9t3doU07B4c7h6khoNsOIXZeDdVRglp8QBAT63_z9M_J14idRbnJTgiy3Iwmh5G3tL0rCMZEXWy3NjZ1H9dbnvHyPJPboCzR/s400/ctxinterface_img_map_d.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Two Anonymous Implementation of listening!</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
So far is it making sense? If not consider the Observable pattern in java and see if it explains the idea. To expand it a bit, we'll make the MainIndex.jspx have it's own backing bean and use the same datacontrol.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmVuuTk353SUYBORNrqJ3ur5PwRoln7GvhMBL0h3sZucqyZ8qhNp30mndvVZMuM0TyeSbKBfU6VUYF8zxuH6nZbelBrhYynqOp4kzZgVL0uj7nkYMzCBbGiodsNUO-JEN7STriYrqi5dOz/s1600/ctxinterface_img_map_e.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmVuuTk353SUYBORNrqJ3ur5PwRoln7GvhMBL0h3sZucqyZ8qhNp30mndvVZMuM0TyeSbKBfU6VUYF8zxuH6nZbelBrhYynqOp4kzZgVL0uj7nkYMzCBbGiodsNUO-JEN7STriYrqi5dOz/s400/ctxinterface_img_map_e.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MainIndexBb.java (defined in adfc-config)</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxhn9Bs7c781q3skmxv7BQjw2hiveKWEgFn0UNu4HZln9FQPp7BXcskVLIP7otJ4fVNEDQagc2ddAMxPWVJR-WbaVKoD0u6s0MZu9H7KdBTG-i2MsSS1wuMX3_6-5WGPOL5ncdzBPkwlrN/s1600/ctxinterface_img_map_f.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="393" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxhn9Bs7c781q3skmxv7BQjw2hiveKWEgFn0UNu4HZln9FQPp7BXcskVLIP7otJ4fVNEDQagc2ddAMxPWVJR-WbaVKoD0u6s0MZu9H7KdBTG-i2MsSS1wuMX3_6-5WGPOL5ncdzBPkwlrN/s400/ctxinterface_img_map_f.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">mainIndex.jspx PageDefinition</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
Here's the console output when I hit the event - I'm also printing the lifecycle so that you can see that the invocation is all happening in InvokeApplication phase. It is worth noting though that the order of the events can vary a bit. I'm still trying to figure it out myself - but then again it shouldn't matter because you shouldn't rely on the order of the queued events. All the events should be nothing but observing factors.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVCYtlTO9qtp34wC2YPmoxJxJPAuWCu2_5GosWBHVihz2O1YUwbsb-RpdI63_karefRqMVNpCtIZ9me0h_-_UG2N3AnCiGIspovXbyyIWjFBBLmc6Q84nOOCiMFsCbPvTfvhgOxOxkBz8r/s1600/ctxinterface_img_console_a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVCYtlTO9qtp34wC2YPmoxJxJPAuWCu2_5GosWBHVihz2O1YUwbsb-RpdI63_karefRqMVNpCtIZ9me0h_-_UG2N3AnCiGIspovXbyyIWjFBBLmc6Q84nOOCiMFsCbPvTfvhgOxOxkBz8r/s320/ctxinterface_img_console_a.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">console</td></tr>
</tbody></table>
<div>
So real quick, I've show you how to use/define one datacontrol to cater several listening interfaces. This is basically an application of the observable pattern in a contextual event framework. Things to keep in mind is that all of these is happening in one request - so ideally you wouldn't want to place too much logic when listening to events because it can get really complicated really fast. You would also want to keep a solid event handler that you'll rarely change that's why keeping it interfaced is always a plus.</div>
Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0tag:blogger.com,1999:blog-8016119789491424221.post-11906725418094210632012-05-12T09:31:00.001-07:002012-05-12T09:31:19.173-07:00Task to Refresh a Task FlowFirst 2012 post I guess? Due to some really really busy time in the office, I have to apologize for not being able to blog for quite some time.<br />
<br />
With that said, I recently notice how a lot of developers tries to play it safe when using Task Flows by sticking with the obvious. So, to start my 2012 blog, I am going to clear out one item in the bucket list of task-flow-bewilderness.<br />
<br />
<b>Task Flow Refresh</b><br />
<br />
So the most obvious way of refreshing a task flow is based on the initial design which is:<br />
<br />
<i>"When there is a change in the data, the task flow needs to refresh."</i><br />
<br />
Simple definition of terms.<br />
<b>Refresh </b>- Restarts the task flow as if the entire flow was reentered from the start. That seems explanatory but trust me, such a word strives to be confusing at times.<br />
<b>TaskFlow Binding (TFB)</b> - Page definition ADF task flow bindings.<br />
<b>TaskFlow == or === (in javascript) Task Flow - </b>enough said.<br />
<br />
Moving on.<br />
<br />
The simplest solution for the above "dilemma" is to use the TFB's properties refresh=ifNeeded and simply feed the taskFlow parameters with the changing data.<br />
<br />
As per <a href="http://docs.oracle.com/cd/E24382_01/web.1112/e16182/taskflows_regions.htm#CHDEIFBB" target="_blank">ADF 11.1.2.1.0 Fusion Middleware Documentation - 21.5.1 How to Configure the Refresh of an ADF Region</a> .... well let's just test it shall we.<br />
<br />
#1. Reconfig - Does nothing but hits an ActionEvent<br />
#2. Reconfig-Refresh - Hits the ActionEvent but also changes a viewScope parameter<br />
#3. Reconfig-Refresh-Again - Same as #2 with different value.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGhR3NzmLj0dj4Jm6hdesYomBl4c3vK2lpOGUWiJ3a7Slr5CdQmMGUAEr76J3sZ_ksVT7Enpud401d6-vFbUbMQis5o7wZqTmnIUuX6v2LIzzLXa3lzbDawMu05V8PsZhpQOQ4Vq-nE7fv/s1600/mainPageToolbar.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGhR3NzmLj0dj4Jm6hdesYomBl4c3vK2lpOGUWiJ3a7Slr5CdQmMGUAEr76J3sZ_ksVT7Enpud401d6-vFbUbMQis5o7wZqTmnIUuX6v2LIzzLXa3lzbDawMu05V8PsZhpQOQ4Vq-nE7fv/s400/mainPageToolbar.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ToolBar Buttons</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7lF5huu-fmc8TiN2zCCoT7yUJQ_D3Aa9xBQpaBC6ELGXLfmd-uJMFZo9JVmP8rruGNhncEUij6B5n1jTHOPrn2z6ZX1sPlLqa9HWJeV4E9hOu4XLIbcCdN1k1Aii738OzzfFGXmSvVh4i/s1600/tf-param-a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7lF5huu-fmc8TiN2zCCoT7yUJQ_D3Aa9xBQpaBC6ELGXLfmd-uJMFZo9JVmP8rruGNhncEUij6B5n1jTHOPrn2z6ZX1sPlLqa9HWJeV4E9hOu4XLIbcCdN1k1Aii738OzzfFGXmSvVh4i/s400/tf-param-a.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Initial Run</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE2uWxTHWmg2ABGPdFPYAdgILAze0sVcoANRQDzBEnrLlRhGvyiv6v-F71uQISgJ7qqSyqXpuJmPpHRPs4kgVbcvAuLDwBqy7G-BB7_tMYrnDIPW2Xwecl7W7KM3rC2lXjioPGg7PLx7i2/s1600/mainPage-param-pageDef.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE2uWxTHWmg2ABGPdFPYAdgILAze0sVcoANRQDzBEnrLlRhGvyiv6v-F71uQISgJ7qqSyqXpuJmPpHRPs4kgVbcvAuLDwBqy7G-BB7_tMYrnDIPW2Xwecl7W7KM3rC2lXjioPGg7PLx7i2/s400/mainPage-param-pageDef.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MainPage - Containing Region - PageDef</td></tr>
</tbody></table>
<br />
So yes everyone already knows what's going to happen. Since the variable is an input parameter, combined with refresh=ifNeeded then it will DEFINITELY restart the task flow.<br />
<br />
So let's complicated things a bit by looking at it in a different requirement.<br />
<br />
<i>"When the data changes, not by something direct in the screen but rather as triggers in the data themselves, the task flow needs to refresh."</i><br />
<br />
With that said, data is not the trigger, but the event is the trigger.<br />
<br />
Ironically, I got a suggestion where all they'll do is do exactly what I previously explained earlier (with the refresh=ifNeeded) and simply send an Integer which increments on eventChange. Might fly... but let's try to find a more logical solution.<br />
<br />
Which goes back to the <a href="http://docs.oracle.com/cd/E24382_01/web.1112/e16182/taskflows_regions.htm#CHDEIFBB" target="_blank">ADF 11.1.2.1.0 Fusion Middleware Documentation - 21.5.1 How to Configure the Refresh of an ADF Region</a>.<br />
<br />
Let's use the refreshCondition this time. The only thing with the refreshCondition that you need to be aware of, is that you would probably want to contain the implementation with its own bean handler/manager rather than mixing it with simply any available beans.<br />
<br />
So here goes with the simple demo.<br />
<br />
I'm still going to use the above mainFragment while simply using the boolean flag, and here's the new pageDef.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2wFyNOhQpFeu0nm-LeLeMT4NVajaHIZcZLT43D3PBthjU4GBRbdHTyu_-ailHXspbxGyCLFdjBSI82N8kDLGZA4gBa74knR7tDHQlIfIFIOlkzYspCSIV99iYav4UKTmH_m-yWo4PxzOh/s1600/mainPage-pageDef.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="85" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2wFyNOhQpFeu0nm-LeLeMT4NVajaHIZcZLT43D3PBthjU4GBRbdHTyu_-ailHXspbxGyCLFdjBSI82N8kDLGZA4gBa74knR7tDHQlIfIFIOlkzYspCSIV99iYav4UKTmH_m-yWo4PxzOh/s400/mainPage-pageDef.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">RefreshCondition Used</td></tr>
</tbody></table>
A boolean flag? In a backingBeanScope? Yes a boolean flag and yes in the short lived scoped. I initially tried it in a viewScope but with the simple way of changing a flag from true to false, why not go with something even more "compact". So here's the bean.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHVMzMoYiaM1DYNxossNoN04xI8iBLglguow_bOzcM7vCWmoD_EhOc4CabMFxQe6iwXUx-lOxi3Ii6HQEwogleFX0f2SwaCL8_sIXWMG-6NLiXT-AMvl_qzhxbc5Sj6Gs09YsWZOcLTu05/s1600/mainBbJava.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHVMzMoYiaM1DYNxossNoN04xI8iBLglguow_bOzcM7vCWmoD_EhOc4CabMFxQe6iwXUx-lOxi3Ii6HQEwogleFX0f2SwaCL8_sIXWMG-6NLiXT-AMvl_qzhxbc5Sj6Gs09YsWZOcLTu05/s400/mainBbJava.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">BackingBean - Handles Simple Refresh Condition</td></tr>
</tbody></table>
<br />
So what do we have here.. Bean does nothing but handles the refreshCondition of the taskFlow by always returning <b>FALSE </b>and only, <b>ONLY</b> <b>TRUE</b> once something tried to change it.<br />
<br />
Since I have no better way of explaining this visually, I'll print the console of what we have. So what do we have, we have a simple task flow with a finalizer and initializer and also an initial method call as entry point. Enough?<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfy8LdG9l4p4KI6yc9FKp2Yp2qk2pyuvfYvifHlrx19MgJ0dCcY8Pdwez1ir_aem1PB1NP2IKmICr7f2DcEJsu5MwrMJfsJxZyLzMhZiJgLEKkxGwarAaY45AOurFvCtpuabeeTpMe593H/s1600/testBbJava.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfy8LdG9l4p4KI6yc9FKp2Yp2qk2pyuvfYvifHlrx19MgJ0dCcY8Pdwez1ir_aem1PB1NP2IKmICr7f2DcEJsu5MwrMJfsJxZyLzMhZiJgLEKkxGwarAaY45AOurFvCtpuabeeTpMe593H/s400/testBbJava.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">TaskFlow BackingBean</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmAmM1hfjd688gRQa4n-yjUkrTawgP-1n-0Ts0rNIPj7uywFdEOBGFiuBLY3j9NpVrg3fW-SWQYNkVjdHhvyoyznSMJzGPQkpxxC21Ye0kvmvvTkwcOJtAHCvYq27o-P6rnbcuVdVOw7Mm/s1600/tf-a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmAmM1hfjd688gRQa4n-yjUkrTawgP-1n-0Ts0rNIPj7uywFdEOBGFiuBLY3j9NpVrg3fW-SWQYNkVjdHhvyoyznSMJzGPQkpxxC21Ye0kvmvvTkwcOJtAHCvYq27o-P6rnbcuVdVOw7Mm/s400/tf-a.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Simple TaskFlow Fragment</td></tr>
</tbody></table>
Here are the logs when doing anything but refresh:<br />
<br />
<br />
----- DEBUG: Initializer Firing<br />
----- DEBUG: Initial Task Flow Method Call<br />
----- DEBUG: testReConfig <b>-- This is the ToolBar ActionEvent</b><br />
----- DEBUG: Checking isRefrehRegion[false]<br />
<div>
<br /></div>
<div>
And here's the log when I triggered the refresh:</div>
<div>
<br /></div>
<div>
<div>
----- DEBUG: Initializer Firing</div>
<div>
----- DEBUG: Initial Task Flow Method Call</div>
<div>
----- DEBUG: testReConfig --<b> This is the ToolBar ActionEvent</b></div>
<div>
----- DEBUG: Checking isRefrehRegion[true]</div>
<div>
----- DEBUG: Reconfiguring</div>
<div>
----- DEBUG: Finalizer Firing</div>
<div>
----- DEBUG: Initializer Firing</div>
<div>
----- DEBUG: Initial Task Flow Method Call</div>
</div>
<div>
<br /></div>
<div>
There goes a technical 2012 blog!</div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com2tag:blogger.com,1999:blog-8016119789491424221.post-23584570602264849472011-10-30T16:31:00.000-07:002011-10-30T16:31:07.244-07:00Common Multi-Configuration Question PopupWhile this might not be the most common use-case, but it is still quite interesting and the month is about to end - so I gotta post something cool for a change right? Hehehe.<br />
<br />
Let's say you are in a complex editable form where after clicking the big Save/Confirm button, you would like to ask some follow up questions to the user.<br />
<ul>
<li>Do you want to apply changes?</li>
<li>Are you sure?</li>
<li>Choosing OK will change X data.</li>
</ul>
<div>
Along with these questions, there are even scenarios (rare) where you need to ask questions next to each other.</div>
<div>
<br /></div>
<div>
Because of these scenarios, I designed a simple demo in the power of ADF declarative components. (note: if there is a design flaw in my implementation as well as class handling, I wouldn't mind suggestions or feedback on it. Feedback is highly encouraged "woooot".<br />
<br />
<i>Oh, before I forget, a small constraint that I had to go through is having the button (SAVE/CONFIRM) which triggers the launching of popup will be coming from the the consuming project. So what does this mean? This basically means that the caller or the starting event to launch this question popup will not be part of the component itself. The reason behind this is because the Popup Question might be used by not just a button. It might be a link, a selection event or can even be as simple as a client/server event. So because of this constraint, I had to leave the trigger to be outside of the bean and the component itself will just offer hooks, lots of them if needed.</i></div>
<div>
<br /></div>
<div>
Starting with our declarative model, let's design an iterator based set of questions where each question has the possibility of having 3 types of answers.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiGC8H2FxTKwo-PAM8qlzL5onyd-9sdpNot4hLt7U8_oMU3RyYzfPGwAHKMKvHiPkbY0AfD-LLlMRfzJc1SPyZxfAZwpZ2K_ypGg6L2wKiqJQvw3If2MyQEZRuncY7JMht9RIsL3f_GQpy/s1600/component.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiGC8H2FxTKwo-PAM8qlzL5onyd-9sdpNot4hLt7U8_oMU3RyYzfPGwAHKMKvHiPkbY0AfD-LLlMRfzJc1SPyZxfAZwpZ2K_ypGg6L2wKiqJQvw3If2MyQEZRuncY7JMht9RIsL3f_GQpy/s320/component.png" width="174" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">CustomDialog.jspx</td></tr>
</tbody></table>
A quick explanation of the output:<br />
<ul>
<li>Display All questions as left aligned</li>
<li>Display Confirm/Reject response on the right side</li>
</ul>
<div>
The component bean for this component is as follows.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlUvy5_-ISL_KhS6cR8sHU1R6NvHA6R3xEDtIR8aJI2fjc-MroGpF2kxrEQ0Qg6RRtjOFz2JUAdvKV4LnhGz3hhB7MkYoVp2JD6w_mZR7vQnqq93hNqsqJGMUuiKMS07Tf44Z0IknxkvVW/s1600/CustomDialog_Java.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlUvy5_-ISL_KhS6cR8sHU1R6NvHA6R3xEDtIR8aJI2fjc-MroGpF2kxrEQ0Qg6RRtjOFz2JUAdvKV4LnhGz3hhB7MkYoVp2JD6w_mZR7vQnqq93hNqsqJGMUuiKMS07Tf44Z0IknxkvVW/s320/CustomDialog_Java.png" width="276" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">CustomDialog.java</td></tr>
</tbody></table>
The only implementation this bean directly calls is the <b>reset</b>, which is called on every popupLaunch, and the <b>onConfirm</b>, which is called during the confirmation.<br />
<br />
Next come the bread and butter which gets this thing going. DialogItems.java contains all the accessors needed for the generation of the dynamic question/answers. The main thing to note down for this bean is the abstract methods which will make sure that the consumer will have to code those implementation for handling the questions as well as answers where events starts to manipulate.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWmhWzMBEY0JWxWBEnjeXFNH969QOGe6x2CSjlCBCb13_jLlckgpu3o-maJ6aTx0mppwbFy6IqkCMUJfnwnrBpWeKlbAR0lOKKNA5qUBGIuxpmz4-ePV-Ne06kjPLRSDuMi_LIdwULhPrl/s1600/DialogItems_Java.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWmhWzMBEY0JWxWBEnjeXFNH969QOGe6x2CSjlCBCb13_jLlckgpu3o-maJ6aTx0mppwbFy6IqkCMUJfnwnrBpWeKlbAR0lOKKNA5qUBGIuxpmz4-ePV-Ne06kjPLRSDuMi_LIdwULhPrl/s320/DialogItems_Java.png" width="107" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">DialogItems.java</td></tr>
</tbody></table>
Let's start with playing with this starting with our fragment.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOW_a_MTNNyZPiHjTgnNlhel6aYzpHehSH7JYPV1CcY9mjOqFmIm62VaUdpaLkNLwK8PRhvv7sBht-H0cRXCLZ7Ln-hcF5T1-CFh6jArleYzcp_QT4uoAvWOywZ4JGo1EAiSLEN1o3FbvA/s1600/testFgmt.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOW_a_MTNNyZPiHjTgnNlhel6aYzpHehSH7JYPV1CcY9mjOqFmIm62VaUdpaLkNLwK8PRhvv7sBht-H0cRXCLZ7Ln-hcF5T1-CFh6jArleYzcp_QT4uoAvWOywZ4JGo1EAiSLEN1o3FbvA/s320/testFgmt.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">testFgmt.jsff</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt-NXhyaDX1VrLbAgnb-zE63v-1VKM9IPrOZV9p8JmhGer2HYVPqV80RycZzTp_EdgvOovsKCI0aewyglqu5gBquO6As1rkWXewobIuw_7wb_TPjRZKYQwL2Ib0r6CS10w4vM5e2V-R6yQ/s1600/test-flow.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt-NXhyaDX1VrLbAgnb-zE63v-1VKM9IPrOZV9p8JmhGer2HYVPqV80RycZzTp_EdgvOovsKCI0aewyglqu5gBquO6As1rkWXewobIuw_7wb_TPjRZKYQwL2Ib0r6CS10w4vM5e2V-R6yQ/s320/test-flow.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">test-flow.xml</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
Take note how I kept the items in the pageFlow scope, for longer life in its context.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuPlNEILTV2mGXUTu6ZQMQ4iXrjqNtBic0PJZWOCFGQCkqPDC18RE090-6mWL811Ghgk4qVaw4-4jqieUcm3dYIkH6InfE5TmJKXYgzgdYedCQWjB3UVLuHFsMGVPotUTFF9SsfHbh-I7o/s1600/TesterBb_Java.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuPlNEILTV2mGXUTu6ZQMQ4iXrjqNtBic0PJZWOCFGQCkqPDC18RE090-6mWL811Ghgk4qVaw4-4jqieUcm3dYIkH6InfE5TmJKXYgzgdYedCQWjB3UVLuHFsMGVPotUTFF9SsfHbh-I7o/s320/TesterBb_Java.png" width="282" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">TesterBb.java</td></tr>
</tbody></table>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
The launch method in this class is the entry point of calling the component.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGcqJGBxfQU3O4VugogocLmiYu68JX8QjsPmfV6_cXZSavJLBJuzuFssTD57fnYqWjaI5F4rXivTaqsOQ-MYET9DO7vpGZrmdZ4Y4ZqsTlecXIadALBTKHbqnfXRlKErvtqBU_d5WuKmhx/s1600/SampleItemsPb_Java.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGcqJGBxfQU3O4VugogocLmiYu68JX8QjsPmfV6_cXZSavJLBJuzuFssTD57fnYqWjaI5F4rXivTaqsOQ-MYET9DO7vpGZrmdZ4Y4ZqsTlecXIadALBTKHbqnfXRlKErvtqBU_d5WuKmhx/s320/SampleItemsPb_Java.png" width="234" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">SampleItemsPb.java</td></tr>
</tbody></table>
All the hooks are implemented here.<br />
<br />
<ul>
<li>initializeItems - This is where I insert question data</li>
<li>onConfirm - I check for at least one affirmative answer before I return a yey' to the super class</li>
<li>configureAnswer - Just an extra hook before setting the values (think of it as setAttributeInternal :) )</li>
<li>resetItems - I directly set the answers back on their initial state which is unanswered.</li>
</ul>
<br />
So let's start putting it to the test.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbvNF_PB_v67XsTY8VSodHT6iN0asXn8tPv4TtKhbU5pc_-igGEw6fQusfXlyeHWuCtfIJVxHUFNFTUO1Za-9Atz-AOicuXyuM2PrMj6wqxgJgSVMdfCpTf9nbub1o0xwWOgtIWKKmyCfl/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbvNF_PB_v67XsTY8VSodHT6iN0asXn8tPv4TtKhbU5pc_-igGEw6fQusfXlyeHWuCtfIJVxHUFNFTUO1Za-9Atz-AOicuXyuM2PrMj6wqxgJgSVMdfCpTf9nbub1o0xwWOgtIWKKmyCfl/s320/a.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjRe8BjDKIHiac0-kIVESLhvHbDDIJFVHo3Lnvfsbjxmm4kxPR1cgwmTa_dL7JEqAG-MVxtlJBihgWJ0auy6ke3754vr3_JdtPDKf2eSz-NzPn0Rg23B6Ego1VZpWPi3P0n-7V9cI-L5u_/s1600/b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjRe8BjDKIHiac0-kIVESLhvHbDDIJFVHo3Lnvfsbjxmm4kxPR1cgwmTa_dL7JEqAG-MVxtlJBihgWJ0auy6ke3754vr3_JdtPDKf2eSz-NzPn0Rg23B6Ego1VZpWPi3P0n-7V9cI-L5u_/s320/b.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjAoW_IVaqPpfmEewALDiHUT2iUO6OZNxYdM7Wh2IfXv2Eujnj2gOnaeol3GkgORQlceXfyGzsaJ3jz8iajDtGwJy2zEf4-fV1dtRpYJ2eNy-sw9aaZ7YIpnEfVWACUwGZM9ck_mRIHd_f/s1600/c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjAoW_IVaqPpfmEewALDiHUT2iUO6OZNxYdM7Wh2IfXv2Eujnj2gOnaeol3GkgORQlceXfyGzsaJ3jz8iajDtGwJy2zEf4-fV1dtRpYJ2eNy-sw9aaZ7YIpnEfVWACUwGZM9ck_mRIHd_f/s320/c.png" width="320" /></a></div>
<br />
Kudos to declarative components.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br /></div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0tag:blogger.com,1999:blog-8016119789491424221.post-91643286208293421702011-10-09T19:10:00.000-07:002011-10-09T19:10:34.424-07:00Remote Task Flow as a List-of-Values (LOV) Selection DialogTerms:<br />
Remote Task Flow = RTF<br />
<br />
I'd like to share a small demo in using a remote task flow configuration to be used as my list-of-input-values. Along with this demo, I'll present it while taking templates as well as a generic wrapper task flow. The generic wrapper task flow is only needed to allow us to directly expose the RTF to be configured as a NON-Page Fragment task flow. More explanations later on.<br />
<br />
RTF is a pretty cool ADF feature which is presented in one of ADF Code Corner's presentation:<br />
<br />
<a href="http://www.oracle.com/technetwork/developer-tools/adf/learnmore/43-remote-task-flow-169185.pdf">#43 How-to integrate remote task flows in your ADF applications (POJO DC Example)</a><br />
<br />
<br />
So to start with, let me create my template project with my URL LOV Task Flow template as well as my wrapper task flow. Ow, also there is my LOV Page Template.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy1y-0SGMIF6WEUOO2TuVd_WsPzF6kFOyHFX0S2O_AnE3NlVgYSooTNOAOTy2laGRjAlVAlO8-hDmWV1Z0qWm2V9SxsEcdYb6sxD9l4QcLU7psCtmmkuTkXmGhItV_JacobdNP5Un4CR5j/s1600/PageLovTemplateDef.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy1y-0SGMIF6WEUOO2TuVd_WsPzF6kFOyHFX0S2O_AnE3NlVgYSooTNOAOTy2laGRjAlVAlO8-hDmWV1Z0qWm2V9SxsEcdYb6sxD9l4QcLU7psCtmmkuTkXmGhItV_JacobdNP5Un4CR5j/s320/PageLovTemplateDef.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">PageLovTemplateDef.jspx</td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: center;"></div><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE1o6b9Hayu2DnsHih9tu2ovSEAqE5xVDX1uwryG6XfRXGG-mEc-5saO60k6dlSKXk3E2P55O-Xxxiyi76g8FbIAlf_wVH8rj52-YtpRlB_XA8OvmfeDmB-7L6OkyVt09MogIPmqfQ7BZJ/s1600/url-lov-util-tf.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE1o6b9Hayu2DnsHih9tu2ovSEAqE5xVDX1uwryG6XfRXGG-mEc-5saO60k6dlSKXk3E2P55O-Xxxiyi76g8FbIAlf_wVH8rj52-YtpRlB_XA8OvmfeDmB-7L6OkyVt09MogIPmqfQ7BZJ/s320/url-lov-util-tf.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">url-lov-util.xml - I'd like to point out how I'm transferring the return parameters of the RTF to the wrapper's pageFlowScope.</td></tr>
</tbody></table><div style="text-align: center;"><br />
</div><div style="text-align: center;"><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjITsV8Fic-nqJxJOHMnaIfFO49TM9H-DOMKClHWOJEOxv_buIekaQwd0EW1wbAOESXdupGVcilZ4QrO1_z-c8D6fcdOEQ53SV-nmB4bX01Km0ZcFntGTjAXbsNXc3Sh6o-JC9edC-bKoU0/s1600/url-lov-util-param.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="113" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjITsV8Fic-nqJxJOHMnaIfFO49TM9H-DOMKClHWOJEOxv_buIekaQwd0EW1wbAOESXdupGVcilZ4QrO1_z-c8D6fcdOEQ53SV-nmB4bX01Km0ZcFntGTjAXbsNXc3Sh6o-JC9edC-bKoU0/s320/url-lov-util-param.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">url-lov-util.xml - InputParameters</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrQPhBSJ1_N505W0p4iy2j1CzSBvKchh-NilGbR_kVNIaQ8a5dzkwPZ7HrNH8CrxAohGcjUQdtzpH15kC6bcPEQVbhO_6-KDRTgWODkT_15J4iqOyFtiEK7iP8txLtRjsAg1E6yZGAJEW5/s1600/url-lov-util-url-lov-activity.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="110" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrQPhBSJ1_N505W0p4iy2j1CzSBvKchh-NilGbR_kVNIaQ8a5dzkwPZ7HrNH8CrxAohGcjUQdtzpH15kC6bcPEQVbhO_6-KDRTgWODkT_15J4iqOyFtiEK7iP8txLtRjsAg1E6yZGAJEW5/s320/url-lov-util-url-lov-activity.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">url-lov activity's task flow configuration. Take note, this part is exactly what the code corner article will teach you :)</td></tr>
</tbody></table><br />
<br />
Here's my project structure for the LOV Dialogs. Only thing you definitely need for this project is the template project (mentioned above). For my sample, I'll be creating two kinds of LOV, Locations and Departments, care of HR Schema.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4leKZjC1cWDt2Tr59Bu5VgFheEnNue_RO0KVtAuI7BfwRiNhf3TlVNg8db-6LTv_l6cbABKEW2IICgK0B3qH1n6DDQLTfxg48q56MwtG-h4UEZO3yVEqgydnmiZNM3dlLWNpPzkY1Sxt9/s1600/ExposedURLDialog_Projects.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4leKZjC1cWDt2Tr59Bu5VgFheEnNue_RO0KVtAuI7BfwRiNhf3TlVNg8db-6LTv_l6cbABKEW2IICgK0B3qH1n6DDQLTfxg48q56MwtG-h4UEZO3yVEqgydnmiZNM3dlLWNpPzkY1Sxt9/s320/ExposedURLDialog_Projects.png" width="260" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table>TaskFlow design for both are pretty much the same so I'll just describe the Department scenario.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt90ORmg5NZmaeGyOquM2djl2AljCiXrx_RdrVv4pq3-WHcTq9tz8uFtOQshb-YOAFQpejNzAHMf3UjpZIXtNIxcgANEqJ7-sbM36uevoJ-O8CrS2D6OlfqhT8D3pNNNQXCSrOjFdUaBN5/s1600/url-lov-departments.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt90ORmg5NZmaeGyOquM2djl2AljCiXrx_RdrVv4pq3-WHcTq9tz8uFtOQshb-YOAFQpejNzAHMf3UjpZIXtNIxcgANEqJ7-sbM36uevoJ-O8CrS2D6OlfqhT8D3pNNNQXCSrOjFdUaBN5/s320/url-lov-departments.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">url-lov-departments.xml</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk0TnZGDOcElpAECm9wvWU8CMWswJbebeQuPzXFrt7y6ppkCiJ4KsI6TZTIn8Fz-Cz2jH46b5DbusY8Lz_wPzxaEGUJ94N8iN18QJyX2QxtaSdmt07cP7Bu83nGDmXfuUVrx8doyWUzUKz/s1600/DepartmentsView.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk0TnZGDOcElpAECm9wvWU8CMWswJbebeQuPzXFrt7y6ppkCiJ4KsI6TZTIn8Fz-Cz2jH46b5DbusY8Lz_wPzxaEGUJ94N8iN18QJyX2QxtaSdmt07cP7Bu83nGDmXfuUVrx8doyWUzUKz/s320/DepartmentsView.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">DepartmentsView.jspx</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5lqQeHhyphenhyphendmk6MwLPcrQK7zVbbZD5BVxeaJgEOTPOIQtbWpkucnpZfIxXtAitvXxpJr4bXRXqBTF-rUi71P611XFWxQtiWIHXvQgVs9WvxCgflrtXdjOnkgUTZsUph88y42wRi7j1Fw44T/s1600/UrlLovBb.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5lqQeHhyphenhyphendmk6MwLPcrQK7zVbbZD5BVxeaJgEOTPOIQtbWpkucnpZfIxXtAitvXxpJr4bXRXqBTF-rUi71P611XFWxQtiWIHXvQgVs9WvxCgflrtXdjOnkgUTZsUph88y42wRi7j1Fw44T/s320/UrlLovBb.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">UrlLovBb.java</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyLHUSdWvcr2S2emJslheAu2dsXTwQMdlANY6LeVQUOKCtq6TLR8M3r8K9d2mxo60tCmQil_BpCrwhYLO_inwzV_hfiN8eSCfVi-qMNsLv-Sxq4jop9wpI4xhEQQ4mV9rEN5h5cQ6pSqV4/s1600/DepartmentsLovBb.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyLHUSdWvcr2S2emJslheAu2dsXTwQMdlANY6LeVQUOKCtq6TLR8M3r8K9d2mxo60tCmQil_BpCrwhYLO_inwzV_hfiN8eSCfVi-qMNsLv-Sxq4jop9wpI4xhEQQ4mV9rEN5h5cQ6pSqV4/s320/DepartmentsLovBb.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">DepartmentsLovBb.java</td></tr>
</tbody></table><br />
Couple notes to explain the functionality. The base class simply enforces a signature as well as a utility to directly throw parameters to the PageFlowScope starting with suffix "A". The taskflow is based on the taskflow template thus consuming taskflow would already expect the output parameters. (which really is the wrapper taskflow anyway). Besides that, everything else is still quite in the realm of adf :)<br />
<br />
Next step is the consuming page as well as the usage of the wrapper taskflow.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7zo6iUP6O2KC0K5BrIIItyrxS7075nZHSO0WONRlgR4mjtxNksOJzL_auDBzwJxWLNufA8D0TZ2ykKy-OJXH1zSUwXyCS86dXfKnQrm3zrA6O99nKKJw8vmSKAgkLgIL2dI_kwB7Xvo2J/s1600/SampleConsumerProject.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7zo6iUP6O2KC0K5BrIIItyrxS7075nZHSO0WONRlgR4mjtxNksOJzL_auDBzwJxWLNufA8D0TZ2ykKy-OJXH1zSUwXyCS86dXfKnQrm3zrA6O99nKKJw8vmSKAgkLgIL2dI_kwB7Xvo2J/s1600/SampleConsumerProject.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Consuming Project</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOgCq8o06OV7ZHS5D0HK3uLTae4FCH0_2cv3JbuC5Y9U6yOzLUEEHwoD67VPr5SgD-P5SrhWhgTD0vSAGHjhLdAT8LiHUxTsx1Rt3rIm8D9c0jiDyVS5JzZh4YNXlKeqXfYQMlkG7Fc3fu/s1600/main-index.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOgCq8o06OV7ZHS5D0HK3uLTae4FCH0_2cv3JbuC5Y9U6yOzLUEEHwoD67VPr5SgD-P5SrhWhgTD0vSAGHjhLdAT8LiHUxTsx1Rt3rIm8D9c0jiDyVS5JzZh4YNXlKeqXfYQMlkG7Fc3fu/s320/main-index.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">main-index.xml - departmentsLov activity parameters</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFKj98K0n2Q2AUU1kyTnVdkFZWRm2reSpk5Ps2Es_xIXrS2SSPqXWfKotzOPOzlGxdkUAp12-92WmBjHfc1aEunLXLRWRH1tXQXoOskpyAundbddAJhImTyfe8AvUkQsK98xEakfdpayUC/s1600/mainIndexFgmt.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="147" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFKj98K0n2Q2AUU1kyTnVdkFZWRm2reSpk5Ps2Es_xIXrS2SSPqXWfKotzOPOzlGxdkUAp12-92WmBjHfc1aEunLXLRWRH1tXQXoOskpyAundbddAJhImTyfe8AvUkQsK98xEakfdpayUC/s320/mainIndexFgmt.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">mainIndexFgmt</td></tr>
</tbody></table><br />
<div class="separator" style="clear: both; text-align: center;"></div>Let's go for testing already!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAqqHlNvNH_Z1FuUjQknQLZlpPHUyMhwLBSnLnPS7CV5HFg9_nR1hGLfkTX0qvGJYJ9dj84PMY8bdTV-sG9lG__OUY0nW4Bp4YgfoqS_PL9iQksbG3uJGl7Cldxugc25fR7GNLyEncIzYh/s1600/MainIndex_Run.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAqqHlNvNH_Z1FuUjQknQLZlpPHUyMhwLBSnLnPS7CV5HFg9_nR1hGLfkTX0qvGJYJ9dj84PMY8bdTV-sG9lG__OUY0nW4Bp4YgfoqS_PL9iQksbG3uJGl7Cldxugc25fR7GNLyEncIzYh/s320/MainIndex_Run.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja64T_BY90tXQgTkRxfIQMsooghdDiRLD21JJiD7GaNN7qjeM_PY0hLoBTr7DuH1KBJRQH5LzLXlYtjrnyQTffU91iW20n5Vv9sI64eunBIOu033JYfwxy6L63DcEroVqKlYgSSO6hacVk/s1600/MainIndex_Run_SelectDept.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja64T_BY90tXQgTkRxfIQMsooghdDiRLD21JJiD7GaNN7qjeM_PY0hLoBTr7DuH1KBJRQH5LzLXlYtjrnyQTffU91iW20n5Vv9sI64eunBIOu033JYfwxy6L63DcEroVqKlYgSSO6hacVk/s320/MainIndex_Run_SelectDept.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0ZgSlVjrsofAOqrBsKlg94lpELJomADH0t8x51F_izcAfdaBV23pboyBS-MpBfKThkxCQzAB4woN4qFn55stWqLUQ5Q7vCO_g0JftD_O9OyOEvkoMW5i5hZ1WwFMj6uR3_RLsteVsNrH-/s1600/MainIndex_Run_SelectDeptSelected.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0ZgSlVjrsofAOqrBsKlg94lpELJomADH0t8x51F_izcAfdaBV23pboyBS-MpBfKThkxCQzAB4woN4qFn55stWqLUQ5Q7vCO_g0JftD_O9OyOEvkoMW5i5hZ1WwFMj6uR3_RLsteVsNrH-/s320/MainIndex_Run_SelectDeptSelected.png" width="320" /></a></div><br />
And here's Location:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiQKPxX4MBfIxzaKvJfsgHqPzercALmHKw5p9IffEgqBQexWgIc-swAbyA7wnUGm_zG44Pxni2Qz44lDFTsFdUppLcIfoRjI1jF9DDO1a7Og-E5tQ1o82KUkN7imhO5S9Ciet5-sIKsYcq/s1600/MainIndex_Run_SelectLoc.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiQKPxX4MBfIxzaKvJfsgHqPzercALmHKw5p9IffEgqBQexWgIc-swAbyA7wnUGm_zG44Pxni2Qz44lDFTsFdUppLcIfoRjI1jF9DDO1a7Og-E5tQ1o82KUkN7imhO5S9Ciet5-sIKsYcq/s320/MainIndex_Run_SelectLoc.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigiZMJznes-iXytU-8Y62gGXGmg1qPTWxwUlgErlPHrXD2CaLSSyeCF0b5hL4wDNn_somviiwPhB98UbEzeqOLbeZkLoDWY-tve_A8RIswEAENn6mtAutWSr3GQ6EwG2sbmqM2T6J6SSVs/s1600/MainIndex_Run_SelectLocSelected.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigiZMJznes-iXytU-8Y62gGXGmg1qPTWxwUlgErlPHrXD2CaLSSyeCF0b5hL4wDNn_somviiwPhB98UbEzeqOLbeZkLoDWY-tve_A8RIswEAENn6mtAutWSr3GQ6EwG2sbmqM2T6J6SSVs/s320/MainIndex_Run_SelectLocSelected.png" width="320" /></a></div><br />
And that's the beginning of October.Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com2tag:blogger.com,1999:blog-8016119789491424221.post-8689745695996437962011-08-01T18:01:00.000-07:002011-08-01T18:01:15.731-07:00ADF Table with Flowing LayoutProbably one of the overlook features of the af:table is it ability to geometrically adjust to a flowing layout based on the table's rangsize property (well along with a couple configurations).<br />
<br />
So for this blog, I'll be creating a simple page which is flowing (of course) and render 3 tables flowing vertically with the table size adjusting with the minimum # of rows that I'd like to display.<br />
<br />
High level design would look something like this.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyQ2RkXKZCAwML5ZtQxHuSFZXjJhK150M5q141XxtP4opQOrMkeGVc-YF5aXYmZMMGw0EBU5G6tH_Y8z40FmEZoMg-PcqrZmxdN2GzXURgak934UWhR3sxr0UuMg8j5GSlv5beFO3IjT7_/s1600/layout.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyQ2RkXKZCAwML5ZtQxHuSFZXjJhK150M5q141XxtP4opQOrMkeGVc-YF5aXYmZMMGw0EBU5G6tH_Y8z40FmEZoMg-PcqrZmxdN2GzXURgak934UWhR3sxr0UuMg8j5GSlv5beFO3IjT7_/s320/layout.png" width="285" /></a></div><br />
Blue = panelGroupLayout (vertical)<br />
Green = panelBox<br />
Orange = adf table = styleClass as AFStretchWidth (this is because we set a stretch component inside a flowing)<br />
White = for screenshot purpose hehe.<br />
<br />
Well adf table also needs immediate set to its content delivery and rangsize. Yeah the only drawback is the immediate, so I definitely don't recommend trying to set a table which queries hundreds of rows in here. But still particularly good for those which you know will always be filtered.<br />
<br />
Ow, and also autoHeightRows should be equal to 0.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvM-pNQdkc5sjZcLMstj5HrfM_4a-RfiEjm6LfJqTeLZmX4slePnIjuSxFACa9ZlTq4lbNVQLDfuFoYBoWLrxJgCVY0VTuwFeYlVgfqMi3-zpJ-GbTGLoyUgWYDHQBCi9mPjNFFRhUzQAm/s1600/table.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvM-pNQdkc5sjZcLMstj5HrfM_4a-RfiEjm6LfJqTeLZmX4slePnIjuSxFACa9ZlTq4lbNVQLDfuFoYBoWLrxJgCVY0VTuwFeYlVgfqMi3-zpJ-GbTGLoyUgWYDHQBCi9mPjNFFRhUzQAm/s320/table.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Employees Table sample JSF code</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw5V4_gXmY8uuGIlTrKK_hr5VzG_WXUQ8yDXlou3bg7_CcLjtCkN7JpJbxL8IZGbi63fodrhHYn0wRlDqLiOhuUtr_cQT9tehiSCtur5FVh1LAPxdeH8wcS1VWWUr1VtILaNDERtnLO9SY/s1600/mainIndex.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw5V4_gXmY8uuGIlTrKK_hr5VzG_WXUQ8yDXlou3bg7_CcLjtCkN7JpJbxL8IZGbi63fodrhHYn0wRlDqLiOhuUtr_cQT9tehiSCtur5FVh1LAPxdeH8wcS1VWWUr1VtILaNDERtnLO9SY/s320/mainIndex.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Working Code</td></tr>
</tbody></table><br />
I forced the vertical scrollBar to show up hehe.Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0tag:blogger.com,1999:blog-8016119789491424221.post-37168799528782009232011-07-30T18:51:00.000-07:002011-07-30T18:51:47.850-07:00Changing Skin Version using ADF Shared LibraryUsing Andrejus's blog about <a href="http://andrejusb.blogspot.com/2010/07/deploying-adf-applications-as-shared.html">Deploying ADF Applications as Shared Libraries on WLS</a>, I tried to make a shared skin library. I'll try to make this blog quick as Andrejus's blog already says it all.<br />
<br />
The only thing I'm trying to figure out though, is how to make the main Running Application change or point to the new Library version without having the need to stop it.<br />
<br />
To start with, I created a simple application which already utilizes shared taskflow libraries.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqGn0-gq9uw714Tm-8HKUrKYKeduHzwRAeZEOq1-Gg0ihpoBPmkRtKi8hvxVjdqeZNOoaRYhAZmNXPIRI8uIpfVOaMlRGvAiiU3bxATvG4-YfhkOK5llMH1_E7A0MIHldzWT1Qn5HO07DW/s1600/mainAppDefault.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqGn0-gq9uw714Tm-8HKUrKYKeduHzwRAeZEOq1-Gg0ihpoBPmkRtKi8hvxVjdqeZNOoaRYhAZmNXPIRI8uIpfVOaMlRGvAiiU3bxATvG4-YfhkOK5llMH1_E7A0MIHldzWT1Qn5HO07DW/s320/mainAppDefault.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MainApplication - Default</td></tr>
</tbody></table><br />
Next I'll create a separate application which contains the CSS file as well as the Trinidad definition (trinidad-skins.xml). We need to create a separate project mainly so that we can deploy it as a shared library which requires it to be a WAR.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPV2RKpfIH0IZES0uqSrIjr6pNigCWAm3cj02pVaYNVd665Dyj_v6Ruuv5s5-b9q9YK5s86n2zhf7-VoVDXiPIjCEOmUuE_ufez9BYJVDJ4j8JQRDqvpxPCAd-PTnOF8kZYHmncQDm0Yvq/s1600/css_initial.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPV2RKpfIH0IZES0uqSrIjr6pNigCWAm3cj02pVaYNVd665Dyj_v6Ruuv5s5-b9q9YK5s86n2zhf7-VoVDXiPIjCEOmUuE_ufez9BYJVDJ4j8JQRDqvpxPCAd-PTnOF8kZYHmncQDm0Yvq/s1600/css_initial.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">sharedDefault.css - Let's keep it simple and obvious, for testing anyway hehe.</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic_DwOTUiVJvTOyEsPfRMz442lWyTSVzuYLWIXdLap21-V8ViNao4Jy-RcGLriL8GeR1cRdoFwcOz7qsHpwIaDEX_ul9h0uIlnO0axrrMPHimBQLaZ0bYftawTamy5U-v84z5Pj-lzspEi/s1600/sharedSkinProject.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic_DwOTUiVJvTOyEsPfRMz442lWyTSVzuYLWIXdLap21-V8ViNao4Jy-RcGLriL8GeR1cRdoFwcOz7qsHpwIaDEX_ul9h0uIlnO0axrrMPHimBQLaZ0bYftawTamy5U-v84z5Pj-lzspEi/s320/sharedSkinProject.png" width="265" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Default Shared Skin Project</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigCtMCTsdBnjmmqN6SktMHuYzwBK9oHURTpjmEpL0YV5zSfQ_byDDrGsP6SlmbzqMRY4WovnDpLjvNJo-vFu5F3L9z8QUmKO5f-NuCxDHhzJAjAWY_329H5lcsUrZsJ6PARDciKSWbIIhZ/s1600/trinidadSkins.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="110" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigCtMCTsdBnjmmqN6SktMHuYzwBK9oHURTpjmEpL0YV5zSfQ_byDDrGsP6SlmbzqMRY4WovnDpLjvNJo-vFu5F3L9z8QUmKO5f-NuCxDHhzJAjAWY_329H5lcsUrZsJ6PARDciKSWbIIhZ/s320/trinidadSkins.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">trinidad-skins.xml</td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: center;"><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr2oAEnEEj3Bi7frxh-QKtdi5BAxYJuiZeEQuRBnJ1C5hSBFyK-YF3y4MmQWnqa2GL8miM2Ct0vDmFys89vi3O77VjRidx_RF0JIakKLePhBj5tdNfi-QRdgfvzbKrQgLSaoZh3OtDKG9-/s1600/manifest.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr2oAEnEEj3Bi7frxh-QKtdi5BAxYJuiZeEQuRBnJ1C5hSBFyK-YF3y4MmQWnqa2GL8miM2Ct0vDmFys89vi3O77VjRidx_RF0JIakKLePhBj5tdNfi-QRdgfvzbKrQgLSaoZh3OtDKG9-/s1600/manifest.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MANIFEST.MF</td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: center;"><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV1ZL066f2rjOHbTx1XRTY2sqMG7GsSF41-eY7w_as_VH1OZCKmhXLPspI2NLEOZfUTiobBHIK-CaPP0wWJc5s2ym_EcC84uI6THREcC2zogY4VgDMHsDdzfhG3XtFaww77ftFgIjC_4E3/s1600/sharedSkinDeploymentProfiles.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV1ZL066f2rjOHbTx1XRTY2sqMG7GsSF41-eY7w_as_VH1OZCKmhXLPspI2NLEOZfUTiobBHIK-CaPP0wWJc5s2ym_EcC84uI6THREcC2zogY4VgDMHsDdzfhG3XtFaww77ftFgIjC_4E3/s320/sharedSkinDeploymentProfiles.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Shared Skin Library - Deployment Profiles</td></tr>
</tbody></table>I created a WAR for my shared library, and an ADF Jar for the application using it. Just a key thing needed for the WAR to work correctly as a shared library, you'll need to configure the MANIFEST as well as the ContextRoot.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXQCS17AbEUpDp7mspiS_skYDejIoKRiLg2yxvaSAS3woJLztJWP_FvAhWbxPrWePJomATmtfpvVbLv7tF22X1qo8eUMqe97SBsDbLAk4mW04UfWS39hpH6TBMCW3hYUPNB_kD6g3EUOSJ/s1600/contextRoot.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXQCS17AbEUpDp7mspiS_skYDejIoKRiLg2yxvaSAS3woJLztJWP_FvAhWbxPrWePJomATmtfpvVbLv7tF22X1qo8eUMqe97SBsDbLAk4mW04UfWS39hpH6TBMCW3hYUPNB_kD6g3EUOSJ/s320/contextRoot.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">WAR Context Root to Empty</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiReeYLgKy0Spgrgnd5aj4vH0BFWUcWJYOpDIvm5QK9PbxxncB-2HluaSDurmg99F0V45yF4ta-UGI5VEFX-DVc8LFn5QxOlJd3A8Svhd7kY3a4BCVsGnYToXEDm00L3HEtai4nGSt-DWuT/s1600/profileManifest.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiReeYLgKy0Spgrgnd5aj4vH0BFWUcWJYOpDIvm5QK9PbxxncB-2HluaSDurmg99F0V45yF4ta-UGI5VEFX-DVc8LFn5QxOlJd3A8Svhd7kY3a4BCVsGnYToXEDm00L3HEtai4nGSt-DWuT/s320/profileManifest.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MANIFEST.MF Included</td></tr>
</tbody></table>So, after running our main application through JDeveloper, we'll get as expected our green screen.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgswwV1EFAZEhOpADIFRgEPqpqbz8vBYYtMW3SO1wPaw__Y4EIaUb_gcvR-zDJm15tdkr1U0mhI0DBSurMBAP6Ku3uN7pQ7jiSChm52ORVck2IFkF7YiW8LV0M6fimfZa52KX31NQLuFwXA/s1600/mainAppRunSkin.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgswwV1EFAZEhOpADIFRgEPqpqbz8vBYYtMW3SO1wPaw__Y4EIaUb_gcvR-zDJm15tdkr1U0mhI0DBSurMBAP6Ku3uN7pQ7jiSChm52ORVck2IFkF7YiW8LV0M6fimfZa52KX31NQLuFwXA/s320/mainAppRunSkin.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Integrated Run</td></tr>
</tbody></table>So that we can see what we could expect when things go wrong, let's try deploying our shared library and deploy our application as well as an EAR without configuring the library reference.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpfLjCJVh925KyzydMxobCzChPwjRywijPj79JjJ9jCNcpzhk4FspypPE3EXEzHvZq2wD9oXyWM5K7Lc1pfJ4jJ7T9rdNsHE_2-M9JtJt6U5OT0puTiSR5oh1D1CKr6IPNH_kup102M_pW/s1600/mainAPpDeployment.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpfLjCJVh925KyzydMxobCzChPwjRywijPj79JjJ9jCNcpzhk4FspypPE3EXEzHvZq2wD9oXyWM5K7Lc1pfJ4jJ7T9rdNsHE_2-M9JtJt6U5OT0puTiSR5oh1D1CKr6IPNH_kup102M_pW/s320/mainAPpDeployment.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Filter the skin library as part of deployment files</td></tr>
</tbody></table><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs-mqPRk5MqErDQfC-HixLeBnCuHtCv8xxAi8iBCAyx8YlPtShAM_IzYuZChzEPBHsFkCs1Yvs9Qzu7iWEGnIC2d7D0W1aZKlVFmAhJUrSLYCCuQKDKdqq2BZdJIiplN4YFpgVlWI06cQ4/s1600/deployment.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs-mqPRk5MqErDQfC-HixLeBnCuHtCv8xxAi8iBCAyx8YlPtShAM_IzYuZChzEPBHsFkCs1Yvs9Qzu7iWEGnIC2d7D0W1aZKlVFmAhJUrSLYCCuQKDKdqq2BZdJIiplN4YFpgVlWI06cQ4/s320/deployment.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Deployment in Weblogic Console</td></tr>
</tbody></table><br />
Here's our FAILED attempt #1.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_YA9MIbyWGnVFC72pCuoirNVn-jKZtw5g88DDdLbBvVuhyOg2S0mqk_H6YQzOFu4RYzQGgb80szblOuIyMUnqEYjUfZMpSDgGbeOyjGS2Mfxk_IqiYZzO857gxBhswwYRRnK5JZOvaoHj/s1600/consoleWarning.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="55" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_YA9MIbyWGnVFC72pCuoirNVn-jKZtw5g88DDdLbBvVuhyOg2S0mqk_H6YQzOFu4RYzQGgb80szblOuIyMUnqEYjUfZMpSDgGbeOyjGS2Mfxk_IqiYZzO857gxBhswwYRRnK5JZOvaoHj/s320/consoleWarning.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Console Warning</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy46nJsAUF6ge8-3xSmbEgCq5_3Qe_9ZaKMJWJlscVgwRjuDDEa6v5j1FqLStc5zYJEdgf8-Mr4t4ErYzO0tdzfR7-4ZiM3CgLe_ThMyJkfa7tR-pOq2AFnyfmI8fX0ENVcpkMKjXe3fKV/s1600/mainAppFailed.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy46nJsAUF6ge8-3xSmbEgCq5_3Qe_9ZaKMJWJlscVgwRjuDDEa6v5j1FqLStc5zYJEdgf8-Mr4t4ErYzO0tdzfR7-4ZiM3CgLe_ThMyJkfa7tR-pOq2AFnyfmI8fX0ENVcpkMKjXe3fKV/s320/mainAppFailed.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Failed Attempt</td></tr>
</tbody></table><br />
So as you can see, worst thing that could happen is that your application will use simple skin because it can't find the skin you want.<br />
<br />
So for this, what we're missing is the weblogic.xml entry for the library-ref. Let's add it now and re-run our page.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLaZnZksw2wxvAWL-3RdT4R_l0kzmN4YIYGnU0N5hscb_IO6NxcHixF1tNa-QM-cez9c3oAkQOrCrVoRFWv2F_0SHcRlR1SyRb1vvmwxzA0p6UdrBHZq5wX5nzAIayJDtonbV0QpSo_MiB/s1600/weblogicxml.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="57" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLaZnZksw2wxvAWL-3RdT4R_l0kzmN4YIYGnU0N5hscb_IO6NxcHixF1tNa-QM-cez9c3oAkQOrCrVoRFWv2F_0SHcRlR1SyRb1vvmwxzA0p6UdrBHZq5wX5nzAIayJDtonbV0QpSo_MiB/s320/weblogicxml.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">weblogic-xml</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_PLZD5PAmI8oOoHcSz_4Qy-5sfK-IU2Rtcx1juI2BZEx7UcaZeOtSriKxFswZw2Q1tWfIyfgt5VatNs7MQRPlxPdb5X3S-4b9HO-4bvlypNDR01Qc3Ku37aPuuOTRFLcxxaG_3uiXFSM5/s1600/mainAppSuccess.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_PLZD5PAmI8oOoHcSz_4Qy-5sfK-IU2Rtcx1juI2BZEx7UcaZeOtSriKxFswZw2Q1tWfIyfgt5VatNs7MQRPlxPdb5X3S-4b9HO-4bvlypNDR01Qc3Ku37aPuuOTRFLcxxaG_3uiXFSM5/s320/mainAppSuccess.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">SUCCESS</td></tr>
</tbody></table>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com1tag:blogger.com,1999:blog-8016119789491424221.post-13366478622639805962011-07-20T16:18:00.000-07:002011-07-20T16:18:29.388-07:00Simple Implementation of AF SelectManyChoice being used in a clickToEdit TableI'm making a quick blog for a not-so-obvious solution when using a SelectManyChoice. I complicated the scenario a little bit by using this component in a table.<div><br />
</div><div>The Adf SelectManyChoice uses List<String> as its value type. Unfortunately, this stops you from directly using it or binding it to a pageDef attribute bindings.</div><div><br />
</div><div>A solution for this is by using a BackingBean and take a handle on its getter and setter while resolving or pointing the value to-and-from the actual value holder.</div><div><br />
</div><div>In my example, I will present an attribute with attributeName "CODE" and this code value will be read by the selectManyChoice as well as modified. Also, I'm showing the "CODE" attribute as inputText so that I can present how the "read" part works.</div><div><br />
</div><div>First I prepare my selectManyChoice's options by utilizing a pageFlowBean. Oh, I also use this same mBean to hold my table rows.</div><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo6wigLEkCIMKoY48df2S5xaHv702HsJTWueBAtE4-VBCPtXTQp4UZIYXJdK1gW4gtpJXOeybNDIqzMOtbrZMKmTXm1Mu8_4mncnTSgGBs1dMDfgc-mMiuITuEVv29K2G2eyqGQ0l0oRCZ/s1600/TestPb.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo6wigLEkCIMKoY48df2S5xaHv702HsJTWueBAtE4-VBCPtXTQp4UZIYXJdK1gW4gtpJXOeybNDIqzMOtbrZMKmTXm1Mu8_4mncnTSgGBs1dMDfgc-mMiuITuEVv29K2G2eyqGQ0l0oRCZ/s320/TestPb.png" width="220" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">TestPb.java (PageFlowScope)</td></tr>
</tbody></table><div><br />
</div><div>Here's my pageFragment which utilizes the List<Map> as my data collection. Take note of my item's scope since I only want to initialize my items once (not that it matter in a prototype hehe).</div><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0dRgw1ot2RLSRI3thKNzhyw5lAF4QUXExO5QAqDiPPobBbGxoSD8lzicYYz_JSxjRzcFcLH6tyl2eaPNM3llhd746ckLVP_BuAx6-0wV8Cs3vQUFLhn4gwWROadsrbQjCRpe63gxAnM7X/s1600/testFgmt.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="127" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0dRgw1ot2RLSRI3thKNzhyw5lAF4QUXExO5QAqDiPPobBbGxoSD8lzicYYz_JSxjRzcFcLH6tyl2eaPNM3llhd746ckLVP_BuAx6-0wV8Cs3vQUFLhn4gwWROadsrbQjCRpe63gxAnM7X/s320/testFgmt.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">testFgmt.jsff</td></tr>
</tbody></table><div><br />
</div><div>Here's my backingBean which handles the manipulation for setting the code value on selection as well as the reading piece of it. (Really think there has to be a more optimized solution though, but oh well).</div><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfoetw7W_6yhC3SkBI0D3ncWCnJGV5LQKn57MaXXx2QjD5wPMTusnfnTXHaSLxkf3X8pCvVO6ymIqs7MNYwKy-mbcYGK3BxtbhzC7um5qmMj0sJTt0F8B4cfQReW5Is9es8aYbJzPcyrdi/s1600/TestBb.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfoetw7W_6yhC3SkBI0D3ncWCnJGV5LQKn57MaXXx2QjD5wPMTusnfnTXHaSLxkf3X8pCvVO6ymIqs7MNYwKy-mbcYGK3BxtbhzC7um5qmMj0sJTt0F8B4cfQReW5Is9es8aYbJzPcyrdi/s320/TestBb.png" width="222" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">TestBb.java (BackingBeanScope)</td></tr>
</tbody></table><div><br />
</div><div>Since we are setting the value and retrieving it using ValueExpression, we are able to evaluate the value at runtime.</div><div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSKxYrDKNPQn86pxZWuznyHIaT27KADmR1pGI29_Vz5pXaPhvIjUty2ISEP_DskVpzdOaN5qe7B5REYj3mWQgalpWUan5m9iv4njrp9jB3sgQr900lh5KxE6X2JCzKxPQYU87dHtwpkwj1/s1600/sample1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSKxYrDKNPQn86pxZWuznyHIaT27KADmR1pGI29_Vz5pXaPhvIjUty2ISEP_DskVpzdOaN5qe7B5REYj3mWQgalpWUan5m9iv4njrp9jB3sgQr900lh5KxE6X2JCzKxPQYU87dHtwpkwj1/s320/sample1.png" width="320" /></a></div><div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU4ATNDEA1tL0PYb9BXVfimwwhxENcN9DT85fmYCahqS-4CpaFAljd9vF08mhmI4nsRasgpOR91XLUnTF6Xzul4UynOjtCA2hAmEzkBjowVvbKgKDWtaMwPQq9sZ1FGumNC13Uh4BAir1r/s1600/sample2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU4ATNDEA1tL0PYb9BXVfimwwhxENcN9DT85fmYCahqS-4CpaFAljd9vF08mhmI4nsRasgpOR91XLUnTF6Xzul4UynOjtCA2hAmEzkBjowVvbKgKDWtaMwPQq9sZ1FGumNC13Uh4BAir1r/s320/sample2.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXVQg-6Z6oikGg8nVTLfrvb7qGo06JhC91cXFD6x_ajkV5doBLMm3kcoavUA1DcPIVtiGrTTJq3AXo0akOGS7w_3sgogANtX-GHTL8v94SU6WPUzbj5p2o3y0yvUiOcMWOulJ_31a9qXVg/s1600/sample3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXVQg-6Z6oikGg8nVTLfrvb7qGo06JhC91cXFD6x_ajkV5doBLMm3kcoavUA1DcPIVtiGrTTJq3AXo0akOGS7w_3sgogANtX-GHTL8v94SU6WPUzbj5p2o3y0yvUiOcMWOulJ_31a9qXVg/s320/sample3.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr1Aza7Fkp6trhHyfX-cYKz8nPT2HAAhzMZGKn3PvOMmK9YNb7cvDmnn_wrpNHvilI5iUXU7r9MRcIaAdz5xLvvUHE_x4G-q_PDTJPkED3uRz-ERQz-AQ2jUkaSuRmSkCbMuUAGrGsAoBu/s1600/sample4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr1Aza7Fkp6trhHyfX-cYKz8nPT2HAAhzMZGKn3PvOMmK9YNb7cvDmnn_wrpNHvilI5iUXU7r9MRcIaAdz5xLvvUHE_x4G-q_PDTJPkED3uRz-ERQz-AQ2jUkaSuRmSkCbMuUAGrGsAoBu/s320/sample4.png" width="320" /></a></div><div><br />
</div><div><br />
</div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com1tag:blogger.com,1999:blog-8016119789491424221.post-23830601782695260622011-07-04T07:22:00.000-07:002011-07-04T07:22:53.579-07:00ADF Auto-Redirect while still Passing URL Parameters (with ADF Security)This blog is meant to share my findings in sending URL parameters in the case of a redirect. The main use-case for this setup is when I'm trying to launch a bounded taskflow which can be invoked via url. As you might have noticed, a bounded taskflow url is not really user friendly hehe, so what I did is that I have a page which can be defined in the contextRoot settings of your project and that page will have a pagePhaseListener to redirect the user to the bounded taskFlow. As an added test, I also turned on ADF security to test the same use-case.<br />
<br />
I've created a bounded taskflow with a single input parameter and also configured for url invoke.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqKHWQUYVvZxc-wXvwzVIZlxPUDCBs3oPwctNDKS9cOKtpkx34Fk2bsXEarlENioxKRBU19G5GWL9RoNxJc7zwz1wvisLQsOyXiMUWWW1-TjJghkYyX_dQCPHBAjmakXuVFXed6JKf45rN/s1600/mainFlowIndexTf.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqKHWQUYVvZxc-wXvwzVIZlxPUDCBs3oPwctNDKS9cOKtpkx34Fk2bsXEarlENioxKRBU19G5GWL9RoNxJc7zwz1wvisLQsOyXiMUWWW1-TjJghkYyX_dQCPHBAjmakXuVFXed6JKf45rN/s1600/mainFlowIndexTf.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">main-flow-index-xml</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvdFHNdwr8b0VyjhabMaXWOnq4ZY5S-3BnPpXYNFaG-7Texq1bkKKunYJe5h3w9YmURfJXQvoWEd0O04Men2fxTELh9FMY1IKAP3yaaJ4_4AcOtN9YWdi_hpOnMEUFhEz_0A-wbhPse7C9/s1600/mainFlowIndexTfConfig.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvdFHNdwr8b0VyjhabMaXWOnq4ZY5S-3BnPpXYNFaG-7Texq1bkKKunYJe5h3w9YmURfJXQvoWEd0O04Men2fxTELh9FMY1IKAP3yaaJ4_4AcOtN9YWdi_hpOnMEUFhEz_0A-wbhPse7C9/s1600/mainFlowIndexTfConfig.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">main-flow-index.xml (property)</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQyst1l8g-zvyarEP3ip-9LY-Klb9r_IOUecxTjJ2U4x4GUZZap6GSOjAWvFgG24A5pODGyZCmRuMwlOMqw-nnM1-Rr6KdK3YO0KgCcbz2kuZK1tE2I6KGEPwDNzUMoBOnBJeWfPX0_zFC/s1600/mainIndex.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="137" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQyst1l8g-zvyarEP3ip-9LY-Klb9r_IOUecxTjJ2U4x4GUZZap6GSOjAWvFgG24A5pODGyZCmRuMwlOMqw-nnM1-Rr6KdK3YO0KgCcbz2kuZK1tE2I6KGEPwDNzUMoBOnBJeWfPX0_zFC/s320/mainIndex.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MainFlowIndexPage.jspx</td></tr>
</tbody></table><br />
So with this URL:<br />
http://localhost:7101/ParameterRetrieval/faces/adf.task-flow?adf.tfId=main-flow-index&adf.tfDoc=/WEB-INF/main-flow-index.xml&<span class="Apple-style-span" style="background-color: lime;">inputParam=myTestInputValue</span><br />
<br />
We would get this page:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-o7lLBVJlC6W9e0LVdYZRomu7EqHAq9oKK4P9jlIGqLBDdAZU4zf1MHZsXVDHdwHhr7kwAKxp_Hj_aW95VSsmNYimFOXuf1n0myKEcYvn93vBz-Jgggrm7TdG32ffvvlNafXBYXbUvNI9/s1600/pageMainFlowIndexPage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-o7lLBVJlC6W9e0LVdYZRomu7EqHAq9oKK4P9jlIGqLBDdAZU4zf1MHZsXVDHdwHhr7kwAKxp_Hj_aW95VSsmNYimFOXuf1n0myKEcYvn93vBz-Jgggrm7TdG32ffvvlNafXBYXbUvNI9/s400/pageMainFlowIndexPage.png" width="400" /></a></div><br />
So, onward to the how-to redirect. For this I had to use a cool article by Andrejus regarding <i><a href="http://andrejusb.blogspot.com/2007/10/security-in-oracle-adf-and-automatic.html">Security in Oracle ADF and Automatic Page Loading</a></i>. So basically, we are going to make our own PagePhaseListener and as best practice dictates, we'll extend this object to a backing bean object which we will configure in our proxy's pageDef. So lets start.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkWnpSJDz8sSoQkheTE5snI3ImBmW1DHwqMkDTbwHPPLskH-7DD3e-PNuUUatOcfXIhVQYw72n6yqH-PmJvwBkzDuphE3rF6uxI-RhSWO3gHv275m9-jmIZGe3WtV2HmB_18c2-peSV6D8/s1600/TestPageRedirect.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkWnpSJDz8sSoQkheTE5snI3ImBmW1DHwqMkDTbwHPPLskH-7DD3e-PNuUUatOcfXIhVQYw72n6yqH-PmJvwBkzDuphE3rF6uxI-RhSWO3gHv275m9-jmIZGe3WtV2HmB_18c2-peSV6D8/s320/TestPageRedirect.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">TestPageRedirect.java</td></tr>
</tbody></table><br />
<b>TestPageRedirect.java</b> - Implemented object of the PagePhaseListener where we trigger our redirect at the PrepareModel phase.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMifg5ZIP31M8hStdyzFQ841A9_gh7LmpqFSeWK1CYpfJPC0k1gXbCFXfNadzly6giGAUnUgLSLeGfYEXT1i3G4zwlNGMZuSicd3OVaM9xTcwjW3rQCm_dZs0VmVLQ4IDwTXCA0jZJty-H/s1600/testBacking.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="271" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMifg5ZIP31M8hStdyzFQ841A9_gh7LmpqFSeWK1CYpfJPC0k1gXbCFXfNadzly6giGAUnUgLSLeGfYEXT1i3G4zwlNGMZuSicd3OVaM9xTcwjW3rQCm_dZs0VmVLQ4IDwTXCA0jZJty-H/s320/testBacking.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">TestBacking.java</td></tr>
</tbody></table><br />
TestBacking.java - Here's our backingBean object which extends our TestPageRedirect. We've already configured our onLoad to trigger our redirect which is based on F. Nimphius article on <i><a href="http://blogs.oracle.com/jdeveloperpm/entry/how-to_efficiently_redirect_to_an_adf_faces_view_using_adf_controller">How-to efficiently redirect to an ADF Faces view using ADF Controller</a></i>.<br />
<br />
Next, we're going to configure our pageDef, well defined the backingBean in the taskflow as well.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYu8U1yDU5kl3MU4Owlpoalf97f6LWrooFdYQtArn9QAg6NmtaMSkyKzQLq1LUV66NDeUDPtTqp2lfzW-SomdM9EdFkNqNO0XZKI3668wgmwO7EBZVRsHsLjhqaTYkCa427q-uMVTm0ETi/s1600/adfcConfigBeans.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="113" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYu8U1yDU5kl3MU4Owlpoalf97f6LWrooFdYQtArn9QAg6NmtaMSkyKzQLq1LUV66NDeUDPtTqp2lfzW-SomdM9EdFkNqNO0XZKI3668wgmwO7EBZVRsHsLjhqaTYkCa427q-uMVTm0ETi/s320/adfcConfigBeans.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">adfc-config.xml</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbG3qfQy6DcatJfK7Cpe1iqgflwrfYFVC5_Sx1IEftXh4QOSuHrFKfp3dt3-vKT4aRG4zsQwxBOYcZZvdY-vHG83E9DHzmrFhkgyHxAg4KznrGJNdY_b1_PlE546t7r4UWA0gNHRi5RyYV/s1600/testRedirect.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="98" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbG3qfQy6DcatJfK7Cpe1iqgflwrfYFVC5_Sx1IEftXh4QOSuHrFKfp3dt3-vKT4aRG4zsQwxBOYcZZvdY-vHG83E9DHzmrFhkgyHxAg4KznrGJNdY_b1_PlE546t7r4UWA0gNHRi5RyYV/s320/testRedirect.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">TestRedirect.jspx</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQEHkzc-yX6rxDxrGcfSmmmpDy4TnUEo5n2MysuOH7crHZmXUuhMjtIvlM38NlEMb4Qf2sqFbeLZJ8DMII9mMedc1p_hZH4zSpwY-bXfAbJKjBM4gWMpUHFUZdd1aFs6G-NFLCudjCtXE7/s1600/testRedirectPageDef.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="92" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQEHkzc-yX6rxDxrGcfSmmmpDy4TnUEo5n2MysuOH7crHZmXUuhMjtIvlM38NlEMb4Qf2sqFbeLZJ8DMII9mMedc1p_hZH4zSpwY-bXfAbJKjBM4gWMpUHFUZdd1aFs6G-NFLCudjCtXE7/s320/testRedirectPageDef.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">TestRedirectPageDef.xml</td></tr>
</tbody></table><br />
<b>TestRedirectPageDef.xml</b> - configure the <b>ControllerClass </b>to point to our backingBean.<br />
<br />
After all of that is setup, we can now run <b>TestRedirect.jspx</b> and this should redirect us to our bounded taskflow.<br />
<br />
Launching:<br />
<br />
http://localhost:7101/ParameterRetrieval/faces/TestRedirect.jspx?<span class="Apple-style-span" style="background-color: lime;">inputParam=12345</span><br />
<br />
will take us now to our bounded taskflow.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtIlSxYPypKaqK7W8nTpdO1ldufTYMyoBO5tX0uacOYnb1WR77b32K9AGCT82LTeKQP6hDEjDf7r-JNWYfJUJfBi8IfCswtVCmk-WjELsicqf_iI1YbyDbkEik2qDjHjFVGCAPM3Wi9CCG/s1600/pageMainFlowIndexPageA.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtIlSxYPypKaqK7W8nTpdO1ldufTYMyoBO5tX0uacOYnb1WR77b32K9AGCT82LTeKQP6hDEjDf7r-JNWYfJUJfBi8IfCswtVCmk-WjELsicqf_iI1YbyDbkEik2qDjHjFVGCAPM3Wi9CCG/s320/pageMainFlowIndexPageA.png" width="320" /></a></div><br />
Success! So as an additional, lets add ADF Security :)<br />
<br />
Lets launch: http://localhost:7101/ParameterRetrieval/faces/TestRedirect.jspx?inputParam=myHelloWorld<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjs-1gpev9I7shoxcfuA5alIbMo37JiIvJ8SirGRT2L7-QcMS7aX_9PBY_hETo6LXCot05Ye_3h_MwVzv3ExAWfFS3oTZSwx1UR3phU2uuTDZ4R7ov06iMegYBY0Ay1wU4VrMbmYwi1xEG/s1600/loginPage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjs-1gpev9I7shoxcfuA5alIbMo37JiIvJ8SirGRT2L7-QcMS7aX_9PBY_hETo6LXCot05Ye_3h_MwVzv3ExAWfFS3oTZSwx1UR3phU2uuTDZ4R7ov06iMegYBY0Ay1wU4VrMbmYwi1xEG/s320/loginPage.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">LoginPage</td></tr>
</tbody></table><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBaY5oP7KGncyrhEk072fzNa4q5EBORLnfkztthRv6Nt5T0-XqUBEVTK7JLEVJEXebuQrSOL92f25VDpwhS2xh4GpGwuFswuGTR92kzYq2XDpweGpiFOMOlSS9ywwqwkfnCUWyrfED6nC3/s1600/pageMainFlowIndexPageB.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBaY5oP7KGncyrhEk072fzNa4q5EBORLnfkztthRv6Nt5T0-XqUBEVTK7JLEVJEXebuQrSOL92f25VDpwhS2xh4GpGwuFswuGTR92kzYq2XDpweGpiFOMOlSS9ywwqwkfnCUWyrfED6nC3/s320/pageMainFlowIndexPageB.png" width="320" /></a></div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0tag:blogger.com,1999:blog-8016119789491424221.post-69722287993401517142011-07-02T21:58:00.000-07:002011-07-02T22:00:59.262-07:00ADF Region Handled in a RichPopup - Including a Return ValueI used David Giammona's blog about:<br />
<br />
<ul><li>Handling Empty Region - <a href="http://blogs.oracle.com/DavidGiammona/entry/how_are_empty_regions_implemen">http://blogs.oracle.com/DavidGiammona/entry/how_are_empty_regions_implemen</a></li>
<li>Including a Region within an af:popup - <a href="http://blogs.oracle.com/DavidGiammona/entry/how_do_i_include_a_region_with_1">http://blogs.oracle.com/DavidGiammona/entry/how_do_i_include_a_region_with_1</a></li>
</ul><div>So most of the code kind-of goes as what the blog does as well as what Fusion Dev Guide by F.Nimphius on launching a region within popup... or a popup with a region (forgot the topic title).</div><div><br />
</div><div>My project is setup to log on the following areas.</div><div><ul><li>Region task flow entry - just so we know that the task flow has started.</li>
<li>On popup launch - this is the part that we handle the switch between an empty region to the actual region</li>
<li>On regionNavigationEvent - this is where we handle the programmatic handling of closing the popup. I used a java approach in closing the popup oppose to javascript which is published in paper. This is also the place where i handle the response. The reason for this is because a return from the region is tagged as a null viewId so it is the perfect trigger for me to check for the response which the region throws.</li>
<li>On popup close - as you probably already know, this is where i handle the switch to an empty region. Also this listener gets triggered on Cancel, Ok and Escape of the popup.</li>
</ul><div>Anyway, i'll start posting codes.</div></div><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxKTXPdbd6WxqNKztkLfuVjSdGnR5UMBL_NKB__QEZjAGrZccWNaXerQ2KjJTyrmwcux3yQjEOAdTa7m5q95ImdfqUL1LctOrVG-p_fOI4ENUgsw5a-g1x1S80ISPnCv7ndyLTF_tZLA-O/s1600/mainFgmt.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="174" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxKTXPdbd6WxqNKztkLfuVjSdGnR5UMBL_NKB__QEZjAGrZccWNaXerQ2KjJTyrmwcux3yQjEOAdTa7m5q95ImdfqUL1LctOrVG-p_fOI4ENUgsw5a-g1x1S80ISPnCv7ndyLTF_tZLA-O/s320/mainFgmt.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">mainFgmt.jsff</td></tr>
</tbody></table><div><br />
</div><div><b>mainFgmt.jsff</b></div><div>As you can see, I'm directly using showPopupBehavior which means that the popup itself will be rendered directly at the same level as this page. So the popup and the view would pretty much have a handle on the scope which of course from the region, you shouldn't try to cross the scope. Later i'll explain more how I decided to handle the parameter passing without the use of contextualEvent.</div><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwRso7-RaFXI7jaNvZ8QlH825VWndqlaShippcgUjrRy82hXO9oyTKtnu9SWPqy3qgUHhep5J7tQN5Sz8U0pQJnE9NVhSxTWtNZ4G8dfm_qWOAdOHFdMCPAvKSOj8cUYQve3Actqpxq9AZ/s1600/adfPopupUtils.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwRso7-RaFXI7jaNvZ8QlH825VWndqlaShippcgUjrRy82hXO9oyTKtnu9SWPqy3qgUHhep5J7tQN5Sz8U0pQJnE9NVhSxTWtNZ4G8dfm_qWOAdOHFdMCPAvKSOj8cUYQve3Actqpxq9AZ/s320/adfPopupUtils.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="Apple-style-span" style="font-size: small;">adfPopupUtils.js</span></td></tr>
</tbody></table><div><br />
</div><div><b>adfPopupUtils.js</b></div><div>Javascript file to handle the call to the serverListener.</div><div><br />
</div><div class="separator" style="clear: both; text-align: center;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3YIpVxx5OHoQ_zxcAel7UKqHTlyqGcveQSg0l95LXfIyAdyueb-L9-EuRan6ps8MQeuQmyPZop12eIxeWeevex4vf0oumEugJ78XJLqvAXSX7GMgg-fTycYIekaAU4I3TyyNbivGt8I_d/s1600/formContentVb.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3YIpVxx5OHoQ_zxcAel7UKqHTlyqGcveQSg0l95LXfIyAdyueb-L9-EuRan6ps8MQeuQmyPZop12eIxeWeevex4vf0oumEugJ78XJLqvAXSX7GMgg-fTycYIekaAU4I3TyyNbivGt8I_d/s320/formContentVb.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">FormContentPopupVb.java</td></tr>
</tbody></table><div><br />
</div><div><br />
</div><div><b>FormContentPopupVb.java</b></div><div>This bean (viewScope) handles the dynamic region taskflowId. The switching of taskflowId to/from an empty region. Check for a response which I'll explain more.</div><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijKaMXbhgfZOHklQK3j0z1vGbDUdsU31hzMiwpVgc2Ni7j_Tkm3fRhd36iWGmS18EmHzO2zAaI-o8PxbYEWNQWliUyR9YBr9bDU_W3005TsZ1O6S1V-EIFWBwWkrS20vcAKbIrYR8ZPecp/s1600/formContentPopupTF.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="116" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijKaMXbhgfZOHklQK3j0z1vGbDUdsU31hzMiwpVgc2Ni7j_Tkm3fRhd36iWGmS18EmHzO2zAaI-o8PxbYEWNQWliUyR9YBr9bDU_W3005TsZ1O6S1V-EIFWBwWkrS20vcAKbIrYR8ZPecp/s400/formContentPopupTF.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">FormContent TaskFlow (pageFragment)</td></tr>
</tbody></table><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNUBslrG6VXGOKpdgipG7ng04TdMou7jVuCzb-H3a6RE03-LN54IDD2Ggxxw7X93RVOd9TQQFSebAy8KrqieK-QZaquxrBxxcJhi0d7XxGGfNQxhD_SfNhXW9vxsTNi1hNcNoU6Ue_NPAU/s1600/formContentPopup.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNUBslrG6VXGOKpdgipG7ng04TdMou7jVuCzb-H3a6RE03-LN54IDD2Ggxxw7X93RVOd9TQQFSebAy8KrqieK-QZaquxrBxxcJhi0d7XxGGfNQxhD_SfNhXW9vxsTNi1hNcNoU6Ue_NPAU/s320/formContentPopup.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">formContentPopup.jsff</td></tr>
</tbody></table><div><b>formContentPopup.jsff</b></div><div>This is the fragment as part of the task flow region that is used inside the af:popup. I have an actionListener which not only navigates for return but also configures the response.</div><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisqxBNWE_uahs_vMlApbBP0wNGe2wdOsDI5n1sCaA7o6iQTA3ZgC0Q1-N7I8se-4aHIGScuJhvIJlCp5QosnC8GJ1Bd2M7XIwdNUQddGkYuJJcFGCj6KUFabASKw07oXfzBwmkRVb02Zmq/s1600/returnHandlerBb.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="249" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisqxBNWE_uahs_vMlApbBP0wNGe2wdOsDI5n1sCaA7o6iQTA3ZgC0Q1-N7I8se-4aHIGScuJhvIJlCp5QosnC8GJ1Bd2M7XIwdNUQddGkYuJJcFGCj6KUFabASKw07oXfzBwmkRVb02Zmq/s320/returnHandlerBb.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="Apple-style-span" style="font-size: small;">ReturnHandlerBb.java</span></td></tr>
</tbody></table><div><br />
</div><div><b>ReturnHandlerBb.java</b></div><div>This backing bean, as noted will look for the calling popup, search for the region that is directly contained with it (since this is the same region which will handle the regionNavigationEvent), and add an attribute to that component. Yes, there is a potential for this to blowup if the task flow is not used in a popup, but that is why the same utility to retrieve the popup will tell us if this taskflow is being rendered inside one. </div><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTeCEAzcMpspw12kubNrTkEm2rUOa0S9jy_EHZVeuis1mE67c84-xZMZmHZLUVNTQATCdHZtg8Y2zpGa5tKix6GAANiUFtRvlVSjYPPXHTW6QF9AiZlxSyRq4nxcm-BAaIHkrd76u-lVWO/s1600/popupUtil.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTeCEAzcMpspw12kubNrTkEm2rUOa0S9jy_EHZVeuis1mE67c84-xZMZmHZLUVNTQATCdHZtg8Y2zpGa5tKix6GAANiUFtRvlVSjYPPXHTW6QF9AiZlxSyRq4nxcm-BAaIHkrd76u-lVWO/s320/popupUtil.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">PopupUtil.java</td></tr>
</tbody></table><div><br />
</div><div><b>PopupUtil.java</b></div><div>Utility class to retrieve the parent popup.</div><div><br />
</div><div>So as you can see based on the code, the flow of the setup goes like this.</div><div><ul><li>Link is clicked which triggers ShowPopupBehavior</li>
<li>Popup receives the event and launches which triggers the fetchListener</li>
<li>FetchListener handles the configuring of the empty to taskflow to our actual taskflow region</li>
<li>Region hits an OK or Cancel and triggers the appropriate ActionListener</li>
<li>ActionListener looks for the parentPopup and from there, it retrieves the direct region below it.</li>
<li>Configure the RichRegion for an extra attribute which in this case we called "Notification".</li>
<li>Return is called by the taskFlow.</li>
<li>Region in the calling page triggers RegionNavigationHandler.</li>
<li>RegionNavigationHandler closes the popup and also check for the response from the taskflow.</li>
<li>OnPopup close, the clientScript is triggered which calls our serverListener.</li>
<li>ServerListener makes sure that the dynamic region is reset to an emptyTaskflow.</li>
</ul><div>Cool!</div></div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com1tag:blogger.com,1999:blog-8016119789491424221.post-82080379500806391892011-06-16T18:10:00.000-07:002011-07-02T22:02:00.361-07:00How to pass multiple parameters to a Bean method from JSFHaving used to java operations, we sometimes find the realm of EL Expression a little short of easy utilities in sending parameters directly from JSF.<br />
<br />
This example, while it might not be a standard solution, can provide some easy wins in some situation.<br />
<br />
Anyway, here's the code solution.<br />
<br />
First thing we need to do is make our own Dummy map which basically implements all of the Map interfaces less the <b>Map.get(Object)</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgulYKczAspjAy0UGHN2md2_SObufPeI5p2T2fSkD58N75-EubrY5O8eRGPQIj0LS3zDfd2cdpTv4hmltaGTxZJFw3b7K_x_SVjV4VcU6HxISjjd6e5gviPgBf1fRptt2Ymd9yCn-sKMh5f/s1600/dummyMap.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgulYKczAspjAy0UGHN2md2_SObufPeI5p2T2fSkD58N75-EubrY5O8eRGPQIj0LS3zDfd2cdpTv4hmltaGTxZJFw3b7K_x_SVjV4VcU6HxISjjd6e5gviPgBf1fRptt2Ymd9yCn-sKMh5f/s320/dummyMap.png" width="320" /></a></div><br />
So from this Map, we will try to achieve this :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQd8dl3jJbI9G3jO3e6pKYDKLZqiaTqavPWtoSf79bQlINDJf5rc_e_xIgBLCt9orEd0KS809fEMk4T4pa5Ked2Jt4ih_nFTd1Ti-5k17I_BC80I0zn2-PMWMQL3H-lsoJBUVajmZk-0zm/s1600/mainIndex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="109" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQd8dl3jJbI9G3jO3e6pKYDKLZqiaTqavPWtoSf79bQlINDJf5rc_e_xIgBLCt9orEd0KS809fEMk4T4pa5Ked2Jt4ih_nFTd1Ti-5k17I_BC80I0zn2-PMWMQL3H-lsoJBUVajmZk-0zm/s320/mainIndex.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLdTa8599u1gWZxOW4Hm22TjxfbBJiaxooENvIT6haa0tcVTPT94GXgVuSYbwgRY6I5i9MRtjdfVhfezulqjv1YrjxEHR9ZPVL7i9T356Vt1UYf18G4_5Io76Pmaad3onDkkfmvajAu6xr/s1600/resultPage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLdTa8599u1gWZxOW4Hm22TjxfbBJiaxooENvIT6haa0tcVTPT94GXgVuSYbwgRY6I5i9MRtjdfVhfezulqjv1YrjxEHR9ZPVL7i9T356Vt1UYf18G4_5Io76Pmaad3onDkkfmvajAu6xr/s1600/resultPage.png" /></a></div><br />
So, let's start with the Single Parameter input (I'm just going to show codes from here on since it's pretty straightforward):<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEgEMPafOLaeWNCkb4P2D-sdpvbOdq2bfx_5JBfXy2z5WiYt-DINISwJT8J1aZo1l-awxLNyFdRe_EmXH1Vc-Yg02bLHUe4JW7iGmuDtQuAixIgJppn2B6NYBNswQ6IlDS9gQFB1la763-/s1600/singleParamMap.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEgEMPafOLaeWNCkb4P2D-sdpvbOdq2bfx_5JBfXy2z5WiYt-DINISwJT8J1aZo1l-awxLNyFdRe_EmXH1Vc-Yg02bLHUe4JW7iGmuDtQuAixIgJppn2B6NYBNswQ6IlDS9gQFB1la763-/s320/singleParamMap.png" width="320" /></a></div><br />
And here's its Multiple Parameter counterpart. As you can notice, the more parameters you are handling, the more complicated it can possibly be.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBSfWEkqmfqNSZaX7wUHpNaKVx0SqqtEI99GV2_m3dXD06dCbDjSoXXe_XXnwnpJi3TU_Uac83qbpOVSoVvGTLpvYd5IBhQ7LujdPlXiQedFnkxgYgC8G6mQBJyucCvM_YFcpfIBDXtqLI/s1600/multiParamMap.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBSfWEkqmfqNSZaX7wUHpNaKVx0SqqtEI99GV2_m3dXD06dCbDjSoXXe_XXnwnpJi3TU_Uac83qbpOVSoVvGTLpvYd5IBhQ7LujdPlXiQedFnkxgYgC8G6mQBJyucCvM_YFcpfIBDXtqLI/s320/multiParamMap.png" width="288" /></a></div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0tag:blogger.com,1999:blog-8016119789491424221.post-65446772969181279802011-06-02T17:58:00.000-07:002011-07-02T22:02:28.796-07:00How to close a TaskFlow Popup Launched Using an af:PopupBeen awhile since I've posted something, so I decided to make a quick and easy hint in ADF.<br />
<br />
TaskFlows can be launched as a Popup in a couple of ways in ADF. The most common, I think, is through a taskflow control-case with the following settings:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsQfR1ulohHrWh6JUz7alK8Nj4IpqP37f0mSgk8LYtcx-gkAPD_pBqL8HZmNwN8mPUs05A7tOlEMRda6_pf-YgNFu5o5S1GtjEiVe-ro6xlwjt7zoQNpQv47vCvWlqwe65Q0d-ICqiHv2i/s1600/taskFlowInlinePopup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsQfR1ulohHrWh6JUz7alK8Nj4IpqP37f0mSgk8LYtcx-gkAPD_pBqL8HZmNwN8mPUs05A7tOlEMRda6_pf-YgNFu5o5S1GtjEiVe-ro6xlwjt7zoQNpQv47vCvWlqwe65Q0d-ICqiHv2i/s1600/taskFlowInlinePopup.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0bXaJesWDtce7zOz0gkBvAIF9JsfWUJ_zzp-Mlv2h3N1eaw8q15YWOQPUAAgWflwQq1uNOniwy78JOEZF7MmsvOwMEZc6UcLnNvU2fohpZKR_3v2spmPMZOyzQSuV7Ky4msDIqBQ5k9xF/s1600/launchSettings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0bXaJesWDtce7zOz0gkBvAIF9JsfWUJ_zzp-Mlv2h3N1eaw8q15YWOQPUAAgWflwQq1uNOniwy78JOEZF7MmsvOwMEZc6UcLnNvU2fohpZKR_3v2spmPMZOyzQSuV7Ky4msDIqBQ5k9xF/s1600/launchSettings.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSwmSMzrJmCbvgG1_1rI3njtFu4QZ5rM_fpaxunYGFNIZkYHJlU77ibBl3SJTZ4rXYYo_AFFT57QMg08IyGeTU4o9UnWihhdXyPDvig_4S7pyQUhc-KF4M08en91O8xflbx7mza14Ayuvc/s1600/inlinePopup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSwmSMzrJmCbvgG1_1rI3njtFu4QZ5rM_fpaxunYGFNIZkYHJlU77ibBl3SJTZ4rXYYo_AFFT57QMg08IyGeTU4o9UnWihhdXyPDvig_4S7pyQUhc-KF4M08en91O8xflbx7mza14Ayuvc/s320/inlinePopup.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZsOxAVJOuUfUimqT5JnhPmk6dJF5L4vaGMi3RJM1JQiNpSvFuRa-exozIovr5Lo9UB4t2OzPcT8yyVrYcv5TlV-ManbR-LzdcNj6FbnfVqM4ZPWPFXyLlgcnwjf3jTwmjKiZI5KLwTa8F/s1600/fullPopup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZsOxAVJOuUfUimqT5JnhPmk6dJF5L4vaGMi3RJM1JQiNpSvFuRa-exozIovr5Lo9UB4t2OzPcT8yyVrYcv5TlV-ManbR-LzdcNj6FbnfVqM4ZPWPFXyLlgcnwjf3jTwmjKiZI5KLwTa8F/s320/fullPopup.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div>Then there is the obvious, region in a popup where we drop a fragment taskflow directly inside a popup. I'll show the two common case using a direct popup and a dialog.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifhGuJTQC1w78mYJhIzEuwkQLqc669EP4NOJq1lFNN5emm6L5GbdGiAm9bURyl4MjsQ_0Ouys-Klev28427-jJW9hnlrQ7lhbWoxTG1c2ZR2mcAtPWUY1bpiQDohbiB8o9roIPn-fmVyh0/s1600/directLaunch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifhGuJTQC1w78mYJhIzEuwkQLqc669EP4NOJq1lFNN5emm6L5GbdGiAm9bURyl4MjsQ_0Ouys-Klev28427-jJW9hnlrQ7lhbWoxTG1c2ZR2mcAtPWUY1bpiQDohbiB8o9roIPn-fmVyh0/s320/directLaunch.png" width="320" /></a></div><br />
<br />
The limitation of using it as a direct region though is that the close button is outside the controls of the taskflow, basically, the taskflow itself does not call the close unlike the use of an inline popup as described in the first example. So what happens if we just call the taskflow return from the taskflow? As described in F. Nimphius Fusion Dev Guide, the taskflow itself will close thus closing the binding itself. Here's an example.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy-_0-YRjKuemNBMKzN-9fJgpFibN0wayoY9If4lRYptGmsmmNh_hGvmmycCNeWPieaaAJd3X2rR7cwB4Dk6KEqpJermAwO5Dv_Gebjiz8d09OpYty4Uh7JWrG3WYlk_SUgK3CLHi3Zo8g/s1600/before.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy-_0-YRjKuemNBMKzN-9fJgpFibN0wayoY9If4lRYptGmsmmNh_hGvmmycCNeWPieaaAJd3X2rR7cwB4Dk6KEqpJermAwO5Dv_Gebjiz8d09OpYty4Uh7JWrG3WYlk_SUgK3CLHi3Zo8g/s320/before.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Before</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg0Ff6EDd3XTqaCL7vafE-5adUeELtUdsRivT_cdKGdkG_3V2pjrXO_mPiYiOT8kkT5VxtCTCKNG7ZjXAYJ3HGq9PmzYwA8DWjmFcuLYdD2Y7CenkS9xSll98yHSvHMu5823HjjJxWw1UW/s1600/after.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg0Ff6EDd3XTqaCL7vafE-5adUeELtUdsRivT_cdKGdkG_3V2pjrXO_mPiYiOT8kkT5VxtCTCKNG7ZjXAYJ3HGq9PmzYwA8DWjmFcuLYdD2Y7CenkS9xSll98yHSvHMu5823HjjJxWw1UW/s200/after.png" width="167" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">After</td></tr>
</tbody></table>And forevermore it will remain close unfortunately. Now, to get around this we're going to have the taskflow itself handle situations where it will close the popup without calling the return. To do this, we'll basically retrieve the parent'most component until it is a RichPopup and just call the popup.hide() from there on. So lets go back to coding.<br />
<br />
For the fragment, we'll have the return button but this time, it will call an actionListener instead of the controlcase for the return.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJM0YTq3VHmTNbsQbwNidBiJcbBQi02Y6lrpe79Qy5SdscJKfo0-zCzEHFmQZ7OnJPmmWwht6ReAPFKor_cOt00aSfGjcC_RDt8mi6hJsOcrgjoNtap6Vrkz0Fx1WVbXOs-Gtn4JOTgrnY/s1600/jsffClosePopup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJM0YTq3VHmTNbsQbwNidBiJcbBQi02Y6lrpe79Qy5SdscJKfo0-zCzEHFmQZ7OnJPmmWwht6ReAPFKor_cOt00aSfGjcC_RDt8mi6hJsOcrgjoNtap6Vrkz0Fx1WVbXOs-Gtn4JOTgrnY/s1600/jsffClosePopup.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfuspTGMRFu2h9a7hIV-3sDarl9KHdb8o7tmk-rnoFOurz_hDSFrT7rIsGiyJa3PNHagWyTc_V4X5jFfYrjAneKJq2ij9aeBgCaSv4oPh393R9nDFXt_MWq1wY3uUowjwbhADLARr0bozz/s1600/regionBb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfuspTGMRFu2h9a7hIV-3sDarl9KHdb8o7tmk-rnoFOurz_hDSFrT7rIsGiyJa3PNHagWyTc_V4X5jFfYrjAneKJq2ij9aeBgCaSv4oPh393R9nDFXt_MWq1wY3uUowjwbhADLARr0bozz/s1600/regionBb.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7f5e1Z2dVUFDL48qWHT5lTNxQx1WkCEkJSteTM4j8HGJZBkflFVGUbDYv7ihIi_tSQjxF4SVsU-52KXAiPGLySjT3aJwa80LK628lv9Iq36qrntSbSZd6wBLzRURxx6YxcE8r62skDKqS/s1600/adfPopupUtils.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7f5e1Z2dVUFDL48qWHT5lTNxQx1WkCEkJSteTM4j8HGJZBkflFVGUbDYv7ihIi_tSQjxF4SVsU-52KXAiPGLySjT3aJwa80LK628lv9Iq36qrntSbSZd6wBLzRURxx6YxcE8r62skDKqS/s1600/adfPopupUtils.png" /></a></div><br />
Presto. Hope that helps.Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com3tag:blogger.com,1999:blog-8016119789491424221.post-18876441553218437122011-04-07T18:46:00.000-07:002011-04-07T18:46:04.103-07:00Cascading LOV Using Bounded TaskFlowsThis is part 2 of my initial post regarding Bounded TaskFlows used as an LOV.<br />
<br />
<a href="http://adfdeveloper.blogspot.com/2011/03/applied-69-code-corner-lov-using.html">ADFDeveloper - Applied - #69 Code Corner - LOV Using Bounded TaskFlows</a><br />
<br />
Just as an add-on to my post, I decided to make it one step tricker by introducing a cascading effect in my List-of-Values where data comes from a WebService.<br />
<br />
What I'm using is a DropDown of Locations and only Locations which as Departments (since we don't want empty results now hehehe). Of course, we don't want to get lazy now so I also made this DropDown to also use a WebService, and to improve performance, I keep the initial fetch in a ViewScope bean.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDXO9Eewouw0SKhupHRseenV2y7NfcTRh5M_EXXhQSCMG50hXgFDJVs7ljwPHdIYvbIK6a-77utNnPzvAXgGKmXeAkKqiiPIMBsbNfYIY22FXIKwiLlL48rwgIxBvuERGKbtFytl4Hv5nh/s1600/page_a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDXO9Eewouw0SKhupHRseenV2y7NfcTRh5M_EXXhQSCMG50hXgFDJVs7ljwPHdIYvbIK6a-77utNnPzvAXgGKmXeAkKqiiPIMBsbNfYIY22FXIKwiLlL48rwgIxBvuERGKbtFytl4Hv5nh/s320/page_a.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Default View</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwR6FBmKLLnLMUrkZbpsTP-1vn9ZCGDKuciF5q31HyTTQuMtosHIBdqLtPNP-lDa6XxKcngxshrDjxcddTjYYbXNjLgD5_0KF0iUBBBA3DF5m3q0_mqgHOIXz-fg7kSSDtMGU5Js04ipWo/s1600/page_b.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwR6FBmKLLnLMUrkZbpsTP-1vn9ZCGDKuciF5q31HyTTQuMtosHIBdqLtPNP-lDa6XxKcngxshrDjxcddTjYYbXNjLgD5_0KF0iUBBBA3DF5m3q0_mqgHOIXz-fg7kSSDtMGU5Js04ipWo/s320/page_b.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Location DropDown</td></tr>
</tbody></table><br />
I also modified the LOV to show the Location registered for the Department, for clarity hehe.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR7Y40REtdh7tJWOgF-2QcsNGlyh-Fk8E3yjOgapwiaAFtvUpF3aRr5XKw8M2x_D6ROXsdprnUqSQ5iktZKfUFZP3kpPkQJZ-PnKujYkcXRTYwlUVMlV7E4z6hCI3rSbZBD8NncmEGbwBS/s1600/page_c.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR7Y40REtdh7tJWOgF-2QcsNGlyh-Fk8E3yjOgapwiaAFtvUpF3aRr5XKw8M2x_D6ROXsdprnUqSQ5iktZKfUFZP3kpPkQJZ-PnKujYkcXRTYwlUVMlV7E4z6hCI3rSbZBD8NncmEGbwBS/s320/page_c.png" width="310" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">List of Values</td></tr>
</tbody></table><br />
The add-on was pretty straightforward, just include it as parameter in the setPropertyListener upon launch of LOV.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-hvpip50g7d6uA1Bg8oAri3x72BBzw-HHWujMW0l7aE2I3avczPcSp8-2EeTYvnrpRLng-c4i-jgVT_M9edls6usmT3LlpAQHd4_OVTNo3__TiNFkOnuAk08F3iy49qiEVNdNPVX25Z1l/s1600/input_lov_src.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-hvpip50g7d6uA1Bg8oAri3x72BBzw-HHWujMW0l7aE2I3avczPcSp8-2EeTYvnrpRLng-c4i-jgVT_M9edls6usmT3LlpAQHd4_OVTNo3__TiNFkOnuAk08F3iy49qiEVNdNPVX25Z1l/s320/input_lov_src.png" width="320" /></a></div><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9hUwEbov0xVkmEMTdm_jvylSfqgl8rZDmjig64ftWZmk10xL6ZG2SOWGTScjfRJG8s9fJzJk-mHuhvboeBmGIqFzlu7vBFC29yk1F4YQss3500Y37T1mY4HWIBCJP6mj5vqnyiXNiDQxr/s1600/form_flow.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9hUwEbov0xVkmEMTdm_jvylSfqgl8rZDmjig64ftWZmk10xL6ZG2SOWGTScjfRJG8s9fJzJk-mHuhvboeBmGIqFzlu7vBFC29yk1F4YQss3500Y37T1mY4HWIBCJP6mj5vqnyiXNiDQxr/s400/form_flow.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">TaskFlow</td></tr>
</tbody></table><br />
One extra thing that needed to be handled though was the validation. This time around we're not just validating to whether the departmentId is valid, but rather the departmentId needs to be valid based on the set locationId as well.<br />
<br />
This part can be implemented in a number of ways, but I chose to add the attribute as part of the validating component.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTZYGmtj9U8nQjkSP42PLFyII4d-I0S__JYKVYcyqil0JUnMtsuVkfQDGcVnZvrVBcBA0jnbqsvu3reGytJ7Lo-CpUBu0MXvnDIoepoOXsdzPfywYJsW8HLDRFW9lqmNeD187KJUaHdTTD/s1600/input_text_src.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTZYGmtj9U8nQjkSP42PLFyII4d-I0S__JYKVYcyqil0JUnMtsuVkfQDGcVnZvrVBcBA0jnbqsvu3reGytJ7Lo-CpUBu0MXvnDIoepoOXsdzPfywYJsW8HLDRFW9lqmNeD187KJUaHdTTD/s400/input_text_src.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi67wAUCw0qufOrVUcLJV0PmPsXrBnxch9jsaIbzuqhfyB24fPTMW2VtixR5btLkmnywXUXGWT3YezbdH3GkIyQtuKqYcP1Ry-aC0Xe2C7SYlVKhunwBra2E30pc0OwWRSYAoAOdtAsBgom/s1600/validator.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi67wAUCw0qufOrVUcLJV0PmPsXrBnxch9jsaIbzuqhfyB24fPTMW2VtixR5btLkmnywXUXGWT3YezbdH3GkIyQtuKqYcP1Ry-aC0Xe2C7SYlVKhunwBra2E30pc0OwWRSYAoAOdtAsBgom/s400/validator.png" width="400" /></a></div><br />
And there you have it! 2 layers of LOV that relies on a WebService datasource.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7decwE-aiL0_OUNxDsU1lAiU7ihrun4rL8Zh8g9pqQ7v372fapnnzvw5sqoSQWAudxNoqEsvbbcHGDAYmmyGXhPFLc5c7qCusQ5brFuPCftSmlI4z9iLCpEL65xgaRBGIFHRQTODiD4RJ/s1600/page_d.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7decwE-aiL0_OUNxDsU1lAiU7ihrun4rL8Zh8g9pqQ7v372fapnnzvw5sqoSQWAudxNoqEsvbbcHGDAYmmyGXhPFLc5c7qCusQ5brFuPCftSmlI4z9iLCpEL65xgaRBGIFHRQTODiD4RJ/s320/page_d.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaS8kcG5AIpOhYnXOiQMbgjM6gvIHRRObreJjgxysgkKhg8F0p4N9wQPP_pGr8FUajd9IzrVGPKR6YuvB5ZEuHUpjSunoB1cUFO3paiKZ3DmW71Z3sKWO90dxfwtltrSFqzbOm6_2Ucdhx/s1600/page_e.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaS8kcG5AIpOhYnXOiQMbgjM6gvIHRRObreJjgxysgkKhg8F0p4N9wQPP_pGr8FUajd9IzrVGPKR6YuvB5ZEuHUpjSunoB1cUFO3paiKZ3DmW71Z3sKWO90dxfwtltrSFqzbOm6_2Ucdhx/s320/page_e.png" width="301" /></a></div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com2tag:blogger.com,1999:blog-8016119789491424221.post-66960258358889568282011-03-20T11:11:00.000-07:002011-03-20T11:11:28.515-07:00Revising the Dashboard Design - Mixing Stretch and Flowing LayoutThis blog is in relation to the Visual Design Demo for the Dashboard.<br />
<br />
Upon applying the Dashboard design in one of our projects, which utilizes CRUD transaction as well. The main limitation that was hindering us was how the height of the panelBoxes are limited based on the declared row height in the dashboard. When this might be tricky since in some scenarios, I would want some items to be higher such as flowing items for form items and some that are stretched for tabular items.<br />
<br />
Along with this sample and Andrejus's Blog on the Dynamic Dashboard (<a href="http://andrejusb.blogspot.com/2010/02/dynamic-dashboard-ui-shell.html">http://andrejusb.blogspot.com/2010/02/dynamic-dashboard-ui-shell.html</a>), I am able to achieve this requirement by using a panelGroupLayout scroll to replace the dashboard.<br />
<br />
Some of the limitations that I encountered with the default dashboard approach are the following.<br />
<br />
<ul><li>Depending on the browser, the dashboard optimized render will sometimes fail to render the items correctly</li>
<li>Static Height issue</li>
<li>If the taskflow is using BackingBean bindings for the component, utilizing the same taskFlowBinding will make the other region not render at all</li>
<li>All taskflows will be activated the moment the page loads - I tried lazy loading the taskflows using the activate property but after 2nd activation, it just renders blank.</li>
</ul><br />
The main code which allowed me to render some items to flow and some to stretch is the following layout design.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXw78IDzPXr6Z737gCr_TEPGZ0Pk8Bd6dyJYYyv7sUOug6FKOMd_SZS03B2D9PMELuM8pdwl-Yt77tuLJdATE7D_QjSK3MNavWtmomGiF2HGoaRZw0cDOpj86GJpcUpvV6XFIRs0IjiC_/s1600/dashboard_stretch_flow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXw78IDzPXr6Z737gCr_TEPGZ0Pk8Bd6dyJYYyv7sUOug6FKOMd_SZS03B2D9PMELuM8pdwl-Yt77tuLJdATE7D_QjSK3MNavWtmomGiF2HGoaRZw0cDOpj86GJpcUpvV6XFIRs0IjiC_/s320/dashboard_stretch_flow.png" width="320" /></a></div><br />
And in case you're missing the part where it scrollToView to the moved item, that is handled by a little javascript to find the component to scroll to.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaLLtUtzY20TyGHkFsqIIkRv80JwGkGe8GkHoU1mKLBZqxjOcS4YVs4H3vlgtF-XSt0yT7kJ-8Kyex4BbyiVla5kzxC96ZM8kTcLH5f98d_E6KBS4aoW0Vh_jxUbhXKHi5edM4FIvlgT4F/s1600/scroll_to_view_script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaLLtUtzY20TyGHkFsqIIkRv80JwGkGe8GkHoU1mKLBZqxjOcS4YVs4H3vlgtF-XSt0yT7kJ-8Kyex4BbyiVla5kzxC96ZM8kTcLH5f98d_E6KBS4aoW0Vh_jxUbhXKHi5edM4FIvlgT4F/s320/scroll_to_view_script.png" width="320" /></a></div><br />
These combination allowed me to create a modified Dashboard Layout.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihGV2Pi7xJdi2KdMKWMhg4-mdr9X0sLR5O6f_iPBuhJeDmXFlINGorlVq4Zd4750GItB-VNGCY2fBMF0wGKjDJlePPtuoKNy6-Q84gEtcJESIpo-CHZVaGnwZIcg5SeTIs0N_F94KccTZs/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihGV2Pi7xJdi2KdMKWMhg4-mdr9X0sLR5O6f_iPBuhJeDmXFlINGorlVq4Zd4750GItB-VNGCY2fBMF0wGKjDJlePPtuoKNy6-Q84gEtcJESIpo-CHZVaGnwZIcg5SeTIs0N_F94KccTZs/s320/a.png" width="320" /></a></div><br />
If you notice, the Employee PanelBox's height is depending on the amount of fields rendered in it compared to our Department table.<br />
<br />
Note: If you need a copy of the full project design for the dynamic dashboard, just send me an email.Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com3tag:blogger.com,1999:blog-8016119789491424221.post-37717812534436437852011-03-13T12:53:00.000-07:002011-03-13T12:53:31.118-07:00Applied - #69 Code Corner - LOV Using Bounded TaskFlowsI guess to start my spring break blogging, I decided to do a proof of concept regarding the the #69 post in CodeCorner which strikingly is useful especially when your datasource does not rely on a direct database connection.<br />
<br />
This blog consists of:<br />
<br />
<ul><li>WebService design based on BC4J</li>
<li>UI ClientProxy consumer that converts the WS objects to map objects for generic usage.</li>
<li>TaskFlow LOV Design</li>
<li>Consuming page that will use this custom LOV</li>
</ul><br />
In my example, I will be utilizing a WS that is driven by BC4J and was designed from WSDL (TOP-DOWN). Using adf wizard to build my webservice classes, I am utilizing a stateless BC4J to service my DepartmentLovService.<br />
<br />
For now, this service composes of two operations:<br />
<br />
<ul><li>FetchDepartments - Allows filter by Location, MaxFetchCount, and WildCard</li>
<li>ValidateDepartment - Validates a Department input which can be the name or the id and only checks for a single returned instance</li>
</ul><br />
Our query in our ReadOnlyViewObject looks like this.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtvgxjKMDpbaoHsHpJi_QKMp9Q9EpVclJwA6_uwoEewVYtxJREjQJFXiqtBzLBHbYDd_nbEzE9ufuKFX4vUU3squbJzO9G97fF38YnThaX-E8_w4NPZVl7LwQQbDlW5lXrpXfjwSwMnguW/s1600/query.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtvgxjKMDpbaoHsHpJi_QKMp9Q9EpVclJwA6_uwoEewVYtxJREjQJFXiqtBzLBHbYDd_nbEzE9ufuKFX4vUU3squbJzO9G97fF38YnThaX-E8_w4NPZVl7LwQQbDlW5lXrpXfjwSwMnguW/s320/query.png" width="308" /></a></div><br />
Pretty much the XSD request are the bindVariables and the response is a DepartmentType with an Id and a Name. That pretty much sets our WebService and using JDeveloper Wizard to create a WebService from WSDL, you should be all set by now.<br />
<br />
Now for the Client side, we will still use JDeveloper to create a ClientProxy based on the same WSDL or better yet, the deployed WSDL. By now, on the client side i have 3 static methods.<br />
<br />
<ul><li>Retrieve a Map of Departments - <b>public static List<Map> retrieveDepartments(Integer fetchCount, String wildCard, BigInteger locationId, BigInteger includedDepartmentId)</b></li>
<li>Check if a departmentId is valid - <b>public static Boolean isDepartmentValid(Integer departmentId)</b></li>
<li>Retrieve the Department information based on the department Id. -<b> public static Map retrieveValidDepartment(Integer departmentId)</b></li>
</ul><br />
All these methods we will use later in our TaskFlow LOV.<br />
<br />
We have two taskFlows, one is where our main form is which uses the LOV and one for the LOV taskflow itself. Our main taskFlow is pretty straight forward.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj1T2i7CsmlfRtdsYlbOAXb0v2-tWTs0SXaodIqYrQutyDXCXr2ddgtaPUem1ete2T_ka92U5zsNrwCBSWnzk0uq1SIM5iK5Ax5d5Zw6dLAPMGd8ayxmZeQmmLHPG75vzgebnOlbrVQsi0/s1600/formTaskflow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj1T2i7CsmlfRtdsYlbOAXb0v2-tWTs0SXaodIqYrQutyDXCXr2ddgtaPUem1ete2T_ka92U5zsNrwCBSWnzk0uq1SIM5iK5Ax5d5Zw6dLAPMGd8ayxmZeQmmLHPG75vzgebnOlbrVQsi0/s320/formTaskflow.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDgAeM4kEPGKAh7FN0qzpFTDzmreIxu2jDySHPT31zv1DV_YlsSSkn3XYAWj1E_b6iQ-VHqlcLoqnQTSCbmiTJ1uJQUXGTKUch9Wa7PzJjX1ZbivLpxTRg9tBBVhUrn3_Oc5tVS1mpuB7T/s1600/sampleFormFrgmt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDgAeM4kEPGKAh7FN0qzpFTDzmreIxu2jDySHPT31zv1DV_YlsSSkn3XYAWj1E_b6iQ-VHqlcLoqnQTSCbmiTJ1uJQUXGTKUch9Wa7PzJjX1ZbivLpxTRg9tBBVhUrn3_Oc5tVS1mpuB7T/s320/sampleFormFrgmt.png" width="320" /></a></div><br />
Take note how the button for my LOV is set to immediate. This way, when we consider the input as invalid, we can skip the validation phase so that we can refresh it correctly.<br />
<br />
Now for the LOV taskFlow.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1dm2XVarTEc2HtyCtG31q9pj_PX2wHuTdPyZ3V8NQTjFgevn_dg46GqpSoDUdjgli7BwV7bddkTAiFCQRUnNufNHksNdmvoC5eGanV5OHoj6wI5Bjj2U7iaG1MPrfYMOmsdYIlmsHStqj/s1600/departmentLoV.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1dm2XVarTEc2HtyCtG31q9pj_PX2wHuTdPyZ3V8NQTjFgevn_dg46GqpSoDUdjgli7BwV7bddkTAiFCQRUnNufNHksNdmvoC5eGanV5OHoj6wI5Bjj2U7iaG1MPrfYMOmsdYIlmsHStqj/s320/departmentLoV.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmiybg2I3hsfzs20VSKlcMXgIzi8iiJyFyilYYy8NfEBnS4DXEfwVaCkVmGzamCk2C9oti7FRFVTp5KC9giIqRimcV1uvhF3EFyWMNDvycqFuq3al07bx0z8hFFGQ1vv2e29EP817gDOVy/s1600/departmentLoVPage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmiybg2I3hsfzs20VSKlcMXgIzi8iiJyFyilYYy8NfEBnS4DXEfwVaCkVmGzamCk2C9oti7FRFVTp5KC9giIqRimcV1uvhF3EFyWMNDvycqFuq3al07bx0z8hFFGQ1vv2e29EP817gDOVy/s320/departmentLoVPage.png" width="231" /></a></div><br />
We use a pageFlowScope Bean to give us the list of Map which populates the table, and this will also hold all the necessary operations we'll need.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMD7qn7Z1C3K13oyIl0k_G7Jr_5LXsCsNF9e6oZV3Iq_xKN1W4wlIKl64DvU3bARxy05OEZ0R0eGkiIAYDP4Yr6e0wjC2j7bAMbFxyx0vU6JB2gpw_8dWCXGcXAqVk3mySPa9azd4bMauJ/s1600/lovPfBean.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMD7qn7Z1C3K13oyIl0k_G7Jr_5LXsCsNF9e6oZV3Iq_xKN1W4wlIKl64DvU3bARxy05OEZ0R0eGkiIAYDP4Yr6e0wjC2j7bAMbFxyx0vU6JB2gpw_8dWCXGcXAqVk3mySPa9azd4bMauJ/s320/lovPfBean.png" width="196" /></a></div><br />
This method's constructor tries to inspect if a departmentId was submitted. This submitted departmentId will be considered as already selected thus we'd like to give the user the feeling that his old selection is still active. Besides that, we also want to filter the fetch count of our WebService. In a real environment, our LOV might contain give or take 300 options, but this will be such an expensive WS call, so right now we're limiting it by saying "<b>Fetch the first 10 records by default, but also include the record which I've already selected.</b>"<br />
<br />
Our return selection is triggered when we hit the Ok button in our LOV confirming our new choice. All it does is retrieve the selectedIndex from the table and retrieve this same index from our map as well as set it as our returnParameter (Defined in the taskFlow structure).<br />
<br />
Let's go back now to our main calling page and check the returnListener implementation as well as the validation.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6UoCL-tkm5dP2vqTu8XP2quiALQ18AU7o5St4X4kbEFLkpZ2svtH1lUZbxoBn2EHvJOvLyeYd0PvS4HNa7VlrcRl3msWMeMkv76X2OxXY0p3ocjqIuxDY0srbOJfVOE0854mZV9d2hnWh/s1600/formVBean.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6UoCL-tkm5dP2vqTu8XP2quiALQ18AU7o5St4X4kbEFLkpZ2svtH1lUZbxoBn2EHvJOvLyeYd0PvS4HNa7VlrcRl3msWMeMkv76X2OxXY0p3ocjqIuxDY0srbOJfVOE0854mZV9d2hnWh/s320/formVBean.png" width="215" /></a></div><br />
This viewBean allows me direct access to my components and input, but even when using the pageDef as binding attributes, you should be able to achieve the same thing.<br />
<br />
<b>Return Listener</b><br />
Let me start explaining the ReturnListener. This return listener tries to inspect the returnParmeters (Map) for return values matching the static key Strings I defined in our LovPageFlowBean. If a value exist, meaning an "OK" was called from the popup instead of a "CANCEL", we are going to first reset the value in the inputComponent using <b>resetValue()</b> this will guarantee that we tell ADF that if the component is invalid, reset it as we are going to set the correct values. After that a partial refresh is called.<br />
<br />
<b>Validator</b><br />
At my first attempt, i was trying to mix the validator and the valueChange as I want to set the dependent field for the departmentName to be updated if the ID being validated is indeed valid. But for a much cleaner separation of the validation and the fetch for additional input, I decided to separate it. All the validator does is call the validate webservice operation, which is a really quick operation checking for atleast a row matching in the WS Side (See query). So all we're doing here is send the ID through the WebService, and websevice responds with a Nay or Yay hehehe.<br />
<br />
<b>ValueChangeEvent</b><br />
So why bother with changeEvent? Because i want to set the outputLabel to show the selected Department when a department is selected from the LoV as well as when I enter a valid department Id.<br />
<br />
Notes:<br />
Why didn't I just use one WebService (Fetch) to handle everything?<br />
- I use the fetch operation as my initial entry point of populating my table as well as when the user does a search (wildcard) in the LoV, I would do another re-fetch. Reusing the same WS for the validator might be expensive as this WebService functionality is deliver information while the validator should really be fast and light since it will constantly be called by the lifecycle to ensure all the data i'm sending to the server is valid for processing.<br />
<br />
So here's the app demo. Enjoy.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Q9dkwe0Y5DTGdl9_T6eTCwMDSyaebRew4UaJKUdYTN-XoJ0_gHS8nKYn3oh2V_VJ7hxmWl-5b1dAxMOMnk_Sa2ppf-kAuYZXSE6-3GWISUdryisQ_-UeP1bydwhku-CYzGnRjUG6YI-1/s1600/tester_a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Q9dkwe0Y5DTGdl9_T6eTCwMDSyaebRew4UaJKUdYTN-XoJ0_gHS8nKYn3oh2V_VJ7hxmWl-5b1dAxMOMnk_Sa2ppf-kAuYZXSE6-3GWISUdryisQ_-UeP1bydwhku-CYzGnRjUG6YI-1/s320/tester_a.png" width="265" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihyphenhyphendzbGLDRBQ9fX6kDzC2ahnjhkGbaj-lro254BYgF0J7Koiu2Dr0ToaZjZmqeBc0SpyZ3u1YWpsVMTsjpeDRpCFhelDS26hOf_zjH2IrSipZDRaWBoFLX5ybfBIppJc7bEF3Pk4SdGwTr/s1600/tester_b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihyphenhyphendzbGLDRBQ9fX6kDzC2ahnjhkGbaj-lro254BYgF0J7Koiu2Dr0ToaZjZmqeBc0SpyZ3u1YWpsVMTsjpeDRpCFhelDS26hOf_zjH2IrSipZDRaWBoFLX5ybfBIppJc7bEF3Pk4SdGwTr/s320/tester_b.png" width="265" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtLM8ncX-R_cHu5ZNIpJ0c6LtCeNWsm1HyxBipE-0AQOuyyn81FsKses6MPOh4ZH15hkwfi_-HfmVrlPfwsrcqcowpbiH334tkt6kvSOCerG_3D8F43ZfalNwcrWc_gSFcEQ9jefnlXbqR/s1600/tester_c.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtLM8ncX-R_cHu5ZNIpJ0c6LtCeNWsm1HyxBipE-0AQOuyyn81FsKses6MPOh4ZH15hkwfi_-HfmVrlPfwsrcqcowpbiH334tkt6kvSOCerG_3D8F43ZfalNwcrWc_gSFcEQ9jefnlXbqR/s320/tester_c.png" width="265" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Filter and select value</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjrGlnhtHCbJIvv1f3Zfgg-uEe8TQAkx0iflns3kTlEEqvlbiqxaq4a7hOXMce4N_96cH620C0Igbk7twgQ07GHDH5hwpbwEogHtYS8tTo4bDObQukKK2Ubrao849NvBwKxTKDwB7x3K9n/s1600/tester_d.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjrGlnhtHCbJIvv1f3Zfgg-uEe8TQAkx0iflns3kTlEEqvlbiqxaq4a7hOXMce4N_96cH620C0Igbk7twgQ07GHDH5hwpbwEogHtYS8tTo4bDObQukKK2Ubrao849NvBwKxTKDwB7x3K9n/s320/tester_d.png" width="265" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Select another value but when the initial search is done, always include what's already selected.</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx0UpWq4BoUvkasia5_F4bHu3FpEVl4WrSWSujKsI3it_xsSQs3iFKSUVkxq_bV2vibZjjtDgmirNHfjAIqg6krBkLOQMvldFdm6rUty3c7iSl6DgBDWNLqZLRaIr4AQfUI3YQ5S20ZjrT/s1600/tester_e.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx0UpWq4BoUvkasia5_F4bHu3FpEVl4WrSWSujKsI3it_xsSQs3iFKSUVkxq_bV2vibZjjtDgmirNHfjAIqg6krBkLOQMvldFdm6rUty3c7iSl6DgBDWNLqZLRaIr4AQfUI3YQ5S20ZjrT/s320/tester_e.png" width="265" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">There is no department registered in the HR schema with ID set to 5</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAg0sxzAjD_AE51u1JabX7QM2HowiAU18NbWHwtxGjrDtpHZteW23MpG2VeLwAaxALVCwrFfvLtcx2I7uvmrHN0iwjdqJZOhTwlwMxeUpdwsYbQKMTiXnRInZ3ZQ2edSP2QTis0zz5HNEy/s1600/tester_f.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAg0sxzAjD_AE51u1JabX7QM2HowiAU18NbWHwtxGjrDtpHZteW23MpG2VeLwAaxALVCwrFfvLtcx2I7uvmrHN0iwjdqJZOhTwlwMxeUpdwsYbQKMTiXnRInZ3ZQ2edSP2QTis0zz5HNEy/s320/tester_f.png" width="265" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Set a valid value, and valueChangeListener sets the DepartmentName for you.</td></tr>
</tbody></table>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0tag:blogger.com,1999:blog-8016119789491424221.post-47402202806599696742011-03-05T20:21:00.000-08:002011-03-06T04:37:06.117-08:00Cascading Dropdown List from BeanI'll demonstrate how to build a dropdown list where the values are coming from your manage bean. A good useCase for this scenario is when you can't use a BC driven LOVModel and pretty much rely on a manage bean to build your list. In my example, i'm relying on a webservice to return me the list of possible dropdown items which i'll need based on a submitted locationId. On top of it, i keep this list in a pageFlowScope map so that once I have already fetched it, i don't do a refetch especially when i'm asking for the same location's departments.<br />
<div><br />
</div><div>For my sample, I have a table that contains items (generic) with a location Id. The HR schema has a table of Departments that can be filtered based on this locationId.</div><div><br />
</div><div>So the final running app looks like this.</div><div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWVmg6Epn0GMNH5sUYw3JZKaB6q0u4kHBeSwENAKHKpYjaNn2xmOBo42w0a-XbHg2kzCToWsUYL-M_7CNLGbgcrvRDa4uTGt0_Njk_v-En7GZxtNgAYF92E0QH_fbTNaYu2ZBQMVciKr3-/s1600/page_a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="189" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWVmg6Epn0GMNH5sUYw3JZKaB6q0u4kHBeSwENAKHKpYjaNn2xmOBo42w0a-XbHg2kzCToWsUYL-M_7CNLGbgcrvRDa4uTGt0_Njk_v-En7GZxtNgAYF92E0QH_fbTNaYu2ZBQMVciKr3-/s320/page_a.png" width="320" /></a></div><div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtIzM6tFFEhqKwX7vXrpC_06jKRJMyQMn5Esr6Abj2S6XMGF7Y3IkneUEaV5DTwzoffVx8gPZ-lV9_k0-6qqxyLiUSpy74llif_DsuIAVj5caYe7T4Qk7KNIchLQKXLLqIsFlzDeZZQRL9/s1600/page_b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="189" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtIzM6tFFEhqKwX7vXrpC_06jKRJMyQMn5Esr6Abj2S6XMGF7Y3IkneUEaV5DTwzoffVx8gPZ-lV9_k0-6qqxyLiUSpy74llif_DsuIAVj5caYe7T4Qk7KNIchLQKXLLqIsFlzDeZZQRL9/s320/page_b.png" width="320" /></a></div><div><br />
</div><div>And yes the departments are filtered based on the locaitonId. So now for the code.</div><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdBIUXRY5rB0YBMkdzaiZYfxClxAY1rIugrg4qp-Xz60Ahu0DBN1YmtkT4g_syzCUzXm7BcoA0gaMD65qE93Gxd8lRhpr-HdZ5gyO0QkBiYLGohrDj0BPBCxXOqUugw07XsxSTRH86_Rhp/s1600/pageFgmt.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="97" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdBIUXRY5rB0YBMkdzaiZYfxClxAY1rIugrg4qp-Xz60Ahu0DBN1YmtkT4g_syzCUzXm7BcoA0gaMD65qE93Gxd8lRhpr-HdZ5gyO0QkBiYLGohrDj0BPBCxXOqUugw07XsxSTRH86_Rhp/s400/pageFgmt.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">PageFragment</td></tr>
</tbody></table><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeJIhoT1BdBJPB5eBIhxHhz5EqwFmYpPpg9o0_Lg8GTe47v8qbda5xf6z8u45EN0cZrnXxQwWFFK22wo1Q9Mfnazf0FwlKZxrx3Gx1bOaeMFsqSHnCHNVdjTvHuN1sUetNJta2TSiNWbqQ/s1600/backingBean.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeJIhoT1BdBJPB5eBIhxHhz5EqwFmYpPpg9o0_Lg8GTe47v8qbda5xf6z8u45EN0cZrnXxQwWFFK22wo1Q9Mfnazf0FwlKZxrx3Gx1bOaeMFsqSHnCHNVdjTvHuN1sUetNJta2TSiNWbqQ/s320/backingBean.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">BackingBean</td></tr>
</tbody></table><div><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivPPAJvjqmV7wsNxFzmEeqihM8_hbk63s-wpdTkajyciIBTcDL7oO7hcc-M5QCRQb_vC0u_nvEQl_Fjn6XDfCyRqS4ioxqO-7vZI4IrQk8cWcfD6-ol8N1i2cTqFz5iVTea6DO1KQ6N8vm/s1600/pageFlowBean.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="199" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivPPAJvjqmV7wsNxFzmEeqihM8_hbk63s-wpdTkajyciIBTcDL7oO7hcc-M5QCRQb_vC0u_nvEQl_Fjn6XDfCyRqS4ioxqO-7vZI4IrQk8cWcfD6-ol8N1i2cTqFz5iVTea6DO1KQ6N8vm/s320/pageFlowBean.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">PageFlowBean</td></tr>
</tbody></table><div><br />
</div><div>A question was raised about how to refresh the list incase there was any dynamic change, the answer to that is to decrease the scope of the bean which holds our map.</div><div><br />
</div><div>Note:</div><div><b>retrieveDepartmentListFromDatasource(locationId</b>) calls a webService to return a list of available departments.</div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com3tag:blogger.com,1999:blog-8016119789491424221.post-23014143449938034802011-02-26T14:11:00.000-08:002011-02-28T04:00:29.944-08:00Passing URL Parameters Between Two (2) ADF ApplicationsI'll try to make this blog a quick one just in case i miss out a month end blogging hehe.<br />
<br />
I just want to demonstrate how you can quickly redirect from one Application (with a totally different URL) to the next, while sending parameters using the go<Commands> eg. goLink.<br />
<br />
In my example, i created two identical apps... well exactly alike but with a different title, different context root, etc. I named them ApplicationA and ApplicationB hehe.<br />
<br />
So a quick demo of what it does:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFBv8xl2HSruXysBjfNK1GLRgCRt4J4u4sJgnDx-1oy_sa2Lciws22O_ebEAWo6Fxpe252pp8BxtpWJn5GMRzBYnQcE6i9u5r4M6l4VHNUiCuCs6I-iU9v4KWNBbGMYmMz1Xvtq8qRCxMh/s1600/result_a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFBv8xl2HSruXysBjfNK1GLRgCRt4J4u4sJgnDx-1oy_sa2Lciws22O_ebEAWo6Fxpe252pp8BxtpWJn5GMRzBYnQcE6i9u5r4M6l4VHNUiCuCs6I-iU9v4KWNBbGMYmMz1Xvtq8qRCxMh/s320/result_a.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVhlESdN3W0v7t8F3oat9QTEBFqOfAsbmDCu2yCZqciG0MRjPcqLePfa1rLGAoRdgE4R1QaixEHuBrVJA8BY3I4ynwY7KkL3UvX7450TM892e9y3bBIZOPB1oncEltD463Bcunleanx6xt/s1600/result_b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVhlESdN3W0v7t8F3oat9QTEBFqOfAsbmDCu2yCZqciG0MRjPcqLePfa1rLGAoRdgE4R1QaixEHuBrVJA8BY3I4ynwY7KkL3UvX7450TM892e9y3bBIZOPB1oncEltD463Bcunleanx6xt/s320/result_b.png" width="320" /></a></div><br />
Now for the jspx code (again they both have the same code just different titles)<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjanLTVfTACMSQJslq37kveqYSvcEF3RO9smz8O4nHehrt23b1QW1Y6j0xaf6hE8DQLEyboyPbXFonGN5rzsAmR9gKkosC79E-Rhf4dKwu-yDSAZ09zNoCErrS9nmiixFa_8zq2UfRXrt91/s1600/jspx_code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjanLTVfTACMSQJslq37kveqYSvcEF3RO9smz8O4nHehrt23b1QW1Y6j0xaf6hE8DQLEyboyPbXFonGN5rzsAmR9gKkosC79E-Rhf4dKwu-yDSAZ09zNoCErrS9nmiixFa_8zq2UfRXrt91/s320/jspx_code.png" width="320" /></a></div><br />
And the matching adfc-config input page parameter declaration.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-miuw1Sl1YdlRgH8GKKIkuH6dP9lgnajiMyoqBBNohYpE9rwrOTvqxS5sTN0PissW506G-dSrPN6iC4PF-9chXgk_YPp4FhBLre24JwMhQGnXrNUp5zPtGZio8Dwqt_GI7UJ36OHM3zsV/s1600/page_param.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-miuw1Sl1YdlRgH8GKKIkuH6dP9lgnajiMyoqBBNohYpE9rwrOTvqxS5sTN0PissW506G-dSrPN6iC4PF-9chXgk_YPp4FhBLre24JwMhQGnXrNUp5zPtGZio8Dwqt_GI7UJ36OHM3zsV/s320/page_param.png" width="320" /></a></div><br />
Quick and easy way for basic url parameters.Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com3tag:blogger.com,1999:blog-8016119789491424221.post-43030957180489806752011-02-12T19:15:00.000-08:002011-02-12T20:57:00.829-08:00Sorting Programmatic Data with NULLs as the Last RowsThis scenario can be a very specific requirement. In fact, by using a database query, you should be able to achieve this by using NULLS LAST or FIRST in the order by clause. Unfortunately you can't do this on a programmatic ViewObject thus this blog hehehe. <br />
<br />
Let's say you have a programmatic viewObject which doesn't rely on a sql query at all for sorting.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOZvKjYD4E7RwAWlO9nqvwMizy8YxmfmjfyBSNln91CVEbU6o5U1lWD0A4EuKVEMr0X8ZpupShbnUn7XiWVMK3NJbEr8MK9WEp3JRW7SNSUYaoEHyTAKASfE6LcJnvdjiUCIGY8Asgu9GS/s1600/dept_ds.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOZvKjYD4E7RwAWlO9nqvwMizy8YxmfmjfyBSNln91CVEbU6o5U1lWD0A4EuKVEMr0X8ZpupShbnUn7XiWVMK3NJbEr8MK9WEp3JRW7SNSUYaoEHyTAKASfE6LcJnvdjiUCIGY8Asgu9GS/s320/dept_ds.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPCQSzAvzF_ugpVdW4cZt530OfB71IDowBuflQscKmtbfXy8Om10nbQQHnR0ugRsOVXnRUrJjbqCncYU9v2vZ6Wjcgwuo7QVCVAonBxQa6ujrRqGyyJjyxbARW3iG4Gs2_ufdJhpAaJFt1/s1600/vo_src_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPCQSzAvzF_ugpVdW4cZt530OfB71IDowBuflQscKmtbfXy8Om10nbQQHnR0ugRsOVXnRUrJjbqCncYU9v2vZ6Wjcgwuo7QVCVAonBxQa6ujrRqGyyJjyxbARW3iG4Gs2_ufdJhpAaJFt1/s320/vo_src_1.png" width="228" /></a></div>This should already give you an idea on what to expect. The natural way that nulls are ordered is that they come before alphabets. So by sorting departments for example, this is what we'll get.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUM_GpsxJJmsfRNFTG1HIgbvNtW2Nr9nCoyUnP7dAZtNNrjlVSLeJo9ZhMXQwZsqQgWMZxhzUZtKvrhgJjjXVX4zMz7Lhntw3nrfza_WMdMLcpDqLtsKWR_6R9cxkUZNKHa3YT-4wwLECU/s1600/page_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUM_GpsxJJmsfRNFTG1HIgbvNtW2Nr9nCoyUnP7dAZtNNrjlVSLeJo9ZhMXQwZsqQgWMZxhzUZtKvrhgJjjXVX4zMz7Lhntw3nrfza_WMdMLcpDqLtsKWR_6R9cxkUZNKHa3YT-4wwLECU/s320/page_1.png" width="320" /></a></div><br />
But what we want is for DepartmentName to be ordered but anything that does not have a description should be the last one. Take note, we are not using panelCollection here where we can sort multiple columns at once.<br />
<br />
So let's add one column to tell us whether this department value is null or not.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyYN3apjr9EGOTlnj2scPGUuoHiSAFwQLv9sFV0axtj2gwuEI1Kcps7Yq7PRdQ-sXW7juWLlsQpwS7jcq8BHPJwa55IVLajqSF6FoGc77IWBJF9DvMRfZvcgI8Y03vR_SLuXNa48HMCCBO/s1600/attribute.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyYN3apjr9EGOTlnj2scPGUuoHiSAFwQLv9sFV0axtj2gwuEI1Kcps7Yq7PRdQ-sXW7juWLlsQpwS7jcq8BHPJwa55IVLajqSF6FoGc77IWBJF9DvMRfZvcgI8Y03vR_SLuXNa48HMCCBO/s320/attribute.png" width="320" /></a></div><br />
<br />
<br />
<br />
Then let's override the setSortBy method on the viewImpl to append our extra sort parameter.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6VLDY9TjtmCJIdmh2jR-6w4HYePLpg_TC-ugWiwvSFUG8HIZbMZwzjDdR69dEta8Tx_MfWQg3-mD_BfkY8GwzkahMPKk_GCWhbLJ6U8ShnUOR5w5_ZmgQCHzbCrWHfm-_ivB3hT54HmXX/s1600/sort_code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6VLDY9TjtmCJIdmh2jR-6w4HYePLpg_TC-ugWiwvSFUG8HIZbMZwzjDdR69dEta8Tx_MfWQg3-mD_BfkY8GwzkahMPKk_GCWhbLJ6U8ShnUOR5w5_ZmgQCHzbCrWHfm-_ivB3hT54HmXX/s320/sort_code.png" width="320" /></a></div><br />
<br />
<br />
with this, any sort we do will always consider sorting the null descriptions to be the last rows.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbMnS4jq_PL3OxLxcxymb6AImKGgv5byYsy4xaBceUsA4B0yMtIUphQB41Bw5gR4ruf1EVV2HhF9LKSstQcz5ybpVNGndVNgm49GvQzGiLc6EyqBc75C8dfXuDaFge15yNI4gsdlDhqObC/s1600/page_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbMnS4jq_PL3OxLxcxymb6AImKGgv5byYsy4xaBceUsA4B0yMtIUphQB41Bw5gR4ruf1EVV2HhF9LKSstQcz5ybpVNGndVNgm49GvQzGiLc6EyqBc75C8dfXuDaFge15yNI4gsdlDhqObC/s400/page_2.png" width="400" /></a></div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0tag:blogger.com,1999:blog-8016119789491424221.post-18281410808819310512011-02-11T17:49:00.000-08:002011-02-12T20:58:27.339-08:00Setting-up your Project for SkinningI'd like to share my workflow whenever i have a requirement to quickly test/skin a certain component in ADF.<br />
<br />
First of all, install firebug plugin to your mozilla firefox. Don't worry, this will only help us debug our skinning tags for later.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq0XAXJr92c2pXqB5htsurNyY7k_njK01yyaYe2KU85_zBesm1-gHzXdvnNAb5ZStIlcWDnLd6MgGglAZVipl2jBV_TT4BQoGQUnDNcOfLR5MuAugo6HZSmNqeYDGiuYMCfKJOnWIeFWX2/s1600/firefox_addon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq0XAXJr92c2pXqB5htsurNyY7k_njK01yyaYe2KU85_zBesm1-gHzXdvnNAb5ZStIlcWDnLd6MgGglAZVipl2jBV_TT4BQoGQUnDNcOfLR5MuAugo6HZSmNqeYDGiuYMCfKJOnWIeFWX2/s320/firefox_addon.png" width="320" /></a></div><br />
Create two files which you'll need for skinning on your ViewProject.<br />
1. CSS file (of course) - ( eg. MySimpleSkin.css )<br />
2. trinidad-skins.xml - This is where we will define the Skin name which the css file will be linked.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6qJ7urTB9JgUWeYkFdNX6v6nXmhBE4BgjSe-xcy82NgJO_mhnibu5JxLG7qjVfIe0pMtdkddqoW5H_-zzL7JZVr_X7ymVIYn5GeF0wtvT2VhGltna3g6VFMJyPopTeXdPxq5YYbEE4bvU/s1600/app_nav_prep.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6qJ7urTB9JgUWeYkFdNX6v6nXmhBE4BgjSe-xcy82NgJO_mhnibu5JxLG7qjVfIe0pMtdkddqoW5H_-zzL7JZVr_X7ymVIYn5GeF0wtvT2VhGltna3g6VFMJyPopTeXdPxq5YYbEE4bvU/s1600/app_nav_prep.png" /></a></div><br />
Let's initially configure the trinidad-skins.xml file to link our css file and also configure trinidad-config.xml to use the skin we defined in trinidad-skins.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwRAzYDOakMwqxy2tkCUlptR_rBTH24Bxa5y527Lq14S0VzHENw5_HYA9YmltFBatiur6Ex-57tSTV695fIkqO6KFVI5XI5GdrPgZjgUhXv2YIoCfz8a3HxspwkllgKLR_bhKBNo1UfTI_/s1600/trinidad-skins-initial.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwRAzYDOakMwqxy2tkCUlptR_rBTH24Bxa5y527Lq14S0VzHENw5_HYA9YmltFBatiur6Ex-57tSTV695fIkqO6KFVI5XI5GdrPgZjgUhXv2YIoCfz8a3HxspwkllgKLR_bhKBNo1UfTI_/s320/trinidad-skins-initial.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-g3dRnoQ9UjhIOenTAuPIp_USGIDv4RSa32Xnz8z8_em9bcDiaC2YD7PpO8QI54m7E65Oa7TxetLw43ZwWpqRXVzsIq-4-mhdNoTJSgkl0Hy-3UwS_AsqYF72ZWX0lrL4KbTf-Z15uggp/s1600/trinidad-config.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="77" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-g3dRnoQ9UjhIOenTAuPIp_USGIDv4RSa32Xnz8z8_em9bcDiaC2YD7PpO8QI54m7E65Oa7TxetLw43ZwWpqRXVzsIq-4-mhdNoTJSgkl0Hy-3UwS_AsqYF72ZWX0lrL4KbTf-Z15uggp/s320/trinidad-config.png" width="320" /></a></div><br />
By this time we can already create a page to test what we got so far. Any page will do, and since we are now extending to blafplus-rich.desktop then you should notice some major skin change from the fusion skin.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh30YJUIdrtmcBPMhSastmg_n4LfYJ3-2_q4sQWRh0VDqiWvKPVxgbUk-yddMIwKMMD4zGMa3j0ckb20QpvcKDWti5s5Ps7PWzgDBRk2pBH8-DOm2yUoAz5EcvHqbx8OSOg2sV0PNoqC6JF/s1600/page_a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="259" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh30YJUIdrtmcBPMhSastmg_n4LfYJ3-2_q4sQWRh0VDqiWvKPVxgbUk-yddMIwKMMD4zGMa3j0ckb20QpvcKDWti5s5Ps7PWzgDBRk2pBH8-DOm2yUoAz5EcvHqbx8OSOg2sV0PNoqC6JF/s320/page_a.png" width="320" /></a></div><br />
Not exactly the coolest of page but what I'd like you to see is the tags applied when i highlighted the component. Getting a hint yet? Yes those are the tags and no that's not what we want to skin. So to configure the tags to show during debug in firefox, we will need to do a little more configuration.<br />
<br />
Configure your web.xml to disable the tag compression.<br />
<br />
<context-param><br />
<param-name><br />
org.apache.myfaces.trinidad.DISABLE_CONTENT_COMPRESSION<br />
</param-name><br />
<param-value>true</param-value><br />
</context-param><br />
<br />
While you're in the web.xml file, let's also set an extra parameter to be true for the time being that we are designing.<br />
<br />
<context-param> <br />
<param-name><br />
org.apache.myfaces.trinidad.CHECK_FILE_MODIFICATION<br />
</param-name><br />
<param-value>true</param-value><br />
</context-param><br />
<br />
Both these settings will help us during our skinning procedure. Take <b>NOTE </b>that these settings needs to be <b>turned off</b> once you're done to save some processing time. More info on these in the Fusion Developers guide.<br />
<br />
After running your app the 2nd time around, FireBug should now show you these tags.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj6_h3z4Ng5ziYQBcEczWf3UP_DMPxsfYFSlHZcJCdeL8YqLT4Xn5v9OHPUbv-RqewxZONTTg1SuVdNB_M9PgoB0bSAJcx4tve2HBXUAl0rYSnhaYswbj7Fa_9Gay5qd79n7UlQKK366Fs/s1600/page_b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj6_h3z4Ng5ziYQBcEczWf3UP_DMPxsfYFSlHZcJCdeL8YqLT4Xn5v9OHPUbv-RqewxZONTTg1SuVdNB_M9PgoB0bSAJcx4tve2HBXUAl0rYSnhaYswbj7Fa_9Gay5qd79n7UlQKK366Fs/s320/page_b.png" width="320" /></a></div><br />
I'm guessing by now you're already curious what each tag means, and yes there are a lot. Help document in JDeveloper is your bestfriend on this one as well as skinning tag guides in rea.oracle.com website and of course, practice will let you know and discover how to skin tags.<br />
<br />
Some tips while skinning though.<br />
<br />
1. If you're unsure that your skin is being applied, try coloring something that will notice you. I usually color the document green.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9drRsR7m2eGaAzRaK0M63Iw3ngT5-F1smLSTv3Ei0Qzgwny6I_Qxs1HsnbUjssBTQkOY-sy1oQoFwnO4pO-_y_WybWR93_PGlaAk0Vl0BEViwHrdsvNwxIeOGx7IwLdeEUSZpzcBeXgQU/s1600/css_a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9drRsR7m2eGaAzRaK0M63Iw3ngT5-F1smLSTv3Ei0Qzgwny6I_Qxs1HsnbUjssBTQkOY-sy1oQoFwnO4pO-_y_WybWR93_PGlaAk0Vl0BEViwHrdsvNwxIeOGx7IwLdeEUSZpzcBeXgQU/s1600/css_a.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ5kwlwF-sEtZ3u4YfajI-effHa0l-Z-k805HEUmAcqFL21bQsvyLWxfmByscz245Za2mu7-9WKdwW_q4De0_JNtb9u4e7J-Kuh9ksv6cAIdLqDvshu-Mc41oGSxgncxeC-Dk1S5MmYqGQ/s1600/page_c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ5kwlwF-sEtZ3u4YfajI-effHa0l-Z-k805HEUmAcqFL21bQsvyLWxfmByscz245Za2mu7-9WKdwW_q4De0_JNtb9u4e7J-Kuh9ksv6cAIdLqDvshu-Mc41oGSxgncxeC-Dk1S5MmYqGQ/s320/page_c.png" width="320" /></a></div><br />
2. If you're wondering why your skin isn't taking effect, then clear your internet cache.<br />
3. If you're still not sure, then make sure that you skin files (trinidad-config, trinidad-skins) are pointing correctly to the correct css file.<br />
4. Lastly, if you want to merge skin files (css.files) the best way i found to do this is by using the skin addition in trinidad skins.<br />
<br />
Example for #4 is if I'd like to let's say split css files depending on the component or for themes.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-PfyoVVKJthhExParHNmzkad6tstlkJSYxAkP5MoN2139vZkYH2_sNQZQYLVpnRVDeJWixitDhubzwe8Yq2cQcIFEl7YVDcUvwrN3qy-7mEHWokz_Edqkzm7zr6QKWoau2DP-EVXgyGa4/s1600/add_on_skin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-PfyoVVKJthhExParHNmzkad6tstlkJSYxAkP5MoN2139vZkYH2_sNQZQYLVpnRVDeJWixitDhubzwe8Yq2cQcIFEl7YVDcUvwrN3qy-7mEHWokz_Edqkzm7zr6QKWoau2DP-EVXgyGa4/s400/add_on_skin.png" width="400" /></a></div><br />
Hope that helps in setting your skinning project.Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0tag:blogger.com,1999:blog-8016119789491424221.post-48249357723698241252011-02-07T17:27:00.000-08:002011-02-12T20:59:14.075-08:00Popup from Popup<div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">There are many ways on how to launch a popup from a popup, and I'm going to demonstrate here a "backingBean-based" of launching this.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">So why go programmatic? The reason for this is because most of the time, I would prefer launching one popup at a time, meaning that when I call the second popup, I first make sure to close the current popup.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">So a straight forward sample in launching the popup declaratively looks like this.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpOCBEouuCjve-rN6Yv1NkGg0bO12SoqbjfXykM9_5MANkNFodLBYk7YWsxCnDBpKZVwRUL4ug8FXZTZUIULMx9Lu0-y-wjB56ZatfdpL7JsCZSrQ3HAxXIZ7mHZbrnVr0rGU4vY1vjLiM/s1600/simple_a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpOCBEouuCjve-rN6Yv1NkGg0bO12SoqbjfXykM9_5MANkNFodLBYk7YWsxCnDBpKZVwRUL4ug8FXZTZUIULMx9Lu0-y-wjB56ZatfdpL7JsCZSrQ3HAxXIZ7mHZbrnVr0rGU4vY1vjLiM/s320/simple_a.png" width="320" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjACEQnlpUSYtRDUW8nsuv24nzQfXuPuVX-jvs_QJSTmEI-44cb1ju3Z-q5tlwktOX6yqdMr9LZ_A-s7U12Pq-1miPsZMAmtAXxtJ0UHX0wf5DRTgQb9M9W0xteJ8weCTJ3n1KE5Hc0IUNy/s1600/simple_b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjACEQnlpUSYtRDUW8nsuv24nzQfXuPuVX-jvs_QJSTmEI-44cb1ju3Z-q5tlwktOX6yqdMr9LZ_A-s7U12Pq-1miPsZMAmtAXxtJ0UHX0wf5DRTgQb9M9W0xteJ8weCTJ3n1KE5Hc0IUNy/s320/simple_b.png" width="320" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8kOItzb9VO-b_0RgG2woOWPDwSg8XlwafwbqYkyB-yMiFSpvZpLg4P0r3O9AdoAWRtfX-AAPMXCXqEPOb7SkaTXVhSgboOblg5rJ8dvU_qrb3RQMoi2LADBl7xBWKbhsmDjqfel8jawa2/s1600/simple_c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8kOItzb9VO-b_0RgG2woOWPDwSg8XlwafwbqYkyB-yMiFSpvZpLg4P0r3O9AdoAWRtfX-AAPMXCXqEPOb7SkaTXVhSgboOblg5rJ8dvU_qrb3RQMoi2LADBl7xBWKbhsmDjqfel8jawa2/s320/simple_c.png" width="320" /></a></span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl6tGNFT4SVDgAlaB73ZyqT-m-8GOtLKc35wFqgxSq9CEEMABKmGyOZUAq83H_s5oX-EYSdcY57AYpQsfWtfOtiMX8g1SKaqlSmvuRzHbwP3kqIBBiv8agu355VXLaD1yYULRtqj9lyDqP/s1600/simple_z_code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-5rW8uO0MCIpKCFda712CBPS7zhGZC7AtyWs4FAej8aPpdUutoQhzoBVCw1yiYXWPUBzQtIYhyphenhyphen8lXN43v0JCA6vAZrTtaw6L4x9ZrVdxq57sGpPmXkDDJlka3Sq03lhw81h_hQwVuKiFw/s1600/simple_z_code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-5rW8uO0MCIpKCFda712CBPS7zhGZC7AtyWs4FAej8aPpdUutoQhzoBVCw1yiYXWPUBzQtIYhyphenhyphen8lXN43v0JCA6vAZrTtaw6L4x9ZrVdxq57sGpPmXkDDJlka3Sq03lhw81h_hQwVuKiFw/s320/simple_z_code.png" width="315" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">As you might already know, this is achieved by simply calling af:showPopupBehavior. </span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Now let's go for the programmatic approach in making sure we first close the current popup before launching a 2nd one. As I have already mentioned, there are different ways of achieving this without binding your popup to a bean by using javascript for example (see <a href="http://technology.amis.nl/blog/4649/adf-11g-invoke-a-popup-from-a-popup">Invoke popup from a popup by Luc Bors</a> ).</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNQJ0YTJjwMkJRsRP6V0WwNWI7QRdzRvdgFpvSpKQSaYISgQ6K7327gcxv8kRjgU5beKRJYVVxPnErCqOPr74o8MhCGA3x8AFtJXNzZiBE874cI60oSUuJL_XLid11Pp2adpKeEguqT8O0/s1600/cool_a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNQJ0YTJjwMkJRsRP6V0WwNWI7QRdzRvdgFpvSpKQSaYISgQ6K7327gcxv8kRjgU5beKRJYVVxPnErCqOPr74o8MhCGA3x8AFtJXNzZiBE874cI60oSUuJL_XLid11Pp2adpKeEguqT8O0/s320/cool_a.png" width="320" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxQYZfUq4qcPc1U_3_0pM2ECFa46zXX58mNdrLUfalzo6JFVae_V_u8oh3cgOx_1z4AbVkunoqs5Q5_0gEyw208OSw1ut7akCayBlXdmk_1YhZXb2cjTlZ_FzEnCGTrJBtHNw0Zle7dqlP/s1600/cool_b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxQYZfUq4qcPc1U_3_0pM2ECFa46zXX58mNdrLUfalzo6JFVae_V_u8oh3cgOx_1z4AbVkunoqs5Q5_0gEyw208OSw1ut7akCayBlXdmk_1YhZXb2cjTlZ_FzEnCGTrJBtHNw0Zle7dqlP/s320/cool_b.png" width="320" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLeumDrd2y8vIzZQcrVMm1gIyaQsFfRWfnXLO_HFXGIag5kBh4MZqNo02MKutnqhSWRvV-frfGXE_-dTSd_cAI1nxD6kYjRwWDeU70ejgAGjW_g4RJsJ8-ZLAw7lY761WJaFoUFs-D1hW5/s1600/cool_c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLeumDrd2y8vIzZQcrVMm1gIyaQsFfRWfnXLO_HFXGIag5kBh4MZqNo02MKutnqhSWRvV-frfGXE_-dTSd_cAI1nxD6kYjRwWDeU70ejgAGjW_g4RJsJ8-ZLAw7lY761WJaFoUFs-D1hW5/s320/cool_c.png" width="320" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4C2NeHchXcPPTeYMHkgKl5fITf8QTEoEsjKJv-HYl6sSRpenfoMQL7gKNClswpJFmbPm-puD87dkbe2VR9fzy9Lm56fYZMlQnrZid1h5xhbN9oN8LT23bvlf5oLBdEYSQ_6m76e1j1937/s1600/cool_z_code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4C2NeHchXcPPTeYMHkgKl5fITf8QTEoEsjKJv-HYl6sSRpenfoMQL7gKNClswpJFmbPm-puD87dkbe2VR9fzy9Lm56fYZMlQnrZid1h5xhbN9oN8LT23bvlf5oLBdEYSQ_6m76e1j1937/s320/cool_z_code.png" width="320" /></a></span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5rKD-hQSGWOt74PII5HEu9eEFJZ0OeXb99dapt3H4hd2F80_CqwjpuO_AcC6gt0IIHPvFuqJRbXQAFhsDStK3vcl_7fPR8Ob6RPSsd510au7T80UkVUzPLM9btdyQTaKS2K8oysYY-PuX/s1600/cool_z_bean_code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5rKD-hQSGWOt74PII5HEu9eEFJZ0OeXb99dapt3H4hd2F80_CqwjpuO_AcC6gt0IIHPvFuqJRbXQAFhsDStK3vcl_7fPR8Ob6RPSsd510au7T80UkVUzPLM9btdyQTaKS2K8oysYY-PuX/s1600/cool_z_bean_code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5rKD-hQSGWOt74PII5HEu9eEFJZ0OeXb99dapt3H4hd2F80_CqwjpuO_AcC6gt0IIHPvFuqJRbXQAFhsDStK3vcl_7fPR8Ob6RPSsd510au7T80UkVUzPLM9btdyQTaKS2K8oysYY-PuX/s320/cool_z_bean_code.png" width="320" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Cheers.</span></div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0tag:blogger.com,1999:blog-8016119789491424221.post-57429472348311621892011-02-02T18:12:00.000-08:002011-02-12T20:59:55.188-08:00Modeling a Cascading DropDown<div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Here's a quick step-by-step tutorial on how to model a 3 level cascading dropdown combobox.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Requirements:</span></div><ul style="font-family: Arial,Helvetica,sans-serif;"><li><span style="font-size: small;">HR Schema</span></li>
<li><span style="font-size: small;">ReadOnly viewObject for Countries, Locations and Departments </span><span style="font-size: small;"> </span></li>
</ul><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Arial,Helvetica,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUZT-2Ys6CnGlvxZXyGe4MqT_FJTKJ6J58NSq7N65kVswCmQ76XET2ArhUm-0n-1ANczeS0jT_JpYnKd-MgZZsxz1tdFNW6yXxr57MmJO7dcz8YaHEs6DG1e6SQUczdLA8GWe4X3s-tXJE/s1600/hr_model.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="264" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUZT-2Ys6CnGlvxZXyGe4MqT_FJTKJ6J58NSq7N65kVswCmQ76XET2ArhUm-0n-1ANczeS0jT_JpYnKd-MgZZsxz1tdFNW6yXxr57MmJO7dcz8YaHEs6DG1e6SQUczdLA8GWe4X3s-tXJE/s320/hr_model.png" width="320" /></a></span></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: x-small;">Model</span></td></tr>
</tbody></table><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">You'll need to set viewCriterias on:</span></div><ul style="font-family: Arial,Helvetica,sans-serif;"><li><span style="font-size: small;">Location filtered by CountryId </span></li>
<li><span style="font-size: small;">Department filtered by LocationId</span></li>
</ul><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_DUcg4iZgXbQ7p9w4dF0_okCdiS7cfP9578mr77Z28UE_o6SWxLhuG_0isDZDr85kWNq9gscOqmNP4D1fEGl51LntMk8X7e2X2Lej_RYxNLpI-_GD0wIOb43gn22zb1a0v8U3KXHwauWO/s1600/locationsQuery.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_DUcg4iZgXbQ7p9w4dF0_okCdiS7cfP9578mr77Z28UE_o6SWxLhuG_0isDZDr85kWNq9gscOqmNP4D1fEGl51LntMk8X7e2X2Lej_RYxNLpI-_GD0wIOb43gn22zb1a0v8U3KXHwauWO/s320/locationsQuery.png" width="320" /></a></span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFqjuP-0U7_nc9vei6LqG-ICl2pLRuurLKa9Il3_OLVLF5lJNtb2I_h1okrfTbID6P3JqiqILpgfFmVn9jxX-QTOpuh-6UGVzEmx6IKjaazoVndJqFTluKcZLIEPHodp8pV51mjljYw0Cy/s1600/departmentQuery.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFqjuP-0U7_nc9vei6LqG-ICl2pLRuurLKa9Il3_OLVLF5lJNtb2I_h1okrfTbID6P3JqiqILpgfFmVn9jxX-QTOpuh-6UGVzEmx6IKjaazoVndJqFTluKcZLIEPHodp8pV51mjljYw0Cy/s320/departmentQuery.png" width="320" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Create a viewObject that will utilize these models.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq6cnI2FoWgV7_9n55dihWa93MbGtr1SGKQHx8mn5Lu4rRqcoKxBqTwiAo6Suz8TQfMKD_YPh93C_KJ0ckCO7UVV_22TVVZPWxuXBwL-m_X7BigUSESVwAFSuiJHN7IudS-oBMoOFvA3XK/s1600/viewObject.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq6cnI2FoWgV7_9n55dihWa93MbGtr1SGKQHx8mn5Lu4rRqcoKxBqTwiAo6Suz8TQfMKD_YPh93C_KJ0ckCO7UVV_22TVVZPWxuXBwL-m_X7BigUSESVwAFSuiJHN7IudS-oBMoOFvA3XK/s320/viewObject.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: x-small;">Sample viewObject</span></td></tr>
</tbody></table><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Add an lovModel for CountryId, LocationId and DepartmentId.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2yNVTzjl59-4gGxTCGU5EUbLx9WyBqIRBx-ViETG3APhCkr_d4S76I5k_sNig8Twi6OngeTtOljSQIR2TgniRwF2uAif0Tt4zCnxDzYrU4ziTIVbe2KyLFsUh5pY20X7ArM9fQRnTGmXZ/s1600/country_lov_configuraiton.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2yNVTzjl59-4gGxTCGU5EUbLx9WyBqIRBx-ViETG3APhCkr_d4S76I5k_sNig8Twi6OngeTtOljSQIR2TgniRwF2uAif0Tt4zCnxDzYrU4ziTIVbe2KyLFsUh5pY20X7ArM9fQRnTGmXZ/s320/country_lov_configuraiton.png" width="320" /></a></td></tr>
<tr style="font-family: Arial,Helvetica,sans-serif;"><td class="tr-caption" style="text-align: center;"><span style="font-size: x-small;">Country Attribute</span></td></tr>
</tbody></table><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK3vdJ5wPocbGg9nBA0frZNXfIIvCivnIHQRyb2kiGLv0uh5ncK2EbjAGxoq6plaW3zo7MRhggMjz_s6Co2Wbev6STrFDTfSkRbwlHoYd1TECxcDMIlxmepN37Y_ZtJLp0-7Gkmw2YPh8X/s1600/country_lov_hints.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK3vdJ5wPocbGg9nBA0frZNXfIIvCivnIHQRyb2kiGLv0uh5ncK2EbjAGxoq6plaW3zo7MRhggMjz_s6Co2Wbev6STrFDTfSkRbwlHoYd1TECxcDMIlxmepN37Y_ZtJLp0-7Gkmw2YPh8X/s320/country_lov_hints.png" width="320" /></a></span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVqx1GUyaxpoCDVKDR8ainCyKKfZrrSU0ZFq2lw_j-ua86hUJuvOeGSpHY6sTENzc9J0pV1Dkhyy5XhL32CLfZB9J1vceL4ROPRqJd3jhuY2_9bi9M_DZJcBx5240CIGQwtequTWJnEK4p/s1600/location_dependency.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVqx1GUyaxpoCDVKDR8ainCyKKfZrrSU0ZFq2lw_j-ua86hUJuvOeGSpHY6sTENzc9J0pV1Dkhyy5XhL32CLfZB9J1vceL4ROPRqJd3jhuY2_9bi9M_DZJcBx5240CIGQwtequTWJnEK4p/s200/location_dependency.png" width="200" /></a></td></tr>
<tr style="font-family: Arial,Helvetica,sans-serif;"><td class="tr-caption" style="text-align: center;"><span style="font-size: x-small;">Location Attribute</span></td></tr>
</tbody></table><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIjVUiwghzgymhYF-3zMJxs48QV6ScTarTg0cogX2YzR5BgcLUyzFiUYWzykf3OiiwDuBVvZ-BkzY7QK9RB_khNLVqFlnMgcnRiBZ9y1WMbVOXIDCmq0HQ7W8H2lY1KjuWckjqmMLOMrTY/s1600/location_lov_configuraiton.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIjVUiwghzgymhYF-3zMJxs48QV6ScTarTg0cogX2YzR5BgcLUyzFiUYWzykf3OiiwDuBVvZ-BkzY7QK9RB_khNLVqFlnMgcnRiBZ9y1WMbVOXIDCmq0HQ7W8H2lY1KjuWckjqmMLOMrTY/s200/location_lov_configuraiton.png" width="200" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQh7A9Wdm7u9lZdhOYUQSyzJt8MUO_64db49Tkl6w0rCpAICkT0FhcI5Dn6Y0k5zftzpMgAEPy8JdGRswYA-ipoPktNiBRlRXKTElpuXwCavO79I-ujc5yQ7v0BS5VcFIEGwplc-SRGcwA/s1600/location_lov_filter.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQh7A9Wdm7u9lZdhOYUQSyzJt8MUO_64db49Tkl6w0rCpAICkT0FhcI5Dn6Y0k5zftzpMgAEPy8JdGRswYA-ipoPktNiBRlRXKTElpuXwCavO79I-ujc5yQ7v0BS5VcFIEGwplc-SRGcwA/s200/location_lov_filter.png" width="200" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheGbLQhSUeQOAs8YRkH9IPex0FANiSxUS7lxrHX2LH6NLONuKWS1vBbo9pqtIYy47q4UQaoauR5AOmpuJME2wc-348D1Ab5oZWFz5YRmJuIhazbk7XlIrE20LRljLrbii8rxWztaQenejx/s1600/location_lov_hints.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheGbLQhSUeQOAs8YRkH9IPex0FANiSxUS7lxrHX2LH6NLONuKWS1vBbo9pqtIYy47q4UQaoauR5AOmpuJME2wc-348D1Ab5oZWFz5YRmJuIhazbk7XlIrE20LRljLrbii8rxWztaQenejx/s200/location_lov_hints.png" width="200" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXAyWCHJtMddK2sAf1yvpNt48_mZafee1af1_6LQcXvIocEPzAZQAxsi6NVE9KG7P2DI2_IN10pmNKQY2mO-EkMyuoMmVrkSreGFdFhInpkvcx29mHJ8UpmbQN4H3Iv1nhyi7rA_nzzhpa/s1600/department_dependency.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXAyWCHJtMddK2sAf1yvpNt48_mZafee1af1_6LQcXvIocEPzAZQAxsi6NVE9KG7P2DI2_IN10pmNKQY2mO-EkMyuoMmVrkSreGFdFhInpkvcx29mHJ8UpmbQN4H3Iv1nhyi7rA_nzzhpa/s200/department_dependency.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: x-small;">Department Attribute</span></td></tr>
</tbody></table><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCblhKf4tdI0ek-xxbRXobcCZNUUjhb0GktJwrTTBrBSzODZTEBn-zPUm-_1U0qzsIamz44az4tTYMuh_Mrab8RxYvfDsm6t_8k8DlgO5RFddv7OCzdjXhq2f6Nd6itvHHi1Uv9r0-64PK/s1600/department_lov_configuraiton.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCblhKf4tdI0ek-xxbRXobcCZNUUjhb0GktJwrTTBrBSzODZTEBn-zPUm-_1U0qzsIamz44az4tTYMuh_Mrab8RxYvfDsm6t_8k8DlgO5RFddv7OCzdjXhq2f6Nd6itvHHi1Uv9r0-64PK/s200/department_lov_configuraiton.png" width="200" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFY21BV9eRbTEPV1LPikmd1bUGWZVvtt77-FhSOyrLGpuLuk-eogFPs4OhG7z-Dz5CJajBp_61NHQlWIDoO9CPnm_kKrKbquBh6_HXT_RF7b-JR2Tml9qbuQ50dsT3QvKe865rKp84UC4a/s1600/department_lov_filter.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFY21BV9eRbTEPV1LPikmd1bUGWZVvtt77-FhSOyrLGpuLuk-eogFPs4OhG7z-Dz5CJajBp_61NHQlWIDoO9CPnm_kKrKbquBh6_HXT_RF7b-JR2Tml9qbuQ50dsT3QvKe865rKp84UC4a/s200/department_lov_filter.png" width="200" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-oV1UCYtWg5eQ_iHBSrUJUUG0btQb4CNAOyxF4I-3AEmmfdXfN9P-1riDHIOu4fz15NBOQn2TlFwyOx7IiI_uE6OZpC6_-Jy3ncAGXlODIBnxN1LvAtz-E7JUd2W2853faBFq9JXTu-5s/s1600/department_lov_hints.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-oV1UCYtWg5eQ_iHBSrUJUUG0btQb4CNAOyxF4I-3AEmmfdXfN9P-1riDHIOu4fz15NBOQn2TlFwyOx7IiI_uE6OZpC6_-Jy3ncAGXlODIBnxN1LvAtz-E7JUd2W2853faBFq9JXTu-5s/s200/department_lov_hints.png" width="200" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Test your ApplicationModule</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXjwvLTSBPHZsLfe_IsBQfasgqo7EJ_FjaOQbQOTHuuTb-bCMIO4EnT2WDm0dqBaxn9B8iPkcpexJw01shdiSynqyXQ23Y8Zj9l66z5H8NA_goQbFLJ7hiERgy8h4zNLbzy0PgRy0hThXZ/s1600/appmodule_test.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXjwvLTSBPHZsLfe_IsBQfasgqo7EJ_FjaOQbQOTHuuTb-bCMIO4EnT2WDm0dqBaxn9B8iPkcpexJw01shdiSynqyXQ23Y8Zj9l66z5H8NA_goQbFLJ7hiERgy8h4zNLbzy0PgRy0hThXZ/s320/appmodule_test.png" width="320" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">And everything in the UI is just a matter of drag-and-drop and setting autosubmit on the selectOneChoice and partialTrigger on those component that has dependencies.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_PWLf5PZRBwZlG_4WSpOZQlCA2eepDryf8ZznMrBEqH6lltfv6wote05bXX181gUNorROjcihcmPjMCZSwiISKeF2XIXx9KQOd1I4oS433_QS2GskIAahyphenhyphenLgJ5RcwBLoTYcrUQHGs-L2M/s1600/adf_table.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_PWLf5PZRBwZlG_4WSpOZQlCA2eepDryf8ZznMrBEqH6lltfv6wote05bXX181gUNorROjcihcmPjMCZSwiISKeF2XIXx9KQOd1I4oS433_QS2GskIAahyphenhyphenLgJ5RcwBLoTYcrUQHGs-L2M/s320/adf_table.png" width="320" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrdaBqNljZ0gkcGPeTgwmBm2IAMoAvf4fVcioiZy9T_2UY3mQs-3QxGEbFAlJR7S3iPid2cFvl2WrwmIqAGd68dqzhIdpTjb4EuPJmaiwjppkKnht-S8jZagPKx3AUdyqXfUys86rEK_5_/s1600/jspx_source.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrdaBqNljZ0gkcGPeTgwmBm2IAMoAvf4fVcioiZy9T_2UY3mQs-3QxGEbFAlJR7S3iPid2cFvl2WrwmIqAGd68dqzhIdpTjb4EuPJmaiwjppkKnht-S8jZagPKx3AUdyqXfUys86rEK_5_/s320/jspx_source.png" width="169" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSDPoEBe37ZCEIG3WhDx801ueZzdYgh-3d7jh9vvGldGtpan_CmYpSazz1mxFQcSmOC7-vNI5LVQEDuJJXzkqXdC85_oAmjJtGFezO0cfvQjU8WC95UpCHY0W8x56wV3azRBtYJ6fpSVgw/s1600/page.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSDPoEBe37ZCEIG3WhDx801ueZzdYgh-3d7jh9vvGldGtpan_CmYpSazz1mxFQcSmOC7-vNI5LVQEDuJJXzkqXdC85_oAmjJtGFezO0cfvQjU8WC95UpCHY0W8x56wV3azRBtYJ6fpSVgw/s1600/page.png" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com1tag:blogger.com,1999:blog-8016119789491424221.post-25911418014533598112011-02-02T17:00:00.000-08:002011-02-12T21:00:28.027-08:00Default your JSF Editor to Source View<div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">I hope this quick blog will help other developers out there to get the most out of their workspace.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">JDeveloper allows different view modes for your workspace such as Overview, Design and Source. For the most part, especially in the BC layer, I enjoy the declarative feature that model layer offers and of course, the source view hotkeys to auto complete my java are awesome. But I used to have a hard time working in the UI.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">By default, upon opening a jsf or jspx page, the common thing you'll get is the following.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgztgwNjaE6aB7yql6Pg3Jhu1Cyj2L8QF0PTIGynE8WfEl-lvBc61t2QMH6vaXjjR0ERcMxGy0OR1DeD4Kpci1W-ukLWcOy22iJOvzxDOBFk8k18r8g4mLW38mXA25r9Ht18yN3rtYJQuXW/s1600/loading.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgztgwNjaE6aB7yql6Pg3Jhu1Cyj2L8QF0PTIGynE8WfEl-lvBc61t2QMH6vaXjjR0ERcMxGy0OR1DeD4Kpci1W-ukLWcOy22iJOvzxDOBFk8k18r8g4mLW38mXA25r9Ht18yN3rtYJQuXW/s1600/loading.png" /></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">then you can refill your coffee and reply on the forum while you wait =) Then after all that wait, you'll just switch to source view to edit your jspx page.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">So, to help speed things a bit. You can actually setup your properties so that it always opens by default on source code view.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYX3J1uxZtyvWMbZw6hRz4L1BTPgxTJ_Xd5dIm3R5xDdp6O8WiDZwc_zCIzoSGuqtSdx0dPLPcT0gczQDM7rSBe2A_Y9mRTUnH99XyTi9Vqdcc2MAtTj_a_heQKXqXTjccTKDnV2inDW76/s1600/menu_preference.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="286" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYX3J1uxZtyvWMbZw6hRz4L1BTPgxTJ_Xd5dIm3R5xDdp6O8WiDZwc_zCIzoSGuqtSdx0dPLPcT0gczQDM7rSBe2A_Y9mRTUnH99XyTi9Vqdcc2MAtTj_a_heQKXqXTjccTKDnV2inDW76/s320/menu_preference.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><br />
<div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"></span></div><br />
<br />
<div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3TlvFCjYeGgzawIRNnfyuAuBK0ZP4GkVe_MwhfXb4DFvO6bUvA1ZPjLDjIBBHljjHZk7mz9atDASifLQU1Wr9eRJvrx2Gx1YTiAWmBekc3gqXFHyQoK_UzSTWOfp4BDAMrCWP4Z-el1ow/s1600/preference.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3TlvFCjYeGgzawIRNnfyuAuBK0ZP4GkVe_MwhfXb4DFvO6bUvA1ZPjLDjIBBHljjHZk7mz9atDASifLQU1Wr9eRJvrx2Gx1YTiAWmBekc3gqXFHyQoK_UzSTWOfp4BDAMrCWP4Z-el1ow/s320/preference.png" width="320" /></a></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Hope this helps.</span></div><br />
<div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com1tag:blogger.com,1999:blog-8016119789491424221.post-45293370564592545492011-01-30T14:04:00.000-08:002011-01-30T15:42:40.469-08:00Basic Parameter Passing in ADF<div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">As my first post, I'd like to share the most common and basic and awesome feature in ADF framework.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"></div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A colleague of mine asked me today about passing parameters that would be, of course, a common use case in any application no matter how small or big the app is. This got me thinking, that while the answer can be straightforward, there really are different ways to pass parameters in an ADF application - depending on the requirements.</span><br />
<span style="font-size: small;"><br />
</span></div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><hr /></div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span><br />
<span style="font-size: small; line-height: 115%;">Probably, the simplest way to pass parameters is by using the component <b>af:setPropertyListener</b>.</span></div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><i><b><af:setPropertyListener from="#{bindings.StringItemToSend.inputValue}" to="#{pageFlowScope.SubmittedStringValue}" type="action"/></b></i></span></div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"></span></div><div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5bzZX7SjpxwO8bOmxpUiOJLFFkgoA85sbROop0irWaJgCPYac1Rx6lIV4jz7hJFzY40emxqHzHu-_-sOucbASUqXF1DWlLbyBJIBLu53sZiksTb0knktcAI9M56fc7ykmvOVqxT1iTNQG/s1600/pfScope-unboundedTaskFlow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5bzZX7SjpxwO8bOmxpUiOJLFFkgoA85sbROop0irWaJgCPYac1Rx6lIV4jz7hJFzY40emxqHzHu-_-sOucbASUqXF1DWlLbyBJIBLu53sZiksTb0knktcAI9M56fc7ykmvOVqxT1iTNQG/s1600/pfScope-unboundedTaskFlow.png" /></a></span></div><div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3mDDu_Y-OY1ZdbEmdAxMGQyWXskItoXV2cU3w8eURNVxvG8jh8mrIchctAmqFWp9z-SjmRBIDC3zmYHtWsWd_nLLLKlI9yGUJOaYIRXXq-qmcfVWe-05jeVandIgfgUvLYEP4_rWyMQnB/s1600/pfScope-mainIndex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy0OxyKPl9DCOEXifNI3rG5toE5VyTA5V-uOdOCClGu1NTU1R37HSGlvbgJkaMv9S4ZUPX_XkMnuA4SKzmKsRHCDeH-5gIGzud0sWut67goNgqC-xtyzfXh4piaQBE7Uy_Z7OG36u0nqC8/s1600/pfScope-mainIndex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy0OxyKPl9DCOEXifNI3rG5toE5VyTA5V-uOdOCClGu1NTU1R37HSGlvbgJkaMv9S4ZUPX_XkMnuA4SKzmKsRHCDeH-5gIGzud0sWut67goNgqC-xtyzfXh4piaQBE7Uy_Z7OG36u0nqC8/s1600/pfScope-mainIndex.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxgo1vIxGEndm7hyphenhyphenjj_Yfd6Yib9Vgle2kuSldAvCLdV1JCYbVrohBUDJncHyY20uxnC0xXBKI8klZuwMoJxn6jtx9A_tLzm8v97AFqDIeNtBEu-3N4j6Py0dcpdsJFYNGDj-sX9iCClw-v/s1600/pfScope-mainIndex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3mDDu_Y-OY1ZdbEmdAxMGQyWXskItoXV2cU3w8eURNVxvG8jh8mrIchctAmqFWp9z-SjmRBIDC3zmYHtWsWd_nLLLKlI9yGUJOaYIRXXq-qmcfVWe-05jeVandIgfgUvLYEP4_rWyMQnB/s1600/pfScope-mainIndex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3mDDu_Y-OY1ZdbEmdAxMGQyWXskItoXV2cU3w8eURNVxvG8jh8mrIchctAmqFWp9z-SjmRBIDC3zmYHtWsWd_nLLLKlI9yGUJOaYIRXXq-qmcfVWe-05jeVandIgfgUvLYEP4_rWyMQnB/s1600/pfScope-mainIndex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></span></div><div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3mDDu_Y-OY1ZdbEmdAxMGQyWXskItoXV2cU3w8eURNVxvG8jh8mrIchctAmqFWp9z-SjmRBIDC3zmYHtWsWd_nLLLKlI9yGUJOaYIRXXq-qmcfVWe-05jeVandIgfgUvLYEP4_rWyMQnB/s1600/pfScope-mainIndex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG9PH9wKwKOHh6PEg6bXZNS1MP8A9sycT3-hVX8c3hm7ZXdfsomQ8zc3J9RfxfEFjIoRme0qU7maG2EEGJdLfxoJUKPnZy33hLwQ3LMIWRLAIK9qgaYYk8HqbzxJaOPpzrsXWkglbNJ1NU/s1600/pfScope-scopeReciever.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG9PH9wKwKOHh6PEg6bXZNS1MP8A9sycT3-hVX8c3hm7ZXdfsomQ8zc3J9RfxfEFjIoRme0qU7maG2EEGJdLfxoJUKPnZy33hLwQ3LMIWRLAIK9qgaYYk8HqbzxJaOPpzrsXWkglbNJ1NU/s1600/pfScope-scopeReciever.png" /></a></div><span style="font-size: small;"> </span><br />
<div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"></span><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-2LOAuHDtIT62A3pCmsfGEf5NwgWq2iDT0avxGA72xrNzq7Bt6eFiNUWz_6ucSoxpk4tjX_NK7Yn4LB8WevdV0hiTytKcqFKD7L0qzjfmPP9A53b4BOBBTnL2k5PuhIcrmWvfSrxm0aZd/s1600/pfScope-unboundedTaskFlow-mainIndex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-2LOAuHDtIT62A3pCmsfGEf5NwgWq2iDT0avxGA72xrNzq7Bt6eFiNUWz_6ucSoxpk4tjX_NK7Yn4LB8WevdV0hiTytKcqFKD7L0qzjfmPP9A53b4BOBBTnL2k5PuhIcrmWvfSrxm0aZd/s200/pfScope-unboundedTaskFlow-mainIndex.png" width="200" /></a></div><span style="font-size: small;"> </span><br />
<span style="font-size: small;"> </span><br />
<span style="font-size: small;"> </span><br />
<span style="font-size: small;"><br />
</span><br />
<span style="font-size: small; line-height: 115%;">If you notice, I am using here an unbounded taskflow, which will not give me access in setting up inputParameters. I <span style="font-size: small;">purposely made this taskflow to show that even though I am not defining my pageFlowScope parameters in the taskflow, I can still always put a new parameter in the taskFlow Map object. But of c</span>ourse, it is better to define all parameters being utilized especially in the case of parameters being passed. Taskflows also acts as a visual diagram of the activities in a process.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><hr style="font-family: Arial,Helvetica,sans-serif;" /><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Let's start making it interesting by passing the parameters into a taskFlow. In fact, let's make it even more interesting by having two taskFlow communicate using inputParameters and returnValues.</span></div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">In this example, I will be creating two bounded taskFlows and fragments which will have similar properties:</span></div><ul style="font-family: Arial,Helvetica,sans-serif;"><li><span style="font-size: small;">OutputText - Message from sender</span></li>
<ul><li><span style="font-size-adjust: none; font-size: small; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span><span style="font-size: small;">Bounded to inputParameter (pageFlowScope)</span></li>
</ul><li><span style="font-size: small;">InputText - Message to send</span></li>
<ul><li><span style="font-size: small;">Bounded to the returnValue (pageFlowScope)</span></li>
</ul><li><span style="font-size: small; line-height: 115%;">Button - Action to send and Navigate</span></li>
</ul><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Arial,Helvetica,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFYpfuMMpH0S1JgpsaWi_5fBWx26-0yPfvndu5WTTNBtkzRSnvPcZOKXR5k16VFUqE_kt9yaCdXVl6Lki-EmK1iI3rkEI1Lc8erfYVO6E-t1aWFl-2JQT2xXo4vJzEiOqiIWXmNR8HWhcv/s1600/pfScope-bounded-areaA.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFYpfuMMpH0S1JgpsaWi_5fBWx26-0yPfvndu5WTTNBtkzRSnvPcZOKXR5k16VFUqE_kt9yaCdXVl6Lki-EmK1iI3rkEI1Lc8erfYVO6E-t1aWFl-2JQT2xXo4vJzEiOqiIWXmNR8HWhcv/s1600/pfScope-bounded-areaA.png" /></a></span></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: x-small;">bounded-flow-area-a</span></td></tr>
</tbody></table><div style="font-family: Arial,Helvetica,sans-serif;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Arial,Helvetica,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><span style="font-size: small;"></span><br />
<span style="font-size: small;"></span><br />
<span style="font-size: small;"></span><br />
<span style="font-size: small;"></span><br />
<span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieWXTBDaXMIscMMPg9Fd_KHzmMLl0R6L1s7vIw9jWMGXzitXa228qJHkCoIlnSVC9Y0LOAnO2lydhecCli1eChvJL3Dj_lfLNKOPX9r8bGXln7jhVSRXnO3YwVaMTmovo0JOjpszLWf-UK/s1600/pfScope-bounded-areaB.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieWXTBDaXMIscMMPg9Fd_KHzmMLl0R6L1s7vIw9jWMGXzitXa228qJHkCoIlnSVC9Y0LOAnO2lydhecCli1eChvJL3Dj_lfLNKOPX9r8bGXln7jhVSRXnO3YwVaMTmovo0JOjpszLWf-UK/s1600/pfScope-bounded-areaB.png" /></a></span></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: x-small;">bounded-flow-area-b</span></td></tr>
</tbody></table><div style="font-family: Arial,Helvetica,sans-serif;"><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdmyqgSVntp0N-2LrOAAK96xwqIyj7QiXlXgVBXz4Ek8YARcWEj2M7G61WIUwgU8DE5-GiD8zh9YJpv0vdNGaUPg5Qy7Ib_voEyv-O4-NmrzyIZymgRTph1rhUwUjs8-lTC9CkhjYAHVX0/s1600/pfScope-bounded-areaA_overview.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="42" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdmyqgSVntp0N-2LrOAAK96xwqIyj7QiXlXgVBXz4Ek8YARcWEj2M7G61WIUwgU8DE5-GiD8zh9YJpv0vdNGaUPg5Qy7Ib_voEyv-O4-NmrzyIZymgRTph1rhUwUjs8-lTC9CkhjYAHVX0/s200/pfScope-bounded-areaA_overview.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">bounded-flow-area (Overview)</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSgZqAQmNAAOyb3Jf8qr3Szkid5rhwu-EOCDbpr6KBfUyI2hv3G41n0UYqfytN8iTsFkOphDJ7TRXiByusOj9M9e7MpoXzSXHKHt00po04dR0I0S_RB_wiPSniCjmRWvwuCd_8Uk0UK9DZ/s1600/pfScope-fragmentA_source.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="117" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSgZqAQmNAAOyb3Jf8qr3Szkid5rhwu-EOCDbpr6KBfUyI2hv3G41n0UYqfytN8iTsFkOphDJ7TRXiByusOj9M9e7MpoXzSXHKHt00po04dR0I0S_RB_wiPSniCjmRWvwuCd_8Uk0UK9DZ/s200/pfScope-fragmentA_source.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">fragmentA (source)</td></tr>
</tbody></table><br />
</div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">I also made a third bounded taskFlow which will consume both these taskFlow and also handle the passing of their values. I used a requestScope to pass the parameters between the taskFlow so that I maintain it with the smallest scope possible. </span></div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div class="MsoNormal" style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">The idea here is: </span></div><ul style="font-family: Arial,Helvetica,sans-serif;"><li><span style="font-size: small;"><span style="font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"></span>From taskFlowA I pass a value to taskFlowB</span></li>
<li><span style="font-size: small;"><span style="font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"></span>taskFlowB recieves the message and replies to taskFlowA</span></li>
<li><span style="font-size: small;"><span style="font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span>taskFlowA also recieves the message again.</span></li>
</ul><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Arial,Helvetica,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZhMBV_FQaLlSP5HAexfoR0RnufxrU1Br1G9fbl-UkoH9WgaYF7gSt80ZpI3TbmbnW6WpVbhbuuCNhEMAXBLjfIYAE8Nn_7NBIyRFH-Y8dHpkSXC_iChKtCWlX5uEgc3YbcvpTZqFn3iJZ/s1600/pfScope-bounded-mainContainer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZhMBV_FQaLlSP5HAexfoR0RnufxrU1Br1G9fbl-UkoH9WgaYF7gSt80ZpI3TbmbnW6WpVbhbuuCNhEMAXBLjfIYAE8Nn_7NBIyRFH-Y8dHpkSXC_iChKtCWlX5uEgc3YbcvpTZqFn3iJZ/s1600/pfScope-bounded-mainContainer.png" /></a></span></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: x-small;">bounded-flow-area-container</span></td></tr>
</tbody></table><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><span style="font-size: small;"></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb7kaogS6Xn5jH2F5_qo5ceBfMqB97L3Z78tWzNQgPYiMGh_n39MPFkuRPavUEzQdg6ZL66jiJjqTb_zkE1RdEr1vX0cy5IGVDaGM0-aON5ZFhO2XLi1JZFy6LSSU34bWYjljfLHPAutu1/s1600/pfScope-bounded-mainContainer_taskFlowb.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="72" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb7kaogS6Xn5jH2F5_qo5ceBfMqB97L3Z78tWzNQgPYiMGh_n39MPFkuRPavUEzQdg6ZL66jiJjqTb_zkE1RdEr1vX0cy5IGVDaGM0-aON5ZFhO2XLi1JZFy6LSSU34bWYjljfLHPAutu1/s200/pfScope-bounded-mainContainer_taskFlowb.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Properties of bounded-area-flow-b (which is exactly what A will have as well since only one of them will be sending the requestScope value during one navigation)</td></tr>
</tbody></table><div style="font-family: Arial,Helvetica,sans-serif;"><br />
<span style="font-size: small;">Result:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIo7IyxQJXFH_41rl5ypgClzpDDVz0P4CAgnQm5sfpCt6Q_LNVEDq3ZA8LDBqjuyMPYlc8zAuFuSUk3SMkk8841N1z2V1C1k_ug7-oCm3pIqTT_TVUMlYgWG3ZS19RJi2s1fC_ruBeHCZ8/s1600/pfScope-bounded-page-hello-A.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIo7IyxQJXFH_41rl5ypgClzpDDVz0P4CAgnQm5sfpCt6Q_LNVEDq3ZA8LDBqjuyMPYlc8zAuFuSUk3SMkk8841N1z2V1C1k_ug7-oCm3pIqTT_TVUMlYgWG3ZS19RJi2s1fC_ruBeHCZ8/s1600/pfScope-bounded-page-hello-A.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHsEnbj0C3N4_WI4K_JCQ-5kQvjZ7dgyl5PGXUxyKKf3_18NzfXKmSRlpoGl-iAJpwDTmocUsPSvmWZ0tvlujC6W2dP4LZtHBxarv0W4ITxxwM19mDqGZG_ZiOBTxazl6lZqzDPHgQywux/s1600/pfScope-bounded-page-hello-B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHsEnbj0C3N4_WI4K_JCQ-5kQvjZ7dgyl5PGXUxyKKf3_18NzfXKmSRlpoGl-iAJpwDTmocUsPSvmWZ0tvlujC6W2dP4LZtHBxarv0W4ITxxwM19mDqGZG_ZiOBTxazl6lZqzDPHgQywux/s1600/pfScope-bounded-page-hello-B.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYlqQA2WEQKgOgqvTKX0s4pMDhvTgTyEwI96kFX-YfjQfZcnKiTxCZPjGrup9P_BCDE-Wfe_KGeW7ctKoPc-8ZbHicmmWEJPTeJpqCQXUwBnRH4Jq-7ECvSrlIxzVFOYS2cje6yIUiCpe3/s1600/pfScope-bounded-page-hello-Final.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYlqQA2WEQKgOgqvTKX0s4pMDhvTgTyEwI96kFX-YfjQfZcnKiTxCZPjGrup9P_BCDE-Wfe_KGeW7ctKoPc-8ZbHicmmWEJPTeJpqCQXUwBnRH4Jq-7ECvSrlIxzVFOYS2cje6yIUiCpe3/s1600/pfScope-bounded-page-hello-Final.png" /></a></div></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
<span style="font-size: small;">That's it for this one.</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">On my next blog, I'll use parameter passing between more complicated taskflow use.</span><br />
<br />
</div>Marvin Reyeshttp://www.blogger.com/profile/17570797269638062581noreply@blogger.com0