groovy 1 7 update, past, present, future - s2g forum 2010
TRANSCRIPT
© 2010 SpringSource, A division of VMware. All rights reserved© 2010 SpringSource, A division of VMware. All rights reserved
Groovy, past, present, futurewith a 1.7 update
Guillaume LaforgeGroovy Project Manager
lundi 22 mars 2010
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
Contact information
Email• [email protected]
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
A little story
4
lundi 22 mars 2010
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
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
In terms of polls & surveys
7
lundi 22 mars 2010
In terms of books
8
lundi 22 mars 2010
In terms of jobs
9
lundi 22 mars 2010
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
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
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
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
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
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Agenda
15
• Past (Groovy 1.6)
• Present (Groovy 1.7)
• Future (Groovy 1.8+)
lundi 22 mars 2010
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Agenda• 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
16
lundi 22 mars 2010
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
Multiple assignments
lundi 22 mars 2010
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
More optional returns
18
lundi 22 mars 2010
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
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
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 {}
The @Singleton anti-pattern
21
lundi 22 mars 2010
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
@Immutable
22
lundi 22 mars 2010
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!
@Lazy, not just for lazy dudes!
23
lundi 22 mars 2010
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...
@Delegate, not just for managers!
24
lundi 22 mars 2010
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()}
Grab a Grape
25
lundi 22 mars 2010
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) }}
ExpandoMetaClass DSL
26
lundi 22 mars 2010
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!"
Runtime mixins
27
lundi 22 mars 2010
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
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Agenda• Present (Groovy 1.7)
–Inner classes–Annotations–Grape enhancements–Power asserts–AST viewer and AST builder–Customize the Groovy Truth
29
lundi 22 mars 2010
AIC and NC
AIC: Anonymous Inner ClassesNC: 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
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
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()
Terser Grape
32
lundi 22 mars 2010
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// ...
Grab resolver
33
lundi 22 mars 2010
Power Asserts
Enhanced assert statement and output•def energy = 7200 * 10**15 + 1def mass = 80def celerity = 300000000assert energy == mass * celerity ** 2
34
lundi 22 mars 2010
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
AST Viewer
36
lundi 22 mars 2010
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" } }}
AST Builder
37
lundi 22 mars 2010
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}
Customize the Groovy Truth!
38
lundi 22 mars 2010
SQL improvements
Batch updates
•sql.withBatch { stmt -> ["Paul", "Jochen", "Guillaume"].each { name -> stmt.addBatch "insert into PERSON (name) values ($name)" }}
Transactions
•def persons = sql.dataSet("person")
sql.withTransaction { persons.add name: "Paul" persons.add name: "Jochen" persons.add name: "Guillaume"}
39
lundi 22 mars 2010
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Agenda• 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
40
lundi 22 mars 2010
Groovy 1.8 and beyond...
• Caution!
• The following features are stillsubject to discussion, and mayvery well never seethe light of day!
lundi 22 mars 2010
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
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()}
Extended annotations
43
lundi 22 mars 2010
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 VMWtake 2.pills of chloroquinine in 6.hoursevery 10.minutes do { }given { } when { } then { }blend red, green of acrylic
Plays nicely with Java builder style APIs!
Command-expression based DSL
44
lundi 22 mars 2010
Structural pattern matching on PO(J|G)OsFirst 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 { }}
Pattern matching
45
lundi 22 mars 2010
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(...)
Parser combinators
46
lundi 22 mars 2010
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Agenda
47
• Summary
• Questions & Answers
lundi 22 mars 2010
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
Questions & Answers
49
lundi 22 mars 2010
Photo credits
Caution: http://www.disastersuppliesusa.com/catalog/ee44.jpg
Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png
50
lundi 22 mars 2010