SlideShare une entreprise Scribd logo
1  sur  56
Introduction à Groovy
Un langage dynamique pour la JVM




                          1
Guillaume Laforge
Chef de projet de Groovy
Spec Lead du JSR-241

Initiateur du framework Grails


Co-auteur de “Groovy in Action”


Fondateur de G2One, Inc.
Mais d’abord...
une annonce importante !




                    3
4
... n’est plus !




                   4
Racheté par...




                 5
Ce que cela va apporter
Plus de visibilité pour Groovy et Grails

L’équipe Eclipse de SpringSource travaillera sur le
  plugin Eclipse pour Groovy et Grails

Une collaboration plus proche et cross-pollinisation
 de Grails, Spring, Spring MVC / WebFlow

Une intégration plus poussée de Groovy dans les
 produits du portfolio SpringSource


                                                      6
Objectifs
           DECOUVRIR :
  Qu’est-ce que Groovy ?
 Le framework web Grails
Domain-Specific Language




                  7
Agenda
Qu’est-ce que Groovy ?
  Et qu’est-ce que Grails ?

Groovy en détail
  Sa syntaxe et ses APIs
  Les nouveautés de Groovy 1.5 et 1.6
  Cas d’utilisation de Groovy

Domain-Specific Languages


                                        8
Qu’est-ce que Groovy ?




                  9
Décortiquons Groovy
Groovy est un langage dynamique
  pour la machine virtuelle Java
Langage dynamique
  Inspiration provenant de langages existants
  Java pour la syntaxe générale — facile à apprendre
     Groovy est un langage Orienté Objet
  Ruby et Smalltalk
     pour les closures, les aspects de programmation fonctionnelle
Machine virtuelle Java
  Peut être interprété ou compilé
  Au final : du bytecode Java est généré


                                                                10
Un projet Open Source
Open Source : sous licence Apache
  Hébergé chez Codehaus
Mature : plus de 5 ans, version 1.5.7 et 1.6-beta-2
  Une petite vingtaine de committers
Un grand succès
  32K-37K downloads / mois
     comparé à ~30K pour JRuby, ~7K pour Jython et ~5K pour Scala
  Mailing-listes les plus actives — milliers d’abonnés
En cours de standardisation
  Au sein du Java Community Process
  JSR-241 — Java Specification Request


                                                            11
Intégré partout !
Groovy est intégré...

  Dans d’autres projets Open Source
     Spring, JBoss SEAM, ServiceMix, Oracle OC4J, Mule...

  Dans des applications métier critiques
     Mutual of Omaha — US Fortune 500
     National Cancer Institute

  Dans des produits commerciaux
     IBM ProjectZero
     SAP Composition on Grails
     Oracle Data Integrator
     Oracle Fusion — ADF Business Components

                                                            12
Un projet innovant reconnu


         40 propositions, 10 nominés
         Groovy a gagné le premier prix
           Le projet le plus créatif et
             innovant de 2007
           Donnation de 10 000 €
         Gagnant en 2006 et 2008
           Spring et Grails

                                          13
Une pléthore de livres...




                            14
Qu’est-ce que Grails ?
Grails est un framework de développement
 d’applications Web
  Inspiré par Ruby on Rails, Django, TurboGears
  Mais s’appuyant sur des briques Open Source
    reconnues et éprouvées
     Spring, Hibernate, Quartz, SiteMesh...

Avantages
  Facile à prendre en main — Conventions over Config.
  Réutilisation de l’existant
     Schémas de base existants, configurations Spring
     Déploiement sur les serveurs d’application Java
     Protection de l’investissement
                                                        15
Grails : la “Big Picture”




                            16
Groovy, plus en détail




                 17
Pour commencer
Aller sur http://groovy.codehaus.org/Download
Télécharger la dernière version
  Groovy 1.5.7 — dernière version officielle
  Groovy 1.6-beta-2 — prochaine version en bêta
Dézipper l’archive dans un répertoire
Créer une variable d’environnement
  GROOVY_HOME pointant vers ce répertoire
Ajouter $GROOVY_HOME/bin au path

Vous êtes prêts !


                                                  18
En un coup d’oeil
Totalement Orienté Objet
Closures : bout de code réutilisable
Propriétés : pas besoin d’attendre Java 7 ou 8
Surcharge d’opérateurs : pas le cauchemar de C++
Syntaxe native pour les listes, maps, regex
Multi-méthodes
GPath : navigation à la XPath dans les graphes
Arithmétique en BigDecimal par défaut
Parenthèses et points-virgules optionnels
APIs : SQL, Ant, XML, templates, Swing, JMX, WS
Idéal pour les Domain-Specific Languages

                                                   19
Hello World en Java
public class HelloWorld {
     private String name;

     public void setName(String name) {
         this.name = name;
     }

     public String getName() {
         return name;
     }

     public String greet() {
         return quot;Hello quot;+ name;
     }

     public static void main(String[] args) {
         HelloWorld helloWorld = new HelloWorld();
         helloWorld.setName(quot;Groovyquot;);
         System.out.println( helloWorld.greet() );
     }
 }
                                                     20
Hello World en Groovy
public class HelloWorld {
     private String name;

     public void setName(String name) {
         this.name = name;
     }

     public String getName() {
         return name;
     }

     public String greet() {
         return quot;Hello quot;+ name;
     }

     public static void main(String[] args) {
         HelloWorld helloWorld = new HelloWorld();
         helloWorld.setName(quot;Groovyquot;);
         System.out.println( helloWorld.greet() );
     }
 }
                                                     21
Un peu plus Groovy

 class HelloWorld {
     String name
     String greet() { quot;Hello $namequot; }
 }

 def helloWorld = new HelloWorld(name: quot;Groovyquot;)
 println helloWorld.greet()




                                              22
Listes, maps, regex, ranges...
Listes
  def list = [“Groovy”, “Grails”]
Maps — dictionnaires
  def states = [CA: “California”, TX: “Texas”]
Expressions régulières
  assert “foo” ==~ /fo*/
Ranges
  def range = 1..10
Chaînes multilignes
  def multiligne = ””” plusieurs
   lignes ”””
GString : println “My name is $name”
                                           23
Les closures
Pas besoin d’attendre Java 7/8/9
Les closures
  block de code assignable et réutilisable
  combiner, stocker, partager données et logique

Exemples
   new File('x.txt').eachLine{ println it }
   [0, 1, 2].each { println it }

   def numbers = 1..100
   numbers.findAll { it > 90 }
   def odd = { it % 2 == 1 }
   numbers.findAll( odd )

   Thread.start { /* do something */ }
                                                   24
Interopérabilité avec Java
Groovy génère des .class — bytecode Java
  Mêmes chaînes de caractères et expressions régulières
  Mêmes APIs — JDK, collections, 3rd party
  Même modèle de sécurité, même threading
  Même modèle de programmation Orienté Objet
  Compilation “jointe”               JInterface GInterface


                                      <<implements>>   <<implements>>


                                        GClass            JClass




                                         JClass           GClass



                                                                25
Groovy 1.5
Groovy 1.0 (jan. 2007) et 1.5 (déc. 2007)
  performances, fonctionnalités dynamiques, outillage

Ajout de fonctionnalités Java 5
  annotations, generics
  enums, import static, varargs

Groovy
  Le seul langage dynamique alternatif pour la JVM qui
    supporte les spécificités Java 5
     EJB 3, JPA, TestNG, Hibernate annotations, Spring annotations
  Contribution de JBoss pour la mise au point

                                                               26
Groovy dans JBoss SEAM
Exemple pris de la documentation SEAM
 @Entity
 @Name(quot;hotelquot;)
 class Hotel implements Serializable {
     @Id @GeneratedValue
     Long id

     @Length(max=50) @NotNull
     String name

     @Override String toString() {
         quot;Hotel ${name}quot;
     }
 }
                                         27
Groovy 1.6
Release imminente de la version 1.6

Nouvelles fonctionnalités
  Performances améliorées
  Assignement multiple : def (a, b) = [1, “test”]
  Retour implicite dans if/else et try/catch
  Définitions d’annotations
  Transformation d’AST : @Lazy, @Delegate...
  MetaClass par instance pour les POJOs
  Grape, un système de packaging / dépendance
  Améliorations de la console Swing


                                                    28
Intégration IDE
       IntelliJ IDEA
             Eclipse
          NetBeans




             29
Outillé : IntelliJ IDEA




                          30
Outillé : Eclipse




                    31
Outillé : NetBeans




                     32
Quelques exemples d’API




                   33
Manipuler du XML
Avec ce bout d’XML
  def xml = quot;quot;quot;
    <languages>
      <language name=quot;Groovyquot;>
        <feature coolness=quot;lowquot;>SQL</feature>
        <feature coolness=quot;highquot;>Template</feature>
      </language>
      <language name=quot;Perlquot;/>
    </languages>quot;quot;quot;


Naviguer ce graphe XML
  def root = new XmlParser().parseText(xml)
    println root.language.feature[1].text()

    root.language.feature
        .findAll{ it['@coolness'] == quot;lowquot; }
             .each{ println it.text() }



                                                      34
Produire du XML
On peut également en produire facilement
  new MarkupBuilder().languages {
        language(name: quot;Groovyquot;) {
            feature(coolness: quot;lowquot;, quot;SQLquot;)
            feature(coolness: quot;highquot;, quot;Templatequot;)
        }
        language(name: quot;Perlquot;)
    }




                                                    35
Interfaces Swing
import javax.swing.WindowConstants as WC
   import groovy.swing.SwingBuilder
   def theMap = [color: quot;greenquot;, object: quot;pencilquot;]
       def swing = new SwingBuilder()
       def frame = swing.frame(
           title: 'A Groovy Swing', location: [240,240],
           defaultCloseOperation:WC.EXIT_ON_CLOSE) {
           panel {
           for (entry in theMap) {
                label(text: entry.key)
                textField(text: entry.value)
           }
           button(text: 'About', actionPerformed: {
                def pane = swing.optionPane(message: 'SwingBuilder')
                def dialog = pane.createDialog(null, 'About')
                dialog.show()
           })
           button(text:'Quit', actionPerformed:{ System.exit(0) })
       }
   }
   frame.pack()
   frame.show()



                                                                       36
Interfaces Swing
import javax.swing.WindowConstants as WC
   import groovy.swing.SwingBuilder
   def theMap = [color: quot;greenquot;, object: quot;pencilquot;]
       def swing = new SwingBuilder()
       def frame = swing.frame(
           title: 'A Groovy Swing', location: [240,240],
           defaultCloseOperation:WC.EXIT_ON_CLOSE) {
           panel {
           for (entry in theMap) {
                label(text: entry.key)
                textField(text: entry.value)
           }
           button(text: 'About', actionPerformed: {
                def pane = swing.optionPane(message: 'SwingBuilder')
                def dialog = pane.createDialog(null, 'About')
                dialog.show()
           })
           button(text:'Quit', actionPerformed:{ System.exit(0) })
       }
   }
   frame.pack()
   frame.show()



                                                                       36
Support JDBC et SQL
JDBC facile
  def sql = Sql.newInstance(url, usr, pwd, driver)
    sql.execute(quot;insert into table values ($foo, $bar)quot;)
    sql.execute(quot;insert into table values(?,?)quot;, [a, b])
    sql.eachRow(quot;select * from USERquot;) { print it.name }
    def list = sql.rows(quot;select * from USERquot;)


DataSet : Object Relational Mapping léger
  def set = sql.dataSet(quot;USERquot;)
    set.add(name: quot;Johnnyquot;, age: 33)
    set.each { user -> println user.name }
    set.findAll { it.age > 22 && it.age < 42 }




                                                           37
COM / ActiveX automation
Des souvenirs de VBScript ?
  def outlook = new
     ActiveXObject(quot;Outlook.Applicationquot;)

 def message = outlook.CreateItem(0)
 def emails = “glaforge@gmail.com”
 def rec =
    message.Recipients.add(emails)
 rec.Type = 1
 message.Display(true)



                                            38
Intégrer Groovy
dans une application Java




                     39
Pourquoi intégrer Groovy ?
Groovy est idéal pour le test unitaire
  mocks, stubs, GroovyTestCase
  tests plus concis et plus lisibles
Un outil pratique et utile dans son escarcelle

Externaliser la logique métier
  rêgles métier pouvant être écrites par les experts
  les rêgles peuvent suivre leur propre cycle de vie
Proposer des points d’extension
  pour des plugins additionels
  pour personnaliser une application selon les besoins du
    client
                                                       40
Quelques cas d’utilisation
Mutual of Omaha
  50K LOC, moitié code métier / moitié tests
  Calcul de risque de polices d’assurance
Le ministère de la Justice
  Approche MDA
  UML, XMI, templating et génération de code
EADS
  Interface de soumission de calcul distribué
Institutions financières
  Personnalisation d’outil de traders
  Gestion de “hedge funds” traitant des millions de dollars
CISCO, Institut américain du cancer...
                                                        41
Différents mécanismes
javax.script.* / JSR-223
Apache Bean Scripting Framework
  vieillisant : préférer JSR-223 ou mécanismes Groovy

Spring : support de Groovy intégré
  <lang:groovy id=’bean’ script-source=’...’/>

Mécanismes spécifiques de Groovy
  Eval, GroovyShell, GroovyClassLoader,
   GroovyScriptEngine



                                                        42
JDK 6 : javax.script.* /
API de scripting agnostique pour s’intégrer à des
  langages différents de Java
scripting.dev.java.net propose un moteur de script
  enrobant Groovy
  Ajouter les jars sur le classpath et c’est parti !

Exemple :
  ScriptEngineManager manager =
            new ScriptEngineManager();
    ScriptEngine gEngine =
            manager.getEngineByName(quot;groovyquot;);
    String result = (String) gEngine.eval(quot;’Foo’ * 2quot;);




                                                          43
Intégration Spring 2.x
Depuis Spring 2.0, ajout d’un namespace spécial
 pour les langages alternatifs
  pour la configuration / définitions de beans
  on peut injecter un POJO dans un POGO et vice versa
     mélange complètement transparent de Groovy et Java !

Exemple :
  <lang:groovy id=quot;eventsquot;
        script-source=quot;classpath:dsl/eventsChart.groovyquot;
        customizer-ref=quot;eventsMetaClassquot; />




                                                            44
Mécanismes Groovy
Groovy peut-être compilé ou “interprété”
  Compiler en .class et mettre dans un JAR

Mais Groovy offre différents mécanismes pour
 intégrer du code Groovy à la volée (“interpreté”)
  Eval
     pour évaluer des expressions simples
  GroovyShell
     similaire à l’API javax.script
  GroovyScriptEngine
     pour des scripts interdépendants avec rechargement sur modif.
  GroovyClassLoader
     pour les utilisations plus avancées, avec manipulation d’AST...
                                                                  45
Les Domain-Specific
        Languages




               46
Qu’est-ce qu’un DSL ?
DSL : un “Domain-Specific Language”
  parfois appelé “little language”

Wikipedia
  “A DSL is a programming language designed to be
    useful for a specific set of tasks”

C’est un langage qui modèlise un certain domaine de
  connaissance ou d’expertise, où les concepts du
  domaine sont rattachés aux éléments du langage


                                                    47
Caractéristiques d’un DSL
Un Domain-Specific Language est
  un langage
     qui n’est pas nécessairement Turing complet
  qui couvre un certain domaine de connaissance
  qui a une forme
     textuelle ou visuelle
  qui produit au final un résultat
     configure des objets, représente des données, une notation
  qui peut être interne ou externe
     Embedded DSL se reposant sur un langage hôte
     ou indépendant — avec un lexer / parser maison
  qui a certaines propriétés qualitatives
     facilité d’écriture, utilisable, testabilité, extensible

                                                                  48
Exemples de DSLs
Technique
  SELECT * FROM USER WHERE NAME LIKE ‘Guil%’
  ^[w-.]+@([w-]+.)+[w-]{2,4}$
Notations
  1. e4 e5 2. Nf3 Nc6 3. Bb5 a6
  U R’ U2 R U R’ U R
Langages plus “métier”
  Description des rêgles de calcul de risque sur des
   polices d’assurance
  Rêgle comptables d’une banque
  Description de facturation, de calcul de gestion de fonds
   des particularités techniques d’un produit...

                                                       49
Pourquoi créer un DSL ?
Utiliser un langage plus expressif qu’un langage de
  programmation généraliste
Partager une métaphore commune entre
  développeurs et experts métier
Mettre à contribution les experts métier pour le
  développement de la logique métier
Eviter de noyer le code métier dans du code
  technique sans intérêt
Séparer proprement la logique métier du code
  applicatif technique


                                                50
Syntaxes et fonctionnalités
Parenthèses optionnelles, map, propriété sur les
 entiers
  move left
  compare indicator: ‘Nikei’, withFund: ‘Aberdeen’
  account.debit amount: 30.euros, in: 3.days
Structures de contrôle personnalisées à base de
  closures
  unless ( account.balance < 0 ) {
        account.debit 10.dollars
    }
  execute( withTimeOutOf: 50.seconds ) { ... }
Surcharge d’opérateurs
  a + b équivalent à a.plus(b)
  taskA | taskB equivalent à taskA.or(taskB)

                                                     51
Conclusion




      52
Pour finir...
Langage dynamique parfaitement intégré avec
  l’environnement Java
Simplifie la vie des développeurs
Perspectives intéressantes pour étendre une
  application existante
Parfait pour les Domain-Specific Languages
Propose un framework de développement Web
  intégré réutilisant l’état de l’art OSS
Protège son investissement
  en compétences, en développements existants en
    matériel, et en logiciel

                                                   53
Questions / Réponses
        glaforge@gmail.com




                    54

Contenu connexe

Tendances

Tendances (20)

Incorporer du C dans R, créer son package
Incorporer du C dans R, créer son packageIncorporer du C dans R, créer son package
Incorporer du C dans R, créer son package
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
The Future of Javascript
The Future of JavascriptThe Future of Javascript
The Future of Javascript
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Gradle_BordeauxJUG
Gradle_BordeauxJUGGradle_BordeauxJUG
Gradle_BordeauxJUG
 
Outils de gestion de projets
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projets
 
Gradle_Paris2010
Gradle_Paris2010Gradle_Paris2010
Gradle_Paris2010
 
TypeScript for dummies
TypeScript for dummiesTypeScript for dummies
TypeScript for dummies
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage Go
 
Gradle_ToulouseJUG
Gradle_ToulouseJUGGradle_ToulouseJUG
Gradle_ToulouseJUG
 
Gradle_BreizJUG
Gradle_BreizJUGGradle_BreizJUG
Gradle_BreizJUG
 
Introdot Netc Sharp Fr
Introdot Netc Sharp FrIntrodot Netc Sharp Fr
Introdot Netc Sharp Fr
 
Gradle_NormandyJUG
Gradle_NormandyJUGGradle_NormandyJUG
Gradle_NormandyJUG
 
Bbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic searchBbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic search
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
Android NDK
Android   NDKAndroid   NDK
Android NDK
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 Overview
 
Présentation1
Présentation1Présentation1
Présentation1
 
Gradle_LyonJUG
Gradle_LyonJUGGradle_LyonJUG
Gradle_LyonJUG
 
Java scripting api
Java scripting apiJava scripting api
Java scripting api
 

En vedette

Uniform motion powerpoint presentation
Uniform motion powerpoint presentationUniform motion powerpoint presentation
Uniform motion powerpoint presentationAndy Richards
 
4 ir be-dimensionnement_interface_radio_2012_v3
4 ir be-dimensionnement_interface_radio_2012_v34 ir be-dimensionnement_interface_radio_2012_v3
4 ir be-dimensionnement_interface_radio_2012_v3Gilles Samba
 
14 digestion absorption-_glucides__proteines
14 digestion absorption-_glucides__proteines14 digestion absorption-_glucides__proteines
14 digestion absorption-_glucides__proteinesazazel861
 
Engaging Learners with Technology
Engaging Learners with TechnologyEngaging Learners with Technology
Engaging Learners with TechnologyDean Shareski
 
Brand review sur la location de voitures
Brand review sur la location de voituresBrand review sur la location de voitures
Brand review sur la location de voituresanne-k
 
Les enjeux du numérique à l'Ecole (mars 2014)
Les enjeux du numérique à l'Ecole (mars 2014)Les enjeux du numérique à l'Ecole (mars 2014)
Les enjeux du numérique à l'Ecole (mars 2014)Elie ALLOUCHE
 
Presentation Belle De Mai
Presentation Belle De MaiPresentation Belle De Mai
Presentation Belle De MaiPierre Casanova
 
Certification nationale A2-B1 d'allemand session 2016
Certification nationale A2-B1 d'allemand session 2016Certification nationale A2-B1 d'allemand session 2016
Certification nationale A2-B1 d'allemand session 2016Jean-Marc Dubois
 
Carton packaging wikipedia
Carton packaging wikipediaCarton packaging wikipedia
Carton packaging wikipediaAlex Xiao
 
Les marques vont elles devenir les premiers médias ?
Les marques vont elles devenir les premiers médias ?Les marques vont elles devenir les premiers médias ?
Les marques vont elles devenir les premiers médias ?LaNetscouade
 
Journée Agilité à Ei.Cesi (17 avril 2013)
Journée Agilité à Ei.Cesi (17 avril 2013)Journée Agilité à Ei.Cesi (17 avril 2013)
Journée Agilité à Ei.Cesi (17 avril 2013)Fabrice Aimetti
 
5 Steps To Effective Jad Sessions
5 Steps To Effective Jad Sessions5 Steps To Effective Jad Sessions
5 Steps To Effective Jad SessionsLizLavaveshkul
 
2013 Guide IDEAS des bonnes pratiques
2013 Guide IDEAS des bonnes pratiques2013 Guide IDEAS des bonnes pratiques
2013 Guide IDEAS des bonnes pratiquesAsso Asah
 

En vedette (20)

Uniform motion powerpoint presentation
Uniform motion powerpoint presentationUniform motion powerpoint presentation
Uniform motion powerpoint presentation
 
4 ir be-dimensionnement_interface_radio_2012_v3
4 ir be-dimensionnement_interface_radio_2012_v34 ir be-dimensionnement_interface_radio_2012_v3
4 ir be-dimensionnement_interface_radio_2012_v3
 
14 digestion absorption-_glucides__proteines
14 digestion absorption-_glucides__proteines14 digestion absorption-_glucides__proteines
14 digestion absorption-_glucides__proteines
 
Soft tissue tumor
Soft tissue tumorSoft tissue tumor
Soft tissue tumor
 
J2 me
J2 meJ2 me
J2 me
 
Engaging Learners with Technology
Engaging Learners with TechnologyEngaging Learners with Technology
Engaging Learners with Technology
 
Base des données réparties
Base des données répartiesBase des données réparties
Base des données réparties
 
Brand review sur la location de voitures
Brand review sur la location de voituresBrand review sur la location de voitures
Brand review sur la location de voitures
 
Les enjeux du numérique à l'Ecole (mars 2014)
Les enjeux du numérique à l'Ecole (mars 2014)Les enjeux du numérique à l'Ecole (mars 2014)
Les enjeux du numérique à l'Ecole (mars 2014)
 
Presentation Belle De Mai
Presentation Belle De MaiPresentation Belle De Mai
Presentation Belle De Mai
 
Propriété intellectuelle nov 2012
Propriété intellectuelle nov 2012Propriété intellectuelle nov 2012
Propriété intellectuelle nov 2012
 
Certification nationale A2-B1 d'allemand session 2016
Certification nationale A2-B1 d'allemand session 2016Certification nationale A2-B1 d'allemand session 2016
Certification nationale A2-B1 d'allemand session 2016
 
Roi d’une campagne efficace
Roi d’une campagne efficaceRoi d’une campagne efficace
Roi d’une campagne efficace
 
Carton packaging wikipedia
Carton packaging wikipediaCarton packaging wikipedia
Carton packaging wikipedia
 
Les marques vont elles devenir les premiers médias ?
Les marques vont elles devenir les premiers médias ?Les marques vont elles devenir les premiers médias ?
Les marques vont elles devenir les premiers médias ?
 
Linen & laundry service
Linen & laundry serviceLinen & laundry service
Linen & laundry service
 
Journée Agilité à Ei.Cesi (17 avril 2013)
Journée Agilité à Ei.Cesi (17 avril 2013)Journée Agilité à Ei.Cesi (17 avril 2013)
Journée Agilité à Ei.Cesi (17 avril 2013)
 
100 esl-games
100 esl-games100 esl-games
100 esl-games
 
5 Steps To Effective Jad Sessions
5 Steps To Effective Jad Sessions5 Steps To Effective Jad Sessions
5 Steps To Effective Jad Sessions
 
2013 Guide IDEAS des bonnes pratiques
2013 Guide IDEAS des bonnes pratiques2013 Guide IDEAS des bonnes pratiques
2013 Guide IDEAS des bonnes pratiques
 

Similaire à Introduction à Groovy - OpenSource eXchange 2008

Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation GroovyJS Bournival
 
Grails from scratch to prod - MixIT 2010
Grails from scratch to prod - MixIT 2010Grails from scratch to prod - MixIT 2010
Grails from scratch to prod - MixIT 2010Aurélien Maury
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Aurélien Maury
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Jean-Michel Doudoux
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfJean-Michel Doudoux
 
Présentation DevoxxFR 2015 sur GWT
Présentation DevoxxFR 2015 sur GWTPrésentation DevoxxFR 2015 sur GWT
Présentation DevoxxFR 2015 sur GWTDNG Consulting
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflineDNG Consulting
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Jean-Michel Doudoux
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Jean-Michel Doudoux
 
Lyon JUG 2018 - Java le changement c'est maintenant
Lyon JUG 2018 - Java le changement c'est maintenantLyon JUG 2018 - Java le changement c'est maintenant
Lyon JUG 2018 - Java le changement c'est maintenantJean-Michel Doudoux
 
ENIB 2013-2014 - CAI Web #3: Groovy
ENIB 2013-2014 - CAI Web #3: GroovyENIB 2013-2014 - CAI Web #3: Groovy
ENIB 2013-2014 - CAI Web #3: GroovyHoracio Gonzalez
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Jean-Michel Doudoux
 

Similaire à Introduction à Groovy - OpenSource eXchange 2008 (20)

Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Grails from scratch to prod - MixIT 2010
Grails from scratch to prod - MixIT 2010Grails from scratch to prod - MixIT 2010
Grails from scratch to prod - MixIT 2010
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
Javavs net
Javavs netJavavs net
Javavs net
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
 
Présentation DevoxxFR 2015 sur GWT
Présentation DevoxxFR 2015 sur GWTPrésentation DevoxxFR 2015 sur GWT
Présentation DevoxxFR 2015 sur GWT
 
Devoxx fr
Devoxx frDevoxx fr
Devoxx fr
 
Drools
DroolsDrools
Drools
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'Offline
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
 
Tutoriel java
Tutoriel javaTutoriel java
Tutoriel java
 
Lyon JUG 2018 - Java le changement c'est maintenant
Lyon JUG 2018 - Java le changement c'est maintenantLyon JUG 2018 - Java le changement c'est maintenant
Lyon JUG 2018 - Java le changement c'est maintenant
 
ENIB 2013-2014 - CAI Web #3: Groovy
ENIB 2013-2014 - CAI Web #3: GroovyENIB 2013-2014 - CAI Web #3: Groovy
ENIB 2013-2014 - CAI Web #3: Groovy
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
gradle_lavajug
gradle_lavajuggradle_lavajug
gradle_lavajug
 
UKO-JAVA1001-slides
UKO-JAVA1001-slidesUKO-JAVA1001-slides
UKO-JAVA1001-slides
 

Plus de Guillaume Laforge

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Guillaume Laforge
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Guillaume Laforge
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Guillaume Laforge
 
Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Guillaume Laforge
 
Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Guillaume Laforge
 
Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Guillaume Laforge
 
Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Guillaume Laforge
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Guillaume Laforge
 
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGroovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGuillaume Laforge
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGuillaume Laforge
 
Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Guillaume Laforge
 
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Guillaume Laforge
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Guillaume Laforge
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Guillaume Laforge
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Guillaume Laforge
 

Plus de Guillaume Laforge (20)

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
Groovy 2 and beyond
Groovy 2 and beyondGroovy 2 and beyond
Groovy 2 and beyond
 
Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012
 
Groovy 2.0 webinar
Groovy 2.0 webinarGroovy 2.0 webinar
Groovy 2.0 webinar
 
Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012
 
Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012
 
JavaOne 2012 Groovy update
JavaOne 2012 Groovy updateJavaOne 2012 Groovy update
JavaOne 2012 Groovy update
 
Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
 
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGroovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific Languages
 
Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012
 
Whats new in Groovy 2.0?
Whats new in Groovy 2.0?Whats new in Groovy 2.0?
Whats new in Groovy 2.0?
 
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
 
Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
 

Introduction à Groovy - OpenSource eXchange 2008

  • 1. Introduction à Groovy Un langage dynamique pour la JVM 1
  • 2. Guillaume Laforge Chef de projet de Groovy Spec Lead du JSR-241 Initiateur du framework Grails Co-auteur de “Groovy in Action” Fondateur de G2One, Inc.
  • 4. 4
  • 7. Ce que cela va apporter Plus de visibilité pour Groovy et Grails L’équipe Eclipse de SpringSource travaillera sur le plugin Eclipse pour Groovy et Grails Une collaboration plus proche et cross-pollinisation de Grails, Spring, Spring MVC / WebFlow Une intégration plus poussée de Groovy dans les produits du portfolio SpringSource 6
  • 8. Objectifs DECOUVRIR : Qu’est-ce que Groovy ? Le framework web Grails Domain-Specific Language 7
  • 9. Agenda Qu’est-ce que Groovy ? Et qu’est-ce que Grails ? Groovy en détail Sa syntaxe et ses APIs Les nouveautés de Groovy 1.5 et 1.6 Cas d’utilisation de Groovy Domain-Specific Languages 8
  • 11. Décortiquons Groovy Groovy est un langage dynamique pour la machine virtuelle Java Langage dynamique Inspiration provenant de langages existants Java pour la syntaxe générale — facile à apprendre Groovy est un langage Orienté Objet Ruby et Smalltalk pour les closures, les aspects de programmation fonctionnelle Machine virtuelle Java Peut être interprété ou compilé Au final : du bytecode Java est généré 10
  • 12. Un projet Open Source Open Source : sous licence Apache Hébergé chez Codehaus Mature : plus de 5 ans, version 1.5.7 et 1.6-beta-2 Une petite vingtaine de committers Un grand succès 32K-37K downloads / mois comparé à ~30K pour JRuby, ~7K pour Jython et ~5K pour Scala Mailing-listes les plus actives — milliers d’abonnés En cours de standardisation Au sein du Java Community Process JSR-241 — Java Specification Request 11
  • 13. Intégré partout ! Groovy est intégré... Dans d’autres projets Open Source Spring, JBoss SEAM, ServiceMix, Oracle OC4J, Mule... Dans des applications métier critiques Mutual of Omaha — US Fortune 500 National Cancer Institute Dans des produits commerciaux IBM ProjectZero SAP Composition on Grails Oracle Data Integrator Oracle Fusion — ADF Business Components 12
  • 14. Un projet innovant reconnu 40 propositions, 10 nominés Groovy a gagné le premier prix Le projet le plus créatif et innovant de 2007 Donnation de 10 000 € Gagnant en 2006 et 2008 Spring et Grails 13
  • 15. Une pléthore de livres... 14
  • 16. Qu’est-ce que Grails ? Grails est un framework de développement d’applications Web Inspiré par Ruby on Rails, Django, TurboGears Mais s’appuyant sur des briques Open Source reconnues et éprouvées Spring, Hibernate, Quartz, SiteMesh... Avantages Facile à prendre en main — Conventions over Config. Réutilisation de l’existant Schémas de base existants, configurations Spring Déploiement sur les serveurs d’application Java Protection de l’investissement 15
  • 17. Grails : la “Big Picture” 16
  • 18. Groovy, plus en détail 17
  • 19. Pour commencer Aller sur http://groovy.codehaus.org/Download Télécharger la dernière version Groovy 1.5.7 — dernière version officielle Groovy 1.6-beta-2 — prochaine version en bêta Dézipper l’archive dans un répertoire Créer une variable d’environnement GROOVY_HOME pointant vers ce répertoire Ajouter $GROOVY_HOME/bin au path Vous êtes prêts ! 18
  • 20. En un coup d’oeil Totalement Orienté Objet Closures : bout de code réutilisable Propriétés : pas besoin d’attendre Java 7 ou 8 Surcharge d’opérateurs : pas le cauchemar de C++ Syntaxe native pour les listes, maps, regex Multi-méthodes GPath : navigation à la XPath dans les graphes Arithmétique en BigDecimal par défaut Parenthèses et points-virgules optionnels APIs : SQL, Ant, XML, templates, Swing, JMX, WS Idéal pour les Domain-Specific Languages 19
  • 21. Hello World en Java public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return quot;Hello quot;+ name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName(quot;Groovyquot;); System.out.println( helloWorld.greet() ); } } 20
  • 22. Hello World en Groovy public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return quot;Hello quot;+ name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName(quot;Groovyquot;); System.out.println( helloWorld.greet() ); } } 21
  • 23. Un peu plus Groovy class HelloWorld { String name String greet() { quot;Hello $namequot; } } def helloWorld = new HelloWorld(name: quot;Groovyquot;) println helloWorld.greet() 22
  • 24. Listes, maps, regex, ranges... Listes def list = [“Groovy”, “Grails”] Maps — dictionnaires def states = [CA: “California”, TX: “Texas”] Expressions régulières assert “foo” ==~ /fo*/ Ranges def range = 1..10 Chaînes multilignes def multiligne = ””” plusieurs lignes ””” GString : println “My name is $name” 23
  • 25. Les closures Pas besoin d’attendre Java 7/8/9 Les closures block de code assignable et réutilisable combiner, stocker, partager données et logique Exemples new File('x.txt').eachLine{ println it } [0, 1, 2].each { println it } def numbers = 1..100 numbers.findAll { it > 90 } def odd = { it % 2 == 1 } numbers.findAll( odd ) Thread.start { /* do something */ } 24
  • 26. Interopérabilité avec Java Groovy génère des .class — bytecode Java Mêmes chaînes de caractères et expressions régulières Mêmes APIs — JDK, collections, 3rd party Même modèle de sécurité, même threading Même modèle de programmation Orienté Objet Compilation “jointe” JInterface GInterface <<implements>> <<implements>> GClass JClass JClass GClass 25
  • 27. Groovy 1.5 Groovy 1.0 (jan. 2007) et 1.5 (déc. 2007) performances, fonctionnalités dynamiques, outillage Ajout de fonctionnalités Java 5 annotations, generics enums, import static, varargs Groovy Le seul langage dynamique alternatif pour la JVM qui supporte les spécificités Java 5 EJB 3, JPA, TestNG, Hibernate annotations, Spring annotations Contribution de JBoss pour la mise au point 26
  • 28. Groovy dans JBoss SEAM Exemple pris de la documentation SEAM @Entity @Name(quot;hotelquot;) class Hotel implements Serializable { @Id @GeneratedValue Long id @Length(max=50) @NotNull String name @Override String toString() { quot;Hotel ${name}quot; } } 27
  • 29. Groovy 1.6 Release imminente de la version 1.6 Nouvelles fonctionnalités Performances améliorées Assignement multiple : def (a, b) = [1, “test”] Retour implicite dans if/else et try/catch Définitions d’annotations Transformation d’AST : @Lazy, @Delegate... MetaClass par instance pour les POJOs Grape, un système de packaging / dépendance Améliorations de la console Swing 28
  • 30. Intégration IDE IntelliJ IDEA Eclipse NetBeans 29
  • 35. Manipuler du XML Avec ce bout d’XML def xml = quot;quot;quot; <languages> <language name=quot;Groovyquot;> <feature coolness=quot;lowquot;>SQL</feature> <feature coolness=quot;highquot;>Template</feature> </language> <language name=quot;Perlquot;/> </languages>quot;quot;quot; Naviguer ce graphe XML def root = new XmlParser().parseText(xml) println root.language.feature[1].text() root.language.feature .findAll{ it['@coolness'] == quot;lowquot; } .each{ println it.text() } 34
  • 36. Produire du XML On peut également en produire facilement new MarkupBuilder().languages { language(name: quot;Groovyquot;) { feature(coolness: quot;lowquot;, quot;SQLquot;) feature(coolness: quot;highquot;, quot;Templatequot;) } language(name: quot;Perlquot;) } 35
  • 37. Interfaces Swing import javax.swing.WindowConstants as WC import groovy.swing.SwingBuilder def theMap = [color: quot;greenquot;, object: quot;pencilquot;] def swing = new SwingBuilder() def frame = swing.frame( title: 'A Groovy Swing', location: [240,240], defaultCloseOperation:WC.EXIT_ON_CLOSE) { panel { for (entry in theMap) { label(text: entry.key) textField(text: entry.value) } button(text: 'About', actionPerformed: { def pane = swing.optionPane(message: 'SwingBuilder') def dialog = pane.createDialog(null, 'About') dialog.show() }) button(text:'Quit', actionPerformed:{ System.exit(0) }) } } frame.pack() frame.show() 36
  • 38. Interfaces Swing import javax.swing.WindowConstants as WC import groovy.swing.SwingBuilder def theMap = [color: quot;greenquot;, object: quot;pencilquot;] def swing = new SwingBuilder() def frame = swing.frame( title: 'A Groovy Swing', location: [240,240], defaultCloseOperation:WC.EXIT_ON_CLOSE) { panel { for (entry in theMap) { label(text: entry.key) textField(text: entry.value) } button(text: 'About', actionPerformed: { def pane = swing.optionPane(message: 'SwingBuilder') def dialog = pane.createDialog(null, 'About') dialog.show() }) button(text:'Quit', actionPerformed:{ System.exit(0) }) } } frame.pack() frame.show() 36
  • 39. Support JDBC et SQL JDBC facile def sql = Sql.newInstance(url, usr, pwd, driver) sql.execute(quot;insert into table values ($foo, $bar)quot;) sql.execute(quot;insert into table values(?,?)quot;, [a, b]) sql.eachRow(quot;select * from USERquot;) { print it.name } def list = sql.rows(quot;select * from USERquot;) DataSet : Object Relational Mapping léger def set = sql.dataSet(quot;USERquot;) set.add(name: quot;Johnnyquot;, age: 33) set.each { user -> println user.name } set.findAll { it.age > 22 && it.age < 42 } 37
  • 40. COM / ActiveX automation Des souvenirs de VBScript ? def outlook = new ActiveXObject(quot;Outlook.Applicationquot;) def message = outlook.CreateItem(0) def emails = “glaforge@gmail.com” def rec = message.Recipients.add(emails) rec.Type = 1 message.Display(true) 38
  • 41. Intégrer Groovy dans une application Java 39
  • 42. Pourquoi intégrer Groovy ? Groovy est idéal pour le test unitaire mocks, stubs, GroovyTestCase tests plus concis et plus lisibles Un outil pratique et utile dans son escarcelle Externaliser la logique métier rêgles métier pouvant être écrites par les experts les rêgles peuvent suivre leur propre cycle de vie Proposer des points d’extension pour des plugins additionels pour personnaliser une application selon les besoins du client 40
  • 43. Quelques cas d’utilisation Mutual of Omaha 50K LOC, moitié code métier / moitié tests Calcul de risque de polices d’assurance Le ministère de la Justice Approche MDA UML, XMI, templating et génération de code EADS Interface de soumission de calcul distribué Institutions financières Personnalisation d’outil de traders Gestion de “hedge funds” traitant des millions de dollars CISCO, Institut américain du cancer... 41
  • 44. Différents mécanismes javax.script.* / JSR-223 Apache Bean Scripting Framework vieillisant : préférer JSR-223 ou mécanismes Groovy Spring : support de Groovy intégré <lang:groovy id=’bean’ script-source=’...’/> Mécanismes spécifiques de Groovy Eval, GroovyShell, GroovyClassLoader, GroovyScriptEngine 42
  • 45. JDK 6 : javax.script.* / API de scripting agnostique pour s’intégrer à des langages différents de Java scripting.dev.java.net propose un moteur de script enrobant Groovy Ajouter les jars sur le classpath et c’est parti ! Exemple : ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine gEngine = manager.getEngineByName(quot;groovyquot;); String result = (String) gEngine.eval(quot;’Foo’ * 2quot;); 43
  • 46. Intégration Spring 2.x Depuis Spring 2.0, ajout d’un namespace spécial pour les langages alternatifs pour la configuration / définitions de beans on peut injecter un POJO dans un POGO et vice versa mélange complètement transparent de Groovy et Java ! Exemple : <lang:groovy id=quot;eventsquot; script-source=quot;classpath:dsl/eventsChart.groovyquot; customizer-ref=quot;eventsMetaClassquot; /> 44
  • 47. Mécanismes Groovy Groovy peut-être compilé ou “interprété” Compiler en .class et mettre dans un JAR Mais Groovy offre différents mécanismes pour intégrer du code Groovy à la volée (“interpreté”) Eval pour évaluer des expressions simples GroovyShell similaire à l’API javax.script GroovyScriptEngine pour des scripts interdépendants avec rechargement sur modif. GroovyClassLoader pour les utilisations plus avancées, avec manipulation d’AST... 45
  • 48. Les Domain-Specific Languages 46
  • 49. Qu’est-ce qu’un DSL ? DSL : un “Domain-Specific Language” parfois appelé “little language” Wikipedia “A DSL is a programming language designed to be useful for a specific set of tasks” C’est un langage qui modèlise un certain domaine de connaissance ou d’expertise, où les concepts du domaine sont rattachés aux éléments du langage 47
  • 50. Caractéristiques d’un DSL Un Domain-Specific Language est un langage qui n’est pas nécessairement Turing complet qui couvre un certain domaine de connaissance qui a une forme textuelle ou visuelle qui produit au final un résultat configure des objets, représente des données, une notation qui peut être interne ou externe Embedded DSL se reposant sur un langage hôte ou indépendant — avec un lexer / parser maison qui a certaines propriétés qualitatives facilité d’écriture, utilisable, testabilité, extensible 48
  • 51. Exemples de DSLs Technique SELECT * FROM USER WHERE NAME LIKE ‘Guil%’ ^[w-.]+@([w-]+.)+[w-]{2,4}$ Notations 1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 U R’ U2 R U R’ U R Langages plus “métier” Description des rêgles de calcul de risque sur des polices d’assurance Rêgle comptables d’une banque Description de facturation, de calcul de gestion de fonds des particularités techniques d’un produit... 49
  • 52. Pourquoi créer un DSL ? Utiliser un langage plus expressif qu’un langage de programmation généraliste Partager une métaphore commune entre développeurs et experts métier Mettre à contribution les experts métier pour le développement de la logique métier Eviter de noyer le code métier dans du code technique sans intérêt Séparer proprement la logique métier du code applicatif technique 50
  • 53. Syntaxes et fonctionnalités Parenthèses optionnelles, map, propriété sur les entiers move left compare indicator: ‘Nikei’, withFund: ‘Aberdeen’ account.debit amount: 30.euros, in: 3.days Structures de contrôle personnalisées à base de closures unless ( account.balance < 0 ) { account.debit 10.dollars } execute( withTimeOutOf: 50.seconds ) { ... } Surcharge d’opérateurs a + b équivalent à a.plus(b) taskA | taskB equivalent à taskA.or(taskB) 51
  • 55. Pour finir... Langage dynamique parfaitement intégré avec l’environnement Java Simplifie la vie des développeurs Perspectives intéressantes pour étendre une application existante Parfait pour les Domain-Specific Languages Propose un framework de développement Web intégré réutilisant l’état de l’art OSS Protège son investissement en compétences, en développements existants en matériel, et en logiciel 53
  • 56. Questions / Réponses glaforge@gmail.com 54