• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Groovy 1 7 Update, past, present, future - S2G Forum 2010
 

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

on

  • 4,958 views

 

Statistics

Views

Total Views
4,958
Views on SlideShare
4,946
Embed Views
12

Actions

Likes
4
Downloads
47
Comments
0

1 Embed 12

http://www.slideshare.net 12

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Groovy 1 7 Update, past, present, future - S2G Forum 2010 Groovy 1 7 Update, past, present, future - S2G Forum 2010 Presentation Transcript

    • Groovy, past, present, future with a 1.7 update Guillaume Laforge Groovy Project Manager © 2010 SpringSource, A division of VMware. All rights reserved 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 • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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 @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
    • @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
    • @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
    • @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
    • 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
    • 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) } } 26 lundi 22 mars 2010
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • nda Ag e • Summary • Questions & Answers Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 47 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