44
Massimiliano Dessì - SpringFramework Italian User Group Javaday IV – Roma – 30 gennaio 2010 Spring ROO Internals and add-ons

Spring Roo Internals Javaday IV

Embed Size (px)

DESCRIPTION

Spring ROO Internals and add-ons

Citation preview

Page 1: Spring Roo Internals Javaday IV

Massimiliano Dessì - SpringFramework Italian User Group

Javaday IV – Roma – 30 gennaio 2010

Spring ROOInternals and add-ons

Page 2: Spring Roo Internals Javaday IV

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

Page 3: Spring Roo Internals Javaday IV

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 -

Page 4: Spring Roo Internals Javaday IV

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

Page 5: Spring Roo Internals Javaday IV

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

Page 6: Spring Roo Internals Javaday IV

Massimiliano Dessì - SpringFramework Italian User Group

Javaday IV – Roma – 30 gennaio 2010

Classpath

ProcessManager

Shell Project

MetadataModelFile Undo File Monitor

Core modules

Support

Page 7: Spring Roo Internals Javaday IV

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

Page 8: Spring Roo Internals Javaday IV

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 -

Page 9: Spring Roo Internals Javaday IV

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

Page 10: Spring Roo Internals Javaday IV

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)

Page 11: Spring Roo Internals Javaday IV

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 -

Page 12: Spring Roo Internals Javaday IV

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)

Page 13: Spring Roo Internals Javaday IV

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

Page 14: Spring Roo Internals Javaday IV

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.

Page 15: Spring Roo Internals Javaday IV

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

Page 16: Spring Roo Internals Javaday IV

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

Page 17: Spring Roo Internals Javaday IV

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

Page 18: Spring Roo Internals Javaday IV

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(); } }

Page 19: Spring Roo Internals Javaday IV

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

Page 20: Spring Roo Internals Javaday IV

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.

Page 21: Spring Roo Internals Javaday IV

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)

Page 22: Spring Roo Internals Javaday IV

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

Page 23: Spring Roo Internals Javaday IV

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 -

Page 24: Spring Roo Internals Javaday IV

Massimiliano Dessì - SpringFramework Italian User Group

Javaday IV – Roma – 30 gennaio 2010

• Backup

• Bean Info

• Configurable

• Data On Demand

• Email

• 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

Page 25: Spring Roo Internals Javaday IV

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

Page 26: Spring Roo Internals Javaday IV

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

Page 27: Spring Roo Internals Javaday IV

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

Page 28: Spring Roo Internals Javaday IV

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.

Page 29: Spring Roo Internals Javaday IV

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 -

Page 30: Spring Roo Internals Javaday IV

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

Page 31: Spring Roo Internals Javaday IV

Massimiliano Dessì - SpringFramework Italian User Group

Javaday IV – Roma – 30 gennaio 2010

Do you

remember

the concept

of

this slide ?

Page 32: Spring Roo Internals Javaday IV

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.

Page 33: Spring Roo Internals Javaday IV

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 :)

Page 34: Spring Roo Internals Javaday IV

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

Page 35: Spring Roo Internals Javaday IV

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

Page 36: Spring Roo Internals Javaday IV

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

Page 37: Spring Roo Internals Javaday IV

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 “

Page 38: Spring Roo Internals Javaday IV

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

Page 39: Spring Roo Internals Javaday IV

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.

Page 40: Spring Roo Internals Javaday IV

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

Page 41: Spring Roo Internals Javaday IV

Massimiliano Dessì - SpringFramework Italian User Group

Javaday IV – Roma – 30 gennaio 2010

Spring-Surf mini demo

Page 42: Spring Roo Internals Javaday IV

Massimiliano Dessì - SpringFramework Italian User Group

Javaday IV – Roma – 30 gennaio 2010

Q & A

Page 43: Spring Roo Internals Javaday IV

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

Page 44: Spring Roo Internals Javaday IV

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 !