Reviewing the Groovy 1.6 features, the new 1.7 functionalities, and a look into what the future holds for Groovy 1.8 and beyond!
Presentation given by Guillaume Laforge at the Groovy/Grails eXchange conference, in London.
Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009
1. to Infinity
and Beyond
mercredi 9 dĂŠcembre 2009
2. Guillaume Laforge
â˘Groovy Project Manager
â working on Groovy since 2003
⢠G2One â SpringSource â VMWare
⢠Initiated the creation of Grails
⢠Co-author of Groovy in Action
⢠Speaker: JavaOne, QCon, Devoxx, JavaZone,
SpringOne, JAX, DSL DevCon, Google I/O, and
many more...
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 2
mercredi 9 dĂŠcembre 2009
3. About the content
⢠This presentation was prepared with the examples
Iâve used in my article written for InfoQ
â http://www.infoq.com/articles/groovy-1-6
⢠And from the release notes Iâve prepared for
Groovy 1.7
â http://docs.codehaus.org/display/GROOVY/(draft)
+Groovy+1.7+release
⢠For more information, donât hesitate to read those
two articles!
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 3
mercredi 9 dĂŠcembre 2009
4. Groovy 1.7
for Christmas
⢠Groovy 1.7-RC-2
shall be released
today! (Dec. 9th)
⢠Groovy 1.7-final
should be with the
other presents under
your Christmas tree!
(Dec. 22nd)
mercredi 9 dĂŠcembre 2009
5. Playing with Groovy
⢠You can play with
these examples
within the
Groovy Web Console
hosted on
Google App Engine
â Uses Groovy 1.7-RC-1
â http://groovyconsole.appspot.com
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 5
mercredi 9 dĂŠcembre 2009
6. nd a
Ag e
⢠Past (Groovy 1.6)
⢠Present (Groovy 1.7)
⢠Future (Groovy 1.8+)
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 6
mercredi 9 dĂŠcembre 2009
7. nd a
Ag e ⢠Past (Groovy 1.6)
â Syntax enhancements
â Compile-time metaprogramming
â The Grape module system
â Miscelanous
â˘Runtime metaprogramming
additions
â˘Built-in JSR-223 scripting engine
â˘JMX Builder
â˘OSGi readiness
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 7
mercredi 9 dĂŠcembre 2009
8. Multiple assignments
⢠Newly defined variables
â def (a, b) = [1, 2]
assert a == 1 && b == 2
⢠Typed variables
â def (int a, int b) = [1, 2]
⢠Assign to existing variables
â def lat, lng
(lat, lng) = geocode(âParisâ)
⢠The classical âswap caseâ
â (a, b) = [b, a]
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 8
mercredi 9 dĂŠcembre 2009
9. More optional returns
⢠Return value of last expression of the last if/else,
try/catch, switch/case statement
⢠def m1() { if (true) 1 else 0 }
⢠def m2(b) {
try {
if (b) throw new Exception()
1
} catch(any) { 2 }
finally { 3 }
}
assert m2(false) == 1 && m2(true) == 2
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 9
mercredi 9 dĂŠcembre 2009
10. Compile-time
metaprogramming
⢠With metaprogramming, Groovyâs able to modify
the behaviour of programs... at runtime
⢠Groovy 1.6 introduced AST Transformations
â AST: Abstract Syntax Tree
â Ability to change whatâs being compiled at compile-time!
â˘No runtime impact!
â˘Lets you change the semantics of your programs!
â˘Nice way of implementing patterns and removing boiler-
plate technical code
⢠Two kinds of transformations: global and local
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 10
mercredi 9 dĂŠcembre 2009
11. AST Transformations
in Groovy 1.6
⢠Several transformations finds their way
â @Singleton â okay, not really a pattern :-)
â @Immutable, @Lazy, @Delegate
â @Newify
â @Category and @Mixin
â @PackageScope
â Swingâs @Bindable and @Vetoable
â Grapeâs @Grab
⢠Letâs have a look at some of them
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 11
mercredi 9 dĂŠcembre 2009
12. The @Singleton anti-pattern
⢠The evil Java singleton
â public class Evil {
public static final Evil instance =
new Evil();
privavte Evil() {}
Evil getInstance() { return instance; }
}
⢠In Groovy now:
â @Singleton class Evil {}
⢠A lazy version also:
â @Singleton(lazy = true) class Evil {}
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 12
mercredi 9 dĂŠcembre 2009
13. @Immutable
⢠To properly implement immutable classes
â No mutators (state musnât change)
â Private final fields
â Defensive copying of mutable components
â Proper equals() / hashCode() / toString() for
comparisons, or for keys in maps, etc.
â @Immutable class Coordinates {
Double lat, lng
}
def c1 = new Coordinates(lat: 48.8, lng: 2.5)
def c2 = new Coordinates(48.8, 2.5)
assert c1 == c2
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 13
mercredi 9 dĂŠcembre 2009
14. @Lazy, not just for lazy dudes!
⢠When you need to lazily evaluate or instantiate
complex data structures for class fields, mark them
with the @Lazy annotation
â class Dude {
@Lazy pets = retrieveFromSlowDB()
}
⢠Groovy will handle the boiler-plate code for you!
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 14
mercredi 9 dĂŠcembre 2009
15. @Delegate
Not just for managers!
⢠You can delegate to fields of your class
â Think multiple inheritance
â class Employee {
def doTheWork() { "done" }
}
class Manager {
@Delegate Employee slave = new Employee()
}
def god = new Manager()
assert god.doTheWork() == "done"
⢠Damn manager will get all the praise...
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 15
mercredi 9 dĂŠcembre 2009
16. Grab a Grape
⢠Groovy Advanced Packaging Engine
â Helps you distribute scripts without dependencies
â Just declare your dependencies with @Grab
â˘Will look for dependencies in Maven or Ivy repositories
â @Grab( group = 'org.mortbay.jetty',
module = 'jetty-embedded',
version = '6.1.0' )
def startServer() {
def srv = new Server(8080)
def ctx = new Context(srv , "/", SESSIONS)
ctx.resourceBase = "."
ctx.addServlet(GroovyServlet, "*.groovy")
srv.start()
}
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 16
mercredi 9 dĂŠcembre 2009
17. ExpandoMetaClass DSL
⢠Before
â Number.metaClass.multiply = { Amount amount ->
amount.times(delegate)
}
Number.metaClass.div = { Amount amount ->
amount.inverse().times(delegate)
}
⢠In Groovy 1.6
â Number.metaClass {
multiply { Amount amount ->
amount.times(delegate)
}
div { Amount amount ->
amount.inverse().times(delegate)
}
}
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 17
mercredi 9 dĂŠcembre 2009
18. Runtime mixins
⢠Inject new behavior to types at runtime
â class FlyingAbility {
def fly() { "I'm ${name} and I fly!" }
}
class JamesBondVehicle {
String getName() { "James Bond's vehicle" }
}
JamesBondVehicle.mixin FlyingAbility
assert new JamesBondVehicle().fly() ==
"I'm James Bond's vehicle and I fly!"
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 18
mercredi 9 dĂŠcembre 2009
19. Miscelanous
â˘JMX builder
â A new builder for easily exposing, interacting with JMX
beans, listening to event, defining timers, etc.
â˘OSGi
â Groovyâs JAR is already OSGi compatible by sporting the
right attributes in the manifest
â˘JSR-223
â An implementation of the javax.script.* APIs is now part
of Groovy by default
â˘Swing console
â Customizable graphical representation of results
â Clickable stacktraces and error messages
â Dragân Drop, code indentation, add JARs to the classpath
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 19
mercredi 9 dĂŠcembre 2009
20. nd a
Ag e ⢠Present (Groovy 1.7)
â Inner classes
â Annotations
â Grape enhancements
â Power asserts
â AST viewer and AST builder
â Customize the Groovy Truth
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 20
mercredi 9 dĂŠcembre 2009
21. AIC and NC
⢠AIC: Anonymous Inner Classes
NC: Nested Classes
⢠For Java-compatibility sake, weâre brining AIC / NC
support into Groovy
â copyân paste compatibility? :-)
⢠Not much to see beyond the usual standard Java
AIC / NC concept
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
mercredi 9 dĂŠcembre 2009
22. Annotations everywhere!
⢠Groovy supports of annotations since Groovy 1.5
â a couple minor differences, for instance for arrays
⢠In Groovy 1.7, you can add annotations on
â imports
â packages
â variable declarations
⢠Handy for Grape!
⢠Source-level annotations, available through the AST
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 22
mercredi 9 dĂŠcembre 2009
23. Terser Grape
⢠Ability to put the @Grab annotation on imports!
â @Grab(group = 'net.sf.json-lib',
module = 'json-lib', version = '2.3',
classifier = 'jdk15')
import net.sf.json.groovy.*
def root = new JsonSlurper().parseText(...)
⢠Put @Grab on variable declarations and use the
shorter notation
â @Grab('net.sf.json-lib:json-lib:2.3:jdk15')
def builder =
new net.sf.json.groovy.JsonGroovyBuilder()
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 23
mercredi 9 dĂŠcembre 2009
24. Grab resolver
⢠Dependencies arenât always available in Mavenâs
repository, so you may need to specify a different
place to search libraries
â before, one had to modify grapeConfig.xml
⢠Groovy 1.7 introduces a Grape resolver
â @GrabResolver(name = 'restlet.org',
root = 'http://maven.restlet.org')
@Grab(group = 'org.restlet',
module =' org.restlet', version='1.1.6')
import org.restlet.Restlet
// ...
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 24
mercredi 9 dĂŠcembre 2009
25. Power Asserts
⢠Enhanced assert statement and output
â def energy = 7200 * 10**15 + 1
def mass = 80
def celerity = 300000000
assert energy == mass * celerity ** 2
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 25
mercredi 9 dĂŠcembre 2009
26. AST transformations
⢠With Groovy 1.6 came AST transformations
⢠But...
â you need a deep knowledge of the Groovy internals
â itâs not easy to know what the AST looks like
â writing transformations can be pretty verbose
⢠Groovy 1.7 introduces
â an AST viewer
â an AST builder
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 26
mercredi 9 dĂŠcembre 2009
27. AST Viewer
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 27
mercredi 9 dĂŠcembre 2009
28. AST Builder
⢠Ability to build AST parts
â from a String
â˘new AstBuilder().buildFromString(''' "Hello" ''')
â from code
â˘new AstBuilder().buildFromCode { "Hello" }
â from specification
â˘List<ASTNode> nodes
= new AstBuilder().buildFromSpec {
block {
returnStatement {
constant "Hello"
}
}
}
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 28
mercredi 9 dĂŠcembre 2009
29. Customize the Groovy Truth!
⢠Ability to customize the Groovy Truth by
implementing of method boolean asBoolean()
⢠Your own predicate
â class Predicate {
boolean value
boolean asBoolean() { value }
}
assert new Predicate(value: true)
assert !new Predicate(value: false)
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 29
mercredi 9 dĂŠcembre 2009
30. nd a
Ag e ⢠Future (Groovy 1.8+)
â Extended annotations
â DSL: command statements
improvements
â Pattern matching
â Parser combinators
â New MOP
â JDK 7
â˘Project Coin
â˘Simple closures for Java
â˘InvokeDynamic
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 30
mercredi 9 dĂŠcembre 2009
31. Groovy 1.8
and beyond...
⢠Caution!
⢠The following features are still
subject to discussion, and may
very well never see
the light of day!
mercredi 9 dĂŠcembre 2009
32. Groovy 1.8, end of 2010
⢠Plan to provide various runtime improvements to
make Groovy faster and faster
⢠Make Groovy more modular
â Probably using Grapeâs module system
â Breaking Groovy into smaller JARs
â˘not everybody needs everything (JMX, SQL, Swing...)
⢠Align Groovy with JDK 7 / Java 7
â Review project coin proposals where it makes sense
â Incorporate / integrate with InvokeDynamic (JSR-292)
â Interoperate with Java simple closures
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 32
mercredi 9 dĂŠcembre 2009
33. Extended annotations
⢠Go beyond Java 5,
and let annotations support more type parameters
â closures, lists, maps, ranges
⢠Possible use cases
â validation, pre- and post-conditions
â @Validate({ name.size() > 4 })
String name
â @PreCondition({ msg != null })
void outputToUpperCase(String msg) {
println msg.toUpperCase()
}
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 33
mercredi 9 dĂŠcembre 2009
34. Command-expression
based DSL
⢠Groovy lets you omit parentheses for top-level
expressions, and mix named and non-named
arguments
⢠Idea: extend to nested/chained expressions
â send "Hello" to "Jochen"
send "Hello", from: "Guillaume" to "Jochen"
sell 100.shares of MSFT
take 2.pills of chloroquinine in 6.hours
every 10.minutes { }
given { } when { } then { }
blend red, green of acrylic
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 34
mercredi 9 dĂŠcembre 2009
35. Pattern matching
⢠Structural pattern matching on PO(J|G)Os
⢠First experiments will be done as module
â if successful, likely integrated in core
⢠term.match { // or match(term) {}
Num(value) {}
Plus(left, right) {}
Num(value: 5) {}
Num(value > 0) {}
Plus(left: Plus(left: a, right: 2), right) {}
Plus(left: a, right: b) | Minus(left: a, right: b) {}
Object(left, right) {}
nothing { }
}
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 35
mercredi 9 dĂŠcembre 2009
36. Parser combinators
⢠Same as pattern matching, experiments need to be
done as a module, before possible integration in
core
â Also need Groovy modularity to be implemented
⢠def language = grammar {
digit: ~/[0-9]/
letter: ~/[a-zA-Z]/
identifier: letter + ( letter | digit ){n}
number: digit{n}
}
grammar.parse(...)
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 36
mercredi 9 dĂŠcembre 2009
37. nd a
Ag e
⢠Summary
⢠Questions & Answers
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 37
mercredi 9 dĂŠcembre 2009
38. Summary
⢠Groovy, still inovative, since 2003!
â Newever versions always bring their share of new
features and libraries to simplify the life of the developer
â And thereâs more to come!
⢠But Groovyâs more than just a language, itâs a very
active and lively ecosystem with tons of great
projects
â Grails, Gradle, GPars, Spock, Gaelyk, etc...
⢠Enjoy the conference!
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 38
mercredi 9 dĂŠcembre 2009
39. Questions & Answers
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 39
mercredi 9 dĂŠcembre 2009
40. Photo credits
⢠Buzz LightYear: http://bu77lightyear.files.wordpress.com/2008/09/buzzlightyear_high.jpg
⢠Christmas tree: http://www.thedailygreen.com/cm/thedailygreen/images/WT/christmas-tree-with-gifts-flipbook.jpg
⢠Caution: http://www.disastersuppliesusa.com/catalog/ee44.jpg
⢠Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 40
mercredi 9 dĂŠcembre 2009