groovy 1.8 update - guillaume laforge - gr8conf europe 2011
DESCRIPTION
Update on all the novelties of the recent Groovy 1.8 release, and what's cooking for 1.9.TRANSCRIPT
![Page 1: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/1.jpg)
Groovy UpdateWhat’s new in Groovy 1.8and what’s coming next!
Guillaume LaforgeGroovy Project ManagerSpringSource / VMware
mercredi 18 mai 2011
![Page 2: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/2.jpg)
Guillaume Laforge
• Groovy Project Manager• JSR-241 Spec Lead• Head of Groovy Development
at SpringSource / VMWare• Initiator of the Grails framework• Creator of the Gaelyk toolkit• Co-author of Groovy in Action
• Speaker: JavaOne, QCon, JavaZone, Sun TechDays, Devoxx, The Spring Experience, SpringOne, JAX, Dynamic Language World, IJTC, and more...
2mercredi 18 mai 2011
![Page 3: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/3.jpg)
Guillaume Laforge
• Groovy Project Manager• JSR-241 Spec Lead• Head of Groovy Development
at SpringSource / VMWare• Initiator of the Grails framework• Creator of the Gaelyk toolkit• Co-author of Groovy in Action
• Speaker: JavaOne, QCon, JavaZone, Sun TechDays, Devoxx, The Spring Experience, SpringOne, JAX, Dynamic Language World, IJTC, and more...
2mercredi 18 mai 2011
![Page 4: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/4.jpg)
Groovy 1.7
3mercredi 18 mai 2011
![Page 5: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/5.jpg)
Groovy 1.7
1853
mercredi 18 mai 2011
![Page 6: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/6.jpg)
Groovy 1.7
185k3
mercredi 18 mai 2011
![Page 7: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/7.jpg)
Groovy 1.7
185kFIRST MONTH AFTER RELEASE
3mercredi 18 mai 2011
![Page 8: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/8.jpg)
Groovy 1.7
k3
mercredi 18 mai 2011
![Page 9: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/9.jpg)
Groovy 1.7
k177SECOND MONTH AFTER RELEASE
3mercredi 18 mai 2011
![Page 10: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/10.jpg)
Groovy 1.7
k3
mercredi 18 mai 2011
![Page 11: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/11.jpg)
Groovy 1.7
k362USERS?
3mercredi 18 mai 2011
![Page 12: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/12.jpg)
TIP OF THEICEBERG?
mercredi 18 mai 2011
![Page 13: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/13.jpg)
Agenda
•What’s new in Groovy 1.8?–Nicer DSLs with command chains expressions–Runtime performance improvements–GPars bundled for taming your multicores–Closure enhancements–Builtin JSON support–New AST transformations–Miscelanous
5mercredi 18 mai 2011
![Page 14: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/14.jpg)
Agenda
•What’s new in Groovy 1.8?–Nicer DSLs with command chains expressions–Runtime performance improvements–GPars bundled for taming your multicores–Closure enhancements–Builtin JSON support–New AST transformations–Miscelanous
•What’s cooking for Groovy 1.9?–Continued runtime performance improvements–Alignments with JDK 7
•Project Coin (small language changes)•InvokeDynamic
5mercredi 18 mai 2011
![Page 15: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/15.jpg)
Command chains expressions
6mercredi 18 mai 2011
![Page 16: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/16.jpg)
Command chains expressions
• A grammar improvement allowing you todrop dots & parens when chaining method calls–an extended version of top-level statements like println
6mercredi 18 mai 2011
![Page 17: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/17.jpg)
Command chains expressions
• A grammar improvement allowing you todrop dots & parens when chaining method calls–an extended version of top-level statements like println
6mercredi 18 mai 2011
![Page 18: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/18.jpg)
Command chains expressions
• A grammar improvement allowing you todrop dots & parens when chaining method calls–an extended version of top-level statements like println
• Less dots, less parens allow you to –write more readable business rules–in almost plain English sentences
•(or any language, of course)
6mercredi 18 mai 2011
![Page 19: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/19.jpg)
Command chains expressions
• A grammar improvement allowing you todrop dots & parens when chaining method calls–an extended version of top-level statements like println
• Less dots, less parens allow you to –write more readable business rules–in almost plain English sentences
•(or any language, of course)
6mercredi 18 mai 2011
![Page 20: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/20.jpg)
Command chains expressions
• A grammar improvement allowing you todrop dots & parens when chaining method calls–an extended version of top-level statements like println
• Less dots, less parens allow you to –write more readable business rules–in almost plain English sentences
•(or any language, of course)
• Let’s have a look at some examples
6mercredi 18 mai 2011
![Page 21: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/21.jpg)
Command chains expressions
turn left then right
7mercredi 18 mai 2011
![Page 22: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/22.jpg)
Command chains expressions
turn left then right
Alternation of method names
7mercredi 18 mai 2011
![Page 23: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/23.jpg)
Command chains expressions
turn left then right
Alternation of method names
and parameters(even named ones)
7mercredi 18 mai 2011
![Page 24: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/24.jpg)
Command chains expressions
turn left then right
7mercredi 18 mai 2011
![Page 25: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/25.jpg)
Command chains expressions
turn left then right ( ). ( )
Equivalent to:
7mercredi 18 mai 2011
![Page 26: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/26.jpg)
Look Ma!No parens, no dots!
mercredi 18 mai 2011
![Page 27: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/27.jpg)
Command chains expressions
take 2.pills, of: chloroquinine, after: 6.hours
Before... we used to do...
9mercredi 18 mai 2011
![Page 28: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/28.jpg)
Command chains expressions
take 2.pills, of: chloroquinine, after: 6.hours
Before... we used to do...
Normal argument
9mercredi 18 mai 2011
![Page 29: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/29.jpg)
Command chains expressions
take 2.pills, of: chloroquinine, after: 6.hours
Before... we used to do...
Normal argument Named arguments
9mercredi 18 mai 2011
![Page 30: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/30.jpg)
Command chains expressions
take 2.pills, of: chloroquinine, after: 6.hours
Before... we used to do...
Normal argument Named arguments
Woud call:
def take(Map m, Quantity q)
9mercredi 18 mai 2011
![Page 31: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/31.jpg)
Command chains expressions
take 2.pills of chloroquinine after 6.hours
Now, even less punctuation!
10mercredi 18 mai 2011
![Page 32: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/32.jpg)
Command chains expressions
take 2.pills of chloroquinine after 6.hours
Now, even less punctuation!
( ). ( ). ( )
10mercredi 18 mai 2011
![Page 33: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/33.jpg)
Command chains expressions
// environment initializationInteger.metaClass.getPills { ‐> delegate }Integer.metaClass.getHours { ‐> delegate } // variable injectiondef chloroquinine = /*...*/ // implementing the DSL logicdef take(n) { [of: { drug ‐> [after: { time ‐> /*...*/ }] }]}
// ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐take 2.pills of chloroquinine after 6.hours
{ }11
mercredi 18 mai 2011
![Page 34: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/34.jpg)
Command chains expressions
take 2.pills of chloroquinine after 6.hours
12mercredi 18 mai 2011
![Page 35: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/35.jpg)
Command chains expressions
take 2.pills of chloroquinine after 6.hours
... some dots remain ...
12mercredi 18 mai 2011
![Page 36: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/36.jpg)
Command chains expressions
take 2 pills of chloroquinine 6 hours after
We could cheat a bit...
13mercredi 18 mai 2011
![Page 37: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/37.jpg)
Command chains expressions
take 2 pills of chloroquinine 6 hours after
We could cheat a bit...
( ). ( ). ( ). ( )
13mercredi 18 mai 2011
![Page 38: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/38.jpg)
Cheatingis playing
with the language
mercredi 18 mai 2011
![Page 39: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/39.jpg)
Command chains expressions
take 2 pills of chloroquinine after 6 hours
Still doable without cheating though
15mercredi 18 mai 2011
![Page 40: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/40.jpg)
Command chains expressions
take 2 pills of chloroquinine after 6 hours
Still doable without cheating though
( ). ( ). ( ). ( )
15mercredi 18 mai 2011
![Page 41: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/41.jpg)
Command chains expressions
// variable injectiondef (of, after, hours) = /*...*/ // implementing the DSL logicdef take(n) { [pills: { of ‐> [chloroquinine: { after ‐> ['6': { time ‐> }] }] }]}
// ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐take 2 pills of chloroquinine after 6 hours
{ }16
mercredi 18 mai 2011
![Page 42: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/42.jpg)
Command chains expressions
17mercredi 18 mai 2011
![Page 43: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/43.jpg)
Command chains expressions
// methods with multiple arguments (commas)take coffee with sugar, milk and liquor
17mercredi 18 mai 2011
![Page 44: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/44.jpg)
Command chains expressions
// methods with multiple arguments (commas)take coffee with sugar, milk and liquor
// leverage named‐args as punctuationcheck that: margarita tastes good
17mercredi 18 mai 2011
![Page 45: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/45.jpg)
Command chains expressions
// methods with multiple arguments (commas)take coffee with sugar, milk and liquor
// leverage named‐args as punctuationcheck that: margarita tastes good
// closure parameters for new control structuresgiven {} when {} then {}
17mercredi 18 mai 2011
![Page 46: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/46.jpg)
Command chains expressions
// methods with multiple arguments (commas)take coffee with sugar, milk and liquor
// leverage named‐args as punctuationcheck that: margarita tastes good
// closure parameters for new control structuresgiven {} when {} then {}
// zero‐arg methods require parensselect all unique() from names
17mercredi 18 mai 2011
![Page 47: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/47.jpg)
Command chains expressions
// methods with multiple arguments (commas)take coffee with sugar, milk and liquor
// leverage named‐args as punctuationcheck that: margarita tastes good
// closure parameters for new control structuresgiven {} when {} then {}
// zero‐arg methods require parensselect all unique() from names
// possible with an odd number of termstake 3 cookies
17mercredi 18 mai 2011
![Page 48: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/48.jpg)
Command chains expressions
// methods with multiple arguments (commas)take coffee with sugar, milk and liquor
// leverage named‐args as punctuationcheck that: margarita tastes good
// closure parameters for new control structuresgiven {} when {} then {}
// zero‐arg methods require parensselect all unique() from names
// possible with an odd number of termstake 3 cookies
( ). ( ). ( )
17mercredi 18 mai 2011
![Page 49: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/49.jpg)
Command chains expressions
// methods with multiple arguments (commas)take coffee with sugar, milk and liquor
// leverage named‐args as punctuationcheck that: margarita tastes good
// closure parameters for new control structuresgiven {} when {} then {}
// zero‐arg methods require parensselect all unique() from names
// possible with an odd number of termstake 3 cookies
( ). ( ). ( )
( ). ( )
17mercredi 18 mai 2011
![Page 50: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/50.jpg)
Command chains expressions
// methods with multiple arguments (commas)take coffee with sugar, milk and liquor
// leverage named‐args as punctuationcheck that: margarita tastes good
// closure parameters for new control structuresgiven {} when {} then {}
// zero‐arg methods require parensselect all unique() from names
// possible with an odd number of termstake 3 cookies
( ). ( ). ( )
( ). ( )
( ). ( ). ( )
17mercredi 18 mai 2011
![Page 51: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/51.jpg)
Command chains expressions
// methods with multiple arguments (commas)take coffee with sugar, milk and liquor
// leverage named‐args as punctuationcheck that: margarita tastes good
// closure parameters for new control structuresgiven {} when {} then {}
// zero‐arg methods require parensselect all unique() from names
// possible with an odd number of termstake 3 cookies
( ). ( ). ( )
( ). ( )
( ). ( ). ( )
( ). . ( )
17mercredi 18 mai 2011
![Page 52: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/52.jpg)
Command chains expressions
// methods with multiple arguments (commas)take coffee with sugar, milk and liquor
// leverage named‐args as punctuationcheck that: margarita tastes good
// closure parameters for new control structuresgiven {} when {} then {}
// zero‐arg methods require parensselect all unique() from names
// possible with an odd number of termstake 3 cookies
( ). ( ). ( )
( ). ( )
( ). ( ). ( )
( ). . ( )
( ).
17mercredi 18 mai 2011
![Page 53: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/53.jpg)
Runtime perf. improvements
• Significant runtime improvements for primitive int operations–classical Fibonacci example x13 faster!–almost as fast as Java
• Some direct method calls on this
• But there’s more to come!–in particular for all the primitive types
• But Jochen «blackdrag» will tell you more on that!
18mercredi 18 mai 2011
![Page 54: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/54.jpg)
GPars bundled
• GPars is bundled in the Groovy distribution
• GPars covers a wide range of parallel and concurrent paradigms–actors, fork/join, dataflow, agents, STM...
• Václav Pech will cover the details on GPars
19mercredi 18 mai 2011
![Page 55: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/55.jpg)
Closure enhancements
• Closure annotation parameters
• Some more functional flavor–composition–trampoline–memoization
• Currying improvements
20mercredi 18 mai 2011
![Page 56: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/56.jpg)
Closure annotation parameters
21
@Retention(RetentionPolicy.RUNTIME)@interface Invariant { Class value() // a closure class} @Invariant({ number >= 0 })class Distance { float number String unit} def d = new Distance(number: 10, unit: "meters") def anno = Distance.getAnnotation(Invariant)def check = anno.value().newInstance(d, d)assert check(d)
{
mercredi 18 mai 2011
![Page 57: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/57.jpg)
Closure annotation parameters
21
@Retention(RetentionPolicy.RUNTIME)@interface Invariant { Class value() // a closure class} @Invariant({ number >= 0 })class Distance { float number String unit} def d = new Distance(number: 10, unit: "meters") def anno = Distance.getAnnotation(Invariant)def check = anno.value().newInstance(d, d)assert check(d)
{Poor-man’s GContracts
Don’t miss André’s talk!
mercredi 18 mai 2011
![Page 58: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/58.jpg)
Closure composition
22
def plus2 = { it + 2 }def times3 = { it * 3 } def times3plus2 = plus2 << times3assert times3plus2(3) == 11assert times3plus2(4) == plus2(times3(4)) def plus2times3 = times3 << plus2assert plus2times3(3) == 15assert plus2times3(5) == times3(plus2(5)) // reverse compositionassert times3plus2(3) == (times3 >> plus2)(3)
{
{
{mercredi 18 mai 2011
![Page 59: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/59.jpg)
Closure trampoline
23mercredi 18 mai 2011
![Page 60: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/60.jpg)
Closure trampoline
23
def factorial
factorial = { int n, BigInteger accu = 1G ‐> if (n < 2) return accu factorial.trampoline(n ‐ 1, n * accu)}.trampoline() assert factorial(1) == 1assert factorial(3) == 1 * 2 * 3assert factorial(1000) == 402387260...
mercredi 18 mai 2011
![Page 61: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/61.jpg)
Closure memoization
24mercredi 18 mai 2011
![Page 62: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/62.jpg)
Closure memoization
24
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
mercredi 18 mai 2011
![Page 63: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/63.jpg)
Closure memoization
24
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
mercredi 18 mai 2011
![Page 64: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/64.jpg)
Closure memoization
24
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000msassert plus(1, 2) == 3 // return immediately
mercredi 18 mai 2011
![Page 65: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/65.jpg)
Closure memoization
24
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000msassert plus(1, 2) == 3 // return immediatelyassert plus(2, 2) == 4 // after 1000ms
mercredi 18 mai 2011
![Page 66: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/66.jpg)
Closure memoization
24
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000msassert plus(1, 2) == 3 // return immediatelyassert plus(2, 2) == 4 // after 1000msassert plus(2, 2) == 4 // return immediately
mercredi 18 mai 2011
![Page 67: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/67.jpg)
Closure memoization
24
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000msassert plus(1, 2) == 3 // return immediatelyassert plus(2, 2) == 4 // after 1000msassert plus(2, 2) == 4 // return immediately
mercredi 18 mai 2011
![Page 68: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/68.jpg)
Closure memoization
24
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000msassert plus(1, 2) == 3 // return immediatelyassert plus(2, 2) == 4 // after 1000msassert plus(2, 2) == 4 // return immediately // at least 10 invocations cacheddef plusAtLeast = { ... }.memoizeAtLeast(10)
mercredi 18 mai 2011
![Page 69: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/69.jpg)
Closure memoization
24
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000msassert plus(1, 2) == 3 // return immediatelyassert plus(2, 2) == 4 // after 1000msassert plus(2, 2) == 4 // return immediately // at least 10 invocations cacheddef plusAtLeast = { ... }.memoizeAtLeast(10) // at most 10 invocations cacheddef plusAtMost = { ... }.memoizeAtMost(10)
mercredi 18 mai 2011
![Page 70: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/70.jpg)
Closure memoization
24
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000msassert plus(1, 2) == 3 // return immediatelyassert plus(2, 2) == 4 // after 1000msassert plus(2, 2) == 4 // return immediately // at least 10 invocations cacheddef plusAtLeast = { ... }.memoizeAtLeast(10) // at most 10 invocations cacheddef plusAtMost = { ... }.memoizeAtMost(10)
// between 10 and 20 invocations cacheddef plusAtLeast = { ... }.memoizeBetween(10, 20)
mercredi 18 mai 2011
![Page 71: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/71.jpg)
Currying improvements
25mercredi 18 mai 2011
![Page 72: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/72.jpg)
Currying improvements
25
// right curryingdef divide = { a, b ‐> a / b }def halver = divide.rcurry(2)assert halver(8) == 4
mercredi 18 mai 2011
![Page 73: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/73.jpg)
Currying improvements
25
// right curryingdef divide = { a, b ‐> a / b }def halver = divide.rcurry(2)assert halver(8) == 4 // currying n‐th parameterdef joinWithSeparator = { one, sep, two ‐> one + sep + two }def joinWithComma = joinWithSeparator.ncurry(1, ', ')assert joinWithComma('a', 'b') == 'a, b'
mercredi 18 mai 2011
![Page 74: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/74.jpg)
Builtin JSON support
• Consuming
• Producing
• Pretty-printing
26mercredi 18 mai 2011
![Page 75: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/75.jpg)
Builtin JSON support
27
import groovy.json.*
def payload = new URL( "http://github.../json/commits/...").text
def slurper = new JsonSlurper()def doc = slurper.parseText(payload)
doc.commits.message.each { println it }
mercredi 18 mai 2011
![Page 76: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/76.jpg)
Builtin JSON support
28
import groovy.json.* def json = new JsonBuilder() json.person { name "Guillaume" age 33 pets "Hector", "Felix"} println json.toString()
mercredi 18 mai 2011
![Page 77: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/77.jpg)
Builtin JSON support
29
import groovy.json.* println JsonOutput.prettyPrint( '''{"person":{"name":"Guillaume","age":33,''' + '''"pets":["Hector","Felix"]}}''')
mercredi 18 mai 2011
![Page 78: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/78.jpg)
Builtin JSON support
29
import groovy.json.* println JsonOutput.prettyPrint( '''{"person":{"name":"Guillaume","age":33,''' + '''"pets":["Hector","Felix"]}}''')
{ "person": { "name": "Guillaume", "age": 33, "pets": [ "Hector", "Felix" ] }}
mercredi 18 mai 2011
![Page 79: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/79.jpg)
New AST transformations
• @Log
• @Field
• @AutoClone• @AutoExternalizable
• Controlling the execution of your code–@ThreadInterrupt, –@TimedInterrupt, –@ConditionalInterrupt
• @Canonical–@ToString, –@EqualsAndHashCode, –@TupleConstructor
• @InheritConstructor
• @WithReadLock• @WithWriteLock
• @ListenerList
30mercredi 18 mai 2011
![Page 80: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/80.jpg)
@Log
• Four different loggers can be injected–@Log, @Commons, @Log4j, @Slf4j
• Possible to implement your own strategy
31
import groovy.util.logging.* @Logclass Car { Car() { log.info 'Car constructed' }} def c = new Car()
mercredi 18 mai 2011
![Page 81: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/81.jpg)
@Log
• Four different loggers can be injected–@Log, @Commons, @Log4j, @Slf4j
• Possible to implement your own strategy
31
import groovy.util.logging.* @Logclass Car { Car() { log.info 'Car constructed' }} def c = new Car()
Guardedw/ an if
mercredi 18 mai 2011
![Page 82: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/82.jpg)
@Log
• Four different loggers can be injected–@Log, @Commons, @Log4j, @Slf4j
• Possible to implement your own strategy
31
import groovy.util.logging.* @Logclass Car { Car() { log.info 'Car constructed' }} def c = new Car()
Guardedw/ an if
Hackergartencertified!
mercredi 18 mai 2011
![Page 83: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/83.jpg)
@Field
• Surprising scoping rules in scripts–variables are local to the run() method–variables aren’t visible in methods
•although visually the variable is in a surrounding scope
• @Field creates a field in the script class
32
@Field List awe = [1, 2, 3]def awesum() { awe.sum() }assert awesum() == 6
mercredi 18 mai 2011
![Page 84: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/84.jpg)
Controlling code execution
• Your application may run user’s code–what if the code runs in infinite loops or for too long?–what if the code consumes too many resources?
33mercredi 18 mai 2011
![Page 85: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/85.jpg)
Controlling code execution
• Your application may run user’s code–what if the code runs in infinite loops or for too long?–what if the code consumes too many resources?
• 3 new transforms at your rescue–@ThreadInterrupt: adds Thread#isInterrupted checks
so your executing thread stops when interrupted–@TimedInterrupt: adds checks in method and closure
bodies to verify it’s run longer than expected–@ConditionalInterrupt: adds checks with your own
conditional logic to break out from the user code
33mercredi 18 mai 2011
![Page 86: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/86.jpg)
Controlling code execution
• Your application may run user’s code–what if the code runs in infinite loops or for too long?–what if the code consumes too many resources?
• 3 new transforms at your rescue–@ThreadInterrupt: adds Thread#isInterrupted checks
so your executing thread stops when interrupted–@TimedInterrupt: adds checks in method and closure
bodies to verify it’s run longer than expected–@ConditionalInterrupt: adds checks with your own
conditional logic to break out from the user code
33mercredi 18 mai 2011
![Page 87: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/87.jpg)
Controlling code execution
• Your application may run user’s code–what if the code runs in infinite loops or for too long?–what if the code consumes too many resources?
• 3 new transforms at your rescue–@ThreadInterrupt: adds Thread#isInterrupted checks
so your executing thread stops when interrupted–@TimedInterrupt: adds checks in method and closure
bodies to verify it’s run longer than expected–@ConditionalInterrupt: adds checks with your own
conditional logic to break out from the user code
• Also see compilation customizers later on
33mercredi 18 mai 2011
![Page 88: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/88.jpg)
@ThreadInterrupt
34
@ThreadInterruptimport groovy.transform.ThreadInterrupt while (true) {
// eat lots of CPU}
mercredi 18 mai 2011
![Page 89: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/89.jpg)
@ThreadInterrupt
34
@ThreadInterruptimport groovy.transform.ThreadInterrupt while (true) {
// eat lots of CPU}
if (Thread.currentThread.isInterrupted()) throw new InterruptedException(){ }
mercredi 18 mai 2011
![Page 90: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/90.jpg)
@ThreadInterrupt
• Two optional annotation parameters available–checkOnMethodStart (true by default)–applyToAllClasses (true by default)
34
@ThreadInterruptimport groovy.transform.ThreadInterrupt while (true) {
// eat lots of CPU}
if (Thread.currentThread.isInterrupted()) throw new InterruptedException(){ }
mercredi 18 mai 2011
![Page 91: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/91.jpg)
@TimedInterrupt
• InterruptedException thrown when checks indicate code ran longer than desired
• Optional annotation parameters available–same as @ThreadInterrupt–value: for an amount of time duration–unit: for the time duration unit (TimeUnit.SECONDS)
35
@TimedInterrupt(10)import groovy.transform.TimedInterrupt while (true) { // eat lots of CPU}
mercredi 18 mai 2011
![Page 92: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/92.jpg)
@ConditionalInterrupt
• Specify your own condition to be inserted at the start of method and closure bodies–check for available resources, number of times run, etc.
• Leverages the new closure annotation parameter feature of Groovy 1.8
36
@ConditionalInterrupt({ counter++ > 2 })import groovy.transform.ConditionalInterruptimport groovy.transform.Field @Field int counter = 0
100.times { println 'executing script method...'}
mercredi 18 mai 2011
![Page 93: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/93.jpg)
@ToString
• Provides a default toString() method to your types• Available annotation options
–includeNames, includeFields, includeSuper, excludes
37
import groovy.transform.ToString @ToStringclass Person { String name int age} println new Person(name: 'Pete', age: 15)// => Person(Pete, 15)
mercredi 18 mai 2011
![Page 94: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/94.jpg)
@EqualsAndHashCode
• Provides default implementations for equals() and hashCode() methods
38
import groovy.transform.EqualsAndHashCode @EqualsAndHashCodeclass Coord { int x, y} def c1 = new Coord(x: 20, y: 5)def c2 = new Coord(x: 20, y: 5) assert c1 == c2assert c1.hashCode() == c2.hashCode()
mercredi 18 mai 2011
![Page 95: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/95.jpg)
@TupleConstructor
• Provides a «classical» constructor with all properties• Several annotation parameter options available
39
import groovy.transform.TupleConstructor @TupleConstructor class Person { String name int age} def m = new Person('Marion', 3) assert m.name == 'Marion'assert m.age == 3
mercredi 18 mai 2011
![Page 96: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/96.jpg)
@Canonical
• One annotation to rule them all!–@Canonical mixes together
•@ToString•@EqualsAndHashCode•@TupleConstructor
• You can customize behavior by combining @Canonical and one of the other annotations
40mercredi 18 mai 2011
![Page 97: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/97.jpg)
@InheritConstructor
• Classes like Exception are painful when extended, as all the base constructors should be replicated
41
class CustomException extends Exception { CustomException() { super() } CustomException(String msg) { super(msg) } CustomException(String msg, Throwable t) { super(msg, t) } CustomException(Throwable t) { super(t) }}
mercredi 18 mai 2011
![Page 98: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/98.jpg)
@InheritConstructor
• Classes like Exception are painful when extended, as all the base constructors should be replicated
41
class CustomException extends Exception { CustomException() { super() } CustomException(String msg) { super(msg) } CustomException(String msg, Throwable t) { super(msg, t) } CustomException(Throwable t) { super(t) }}
import groovy.transform.*
@InheritConstructorsclass CustomException extends Exception {
}
mercredi 18 mai 2011
![Page 99: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/99.jpg)
@WithReadLock, @WithWriteLock
42
import groovy.transform.* class ResourceProvider { private final Map<String, String> data = new HashMap<>() @WithReadLock String getResource(String key) { return data.get(key) } @WithWriteLock void refresh() { //reload the resources into memory }}
mercredi 18 mai 2011
![Page 100: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/100.jpg)
@WithReadLock, @WithWriteLock
42
import groovy.transform.* class ResourceProvider { private final Map<String, String> data = new HashMap<>() @WithReadLock String getResource(String key) { return data.get(key) } @WithWriteLock void refresh() { //reload the resources into memory }}
{
{
mercredi 18 mai 2011
![Page 101: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/101.jpg)
Miscelanous
• Compilation customizers • Java 7 diamond operator• Slashy and dollar slashy strings• New GDK methods• (G)String to Enum coercion
43mercredi 18 mai 2011
![Page 102: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/102.jpg)
Compilation customizers
• Ability to apply some customization to the Groovy compilation process
• Three available customizers–ImportCustomizer–SecureASTCustomizer–ASTTransformationCustomizer
• But you can implement your own
44mercredi 18 mai 2011
![Page 103: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/103.jpg)
Imports customizer
45
def configuration = new CompilerConfiguration() def custo = new ImportCustomizer()custo.addStaticStar(Math.name)configuration.addCompilationCustomizers(custo) def result = new GroovyShell(configuration) .evaluate(" cos PI/3 ")
mercredi 18 mai 2011
![Page 104: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/104.jpg)
Applying an AST transformation
46
def configuration = new CompilerConfiguration()
configuration.addCompilationCustomizers( new ASTTransformationCustomizer(Log)) new GroovyShell(configuration).evaluate(""" class Car { Car() { log.info 'Car constructed' } } log.info 'Constructing a car' def c = new Car()""")
mercredi 18 mai 2011
![Page 105: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/105.jpg)
Secure AST customizer
• Let’s setup our environment–some imports–an import customizer to import java.lang.Math.*–prepare a secure AST customizer
47
import org.codehaus.groovy.control.customizers.*import org.codehaus.groovy.control.*import static org.codehaus.groovy.syntax.Types.* def imports = new ImportCustomizer().addStaticStars('java.lang.Math')def secure = new SecureASTCustomizer()...
Idea: Implement an «arithmetic shell»Being able control what a user script is allowed to do: only arithmetic expressions
mercredi 18 mai 2011
![Page 106: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/106.jpg)
Secure AST customizer
48
...secure.with {
// disallow closure creationclosuresAllowed = false // disallow method definitionsmethodDefinitionAllowed = false
// empty white list => forbid importsimportsWhitelist = [] staticImportsWhitelist = []// only allow the java.lang.Math.* static importstaticStarImportsWhitelist = ['java.lang.Math'
...
mercredi 18 mai 2011
![Page 107: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/107.jpg)
Secure AST customizer
49
...// language tokens allowedtokensWhitelist = [
PLUS, MINUS, MULTIPLY, DIVIDE, MOD, POWER, PLUS_PLUS, MINUS_MINUS, COMPARE_EQUAL, COMPARE_NOT_EQUAL, COMPARE_LESS_THAN, COMPARE_LESS_THAN_EQUAL, COMPARE_GREATER_THAN, COMPARE_GREATER_THAN_EQUAL
]
// types allowed to be used (including primitive types)constantTypesClassesWhiteList = [
Integer, Float, Long, Double, BigDecimal, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE
]
// classes who are allowed to be receivers of method callsreceiversClassesWhiteList = [
Math, Integer, Float, Double, Long, BigDecimal ]}...
mercredi 18 mai 2011
![Page 108: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/108.jpg)
Secure AST customizer
• Ready to evaluate our arithmetic expressions!
• But the following would have failed:
50
shell.evaluate 'System.exit(0)'
...def config = new CompilerConfiguration()config.addCompilationCustomizers(imports, secure)
def shell = new GroovyShell(config) shell.evaluate 'cos(PI/3)'
mercredi 18 mai 2011
![Page 109: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/109.jpg)
Slashy and dollar slashy strings
• Slashy strings are now multiline–particularly handy for multi-line regexs
• Dollar slashy string notation introduced–a multiline GString with different escaping rules
51
def (name, date) = ["Guillaume", "May, 17th"]def dollarSlashy = $/ Hello $name, today we're ${date} $ dollar‐sign $$ dollar‐sign \ backslash / slash $/ slash/$
mercredi 18 mai 2011
![Page 110: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/110.jpg)
New GDK methods
52mercredi 18 mai 2011
![Page 111: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/111.jpg)
New GDK methods
52
// countassert [2,4,2,1,3,5,2,4,3].count { it % 2 == 0 } == 5
mercredi 18 mai 2011
![Page 112: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/112.jpg)
New GDK methods
52
// countassert [2,4,2,1,3,5,2,4,3].count { it % 2 == 0 } == 5 // count byassert [0:2, 1:3] == [1,2,3,4,5].countBy{ it % 2 }assert [(true):2, (false):4] == 'Groovy'.toList().countBy{ it == 'o' }
mercredi 18 mai 2011
![Page 113: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/113.jpg)
New GDK methods
52
// countassert [2,4,2,1,3,5,2,4,3].count { it % 2 == 0 } == 5 // count byassert [0:2, 1:3] == [1,2,3,4,5].countBy{ it % 2 }assert [(true):2, (false):4] == 'Groovy'.toList().countBy{ it == 'o' } // min/max for maps with closuresdef map = [a: 1, bbb: 4, cc: 5, dddd: 2] assert map.max { it.key.size() }.key == 'dddd'assert map.min { it.value }.value == 1
mercredi 18 mai 2011
![Page 114: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/114.jpg)
New GDK methods
52
// countassert [2,4,2,1,3,5,2,4,3].count { it % 2 == 0 } == 5 // count byassert [0:2, 1:3] == [1,2,3,4,5].countBy{ it % 2 }assert [(true):2, (false):4] == 'Groovy'.toList().countBy{ it == 'o' } // min/max for maps with closuresdef map = [a: 1, bbb: 4, cc: 5, dddd: 2] assert map.max { it.key.size() }.key == 'dddd'assert map.min { it.value }.value == 1 // map withDefault()def words = "one two two three three three".split()def freq = [:].withDefault { k ‐> 0 }words.each { freq[it] += 1 }
mercredi 18 mai 2011
![Page 115: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/115.jpg)
(G)String to Enum coercion
53
enum Color { red, green, blue}
mercredi 18 mai 2011
![Page 116: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/116.jpg)
(G)String to Enum coercion
53
enum Color { red, green, blue}
mercredi 18 mai 2011
![Page 117: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/117.jpg)
(G)String to Enum coercion
53
enum Color { red, green, blue} // coercion with asdef r = "red" as Color
mercredi 18 mai 2011
![Page 118: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/118.jpg)
(G)String to Enum coercion
53
enum Color { red, green, blue} // coercion with asdef r = "red" as Color // implicit coercionColor b = "blue"
mercredi 18 mai 2011
![Page 119: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/119.jpg)
(G)String to Enum coercion
53
enum Color { red, green, blue} // coercion with asdef r = "red" as Color // implicit coercionColor b = "blue" // with GStrings toodef g = "${'green'}" as Color
mercredi 18 mai 2011
![Page 120: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/120.jpg)
What’s cookingfor 1.9?
mercredi 18 mai 2011
![Page 121: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/121.jpg)
Groovy 1.9 roadmap
• Java 7 alignements: Project Coin–binary literals–underscore in literals–multicatch
• JDK 7: InvokeDynamic
• Towards a more modular Groovy• Rewritten Antlr 3 grammar (GSoC)• Eclipse compiler to replace
the joint compiler?
• What else? Your call!
55mercredi 18 mai 2011
![Page 122: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/122.jpg)
Groovy 1.9 roadmap
• Java 7 alignements: Project Coin–binary literals–underscore in literals–multicatch
• JDK 7: InvokeDynamic
• Towards a more modular Groovy• Rewritten Antlr 3 grammar (GSoC)• Eclipse compiler to replace
the joint compiler?
• What else? Your call!
55mercredi 18 mai 2011
![Page 123: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/123.jpg)
Binary literals
• We had decimal, octal and hexadecimal notations for number literals
• We can now use binary representations too
56
int x = 0b10101111assert x == 175 byte aByte = 0b00100001assert aByte == 33 int anInt = 0b1010000101000101assert anInt == 41285
mercredi 18 mai 2011
![Page 124: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/124.jpg)
Underscore in literals
• We can now also add underscores in number literals for more readability
57
long creditCardNumber = 1234_5678_9012_3456Llong socialSecurityNumbers = 999_99_9999Lfloat monetaryAmount = 12_345_132.12long hexBytes = 0xFF_EC_DE_5Elong hexWords = 0xFFEC_DE5Elong maxLong = 0x7fff_ffff_ffff_ffffLlong alsoMaxLong = 9_223_372_036_854_775_807Llong bytes = 0b11010010_01101001_10010100_10010010
mercredi 18 mai 2011
![Page 125: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/125.jpg)
Multicatch
• One block for multiple exception caught–rather than duplicating the block
58
try { /* ... */} catch(IOException | NullPointerException e) { /* one block to treat 2 exceptions */}
mercredi 18 mai 2011
![Page 126: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/126.jpg)
Summary
59
ROCK!mercredi 18 mai 2011
![Page 127: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/127.jpg)
Thank you!
Guillaume Laforge
Head of Groovy Development
Email: [email protected]
Twitter: @glaforge
60mercredi 18 mai 2011
![Page 128: Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011](https://reader031.vdocuments.mx/reader031/viewer/2022020217/55587598d8b42a8d018b52c1/html5/thumbnails/128.jpg)
Image credits
• Iceberg: http://hqworld.net/gallery/data/media/20/tip_of_the_iceberg.jpg
• Bicycle: http://drunkcyclist.com/gallery/main.php?g2_view=core.DownloadItem&g2_itemId=2131&g2_serialNumber=2
• Pills: http://www.we-ew.com/wp-content/uploads/2011/01/plan-b-pills.jpg
• Chains: http://2.bp.blogspot.com/-GXDVqUYSCa0/TVdBsON4tdI/AAAAAAAAAW4/EgJOUmAxB28/s1600/breaking-chains5_copy9611.jpg
• Cheating: http://fr.academic.ru/pictures/frwiki/67/Cheating.JPG
• Cooking: http://www.flickr.com/photos/eole/449958332/sizes/l/
• Oui nide iou: http://desencyclopedie.wikia.com/wiki/Fichier:Superdupont_we_need_you.jpg
• Guitar: http://www.lelitteraire.com/IMG/breveon323.jpg
• Trampoline: http://www.fitness-online.fr/images/trampoline-1-m.jpg
• Curry: http://www.pot-a-epices.com/wp-content/uploads/2009/02/curry1.jpg
• Slurp: http://www.ohpacha.com/218-532-thickbox/gamelle-slurp.jpg
61mercredi 18 mai 2011