S

Worst Practices for
Developing an ADF
Application
UKOUG ADF EMG Version 12.1.2.3.4.0.0b
Build WORST_PRACTICES_12.1.2.3.4.0.0b_UKOUG_2013 ADF EMG
S

About us
Paco van der Linden
AMIS
www.adfplus.com
@pavadeli

Wilfred van der Deijl
The Future Group
www.redheap.com
@wilfreddeijl
S

About us
Steven Davelaar
Oracle
ateam-oracle.com
@stevendavelaar

Wilfred van der Deijl
The Future Group
www.redheap.com
@wilfreddeijl
S

Ideal project
● 1 developer
That’s you of course!
S

Threats to a healthy ADF project
● Customer / Business / Functional designer
● Architect
● Project manager
S

Threats to a healthy ADF project
● Customer / Business / Functional designer
● Architect
● Project manager
● Other developers
● Graphic designer
S

Other Developers…
Are not a member of ADF EMG
S

Other Developers…
Do not use ADF EMG Taskflow Tester
S

ADF EMG Taskflow Tester - Wiki
S

ADF EMG Taskflow Tester
S

Other Developers…
Don’t add ADF Source code library
● How to get ADF Source
○
○
○
○
○
○

Go to support.oracle.com
Log Service Request for JDeveloper/ADF
“ADF Source Code Request” as problem type
Sign agreement and upload to SR
Get access to ZIP, typically within one day
New versions don’t need new agreement

● Allows debugging of ADF framework
S

Other Developers…
Don’t add ADF Source code library
S

Other Developers…
Don’t adhere to ADF Code Guidelines
S

ADF Code Guidelines
● 38 pages of excellent content by ADF guru’s
● Topics include:
○
○
○
○
○
○
○
○

General Code Guidelines
ADF Business Components
ADF Faces
ADF TaskFlows
ADF Binding Layer
Security
High Availability
… and more
S

Other developers
● Don’t adhere to your project specific coding
guidelines
● Other developers need your help
○ Reserve time to review each other’s version control
commits
○ You might learn from their code as well!!

● Reserve time to perform QA checks
○ Against ADF coding guidelines and project specific
guidelines
○ ...or automate this
■ come back tomorrow 10:15 - Exchange 6
“Quality Assurance with JDev Auditing Framework”
W

Threats to a healthy ADF project
● Customer / Business / Functional designer
● Architect
● Project manager
● Other developers
● Graphic designer
W
W
W
W
W
W
W

Graphic designer - Pitfalls
● Website ≠ Application
● “HTML is for semantics, CSS is for layout…”
○ ADF Fragment ≠ HTML, ADF skin ≠ CSS
○ ADF Skin
→ primarily colours,
ADF Fragment → the rest

● Bad practice: CSS for layout management
W

ADF Skinning Tips
● Use stand-alone Skin Editor
● Use ADF component selectors
○ don’t look at the generated HTML
○ use ADF Faces Skin Selectors Tag Reference

● Choice
○ UI Designer to learn ADF skinning (preferred choice)
○ ADF developer to learn CSS
W

How to Write Code
W

Logging
● Bad practice: System.err.println()
● Best practice: ADFLogger
○
○
○
○

Configure at Runtime without restart
Analyze Log for Performance
Time your own code
Better insight into ADF Framework internals
W

ADFLogger - Runtime Configuration
W

ADFLogger - Runtime Configuration
W

ADFLogger - Log Analyzer

...or open log file from other (production) server
W

Time custom code with
ADFLogger::begin and
ADFLogger::end

bit.ly/adflogger
S

Understanding ADF Layers
● Bad: code ADF applications like open source
frameworks
● What do we mean by that?
○ All application state is kept in ViewController:
○ Lots of data queried from ADF BC and stored in JSF
managed beans or entries in JSF memory scope
maps
○ State passed back to ADF BC on subsequent
requests: AM methods with lots of arguments

● Good: leverage ADF BC Active Data Model
○ Easy access to previously entered data
○ Row Currency management
S

Understanding ADF Layers
● Signs of ViewController doing ADF BC work
○ import oracle.jbo…
○ Iterating RowSets
○ Storing lots of data in memory scopes or managed
beans. Should only contain true UI state
○ Calling ApplicationModule methods with lots of
arguments even when using binding layer

● Project Audits often show 50-80% of
ViewController code is unnecessary
○ Either completely redundant
○ ...or should be moved to ADF BC layer
S

ADF Faces
a.k.a. the ViewController project
S

ADF Lifecycle - Immediate property
● Bad: I run into issues, let’s try immediate=true
● Big difference: immediate on input component
vs input on command component
● Almost always wrong in input components
● Make sure you understand both JSF lifecycle
and ADF Optimized Lifecycle
● Steven Davelaar’s 18 Lessons
○ also available as ADF Insider Video

bit.ly/jsf-lifecycle
S

Know your ADF Memory Scopes
● Bad: Overuse of SessionScope &
PageFlowScope
● Can have significant impact on mem usage
● Good: The smaller, the better
● Do not cache shorter living objects
○ Should be cheap to request each time when needed
○ Can have disastrous consequences, for example
caching binding objects
S

Extreme Disastrous Caching
S

Extreme Disastrous Caching
S

Memory Scopes Guidelines
● SessionScope
○ only use for user context
○ often (UTF) PageFlowScope is better
■ Two browser tabs share SessionScope but have
independent UTF PageFlowScope

● RequestScope
○ often BackingBeanScope is better
○ each ADF Region or Declarative Component has own
BackingBeanScope but share RequestScope

● Bad: Accessing SessionScope beans from BTF
○ BTF should be reusable and not rely on SessionScope
○ taskflow parameters are there for a reason
W

tion
olu

“My ADF application is memoryhhungry”
es
a
l) p
al

ave
th

We

igh
m

(sm
a

of t
rt
W

JSF Component Binding
JDeveloper Generated Code
<af:inputText binding=”#{pageFlowScope.MyBean.lastName}”/>
W

JSF Component Binding
● First ask yourself if it is really needed
● binding=”#{pageFlowScope.MyBean.lastName}”
references UIComponent in PageFlow bean
● UIComponents should be released after each
request
● But Managed Bean might require
PageFlowScope for its functionality
W

JSF Component Binding
ComponentReference

Enhancement Request logged
W

“My JSF Component seems to travel around”
W

Building Component Tree
binding
attribute

No

create
component

Not Null

use
component

Yes

call
getter
Null

create
component

call setter
bit.ly/compbind
W

ADF Business
Components
a.k.a. the Model project
S

ADF BC Data Model - Master Detail
Beware of excessive querying

Navigate row here...

Requery
(if
populated)
S

ADF BC Data Model - Master Detail
Prevent excessive querying
● Use top level ViewObject instances with bind
variables
● or reset detail ViewObject on master row
navigation

bit.ly/masterdetail
S

ADF BC Data Model - Master Detail
Prevent excessive querying
W

“I encountered a dramatic ADF bug!!!
Sometimes users lose entered data when the
application is under heavy load.”
W

Disable Application Module Pooling
W

Don’t Simply passivate all!
W

“ADF has huge performance problems!!!
When under heavy load requests can take
several minutes.”

“Besides, what is this PS_TXN table for? It is
eating up our tablespace.”
W

Don’t Simply Passivate All
● Every ViewRow with transient atts is
persisted
● During activation all state is applied
W

Simply passivate all?

No!

○ Every ViewRow with transient atts is
persisted
○ During activation all state is applied
S

What is passivated?
○ Set logger:
oracle.jbo.server.Serializer
○ To:
W

What is passivated?
○ Set logger:
oracle.jbo.server.Serializer
○ To:
W

“My ADF application is hacked!!!
Sometimes users see data from other
sessions.”

“By the way, I did test the application with AM
pooling off.”
W

Application Module Recycling
Not Losing, but Leaking state

● AM Instances Recycled for other users under
load
● Not detected by disabling AM pooling!
W

Detecting State Leakage
W

Default AM Pool Tuning
W

Default ViewObject Tuning
W

Eclipse Memory Analyzer Tool

bit.ly/eclipsemat
W

Eclipse Memory Analyzer Tool (MAT)
● Make heap dump of running server
JDK_HOME/bin/jmap -dump:file=path
jvm_process_id

●
●
●
●

Download and run standalone Eclipse MAT
Inspect all objects in heap
Query Heap Objects
Predefined Reports and Tools

bit.ly/eclipsemat
W

Java Mission Control

bit.ly/miscontrol
W

Java Mission Control
●
●
●
●

Any version of JRockit
Hotspot (aka Sun JVM) since 1.7.0_40
Record a period of time
Analyze
○
○
○
○
○

CPU performance
Memory Usage
Garbage Collection
Thread Concurrency
etcetera
W

Miscellaneous
W

Password management
● Bad: Credentials in clear text (eg. web.xml)
● Worse: Override with deployment plans

bit.ly/secure-adf
W

Reading Credential Store

bit.ly/secure-adf
S

Load/Stress Testing
● 5 developers on a Friday afternoon:
“Ready…. Set…. Go”
● Every ADF project initially has performance
issues
● Consider
○ JMeter - Free open source, not optimized for ADF
○ Oracle Application Testing Suite - ADF aware

● Requires
○ Production like testing environment
○ Good knowledge of chosen test tool
○ 10 days setup (assuming test tool experience)
S

Further Reading
● bit.ly/adflogger
○ ADFLogger Custom Timings

● bit.ly/secure-adf
○ FMW Credential Store

● bit.ly/eclipsemat
○ Memory Analyzer Tool

● bit.ly/miscontrol
○ Java Mission Control

● bit.ly/jsf-lifecycle
○ Steven Davelaar’s JSF Lifecycle Lessons

● bit.ly/compbind
○ JSF Component Bindings

● bit.ly/masterdetail
○ Lazy Master Detail Query
S

That’s all folks!

ADF Worst Practices (UKOUG Tech2013)

  • 1.
    S Worst Practices for Developingan ADF Application UKOUG ADF EMG Version 12.1.2.3.4.0.0b Build WORST_PRACTICES_12.1.2.3.4.0.0b_UKOUG_2013 ADF EMG
  • 2.
    S About us Paco vander Linden AMIS www.adfplus.com @pavadeli Wilfred van der Deijl The Future Group www.redheap.com @wilfreddeijl
  • 3.
    S About us Steven Davelaar Oracle ateam-oracle.com @stevendavelaar Wilfredvan der Deijl The Future Group www.redheap.com @wilfreddeijl
  • 4.
    S Ideal project ● 1developer That’s you of course!
  • 5.
    S Threats to ahealthy ADF project ● Customer / Business / Functional designer ● Architect ● Project manager
  • 6.
    S Threats to ahealthy ADF project ● Customer / Business / Functional designer ● Architect ● Project manager ● Other developers ● Graphic designer
  • 7.
    S Other Developers… Are nota member of ADF EMG
  • 8.
    S Other Developers… Do notuse ADF EMG Taskflow Tester
  • 9.
    S ADF EMG TaskflowTester - Wiki
  • 10.
  • 11.
    S Other Developers… Don’t addADF Source code library ● How to get ADF Source ○ ○ ○ ○ ○ ○ Go to support.oracle.com Log Service Request for JDeveloper/ADF “ADF Source Code Request” as problem type Sign agreement and upload to SR Get access to ZIP, typically within one day New versions don’t need new agreement ● Allows debugging of ADF framework
  • 12.
    S Other Developers… Don’t addADF Source code library
  • 13.
  • 14.
    S ADF Code Guidelines ●38 pages of excellent content by ADF guru’s ● Topics include: ○ ○ ○ ○ ○ ○ ○ ○ General Code Guidelines ADF Business Components ADF Faces ADF TaskFlows ADF Binding Layer Security High Availability … and more
  • 15.
    S Other developers ● Don’tadhere to your project specific coding guidelines ● Other developers need your help ○ Reserve time to review each other’s version control commits ○ You might learn from their code as well!! ● Reserve time to perform QA checks ○ Against ADF coding guidelines and project specific guidelines ○ ...or automate this ■ come back tomorrow 10:15 - Exchange 6 “Quality Assurance with JDev Auditing Framework”
  • 16.
    W Threats to ahealthy ADF project ● Customer / Business / Functional designer ● Architect ● Project manager ● Other developers ● Graphic designer
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
    W Graphic designer -Pitfalls ● Website ≠ Application ● “HTML is for semantics, CSS is for layout…” ○ ADF Fragment ≠ HTML, ADF skin ≠ CSS ○ ADF Skin → primarily colours, ADF Fragment → the rest ● Bad practice: CSS for layout management
  • 24.
    W ADF Skinning Tips ●Use stand-alone Skin Editor ● Use ADF component selectors ○ don’t look at the generated HTML ○ use ADF Faces Skin Selectors Tag Reference ● Choice ○ UI Designer to learn ADF skinning (preferred choice) ○ ADF developer to learn CSS
  • 25.
  • 26.
    W Logging ● Bad practice:System.err.println() ● Best practice: ADFLogger ○ ○ ○ ○ Configure at Runtime without restart Analyze Log for Performance Time your own code Better insight into ADF Framework internals
  • 27.
    W ADFLogger - RuntimeConfiguration
  • 28.
    W ADFLogger - RuntimeConfiguration
  • 29.
    W ADFLogger - LogAnalyzer ...or open log file from other (production) server
  • 30.
    W Time custom codewith ADFLogger::begin and ADFLogger::end bit.ly/adflogger
  • 31.
    S Understanding ADF Layers ●Bad: code ADF applications like open source frameworks ● What do we mean by that? ○ All application state is kept in ViewController: ○ Lots of data queried from ADF BC and stored in JSF managed beans or entries in JSF memory scope maps ○ State passed back to ADF BC on subsequent requests: AM methods with lots of arguments ● Good: leverage ADF BC Active Data Model ○ Easy access to previously entered data ○ Row Currency management
  • 32.
    S Understanding ADF Layers ●Signs of ViewController doing ADF BC work ○ import oracle.jbo… ○ Iterating RowSets ○ Storing lots of data in memory scopes or managed beans. Should only contain true UI state ○ Calling ApplicationModule methods with lots of arguments even when using binding layer ● Project Audits often show 50-80% of ViewController code is unnecessary ○ Either completely redundant ○ ...or should be moved to ADF BC layer
  • 33.
    S ADF Faces a.k.a. theViewController project
  • 34.
    S ADF Lifecycle -Immediate property ● Bad: I run into issues, let’s try immediate=true ● Big difference: immediate on input component vs input on command component ● Almost always wrong in input components ● Make sure you understand both JSF lifecycle and ADF Optimized Lifecycle ● Steven Davelaar’s 18 Lessons ○ also available as ADF Insider Video bit.ly/jsf-lifecycle
  • 35.
    S Know your ADFMemory Scopes ● Bad: Overuse of SessionScope & PageFlowScope ● Can have significant impact on mem usage ● Good: The smaller, the better ● Do not cache shorter living objects ○ Should be cheap to request each time when needed ○ Can have disastrous consequences, for example caching binding objects
  • 36.
  • 37.
  • 38.
    S Memory Scopes Guidelines ●SessionScope ○ only use for user context ○ often (UTF) PageFlowScope is better ■ Two browser tabs share SessionScope but have independent UTF PageFlowScope ● RequestScope ○ often BackingBeanScope is better ○ each ADF Region or Declarative Component has own BackingBeanScope but share RequestScope ● Bad: Accessing SessionScope beans from BTF ○ BTF should be reusable and not rely on SessionScope ○ taskflow parameters are there for a reason
  • 39.
    W tion olu “My ADF applicationis memoryhhungry” es a l) p al ave th We igh m (sm a of t rt
  • 40.
    W JSF Component Binding JDeveloperGenerated Code <af:inputText binding=”#{pageFlowScope.MyBean.lastName}”/>
  • 41.
    W JSF Component Binding ●First ask yourself if it is really needed ● binding=”#{pageFlowScope.MyBean.lastName}” references UIComponent in PageFlow bean ● UIComponents should be released after each request ● But Managed Bean might require PageFlowScope for its functionality
  • 42.
  • 43.
    W “My JSF Componentseems to travel around”
  • 44.
    W Building Component Tree binding attribute No create component NotNull use component Yes call getter Null create component call setter bit.ly/compbind
  • 45.
  • 46.
    S ADF BC DataModel - Master Detail Beware of excessive querying Navigate row here... Requery (if populated)
  • 47.
    S ADF BC DataModel - Master Detail Prevent excessive querying ● Use top level ViewObject instances with bind variables ● or reset detail ViewObject on master row navigation bit.ly/masterdetail
  • 48.
    S ADF BC DataModel - Master Detail Prevent excessive querying
  • 49.
    W “I encountered adramatic ADF bug!!! Sometimes users lose entered data when the application is under heavy load.”
  • 50.
  • 51.
  • 52.
    W “ADF has hugeperformance problems!!! When under heavy load requests can take several minutes.” “Besides, what is this PS_TXN table for? It is eating up our tablespace.”
  • 53.
    W Don’t Simply PassivateAll ● Every ViewRow with transient atts is persisted ● During activation all state is applied
  • 54.
    W Simply passivate all? No! ○Every ViewRow with transient atts is persisted ○ During activation all state is applied
  • 55.
    S What is passivated? ○Set logger: oracle.jbo.server.Serializer ○ To:
  • 56.
    W What is passivated? ○Set logger: oracle.jbo.server.Serializer ○ To:
  • 57.
    W “My ADF applicationis hacked!!! Sometimes users see data from other sessions.” “By the way, I did test the application with AM pooling off.”
  • 58.
    W Application Module Recycling NotLosing, but Leaking state ● AM Instances Recycled for other users under load ● Not detected by disabling AM pooling!
  • 59.
  • 60.
  • 61.
  • 62.
    W Eclipse Memory AnalyzerTool bit.ly/eclipsemat
  • 63.
    W Eclipse Memory AnalyzerTool (MAT) ● Make heap dump of running server JDK_HOME/bin/jmap -dump:file=path jvm_process_id ● ● ● ● Download and run standalone Eclipse MAT Inspect all objects in heap Query Heap Objects Predefined Reports and Tools bit.ly/eclipsemat
  • 64.
  • 65.
    W Java Mission Control ● ● ● ● Anyversion of JRockit Hotspot (aka Sun JVM) since 1.7.0_40 Record a period of time Analyze ○ ○ ○ ○ ○ CPU performance Memory Usage Garbage Collection Thread Concurrency etcetera
  • 66.
  • 67.
    W Password management ● Bad:Credentials in clear text (eg. web.xml) ● Worse: Override with deployment plans bit.ly/secure-adf
  • 68.
  • 69.
    S Load/Stress Testing ● 5developers on a Friday afternoon: “Ready…. Set…. Go” ● Every ADF project initially has performance issues ● Consider ○ JMeter - Free open source, not optimized for ADF ○ Oracle Application Testing Suite - ADF aware ● Requires ○ Production like testing environment ○ Good knowledge of chosen test tool ○ 10 days setup (assuming test tool experience)
  • 70.
    S Further Reading ● bit.ly/adflogger ○ADFLogger Custom Timings ● bit.ly/secure-adf ○ FMW Credential Store ● bit.ly/eclipsemat ○ Memory Analyzer Tool ● bit.ly/miscontrol ○ Java Mission Control ● bit.ly/jsf-lifecycle ○ Steven Davelaar’s JSF Lifecycle Lessons ● bit.ly/compbind ○ JSF Component Bindings ● bit.ly/masterdetail ○ Lazy Master Detail Query
  • 71.