KEMBAR78
Groovy & Grails for Spring/Java developers | PDF
Groovy & Grails for Java
                             developers
                        Peter Ledbrook, Developer Advocate
                       pledbrook@vmware.com / @pledbrook



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

                                                                                   1
Demo




       2
3

    3
4

    4
5

    5
6

    6
7

    7
8

    8
9

    9
10

     10
11

     11
12

     12
13

     13
14

     14
15

     15
16

     16
17

     17
18

     18
19

     19
20

     20
21

     21
22

     22
23

     23
24

     24
25

     25
26

     26
27

     27
28

     28
29

     29
30

     30
31

     31
32

     32
33

     33
34

     34
35

     35
36

     36
37

     37
38

     38
39

     39
40

     40
41

     41
42

     42
43

     43
44

     44
45

     45
46

     46
47

     47
48

     48
49

     49
50

     50
51

     51
52

     52
53

     53
54

     54
55

     55
56

     56
57

     57
58

     58
59

     59
60

     60
• Grails for Swing applications
• MVC model                                     http://griffon.codehaus.org/
• SwingBuilder for views

application(title: 'DemoConsole', pack: true, locationByPlatform: true) {
  panel(border: emptyBorder(6)) {
     borderLayout()
     scrollPane(constraints: CENTER) {
       textArea(
          text: bind(target: model, targetProperty: 'scriptSource'),
          enabled: bind {model.enabled},
          columns: 40, rows: 10)
     }
  }
}



                                                                            61

                                                                                 61
Gradle

•   Build tool with built-in dependency management
•   Conventions through plugins
•   Multi-project support
•   Full access to tasks and dependency tree
•   Easy to write your own tasks
    – either in the build file
    – or via Groovy/Java classes



                      http://www.gradle.org/



                                                     62

                                                          62
• Parallel processing for Groovy
• Actors library making full use of closures

@Grab(group='org.codehaus.gpars', module='gpars', version='0.11')
import groovyx.gpars.GParsPool

GParsPool.withPool {
  def animals = ['dog', 'ant', 'cat', 'whale']
  println(animals.anyParallel {it ==~ /ant/} ?
       'Found an ant' : 'No ants found')
  println(animals.everyParallel {it.contains('a')} ?
       'All animals contain a' : 'Some animals can live without an a')
}



                       http://gpars.codehaus.org/

                                                                         63

                                                                              63
Try it out!




         http://groovyconsole.appspot.com/




                                             64

                                                  64
What is Grails?


• Rapid Web Application Development Framework
  – for the JVM
  – with first-class Java integration
• Inspired by Ruby on Rails, Django and others
  – Convention over Configuration
  – Don’t Repeat Yourself (DRY)




                                                 65

                                                      65
What is Grails?

     Grails
                                         Servlet
          Web MVC        GSP (Views)
                                        Container



            GORM
                          Database        I18n
         (Data Access)



              Build      Test Support   Doc Engine




                                                     66

                                                          66
What is Grails?


                  Grails




                           67

                                67
What is Grails?



                   Web Controllers
The Domain Model
                   i18n bundles
Business Logic
                   Custom View Tags
Views & Layouts
                   Libraries (JARs)
Build Commands
                   Additional Sources
Tests
                   Web Resources


                                        68

                                             68
Say bye-bye to the plumbing!




                               69

                                    69
Demo




       70
Enterprise requirements


                              Web App




      Messaging                                    JEE




                   Legacy
                                        Services
                  Databases



            Is this a problem for Grails apps?

                                                         71

                                                              71
Build

• Remember the Grails project structure?
  – add in build events and...

           Can’t build natively with other build tools!




                 Ant              Maven           Gradle




                            Grails Build System



                                                           72

                                                                72
Dependency DSL


 grails.project.dependency.resolution = {
   inherits "global"
   log "warn"
   repositories {
       grailsHome()
       mavenCentral()
       mavenRepo "http://localhost:8081/..."
   }
   ...
 }




                                               73

                                                    73
Dependency DSL

 grails.project.dependency.resolution = {
   inherits "global"
   log "warn"
   ...
   dependencies {
       runtime "mysql:mysql-connector-java:5.1.17"
       test "org.gmock:gmock:0.8.1"
       ...
   }
   plugins {
       compile ":spring-security-core:1.2.7"
       ...
   }
 }


                                                     74

                                                          74
‘Legacy’ Databases

• Grails can create a database from your domain model...
• ...but what if you don’t own the database?
  – DBA determines structure
  – Company conventions
  – Existing ‘legacy’ database




                                                           75

                                                                75
Option 1: Custom ORM mapping

• No existing domain model
• Schema not too far off the beaten track

 class Book {
    ...
    static mapping = {
        table "books"
        title type: "books"
        author column: "author_ref"
    }
 }




                                            76

                                                 76
Option 2: JPA annotations

• Existing Java/JPA domain model


 <?xml version='1.0' encoding='UTF-8'?>
 <!DOCTYPE ...>
 <hibernate-configuration>
   <session-factory>
      <mapping class="org.ex.Book"/>
      <mapping class="org.ex.Author"/>
      ...
   </session-factory>
 </hibernate-configuration>

                             grails-app/conf/hibernate/hibernate.cfg.xml



                                                                           77

                                                                                77
Option 3: Hibernate XML Mappings

• You have Java model + Hibernate mapping files
• Schema is way off the beaten track


 <?xml version='1.0' encoding='UTF-8'?>
 <!DOCTYPE ...>
 <hibernate-configuration>
   <session-factory>
      <mapping resource="org.ex.Book.hbm.xml"/>
      <mapping resource="org.ex.Author.hbm.xml"/>
      ...
   </session-factory>
 </hibernate-configuration>

                            grails-app/conf/hibernate/hibernate.cfg.xml

                                                                          78

                                                                               78
Constraints


Given domain class:

     org.example.myapp.domain.Book

Then:

     src/java/org/example/myapp/domain/BookConstraints.groovy


 constraints = {
   title blank: false, unique: true
   ...
 }


                                                                79

                                                                     79
Option 4: GORM JPA Plugin

• GORM layer over JPA
• Use your own JPA provider
• Useful for cloud services that only work with JPA, not
  Hibernate




                                                           80

                                                                80
Database Migration Plugin

      Pre-production, Hibernate ‘update’ or ‘create-drop’



                    dbm-generate-changelog
                      dbm-changelog-sync




                      Change domain model




                         dbm-gorm-diff
                          dbm-update



                                                            81

                                                                 81
Reverse Engineering Plugin




                        class Person {
                            String name
                            Integer age
                            ...
                        }




                                          82

                                               82
Grails is Spring

• Spring MVC under the hood
• Grails provides many useful beans
  – e.g. grailsApplication
• Define your own beans!
  – resources.xml/groovy
  – In a plugin




                                      83

                                           83
Example

import ...
beans = {
  credentialMatcher(Sha1CredentialsMatcher) {
     storedCredentialsHexEncoded = true
  }

    sessionFactory(ConfigurableLocalSessionFactoryBean) {
      dataSource = ref("dataSource")
      hibernateProperties = [
           "hibernate.hbm2ddl.auto": "create-drop",
           "hibernate.show_sql": true ]
    }
}




                                                            84

                                                                 84
Summary

• Various options for integrating Grails with:
  – Development/build
  – Deployment processes
• Works with many external systems
  – Solid support for non-Grailsy DB schemas
  – Flexible messaging & web service support




                                                 85

                                                      85
More info

• w:   http://grails.org/
• f:   http://grails.org/Mailing+Lists

• e:   pledbrook@vmware.com
• t:   pledbrook
• b:   http://blog.springsource.com/author/peter-ledbrook/




                                                             86

                                                                  86
Q&A




      87

Groovy & Grails for Spring/Java developers

  • 1.
    Groovy & Grailsfor Java developers Peter Ledbrook, Developer Advocate pledbrook@vmware.com / @pledbrook © 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission. 1
  • 2.
  • 3.
    3 3
  • 4.
    4 4
  • 5.
    5 5
  • 6.
    6 6
  • 7.
    7 7
  • 8.
    8 8
  • 9.
    9 9
  • 10.
    10 10
  • 11.
    11 11
  • 12.
    12 12
  • 13.
    13 13
  • 14.
    14 14
  • 15.
    15 15
  • 16.
    16 16
  • 17.
    17 17
  • 18.
    18 18
  • 19.
    19 19
  • 20.
    20 20
  • 21.
    21 21
  • 22.
    22 22
  • 23.
    23 23
  • 24.
    24 24
  • 25.
    25 25
  • 26.
    26 26
  • 27.
    27 27
  • 28.
    28 28
  • 29.
    29 29
  • 30.
    30 30
  • 31.
    31 31
  • 32.
    32 32
  • 33.
    33 33
  • 34.
    34 34
  • 35.
    35 35
  • 36.
    36 36
  • 37.
    37 37
  • 38.
    38 38
  • 39.
    39 39
  • 40.
    40 40
  • 41.
    41 41
  • 42.
    42 42
  • 43.
    43 43
  • 44.
    44 44
  • 45.
    45 45
  • 46.
    46 46
  • 47.
    47 47
  • 48.
    48 48
  • 49.
    49 49
  • 50.
    50 50
  • 51.
    51 51
  • 52.
    52 52
  • 53.
    53 53
  • 54.
    54 54
  • 55.
    55 55
  • 56.
    56 56
  • 57.
    57 57
  • 58.
    58 58
  • 59.
    59 59
  • 60.
    60 60
  • 61.
    • Grails forSwing applications • MVC model http://griffon.codehaus.org/ • SwingBuilder for views application(title: 'DemoConsole', pack: true, locationByPlatform: true) { panel(border: emptyBorder(6)) { borderLayout() scrollPane(constraints: CENTER) { textArea( text: bind(target: model, targetProperty: 'scriptSource'), enabled: bind {model.enabled}, columns: 40, rows: 10) } } } 61 61
  • 62.
    Gradle • Build tool with built-in dependency management • Conventions through plugins • Multi-project support • Full access to tasks and dependency tree • Easy to write your own tasks – either in the build file – or via Groovy/Java classes http://www.gradle.org/ 62 62
  • 63.
    • Parallel processingfor Groovy • Actors library making full use of closures @Grab(group='org.codehaus.gpars', module='gpars', version='0.11') import groovyx.gpars.GParsPool GParsPool.withPool { def animals = ['dog', 'ant', 'cat', 'whale'] println(animals.anyParallel {it ==~ /ant/} ? 'Found an ant' : 'No ants found') println(animals.everyParallel {it.contains('a')} ? 'All animals contain a' : 'Some animals can live without an a') } http://gpars.codehaus.org/ 63 63
  • 64.
    Try it out! http://groovyconsole.appspot.com/ 64 64
  • 65.
    What is Grails? •Rapid Web Application Development Framework – for the JVM – with first-class Java integration • Inspired by Ruby on Rails, Django and others – Convention over Configuration – Don’t Repeat Yourself (DRY) 65 65
  • 66.
    What is Grails? Grails Servlet Web MVC GSP (Views) Container GORM Database I18n (Data Access) Build Test Support Doc Engine 66 66
  • 67.
    What is Grails? Grails 67 67
  • 68.
    What is Grails? Web Controllers The Domain Model i18n bundles Business Logic Custom View Tags Views & Layouts Libraries (JARs) Build Commands Additional Sources Tests Web Resources 68 68
  • 69.
    Say bye-bye tothe plumbing! 69 69
  • 70.
  • 71.
    Enterprise requirements Web App Messaging JEE Legacy Services Databases Is this a problem for Grails apps? 71 71
  • 72.
    Build • Remember theGrails project structure? – add in build events and... Can’t build natively with other build tools! Ant Maven Gradle Grails Build System 72 72
  • 73.
    Dependency DSL grails.project.dependency.resolution= { inherits "global" log "warn" repositories { grailsHome() mavenCentral() mavenRepo "http://localhost:8081/..." } ... } 73 73
  • 74.
    Dependency DSL grails.project.dependency.resolution= { inherits "global" log "warn" ... dependencies { runtime "mysql:mysql-connector-java:5.1.17" test "org.gmock:gmock:0.8.1" ... } plugins { compile ":spring-security-core:1.2.7" ... } } 74 74
  • 75.
    ‘Legacy’ Databases • Grailscan create a database from your domain model... • ...but what if you don’t own the database? – DBA determines structure – Company conventions – Existing ‘legacy’ database 75 75
  • 76.
    Option 1: CustomORM mapping • No existing domain model • Schema not too far off the beaten track class Book { ... static mapping = { table "books" title type: "books" author column: "author_ref" } } 76 76
  • 77.
    Option 2: JPAannotations • Existing Java/JPA domain model <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE ...> <hibernate-configuration> <session-factory> <mapping class="org.ex.Book"/> <mapping class="org.ex.Author"/> ... </session-factory> </hibernate-configuration> grails-app/conf/hibernate/hibernate.cfg.xml 77 77
  • 78.
    Option 3: HibernateXML Mappings • You have Java model + Hibernate mapping files • Schema is way off the beaten track <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE ...> <hibernate-configuration> <session-factory> <mapping resource="org.ex.Book.hbm.xml"/> <mapping resource="org.ex.Author.hbm.xml"/> ... </session-factory> </hibernate-configuration> grails-app/conf/hibernate/hibernate.cfg.xml 78 78
  • 79.
    Constraints Given domain class: org.example.myapp.domain.Book Then: src/java/org/example/myapp/domain/BookConstraints.groovy constraints = { title blank: false, unique: true ... } 79 79
  • 80.
    Option 4: GORMJPA Plugin • GORM layer over JPA • Use your own JPA provider • Useful for cloud services that only work with JPA, not Hibernate 80 80
  • 81.
    Database Migration Plugin Pre-production, Hibernate ‘update’ or ‘create-drop’ dbm-generate-changelog dbm-changelog-sync Change domain model dbm-gorm-diff dbm-update 81 81
  • 82.
    Reverse Engineering Plugin class Person { String name Integer age ... } 82 82
  • 83.
    Grails is Spring •Spring MVC under the hood • Grails provides many useful beans – e.g. grailsApplication • Define your own beans! – resources.xml/groovy – In a plugin 83 83
  • 84.
    Example import ... beans ={ credentialMatcher(Sha1CredentialsMatcher) { storedCredentialsHexEncoded = true } sessionFactory(ConfigurableLocalSessionFactoryBean) { dataSource = ref("dataSource") hibernateProperties = [ "hibernate.hbm2ddl.auto": "create-drop", "hibernate.show_sql": true ] } } 84 84
  • 85.
    Summary • Various optionsfor integrating Grails with: – Development/build – Deployment processes • Works with many external systems – Solid support for non-Grailsy DB schemas – Flexible messaging & web service support 85 85
  • 86.
    More info • w: http://grails.org/ • f: http://grails.org/Mailing+Lists • e: pledbrook@vmware.com • t: pledbrook • b: http://blog.springsource.com/author/peter-ledbrook/ 86 86
  • 87.
    Q&A 87