Upload
massimiliano-dessi
View
6.444
Download
2
Embed Size (px)
DESCRIPTION
Spring ROO Internals and add-ons
Citation preview
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Spring ROOInternals and add-ons
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
SpeakerSoftware Architect / Developer
ProNetics / Sourcesense
Chairman JugSardegna Onlus
Founder SpringFramework Italian User Group
Committer - ContributorOpenNMS - MongoDB - MagicBox
AuthorSpring 2.5 Aspect Oriented Programming
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Agenda- Demo for unbelievers-
- Roo Internals -
- Maven Roo support -
- Add On Anatomy -
- Roo Domain Driven Design -
- AspectJ Intertype Declaration -
- SpringSurf Add-on -
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
5 Minutes demo for Unbelievers
Demo for unbelievers
Roo Internals
Maven Roo support
Add On Anatomy
Roo Domain Driven Design
AspectJ Intertype Declaration
SpringSurf Add-on
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Roo internals
Demo for unbelievers
Roo Internals
Maven Roo support
Add On Anatomy
Roo Domain Driven Design
AspectJ Intertype Declaration
SpringSurf Add-on
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Classpath
ProcessManager
Shell Project
MetadataModelFile Undo File Monitor
Core modules
Support
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Roo in its essence is an interactive shell
and a ProcessManager
The Shell receives the commands
and a ProcessManager
coordinates the operations
required from the user
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
- The Shell has a very good usability -
(tab, context awareness, hiding, hints)
- Background monitoring of externally-made changes -
- Full interaction with Spring Tool Suite -
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Shell
The Shell
parses and validates the user input
and publishes the status about current task
STARTING, STARTED, USER_INPUT, PARSING, EXECUTING,
EXECUTION_RESULT_PROCESSING,
EXECUTION_COMPLETE, SHUTTING_DOWN
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
ProcessManager
The Shell passes the ParseResult object
to the execute method
of the ProcessManager
(Strategy pattern)
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
ProcessManager
ProcessManager delivers:
- State publication model -
- Polling on filesystem resources -
- Execute CommandCallbacks for requested operations -
- "Transaction-like" context for above operations -
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Commands
During the bootstrap ROO
reads all bean classes
of type CommandMarker (Tag interface)
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
The Shell stores the metadata information
(@CliAvailabilityIndicator) read from
all CommandMarker beans
In this way the Shell knows all available commands
and MethodTarget related to user input
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
The Command class (CommandMarker)
uses the related Operations class.
The Operations class
performs the real work
on Java and AspectJ classes, XML and template files.
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Maven ROO supportsometimes maven is your friend :)
Demo for unbelievers
Roo Internals
Maven Roo support
Add On Anatomy
Roo Domain Driven Design
AspectJ Intertype Declaration
SpringSurf Add-on
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Roo uses Maven under the hood for:
building the entire project and managing dependenciesroo> project --topLevelPackage com.proj.roo.addon
add-on development roo> project --topLevelPackage com.proj.roo.addon --template ROO_ADDON_SIMPLE
eclipse / STSroo> perform eclipse
packagingroo> perform assembly
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Add-On anatomySecurity add-on in the example
Demo for unbelievers
Roo Internals
Maven Roo support
Add On Anatomy
Roo Domain Driven Design
AspectJ Intertype Declaration
SpringSurf Add-on
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
@ScopeDevelopmentShell public class SecurityCommands implements CommandMarker{
private SecurityOperations securityOperations;
public SecurityCommands(SecurityOperations securityOperations) { Assert.notNull(securityOperations, "Security operations required"); this.securityOperations = securityOperations; }
@CliAvailabilityIndicator("security setup") public boolean isInstallSecurityAvailable() { return securityOperations.isInstallSecurityAvailable(); }
@CliCommand(value = "security setup", help = "Install Spring Security into your project")
public void installSecurity() { securityOperations.installSecurity(); } }
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Security add-on
@ScopeDevelopmentShell public class SecurityCommands implements CommandMarker … public SecurityCommands(SecurityOperations securityOperations) { Assert.notNull(securityOperations, "Security operations required"); this.securityOperations = securityOperations; }
@ScopeDevelopmentShell : Indicates a class that should be instantiated when the ROO
development Shell is used.
CommandMarker : Tag Interface, the Command class must implement this interface
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Commands @CliAvailabilityIndicator("security setup") public boolean isInstallSecurityAvailable() { return securityOperations.isInstallSecurityAvailable(); }
@CliAvailabilityIndicator:Annotates a method that can indicate whether a particular
command is currently available or not.
This annotation must only be applied to a public no-argument method that returns primitive boolean.
The method should be inexpensive to evaluate, as this method can be called very frequently. If
expensive operations are necessary to compute command availability, it is suggested the method
return a boolean field that is maintained using the observer pattern.
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Commands
@CliCommand(value = "security setup", help = "Install Spring Security into your project")public void installSecurity() { securityOperations.installSecurity();}...
@CliCommand value: one or more strings which must serve as the start of a particular command in order to match this method (these must be unique within the entire application)
help: help message for this command (the default is a blank String, which means there is no help)
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Operations
@ScopeDevelopmentpublic class SecurityOperations private FileManager fileManager; private PathResolver pathResolver; private MetadataService metadataService; private ProjectOperations projectOperations;
....
The SecurityOperations uses the above convenient Roo API to fulfill its purpose:- Find/write and read any resources (Java, XML, JSP, Properties, AJ) on filesystem- Read metadata- Handle the POM file
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Recap, add-on should:
- Make a “Command” class and implement CommandMaker -
- Delegate methods through to an “Operations” object -
- Annotate methods with @CliCommand -
- Annotate method parameters with @CliOption -
- Optionally use @CliAvailabilityIndicator if desired -
- Throw any exceptions to abort and rollback changes -
- Use JDK logging or return objects for console output -
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
• Backup
• Bean Info
• Configurable
• Data On Demand
• Entity
• Dynamic Finder
• Java Bean
• JMS
• JPA
• Logging
• Maven
• Pluralization
• Property Editor
• Property File
• Security
• Integration Test
• ToString
• Web (various)
1.0.1 Base Add-Ons
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Roo Domain Driven Design
Demo for unbelievers
Roo Internals
Maven Roo support
Add On Anatomy
Roo Domain Driven Design
AspectJ Intertype Declaration
SpringSurf Add-on
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Roo uses a pragmatic design approach.
Following the Domain Driven Design principles,
Roo avoids
Anemic Objects and prefers Rich Domain Objects
that follows Object Oriented principles.
This means encapsulation, immutability and
proper role of domain objects
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Do you
remember the
controller-entities
interaction
of this slide ?
Roo works in a
similar way
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Roo by default uses two layers:
An entity layer (similar to domain layer)
and a web layer (REST).
Roo achieves separation of concern
of these two layers
through AspectJ ITD-based architecture.
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
- REST Controllers work directly with Domain entities -
- OpenEntityManagerInViewFilter -
- JPA EntityManager bound to the thread for the entire
processing of the request -
- allow for lazy loading in web views -
- original transactions already being completed -
- Service layer is optional, it can be created and used for business
logic spanning multiple entities -
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
AspectJ ITD(where Roo shines)
Demo for unbelievers
Roo Internals
Maven Roo support
Add On Anatomy
Roo Domain Driven Design
AspectJ Intertype Declaration
SpringSurf Add-on
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Do you
remember
the concept
of
this slide ?
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
The Spring Introductions in the Aspect world
are called Inter-Type Declarations (ITD) .
Roo uses AspectJ ITD
instead of Spring Introductions (proxy based).
With ITD Roo performs active generation.
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
The ITD enables ROO through the add-on
to write the custom logic
into <name_class>_Roo_<addOn>.aj files
related to the corresponding java class
AspectJ compiler does the rest
by linking the pieces of the puzzle :)
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
For example the add-ons Entity, JavaBean, ToString
generates the proper logic in corresponding .aj files.
*_Roo_Entity.aj
*_Roo_JavaBean.aj
*_Roo_ToString.aj
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
With AspectJ ITD
Roo can implement
an effective Object Oriented
Domain Driven Design
application
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Alfresco SpringSurf add-on
Demo for unbelievers
Roo Internals
Maven Roo support
Add On Anatomy
Roo Domain Driven Design
AspectJ Intertype Declaration
SpringSurf Add-on
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
“Spring Surf is a view composition framework
for Spring MVC that plugs into
your existing Spring applications.
It provides
a scriptable and content-centric approach
to building web applications “
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Surf is born from the alfresco community
need of a lightweight approach
to create application services
and
user interface extensions
instead of JSF or Struts
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Spring Surf is an official
Spring extension by Alfresco.(http://www.springsource.org/extensions/se-surf)
Roo enables scaffolding for
Surf pages, templates and components.
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
The Spring Surf Roo add-on
shows one of the many possibilities
that Roo provides with its API
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Spring-Surf mini demo
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Q & A
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
• Home• http://www.springsource.org/roo• Contains links to all other resources
• Forum• http://forum.springsource.org
• Issues• http://jira.springframework.org/browse/ROO
• Twitter• #roo hash key• follow @schmidtstefan & @benalexau
Project resources
Massimiliano Dessì - SpringFramework Italian User Group
Javaday IV – Roma – 30 gennaio 2010
Massimiliano Dessì desmax74 at yahoo.it
massimiliano.dessi at pronetics.it
http://twitter.com/desmax74
http://jroller.com/desmax
http://www.linkedin.com/in/desmax74
http://www.slideshare.net/desmax74
http://wiki.java.net/bin/view/People/MassimilianoDessi
http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi
Thanks for the attention !