5. La juste part du développeur
Application
Framework 1 Framework 2
Code stéréotypé
& répétitif
Développeur Générateur
Telosys Tools @telosys http://tools.telosys.org 5
Plate-forme ( ie Java EE )
Comment réduire le volume de code à réaliser ?
Frameworks & « boilerplate » réduction du code technique
(code générique, « factorisable »)
Mais il reste toujours une partie du code qui est spécifique et
répétitive (et sans valeur ajoutée)
La génération de code permet d’automatiser cette partie
6. • Model Driven Architecture (cf OMG)
• Approche « Model First »
=> concevoir et maintenir un modèle
(UML, DSL, …)
Génération de code - Approche « MDA »
MODEL
Service
name
Port
name
0..n+port 0..n
Port Type
name
Binding
name
1
+binding
1
1
+type
1
Param
name
Output
Input
StartWithExtensions
BindingOperation
name
0..n+operation 0..n
0..1 +input0..1
0..1+output 0..1
Operation
name
0..1
+input
0..1
0..10..1
0..n+operation 0..n
11
X M I
( XML )
Telosys Tools @telosys http://tools.telosys.org 6
Code
Part
name
Message
name
0..n+part 0..n
1+message 1
Output
BindingFault
Fault
name
1
+message
11
name
0..n
name
0..1
+output
0..1
0..n+fault 0..n
11
1
+fault 0..n
Template TOOL
Processus lourd, ne permet pas un démarrage rapide
7. • Littéralement « échafaudage »
• Définition Wikipedia : (incomplète)
• Largement utilisé dans certains écosystèmes
Génération de code - Approche « Scaffolding »
Scaffolding is a meta-programming
method of building database-backed
software applications.
Telosys Tools @telosys http://tools.telosys.org 7
• Largement utilisé dans certains écosystèmes
– Ruby ( RoR - Ruby On Rails )
– Groovy ( Grails – Groovy on Rails )
• Et pour Java?
– Spring ROO (Boite noire, lié à Spring, AspectJ )
– DALI / Eclipse (JPA mapping only)
– AppFuse (command line + web)
8. • Approche « Database First »
• Efficace (permet un démarrage rapide)
• Outil de type « boite noire », généralement non adaptable
Génération de code - Approche « Scaffolding »
Database
TOOL
Code
Metadata
Telosys Tools @telosys http://tools.telosys.org 8
Pas de templates :
- Comment personnaliser la génération de code ?
Pas de modèle :
- Comment ajouter des informations (en + des méta-data) ?
- Comment modifier (durablement) les méta-data ?
noms/types des attributs Java,
règles de validation (min, max, regexp, …),
représentation des Booléens (1/0, "T"/"F", … ), etc
9. Telosys Tools: une nouvelle approche
« Database first » scaffolding avec un modèle léger et des templates
ADAPTABLE
Telosys Tools @telosys http://tools.telosys.org 9
10. Philosophie
Keep it simpleKeep it simpleKeep it simpleKeep it simple
and pragmaticand pragmaticand pragmaticand pragmatic
Telosys Tools @telosys http://tools.telosys.org 10
11. Plugin
Code Generator
Environnement de travail : Eclipse + plugin + templates
Model Editor
Workspace
Community templates
GitHub
download
templates
install
plugin
Telosys Tools @telosys http://tools.telosys.org 11
Code GeneratorModel Editor
Template Editor
Database Editor
Model Generator
12. Que peut-on générer ?
Tout fichier de type « texte » :
Java, XML, JSP, PHP, Scala, JavaScript, HTML, etc…
Principe :
1 entity N templates N targets
1 bean
Telosys Tools @telosys http://tools.telosys.org 12
N entities 1 template 1 target
model
(all entities
with links)
1 controller
1 web page
1 list
13. Ça ressemble à quoi un template ?
http://velocity.apache.org/
Objets du model
« entities »
Velocity Template Language (VTL)
• Références aux objets : $, ${…}
• Directives : #set, #if, #foreach, …
• Commentaire : ## #* .. *#
Telosys Tools @telosys http://tools.telosys.org 13
Objets de
l’environnement
14. Ce n’est pas magique
Ne pas chercher
à tout générer
(il faut savoir s’arrêter)
code code
généré non généré
Application
Code stéréotypé
& répétitif
Telosys Tools @telosys http://tools.telosys.org 14
Estimer le gain
de productivité
18. Architecture générale
Tomcat Server
Webapp
Spring MVC + JPA
bookstore-
spring
2 Projets
Telosys Tools @telosys http://tools.telosys.org 18
Base
de données
relationnelle
Spring MVC + JPA
Webapp
AngularJS
spring
bookstore-
angularjs
19. Application 1 :
Spring MVC
+
Spring MVC + AngularJS
Telosys Tools @telosys http://tools.telosys.org 19
+
Spring Data JPA
20. Application 1
Spring MVC + Spring Data JPA
Base de données
relationnelle
JPA
Spring
Data JPA
Spring
MVC
Web REST
Telosys Tools @telosys http://tools.telosys.org 20
Utilisateur
21. Spring MVC + Spring Data JPA
Présentation
Spring MVC
Service
JPA
Persistance
Spring
3 couches
Telosys Tools @telosys http://tools.telosys.org 21
Contrôleurs
Pages Web
Service DAO
22. Points de vigilance sur JPA (Java Persistence API)
Spring MVC + Spring Data JPA
Présentation
Spring MVC
Service
JPA
Persistance
Spring
Telosys Tools @telosys http://tools.telosys.org 22
Contrôleurs
Pages Web
Service DAO
23. Points de vigilance sur JPA (Java Persistence API)
• Concepts mal maîtrisés voir inconnus des développeurs
– Session Hibernate / Entity Manager :
• Objets « attachés » et « détachés »
• Mise à jour différée de la base de données
– Règles de persistance des liens entre les objets
• Notion « owning side » et « inverse side »
Spring MVC + Spring Data JPA
Telosys Tools @telosys http://tools.telosys.org 23
• Notion « owning side » et « inverse side »
• Problème de performances
– Chargement à la volée :
• problème du « N+1 requêtes »
• Erreurs techniques si l’objet est « détaché »
• Comportements masqués et objets « pollués »
– Chargement à la volée :
• Utilisation d’objets « proxy » et de collections « proxy »
24. Notre solution :
Isoler JPA dans la couche de persistance
Spring MVC + Spring Data JPA
Présentation Service
JPA
Contrôleurs
Pages Web
Service DAO
Persistance
Telosys Tools @telosys http://tools.telosys.org 24
Pages Web
Objets
d’affichage
Mapping Entités JPA
Transactions
25. Spring MVC + Spring Data JPA
Partie générée par Telosys :
« Controller »
BookController
« Service »
BookService
« DAO »
BookJpaRepository
Base de
données
relationnelle« Controller »
BookRestController
Telosys Tools @telosys http://tools.telosys.org 25
BookController
Utilisateur
REST
Pages
GET, POST,
PUT, DELETE
BookRestController
Web
27. Organisation et dépendances des bundles
Spring MVC
front-springmvc
Service
Présentation
Services
service-springdatajpa
Telosys Tools @telosys http://tools.telosys.org 27
Spring Data JPA
persistence-springdatajpa
Database
Persistance
Database
28. Spring MVC + Spring Data JPA
Démo
2
Telosys Tools @telosys http://tools.telosys.org 28
31. AngularJS + Spring MVC REST
Application 1
Base de
données
relationnelle
JPA
Spring
Data JPA
Spring
MVC
REST
Telosys Tools @telosys http://tools.telosys.org 31
Application 2
relationnelle
AngularJS
Utilisateur
Web
32. AngularJS + Spring MVC REST
URLs des services REST
• Récupérer la liste des entités :
– GET : /rest/[entity]
• Récupérer une entité :
– GET : /rest/[entity]/[id]
• Créer une entité :
– POST : /rest/[entity]
Telosys Tools @telosys http://tools.telosys.org 32
– POST : /rest/[entity]
• Modifier une entité :
– PUT : /rest/[entity]/[id]
• Supprimer une entité :
– DELETE : /rest/[entity]/[id]
33. AngularJS + Spring MVC REST
Partie générée par Telosys :
« Controller »
BookCtrl
_____________________________________________
load
loadAll
save
delete
_____________________________________________
$scope.book
REST
« Service »
Book
______________________________________
get
getAll
create
update
delete GET,
Telosys Tools @telosys http://tools.telosys.org 33
$scope.book
$scope.books
delete
Page de modification
book_form.html
Page de recherche
book_list.html
GET,
POST,
PUT,
DELETE
Utilisateur
Web
34. Aspects techniques
• Basé sur le projet de démarrage « Seed »
de Angular :
– https://github.com/angular/angular-seed
• Gestion de l’internationalisation (i18n) :
Telosys Tools @telosys http://tools.telosys.org 34
• Gestion de l’internationalisation (i18n) :
– https://github.com/angular-translate/angular-translate
• Intégration de Twitter bootstrap 3 avec AngularStrap :
– http://mgcrea.github.io/angular-strap
35. Organisation et dépendances des bundles
Spring MVC
front-springmvc
Service
Présentation
AngularJS
front-angularjs
MVC Javascript
Service layer
Telosys Tools @telosys http://tools.telosys.org 35
Spring Data JPA
persistence-springdatajpa
Database
Service
Persistance
Database
Service layer
service-springdatajpa
38. Spring Data REST dans l'écosystème Spring
Spring Data REST
Spring MVC
Spring Data
JPA
Spring Data
Neo4J
Spring Data
MongoDB
Spring Data Commons
Spring Data
Gemfire
Telosys Tools @telosys http://tools.telosys.org 38
39. Spring Data, un socle commun
Spring Data REST
Spring MVC
Spring Data
JPA
Spring Data
Neo4J
Spring Data
MongoDB
Spring Data Commons
Spring Data
Gemfire
Telosys Tools @telosys http://tools.telosys.org 39
Spring Data Commons
• Couche d'abstraction partagée par les différents projets
•Ex : Repository, Génération dynamique des requêtes à
partir des nom de méthodes, audit …
40. Spring Data : Différents fournisseurs de données
• API de manipulation d'une source de données spécifiques
Spring Data REST
Spring MVC
Spring Data
JPA
Spring Data
Neo4J
Spring Data
MongoDB
Spring Data Commons
Spring Data
Gemfire
Telosys Tools @telosys http://tools.telosys.org 40
• API de manipulation d'une source de données spécifiques
• Implémentation implicite des opérations les plus courantes (CRUD)
• Plusieurs fournisseurs de données :
• JPA, MongoDB, Neo4J, Gemfire, Redis, Hadoop, SolR, Couchbase, elasticsearch,
cassandra et dynamoDB
• Supportés par Spring Data REST :
• JPA, MongoDB, Neo4J et Gemfire (cache distribué, VMWare)
41. Spring Data REST
Spring Data REST
Spring MVC
Spring Data
JPA
Spring Data
Neo4J
Spring Data
MongoDB
Spring Data Commons
Spring Data
Gemfire
Telosys Tools @telosys http://tools.telosys.org 41
Spring Data REST
• S'appui sur Spring MVC pour l'exposition de services.
• Les services exposés sont RESTful, approche HATEAOS
• S'appui sur les interfaces Repository pour la génération des services
CRUD et de l'API /search
42. Spring Data REST
Spring Data REST
Spring MVC
Spring Data
JPA
Spring Data
Neo4J
Spring Data
MongoDB
Spring Data Commons
Spring Data
Gemfire
Telosys Tools @telosys http://tools.telosys.org 42
Stack de l'application générée
• Spring Data REST 2.0.1.RELEASE
• Spring Data JPA 1.5.1.RELEASE
• Hibernate 4.2
47. Spring Data REST
Book
@Entity
BookRepository
CrudRepository
Spring Data REST
@Controller,
ServletDispatcher …
Telosys Tools @telosys http://tools.telosys.org 47
API CRUD
• GET
• POST
• PUT
• DELETE
API Search
/search
Toutes les méthodes
définies dans l'interface
BookRepository.
48. Spring Data REST
Book
@Entity
BookRepository
CrudRepository
Spring Data REST
@Controller,
ServletDispatcher …
Telosys Tools @telosys http://tools.telosys.org 48
API CRUD
• GET
• POST
• PUT
• DELETE
API Search
/search
Toutes les méthodes
définies dans l'interface
BookRepository.
Json Schema
/schema
Description des
propriétés de l'entité.
49. Spring Data REST
Book
@Entity
BookRepository
CrudRepository
Spring Data REST
@Controller,
ServletDispatcher …
Partie générée par
Telosys Tools
• Entités
• Repositories
• "FindBy" pour Many-To-One
• Validators
• Configuration de l'application
Telosys Tools @telosys http://tools.telosys.org 49
API CRUD
• GET
• POST
• PUT
• PATCH
• DELETE
API Search
/search
Toutes les méthodes
définies dans l'interface
BookRepository.
Json Schema
/schema
Description des
propriétés de l'entité.
50. HATEOAS ?
" HATEOAS – the
word, there's no
pronounciation for. "
Telosys Tools @telosys http://tools.telosys.org 50
pronounciation for. "
(Ben Hale, SpringOne2GX 2012)
51. HATEOAS ?
" HATEOAS – the
word, there's no
pronounciation for. "
(Ben Hale, SpringOne2GX 2012)
Telosys Tools @telosys http://tools.telosys.org 51
Hypermedia As The Engine Of Application State
52. HATEOAS ?
Telosys Tools @telosys http://tools.telosys.org 52
Model of RESTful maturity by L.Richardson
53. HATEOAS ?
Un format ? Un standard ?
Telosys Tools @telosys http://tools.telosys.org 53
54. HATEOAS ?
Collection+JSON – Hypermedia Type
HAL – Hypertext Application Language
Un format ? Un standard ?
Telosys Tools @telosys http://tools.telosys.org 54
Json-LD : JSON for Linking Data
W3C depuis 16/01/2014
SIREN
JSON Schema & JSON Hyper-Schema
55. HATEOAS ?
Un format ?
Collection+JSON – Hypermedia Type
HAL – Hypertext Application Language
Un standard ?
Telosys Tools @telosys http://tools.telosys.org 55
Json-LD : JSON for Linking Data
W3C depuis 16/01/2014
SIREN
JSON Schema & JSON Hyper-Schema
56. HATEOAS ?
Collection+JSON – Hypermedia Type
HAL – Hypertext Application Language
Un format ? Un standard ?
Telosys Tools @telosys http://tools.telosys.org 56
Json-LD : JSON for Linking Data
W3C depuis 16/01/2014
SIREN
JSON Schema & JSON Hyper-Schema
57. HAL : Hypertext Application Language
Telosys Tools @telosys http://tools.telosys.org 57