SlideShare a Scribd company logo
1 of 23
Download to read offline
Adopting Grails


Klaus Baumecker
   Hewlett-Packard
About me
Klaus Baumecker
Software Architect & Technologist @
       Hewlett-Packard, Böblingen, Germany


Professional Software Developer since 1992


Java Programmer since 12+ years
Using Groovy & Grails since 3+ years




2
Introduction
We started using Grails in production 2 years ago.
We used Grails already for in-house projects (version 1.0.x)


The following episodes show


        … what we’ve learned and
        … a few best practices derived from it.




3
Context
•   Large product suite for IT-Management in HP Software
•   Two teams developing the next release of a product
    – One   using classic JEE approach
    – Other   using Grails

•   Both web-apps share a common data model based on POJOs and
    Hibernate mapping files
•   All web-apps run inside a JBoss application server
•   Continuous integration builds based on maven
•   Time-boxed development cycles
•   Agile approach with features and stories (SCRUM like)




4
Episode 1 – GORM Constraints
The Grails web-app uses GORM constraints to enforce rules on the
domain classes
There was and (and still is) a general attempt to reduce footprint by
moving common web-app libraries into shared lib space
   therefore the shared domain model (incl. hibernate mapping) became
    a shared library (among others like apache-commons-*, etc)



                           GORM constraints work fine in
                           development (run-app), but are
                           ignored while running production
                           code inside JBoss



5
Episode 1
            GORM constraints were part of the Grails source
            code (src/groovy/…)

            They were loaded by the web-app class loader

            Domain classes and mapping file have been
            loaded by the shared class loader (and loaded
            before the constraints)

            The shared class loader cannot access classes
            within the web-app (only the other way around)

            GORM constraints are ignored!

             Extract constraints and move to shared lib
            space

6
Episode 2 – Flex UI
Demand for graphical editor has led to Flex based UIs.
Communication was XML based.
Then we’ve seen too many Flex timeouts. So we moved to faster
communication with Blaze-DS using the BlazeDS grails-plugin.
We mapped domain classes to Flex classes (Blaze feature).
Better performance now, but…



                         After a round-trip of a data object
                         (grails - flex - grails) we got empty
                         fields in the received object. Although
                         there were properly set before and
                         not modified in the UI.

7
Episode 2


        Our POJO based domain classes have some
        protected fields (public getter, private setter).

        No problem for hibernate.

        Blaze-DS uses commons-bean utilities for mapping
        from/to POJOs and ignores asymmetric fields.

         Need DTO and some tool to define mapping. We
          use Dozer (dozer.org)




8
Grails with BlazeDS or not?
Motivation: Optimization (High performance data transfer)!...But
sometimes you really need
    –a   different rendering strategy (partial vs. all at once)
    –a   fix for your slow performing back end (Flex timeouts)


Use cases
    – Event   Browser for IT-Mgmt:
     •   Large list of IT events to be viewed by an operator (> 20000 events)
     •   Interactive operations on events (e.g. filtering, dynamic updates from the server)

    – More    advanced client/server communication (pub/sub, push)



Main issues
    – Another    layer in your communication
    – No   controller level (Blaze works on services directly)  breaks Grails paradigm
     •   Same with other communication extensions directly working on services (remoting plugin).
     •   Some security plugins do not work as expected
9
Generalizing the Controller layer
•   Grails services w/
    controller semantics        Controller
                                                                                          Other
                                Layer                HTTP          BlazeDS    Remoting
•   Avoiding redundant          (transport spec.)                                        Access

    authorization


                                Services                                Business
                                Layer (atomic ops,                       Service
                                caller neutral)
          Grails       Grails
                                                                       Transaction
         Controller   Service



                                Business Logic                Business           Business
                                Layer (optional)            Logic Services     Logic Service




    10
Episode 3 – Design your web services
We’re using XML for most of our UI/backend communication.
Our backend provides web services for UI and automation tools.
The Flex guy says: Add a special attribute to the XML to make my
rendering easier.
Architect says: Don’t fiddle with the automation interface!




                        How to setup my web services to
                        fit the needs for UI and
                        automation?



11
Episode 3


        Flex = Rich UI  Treat your UI as another
        automation client.

        Don’t allow UI specifics to show up in the XML. If
        you don’t, you’ll end up in maintaining parallel XML
        flows.

        My recommendation for XML generation
        • gsp.xml
        • Plain XML code is easy to read and maintain
        • No DTO required (as in BlazeDS or JAXB). Map
          domain data to XML inside the gsp.



12
Episode 4 – Meta Programming
Due to a change of the architecture some domain classes are no longer
stored in our DB. They stored with a different technique (out of our
control).
GORM methods are no longer available.
Store and retrieval is replaced by new a persistence API incl. new DAOs


                      We still have many consumers of
                      the (original) classes all over the
                      place.

                      How to minimize refactoring?




13
Episode 4

        Enhance the meta-class of the old classes by the
        missing GORM functions (get(..), simple finders).

        Meta-class methods map to the new API.

        Existing code remains unchanged.

        But do this with care!

        Comment your code and explain it in your tech
        meeting.




14
Episode 5 – Developer Support
Programmers with strong Java background often feel lost with reduced
IDE support.


They miss(ed) code completion, static analysis, compile errors, etc.




                       How can we reduce the whining
                       and complaining, while moving
                       them into the Groovy/Grails
                       world?




15
Episode 5


        Get a good IDE.

        Spent effort in installing analysis tools into your
        build. E.g. run CodeNarc analysis.

        Write your own CodeNarc rules according to your
        internal regulations and needs

        Own rule brought some safety back: “Finding
        dynamic variable”.




16
Episode 6 – Modularization with Plugins
Each web-app developed services which became useful in the other
web-app.


Inter-web-app communication is easy to set-up but not really a solution
     – Architecture,   security, etc.
     – E.g.   RMI



Reusing a Grails service inside a Java web-app is not straight-forward.


                                        How can we leverage functionality
                                        across multiple web-apps, keep good
                                        architecture and independent web-app
                                        development in two teams?

17
Episode 6
        Grails-ify the Java web-app. Now you have two
        Grails apps.

        Extract shared services into additional Grails
        plugin(s).

        Create a new umbrella Grails app that loads the two
        main web-apps as plugins.

        The two Grails apps consume the extracted services
        plugins.

        Each of the main web-apps run independently (run-
        app) to keep lightweight development for each team.



18
From applications to plugins
•    Refactor your beans from resources.groovy to a resource location, e.g.
     src/java/myBeans.groovy
     – Watch     out:
       •   Before: “beans = {“
       •   After: “beans {”

•    For each web-app :
     – Refer    to the new beans file within resources.groovy

•    Merging beans in the umbrella app
     – Refer    to the new beans files from the underlying web-apps
     – Wire   beans between web-apps (optional)

•    Add plugin descriptor
•    Adjust URL mapping
•    Merge other resources (e.g. files under web-app/)
     – Requires      extra scripting
19
From applications to plugins (con’t)
beans = {
                                  resource.groovy
                                                    umbrella
    loadBeans(‘/beans2.groovy’)                     web-app
    loadBeans(‘/beans1.groovy’)                      (grails)
}




                                    web-app 1
                                                                     web-app 2
                                  (java, spring,
                                                                    (pure grails)
                                    grailsified)
                                                                         resource.groovy
                                resource.groovy
beans = {                                                          src/java/beans2.groovy
    loadBeans(‘/beans1.groovy’)
}

       src/java/beans1.groovy
beans {
    <your beans here>                               plugin
}                                                    plugin
                                                         plugin
                                                       plugin
                                                        (shared
20
                                                       services)
Summary & Best Practices
•    Clearly articulate the benefits of the framework
     – Not    just cool stuff

•    Reduce emotion (they know what you think anyway)
•    Create a local community
     – find   the people that think like you

•    Use the external community and help others using it
     – Mailing-lists,   IRC, etc.

•    Provide tools
     – IDE,    static analysis, plugins

•    Find situations/cases in which Groovy/Grails really makes a difference
     – E.g
         grails run-app vs. classical web-app redeploy cycle with heavy app servers is a
      huge time saver

•    Stay close to the Grails sweet-spot as long as possible
     – E.g.   Groovy domain model vs. Java domain model
21
Summary & Best Practices (cont’d)
•    Be available
     – Provide   help when necessary
     – Don’t   let the team swim alone

•    Offer/Initiate code reviews/pair-programming
•    Maintain a catalog of design principles and guidelines
     – HowTo(s)

     – Coding guidelines (e.g. use of types, inheritance vs. composition, controller and
      services responsibilities, XML generation strategies, Java vs. Groovy coding etc.)

•    Ideas:
     – Use   the create-* scripts to introduce own templates for controllers and services
     – Provide   own scripts for lab-specific tools




22
Thank You!




       Questions?




                    23

More Related Content

What's hot

Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with GradleRyan Cuprak
 
Getting Started with Java EE 7
Getting Started with Java EE 7Getting Started with Java EE 7
Getting Started with Java EE 7Arun Gupta
 
Faster java ee builds with gradle [con4921]
Faster java ee builds with gradle [con4921]Faster java ee builds with gradle [con4921]
Faster java ee builds with gradle [con4921]Ryan Cuprak
 
Jalimo Slides Linuxtag2007 (English)
Jalimo Slides Linuxtag2007 (English)Jalimo Slides Linuxtag2007 (English)
Jalimo Slides Linuxtag2007 (English)smancke
 
Java 9 Modularity and Project Jigsaw
Java 9 Modularity and Project JigsawJava 9 Modularity and Project Jigsaw
Java 9 Modularity and Project JigsawComsysto Reply GmbH
 
Exploring Java Heap Dumps (Oracle Code One 2018)
Exploring Java Heap Dumps (Oracle Code One 2018)Exploring Java Heap Dumps (Oracle Code One 2018)
Exploring Java Heap Dumps (Oracle Code One 2018)Ryan Cuprak
 
Developing modular Java applications
Developing modular Java applicationsDeveloping modular Java applications
Developing modular Java applicationsJulien Dubois
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with GradleRyan Cuprak
 
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDIMigrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDIMario-Leander Reimer
 
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)Roman Kharkovski
 
Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)Ryan Cuprak
 
Java EE 7 Soup to Nuts at JavaOne 2014
Java EE 7 Soup to Nuts at JavaOne 2014Java EE 7 Soup to Nuts at JavaOne 2014
Java EE 7 Soup to Nuts at JavaOne 2014Arun Gupta
 
Node.js Development with Apache NetBeans
Node.js Development with Apache NetBeansNode.js Development with Apache NetBeans
Node.js Development with Apache NetBeansRyan Cuprak
 
Serverless Java Challenges & Triumphs
Serverless Java Challenges & TriumphsServerless Java Challenges & Triumphs
Serverless Java Challenges & TriumphsDavid Delabassee
 
Project Zero For Javapolis 2007
Project Zero For Javapolis 2007Project Zero For Javapolis 2007
Project Zero For Javapolis 2007Jason McGee
 
SHOW107: The DataSource Session: Take XPages data boldly where no XPages data...
SHOW107: The DataSource Session: Take XPages data boldly where no XPages data...SHOW107: The DataSource Session: Take XPages data boldly where no XPages data...
SHOW107: The DataSource Session: Take XPages data boldly where no XPages data...Stephan H. Wissel
 
Micronaut: A new way to build microservices
Micronaut: A new way to build microservicesMicronaut: A new way to build microservices
Micronaut: A new way to build microservicesLuram Archanjo
 

What's hot (20)

Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with Gradle
 
Getting Started with Java EE 7
Getting Started with Java EE 7Getting Started with Java EE 7
Getting Started with Java EE 7
 
Faster java ee builds with gradle [con4921]
Faster java ee builds with gradle [con4921]Faster java ee builds with gradle [con4921]
Faster java ee builds with gradle [con4921]
 
Jalimo Slides Linuxtag2007 (English)
Jalimo Slides Linuxtag2007 (English)Jalimo Slides Linuxtag2007 (English)
Jalimo Slides Linuxtag2007 (English)
 
Java 9 Modularity and Project Jigsaw
Java 9 Modularity and Project JigsawJava 9 Modularity and Project Jigsaw
Java 9 Modularity and Project Jigsaw
 
Exploring Java Heap Dumps (Oracle Code One 2018)
Exploring Java Heap Dumps (Oracle Code One 2018)Exploring Java Heap Dumps (Oracle Code One 2018)
Exploring Java Heap Dumps (Oracle Code One 2018)
 
Developing modular Java applications
Developing modular Java applicationsDeveloping modular Java applications
Developing modular Java applications
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with Gradle
 
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDIMigrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
 
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
 
Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)
 
Java EE 8
Java EE 8Java EE 8
Java EE 8
 
Java EE 7 Soup to Nuts at JavaOne 2014
Java EE 7 Soup to Nuts at JavaOne 2014Java EE 7 Soup to Nuts at JavaOne 2014
Java EE 7 Soup to Nuts at JavaOne 2014
 
Modular Java
Modular JavaModular Java
Modular Java
 
Node.js Development with Apache NetBeans
Node.js Development with Apache NetBeansNode.js Development with Apache NetBeans
Node.js Development with Apache NetBeans
 
Java modules using project jigsaw@jdk 9
Java modules using project jigsaw@jdk 9Java modules using project jigsaw@jdk 9
Java modules using project jigsaw@jdk 9
 
Serverless Java Challenges & Triumphs
Serverless Java Challenges & TriumphsServerless Java Challenges & Triumphs
Serverless Java Challenges & Triumphs
 
Project Zero For Javapolis 2007
Project Zero For Javapolis 2007Project Zero For Javapolis 2007
Project Zero For Javapolis 2007
 
SHOW107: The DataSource Session: Take XPages data boldly where no XPages data...
SHOW107: The DataSource Session: Take XPages data boldly where no XPages data...SHOW107: The DataSource Session: Take XPages data boldly where no XPages data...
SHOW107: The DataSource Session: Take XPages data boldly where no XPages data...
 
Micronaut: A new way to build microservices
Micronaut: A new way to build microservicesMicronaut: A new way to build microservices
Micronaut: A new way to build microservices
 

Viewers also liked

Pets: Spectacular Digital Failure or Model for Strategic Innovation
Pets: Spectacular Digital Failure or Model for Strategic InnovationPets: Spectacular Digital Failure or Model for Strategic Innovation
Pets: Spectacular Digital Failure or Model for Strategic InnovationIain Langridge
 
Sungho Yoo's software development portfolio
Sungho Yoo's software development portfolio Sungho Yoo's software development portfolio
Sungho Yoo's software development portfolio Jake Yoo
 
Club management ood bac 5161 part 1
Club management ood bac 5161 part 1Club management ood bac 5161 part 1
Club management ood bac 5161 part 1Rajendra Nabar
 
Club management ood bac 5161 part-2
Club management ood bac 5161 part-2Club management ood bac 5161 part-2
Club management ood bac 5161 part-2Rajendra Nabar
 
Celery for internal API in SOA infrastructure
Celery for internal API in SOA infrastructureCelery for internal API in SOA infrastructure
Celery for internal API in SOA infrastructureRoman Imankulov
 

Viewers also liked (7)

Modeling and2d
Modeling and2dModeling and2d
Modeling and2d
 
Actividad 3
Actividad 3Actividad 3
Actividad 3
 
Pets: Spectacular Digital Failure or Model for Strategic Innovation
Pets: Spectacular Digital Failure or Model for Strategic InnovationPets: Spectacular Digital Failure or Model for Strategic Innovation
Pets: Spectacular Digital Failure or Model for Strategic Innovation
 
Sungho Yoo's software development portfolio
Sungho Yoo's software development portfolio Sungho Yoo's software development portfolio
Sungho Yoo's software development portfolio
 
Club management ood bac 5161 part 1
Club management ood bac 5161 part 1Club management ood bac 5161 part 1
Club management ood bac 5161 part 1
 
Club management ood bac 5161 part-2
Club management ood bac 5161 part-2Club management ood bac 5161 part-2
Club management ood bac 5161 part-2
 
Celery for internal API in SOA infrastructure
Celery for internal API in SOA infrastructureCelery for internal API in SOA infrastructure
Celery for internal API in SOA infrastructure
 

Similar to Adopting Grails - GR8Conf Europe

Magic with groovy & grails
Magic with groovy & grailsMagic with groovy & grails
Magic with groovy & grailsGeorge Platon
 
Dynamic Languages Web Frameworks Indicthreads 2009
Dynamic Languages Web Frameworks Indicthreads 2009Dynamic Languages Web Frameworks Indicthreads 2009
Dynamic Languages Web Frameworks Indicthreads 2009Arun Gupta
 
intoduction to Grails Framework
intoduction to Grails Frameworkintoduction to Grails Framework
intoduction to Grails FrameworkHarshdeep Kaur
 
Building reusable components as micro frontends with glimmer js and webcompo...
Building reusable components as micro frontends  with glimmer js and webcompo...Building reusable components as micro frontends  with glimmer js and webcompo...
Building reusable components as micro frontends with glimmer js and webcompo...Andrei Sebastian Cîmpean
 
BP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM DominoBP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM DominoSerdar Basegmez
 
Building single page applications
Building single page applicationsBuilding single page applications
Building single page applicationsSC5.io
 
We4IT LCTY 2013 - x-pages-men - ibm domino xpages - performance in a nutshell
We4IT LCTY 2013 - x-pages-men - ibm domino xpages - performance in a nutshellWe4IT LCTY 2013 - x-pages-men - ibm domino xpages - performance in a nutshell
We4IT LCTY 2013 - x-pages-men - ibm domino xpages - performance in a nutshellWe4IT Group
 
The Java Content Repository
The Java Content RepositoryThe Java Content Repository
The Java Content Repositorynobby
 
Grails & the World of Tomorrow
Grails & the World of TomorrowGrails & the World of Tomorrow
Grails & the World of TomorrowPeter Ledbrook
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Enginecatherinewall
 
Concierge - Bringing OSGi (back) to Embedded Devices
Concierge - Bringing OSGi (back) to Embedded DevicesConcierge - Bringing OSGi (back) to Embedded Devices
Concierge - Bringing OSGi (back) to Embedded DevicesJan S. Rellermeyer
 
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013Mack Hardy
 
Grails 3.0 Preview
Grails 3.0 PreviewGrails 3.0 Preview
Grails 3.0 Previewgraemerocher
 
JDK 9: Migrating Applications
JDK 9: Migrating ApplicationsJDK 9: Migrating Applications
JDK 9: Migrating ApplicationsSimon Ritter
 
Viridians on Rails
Viridians on RailsViridians on Rails
Viridians on RailsViridians
 
Eclipse vs Netbean vs Railo
Eclipse vs Netbean vs RailoEclipse vs Netbean vs Railo
Eclipse vs Netbean vs RailoMohd Safian
 
Running your Java EE applications in the Cloud
Running your Java EE applications in the CloudRunning your Java EE applications in the Cloud
Running your Java EE applications in the CloudArun Gupta
 

Similar to Adopting Grails - GR8Conf Europe (20)

Magic with groovy & grails
Magic with groovy & grailsMagic with groovy & grails
Magic with groovy & grails
 
Dynamic Languages Web Frameworks Indicthreads 2009
Dynamic Languages Web Frameworks Indicthreads 2009Dynamic Languages Web Frameworks Indicthreads 2009
Dynamic Languages Web Frameworks Indicthreads 2009
 
GlassFish v3 Prelude Aquarium Paris
GlassFish v3 Prelude Aquarium ParisGlassFish v3 Prelude Aquarium Paris
GlassFish v3 Prelude Aquarium Paris
 
intoduction to Grails Framework
intoduction to Grails Frameworkintoduction to Grails Framework
intoduction to Grails Framework
 
Building reusable components as micro frontends with glimmer js and webcompo...
Building reusable components as micro frontends  with glimmer js and webcompo...Building reusable components as micro frontends  with glimmer js and webcompo...
Building reusable components as micro frontends with glimmer js and webcompo...
 
BP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM DominoBP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM Domino
 
Building single page applications
Building single page applicationsBuilding single page applications
Building single page applications
 
We4IT LCTY 2013 - x-pages-men - ibm domino xpages - performance in a nutshell
We4IT LCTY 2013 - x-pages-men - ibm domino xpages - performance in a nutshellWe4IT LCTY 2013 - x-pages-men - ibm domino xpages - performance in a nutshell
We4IT LCTY 2013 - x-pages-men - ibm domino xpages - performance in a nutshell
 
The Java Content Repository
The Java Content RepositoryThe Java Content Repository
The Java Content Repository
 
Grails & the World of Tomorrow
Grails & the World of TomorrowGrails & the World of Tomorrow
Grails & the World of Tomorrow
 
GlassFish v3 - Architecture
GlassFish v3 - ArchitectureGlassFish v3 - Architecture
GlassFish v3 - Architecture
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Engine
 
Concierge - Bringing OSGi (back) to Embedded Devices
Concierge - Bringing OSGi (back) to Embedded DevicesConcierge - Bringing OSGi (back) to Embedded Devices
Concierge - Bringing OSGi (back) to Embedded Devices
 
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
 
Grails 3.0 Preview
Grails 3.0 PreviewGrails 3.0 Preview
Grails 3.0 Preview
 
JDK 9: Migrating Applications
JDK 9: Migrating ApplicationsJDK 9: Migrating Applications
JDK 9: Migrating Applications
 
Viridians on Rails
Viridians on RailsViridians on Rails
Viridians on Rails
 
GraniteDS vs BlazeDS
GraniteDS vs BlazeDSGraniteDS vs BlazeDS
GraniteDS vs BlazeDS
 
Eclipse vs Netbean vs Railo
Eclipse vs Netbean vs RailoEclipse vs Netbean vs Railo
Eclipse vs Netbean vs Railo
 
Running your Java EE applications in the Cloud
Running your Java EE applications in the CloudRunning your Java EE applications in the Cloud
Running your Java EE applications in the Cloud
 

Recently uploaded

Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 

Recently uploaded (20)

Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 

Adopting Grails - GR8Conf Europe

  • 2. About me Klaus Baumecker Software Architect & Technologist @ Hewlett-Packard, Böblingen, Germany Professional Software Developer since 1992 Java Programmer since 12+ years Using Groovy & Grails since 3+ years 2
  • 3. Introduction We started using Grails in production 2 years ago. We used Grails already for in-house projects (version 1.0.x) The following episodes show … what we’ve learned and … a few best practices derived from it. 3
  • 4. Context • Large product suite for IT-Management in HP Software • Two teams developing the next release of a product – One using classic JEE approach – Other using Grails • Both web-apps share a common data model based on POJOs and Hibernate mapping files • All web-apps run inside a JBoss application server • Continuous integration builds based on maven • Time-boxed development cycles • Agile approach with features and stories (SCRUM like) 4
  • 5. Episode 1 – GORM Constraints The Grails web-app uses GORM constraints to enforce rules on the domain classes There was and (and still is) a general attempt to reduce footprint by moving common web-app libraries into shared lib space  therefore the shared domain model (incl. hibernate mapping) became a shared library (among others like apache-commons-*, etc) GORM constraints work fine in development (run-app), but are ignored while running production code inside JBoss 5
  • 6. Episode 1 GORM constraints were part of the Grails source code (src/groovy/…) They were loaded by the web-app class loader Domain classes and mapping file have been loaded by the shared class loader (and loaded before the constraints) The shared class loader cannot access classes within the web-app (only the other way around) GORM constraints are ignored!  Extract constraints and move to shared lib space 6
  • 7. Episode 2 – Flex UI Demand for graphical editor has led to Flex based UIs. Communication was XML based. Then we’ve seen too many Flex timeouts. So we moved to faster communication with Blaze-DS using the BlazeDS grails-plugin. We mapped domain classes to Flex classes (Blaze feature). Better performance now, but… After a round-trip of a data object (grails - flex - grails) we got empty fields in the received object. Although there were properly set before and not modified in the UI. 7
  • 8. Episode 2 Our POJO based domain classes have some protected fields (public getter, private setter). No problem for hibernate. Blaze-DS uses commons-bean utilities for mapping from/to POJOs and ignores asymmetric fields.  Need DTO and some tool to define mapping. We use Dozer (dozer.org) 8
  • 9. Grails with BlazeDS or not? Motivation: Optimization (High performance data transfer)!...But sometimes you really need –a different rendering strategy (partial vs. all at once) –a fix for your slow performing back end (Flex timeouts) Use cases – Event Browser for IT-Mgmt: • Large list of IT events to be viewed by an operator (> 20000 events) • Interactive operations on events (e.g. filtering, dynamic updates from the server) – More advanced client/server communication (pub/sub, push) Main issues – Another layer in your communication – No controller level (Blaze works on services directly)  breaks Grails paradigm • Same with other communication extensions directly working on services (remoting plugin). • Some security plugins do not work as expected 9
  • 10. Generalizing the Controller layer • Grails services w/ controller semantics Controller Other Layer HTTP BlazeDS Remoting • Avoiding redundant (transport spec.) Access authorization Services Business Layer (atomic ops, Service caller neutral) Grails Grails Transaction Controller Service Business Logic Business Business Layer (optional) Logic Services Logic Service 10
  • 11. Episode 3 – Design your web services We’re using XML for most of our UI/backend communication. Our backend provides web services for UI and automation tools. The Flex guy says: Add a special attribute to the XML to make my rendering easier. Architect says: Don’t fiddle with the automation interface! How to setup my web services to fit the needs for UI and automation? 11
  • 12. Episode 3 Flex = Rich UI  Treat your UI as another automation client. Don’t allow UI specifics to show up in the XML. If you don’t, you’ll end up in maintaining parallel XML flows. My recommendation for XML generation • gsp.xml • Plain XML code is easy to read and maintain • No DTO required (as in BlazeDS or JAXB). Map domain data to XML inside the gsp. 12
  • 13. Episode 4 – Meta Programming Due to a change of the architecture some domain classes are no longer stored in our DB. They stored with a different technique (out of our control). GORM methods are no longer available. Store and retrieval is replaced by new a persistence API incl. new DAOs We still have many consumers of the (original) classes all over the place. How to minimize refactoring? 13
  • 14. Episode 4 Enhance the meta-class of the old classes by the missing GORM functions (get(..), simple finders). Meta-class methods map to the new API. Existing code remains unchanged. But do this with care! Comment your code and explain it in your tech meeting. 14
  • 15. Episode 5 – Developer Support Programmers with strong Java background often feel lost with reduced IDE support. They miss(ed) code completion, static analysis, compile errors, etc. How can we reduce the whining and complaining, while moving them into the Groovy/Grails world? 15
  • 16. Episode 5 Get a good IDE. Spent effort in installing analysis tools into your build. E.g. run CodeNarc analysis. Write your own CodeNarc rules according to your internal regulations and needs Own rule brought some safety back: “Finding dynamic variable”. 16
  • 17. Episode 6 – Modularization with Plugins Each web-app developed services which became useful in the other web-app. Inter-web-app communication is easy to set-up but not really a solution – Architecture, security, etc. – E.g. RMI Reusing a Grails service inside a Java web-app is not straight-forward. How can we leverage functionality across multiple web-apps, keep good architecture and independent web-app development in two teams? 17
  • 18. Episode 6 Grails-ify the Java web-app. Now you have two Grails apps. Extract shared services into additional Grails plugin(s). Create a new umbrella Grails app that loads the two main web-apps as plugins. The two Grails apps consume the extracted services plugins. Each of the main web-apps run independently (run- app) to keep lightweight development for each team. 18
  • 19. From applications to plugins • Refactor your beans from resources.groovy to a resource location, e.g. src/java/myBeans.groovy – Watch out: • Before: “beans = {“ • After: “beans {” • For each web-app : – Refer to the new beans file within resources.groovy • Merging beans in the umbrella app – Refer to the new beans files from the underlying web-apps – Wire beans between web-apps (optional) • Add plugin descriptor • Adjust URL mapping • Merge other resources (e.g. files under web-app/) – Requires extra scripting 19
  • 20. From applications to plugins (con’t) beans = { resource.groovy umbrella loadBeans(‘/beans2.groovy’) web-app loadBeans(‘/beans1.groovy’) (grails) } web-app 1 web-app 2 (java, spring, (pure grails) grailsified) resource.groovy resource.groovy beans = { src/java/beans2.groovy loadBeans(‘/beans1.groovy’) } src/java/beans1.groovy beans { <your beans here> plugin } plugin plugin plugin (shared 20 services)
  • 21. Summary & Best Practices • Clearly articulate the benefits of the framework – Not just cool stuff • Reduce emotion (they know what you think anyway) • Create a local community – find the people that think like you • Use the external community and help others using it – Mailing-lists, IRC, etc. • Provide tools – IDE, static analysis, plugins • Find situations/cases in which Groovy/Grails really makes a difference – E.g grails run-app vs. classical web-app redeploy cycle with heavy app servers is a huge time saver • Stay close to the Grails sweet-spot as long as possible – E.g. Groovy domain model vs. Java domain model 21
  • 22. Summary & Best Practices (cont’d) • Be available – Provide help when necessary – Don’t let the team swim alone • Offer/Initiate code reviews/pair-programming • Maintain a catalog of design principles and guidelines – HowTo(s) – Coding guidelines (e.g. use of types, inheritance vs. composition, controller and services responsibilities, XML generation strategies, Java vs. Groovy coding etc.) • Ideas: – Use the create-* scripts to introduce own templates for controllers and services – Provide own scripts for lab-specific tools 22
  • 23. Thank You! Questions? 23