Groovy
Qui je suis? J’ai inventé Groovy J’entretiens une relation extraconjugale avec Guillaume Laforge J’ai écrit un super bouquin sur Groovy Je siège sur l’ expert group  de la JSR-241 Je suis  committer  sur Groovy Jean-Sébastien Bournival Architecte de systèmes Nurun Mon blog:  http ://js.jipiju.com
Agenda PARTIE I – Introduction Origines et principes de base PARTIE II - Qu'est ce que Groovy? Comment se décline ce langage PARTIE III - Que fait-on avec Groovy? Applications concrètes du langage PARTIE IV – Conclusion Références, questions
Partie 1:  Introduction Origines et principes de base
Introduction Précision importante Groovy == langage de programmation Grails == framework de développement web utilisant Groovy
Introduction Manifeste Groovy est un langage de programmation dynamique et agile pour la machine virtuelle Java (JVM) « Groovy is Java »   Graeme Rocher Grails project lead Groovy Java Java Virtual Machine bytecode
Historique Personnel 2003 James Strachan,  le fondateur 2004 Guillaume Laforge,  le récupérateur 2007 G2One,  le catalyseur JSR 241 Supportée par IBM, Oracle, Sun, ASF, ThoughtWorks
Installation Environnement $JAVA_HOME $GROOVY_HOME $PATH = $PATH;$GROOVY_HOME\bin;$JAVA_HOME\bin ~/.groovy/lib Outils Interpréteur (groovy.sh) Shell (groovysh.sh) Console Swing (groovyConsole.sh)
Anatomie d’un script // monScript.groovy //  def maVariable = 3 def uneClosure = {  it * it } println ‘Bonjour monde!’ L’instruction return est optionnelle Packages importés par défaut: groovy.lang.* groovy.util.* java.lang.* java.util.* java.io.* java.net.* Java.math.BigDecimal Java.math.BigInteger Le point virgule et les paranthèses sont  optionnels System.out est implicite Ce script ne contient pas de classe:  lors de l’exécution, il sera enrobé dans la méthode run() d’un objet de type  Script
Partie 2:  Qu’est-ce que Groovy? Survol du langage
Type de données de base Tout est  Objet   (pour vrai de vrai cette fois-ci!) pas de type primitif typage dynamique (ou pas) autoboxing méthode java qui prend un int en paramètre l’opérateur ‘==‘ veut dire equals() … pour tout le monde, pour l’identité, il faut utiliser la méthode is()
Types de données de base Strings java.lang.String ‘’ groovy.lang.GString “” Aussi Slashy // Triple quote ‘’’ et “””
Expressions régulières Sucre syntaxique par-dessus: java.util.regex.Matcher / Pattern Opérateurs ‘~’ ‘=~’ et ‘==~’ // java.util.regex.Pattern def pattern = ~/.ou/ // java.util.regex.Matcher def matcher = ('hibou pou chou genou' =~ pattern) assert matcher.size() == 4 assert  'hibou' ==~ /.*ou/
Structures de contrôle La vérité, rien que la vérité … true == références objets non-nulle true == list/map non-vide true == string non-vide true == un  matcher  ayant un  match true == Valeur numérique différente de zéro true == true (la valeur booléenne) Aussi: l’instruction if () == celle de Java idem pour les try {…} catch() {…}
Structures de contrôle (2) Boucler le while( expr ) est identique à celui de Java pas de do {…} while ( expr ) en Groovy for ( variable  in  iterable ) {  instr  } def matcher = '12xy5' =~ /\d/ for (match in matcher) { println match } def myString = 'Saku Koivu' for (i in 0..<myString.size()) { ... }
Structures de contrôle (3) Un  switch  beaucoup plus puissant qu’en Java : switch (x) { case 7:  println &quot;7&quot;;  break;  case 2.3:  println &quot;2.3&quot;;  break; case &quot;dog&quot;:  println &quot;dog&quot;;  break; case [1, 2, 'alf']:  println &quot;in list&quot;;  break; case (3..6):  println &quot;in range&quot;;  break; case Integer:  println &quot;Integer&quot;;  break; case ~&quot;ca.*&quot;:  println &quot;regex&quot;;  break; }
GDK Plusieurs types de Java deviennent plus  Groovy ! java.io.File: eachLine (Closure closure) eachFile (Closure closure) java.util.Date: minus(int days) plus(int days) java.lang.String: toURL() java.util.Collection: count(Object value) find(Closure closure) findAll(Closure closure)
Support natif des collections Les listes opérateur  subscript  [] =  getAt()/putAt() opérateur  Spread  *. permet l’utilisation d’index négatifs def  sakuList = [] sakuList = ['fi','en'] sakuList << 'fr' assert sakuList instanceof java.util.List
Support natif des collections (2) Les  maps permet la syntaxe .dot sur les clés utilisation de valeur par défaut def sakuMap = [:] sakuMap = [ 'team':'mtl', 'goals':12, 'languages':['fi', 'en'] ] println sakuMap.team assert sakuMap instanceof java.util.Map
Support natif des collections (3) Les  ranges une liste de valeurs séquentielles opérateur .. et ..< utilisation: boucles,  switch , et  closures def range = 5..8 assert range.size() == 4 for (i in range) { println &quot;Hello ${i}&quot; }
Closures Wikipedia « In computer science, a closure is a function that is evaluated in an environment containing one or more bound variables. When called, the function can access these variables. The explicit use of closures is associated with functional programming and with languages such as ML and Lisp.» Fonction Lambda de Lisp. (define (derivative f dx) (lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))
Closures (2) En Groovy Une &quot;closure&quot; c'est un bout de code: assigné à une variable ou anonyme exécuté ultérieurement de type groovy.lang.Closure Utilisation typique List (.each()) File (.eachLine(), .eachFile()) …
Programmation objet Identique à Java … sauf: les  inner class  ne sont pas supportées le scope par défaut des classes/méthodes/attributs est  public paramètres positionnels, et   nommés surcharge d’opérateurs permise safe dereferencing operator  ‘?.’
Programmation objet GroovyBeans Ajoute au formalisme des JavaBeans get/set sous-entendu pour préserver l’encapsulation opérateur @ Expando, ou un GroovyBean « vierge » ajout dynamique d’attributs et méthodes ( closures )
Programmation  META  objet Sous le capot de Groovy: toutes les classes ont une méta-classe une méta-classe permet, entre autres, d’intercepter des appels à des méthodes inexistantes  classe méta-classe appel de methode()
Partie 3:  Que fait-on avec Groovy? Applications concrètes du langage
Builders Principes basés sur le célèbre patron de conception (GOF 97) Permet de construire des structures de type «arbre» def builder = new MarkupBuilder() builder.'web-app' { 'display-name' 'My Webapp'  }   <web-app>  <display-name>My Webapp</display-name> </web-app>
Builders Applications usuelles MarkupBuilder AntBuilder GraphicsBuilder SwingBuilder …
XML 2 Objets Groovy pour faciliter le  parsing  de structures XML groovy.util.XMLParser groovy.util.XMLSlurper Utiliser des librairies Java est tout aussi recommandé! DOM4J, par exemple new XmlSlurper().parse(new File('C:/dev/data/file.xml'))
GSQL Accès aux SGBD package groovy.sql.* 2 façons de rendre SQL Groovy: Nature groovy.sql.GroovyResultSet DataSets groovy.sql.DataSet
GANT Gant permet de construire des scripts de build à l’aide d’Ant, mais écrits en Groovy «  Look Ma! No XML!  » Utilise les tâches d’Ant Il existe un plugin pour Hudson target ( default : 'This is the default target.' ) { if (System.getenv ( ).'JAVA_HOME') { anotherTarget() } }
Services Web Module  GroovyWS Enrobe le cadre d’application Apache CXF Client et serveur se définissent de façon  Groovy,  c’est-à-dire simple et concise groovyx.net.ws.WSServer groovyx.net.ws.WSClient
Services Web import groovyx.net.ws.WSClient  def proxy = new WSClient(&quot;http://localhost:6980/MathService?wsdl&quot;, this.class.classLoader)  def result = proxy.add(1.0 as double, 2.0 as double)   import groovyx.net.ws.WSServer  def server = new WSServer()  server.setNode(&quot;MathService&quot;, &quot;http://localhost:6980/MathService&quot;)   Serveur Client
Tester avec Groovy GroovyTestCase JUnit est enchâssé dans l’environnement d’exécution de Groovy Ajoute plusieurs méthodes assert* GroovyTestSuite s’intègre à merveille avec les IDE Il est tout aussi facile de rouler une batterie de tests avec Ant ou Maven
Tester avec Groovy Tester avec d’autres outils Unit tests TestNG Services web Canoo WebTest SOAPUI Coverage Cobertura
Partie 4:  Conclusion La fin … vraiment?  Ou seulement le début?
State of the «groovy» nation Version Dernière livraison: 1.1 RC 2 1.1 final devrait être à nos portes Présence Spring Jboss Seam IBM project ZERO OpenEJB ServiceMix Grails Hudson Canoo Web Test SoapUI
Défis à venir Surfer sur la vague sans perdre pied! maintenir le rythme effréné des livraisons maintenir le niveau élevé de la qualité Documentation la communauté le réclame: une documentation à jour, mieux organisée Performance bien que cet aspect ait été amélioré depuis quelques livraisons, beaucoup de travail reste à faire
Voir la lumière … Grails Cadre d’application web agile Assemblage de  frameworks  connus de l’écosystème Java Applique les principes de productivité de  Rails  en lui chipant plusieurs idées ( À tout seigneur, tout honneur. ) À suivre …
Références Bouquins Groovy in action Dierk König,  2007 ISBN  1-932394-84-2  Groovy programming Kenneth Barclay/John Savage,  2006 ISBN 978-0-12-372507-3 Groovy Recipes Scott Davis,  Coming soon! ?
Références Sur la grande toile http://groovy.codehaus.org http ://www.groovyblogs.org http://www.aboutgroovy.com http://www.g2one.com   http://jcp.org/en/jsr/detail?id=241   Groovy User Groups Vancouver  http://groovyvan.com/   Londres  http://skillsmatter.com/menu/539   Melbourne  http://tech.groups.yahoo.com/group/groovy-melbourne/   Stuttgart  http://www.jugs.de/sig-groovy.html   Minnesota  http://groups.google.com/group/groovymn   Montréal?
Références La Blogoshère Guillaume Laforge Jason Rudolph Glen Smith Sven Haiges Scott Davis Venkat Subramaniam Geertjan Wielenga Jeremy Rayner Mark Palmer Jeff Brown Andres Almiray … http://glaforge.free.fr/weblog/   http://www.jasonrudolph.com/blog/   http ://blogs.bytecode.com.au/glen/   http://svenhaiges.de/   http://www.davisworld.org/   http://www.agiledeveloper.com/blog/   http://blogs.sun.com/geertjan/   http://javanicus.com/blog2/   http://www.anyware.co.uk/2005/   http://javajeff.blogspot.com/   http://jroller.com/aalmiray/
Des questions? Merci à tous [email_address]

Présentation Groovy

  • 1.
  • 2.
    Qui je suis?J’ai inventé Groovy J’entretiens une relation extraconjugale avec Guillaume Laforge J’ai écrit un super bouquin sur Groovy Je siège sur l’ expert group de la JSR-241 Je suis committer sur Groovy Jean-Sébastien Bournival Architecte de systèmes Nurun Mon blog: http ://js.jipiju.com
  • 3.
    Agenda PARTIE I– Introduction Origines et principes de base PARTIE II - Qu'est ce que Groovy? Comment se décline ce langage PARTIE III - Que fait-on avec Groovy? Applications concrètes du langage PARTIE IV – Conclusion Références, questions
  • 4.
    Partie 1: Introduction Origines et principes de base
  • 5.
    Introduction Précision importanteGroovy == langage de programmation Grails == framework de développement web utilisant Groovy
  • 6.
    Introduction Manifeste Groovyest un langage de programmation dynamique et agile pour la machine virtuelle Java (JVM) « Groovy is Java » Graeme Rocher Grails project lead Groovy Java Java Virtual Machine bytecode
  • 7.
    Historique Personnel 2003James Strachan, le fondateur 2004 Guillaume Laforge, le récupérateur 2007 G2One, le catalyseur JSR 241 Supportée par IBM, Oracle, Sun, ASF, ThoughtWorks
  • 8.
    Installation Environnement $JAVA_HOME$GROOVY_HOME $PATH = $PATH;$GROOVY_HOME\bin;$JAVA_HOME\bin ~/.groovy/lib Outils Interpréteur (groovy.sh) Shell (groovysh.sh) Console Swing (groovyConsole.sh)
  • 9.
    Anatomie d’un script// monScript.groovy // def maVariable = 3 def uneClosure = { it * it } println ‘Bonjour monde!’ L’instruction return est optionnelle Packages importés par défaut: groovy.lang.* groovy.util.* java.lang.* java.util.* java.io.* java.net.* Java.math.BigDecimal Java.math.BigInteger Le point virgule et les paranthèses sont optionnels System.out est implicite Ce script ne contient pas de classe: lors de l’exécution, il sera enrobé dans la méthode run() d’un objet de type Script
  • 10.
    Partie 2: Qu’est-ce que Groovy? Survol du langage
  • 11.
    Type de donnéesde base Tout est Objet (pour vrai de vrai cette fois-ci!) pas de type primitif typage dynamique (ou pas) autoboxing méthode java qui prend un int en paramètre l’opérateur ‘==‘ veut dire equals() … pour tout le monde, pour l’identité, il faut utiliser la méthode is()
  • 12.
    Types de donnéesde base Strings java.lang.String ‘’ groovy.lang.GString “” Aussi Slashy // Triple quote ‘’’ et “””
  • 13.
    Expressions régulières Sucresyntaxique par-dessus: java.util.regex.Matcher / Pattern Opérateurs ‘~’ ‘=~’ et ‘==~’ // java.util.regex.Pattern def pattern = ~/.ou/ // java.util.regex.Matcher def matcher = ('hibou pou chou genou' =~ pattern) assert matcher.size() == 4 assert 'hibou' ==~ /.*ou/
  • 14.
    Structures de contrôleLa vérité, rien que la vérité … true == références objets non-nulle true == list/map non-vide true == string non-vide true == un matcher ayant un match true == Valeur numérique différente de zéro true == true (la valeur booléenne) Aussi: l’instruction if () == celle de Java idem pour les try {…} catch() {…}
  • 15.
    Structures de contrôle(2) Boucler le while( expr ) est identique à celui de Java pas de do {…} while ( expr ) en Groovy for ( variable in iterable ) { instr } def matcher = '12xy5' =~ /\d/ for (match in matcher) { println match } def myString = 'Saku Koivu' for (i in 0..<myString.size()) { ... }
  • 16.
    Structures de contrôle(3) Un switch beaucoup plus puissant qu’en Java : switch (x) { case 7: println &quot;7&quot;; break; case 2.3: println &quot;2.3&quot;; break; case &quot;dog&quot;: println &quot;dog&quot;; break; case [1, 2, 'alf']: println &quot;in list&quot;; break; case (3..6): println &quot;in range&quot;; break; case Integer: println &quot;Integer&quot;; break; case ~&quot;ca.*&quot;: println &quot;regex&quot;; break; }
  • 17.
    GDK Plusieurs typesde Java deviennent plus Groovy ! java.io.File: eachLine (Closure closure) eachFile (Closure closure) java.util.Date: minus(int days) plus(int days) java.lang.String: toURL() java.util.Collection: count(Object value) find(Closure closure) findAll(Closure closure)
  • 18.
    Support natif descollections Les listes opérateur subscript [] = getAt()/putAt() opérateur Spread *. permet l’utilisation d’index négatifs def sakuList = [] sakuList = ['fi','en'] sakuList << 'fr' assert sakuList instanceof java.util.List
  • 19.
    Support natif descollections (2) Les maps permet la syntaxe .dot sur les clés utilisation de valeur par défaut def sakuMap = [:] sakuMap = [ 'team':'mtl', 'goals':12, 'languages':['fi', 'en'] ] println sakuMap.team assert sakuMap instanceof java.util.Map
  • 20.
    Support natif descollections (3) Les ranges une liste de valeurs séquentielles opérateur .. et ..< utilisation: boucles, switch , et closures def range = 5..8 assert range.size() == 4 for (i in range) { println &quot;Hello ${i}&quot; }
  • 21.
    Closures Wikipedia «In computer science, a closure is a function that is evaluated in an environment containing one or more bound variables. When called, the function can access these variables. The explicit use of closures is associated with functional programming and with languages such as ML and Lisp.» Fonction Lambda de Lisp. (define (derivative f dx) (lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))
  • 22.
    Closures (2) EnGroovy Une &quot;closure&quot; c'est un bout de code: assigné à une variable ou anonyme exécuté ultérieurement de type groovy.lang.Closure Utilisation typique List (.each()) File (.eachLine(), .eachFile()) …
  • 23.
    Programmation objet Identiqueà Java … sauf: les inner class ne sont pas supportées le scope par défaut des classes/méthodes/attributs est public paramètres positionnels, et nommés surcharge d’opérateurs permise safe dereferencing operator ‘?.’
  • 24.
    Programmation objet GroovyBeansAjoute au formalisme des JavaBeans get/set sous-entendu pour préserver l’encapsulation opérateur @ Expando, ou un GroovyBean « vierge » ajout dynamique d’attributs et méthodes ( closures )
  • 25.
    Programmation META objet Sous le capot de Groovy: toutes les classes ont une méta-classe une méta-classe permet, entre autres, d’intercepter des appels à des méthodes inexistantes classe méta-classe appel de methode()
  • 26.
    Partie 3: Que fait-on avec Groovy? Applications concrètes du langage
  • 27.
    Builders Principes baséssur le célèbre patron de conception (GOF 97) Permet de construire des structures de type «arbre» def builder = new MarkupBuilder() builder.'web-app' { 'display-name' 'My Webapp' } <web-app> <display-name>My Webapp</display-name> </web-app>
  • 28.
    Builders Applications usuellesMarkupBuilder AntBuilder GraphicsBuilder SwingBuilder …
  • 29.
    XML 2 ObjetsGroovy pour faciliter le parsing de structures XML groovy.util.XMLParser groovy.util.XMLSlurper Utiliser des librairies Java est tout aussi recommandé! DOM4J, par exemple new XmlSlurper().parse(new File('C:/dev/data/file.xml'))
  • 30.
    GSQL Accès auxSGBD package groovy.sql.* 2 façons de rendre SQL Groovy: Nature groovy.sql.GroovyResultSet DataSets groovy.sql.DataSet
  • 31.
    GANT Gant permetde construire des scripts de build à l’aide d’Ant, mais écrits en Groovy « Look Ma! No XML! » Utilise les tâches d’Ant Il existe un plugin pour Hudson target ( default : 'This is the default target.' ) { if (System.getenv ( ).'JAVA_HOME') { anotherTarget() } }
  • 32.
    Services Web Module GroovyWS Enrobe le cadre d’application Apache CXF Client et serveur se définissent de façon Groovy, c’est-à-dire simple et concise groovyx.net.ws.WSServer groovyx.net.ws.WSClient
  • 33.
    Services Web importgroovyx.net.ws.WSClient def proxy = new WSClient(&quot;http://localhost:6980/MathService?wsdl&quot;, this.class.classLoader) def result = proxy.add(1.0 as double, 2.0 as double) import groovyx.net.ws.WSServer def server = new WSServer() server.setNode(&quot;MathService&quot;, &quot;http://localhost:6980/MathService&quot;) Serveur Client
  • 34.
    Tester avec GroovyGroovyTestCase JUnit est enchâssé dans l’environnement d’exécution de Groovy Ajoute plusieurs méthodes assert* GroovyTestSuite s’intègre à merveille avec les IDE Il est tout aussi facile de rouler une batterie de tests avec Ant ou Maven
  • 35.
    Tester avec GroovyTester avec d’autres outils Unit tests TestNG Services web Canoo WebTest SOAPUI Coverage Cobertura
  • 36.
    Partie 4: Conclusion La fin … vraiment? Ou seulement le début?
  • 37.
    State of the«groovy» nation Version Dernière livraison: 1.1 RC 2 1.1 final devrait être à nos portes Présence Spring Jboss Seam IBM project ZERO OpenEJB ServiceMix Grails Hudson Canoo Web Test SoapUI
  • 38.
    Défis à venirSurfer sur la vague sans perdre pied! maintenir le rythme effréné des livraisons maintenir le niveau élevé de la qualité Documentation la communauté le réclame: une documentation à jour, mieux organisée Performance bien que cet aspect ait été amélioré depuis quelques livraisons, beaucoup de travail reste à faire
  • 39.
    Voir la lumière… Grails Cadre d’application web agile Assemblage de frameworks connus de l’écosystème Java Applique les principes de productivité de Rails en lui chipant plusieurs idées ( À tout seigneur, tout honneur. ) À suivre …
  • 40.
    Références Bouquins Groovyin action Dierk König, 2007 ISBN 1-932394-84-2 Groovy programming Kenneth Barclay/John Savage, 2006 ISBN 978-0-12-372507-3 Groovy Recipes Scott Davis, Coming soon! ?
  • 41.
    Références Sur lagrande toile http://groovy.codehaus.org http ://www.groovyblogs.org http://www.aboutgroovy.com http://www.g2one.com http://jcp.org/en/jsr/detail?id=241 Groovy User Groups Vancouver http://groovyvan.com/ Londres http://skillsmatter.com/menu/539 Melbourne http://tech.groups.yahoo.com/group/groovy-melbourne/ Stuttgart http://www.jugs.de/sig-groovy.html Minnesota http://groups.google.com/group/groovymn Montréal?
  • 42.
    Références La BlogoshèreGuillaume Laforge Jason Rudolph Glen Smith Sven Haiges Scott Davis Venkat Subramaniam Geertjan Wielenga Jeremy Rayner Mark Palmer Jeff Brown Andres Almiray … http://glaforge.free.fr/weblog/ http://www.jasonrudolph.com/blog/ http ://blogs.bytecode.com.au/glen/ http://svenhaiges.de/ http://www.davisworld.org/ http://www.agiledeveloper.com/blog/ http://blogs.sun.com/geertjan/ http://javanicus.com/blog2/ http://www.anyware.co.uk/2005/ http://javajeff.blogspot.com/ http://jroller.com/aalmiray/
  • 43.
    Des questions? Mercià tous [email_address]