Building Highly Reusable Taskflows


Published on

Presentation conducted at ODTUG Kaleidoscope 2011, OOW 2011 and UKOUG 2011. Sample application can be downloaded from my blog:

Published in: Technology, Business
1 Comment
  • it's very useful
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Building Highly Reusable Taskflows

  1. 1. <Insert Picture Here> Building Highly Reusable ADF Task FlowsSteven Davelaar twitter:@stevendavelaarblogs: and Fusion Middleware Architects Team (the “A-team”)
  2. 2. Agenda• Reusability requirements - generic• Addressing generic reusability requirements• Reusability requirements – taskflow specific• Task flow reuse cases 2
  3. 3. 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 ComposerDevelop User Interface Services – Not Pages! 3
  4. 4. 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 4
  5. 5. UIShell – Tabbed Menu 5
  6. 6. UIShell – Dynamic Tabs with Tree Menu 6
  7. 7. Using Dynamic ADF Regions – Additionalcomplexity• 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 7
  8. 8. 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 8
  9. 9. 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 TaskFlowConfigBeanget/setCurrentTaskFlowName namegetCurrentTaskflowId taskflowIdgetCurrentParamMap paramMap 9
  10. 10. UIShell at Runtime – Managed Beans 10
  11. 11. TaskFlowConfigBean - Jobs 11
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. Reuse Case 1 – Adding Menu Entry to View Jobs 15
  16. 16. 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
  17. 17. Reuse Case 1 – Adding Menu Entry to View Jobs 17
  18. 18. Reuse Case 2 – Add Deeplinking to Edit Job 18
  19. 19. Reuse Case 2 – Add Deeplinking to Edit JobPrepare 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
  20. 20. Reuse Case 2 – Add Deeplinking to Edit Job 20
  21. 21. Reuse Case 2 – Add Deeplinking to Edit Job 21
  22. 22. Reuse Case 2 – Add Deeplinking to Edit JobPrepare 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
  23. 23. Reuse Case 2 – Add Deeplinking to Edit Job 23
  24. 24. Reuse Case 3 – View Job Details in Popup 24
  25. 25. Reuse Case 3 – View Job Details in PopupTwo 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
  26. 26. 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
  27. 27. Reuse Case 3 – View Job Details in Popup 27
  28. 28. Reuse Case 4 – Employees TF as Child inDepartment Page 28
  29. 29. Reuse Case 4 – Employees TF as Child inDepartment 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
  30. 30. Reuse Case 4 – Employees TF as Child inDepartment Page 30
  31. 31. Reuse Case 4 – Employees TF as Child inDepartment Page 31
  32. 32. Reuse Case 5 – Deeplinking from External Source 32
  33. 33. 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
  34. 34. Data Control Scope and Transactions• Data Control Scope – Shared: all TF’s 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
  35. 35. 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
  36. 36. 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• It’s Free! Install through Help -> Check for Updates 36
  37. 37. 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
  38. 38. Useful Resources• Blog post: UIShell with Menu Driving a Dynamic Region • Contains links to presentation and sample application •• ADF EMG Samples •• ADF EMG Task Flow Tester •• ADF Architecture Square • Task Flow Fundamentals ( tools/adf/learnmore/adf-task-flow-trans-fund-v1-1-1864319.pdf) 38
  39. 39. 39