jax 08 - agile rcp
TRANSCRIPT
Agile RCPPresenter First using Spring Dynamic Modules
Heiko Seeberger | metafinanz
2008-04-22 Heiko Seeberger | metafinanz2
123
Concepts
Application to RCP
Agile RCP framework
2008-04-22 Heiko Seeberger | metafinanz3
What is agile?
• Develop exactly what is required.• Test-driven development.• …
2008-04-22 Heiko Seeberger | metafinanz4
How can we be agile?
We need:• Agile process driving the design.• Architecture allowing for unit-testing.• …
2008-04-22 Heiko Seeberger | metafinanz5
Can UI development be agile?“User interfaces are hard to unit-test”:• Tangling of presentation and logic.• Dependency on concrete UI
technologies.
2008-04-22 Heiko Seeberger | metafinanz6
UI logic
Example: Unit-testing UIs
Verify input Invoke addition
2008-04-22 Heiko Seeberger | metafinanz7
Test Cases
How to implement these Test Cases?• Non-digits => Log error “Illegal format
…”.• 123 + 999 => 1122.
Example
2008-04-22 Heiko Seeberger | metafinanz8
Vanilla approach
Put “everything” into one Composite:• Text, label and button controls.• Handling button clicks:
– Verify input, possibly display error.– Invoke “business logic”.– Show result.
Example
2008-04-22 Heiko Seeberger | metafinanz9
Vanilla tastes, but …
• Quick win for the implementation.• Disastrous for testing.
– Why?– Let me show you (demo) …
Example
2008-04-22 Heiko Seeberger | metafinanz10
Any better ideas?
2008-04-22 Heiko Seeberger | metafinanz11
Use Model-View-Presenter
Similar to MVC, but:• Controllers for
widgets, presenters for views.
• Widgets hand off user gestures to presenter.
View
Presenter
Model
2008-04-22 Heiko Seeberger | metafinanz12
Passive View
• Does not listen to model updates.
• All UI logic in presenter.
passive
UI logic
View
Presenter
Model
Testing UI logic == Presenter testing
2008-04-22 Heiko Seeberger | metafinanz13
Interface abstractions
• Interfaces for model and view.
• Mock model and view to test presenters. passive
UI logic
IView
Presenter
IModel
PresenterTest
MockView MockModel
Presenter testing == EasyTesting UI logic == Easy
2008-04-22 Heiko Seeberger | metafinanz14
Presenter First architecture• MVP.• Passive View.• Interface
abstractions for model and view. passive
UI logic
IView
Presenter
IModel
2008-04-22 Heiko Seeberger | metafinanz15
Presenter First process
IView
Presenter
IModel
The user can query for books by entering the title in the query form …
User Story-onQuery()…
+getName()…
+getBooks()…
Requirements drive the design.
2008-04-22 Heiko Seeberger | metafinanz16
Presenter First (PF) answers:• How can we be agile?• Can UI development be agile?
– Delivers an agile process driving the design.
– Based on an Architecture enabling unit-testing.
– Untangles presentation and logic.– Abstracts from concrete UI technologies.
2008-04-22 Heiko Seeberger | metafinanz17
Presenter First approach
IView
Presenter
IModel
The user can enter two addends. Clicking “=“ will add and show their sum.
User Story
-handleAdd()…
+getAddend01()+getAddend02()+setSum()
+add()…
Example
+getAddend01()+getAddend02()+setSum()+registerAddHandler()
2008-04-22 Heiko Seeberger | metafinanz18
Presenter First approach
Example
Demo …
2008-04-22 Heiko Seeberger | metafinanz19
Test the presenter
Example
2008-04-22 Heiko Seeberger | metafinanz20
Full test coverage for UI logic
Example
2008-04-22 Heiko Seeberger | metafinanz21
123
Concepts
Application to RCP
Agile RCP framework
2008-04-22 Heiko Seeberger | metafinanz22
How to create the MVP triads?
IView
Presenter
IModel
MockView MockModelView Model
2008-04-22 Heiko Seeberger | metafinanz23
Application context
Use Spring!
Presenter
View Model
2008-04-22 Heiko Seeberger | metafinanz24
Bundle
Application context
Spring Dynamic Modules
Integration of OSGi/RCP and Spring:• Active bundle Spring application context.
Bean
BeanBean
2008-04-22 Heiko Seeberger | metafinanz25
Example
Application context
ContactsPresenter
ContactsView ContactsModel
2008-04-22 Heiko Seeberger | metafinanz26
Bundle
Application context
Sharing beans across bundles• Exporting beans as OSGi services.• Importing OSGi services as bean references.
Bean
BeanBean
Bundle
Application context
Bean
Bean
2008-04-22 Heiko Seeberger | metafinanz27
Im-/exporting services
• Importing an OSGi service:
• Exporting a bean as OSGi service:<service ref="personRepository" auto-export="interfaces"></service>
<reference id="personRepository" interface="org.agilercp.demo.contacts.IPersonRepository"></reference>
2008-04-22 Heiko Seeberger | metafinanz28
org.agilercp.demo.contacts.ui
Application context
Example
ContactsModel
org.agilercp.demo.contacts
Application context
PersonRepository
2008-04-22 Heiko Seeberger | metafinanz29
How to create ViewParts?
Workbench
views xPt
ViewPart
• ViewParts are created by the workbench.• How can we use the Spring created ones?
2008-04-22 Heiko Seeberger | metafinanz30
The workbench is flexible!
Workbench
ViewPartFactory
views xPt
Application context
Presenter
View Model
IExecutable-ExtensionFactory
IExecutable-Extension
getBean viewId(viewId)
2008-04-22 Heiko Seeberger | metafinanz31
Example
2008-04-22 Heiko Seeberger | metafinanz32
Application context
Dialog ViewPart
How to create Dialogs?
Presenter
View Model
Presenter
View Model
dialog
• Let Spring create the Dialog.• Inject it into opening MVP triad.
2008-04-22 Heiko Seeberger | metafinanz33
Example
2008-04-22 Heiko Seeberger | metafinanz34
123
Concepts
Application to RCP
Agile RCP framework
2008-04-22 Heiko Seeberger | metafinanz35
Agile RCP
• Presenter First framework for RCP.• Emerged from a real-world project.• Open Source: http://
sourceforge.net/projects/agilercp.• Website: http://agilercp.metafinanz.de.
2008-04-22 Heiko Seeberger | metafinanz36
Challenge
• Spring instantiates views,• but controls created later.
How can a presenter initialize its view before it is shown?
2008-04-22 Heiko Seeberger | metafinanz37
Agile RCP supports MVP life cycle
2008-04-22 Heiko Seeberger | metafinanz38
Showing views …
M and V are instantiated.
P is instantiated and M and V are
injected.
P initializes V.
P registers itself as IViewListener to V.
V is created.
V is shown.
2008-04-22 Heiko Seeberger | metafinanz39
Agile RCP delivers a view factory• Has access to Spring application
context.• Gets workbench parts by view/editor id.
2008-04-22 Heiko Seeberger | metafinanz40
Agile RCP delivers a lot more• Base classes for ViewParts.• Base classes for Dialogs.• Utility classes.• …• And a lot more is planned!
2008-04-22 Heiko Seeberger | metafinanz41
Agile RCP approach
Example
Demo:New requirement: Initialize view
with“123 + 999 = 1122”
2008-04-22 Heiko Seeberger | metafinanz42
Thank you!
• Website: http://agilercp.metafinanz.de• Agile RCP at sourceforge.net:
http://sourceforge.net/projects/agilercp• Contact me: