COME INCORPORARE UN
INTERPRETE GROOVY IN UN
    APPLICATIVO JAVA
    paolo.predonzani@manydesigns.com
Integrazione Java-Groovy


    Compilazione              Embedding
                       (caricamento a run-time)


    BSF e JSR 223          Embedding nativo




GroovyShell   GroovyClassLoader    GroovyScriptEngine
COMPILAZIONE
   MyClass.groovy                 MyClass.class

     Maven                           Ant




Joint compilation: Java referenzia Groovy e viceversa
BEAN SCRIPTING
      FRAMEWORK E JSR 223




http://commons.apache.org/bsf/
http://groovy.codehaus.org/Bean+Scripting+Framework
http://groovy.codehaus.org/JSR+223+Scripting+with+Groovy
EMBEDDING NATIVO
                                 GroovyScript
                                    Engine

                                    Script +
                  GroovyClass
                                  classpath +
                    Loader
                                   reload +
                  Introduce il   gestione delle
GroovyShell       concetto di     dipendenze
                    classpath
Semplici script
   isolati
DIETRO LE QUINTE...
GroovyShell                 GroovyScriptEngine


                      ScriptClassLoader

                                            gestione
                                          dipendenze


              GroovyClassLoader
GROOVYSHELL

GroovyShell
              .evaluate(String)                              Object


              .run(File, String[])                           Object

                                  Script
              .parse(File)
                                           .run()

                                           .invokeMethod()   Object
BINDING
GROOVYCLASSLOADER

GroovyClass
  Loader    .addClassPath(“/home/groovy”)


            .loadClass(“com.manydesigns.Pippo”)             Class


            .parseClass(“/home/groovy/com/manydesigns/Pippo.groovy”)


                                                            Class
GROOVYSCRIPTENGINE

GroovyScript
   Engine    GroovyScriptEngine(String[] roots)


            .loadScriptByName(String)                      Class


            .run(String, Binding)                          Object

                                        Script
            .createScript(String)                 .run()
SCRIPT == CLASSE
                                  Script


                         run()

def f() {}               main()

println “Hello world!”   f()
E’ COMODO GESTIRE
SCRIPT E CLASSI SEPARATAMENTE


                       }   Classpath, package, classi,
                           riuso, ingegneria


                       }   Script, file, utilizzo “spot”,
                           hacking


Groovy è groovy perché supporta entrambe le visioni!
GROOVY IN PORTOFINO 4
           Classpath per classi
           groovy comuni




           Groovy actions
Groovy actions:
  La struttura delle directory
  ricalca quella degli URL
  Un action.groovy per directory
  Non è richiesto package
  Si possono spostare/rinominare
  gli URL spostando/rinominando
  le directory
  Nessuno può dipendere da una
  action
  Non è richiesto refactoring
  Editabili via web o da IDE

  Ogni action.groovy è un mondo
  a sé. Lo trattiamo come script.
Groovy classpath:
  Un vero classpath con package
  e classi
  Contiene bean, classi di base
  per action, classi di utilità
  utilizzabili dalle action
  File tipicamente editati da IDE
  Refactoring

  Classpath groovy, simile ad un
  classpath Java ma editabile
  dinamicamente
CLASS LOADING

   ClassLoader        Carica solo classi Java

           parent
        classloader
GroovyClassLoader     Carica classi Java e Groovy
Questo è il problema maggiore dell’embedding.
  Se Groovy fosse compilato, Java e Groovy
     vivrebbero nello stesso class loader.
CLASS LOADING: OGNL

OGNL: %{@org.example.MyGroovyClass@myMethod()}


   ... non funziona perché OGNL usa il classloader Java
            e non riesce a risolvere classi Groovy
CLASS LOADING: HIBERNATE
Da Groovy funziona:




Da Java funziona solo se si recupera Book dal
GroovyClassLoader
PRESTAZIONI:
CACHING E RELOADING

 Approccio dei test:
 1.“riscaldare i motori”
 2.misurare la prima esecuzione
 3.misurare la seconda esecuzione
 4.touch dello script
 5.misurare la terza esecuzione
PRESTAZIONI:
                CONCLUSIONI
                               Caching   Reloading

GroovyShell.evaluate(String)     No         --

   GroovyShell.run(File)         Sì        No

    GroovyClassLoader            Sì        No

    GroovyScriptEngine           Sì         Sì
RELOADING DIPENDENZE
       A
                   A dipende da B
                   B viene modificato
                   B viene ricaricato
       B
                   Anche A dovrebbe essere ricaricato


In teoria, ma fino a Groovy 1.8.8/2.0.4 c’era un bug:
http://jira.codehaus.org/browse/GROOVY-4975
RIFERIMENTI
http://groovy.codehaus.org/Embedding+Groovy

http://groovy.codehaus.org/The+groovyc+Ant+Task

http://docs.codehaus.org/display/GMAVEN/Home

http://groovy.codehaus.org/api/groovy/lang/GroovyShell.html

http://groovy.codehaus.org/api/groovy/lang/
GroovyClassLoader.html

http://groovy.codehaus.org/api/groovy/util/
GroovyScriptEngine.html
GRAZIE!
paolo.predonzani@manydesigns.com

  http://www.manydesigns.com/

Come Incorporare un Interprete Groovy in Java