Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,397 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
  • Be the first to comment

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

×