SlideShare a Scribd company logo
1
Deep Dive into Oracle ADF Transactions
About	
  me	
  
3	
  
Eugene	
  Fedorenko	
  
	
  
Master	
  principal	
  R&D	
  architect	
  
adfprac=ce-­‐fedor.blogspot.com	
  
@ïŹsbudo	
  
	
  
	
  
	
  
	
  
	
  
The	
  BrieïŹng	
  
4	
  
ADF BC Transaction
Shared Transaction
Transaction Commit Cycle
ADF BC Save Points
ADF Model Transaction
Data Control Frame
Programmatic Approach
Q&A
Data Control Scope
Task Flow Transaction Options
Transaction Definition
5	
  
Transac=on	
  
Ă˜ïƒ˜â€Ż A logical unit-of-work with a start and end
Ă˜ïƒ˜â€Ż Must be entirely completed or aborted
Ă˜ïƒ˜â€Ż If the start state is valid, the end state is valid
Ă˜ïƒ˜â€Ż Is not affected by and does not affect any other transaction
Ă˜ïƒ˜â€Ż State management of uncommitted changes
6	
  
7	
  
ADF	
  Business	
  Components	
  
ADF	
  Faces	
  
ADF	
  Task	
  Flows	
  
ADF	
  Data	
  Controls	
  /	
  ADF	
  Bindings	
  
DB	
  
Transac=on	
  Management	
  in	
  Oracle	
  ADF	
  
Giant	
  Stride	
  Entry	
  
8	
  
The	
  BrieïŹng	
  
9	
  
ADF BC Transaction
Shared Transaction
Transaction Commit Cycle
ADF BC Save Points
ADF Model Transaction
Data Control Frame
Programmatic Approach
Q&A
Data Control Scope
Task Flow Transaction Options
Transaction Definition
Oracle	
  ADF	
  BC	
  Revisited	
  
10	
  
View	
  Object	
  
	
  
Nested	
  Applica?on	
  Module	
  
	
  
	
  
En?ty	
  Object	
  
	
  
DB	
  Transac=on	
  Object	
  
11	
  
JDBC	
  Connec?on	
  
DB	
  
View	
  Object	
  
	
  
Nested	
  Applica?on	
  Module	
  
	
  
	
  
En?ty	
  Object	
  
	
  
	
  
	
  
Shared	
  Transac=on	
  
12	
  
JDBC	
  Connec?on	
  
DB	
  
View	
  Object	
  
	
  
En?ty	
  Object	
  
	
  
	
  
	
  
View	
  Object	
   View	
  Object	
  
Ă˜ïƒ˜â€Ż Based on jbo.shared.txn property
Ă˜ïƒ˜â€Ż Designed for shared Application Modules
Ă˜ïƒ˜â€Ż Used for not-shared root AMs to reduce number of DB
connections	
  
Shared	
  Transac=on	
  
13	
  
The	
  BrieïŹng	
  
14	
  
ADF BC Transaction
Shared Transaction
Transaction Commit Cycle
ADF BC Save Points
ADF Model Transaction
Data Control Frame
Programmatic Approach
Q&A
Data Control Scope
Task Flow Transaction Options
Transaction Definition
Ă˜ïƒ˜â€Ż Validation Listener List
Ă˜ïƒ˜â€Ż Entities for validation
Ă˜ïƒ˜â€Ż Transaction Post Listener List
Ă˜ïƒ˜â€Ż Dirty entities
Ă˜ïƒ˜â€Ż Transaction Listener List
Ă˜ïƒ˜â€Ż AMs and entities listening to commit phase
	
  
DB	
  Transac=on	
  Listeners	
  
15	
  
16	
  
	
  
DB	
  Transac?on	
  
	
  
Commit	
  Cycle	
  
	
  
AM	
  
	
  
	
  
En?ty	
  
	
  Commit	
  
beforeValidate	
  
validate	
  
aFerValidate	
  
postChanges	
  
lock	
  
prepareForDML	
  
doDML	
  
beforeCommit	
  
doCommit	
  
beforeCommit	
  
aFerCommit	
  
aFerCommit	
  
Ă˜ïƒ˜â€Ż Validation
Ă˜ïƒ˜â€Ż Raises validation exception
Ă˜ïƒ˜â€Ż Post Changes
Ă˜ïƒ˜â€Ż Rollbacks DB to savepoint
Ă˜ïƒ˜â€Ż Restores state of posted entities
Ă˜ïƒ˜â€Ż Raises an exception
Ă˜ïƒ˜â€Ż Before Commit or Commit
Ă˜ïƒ˜â€Ż Rollbacks DB to savepoint
Ă˜ïƒ˜â€Ż Raises an exception
Ă˜ïƒ˜â€Ż Does not restore state of posted entities by default
	
  
Failure	
  at	
  Commit	
  Cycle	
  
17	
  
Ă˜ïƒ˜â€Ż Validation logic in beforeCommit method
Ă˜ïƒ˜â€Ż Deferrable constraints
Ă˜ïƒ˜â€Ż jbo.txn.handleafterpostexc = true
Ă˜ïƒ˜â€Ż Forces in memory passivation snapshot
Ă˜ïƒ˜â€Ż Activation of all AMs with all VO instances
Error	
  at	
  Commit	
  phase	
  
18	
  
	
  public	
  void	
  beforeCommit(Transac?onEvent	
  e)	
  {	
  
	
  	
  	
  	
  if	
  (	
  !isDataValid()	
  )	
  
	
  	
  	
  	
  	
  	
  	
  throw	
  new	
  Valida?onExcep?on(VALIDATION_EXCEPTION);	
  
	
  	
  }	
  
CONSTRAINT	
  "CK_DIVEBOAT_WIDTH"	
  CHECK	
  (WIDTH<5)	
  
DEFERRABLE	
  INITIALLY	
  DEFERRED	
  
The	
  BrieïŹng	
  
19	
  
ADF BC Transaction
Shared Transaction
Transaction Commit Cycle
ADF BC Save Points
ADF Model Transaction
Data Control Frame
Programmatic Approach
Q&A
Data Control Scope
Task Flow Transaction Options
Transaction Definition
Ă˜ïƒ˜â€Ż Invoke a PL/SQL procedure
Ă˜ïƒ˜â€Ż Modify entity attributes
Ă˜ïƒ˜â€Ż Invoke another PL/SQL procedure
Ă˜ïƒ˜â€Ż Commit the transaction
	
  
	
  public	
  class	
  AppModuleImpl	
  extends	
  Applica?onModuleImpl	
  {	
  
	
  
	
  	
  public	
  void	
  someBusinessServiceMethod()	
  {	
  	
  	
  
	
  	
  	
  	
  	
  	
  invokePLSQLProcedure1();	
  	
  	
  
	
  	
  	
  	
  	
  	
  modifySomeA^ributes();	
  	
  	
  
	
  	
  	
  	
  	
  	
  invokePLSQLProcedure2();	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  getDBTransac?on().commit();	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  }	
  	
  
Business	
  Service	
  Method	
  
20	
  
Ă˜ïƒ˜â€Ż passivateStateForUndo
Ă˜ïƒ˜â€Ż Makes a snapshot with AM’s state
Ă˜ïƒ˜â€Ż activateStateForUndo
Ă˜ïƒ˜â€Ż Restores AM’s state from snapshot
Ă˜ïƒ˜â€Ż Rollbacks the transaction
	
  public	
  class	
  AppModuleImpl	
  extends	
  Applica?onModuleImpl	
  {	
  
	
  
	
  	
  private	
  String	
  passivateStateForUndo()	
  {	
  	
  	
  
	
  	
  	
  	
  	
  	
  String	
  savePoint	
  =	
  super.passivateStateForUndo(null,	
  null,	
  PASSIVATE_UNDO_FLAG);	
  	
  	
  
	
  	
  	
  	
  	
  	
  return	
  savePoint;	
  	
  	
  
	
  	
  	
  }	
  	
  
	
  
	
  	
  private	
  void	
  ac?vateStateForUndo(String	
  savePointId)	
  {	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  super.ac?vateStateForUndo(savePointId,	
  	
  ACTIVATE_UNDO_FLAG);	
  	
  	
  	
  	
  	
  
	
  	
  	
  }	
  	
  	
  
	
  
Managing	
  Savepoints	
  with	
  ADF	
  BC	
  
21	
  
 
	
  public	
  class	
  AppModuleImpl	
  extends	
  Applica?onModuleImpl	
  {	
  
	
  
	
  public	
  void	
  someBusinessServiceMethod()	
  {	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  String	
  spid	
  =	
  passivateStateForUndo();	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  try	
  {	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  invokePLSQLProcedure1();	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  modifySomeA^ributes();	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  invokePLSQLProcedure2();	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  getDBTransac?on().commit();	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  catch	
  (Run?meExcep?on	
  e)	
  {	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ac=vateStateForUndo(spid);	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  throw	
  new	
  JboExcep?on(e);	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  	
  	
  
	
  	
  	
  	
  }	
  	
  	
  
Managing	
  Savepoints	
  with	
  ADF	
  BC	
  
22	
  
The	
  BrieïŹng	
  
23	
  
ADF BC Transaction
Shared Transaction
Transaction Commit Cycle
ADF BC Save Points
ADF Model Transaction
Data Control Frame
Programmatic Approach
Q&A
Data Control Scope
Task Flow Transaction Options
Transaction Definition
Oracle	
  ADF	
  Model	
  
24	
  
ADF	
  Faces	
  
ADF	
  Bindings	
  
DB	
  
ADF	
  Data	
  Controls	
  
ADF	
  Task	
  Flows	
  
ADF	
  Business	
  Components	
  
Ă˜ïƒ˜â€Ż ADF BC
Ă˜ïƒ˜â€Ż EJB
Ă˜ïƒ˜â€Ż Bean
Ă˜ïƒ˜â€Ż WebService (SOAP/REST)
Ă˜ïƒ˜â€Ż URL
Ă˜ïƒ˜â€Ż JMX
Ă˜ïƒ˜â€Ż BAM
Ă˜ïƒ˜â€Ż Placeholder
Ă˜ïƒ˜â€Ż Custom Data Controls
	
  
	
  
	
  
ADF	
  Data	
  Controls	
  
25	
  
Mul=ple	
  Data	
  Controls	
  
26	
  
REST	
  API	
  
DB	
  
ADF	
  BC	
  
Global	
  Divers	
  
Accommoda?on
Data	
  Control	
  Frame	
  
27	
  
REST	
  API	
  
DB	
  
ADF	
  BC	
  
Data	
  Control	
  Frame	
  
Global	
  Divers	
  
Accommoda?on
BC	
  Data	
  Control	
  
REST	
  Data	
  Control	
  
Transac=on	
  
Oracle	
  ADF	
  Controller	
  
28	
  
ADF	
  Faces	
  
	
  
ADF	
  Bindings	
  
	
  
DB	
  
ADF	
  Data	
  Controls	
  
ADF	
  Task	
  Flows	
  
ADF	
  Business	
  Components	
  
 
	
  
	
  
Task	
  Flow	
  
29	
  
 
	
  
	
  
Task	
  Flow	
  Transac=on	
  Op=ons	
  
30	
  
Ă˜ïƒ˜â€Ż Shared Data Control Frame
Ă˜ïƒ˜â€Ż Data Control Instance (same type & name)
Ă˜ïƒ˜â€ŻAM instance
Ă˜ïƒ˜â€ŻVO instances
Ă˜ïƒ˜â€Ż Transaction Handler
Ă˜ïƒ˜â€ŻDB Transaction Object
Ă˜ïƒ˜â€ŻDB Connection
Ă˜ïƒ˜â€ŻEntity Cache
Ă˜ïƒ˜â€Ż Default Option for BTF
	
  
	
  
Shared	
  Data	
  Control	
  Scope	
  
31	
  
Ă˜ïƒ˜â€Ż Isolated Data Control Frame
Ă˜ïƒ˜â€Ż Data Control Instance (same type & name)
Ă˜ïƒ˜â€ŻAM instance
Ă˜ïƒ˜â€ŻVO instances
Ă˜ïƒ˜â€Ż Transaction Handler
Ă˜ïƒ˜â€ŻDB Transaction Object
Ă˜ïƒ˜â€ŻDB Connection
Ă˜ïƒ˜â€ŻEntity Cache
Ă˜ïƒ˜â€Ż Always for UTF
	
  
	
  
Isolated	
  Data	
  Control	
  Scope	
  
32	
  
The	
  BrieïŹng	
  
33	
  
ADF BC Transaction
Shared Transaction
Transaction Commit Cycle
ADF BC Save Points
ADF Model Transaction
Data Control Frame
Programmatic Approach
Q&A
Data Control Scope
Task Flow Transaction Options
Transaction Definition
Data	
  Control	
  Frame	
  #1	
  
Data	
  Control	
  Frames	
  
34	
  
Main.jspx	
  
UTF	
  
Menu	
  
BTF	
  
Data	
  Control	
  Frame	
  #2	
  
Divers	
  
BTF	
  
Log	
  Book	
  
Record	
  
BTF	
  
Data	
  Control	
  Frame	
  #3	
  
Dive	
  Sites	
  
BTF	
  
 
Task	
  Flow	
  Transac=on	
  Op=ons	
  
35	
  
	
  	
  	
  	
  	
  <transac?on>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <new-­‐transac?on/>	
  
	
  	
  	
  	
  	
  </transac?on>	
  	
  
	
  
Ă˜ïƒ˜â€Ż Starts a new transaction on Data Control Frame
Ă˜ïƒ˜â€Ż Supports Both Data Control Scopes
Ă˜ïƒ˜â€Ż Isolated
Ă˜ïƒ˜â€Ż Shared
Ă˜ïƒ˜â€ŻCalled from UTF
Ă˜ïƒ˜â€ŻThe caller has ”No Controller Transaction”
Ă˜ïƒ˜â€Ż Must Finish the Transaction
	
  
	
  
Always	
  Begin	
  New	
  Transac=on	
  (new-­‐transac=on)	
  
36	
  
Ă˜ïƒ˜â€Ż Only Transaction starter can finish it
Ă˜ïƒ˜â€Ż Always Begin New Transaction
Ă˜ïƒ˜â€Ż Use Existing Transaction if Possible (no caller’s transaction)
	
  
	
  
Commit	
  and	
  Rollback	
  on	
  Return	
  
37	
  
38	
  
	
  
Data	
  Control	
  Frame	
  
	
  
Task	
  Flow	
  Commit	
  
	
  
Transac?on	
  
	
  
	
  
Data	
  Control	
  
	
  Commit	
  
commit	
  
commitTransac?on	
  
commit	
  
	
  
DB	
  Transac?on	
  
	
  
For	
  each	
  data	
  control	
  
Ă˜ïƒ˜â€Ż Prematurely Terminated Task Flow
Ă˜ïƒ˜â€Ż Finished not via return activities
Ă˜ïƒ˜â€Ż Task Flow’s container is not rendered anymore
Ă˜ïƒ˜â€Ż Has been refreshed by the parent
Ă˜ïƒ˜â€Ż Task Flow owns the transaction
Ă˜ïƒ˜â€Ż Auto-rollback behavior
	
  
	
  
Prematurely	
  Terminated	
  Transac=on	
  
39	
  
The	
  BrieïŹng	
  
40	
  
ADF BC Transaction
Shared Transaction
Transaction Commit Cycle
ADF BC Save Points
ADF Model Transaction
Data Control Frame
Programmatic Approach
Q&A
Data Control Scope
Task Flow Transaction Options
Transaction Definition
Ă˜ïƒ˜â€Ż Joins an existing transaction
Ă˜ïƒ˜â€Ż Supports Only Shared Data Control Scope
Ă˜ïƒ˜â€Ż Isolated is disabled
Ă˜ïƒ˜â€Ż Can not Finish the Transaction
	
  
	
  
Always	
  Use	
  Exis=ng	
  Transac=on	
  (requires-­‐exis=ng-­‐transac=on)	
  
41	
  
Ă˜ïƒ˜â€Ż Created by default when shared transaction is reused
Ă˜ïƒ˜â€Ż Used to restore model state on task flow exit
Ă˜ïƒ˜â€Ż ”No Save Point on Task Flow Entry” to prevent creation
	
  
	
  
Task	
  Flow	
  Save	
  Points	
  
42	
  
Ă˜ïƒ˜â€Ż Root AM requires a dedicated DB connection
Ă˜ïƒ˜â€Ż Parent and Child Task Flows should share Transaction
Ă˜ïƒ˜â€Ż Too many DB connections for multi-root-AMs application
	
  
	
  
Root	
  AM	
  Connec=on	
  Challenge	
  
43	
  
Divers	
  VO	
   Log	
  Book	
  VO	
  
Divers Root AM Log Book Root AM
Log Book Record BTFDivers BTF
Ă˜ïƒ˜â€Ż Root AMs refer to the same data source
Ă˜ïƒ˜â€Ż Task Flows use Transaction Options
Ă˜ïƒ˜â€Ż Any but <No Controller Transaction>
Ă˜ïƒ˜â€Ż Value for jbo.shared.txn is generated
Ă˜ïƒ˜â€Ż Transaction is shared
	
  
	
  
Root	
  AM	
  Connec=on	
  Sharing	
  
44	
  
JDBC	
  Connec?on	
  
Divers	
  VO	
  
	
  
	
  
Log	
  Book	
  VO	
  
Divers Root AM Log Book Root AM
The	
  BrieïŹng	
  
45	
  
ADF BC Transaction
Shared Transaction
Transaction Commit Cycle
ADF BC Save Points
ADF Model Transaction
Data Control Frame
Programmatic Approach
Q&A
Data Control Scope
Task Flow Transaction Options
Transaction Definition
Ă˜ïƒ˜â€Ż Dynamic transaction option
Ă˜ïƒ˜â€Ż Isolated Data Control Scope
Ă˜ïƒ˜â€Ż Always Begin New Transaction
Ă˜ïƒ˜â€Ż Shared Data Control Scope
Ă˜ïƒ˜â€ŻThere is open transaction
Ă˜ïƒ˜â€Ż Always Use Existing Transaction
Ă˜ïƒ˜â€ŻThere is No open transaction
Ă˜ïƒ˜â€Ż Always Begin New Transaction
	
  
	
  
Use	
  Exis=ng	
  Transac=on	
  if	
  Possible	
  (requires-­‐transac=on)	
  
46	
  
Ă˜ïƒ˜â€Ż Switches Off controller transaction management
Ă˜ïƒ˜â€Ż Does not start a transaction on task flow entry
Ă˜ïƒ˜â€Ż Does not create a save point on task flow entry
Ă˜ïƒ˜â€Ż Does not restore to save point
Ă˜ïƒ˜â€Ż Does not rollback or commit transaction
	
  
	
  
No	
  Controller	
  Transac=on	
  
47	
  
Ă˜ïƒ˜â€Ż Get current binding context
Ă˜ïƒ˜â€Ż Get current Data Control Frame
Ă˜ïƒ˜â€Ż Start a new transaction on the frame
	
  
	
  public	
  void	
  startTransac?on()	
  {	
  
	
  	
  	
  	
  BindingContext	
  context	
  =	
  BindingContext.getCurrent();	
  
	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  //Get	
  the	
  name	
  of	
  Data	
  Control	
  Frame	
  
	
  	
  	
  	
  String	
  dcFrameName	
  =	
  context.getCurrentDataControlFrame();	
  
	
  	
  	
  	
  	
  //Get	
  Data	
  Control	
  Frame	
  
	
  	
  	
  	
  DataControlFrame	
  dcFrame	
  =	
  context.ïŹndDataControlFrame(dcFrameName);	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  //Start	
  Transac?on	
  
	
  	
  	
  	
  dcFrame.beginTransac?on(new	
  Transac?onProper?es());	
  
	
  	
  }	
  
	
  
	
  
	
  
Start	
  a	
  Transac=on	
  
48	
  
Ă˜ïƒ˜â€Ż Get current binding context
Ă˜ïƒ˜â€Ż Get current Data Control Frame
Ă˜ïƒ˜â€Ż Commit or Rollback transaction
	
  
	
  public	
  void	
 Â ïŹnishTransac?on()	
  {	
  
	
  	
  	
  	
  BindingContext	
  context	
  =	
  BindingContext.getCurrent();	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  //Get	
  the	
  name	
  of	
  Data	
  Control	
  Frame	
  
	
  	
  	
  	
  String	
  dcFrameName	
  =	
  context.getCurrentDataControlFrame();	
  
	
  	
  	
  	
  	
  //Get	
  Data	
  Control	
  Frame	
  
	
  	
  	
  	
  DataControlFrame	
  dcFrame	
  =	
  context.ïŹndDataControlFrame(dcFrameName);	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  //Finish	
  Transac?on	
  
	
  	
  	
  	
  	
  if	
  (doRollback)	
  dcFrame.rollback();	
  
	
  	
  	
  	
  	
  	
  	
  else	
  dcFrame.commit();	
  	
  	
  
	
  
}	
  
	
  
Finish	
  a	
  Transac=on	
  
49	
  
Ă˜ïƒ˜â€Ż Create Save Point
Ă˜ïƒ˜â€Ż Save Save Point handle in pageFlowScope bean
Ă˜ïƒ˜â€Ż Restore Save Point
	
  
	
  private	
  SavepointHandle	
  savepointHandle;	
  
	
  	
  	
  
	
  	
  public	
  void	
  createSavePoint()	
  {	
  
	
  	
  	
  	
  DataControlFrame	
  dcFrame	
  =	
  getCurrentDataControlFrame();	
  
	
  	
  	
  	
  savepointHandle	
  =	
  dcFrame.createSavepoint();	
  	
  
	
  	
  }	
  
	
  
	
  	
  public	
  void	
  restoreSavePoint()	
  {	
  
	
  	
  	
  	
  DataControlFrame	
  dcFrame	
  =	
  getCurrentDataControlFrame();	
  
	
  	
  	
  	
  dcFrame.restoreSavepoint(savepointHandle);	
  
	
  	
  }	
  
Create	
  Savepoint	
  &	
  Restore	
  to	
  Savepoint	
  
50	
  
 
	
  
	
  
CRUD	
  Task	
  Flow	
  
51	
  
Safety	
  Stop.	
  Ques=ons	
  &	
  Answers	
  
52	
  
ADF BC Transaction
Shared Transaction
Transaction Commit Cycle
ADF BC Save Points
ADF Model Transaction
Data Control Frame
Programmatic Approach
Q&A
Data Control Scope
Task Flow Transaction Options
Transaction Definition
53
Join Your Community!
Tonight from 8:00 – 10:00 in Sheraton I
ADF Monday Night Foosball
What is more fun than foosball and beer at your best
friend’s house? Well, how about a foosball tournament
with a whole bunch of friends at Kscope16? Join your
fellow ADF enthusiasts for some great networking and
friendly competition.
54

More Related Content

PPT
Domain Driven Design (DDD)
PDF
Architecture for Flow w/ Wardley Mapping, Domain-Driven Design, and Team Topo...
PDF
KubeCon EU 2022: From Kubernetes to PaaS to Err What's Next
PPSX
Microservices Testing Strategies JUnit Cucumber Mockito Pact
PDF
Crossplane @ Mastering GitOps.pdf
PPTX
DevOps with Kubernetes
PDF
Understanding Sling Models in AEM
PDF
Cloud Native Application
Domain Driven Design (DDD)
Architecture for Flow w/ Wardley Mapping, Domain-Driven Design, and Team Topo...
KubeCon EU 2022: From Kubernetes to PaaS to Err What's Next
Microservices Testing Strategies JUnit Cucumber Mockito Pact
Crossplane @ Mastering GitOps.pdf
DevOps with Kubernetes
Understanding Sling Models in AEM
Cloud Native Application

What's hot (20)

PPTX
DevOps - The Key to Rapid Productization (Introduction to the 5C's of DevOps)
PDF
Tweaking the interactive grid
PDF
SpringBoot 3 Observability
PDF
DevSecOps Fundamentals and the Scars to Prove it.
PPTX
ABN AMRO DevSecOps Journey
PDF
Service discovery with Eureka and Spring Cloud
PDF
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
PPTX
Deployment model Blue Green deployment
PDF
Spring Cloud: Why? How? What?
PDF
Top 50 Agile Interview Questions and Answers.pdf
PPTX
Micro-frontend
PDF
Micro frontends
PDF
Kubernetes 101
PDF
Preparing for a future Microservices journey using DDD & Wardley Maps
PDF
EKS Workshop
PDF
Running Kafka On Kubernetes With Strimzi For Real-Time Streaming Applications
PPTX
MLops on Vertex AI Presentation (AI/ML).pptx
PPTX
MVVM ( Model View ViewModel )
PPTX
Angular
PDF
Ms Azure fundamentals
DevOps - The Key to Rapid Productization (Introduction to the 5C's of DevOps)
Tweaking the interactive grid
SpringBoot 3 Observability
DevSecOps Fundamentals and the Scars to Prove it.
ABN AMRO DevSecOps Journey
Service discovery with Eureka and Spring Cloud
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
Deployment model Blue Green deployment
Spring Cloud: Why? How? What?
Top 50 Agile Interview Questions and Answers.pdf
Micro-frontend
Micro frontends
Kubernetes 101
Preparing for a future Microservices journey using DDD & Wardley Maps
EKS Workshop
Running Kafka On Kubernetes With Strimzi For Real-Time Streaming Applications
MLops on Vertex AI Presentation (AI/ML).pptx
MVVM ( Model View ViewModel )
Angular
Ms Azure fundamentals
Ad

Similar to Deep Dive into Oracle ADF Transactions (20)

PDF
Oracle ADF Architecture TV - Design - Task Flow Data Control Scope Options
PDF
Oracle ADF Architecture TV - Design - Task Flow Transaction Options
DOCX
Best Weblogic Server Online Training
PDF
Oracle ADF Tutorial/Training Study Guide
PPTX
Oracle ADF Training| Oracle ADF Developer Training
DOCX
Oracle adf online training
PPTX
Oracel ADF Introduction
DOC
Best Oracle adf online training
PDF
ADF Worst Practices (UKOUG Tech2013)
PDF
Oracle fusion adf_online_training_in_africa
PDF
Oracle ADF Architecture TV - Development - Programming Best Practices
PDF
Oracle ADF Quick Handy Reference
PPTX
Oracle fusion dba online training
PDF
Programming-best practices( beginner) ADF_fusionapps
PPT
JSF (ADF) Case Studies Presentation
PDF
Oracle ADF Architecture TV - Design - Task Flow Communication Pattern
DOCX
Oracle ADF Online Training By Seasoft IT Solutions | Orace ADF Course Content...
PPT
oracle adf training | oracle adf course | oracle adf certification training
PPTX
Oracle adf
Oracle ADF Architecture TV - Design - Task Flow Data Control Scope Options
Oracle ADF Architecture TV - Design - Task Flow Transaction Options
Best Weblogic Server Online Training
Oracle ADF Tutorial/Training Study Guide
Oracle ADF Training| Oracle ADF Developer Training
Oracle adf online training
Oracel ADF Introduction
Best Oracle adf online training
ADF Worst Practices (UKOUG Tech2013)
Oracle fusion adf_online_training_in_africa
Oracle ADF Architecture TV - Development - Programming Best Practices
Oracle ADF Quick Handy Reference
Oracle fusion dba online training
Programming-best practices( beginner) ADF_fusionapps
JSF (ADF) Case Studies Presentation
Oracle ADF Architecture TV - Design - Task Flow Communication Pattern
Oracle ADF Online Training By Seasoft IT Solutions | Orace ADF Course Content...
oracle adf training | oracle adf course | oracle adf certification training
Oracle adf
Ad

Recently uploaded (20)

PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
 
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PPTX
Transform Your Business with a Software ERP System
PPTX
history of c programming in notes for students .pptx
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PPTX
L1 - Introduction to python Backend.pptx
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
System and Network Administraation Chapter 3
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
Digital Strategies for Manufacturing Companies
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
medical staffing services at VALiNTRY
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
 
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Navsoft: AI-Powered Business Solutions & Custom Software Development
ManageIQ - Sprint 268 Review - Slide Deck
Transform Your Business with a Software ERP System
history of c programming in notes for students .pptx
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
L1 - Introduction to python Backend.pptx
How Creative Agencies Leverage Project Management Software.pdf
Design an Analysis of Algorithms II-SECS-1021-03
Upgrade and Innovation Strategies for SAP ERP Customers
System and Network Administraation Chapter 3
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Softaken Excel to vCard Converter Software.pdf
Digital Strategies for Manufacturing Companies
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
Which alternative to Crystal Reports is best for small or large businesses.pdf
medical staffing services at VALiNTRY
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf

Deep Dive into Oracle ADF Transactions

  • 1. 1
  • 3. About  me   3   Eugene  Fedorenko     Master  principal  R&D  architect   adfprac=ce-­‐fedor.blogspot.com   @ïŹsbudo            
  • 4. The  BrieïŹng   4   ADF BC Transaction Shared Transaction Transaction Commit Cycle ADF BC Save Points ADF Model Transaction Data Control Frame Programmatic Approach Q&A Data Control Scope Task Flow Transaction Options Transaction Definition
  • 6. Transac=on   Ă˜ïƒ˜â€Ż A logical unit-of-work with a start and end Ă˜ïƒ˜â€Ż Must be entirely completed or aborted Ă˜ïƒ˜â€Ż If the start state is valid, the end state is valid Ă˜ïƒ˜â€Ż Is not affected by and does not affect any other transaction Ă˜ïƒ˜â€Ż State management of uncommitted changes 6  
  • 7. 7   ADF  Business  Components   ADF  Faces   ADF  Task  Flows   ADF  Data  Controls  /  ADF  Bindings   DB   Transac=on  Management  in  Oracle  ADF  
  • 9. The  BrieïŹng   9   ADF BC Transaction Shared Transaction Transaction Commit Cycle ADF BC Save Points ADF Model Transaction Data Control Frame Programmatic Approach Q&A Data Control Scope Task Flow Transaction Options Transaction Definition
  • 10. Oracle  ADF  BC  Revisited   10   View  Object     Nested  Applica?on  Module       En?ty  Object    
  • 11. DB  Transac=on  Object   11   JDBC  Connec?on   DB   View  Object     Nested  Applica?on  Module       En?ty  Object        
  • 12. Shared  Transac=on   12   JDBC  Connec?on   DB   View  Object     En?ty  Object         View  Object   View  Object  
  • 13. Ă˜ïƒ˜â€Ż Based on jbo.shared.txn property Ă˜ïƒ˜â€Ż Designed for shared Application Modules Ă˜ïƒ˜â€Ż Used for not-shared root AMs to reduce number of DB connections   Shared  Transac=on   13  
  • 14. The  BrieïŹng   14   ADF BC Transaction Shared Transaction Transaction Commit Cycle ADF BC Save Points ADF Model Transaction Data Control Frame Programmatic Approach Q&A Data Control Scope Task Flow Transaction Options Transaction Definition
  • 15. Ă˜ïƒ˜â€Ż Validation Listener List Ă˜ïƒ˜â€Ż Entities for validation Ă˜ïƒ˜â€Ż Transaction Post Listener List Ă˜ïƒ˜â€Ż Dirty entities Ă˜ïƒ˜â€Ż Transaction Listener List Ă˜ïƒ˜â€Ż AMs and entities listening to commit phase   DB  Transac=on  Listeners   15  
  • 16. 16     DB  Transac?on     Commit  Cycle     AM       En?ty    Commit   beforeValidate   validate   aFerValidate   postChanges   lock   prepareForDML   doDML   beforeCommit   doCommit   beforeCommit   aFerCommit   aFerCommit  
  • 17. Ă˜ïƒ˜â€Ż Validation Ă˜ïƒ˜â€Ż Raises validation exception Ă˜ïƒ˜â€Ż Post Changes Ă˜ïƒ˜â€Ż Rollbacks DB to savepoint Ă˜ïƒ˜â€Ż Restores state of posted entities Ă˜ïƒ˜â€Ż Raises an exception Ă˜ïƒ˜â€Ż Before Commit or Commit Ă˜ïƒ˜â€Ż Rollbacks DB to savepoint Ă˜ïƒ˜â€Ż Raises an exception Ă˜ïƒ˜â€Ż Does not restore state of posted entities by default   Failure  at  Commit  Cycle   17  
  • 18. Ă˜ïƒ˜â€Ż Validation logic in beforeCommit method Ă˜ïƒ˜â€Ż Deferrable constraints Ă˜ïƒ˜â€Ż jbo.txn.handleafterpostexc = true Ă˜ïƒ˜â€Ż Forces in memory passivation snapshot Ă˜ïƒ˜â€Ż Activation of all AMs with all VO instances Error  at  Commit  phase   18    public  void  beforeCommit(Transac?onEvent  e)  {          if  (  !isDataValid()  )                throw  new  Valida?onExcep?on(VALIDATION_EXCEPTION);      }   CONSTRAINT  "CK_DIVEBOAT_WIDTH"  CHECK  (WIDTH<5)   DEFERRABLE  INITIALLY  DEFERRED  
  • 19. The  BrieïŹng   19   ADF BC Transaction Shared Transaction Transaction Commit Cycle ADF BC Save Points ADF Model Transaction Data Control Frame Programmatic Approach Q&A Data Control Scope Task Flow Transaction Options Transaction Definition
  • 20. Ă˜ïƒ˜â€Ż Invoke a PL/SQL procedure Ă˜ïƒ˜â€Ż Modify entity attributes Ă˜ïƒ˜â€Ż Invoke another PL/SQL procedure Ă˜ïƒ˜â€Ż Commit the transaction    public  class  AppModuleImpl  extends  Applica?onModuleImpl  {        public  void  someBusinessServiceMethod()  {                  invokePLSQLProcedure1();                  modifySomeA^ributes();                  invokePLSQLProcedure2();                                getDBTransac?on().commit();                                          }     Business  Service  Method   20  
  • 21. Ă˜ïƒ˜â€Ż passivateStateForUndo Ă˜ïƒ˜â€Ż Makes a snapshot with AM’s state Ă˜ïƒ˜â€Ż activateStateForUndo Ă˜ïƒ˜â€Ż Restores AM’s state from snapshot Ă˜ïƒ˜â€Ż Rollbacks the transaction  public  class  AppModuleImpl  extends  Applica?onModuleImpl  {        private  String  passivateStateForUndo()  {                  String  savePoint  =  super.passivateStateForUndo(null,  null,  PASSIVATE_UNDO_FLAG);                  return  savePoint;            }          private  void  ac?vateStateForUndo(String  savePointId)  {                    super.ac?vateStateForUndo(savePointId,    ACTIVATE_UNDO_FLAG);                  }         Managing  Savepoints  with  ADF  BC   21  
  • 22.    public  class  AppModuleImpl  extends  Applica?onModuleImpl  {      public  void  someBusinessServiceMethod()  {                      String  spid  =  passivateStateForUndo();                      try  {                                                    invokePLSQLProcedure1();                                                      modifySomeA^ributes();                                                    invokePLSQLProcedure2();                                            getDBTransac?on().commit();                                                    }  catch  (Run?meExcep?on  e)  {                              ac=vateStateForUndo(spid);                              throw  new  JboExcep?on(e);                      }              }       Managing  Savepoints  with  ADF  BC   22  
  • 23. The  BrieïŹng   23   ADF BC Transaction Shared Transaction Transaction Commit Cycle ADF BC Save Points ADF Model Transaction Data Control Frame Programmatic Approach Q&A Data Control Scope Task Flow Transaction Options Transaction Definition
  • 24. Oracle  ADF  Model   24   ADF  Faces   ADF  Bindings   DB   ADF  Data  Controls   ADF  Task  Flows   ADF  Business  Components  
  • 25. Ă˜ïƒ˜â€Ż ADF BC Ă˜ïƒ˜â€Ż EJB Ă˜ïƒ˜â€Ż Bean Ă˜ïƒ˜â€Ż WebService (SOAP/REST) Ă˜ïƒ˜â€Ż URL Ă˜ïƒ˜â€Ż JMX Ă˜ïƒ˜â€Ż BAM Ă˜ïƒ˜â€Ż Placeholder Ă˜ïƒ˜â€Ż Custom Data Controls       ADF  Data  Controls   25  
  • 26. Mul=ple  Data  Controls   26   REST  API   DB   ADF  BC   Global  Divers   Accommoda?on
  • 27. Data  Control  Frame   27   REST  API   DB   ADF  BC   Data  Control  Frame   Global  Divers   Accommoda?on BC  Data  Control   REST  Data  Control   Transac=on  
  • 28. Oracle  ADF  Controller   28   ADF  Faces     ADF  Bindings     DB   ADF  Data  Controls   ADF  Task  Flows   ADF  Business  Components  
  • 29.       Task  Flow   29  
  • 30.       Task  Flow  Transac=on  Op=ons   30  
  • 31. Ă˜ïƒ˜â€Ż Shared Data Control Frame Ă˜ïƒ˜â€Ż Data Control Instance (same type & name) Ă˜ïƒ˜â€ŻAM instance Ă˜ïƒ˜â€ŻVO instances Ă˜ïƒ˜â€Ż Transaction Handler Ă˜ïƒ˜â€ŻDB Transaction Object Ă˜ïƒ˜â€ŻDB Connection Ă˜ïƒ˜â€ŻEntity Cache Ă˜ïƒ˜â€Ż Default Option for BTF     Shared  Data  Control  Scope   31  
  • 32. Ă˜ïƒ˜â€Ż Isolated Data Control Frame Ă˜ïƒ˜â€Ż Data Control Instance (same type & name) Ă˜ïƒ˜â€ŻAM instance Ă˜ïƒ˜â€ŻVO instances Ă˜ïƒ˜â€Ż Transaction Handler Ă˜ïƒ˜â€ŻDB Transaction Object Ă˜ïƒ˜â€ŻDB Connection Ă˜ïƒ˜â€ŻEntity Cache Ă˜ïƒ˜â€Ż Always for UTF     Isolated  Data  Control  Scope   32  
  • 33. The  BrieïŹng   33   ADF BC Transaction Shared Transaction Transaction Commit Cycle ADF BC Save Points ADF Model Transaction Data Control Frame Programmatic Approach Q&A Data Control Scope Task Flow Transaction Options Transaction Definition
  • 34. Data  Control  Frame  #1   Data  Control  Frames   34   Main.jspx   UTF   Menu   BTF   Data  Control  Frame  #2   Divers   BTF   Log  Book   Record   BTF   Data  Control  Frame  #3   Dive  Sites   BTF  
  • 35.   Task  Flow  Transac=on  Op=ons   35            <transac?on>                  <new-­‐transac?on/>            </transac?on>      
  • 36. Ă˜ïƒ˜â€Ż Starts a new transaction on Data Control Frame Ă˜ïƒ˜â€Ż Supports Both Data Control Scopes Ă˜ïƒ˜â€Ż Isolated Ă˜ïƒ˜â€Ż Shared Ă˜ïƒ˜â€ŻCalled from UTF Ă˜ïƒ˜â€ŻThe caller has ”No Controller Transaction” Ă˜ïƒ˜â€Ż Must Finish the Transaction     Always  Begin  New  Transac=on  (new-­‐transac=on)   36  
  • 37. Ă˜ïƒ˜â€Ż Only Transaction starter can finish it Ă˜ïƒ˜â€Ż Always Begin New Transaction Ă˜ïƒ˜â€Ż Use Existing Transaction if Possible (no caller’s transaction)     Commit  and  Rollback  on  Return   37  
  • 38. 38     Data  Control  Frame     Task  Flow  Commit     Transac?on       Data  Control    Commit   commit   commitTransac?on   commit     DB  Transac?on     For  each  data  control  
  • 39. Ă˜ïƒ˜â€Ż Prematurely Terminated Task Flow Ă˜ïƒ˜â€Ż Finished not via return activities Ă˜ïƒ˜â€Ż Task Flow’s container is not rendered anymore Ă˜ïƒ˜â€Ż Has been refreshed by the parent Ă˜ïƒ˜â€Ż Task Flow owns the transaction Ă˜ïƒ˜â€Ż Auto-rollback behavior     Prematurely  Terminated  Transac=on   39  
  • 40. The  BrieïŹng   40   ADF BC Transaction Shared Transaction Transaction Commit Cycle ADF BC Save Points ADF Model Transaction Data Control Frame Programmatic Approach Q&A Data Control Scope Task Flow Transaction Options Transaction Definition
  • 41. Ă˜ïƒ˜â€Ż Joins an existing transaction Ă˜ïƒ˜â€Ż Supports Only Shared Data Control Scope Ă˜ïƒ˜â€Ż Isolated is disabled Ă˜ïƒ˜â€Ż Can not Finish the Transaction     Always  Use  Exis=ng  Transac=on  (requires-­‐exis=ng-­‐transac=on)   41  
  • 42. Ă˜ïƒ˜â€Ż Created by default when shared transaction is reused Ă˜ïƒ˜â€Ż Used to restore model state on task flow exit Ă˜ïƒ˜â€Ż ”No Save Point on Task Flow Entry” to prevent creation     Task  Flow  Save  Points   42  
  • 43. Ă˜ïƒ˜â€Ż Root AM requires a dedicated DB connection Ă˜ïƒ˜â€Ż Parent and Child Task Flows should share Transaction Ă˜ïƒ˜â€Ż Too many DB connections for multi-root-AMs application     Root  AM  Connec=on  Challenge   43   Divers  VO   Log  Book  VO   Divers Root AM Log Book Root AM Log Book Record BTFDivers BTF
  • 44. Ă˜ïƒ˜â€Ż Root AMs refer to the same data source Ă˜ïƒ˜â€Ż Task Flows use Transaction Options Ă˜ïƒ˜â€Ż Any but <No Controller Transaction> Ă˜ïƒ˜â€Ż Value for jbo.shared.txn is generated Ă˜ïƒ˜â€Ż Transaction is shared     Root  AM  Connec=on  Sharing   44   JDBC  Connec?on   Divers  VO       Log  Book  VO   Divers Root AM Log Book Root AM
  • 45. The  BrieïŹng   45   ADF BC Transaction Shared Transaction Transaction Commit Cycle ADF BC Save Points ADF Model Transaction Data Control Frame Programmatic Approach Q&A Data Control Scope Task Flow Transaction Options Transaction Definition
  • 46. Ă˜ïƒ˜â€Ż Dynamic transaction option Ă˜ïƒ˜â€Ż Isolated Data Control Scope Ă˜ïƒ˜â€Ż Always Begin New Transaction Ă˜ïƒ˜â€Ż Shared Data Control Scope Ă˜ïƒ˜â€ŻThere is open transaction Ă˜ïƒ˜â€Ż Always Use Existing Transaction Ă˜ïƒ˜â€ŻThere is No open transaction Ă˜ïƒ˜â€Ż Always Begin New Transaction     Use  Exis=ng  Transac=on  if  Possible  (requires-­‐transac=on)   46  
  • 47. Ă˜ïƒ˜â€Ż Switches Off controller transaction management Ă˜ïƒ˜â€Ż Does not start a transaction on task flow entry Ă˜ïƒ˜â€Ż Does not create a save point on task flow entry Ă˜ïƒ˜â€Ż Does not restore to save point Ă˜ïƒ˜â€Ż Does not rollback or commit transaction     No  Controller  Transac=on   47  
  • 48. Ă˜ïƒ˜â€Ż Get current binding context Ă˜ïƒ˜â€Ż Get current Data Control Frame Ă˜ïƒ˜â€Ż Start a new transaction on the frame    public  void  startTransac?on()  {          BindingContext  context  =  BindingContext.getCurrent();                        //Get  the  name  of  Data  Control  Frame          String  dcFrameName  =  context.getCurrentDataControlFrame();            //Get  Data  Control  Frame          DataControlFrame  dcFrame  =  context.ïŹndDataControlFrame(dcFrameName);                      //Start  Transac?on          dcFrame.beginTransac?on(new  Transac?onProper?es());      }         Start  a  Transac=on   48  
  • 49. Ă˜ïƒ˜â€Ż Get current binding context Ă˜ïƒ˜â€Ż Get current Data Control Frame Ă˜ïƒ˜â€Ż Commit or Rollback transaction    public  void Â ïŹnishTransac?on()  {          BindingContext  context  =  BindingContext.getCurrent();                      //Get  the  name  of  Data  Control  Frame          String  dcFrameName  =  context.getCurrentDataControlFrame();            //Get  Data  Control  Frame          DataControlFrame  dcFrame  =  context.ïŹndDataControlFrame(dcFrameName);                      //Finish  Transac?on            if  (doRollback)  dcFrame.rollback();                else  dcFrame.commit();         }     Finish  a  Transac=on   49  
  • 50. Ă˜ïƒ˜â€Ż Create Save Point Ă˜ïƒ˜â€Ż Save Save Point handle in pageFlowScope bean Ă˜ïƒ˜â€Ż Restore Save Point    private  SavepointHandle  savepointHandle;            public  void  createSavePoint()  {          DataControlFrame  dcFrame  =  getCurrentDataControlFrame();          savepointHandle  =  dcFrame.createSavepoint();        }        public  void  restoreSavePoint()  {          DataControlFrame  dcFrame  =  getCurrentDataControlFrame();          dcFrame.restoreSavepoint(savepointHandle);      }   Create  Savepoint  &  Restore  to  Savepoint   50  
  • 51.       CRUD  Task  Flow   51  
  • 52. Safety  Stop.  Ques=ons  &  Answers   52   ADF BC Transaction Shared Transaction Transaction Commit Cycle ADF BC Save Points ADF Model Transaction Data Control Frame Programmatic Approach Q&A Data Control Scope Task Flow Transaction Options Transaction Definition
  • 53. 53 Join Your Community! Tonight from 8:00 – 10:00 in Sheraton I ADF Monday Night Foosball What is more fun than foosball and beer at your best friend’s house? Well, how about a foosball tournament with a whole bunch of friends at Kscope16? Join your fellow ADF enthusiasts for some great networking and friendly competition.
  • 54. 54