groovy 1 7 update, past, present, future - s2g forum 2010

50
© 2010 SpringSource, A division of VMware. All rights reserved © 2010 SpringSource, A division of VMware. All rights reserved Groovy, past, present, future with a 1.7 update Guillaume Laforge Groovy Project Manager lundi 22 mars 2010

Upload: guillaume-laforge

Post on 10-May-2015

4.456 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Groovy 1 7 Update, past, present, future - S2G Forum 2010

© 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

Page 2: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 3: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 4: Groovy 1 7 Update, past, present, future - S2G Forum 2010

A little story

4

lundi 22 mars 2010

Page 5: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 6: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 7: Groovy 1 7 Update, past, present, future - S2G Forum 2010

In terms of polls & surveys

7

lundi 22 mars 2010

Page 8: Groovy 1 7 Update, past, present, future - S2G Forum 2010

In terms of books

8

lundi 22 mars 2010

Page 9: Groovy 1 7 Update, past, present, future - S2G Forum 2010

In terms of jobs

9

lundi 22 mars 2010

Page 10: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 11: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 12: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 13: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 14: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 15: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 16: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 17: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 18: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 19: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 20: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 21: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 22: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 23: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 24: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 25: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 26: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 27: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 28: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 29: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 30: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 31: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 32: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 33: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 34: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 35: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 36: Groovy 1 7 Update, past, present, future - S2G Forum 2010

AST Viewer

36

lundi 22 mars 2010

Page 37: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 38: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 39: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 40: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 41: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 42: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 43: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 44: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 45: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 46: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 47: Groovy 1 7 Update, past, present, future - S2G Forum 2010

Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.

Agenda

47

• Summary

• Questions & Answers

lundi 22 mars 2010

Page 48: Groovy 1 7 Update, past, present, future - S2G Forum 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

Page 49: Groovy 1 7 Update, past, present, future - S2G Forum 2010

Questions & Answers

49

lundi 22 mars 2010

Page 50: Groovy 1 7 Update, past, present, future - S2G Forum 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