to Infinity
                           and Beyond
mercredi 9 décembre 2009
Guillaume Laforge

       •Groovy Project Manager
               – working on Groovy since 2003
       • G2One ➜ SpringSou...
About the content

       • This presentation was prepared with the examples
         I’ve used in my article written for ...
Groovy 1.7
                            for Christmas

                           • Groovy 1.7-RC-2
                       ...
Playing with Groovy

       • You can play with
         these examples
         within the
         Groovy Web Console
  ...
nd a
                   Ag e
                                                                                            •...
nd a
                   Ag e                                                                     • Past (Groovy 1.6)
     ...
Multiple assignments

       • Newly defined variables
               – def (a, b) = [1, 2]
                 assert a == 1...
More optional returns

       • Return value of last expression of the last if/else,
         try/catch, switch/case state...
Compile-time
      metaprogramming

       • With metaprogramming, Groovy’s able to modify
         the behaviour of progr...
AST Transformations
      in Groovy 1.6

       • Several transformations finds their way
               – @Singleton — ok...
The @Singleton anti-pattern

       • The evil Java singleton
               – public class Evil {
                     pu...
@Immutable

       • To properly implement immutable classes
               – No mutators (state musn’t change)
          ...
@Lazy, not just for lazy dudes!

       • When you need to lazily evaluate or instantiate
         complex data structures...
@Delegate
      Not just for managers!

       • You can delegate to fields of your class
               – Think multiple ...
Grab a Grape

       • Groovy Advanced Packaging Engine
               – Helps you distribute scripts without dependencies...
ExpandoMetaClass DSL

       • Before
               – Number.metaClass.multiply = { Amount amount ->
                    ...
Runtime mixins

       • Inject new behavior to types at runtime

               – class FlyingAbility {
                 ...
Miscelanous

       •JMX builder
               – A new builder for easily exposing, interacting with JMX
                ...
nd a
                   Ag e                                                                     • Present (Groovy 1.7)
  ...
AIC and NC

       • AIC: Anonymous Inner Classes
         NC: Nested Classes

       • For Java-compatibility sake, we’re...
Annotations everywhere!

       • Groovy supports of annotations since Groovy 1.5
               – a couple minor differen...
Terser Grape

       • Ability to put the @Grab annotation on imports!
               – @Grab(group = 'net.sf.json-lib',
 ...
Grab resolver

       • Dependencies aren’t always available in Maven’s
         repository, so you may need to specify a ...
Power Asserts

       • Enhanced assert statement and output
               – def energy = 7200 * 10**15 + 1
             ...
AST transformations

       • With Groovy 1.6 came AST transformations

       • But...
               – you need a deep k...
AST Viewer




    Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is ...
AST Builder

       • Ability to build AST parts
               – from a String
                      •new AstBuilder().bu...
Customize the Groovy Truth!

       • Ability to customize the Groovy Truth by
         implementing of method boolean asB...
nd a
                   Ag e                                                                     • Future (Groovy 1.8+)
  ...
Groovy 1.8
          and beyond...


       • Caution!

       • The following features are still
         subject to disc...
Groovy 1.8, end of 2010

       • Plan to provide various runtime improvements to
         make Groovy faster and faster

...
Extended annotations

       • Go beyond Java 5,
         and let annotations support more type parameters
               ...
Command-expression
      based DSL

       • Groovy lets you omit parentheses for top-level
         expressions, and mix ...
Pattern matching

       • Structural pattern matching on PO(J|G)Os
       • First experiments will be done as module
    ...
Parser combinators

       • Same as pattern matching, experiments need to be
         done as a module, before possible i...
nd a
                   Ag e
                                                                                            •...
Summary

       • Groovy, still inovative, since 2003!
               – Newever versions always bring their share of new
 ...
Questions & Answers




    Copyright 2009 SpringSource. Copying, publishing or distributing without express written permi...
Photo credits

       •     Buzz LightYear: http://bu77lightyear.files.wordpress.com/2008/09/buzzlightyear_high.jpg
      ...
Upcoming SlideShare
Loading in …5
×

Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009

3,128 views
3,045 views

Published on

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.

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,128
On SlideShare
0
From Embeds
0
Number of Embeds
119
Actions
Shares
0
Downloads
85
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009

  1. 1. to Infinity and Beyond mercredi 9 décembre 2009
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 27. AST Viewer Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 27 mercredi 9 décembre 2009
  28. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 39. Questions & Answers Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 39 mercredi 9 décembre 2009
  40. 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

×