Title: Un langage de script pour la JVM
1- Un langage de script pour la JVM
2004/07 - Guillaume Laforge
2Langage de scriptpour la JVM
- Créé par James Strachan et Bob McWhirter
- Un langage de script pour la JVM
- Inspiré de Java, Ruby et Python
- Génère directement du bytecode
- Syntaxe entre Java et Ruby, très concise
- Réutilise directement les librairies Java
- Pas dAPI propriétaire comme Ruby ou Python
- Facilement intégrable dans un environnement J2EE
2004/07 - Guillaume Laforge
3Quest ce que Groovy ?
- Cest un langage de script
- Utilisable dans un Shell, aussi bien quintégré
- Dynamique et agile
- Typage, virgules, parenthèses optionnels
- List et Map avec une syntaxe native
- Closures, expressions régulières, surcharge
dopérateur - Tout plein de sucre syntaxique et de méthodes
couteau-suisse - Orienté objet
- Même modèle que Java classe, interface et
héritage
2004/07 - Guillaume Laforge
4Langage dynamique
- Typage dynamique
- int a 5
- b 6
- String s coucou
- t bonjour
- Parenthèses et point-virgule optionnels
- int a 3 int b 4
- println( a )
- c 2
- print c
- print "hello".indexOf( 'e' )
2004/07 - Guillaume Laforge
5GString
- h1 "hellohello"
- h2 'hello' 2
- mix1 "hello 'there' dude"
- mix2 'hello "there" dude'
- wrap "sur plusieurs
- lignes"
- triple """On peut escaper
- ce quon veut """
- heredoc ltltltBLAH
- Encore un peu de texte
- escapé sur plusieurs lignes
- BLAH
Le petit plus, cest les variables insérées
name "Guillaume" salut "Salut name"
-gt "Salut Guillaume"
2004/07 - Guillaume Laforge
6Script, classe, bean, etc.
- Un script
- println OSS Get-Together!
- Une classe, un bean
- class MonPtitGars String nom int
ageme new MonPtitGars(nomGuillaume,
age26) - println me.nomme.age 27
2004/07 - Guillaume Laforge
7List et Map sauce Groovy
- Une liste
- vide
- list 1, 2, 3, 4
- list.each println it
- Une map
- rien
- moi nom Laforge, age 27
- println moi.nom
- println moi.age
2004/07 - Guillaume Laforge
8Looping la tête en bas
- if/else, while, do, classiques comme en Java
- Boucler (à part le for classique)
- for (i in 1..3)
- for (ch in Guillaume)
- for (item in 1, 2, 3, 4)
- for (entry in nom Laforge, age 27)
2004/07 - Guillaume Laforge
9Switch on steroïds
- Un switch beaucoup pluis puissant quen Java
- switch (x) case 7 println "7"
break case 2.3 println
"2.3" break case "dog" println
"dog" break case 1, 2, 'alf' println
"in list" break case (3..6) println
"in range" break case Integer println
"Integer" break case "ca." println
"regex" break case new MyCase() println
"MyCase" break - class MyCase isCase(thing) return thing
'me'
2004/07 - Guillaume Laforge
10Expressions régulières
- Patterns pattern "na."
- Matchers
- matcher ("name" pattern)
- println matcher.matches() -gt true
- Regex Matches println("name" "na.") -gt
true - Indexing Matchers
- m "a name is just a game" ".ame"
- println m1 -gt "game"
- m "a name is just a game" ".name (.) just
(.) game." - println("Regex m1 m2 cool thing!")
- -gt "Regex is a cool!"
2004/07 - Guillaume Laforge
11Closures
public class Filter public static void main(
String args ) List list new
java.util.ArrayList() list.add( "Rod" )
list.add( "James" ) list.add( "Chris" )
Filter filter new Filter() List shorts
filter.filterLongerThan( list, 4 ) for (
String item shorts ) System.out.println(
item ) public List filterLongerThan(
List list, int length ) List result
new ArrayList() for ( String item list )
if ( item.length() lt length )
result.add( item ) return
result
list "Rod", "James", "Chris" shorts
list.findAll it.size() lt 4 shorts.each
println it
2004/07 - Guillaume Laforge
12Closures (2)
- Un mix entre
- Un simple bloc de code
- Une fonction anonyme
- Pratique pour itérer
- 1, 2, 4.each println it 4
- a1, b2.each println it.keyit.value
- 5.times println it
- Ca sécrit comment ?
- c name println Hello name
2004/07 - Guillaume Laforge
13Groovy JDK
- Une sorte de mixin , de surcouche du JDK
- String
- contains(), count(), execute(), padLeft(),
center(), padRight(), reverse(), tokenize(),
each() - Collection
- count(), collect(), join(), each(),
reverseEach(), find/All(), min(), max(),
inject(), sort() - File
- eachFile(), eachLine(), withPrintWriter(),
write(), getText()
2004/07 - Guillaume Laforge
14Groovy JDK (2)
- En plus, on peut en rajouter soi-même !
- class MyStringUtil String
sayHelloTo(String self, String name)
self says hello to name
use(MyStringUtil) println
Guillaume.sayHelloTo(Vincent)
2004/07 - Guillaume Laforge
15ExpandoClosure Mixin
- Un Expando, cest une sorte de Bean dynamique
- bean new Expando()
- bean.name Guillaume bean.age 27
- On peut en faire une sorte de Mixin
- class Greeting extends Expando String
name say println "Hello name!"
greet new Greeting(name"Guillaume")greet.s
ay()greet.say println "greet.name is a
Groovy despot" greet.say()
2004/07 - Guillaume Laforge
16GPath, un XPath amélioré
- class Person name age
- list new Person( nameGuillaume, age27 ),
- new Person( nameJames, age35 )
- println( list.find it.age gt 25.name )
- -gt Guillaume
- println( list.findAll it.age gt 25.name )
- -gt Guillaume, James
- println( list.any it.name.size() gt 4 )
- -gt true
2004/07 - Guillaume Laforge
17XML Génération
- On peut générer du XML facilement avec un
builder
data 'Rod' 'Misha'8, 'Bowie'2,
'Eric' 'Poe'4, 'Doc'3 xml new
groovy.xml.MarkupBuilder() people xml.people()
for ( entry in data ) person( name
entry.key ) for ( dog in entry.value)
pet( namedog.key, agedog.value )
ltpeoplegt ltperson name'Rod'gt ltpet
name'Bowie' age'2' /gt ltpet name'Misha'
age'8' /gt lt/persongt ltperson name'Eric'gt
ltpet name'Poe' age'4' /gt ltpet name'Doc'
age'3' /gt lt/persongt lt/peoplegt
2004/07 - Guillaume Laforge
18XML Parsing et Navigation
people new groovy.util.XmlParser().parseText(
xml ) println people.person.pet'_at_name' -gt
'Misha','Bowie','Poe','Doc' println
people.person.pet.findAll Integer.parseInt(
it'_at_age' ) gt 3 '_at_name' -gt Misha,
Poe println people.person.findAll
it.pet'_at_name'.every it.size() gt 3
'_at_name'0 -gt "Rod"
2004/07 - Guillaume Laforge
19Scripter Ant
class Build ant new groovy.util.AntBuilder()t
argets 'clean', 'compile' static void
main(args) b new Build() if (
args.size() gt 0 ) b.targets args
b.run()void run() for ( target in targets
) invokeMethod( target.toString(), null
) clean() ant.rmdir( dir'target' )
compile() ant.mkdir( dir'target/classes'
) ant.compile( srcdir'src/main/java',
destdir'target/classes' )
fileset includes( name'/.java' )
2004/07 - Guillaume Laforge
20Facile de faire une IHM
- swing new groovy.swing.SwingBuilder()
- frame swing.frame(title 'This is a Frame',
location100,100,size800,400
) menuBar menu(text 'File')
menuItem() action(name'New',
closure println("New") )
panel(layout new BorderLayout())
label(text 'Name', constraints
BorderLayout.WEST, toolTipText 'This
is the name field') textField(text 'Rod',
constraints BorderLayout.CENTER) - button(text 'Click me!',
constraints BorderLayout.SOUTH,
actionPerformedprintln("Button clicked!")) -
2004/07 - Guillaume Laforge
21SQL facile !
- sql new groovy.sql.Sql( dataSource )
- sql.execute( "create table person (name varchar,
age integer)" ) - people sql.dataSet( "person" )
- people.add( name Guillaume", age 27 )
- people.add( name "James", age 35 )
- sql.eachRow( "select from person" ) p
- println "p.name is p.age years old"
-
- -gt Guillaume is 27 years old
- -gt James is 35 years old
2004/07 - Guillaume Laforge
22XML-RPC
- Serveur
- server new XMLRPCServer( 2, 10, 8, 1000, 1000
) server.testme name name " is cool!"
server.multiply number number 10
serverSocket new java.net.ServerSocket( 9047
) server.startServer( serverSocket ) - Client
- serverProxynew XMLRPCServerProxy("http//127.0.
0.19047") println serverProxy.testme( "Groovy" )
-gt "Groovy is cool!" println serverProxy.multiply(
7 ) -gt 70 server.stopServer()
2004/07 - Guillaume Laforge
23Conclusion
- Groovy, cest pas fini !
- Syntaxe toujours en cours dévolution
- JSR 241
- Manque de support dans les IDEs
- Debugging Hell
- Mais jai bon espoir ?
- Au prochain épisode, comment intégrer Groovy ?
2004/07 - Guillaume Laforge