Road to Grails 3.0
By Graeme Rocher

© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission.

Fri...
Agenda
§ What’s new in Grails 2.3?
§ What’s planned for Grails 3.0?
§ Summary / Q & A

Friday, September 13, 13
SPRING IO EXECUTION:

Grails

Friday, September 13, 13
What’s new in Grails 2.3?

•
•
•
•
•

Forked Execution and Test Daemon
Dependency Resolution with Aether
Complete Server-S...
What’s new in Grails 2.3?

•
•
•
•
•

XSS Prevention
Hibernate 4 Support (via Plugin)
RESTful Scaffolding v2.0
Controller ...
GRAILS

Demo
Aether & Forked
Execution

Friday, September 13, 13
Aether & Dependency Management
• Aether == Same dependency
resolution engine as Maven
– No snapshot troubles
– Same local ...
Forked Execution
• Build and test / runtime split
into separate JVMs
• Daemon used to speed test
execution
• Correctly iso...
GRAILS

Demo
REST Support

Friday, September 13, 13
REST: URL Mappings
• RESTful Mappings
– Single or Multiple resources
– Versioning
– Nested resources

• New url-mappings-r...
REST: @Resource Transformation
• Automatically exposes a
domain class as a REST
resource
• Configurable formats
• Configur...
REST: @Resource Transformation
• Automatically exposes a
domain class as a REST
resource
• Configurable formats
• Configur...
REST: The respond method
• Sends the most
appropriate response for
the given object
• For HTML calculates a
model by conve...
REST: The respond method
• Sends the most
appropriate response for
the given object
• For HTML calculates a
model by conve...
REST: HAL, JSON, XML Renderers
• Rendering customizable
in resources.groovy
• HAL, Atom, Vnd.Error
renders included
• Flex...
REST: HAL, JSON, XML Renderers
• Rendering customizable
in resources.groovy
• HAL, Atom, Vnd.Error
renders included
• Flex...
REST: HAL, JSON, XML Renderers
• Rendering customizable
in resources.groovy
• HAL, Atom, Vnd.Error
renders included
• Flex...
REST: Scaffolding 2.0
• Scaffolding support now a plugin
– http://grails.org/plugin/scaffolding

• Generated controllers n...
REST: Misc Goodies
• grails.rest.RestfulController
– Controller base class for inheriting RESTful actions

• The respond m...
GRAILS

Demo
Async

Friday, September 13, 13
Async: Promise Primitives
• Foundational API for Async
programming
• Includes notion of Promise
• Ability to combine / cha...
Async: Promise Primitives
• Foundational API for Async
programming
• Includes notion of Promise
• Ability to combine / cha...
Async: @DelegateAsync Transform
• Transform any synchronous
API into an asynchronous
one
• Takes each method and
returns a...
Async: @DelegateAsync Transform
• Transform any synchronous
API into an asynchronous
import	
  grails.async.*
one
• Takes ...
Async: GORM
• Makes all GORM methods
async
• Deals with binding session
to background thread
• Works across all
datastores...
Async: GORM
• Makes all GORM methods
async
• Deals with binding session
to background thread
• Works across all
datastores...
Async: Request Processing
• Handle requests
asynchronously
• Uses Servlet 3.0 async
under the covers
• Create asynchronous...
Async: Request Processing
• Handle requests
asynchronously
• Uses Servlet 3.0 async
under the covers
• Create asynchronous...
GRAILS

Demo
Data Binding

Friday, September 13, 13
Data Binder: @BindingFormat
• Per property formatting
• Extensible

22
Friday, September 13, 13
Data Binder: @BindingFormat
• Per property formatting
• Extensible

22
Friday, September 13, 13

class	
  Person	
  {
	
  ...
Data Binder: @BindUsing
• For cases where more
flexibility is needed
• Can be applied to class
or property
• Takes a closu...
Data Binder: @BindUsing
• For cases where more
flexibility is needed
• Can be applied to class
or property
• Takes a closu...
Data Binding: XML/JSON Command Objects
• Can now bind XML/JSON
data to command objects
• Binding can be customized
using t...
Data Binding: XML/JSON Command Objects
• Can now bind XML/JSON
data to command objects
• Binding can be customized
using t...
Data Binding: Auto Query if Domain Object
• If command object is a
domain class query on id
• Passes null if domain class
...
Data Binding: Auto Query if Domain Object
• If command object is a
domain class query on id
• Passes null if domain class
...
GRAILS

Demo
XSS Prevention

Friday, September 13, 13
XSS Prevention
• All GSP expressions and scriptlets now escaped by
default
• Double-encoding prevention
• New raw method t...
XSS Prevention
• All GSP expressions and scriptlets now escaped by
default
• Double-encoding prevention
• New raw method t...
Other Goodies: Hibernate 4 Support
• Hibernate 3 and 4 binary incompatible, so new plugin
• Not all plugins that work with...
Other Goodies: Hibernate 4 Support
• Hibernate 3 and 4 binary incompatible, so new plugin
• Not all plugins that work with...
Other Goodies: @Transactional Transform
•
•
•
•

Can be applied to any class
No proxies required!
Works with controllers
R...
Other Goodies: @Transactional Transform
•
•
•
•

Can be applied to any class
No proxies required!
Works with controllers
R...
Other Goodies: @DirtyCheck Transform
• Can be applied to any class
to add dirty checking
• Tracks calls to setters that
mo...
Other Goodies: @DirtyCheck Transform
• Can be applied to any class
to add dirty checking
• Tracks calls to setters that
mo...
Other Goodies: Action Error Handlers
• Actions that define an exception as the first argument get
invoked if the exception...
Other Goodies: Action Error Handlers
• Actions that define an exception as the first argument get
invoked if the exception...
Other Goodies: Controller Namespaces
• Controllers can now define a namespace
• URL Mappings can map to a specific namespa...
Other Goodies: Controller Namespaces
• Controllers can now define a namespace
• URL Mappings can map to a specific namespa...
Q&A
Grails 2.3

2.3
Friday, September 13, 13
The Future
Grails 3.0

3.0
Friday, September 13, 13
Grails 3.0: Goals

•
•
•
•
•
•

3.0

Embrace Gradle
Abstract Packaging / Deployment
Reach outside the Servlet Container
Ap...
Grails 3.0: Gradle
•
•
•
•

Deprecate existing build system
Replace with Gradle build
Easier now everything is forked in 2...
Grails 3.0: App Profiles
• Each profile will have distinct plugins, runtimes and
packaging (JAR, WAR etc.)

37
Friday, Sep...
Grails 3.0: App Profiles
• Each profile will have distinct plugins, runtimes and
packaging (JAR, WAR etc.)
$	
  grails	
  ...
Grails 3.0: Challenges

• Compatibility
– Plugins
– Build System

• Modularization
– Servlet API independence
– Refactorin...
Q&A
Grails 3.0

3.0
Friday, September 13, 13
Learn More. Stay Connected.

Also by me
“RESTfully Async with Grails 2.3” - Wednesday 2:30pm
Web: grails.org
Twitter: twit...
Upcoming SlideShare
Loading in...5
×

Road to Grails 3.0

3,133

Published on

Speaker: Graeme Rocher
In this talk Grails project lead, Graeme Rocher, will talk through the latest and greatest happenings in the world of Grails including a walk through of the features included Grails 2.3 and upcoming in Grails 3.0

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

No Downloads
Views
Total Views
3,133
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
25
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Road to Grails 3.0

  1. 1. Road to Grails 3.0 By Graeme Rocher © 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission. Friday, September 13, 13
  2. 2. Agenda § What’s new in Grails 2.3? § What’s planned for Grails 3.0? § Summary / Q & A Friday, September 13, 13
  3. 3. SPRING IO EXECUTION: Grails Friday, September 13, 13
  4. 4. What’s new in Grails 2.3? • • • • • Forked Execution and Test Daemon Dependency Resolution with Aether Complete Server-Side REST Support Async Programmings APIs New Data Binding APIs 4 Friday, September 13, 13 2.3
  5. 5. What’s new in Grails 2.3? • • • • • XSS Prevention Hibernate 4 Support (via Plugin) RESTful Scaffolding v2.0 Controller Namespaces ... and much, much more 5 Friday, September 13, 13 2.3
  6. 6. GRAILS Demo Aether & Forked Execution Friday, September 13, 13
  7. 7. Aether & Dependency Management • Aether == Same dependency resolution engine as Maven – No snapshot troubles – Same local repo – No Ivy bugs • New dependency-report command to visualize graph 7 Friday, September 13, 13
  8. 8. Forked Execution • Build and test / runtime split into separate JVMs • Daemon used to speed test execution • Correctly isolates classpaths • test-app can’t break run-app! 8 Friday, September 13, 13
  9. 9. GRAILS Demo REST Support Friday, September 13, 13
  10. 10. REST: URL Mappings • RESTful Mappings – Single or Multiple resources – Versioning – Nested resources • New url-mappings-report command to mappings 10 Friday, September 13, 13
  11. 11. REST: @Resource Transformation • Automatically exposes a domain class as a REST resource • Configurable formats • Configuration HTTP methods 11 Friday, September 13, 13
  12. 12. REST: @Resource Transformation • Automatically exposes a domain class as a REST resource • Configurable formats • Configuration HTTP methods 11 Friday, September 13, 13 import  grails.rest.* @Resource class  Person  {        String  name }
  13. 13. REST: The respond method • Sends the most appropriate response for the given object • For HTML calculates a model by convention and delegates to view 12 Friday, September 13, 13
  14. 14. REST: The respond method • Sends the most appropriate response for the given object • For HTML calculates a model by convention and delegates to view 12 Friday, September 13, 13 class  PersonController   { def  index()  { respond  Book.list() } }
  15. 15. REST: HAL, JSON, XML Renderers • Rendering customizable in resources.groovy • HAL, Atom, Vnd.Error renders included • Flexible and complete 13 Friday, September 13, 13
  16. 16. REST: HAL, JSON, XML Renderers • Rendering customizable in resources.groovy • HAL, Atom, Vnd.Error renders included • Flexible and complete 13 Friday, September 13, 13 import  grails.rest.render.hal.* beans  =  {  halBookRenderer(HalJsonRenderer,                                    rest.test.Book) }
  17. 17. REST: HAL, JSON, XML Renderers • Rendering customizable in resources.groovy • HAL, Atom, Vnd.Error renders included • Flexible and complete 13 Friday, September 13, 13 import  grails.rest.render.hal.* beans  =  {  halBookRenderer(HalJsonRenderer,                                    rest.test.Book) } import  grails.rest.render.xml.* beans  =  {        bookRenderer(XmlRenderer,                                    Book)  {                includes  =  ['title']        } }
  18. 18. REST: Scaffolding 2.0 • Scaffolding support now a plugin – http://grails.org/plugin/scaffolding • Generated controllers now RESTful • New generate-asynccontroller command for Async support 14 Friday, September 13, 13
  19. 19. REST: Misc Goodies • grails.rest.RestfulController – Controller base class for inheriting RESTful actions • The respond method – Chooses most appropriate response format • Versioning support via URL mapping or Accept-Version header • Find out more http://grails.org/doc/2.3.x/guide/ webServices.html#REST 15 Friday, September 13, 13
  20. 20. GRAILS Demo Async Friday, September 13, 13
  21. 21. Async: Promise Primitives • Foundational API for Async programming • Includes notion of Promise • Ability to combine / chain promises 17 Friday, September 13, 13
  22. 22. Async: Promise Primitives • Foundational API for Async programming • Includes notion of Promise • Ability to combine / chain promises 17 Friday, September 13, 13 import  static   grails.async.Promises.* def  p1  =  task  {  2  *  2  } def  p2  =  task  {  4  *  4  } def  p3  =  task  {  8  *  8  } assert  [  4,  16,  64  ]  ==   waitAll(p1,  p2,  p3)
  23. 23. Async: @DelegateAsync Transform • Transform any synchronous API into an asynchronous one • Takes each method and returns a promise 18 Friday, September 13, 13
  24. 24. Async: @DelegateAsync Transform • Transform any synchronous API into an asynchronous import  grails.async.* one • Takes each method and class  AsyncBookService  { returns a promise      @DelegateAsync        BookService  bookService } 18 Friday, September 13, 13
  25. 25. Async: GORM • Makes all GORM methods async • Deals with binding session to background thread • Works across all datastores (MongoDB, GORM for REST etc.) 19 Friday, September 13, 13
  26. 26. Async: GORM • Makes all GORM methods async • Deals with binding session to background thread • Works across all datastores (MongoDB, GORM for REST etc.) 19 Friday, September 13, 13 def  p1  =  Person.async.get(1) def  p2  =  Person.async.get(2) def  p3  =  Person.async.get(3) def  results  =                waitAll(p1,  p2,  p3)
  27. 27. Async: Request Processing • Handle requests asynchronously • Uses Servlet 3.0 async under the covers • Create asynchronous models 20 Friday, September 13, 13
  28. 28. Async: Request Processing • Handle requests asynchronously • Uses Servlet 3.0 async under the covers • Create asynchronous models 20 Friday, September 13, 13 import  static   grails.async.Promises.* class  PersonController  {    def  index()  {      tasks  books:  Book.async.list(),                total:  Book.async.count(),                otherValue:  {                      //  do  hard  work                }      } }
  29. 29. GRAILS Demo Data Binding Friday, September 13, 13
  30. 30. Data Binder: @BindingFormat • Per property formatting • Extensible 22 Friday, September 13, 13
  31. 31. Data Binder: @BindingFormat • Per property formatting • Extensible 22 Friday, September 13, 13 class  Person  {  @BindingFormat('MMddyyyy')  Date  birthDate  @BindingFormat('Uppercase')  String  salutation }
  32. 32. Data Binder: @BindUsing • For cases where more flexibility is needed • Can be applied to class or property • Takes a closure or a class that implements BindingHelper 23 Friday, September 13, 13
  33. 33. Data Binder: @BindUsing • For cases where more flexibility is needed • Can be applied to class or property • Takes a closure or a class that implements BindingHelper 23 Friday, September 13, 13 class  Person  {    @BindUsing({                obj,  source  -­‐>                        source['name']?                        .toUpperCase()  })  String  salutation }
  34. 34. Data Binding: XML/JSON Command Objects • Can now bind XML/JSON data to command objects • Binding can be customized using the BindingSource and BindingSourceCreator interfaces 24 Friday, September 13, 13
  35. 35. Data Binding: XML/JSON Command Objects • Can now bind XML/JSON data to command objects • Binding can be customized using the BindingSource and BindingSourceCreator interfaces 24 Friday, September 13, 13 class  PersonController   {    def  save(PersonCmd  p)        {        ...    } }
  36. 36. Data Binding: Auto Query if Domain Object • If command object is a domain class query on id • Passes null if domain class not found • If found binds XML, JSON or params 25 Friday, September 13, 13
  37. 37. Data Binding: Auto Query if Domain Object • If command object is a domain class query on id • Passes null if domain class not found • If found binds XML, JSON or params 25 Friday, September 13, 13 class  PersonController   {    def  save(Person  p)  {        ...    } }
  38. 38. GRAILS Demo XSS Prevention Friday, September 13, 13
  39. 39. XSS Prevention • All GSP expressions and scriptlets now escaped by default • Double-encoding prevention • New raw method to mark data as safe 27 Friday, September 13, 13
  40. 40. XSS Prevention • All GSP expressions and scriptlets now escaped by default • Double-encoding prevention • New raw method to mark data as safe //  Inside  GSP <section>${raw(page.content)}</section> 27 Friday, September 13, 13
  41. 41. Other Goodies: Hibernate 4 Support • Hibernate 3 and 4 binary incompatible, so new plugin • Not all plugins that work with Hibernate 3 will work with Hibernate 4 28 Friday, September 13, 13
  42. 42. Other Goodies: Hibernate 4 Support • Hibernate 3 and 4 binary incompatible, so new plugin • Not all plugins that work with Hibernate 3 will work with Hibernate 4 //  add  to  BuildConfig compile  ':hibernate::hibernate4:4.1.11.1' 28 Friday, September 13, 13
  43. 43. Other Goodies: @Transactional Transform • • • • Can be applied to any class No proxies required! Works with controllers Replacement for Spring’s @Transactional annotation 29 Friday, September 13, 13
  44. 44. Other Goodies: @Transactional Transform • • • • Can be applied to any class No proxies required! Works with controllers Replacement for Spring’s @Transactional annotation 29 Friday, September 13, 13 import   grails.transactions.* @Transactional class  PersonService  { ... }
  45. 45. Other Goodies: @DirtyCheck Transform • Can be applied to any class to add dirty checking • Tracks calls to setters that modify state • Classes implement the DirtyCheckable interface 30 Friday, September 13, 13
  46. 46. Other Goodies: @DirtyCheck Transform • Can be applied to any class to add dirty checking • Tracks calls to setters that modify state • Classes implement the DirtyCheckable interface @DirtyCheck class  Person  { ... } def  p  =    new  Person(name:'Bob') p.trackChanges() assert  !p.hasChanged() p.name  =  'Fred' assert  p.hasChanged() 30 Friday, September 13, 13
  47. 47. Other Goodies: Action Error Handlers • Actions that define an exception as the first argument get invoked if the exception is thrown from any other action 31 Friday, September 13, 13
  48. 48. Other Goodies: Action Error Handlers • Actions that define an exception as the first argument get invoked if the exception is thrown from any other action class  PersonController  {      ...      def  tooOld(TooOldException  e)  {            render  view:  'tooOld'            } } 31 Friday, September 13, 13
  49. 49. Other Goodies: Controller Namespaces • Controllers can now define a namespace • URL Mappings can map to a specific namespace 32 Friday, September 13, 13
  50. 50. Other Goodies: Controller Namespaces • Controllers can now define a namespace • URL Mappings can map to a specific namespace class  PersonController  {      ...      static  namespace  =  'admins'             } 32 Friday, September 13, 13
  51. 51. Q&A Grails 2.3 2.3 Friday, September 13, 13
  52. 52. The Future Grails 3.0 3.0 Friday, September 13, 13
  53. 53. Grails 3.0: Goals • • • • • • 3.0 Embrace Gradle Abstract Packaging / Deployment Reach outside the Servlet Container App Profiles: Netty, Servlet, Batch, Hadoop Deployment with run-app Extend the reach of Grails 35 Friday, September 13, 13
  54. 54. Grails 3.0: Gradle • • • • Deprecate existing build system Replace with Gradle build Easier now everything is forked in 2.3.x All the flexibility of a powerful build system • Legacy bridge layer for running old 36 Friday, September 13, 13
  55. 55. Grails 3.0: App Profiles • Each profile will have distinct plugins, runtimes and packaging (JAR, WAR etc.) 37 Friday, September 13, 13
  56. 56. Grails 3.0: App Profiles • Each profile will have distinct plugins, runtimes and packaging (JAR, WAR etc.) $  grails  create-­‐app  myapp  -­‐-­‐profile=netty   $  cd  myapp $  grails  package $  java  -­‐jar  target/myapp.jar 37 Friday, September 13, 13
  57. 57. Grails 3.0: Challenges • Compatibility – Plugins – Build System • Modularization – Servlet API independence – Refactoring 38 Friday, September 13, 13 3.0
  58. 58. Q&A Grails 3.0 3.0 Friday, September 13, 13
  59. 59. Learn More. Stay Connected. Also by me “RESTfully Async with Grails 2.3” - Wednesday 2:30pm Web: grails.org Twitter: twitter.com/grailsframework LinkedIn: http://linkedin.com/groups/Grails-User-Group-39757 Google +: https://plus.google.com/communities/ 109558563916416343008 Friday, September 13, 13
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×