<Insert Picture Here>
Building Highly Reusable ADF Task Flows
Steven Davelaar twitter:@stevendavelaar blogs: blogs.oracle.com/jheadstart and blogs.oracle.com/ateam_webcenter Oracle Fusion Middleware Architects Team (the A-team)
Agenda Reusability requirements - generic Addressing generic reusability requirements Reusability requirements taskflow specific Task flow reuse cases
Reusability Requirements - Generic Use with traditional menu structure Use with dynamic tabs Use with human workflow task list Use as WebCenter portlet Add at runtime using WebCenter Composer
Develop User Interface Services Not Pages!
Addressing Reusability Requirements Use bounded taskflows with page fragments
Reusable UI service with clearly defined contract
Embed as (Dynamic) ADF Region in any page. An ADF region:
Represents a task flow as part of a page Is similar to a portlet, but for local functionality Can share information and transaction boundaries with other page content
UIShell Tabbed Menu
UIShell Dynamic Tabs with Tree Menu
Using Dynamic ADF Regions Additional complexity You can no longer use standard JSF navigation
No pages to go to, only regions
XMLMenuModel cannot be used out of the box
focusRowKey maps to current page
Unioned parameter list for all regions
Parameters of each task flow in taskflow binding
Addressing the complexity Use DynamicRegionManager to provide current task flow and params Task flow details provided by TaskflowConfigBean Subclass NavigationHandlerImpl to allow your developers to use JSF-like navigation to regions Subclass XMLMenuModel to add support for regions Use parameter map for dynamic region binding Keep track of changed parameters
Refresh=ifNeeded does not work with param map
UI Shell at Runtime
UIShell.jsf Dynamic Region
<af:region value=#{bindings.mainRegion.regionModel />
UIShellPageDef
<taskFlow id="mainRegion taskFlowId="${pageFlowScope.dynamicRegionManager.currentTaskFlowId}" parametersMap="${pageFlowScope.dynamicRegionManager.currentParamMap}" RefreshCondition="{pageFlowScope.dynamicRegionManager.currentParamMapChanged} />
DynamicRegionManager
get/setCurrentTaskFlowName getCurrentTaskflowId getCurrentParamMap
TaskFlowConfigBean
name taskflowId paramMap
UIShell at Runtime Managed Beans
10
TaskFlowConfigBean - Jobs
11
Navigating Using Dynamic Regions Create custom RegionNavigationHandler
configure in faces-config.xml Provides standard JSF navigation through superclass Allows setting current dynamic region: region name specified after navigation outcome, separated by colon
12
Navigating Using Dynamic Regions Action uishell:Jobs
navigates to UIShell.jsf page (if needed) sets current task flow Jobs on mainRegionManager TaskFlowId picked up from JobsTaskFlowConfigBean Parameters picked up from JobsTaskFlowConfigBean
13
Reusability Requirements Taskflow Specific Configure to show in read-only mode Configure to show one specific row (deeplinking) Configure to go to summary or detail page Configure to start in create mode (new row) Configure to hide UI components buttons (Save, Cancel, Nav. Buttons, Search region) Configure to use both as parent or as child within another region Configure to use in popup / details lookup
14
Reuse Case 1 Adding Menu Entry to View Jobs
15
Reuse Case 1 Adding Menu Entry to View Jobs Enable jobs task flow to run in read-only mode
Add readOnly parameter to the jobs task flow Set job fields readOnly based on readOnly param hide save button based on readOnly param Set title to View Job in readOnly mode
Add menu entry ViewJobs to menu.xml Create ViewJobsTaskFlowConfig bean
Set readOnly parameter to true
16
Reuse Case 1 Adding Menu Entry to View Jobs
17
Reuse Case 2 Add Deeplinking to Edit Job
18
Reuse Case 2 Add Deeplinking to Edit Job Prepare Jobs task flow: Add rowKeyValue parameter Create method activity SetCurrentRow
DnD SetCurrentRowWithKeyValue method, or DnD custom queryByKeyValue AM method Navigate to EditJob page
Start task flow with router activity
Check value rowKeyValue parameter If not null, go to setCurrentRow method activity If null, go to SearchJobs page
19
Reuse Case 2 Add Deeplinking to Edit Job
20
Reuse Case 2 Add Deeplinking to Edit Job
21
Reuse Case 2 Add Deeplinking to Edit Job Prepare Employees task flow: Add task flow call activity CallJob to Employees TF Create Page Definition for CallJob Set rowKeyValue param to current JobId:
Reuse EditEmployee Page Def for CallJob activity How: Change usage in PageMap in Databindings.cpx, delete newly created page def
Add control flow rule from EditEmployee to CallJob Add editJob command link to EditEmployee page
22
Reuse Case 2 Add Deeplinking to Edit Job
23
Reuse Case 3 View Job Details in Popup
24
Reuse Case 3 View Job Details in Popup Two implementation strategies: Jobs TF Call with Run as Dialog option
This option cannot be used with page fragments! Need PopupShell TF with PopupShell page that embeds Jobs region Too complex ....
Add popup component, and drag and drop Jobs TF as region inside popup
25
Reuse Case 3 View Job Details in Popup (Add readOnly param to Jobs TF) Add Popup with Dialog to EditEmployee
Set childCreation=deferred to prevent premature region loading Set contentDelivery=lazyUncached
DnD Jobs TF into Dialog
Set readOnly and rowKeyValue params Set refresh=ifNeeded
Set rowKeyValue param to current JobId Add ViewJob command link to invoke Popup
Or use contextFacet on JobId
Optional: add hideToolbarButtons param
26
Reuse Case 3 View Job Details in Popup
27
Reuse Case 4 Employees TF as Child in Department Page
28
Reuse Case 4 Employees TF as Child in Department Page Restrict query employees based on department
Set up view criteria with departmentId bind var, or Use dynamic iterator to bind to EmployeesView3
Using dynamic iterator binding
Add TF parameter dataCollection Set Binds property of iterator to dataCollection param
Auto-query in Departments page
Use initialQueryOverridden property on search binding
Hide DepartmentId, Save, Cancel items when used in Departments page
Check dataCollection parameter, or add new params
29
Reuse Case 4 Employees TF as Child in Department Page
30
Reuse Case 4 Employees TF as Child in Department Page
31
Reuse Case 5 Deeplinking from External Source
32
Reuse Case 5 Deeplinking from External Source DynamicRegionManager checks request params
PostConstruct method looking for taskFlowName param Set current taskflow Map other request params to TF params ../faces/UIShell?taskFlowName=Jobs&rowKeyValue=AC_MGR
33
Data Control Scope and Transactions Data Control Scope
Shared: all TFs share same app module instance Isolated: Each TF instance has own app module instance
Transaction Scope
With isolated data control scope each TF has own transaction With shared data control scope, transaction is shared by default, but can be changed using Transaction setting
34
Data Control Scope and Transactions Data Control Scope and Transaction are defined at task flow definition level
Limits reuse options! Isolated transactions needed for dynamic tabs Shared transaction needed for child region
Enhancement request: set DC scope and transaction on TF Call activity and TF binding Work around:
Create complete TF as template (templates can be nested) Create one TF with isolated transaction based on this template Create one TF with shared transaction based on this template
35
Testing Task Flows ADF EMG Taskflow Tester
Testing of bounded task flows with pages and fragments Support for complex, composite input parameters Input parameters and run options can be saved as testcases XML Import/export facility for testcases
Its Free! Install through Help -> Check for Updates
36
Summary Use bounded task flows with page fragments Set up infrastructure to use ADF regions in UIShell Think about possible reuse cases
Define required input parameters Add router activity for reuse-case-based conditional flows Configure use of dynamic iterator binding Configure conditional display of UI components
Think carefully about data control scope and transaction settings Use the ADF EMG Task Flow Tester
37
Useful Resources Blog post: UIShell with Menu Driving a Dynamic Region
Contains links to presentation and sample application blogs.oracle.com/jheadstart/entry/core_adf11_uishell_with_menu
ADF EMG Samples
java.net/projects/smuenchadf/pages/ADFSamples
ADF EMG Task Flow Tester
java.net/projects/adf-task-flow-tester
ADF Architecture Square
Task Flow Fundamentals (http://www.oracle.com/technetwork/developertools/adf/learnmore/adf-task-flow-trans-fund-v1-1-1864319.pdf)
38
39