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...
2
lundi 22 mars 2010
3. Contact information
Email
• glaforge@vmware.com
Twitter
• @glaforge
Blog
• http://glaforge.free.fr/blog/groovy
Groovy mailing-lists
• http://old.nabble.com/codehaus---Groovy-f11866.html
3
lundi 22 mars 2010
5. 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://groovy.codehaus.org/Groovy+1.7+release+notes
For more information, don’t hesitate to read those two articles!
5
lundi 22 mars 2010
6. Most popular alternative language for the JVM
In terms of...
• Poll and survey popularity
• Books available on the shelves
• Jobs on the job boards
• Integration in other products
• Download numbers
• Community activity
• Innovation
6
lundi 22 mars 2010
7. In terms of polls & surveys
7
lundi 22 mars 2010
10. In terms of integration in other projects and products
Groovy is integrated in many Open Source projects and Commercial
products
• Spring, IntelliJ IDEA, SAP Composition on Grails, RIFE, Mule ESB, Apache Camel,
eXo Platform, SOAP UI, JBoss SEAM, XWiki, Oracle OC4J, SpringSource tcServer,
Oracle Data Integrator, Canoo WebTest, Oracle Busines Components, IBM
WebSphere sMash, CodeStreet MarketData Works, SpringSource Hyperic HQ
• Mutual of Omaha, US National Cancer Institute, Patterson Institute for Cancer
Research, IRSN, European Patent Office...
and many more I’ve omitted!
10
lundi 22 mars 2010
11. In terms of download numbers
Number of downloads per month
• 2003: a few hundreds
• 2005: ~5k
• 2008: ~35k
• 2009: ~70k
Add to that number
• all the integrations...
• all the artifacts downloads from Maven’s repository!
Highly successful OSS project!
11
lundi 22 mars 2010
12. In terms of community activity
Very high traffic on the mailing-lists
• 1500+ members
Dedicated conferences
• Groovy Grails eXchange
• SpringOne 2GX
• GR8 Conference (Europe / USA)
• Excellent coverage of Groovy and Grails at all major conferences around the world
Dedicated podcast
• GrailsPodcast
Dedicated online PDF magazine
• GroovyMag
12
lundi 22 mars 2010
13. In terms of innovation
JAX Innovation Award
• Biggest German Java conference
Groovy won first prize in 2007
• Grails scored second in 2008
• Spring arrived first in 2006
13
lundi 22 mars 2010
14. Playing with Groovy
You can play with these
examples within the
Groovy Web Console
hosted on Google App Engine
• http://groovyconsole.appspot.com
14
lundi 22 mars 2010
15. nda
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. 15
lundi 22 mars 2010
16. nda
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. 16
lundi 22 mars 2010
17. 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]
17
lundi 22 mars 2010
18. 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
18
lundi 22 mars 2010
19. 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
19
lundi 22 mars 2010
20. 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
20
lundi 22 mars 2010
21. 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 {}
21
lundi 22 mars 2010
22. @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
22
lundi 22 mars 2010
23. @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!
23
lundi 22 mars 2010
24. @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...
24
lundi 22 mars 2010
25. 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()
}
25
lundi 22 mars 2010
27. 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!"
27
lundi 22 mars 2010
28. 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
28
lundi 22 mars 2010
29. nda
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. 29
lundi 22 mars 2010
30. 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
30
lundi 22 mars 2010
31. 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
31
lundi 22 mars 2010
32. 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()
32
lundi 22 mars 2010
33. 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
// ...
33
lundi 22 mars 2010
34. Power Asserts
Enhanced assert statement and output
•def energy = 7200 * 10**15 + 1
def mass = 80
def celerity = 300000000
assert energy == mass * celerity ** 2
34
lundi 22 mars 2010
35. 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
35
lundi 22 mars 2010
37. 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"
}
}
}
37
lundi 22 mars 2010
38. 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 }
}
if (new Predicate(value: false)) {
println true
} else {
println false
}
38
lundi 22 mars 2010
40. nda
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. 40
lundi 22 mars 2010
41. Groovy 1.8
and beyond...
• Caution!
• The following features are still
subject to discussion, and may
very well never see
the light of day!
lundi 22 mars 2010
42. Groovy 1.8, end of 2010
Plan to provide various runtime improvements
to make Groovy faster and faster
• Avoiding most synchronization (volatile fields, explicit synchronization, etc...)
• Leveraging the Java Memory Model operation ordering to simulate synchronization
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
42
lundi 22 mars 2010
43. 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()
}
43
lundi 22 mars 2010
44. 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 VMW
take 2.pills of chloroquinine in 6.hours
every 10.minutes do { }
given { } when { } then { }
blend red, green of acrylic
Plays nicely with Java builder style APIs!
44
lundi 22 mars 2010
45. Pattern matching
Structural pattern matching on PO(J|G)Os
First experiments will be done as module
• if successful, possibly 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 { }
}
45
lundi 22 mars 2010
46. 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(...)
46
lundi 22 mars 2010
47. nda
Ag e
• Summary
• Questions & Answers
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 47
lundi 22 mars 2010
48. 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...
48
lundi 22 mars 2010