SlideShare ist ein Scribd-Unternehmen logo
Thorsten Kamann ● thorsten.kamann@itemis.de   1
Agenda
                    Was ist Groovy?              Testing
                     Getting started             Grails
                              Syntax          Groovy Module
                       GroovyBeans             IDE-Support
                    XML-Processing                Links
                     Groovy Builder

Thorsten Kamann ● thorsten.kamann@itemis.de                   2
Was ist Scripting?
• Skriptsprachen sind Programmiersprachen, die vor
  allem für kleine, überschaubare
  Programmieraufgaben gedacht sind
• Kein Deklarationszwang für Variablen
• Automatische Speicherverwaltung
• Werden in der Regel ohne getrennte
  Übersetzungsphase ausgeführt (d. h. sie werden
  „interpretiert“)


Thorsten Kamann ● thorsten.kamann@itemis.de          3
Was ist Groovy?
• Eine dynamische Sprache
• Inspiriert von Ruby, Python, Smalltalk
• Entwickelt für die Java-Plattform
   – Um sie Java-Entwicklern zugänglich zu machen
   – Um möglichst viel der Java-Syntax wieder
     verwenden zu können
   – Um eine einfache Anbindung zu Enterprise-
     Systemen anzubieten


Thorsten Kamann ● thorsten.kamann@itemis.de         4
Thorsten Kamann ● thorsten.kamann@itemis.de   5
Getting started
• Download des aktuellen Release von
     http://groovy.codehaus.org
• Entpacken des Archivs
• Setzen der Umgebungsvariable GROOVY_HOME
• Hinzufügen von %GROOVY_HOME%bin zur PATH-
  Variable
• Starten von groovyConsole und Eingabe von
        println „Hallo Welt“
     mit anschliessendem STRG-R

Thorsten Kamann ● thorsten.kamann@itemis.de    6
Getting started
•

•
•
•

•



Thorsten Kamann ● thorsten.kamann@itemis.de   7
Getting started: Embedding

                                                Java-
                                              Anwendung



   Bean-Scripting-
                               Groovy-         Groovy-         Groovy       ANT
     Framework
                                Shell         Classloader   ScriptEngine   Maven
        (BSF)



                                                Groovy
                                                Script



Thorsten Kamann ● thorsten.kamann@itemis.de                                        8
Getting started: Embedding


      – Ist ein allgemeine Möglichkeit, jede beliebige
        Scriptsprache in Java-Anwendungen einzubinden

      – Groovy bietet aber leichtgewichtigere und
        leistungsfähigere Möglichkeiten der Einbindung



Thorsten Kamann ● thorsten.kamann@itemis.de              9
Getting started: Embedding

      – Groovy-Shell bietet die Möglichkeit des Ein- und
        Auslesens von Variablen mittels des Binding-
        Objekts
           Binding binding = new Binding();
           binding.setVariable(quot;fooquot;, new Integer(2));
           GroovyShell shell = new GroovyShell(binding);

           Object value = shell.evaluate(
           quot;println 'Hello World!'; x = 123; return foo * 10quot;);
           assert value == 20;
           assert binding.getVariable(quot;x„) == 123;


Thorsten Kamann ● thorsten.kamann@itemis.de                       10
Getting started: Embedding

      – Lädt Groovy-Klassen dynamisch und ermöglicht
        den direkten Zugriff auf deren Methoden
           ClassLoader parent = getClass().getClassLoader();
           GroovyClassLoader loader = new
                  GroovyClassLoader(parent);
           Class groovyClass = loader.parseClass(
                  new File(quot;script.groovyquot;));
           GroovyObject groovyObject =
                  (GroovyObject) groovyClass.newInstance();
           Object[] args = {};
           groovyObject.invokeMethod(quot;runquot;, args);



Thorsten Kamann ● thorsten.kamann@itemis.de                    11
Getting started: Embedding

      – Lädt Groovy-Klassen dynamisch und ermöglicht
        den direkten Zugriff auf deren Methoden
           GroovyClassLoader gcl = new GroovyClassLoader();
           Class clazz = gcl.parseClass(
                  myStringwithGroovyClassSource,
                  quot;SomeName.groovyquot;);
           Object aScript = clazz.newInstance();
           MyInterface myObject = (MyInterface) aScript;
           myObject.interfaceMethod();




Thorsten Kamann ● thorsten.kamann@itemis.de                   12
Getting started: Embedding

      – Dies ist die leistungsfähige Möglichkeit, um
        Groovy-Skripte auszuführen.
           String[] roots = new String[]
           {quot;/my/groovy/script/pathquot;};
           GroovyScriptEngine gse = new GroovyScriptEngine(roots);
           Binding binding = new Binding();
           binding.setVariable(quot;inputquot;, quot;worldquot;);
           gse.run(quot;hello.groovyquot;, binding);
           System.out.println(binding.getVariable(quot;outputquot;));




Thorsten Kamann ● thorsten.kamann@itemis.de                          13
Getting started: Embedding

      – ANT-Task, mit dem eine beliebige Anzahl von
        Groovy-Skripten ausgeführt werden kann
      – GroovyC-Task, der Groovy-Skripte (Klassen) zu
        Java Bytecode kompiliert
      – Erstellen von Ant-Tasks mit Groovy und dem
        Ant-Builder
      – Erzeugen von Ant-Skripten


Thorsten Kamann ● thorsten.kamann@itemis.de             14
Getting started: Embedding

      – Unterstützung mittels des M2-Ant-Plugins
      – Auf http://mojo.codehaus.org/ existieren bereits Maven-
        Tools für direkte Unterstützung von Groovy:
            • Groovy-Compiler
            • Groovy-Archetype
            • Tools, um Maven-Plugins mit Groovy zu entwickeln




Thorsten Kamann ● thorsten.kamann@itemis.de                      15
Getting started: Embedding

      – Groovy kann direkt von der Eingabeaufforderung
          groovy script.groovy [arguments]
        ausgeführt werden
      – Alternativ kann über den Dialog
        Ordneroptionen-->Dateitypen die Extension
        *.groovy an groovy.bat gebunden werden.




Thorsten Kamann ● thorsten.kamann@itemis.de          16
Getting started: Embedding

      – Groovy kann direkt von der Konsole mittels
            groovy script.groovy [arguments]
        ausgeführt werden
      – Alternativ kann in die 1. Zeile eines Groovy-Skripts
            #!/usr/bin/env groovy
        eingefügt werden.
      – So kann mit
            chmod +x script.groovy
            ./script.groovy
          das Skript ausgeführt werden

Thorsten Kamann ● thorsten.kamann@itemis.de                    17
Thorsten Kamann ● thorsten.kamann@itemis.de   18
Die Syntax: Groovy vs. Java

      – Package-, Import-Mechanismus
      – Class und Method Definition
      – Kontrollstrukturen (ausser for(init;test,inc))
      – Operatoren, Ausdrücke und Zuweisungen
      – Exeption Handling
      – Literale
      – Instantiierung, Referenzen

Thorsten Kamann ● thorsten.kamann@itemis.de              19
Die Syntax: Groovy vs. Java

      – Vereinfachter Zugriff auf Java-Objekte mit neuen
        Ausdrücken und Operatoren
      – Zusätzliche Möglichkeiten, um Objekte zu
        erstellen
      – Neue Konstrollstrukturen
      – Neue Datentypen
      – Alles ist ein Objekt

Thorsten Kamann ● thorsten.kamann@itemis.de            20
Die Syntax: Groovy vs. Java


      – groovy.lang.*, groovy.util.*

      – java.lang.*, java.util.*, java.net.*, java.io.*

      – java.math.BigInteger, java.math.BigDecimal




Thorsten Kamann ● thorsten.kamann@itemis.de               21
Die Syntax

       assert(true)

       assert 1 == 1

       def x = 1
       assert x == 1

       def y=1; assert y == 1




Thorsten Kamann ● thorsten.kamann@itemis.de   22
Die Syntax: Datentypen

      – Alles ist ein Objekt
      – Keine primitiven Datentypen
      – Automatisches Wrapping (Boxing/Unboxing)
      – Optionales Typing
      – Statisches/Dynamisches Typing




Thorsten Kamann ● thorsten.kamann@itemis.de        23
Die Syntax: Datentypen

      Typ                                Beispiel
      java.lang.Integer                  15, 0x1234ffff
      java.lang.Long                     100L, 100l
      java.lang.Float                    1.23F, 1.23f
      java.lang.Double                   1.23D, 1.23d
      java.math.BigInteger               123g, 456G
      java.math.BigDecimal               1.23, 4.56, 1.4E4, 2.8e4, 1.23g, 1.23G




Thorsten Kamann ● thorsten.kamann@itemis.de                                       24
Die Syntax: Datentypen

      – Whole word Matcher
      – Find Matcher
      – Count
      – Foreach
      – Replace
      – Split


Thorsten Kamann ● thorsten.kamann@itemis.de   25
Die Syntax: Datentypen

      //Finder
      assert „Hello Groovy!“ =~ /o.G/

      //Matcher
      assert „Hello Groovy!“ ==~ /HellosGroovy!/

      //Replace
      assert „Hello Groovy!“.replaceAll(/Hello/, „Hi“)
                   == „Hi Groovy!“

      //Split
      assert „Hello Groovy!“.split(/ /).size == 2



Thorsten Kamann ● thorsten.kamann@itemis.de              26
Die Syntax: Datentypen

      – Basieren auf einfachen Strings
      – Bieten allerdings eine erweiterte Funktionalität
      – Sie müssen in doppelten Anführungszeichen
        definiert werden
      – Unterstützen Platzhalter
            • ${expression}
            • $expression


Thorsten Kamann ● thorsten.kamann@itemis.de                27
Die Syntax: Datentypen

     me = „Thorsten“
     age = 34
     location = „Neuss“
     line = „Ich heisse $name, bin $age und wohne in $location“

     assert line == „Ich heisse Thorsten, bin 34 und wohne in
     Neuss“
     assert line instancof java.lang.String




Thorsten Kamann ● thorsten.kamann@itemis.de                       28
Die Syntax: Datentypen

      Start/End Zeichen                       Beispiel              GString? Backslash?
      Einfache Anführungszeichen              ‚Hallo Thorsten„                  
      Doppelte Anführungszeichen              „Hallo $name“                     
      Dreifache Anführungszeichen             „„„----------------               
                                              Total: $0.02
                                              ---------------„„„
      Dreifache doppelte                      “““---------------                
      Anführungszeichen                       Line with text
                                              --------------“““
      Forward Slash                           /x(d*)y/                         



Thorsten Kamann ● thorsten.kamann@itemis.de                                           29
Die Syntax: Datentypen

       greeting = „Hello Groovy!“

       assert       greeting[0] == „H“
       assert       greeting [6..11] == „Groovy“
       assert       ‚Hi‘ + greeting – ‚Hello‘ == „Hi Groovy!“
       assert       greeting.count(„o“) = 3

       assert       „x“.padLeft(3) == „ x“
       assert       „x“.padRight(3) == „x „
       assert       „x“.center(3) == „ x „
       assert       „x“ * 3 == „xxx“




Thorsten Kamann ● thorsten.kamann@itemis.de                     30
Die Syntax: Datentypen (collective)

      List list = []
      assert list.size == 0

      list = [‚a‘, ‚b‘, ‚c‘]
      assert list.size == 3 && list[1] = ‚b‘

      list << ‚d‘
      assert list.size == 4

      list += ‚e‘
      assert list.size == 5

      assert list – ‚d‘ == [‚a‘, ‚b‘, ‚c‘, ‚e‘]


Thorsten Kamann ● thorsten.kamann@itemis.de       31
Die Syntax: Datentypen (collective)

      – Sind Listen mit einem definierten Anfangs- und
        Endwert
      – Nahezu jedes Objekt kann in einer Range
        verwaltet werden
            • Methoden next und previous müssen implementiert
              werden
            • Das Interface java.lang.Comparable muss
              implementiert werden


Thorsten Kamann ● thorsten.kamann@itemis.de                     32
Die Syntax: Datentypen (collective)

      def range = 0..10
      assert range.contains(0)
      assert range.contains(10)

      range = 0..<10
      assert range.contains(0)
      assert !range.contains(10)




Thorsten Kamann ● thorsten.kamann@itemis.de   33
Die Syntax: Datentypen (collective)

      Map map = [:]
      assert map.size == 0

      map = [a:1, b:2,c:3]
      assert map.size = 3
      assert map.get(„a“) == 1
      assert map[‚b‘] == 2
      assert map.c == 3

      map.e = 4
      assert map.e == 4




Thorsten Kamann ● thorsten.kamann@itemis.de   34
Die Syntax: Datentypen (collective)

      – Expandos ermöglichen die Erzeugung von
        dynamischen Objekten
           def player = new Expando()
           player.name = “Thorstenquot;
           player.greeting = { quot;Hello, my name is $player.namequot; }

           assert player.greeting() == quot;Hello, my name is Thorstenquot;




Thorsten Kamann ● thorsten.kamann@itemis.de                           35
Die Syntax: Closures

      – Codeblöcke
      – Können einen Wert/Objekt zurückgeben
      – Referenzieren und verwenden Variablen
      – call()(implizit/explizit) führt die Closure aus
      – Können an eine Variable gebunden werden
      – Ähneln Java Inner Classes


Thorsten Kamann ● thorsten.kamann@itemis.de               36
Die Syntax: Closures

      List list = [1, 2, 3]

      list.each{ entry ->
             println „entry $entry“
      }

      Ausgabe:
      entry 1
      entry 2
      entry 3




Thorsten Kamann ● thorsten.kamann@itemis.de   37
Die Syntax: Closures

      public void each(Closure closure){
        for (it: listItems){
          closure(it).call();
        }
      }




Thorsten Kamann ● thorsten.kamann@itemis.de   38
Die Syntax: Closures

      Class MethodClosureSample(){
        boolean validate(String value){
          return StringUtils.isNotEmpty(value);
        }
      }

      MethodClosureSample sample = new MethodeClosureSample()
      List success = [„Hello“, „World“, „!“]
      List fails = [„Hello“, „“, „World“, „!“]

      assert success.each(sample.&validate)
      assert !fails.each(sample.&validate)



Thorsten Kamann ● thorsten.kamann@itemis.de                     39
Die Syntax: Closures

      – Transformiert eine Closure mit vielen Parametern
        in eine Closure mit weniger Parametern
      – Dabei werden Parameter mit Werten vorbelegt
       def adder = {x, y -> return x+y}
       def addOne = adder.curry(1)

       assert addOne(5) == 6




Thorsten Kamann ● thorsten.kamann@itemis.de            40
Die Syntax: Closures

      Closure                      Beschreibung
      collect                      Sammelt Objekte und fügt sie in eine neue Liste ein
      each                         Führt für jedes Element aus
      find                         Findet ein Element
      findAll                      Findet alle Elemente anhand von Kriterien
      min(Comparator)              Gibt den min. Wert aus der Collection zurück
      max(Comparator)              Gibt den max. Wert aus der Collection zurück
      sort(Comparator)             Sortiert die Collection (Comparator ist optional)
      unique                       Entfernt doppelte Werte aus der Collection



Thorsten Kamann ● thorsten.kamann@itemis.de                                              41
Die Syntax: Kontrollstrukturen
•
       Runtime type             Evaluation criterion required for truth
       Boolean                  Booleanwert muss true sein
       Matcher                  Der reguläre Ausdruck muss mindestens 1 Treffer haben
       Collection               Die Collection darf nicht leer sein
       Map                      Die Map darf nicht leer sein
       String                   Der String darf ebenfalls nicht leer sein
       Number                   Muss ungleich 0 sein
       Alles andere             Die Objektreferenz muss ungleich null sein




Thorsten Kamann ● thorsten.kamann@itemis.de                                             42
Die Syntax: If-Statement
•
      If (true)               assert true
      Else                    assert false

      If (1){                 assert true
      }else{                  assert false
      }

      If (0)                  assert false
      Else if (1)             assert true
      Else                    assert false

      (1 > 0)?                assert true: assert False



Thorsten Kamann ● thorsten.kamann@itemis.de               43
Die Syntax: Kontrollstrukturen

      – Kann mit jedem Datentyp verwendet werden
           switch (10){
                  case 0                      :   assert   false; break;
                  case 0..9                   :   assert   false; break;
                  case [8,9,11]               :   assert   false; break;
                  case Float                  :   assert   false; break;
                  case {it%3==0}              :   assert   false; break;
                  case ~/../                  :   assert   true; break;
                  default                     :   assert   false; break;
           }




Thorsten Kamann ● thorsten.kamann@itemis.de                                44
Die Syntax: Looping

      def list = [1, 2, 3, 4, 5]
      while (list){
             list.remove()
      }
      assert list == []

      while (list.size() < 3){
             list << list.size()+1
      }
      assert list == [1, 2, 3]




Thorsten Kamann ● thorsten.kamann@itemis.de   45
Die Syntax: Looping

      for (String i in ‘a‘..‘c‘) store += i
      assert store == ‘abc‘

      for (i in [1, 2, 3]){                                      store += i}
      assert store == ‘123‘

      def myString = ‘Hello Groovy!‘
      for (i in 0..myString.size()){                    store += myString[i]}
      assert store == myString


                                              Entspricht dem Java Equivalent:
                                              for (int i=0;i<upperBound;i++){}


Thorsten Kamann ● thorsten.kamann@itemis.de                                      46
Die Syntax: Return/Break/Continue

      Boolean someMethod(){
             if (false){
                    return false
             }
             return true
      }




Thorsten Kamann ● thorsten.kamann@itemis.de   47
Die Syntax: Return/Break/Continue

      while (true){
             if (someCondition){
                    break
             }
      }




Thorsten Kamann ● thorsten.kamann@itemis.de   48
Die Syntax: Return/Break/Continue

      for(item in items){
             if (someCondition){
                    continue
             }
      }




Thorsten Kamann ● thorsten.kamann@itemis.de   49
Die Syntax: Exception

      – Ähnliche Unterstützung wie in Java
            • try-catch-finally
            • try-catch
            • try-finally
      – Checked-Exception werden als Runtime-
        Excpetion hochgereicht



Thorsten Kamann ● thorsten.kamann@itemis.de     50
Die Syntax: OO und Groovy

      – Identisch mit Klassen in Java
      – Können Felder, Konstruktoren, Methoden
        enthalten
      – Konstruktoren und Methoden können lokale
        Variablen verwenden




Thorsten Kamann ● thorsten.kamann@itemis.de        51
Die Syntax: OO und Groovy

      – Lokale Variablen und Felder müssen deklariert
        werden
      – Java Modifiers werden verwendet:
            • private, protected, public, final, static
            • Bei fehlendem Modifier wird eine Property erzeugt




Thorsten Kamann ● thorsten.kamann@itemis.de                       52
Die Syntax: OO und Groovy

      def map = [a:[b:[c:1]]]

      assert map.a.b.c == 1

      try{
             assert map a.x.c == null
      }catch (NullPointerException npe){      Fängt die NPE
      }

      assert map?.a.?x?.c == null




Thorsten Kamann ● thorsten.kamann@itemis.de                   53
Thorsten Kamann ● thorsten.kamann@itemis.de   54
Groovy Beans

      – Sind wie JavaBeans
      – Getter/Setter werden zur Laufzeit erzeugt
      – Event-Support wird mit vereinfachten Methoden
        ermöglicht




Thorsten Kamann ● thorsten.kamann@itemis.de             55
Groovy Beans

 Customer.groovy:                             Customer.java:
 class Customer {                             public class Customer {
   int id                                      private int id = 0;
   String name                                 private String name;
 }
                                                  public int getId(){
                                                    return id;
                                                  }
                                                  public void setId(int id){
                                                           this.id = id;
                                                  }
                                                  ...
                                              }


Thorsten Kamann ● thorsten.kamann@itemis.de                                    56
Groovy Beans

      – Wenn eine Property als private gekennzeichnet
        ist, wird ein Java Field benutzt, um diese Property
        zu repräsentieren




Thorsten Kamann ● thorsten.kamann@itemis.de              57
Groovy Beans

      – Wenn eine Property als public oder protected
        gekennzeichnet wird, werden Getter- und Setter-
        Methoden mit der gleichen Sichtbarkeit und ein
        Feld mit der Sichtbarkeit private auf Bytecode-
        Ebene erzeugt




Thorsten Kamann ● thorsten.kamann@itemis.de           58
Groovy Beans

      – Wenn keine Getter- oder Setter-Methoden für
        Properties mit der Sichtbarkeit public oder
        protected deklariert wurden, werden fehlende
        Getter- und Setter-Methoden mit der gleichen
        Sichtbarkeit automatisch auf Bytecode-Ebene
        erzeugt




Thorsten Kamann ● thorsten.kamann@itemis.de            59
Groovy Beans

      – Mit selbst deklarierten Getter- und Setter-
        Methoden können die von der Groovy-Runtime
        generierten Methoden überschrieben werden




Thorsten Kamann ● thorsten.kamann@itemis.de           60
Groovy Beans

 Groovy:                                      Java:
 def button = new JButton(Push me!”)          final JButton button =
                                                         new Jbutton(„Push me!“);
 button.actionPerformed = {event ->           button.addEventListener(
   println button.text                           new IActionListener(){
 }                                                  public void actionPerformed(
                                                       ActionEvent event){
                                                       System.out.println(
                                                        button.getText());
                                                     }
                                                 });




Thorsten Kamann ● thorsten.kamann@itemis.de                                         61
Thorsten Kamann ● thorsten.kamann@itemis.de   62
XML-Processing
                                               XML-Support


                          Edit                                 Create
                     XML-Parser                              MarkupBuilder

                     XMLSlurper                               NodeBuilder

                    DOMCategroy



      DOM          StAX        DOM4J          JAXEN          DOM    DOM4J

      SAX          XOM         JDOM           XPATH          XOM    JDOM


Thorsten Kamann ● thorsten.kamann@itemis.de                                  63
XML-Processing

      – Groovy bietet reichhaltige Unterstützung für das
        XML-Processing
      – GPath (Xpath) Ausdrücke erlauben schnelle
        Navigation im XML-Dokument
      – DOMCategory stellt mächtige
        Navigationselemente zur Verfügung



Thorsten Kamann ● thorsten.kamann@itemis.de                64
XML-Processing

      DOM Element               Expression       Beschreibung
      Element                   .elementName     Alle Kindelemente mit dem
                                .„elementName„   angegebenen Namen
      Element                   [index]          Kindelement mit dem [index]
      Element                   .@attrName       Attribut mit den angebenen Namen
                                .„@attrName„
                                .[„@attrName„]
      Element                   .name()          Name des aktuellen Elements
      Element                   .parent()        Das Elternelement
      Element                   .text()          Der Textinhalt des Elements


Thorsten Kamann ● thorsten.kamann@itemis.de                                         65
XML-Processing
  //XML-Parser
  def xml = new XmlParser().parseText(SOME_XML_TEXT)

  //XML-Slurper
  def xml = new XmlSlurper().parseText(SOME_XML_TEXT)

  //DOMCategory
  def reader = new StringReader(SOME_XML_TEXT)
  def doc = DOMBuilder.parse(reader)
  def records = doc.documentElement

  use (DOMCategory) {
         //do something
  }


Thorsten Kamann ● thorsten.kamann@itemis.de             66
Thorsten Kamann ● thorsten.kamann@itemis.de   67
Groovy Builder

      – Groovy bietet Unterstützung für die Arbeit mit
        Baumartige Strukturen:
            • XML, HTML, Ant Tasks, Swing UI's, SWT UI„s
                                                                           Your
                   XML          HTML            ANT      Swing      SWT
                                                                          Builder

                                              GroovyObjectSupport


                                                BuilderSupport


Thorsten Kamann ● thorsten.kamann@itemis.de                                         68
Groovy Builder

      – eine einheitliche Schnittstelle
            • Elemente sind Closures
            • Attribute sind Maps
      – Vollständige Integration anderer Groovy-Features
            •   Collections
            •   Arrays
            •   Conditions
            •   ...

Thorsten Kamann ● thorsten.kamann@itemis.de            69
Groovy Builder

  builder = new                               <person>
         MarkupBuilder(writer)                  <name first=“Thorsten“
  builder.person() {                                  last=“Kamann“>
    name(first:“Thorstenquot;,                        <age>34</age>
         last:“Kamannquot;) {                       </name>
      age(quot;34quot;)                               </person>
    }
  }




Thorsten Kamann ● thorsten.kamann@itemis.de                              70
Groovy Builder

  def writer = new FileWriter(“markup.html“)
  def html = new groovy.xml.MarkupBuilder(writer)
  html.html{
    head{
      title ‘Hello Groovy!‘
    }
    body{
      h1 ‘Hello Groovy‘
      p(style:‘font-weight: bold;‘,
         ‘This is built by Groovy.‘)
    }
  }



Thorsten Kamann ● thorsten.kamann@itemis.de         71
Groovy Builder




Thorsten Kamann ● thorsten.kamann@itemis.de   72
Groovy Builder

  def ant = new groovy.util.AntBuilder()
  ant.mkdir(dir:myDir)
  ant.copy(todir:myDir) {
      fileset(dir:quot;src/testquot;) {
         include(name:quot;**/*.groovyquot;)
      }
  }




Thorsten Kamann ● thorsten.kamann@itemis.de   73
Groovy Builder

  def swing = new groovy.swing.SwingBuilder()
  def frame = swing.frame(title:'Password'){
      passwordField(columns:30, actionPerformed: {event ->
         println event.source.text
         System.exit(0)
      })
  }
  frame.pack()
  frame.show()




Thorsten Kamann ● thorsten.kamann@itemis.de                  74
Groovy Builder




Thorsten Kamann ● thorsten.kamann@itemis.de   75
Groovy Builder

      bb = new grails.spring.BeanBuilder()
      bb.beans{
         CustomerService(org.x.y.z.CustomerServiceImpl){
             customerDao = CustomerDao
         }
         CustomerDao(org.x.y.z.CustomerDaoImpl){
              sessionFactory = MySessionFactory
           }

          ApplicationContext context =
      bb.createApplicationContext()
      }



Thorsten Kamann ● thorsten.kamann@itemis.de                76
Thorsten Kamann ● thorsten.kamann@itemis.de   77
Testing
                                              Groovy Testing

                                                                            TPTP

          Unit                          Coverage     UI-Test   Webservice-Test

               jUnit                  Corbertura
                                                                          SoapUI
                  Mocks                       HTML Unit   Canoo Webtest
                  Stubs




Thorsten Kamann ● thorsten.kamann@itemis.de                                        78
Testing

      – jUnit ist in der Groovy-Runtime verankert
      – Zusätzliche Assert-Statements
      – Leicht integrierbar mit Ant und Maven
      – Groovy liefert auch Groovy Mocks




Thorsten Kamann ● thorsten.kamann@itemis.de         79
Testing

      assertArrayEquals(Object[] expected, Object[] value)
      assertLength(int length, char[] array)
      assertLength(int length, int[] array)
      assertLength(int length, Object[] array)
      assertContains(char expected, char[] array)
      assertContains(int expected, int[] array)
      assertToString(Object value, String expected)
      assertInspect(Object value, String expected)
      assertScript(final String script)
      shouldFail(Closure code)
      shouldFail(Class clazz, Closure code)




Thorsten Kamann ● thorsten.kamann@itemis.de                  80
Testing

      import groovy.mock.interceptor.MockFor

      def mocker = new MockFor(Collaborator.class)
      mocker.demand.one(1..2) { 1 }
      mocker.demand.two()     { 2 }

      mocker.use {
          def caller =              new Caller()
          assertEquals              1, caller.collaborateOne()
          assertEquals              1, caller.collaborateOne()
          assertEquals              2, caller.collaborateTwo()
      }



Thorsten Kamann ● thorsten.kamann@itemis.de                      81
Testing

      – Resourcen (*.xml, Spring) können zur Laufzeit
        erzeugt werden
      – Zugriffe auf private Java-Ressourcen sind
        einfacher (kein Reflection)
      – Stubs und Mocks sind einfacher
      – 100%ige Integration in den Buildprozess (Ant,
        Maven)


Thorsten Kamann ● thorsten.kamann@itemis.de             82
Thorsten Kamann ● thorsten.kamann@itemis.de   83
Grails

      – MVC-Framework
            • Basierend auf Spring-MVC und Hibernate
      – JSP oder GSP
      – Einfache AJAX-Integration
      – Sehr performant
      – Integrierter Job-Scheduler



Thorsten Kamann ● thorsten.kamann@itemis.de            84
Grails

      – Domänenklassen (mit GORM)
      – Controller
      – Services
      – Jobs
      – CRUD-Anwendung in No-Time
      – AJAX (Dojo, Yahoo, Scriptacolous, Prototype)
      – Vollständig integriert

Thorsten Kamann ● thorsten.kamann@itemis.de            85
Thorsten Kamann ● thorsten.kamann@itemis.de   86
Groovy Module

      class Client{
        String name         Einfache Properties
        String email
        Address address           1:1 Beziehung
        static hasMany = [orders: Order]
                                                    1:* Beziehung
          static constraints = {             static belongsTo=Client
            name(blank:false,size:5..20)
            email(email:true)
          }
                                        Constraints
      }




Thorsten Kamann ● thorsten.kamann@itemis.de                            87
Groovy Module




Thorsten Kamann ● thorsten.kamann@itemis.de   88
Thorsten Kamann ● thorsten.kamann@itemis.de   89
IDE-Support

      – Assistenten für Groovy-Klassen und –Unittests
      – Komplette Integration in Eclipse
      – Syntax-Coloring
      – Syntax-Checking
      – Word-Completion
      – Duck-Typing


Thorsten Kamann ● thorsten.kamann@itemis.de             90
IDE-Support
        Instance variable                     Method completion as
           completion                          Groovy Properties




                                                Complex
                                               completion




Thorsten Kamann ● thorsten.kamann@itemis.de                          91
IDE-Support
          Typed local variable                Duck-Typing




Thorsten Kamann ● thorsten.kamann@itemis.de                 92
Thorsten Kamann ● thorsten.kamann@itemis.de   93
Links und Ressourcen

                                              Groovy in Action
                                              von Dierk Koenig, Andrew Glover, Paul King,
                                              Guillaume Laforge

                                              - Taschenbuch: 696 Seiten
                                              - Verlag: Manning (Januar 2007)
                                              - Sprache: Englisch
                                              - ISBN-10: 1932394842
                                              - ISBN-13: 978-1932394849




Thorsten Kamann ● thorsten.kamann@itemis.de                                                 94
Links und Ressourcen
• Groovy Webseite
     http://groovy.codehaus.org/

• Groovy Series Podcast
     http://groovy.codehaus.org/Groovy+Series

• Groovy Blogs
     http://www.groovyblogs.org/

• Webseite des Referenten (Blog, Wiki)
     http://www.thorsten-kamann.de




Thorsten Kamann ● thorsten.kamann@itemis.de     95
Thorsten Kamann ● thorsten.kamann@itemis.de   96

Weitere ähnliche Inhalte

Andere mochten auch

Lw Ppt Dokumentation
Lw Ppt DokumentationLw Ppt Dokumentation
Lw Ppt Dokumentation
FDPerlangen
 
Contenido Multimedia
Contenido MultimediaContenido Multimedia
Contenido Multimedia
Lourdes Portilla
 
Web 2.0-Workshop Stuttgart
Web 2.0-Workshop StuttgartWeb 2.0-Workshop Stuttgart
Web 2.0-Workshop Stuttgart
Benjamin Jörissen
 
Abraham unidad 5
Abraham unidad 5Abraham unidad 5
Abraham unidad 5
Abraham Rayon
 
Im Schnittfeld von Schul , Lern- und Medienkulturen- Medienbildung in der Schule
Im Schnittfeld von Schul , Lern- und Medienkulturen- Medienbildung in der SchuleIm Schnittfeld von Schul , Lern- und Medienkulturen- Medienbildung in der Schule
Im Schnittfeld von Schul , Lern- und Medienkulturen- Medienbildung in der Schule
Benjamin Jörissen
 
Sich fest klammern
Sich fest klammernSich fest klammern
Sich fest klammern
hembau
 
Exel y point
Exel y pointExel y point
Exel y point
Danny Muguicha
 
Komposita in der deutschen Gegenwartssprache
Komposita in der deutschen GegenwartsspracheKomposita in der deutschen Gegenwartssprache
Komposita in der deutschen Gegenwartssprache
Jelena Kostic-Tomovic
 
10estudiosmisionales
10estudiosmisionales10estudiosmisionales
10estudiosmisionales
Heriberto González
 
La tecnologia en clase
La tecnologia en claseLa tecnologia en clase
La tecnologia en clase
allisongaiborbohorquez
 
Bildung und das Social Web: Mythen, Zumutungen, Potenziale
Bildung und das Social Web: Mythen, Zumutungen, PotenzialeBildung und das Social Web: Mythen, Zumutungen, Potenziale
Bildung und das Social Web: Mythen, Zumutungen, Potenziale
Benjamin Jörissen
 
Weblin説明資料080911
Weblin説明資料080911Weblin説明資料080911
Weblin説明資料080911
meltingdots
 
hebräische Zahlen 1 bis 10 ivrit zahlen 1 bis 10
hebräische Zahlen 1 bis 10 ivrit zahlen 1 bis 10hebräische Zahlen 1 bis 10 ivrit zahlen 1 bis 10
hebräische Zahlen 1 bis 10 ivrit zahlen 1 bis 10
redux2
 
Esferos local
Esferos localEsferos local
Esferos local
local publicidad
 
Neuzuzüger Apéro Erlenmatt West 28.5.15
Neuzuzüger Apéro Erlenmatt West 28.5.15Neuzuzüger Apéro Erlenmatt West 28.5.15
Neuzuzüger Apéro Erlenmatt West 28.5.15
ErlenmattWest
 
Community-Funktionen
Community-FunktionenCommunity-Funktionen
Community-Funktionen
edelweiss_Deutschland
 
Matriz propuesta por Lily Hojana Ariza
Matriz propuesta por Lily Hojana Ariza Matriz propuesta por Lily Hojana Ariza
Matriz propuesta por Lily Hojana Ariza
Leidy Johana Pava Velandia
 
Usb 2012
Usb 2012Usb 2012

Andere mochten auch (20)

Lw Ppt Dokumentation
Lw Ppt DokumentationLw Ppt Dokumentation
Lw Ppt Dokumentation
 
Contenido Multimedia
Contenido MultimediaContenido Multimedia
Contenido Multimedia
 
Web 2.0-Workshop Stuttgart
Web 2.0-Workshop StuttgartWeb 2.0-Workshop Stuttgart
Web 2.0-Workshop Stuttgart
 
Abraham unidad 5
Abraham unidad 5Abraham unidad 5
Abraham unidad 5
 
Im Schnittfeld von Schul , Lern- und Medienkulturen- Medienbildung in der Schule
Im Schnittfeld von Schul , Lern- und Medienkulturen- Medienbildung in der SchuleIm Schnittfeld von Schul , Lern- und Medienkulturen- Medienbildung in der Schule
Im Schnittfeld von Schul , Lern- und Medienkulturen- Medienbildung in der Schule
 
Gat1
Gat1Gat1
Gat1
 
Sich fest klammern
Sich fest klammernSich fest klammern
Sich fest klammern
 
Exel y point
Exel y pointExel y point
Exel y point
 
Komposita in der deutschen Gegenwartssprache
Komposita in der deutschen GegenwartsspracheKomposita in der deutschen Gegenwartssprache
Komposita in der deutschen Gegenwartssprache
 
10estudiosmisionales
10estudiosmisionales10estudiosmisionales
10estudiosmisionales
 
La tecnologia en clase
La tecnologia en claseLa tecnologia en clase
La tecnologia en clase
 
Bildung und das Social Web: Mythen, Zumutungen, Potenziale
Bildung und das Social Web: Mythen, Zumutungen, PotenzialeBildung und das Social Web: Mythen, Zumutungen, Potenziale
Bildung und das Social Web: Mythen, Zumutungen, Potenziale
 
Weblin説明資料080911
Weblin説明資料080911Weblin説明資料080911
Weblin説明資料080911
 
hebräische Zahlen 1 bis 10 ivrit zahlen 1 bis 10
hebräische Zahlen 1 bis 10 ivrit zahlen 1 bis 10hebräische Zahlen 1 bis 10 ivrit zahlen 1 bis 10
hebräische Zahlen 1 bis 10 ivrit zahlen 1 bis 10
 
Esferos local
Esferos localEsferos local
Esferos local
 
ABBAS MUHAMMAD DOCUMENTS
ABBAS MUHAMMAD DOCUMENTSABBAS MUHAMMAD DOCUMENTS
ABBAS MUHAMMAD DOCUMENTS
 
Neuzuzüger Apéro Erlenmatt West 28.5.15
Neuzuzüger Apéro Erlenmatt West 28.5.15Neuzuzüger Apéro Erlenmatt West 28.5.15
Neuzuzüger Apéro Erlenmatt West 28.5.15
 
Community-Funktionen
Community-FunktionenCommunity-Funktionen
Community-Funktionen
 
Matriz propuesta por Lily Hojana Ariza
Matriz propuesta por Lily Hojana Ariza Matriz propuesta por Lily Hojana Ariza
Matriz propuesta por Lily Hojana Ariza
 
Usb 2012
Usb 2012Usb 2012
Usb 2012
 

Ähnlich wie Let’s groove with Groovy

Groovy - Rocks or Not?
Groovy - Rocks or Not?Groovy - Rocks or Not?
Groovy - Rocks or Not?
Thorsten Kamann
 
JavaScript Security
JavaScript SecurityJavaScript Security
JavaScript Security
Mayflower GmbH
 
Mehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch SkriptsprachenMehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch Skriptsprachen
jlink
 
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-AnwendungBack to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
MongoDB
 
Von Java Zu Groovy
Von Java Zu GroovyVon Java Zu Groovy
Von Java Zu Groovy
jlink
 
2008 02 01 Zeller
2008 02 01 Zeller2008 02 01 Zeller
2008 02 01 Zeller
CHOOSE
 
Creasoft - Windows powershell
Creasoft - Windows powershellCreasoft - Windows powershell
Creasoft - Windows powershell
Creasoft AG
 
Chaos Kata Fitnesstraining für DevOps Teams
Chaos Kata Fitnesstraining für DevOps TeamsChaos Kata Fitnesstraining für DevOps Teams
Chaos Kata Fitnesstraining für DevOps Teams
Ramon Anger
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
s0enke
 
JsUnconf 2014
JsUnconf 2014JsUnconf 2014
JsUnconf 2014
emrox
 
Microservices mit Java und Go im Vergleich
Microservices mit Java und Go im VergleichMicroservices mit Java und Go im Vergleich
Microservices mit Java und Go im Vergleich
QAware GmbH
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
Sebastian Springer
 
An Introduction to Ruby
An Introduction to RubyAn Introduction to Ruby
An Introduction to Ruby
Jonathan Weiss
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
QAware GmbH
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
NETWAYS
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
jlink
 

Ähnlich wie Let’s groove with Groovy (16)

Groovy - Rocks or Not?
Groovy - Rocks or Not?Groovy - Rocks or Not?
Groovy - Rocks or Not?
 
JavaScript Security
JavaScript SecurityJavaScript Security
JavaScript Security
 
Mehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch SkriptsprachenMehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch Skriptsprachen
 
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-AnwendungBack to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
 
Von Java Zu Groovy
Von Java Zu GroovyVon Java Zu Groovy
Von Java Zu Groovy
 
2008 02 01 Zeller
2008 02 01 Zeller2008 02 01 Zeller
2008 02 01 Zeller
 
Creasoft - Windows powershell
Creasoft - Windows powershellCreasoft - Windows powershell
Creasoft - Windows powershell
 
Chaos Kata Fitnesstraining für DevOps Teams
Chaos Kata Fitnesstraining für DevOps TeamsChaos Kata Fitnesstraining für DevOps Teams
Chaos Kata Fitnesstraining für DevOps Teams
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
 
JsUnconf 2014
JsUnconf 2014JsUnconf 2014
JsUnconf 2014
 
Microservices mit Java und Go im Vergleich
Microservices mit Java und Go im VergleichMicroservices mit Java und Go im Vergleich
Microservices mit Java und Go im Vergleich
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
An Introduction to Ruby
An Introduction to RubyAn Introduction to Ruby
An Introduction to Ruby
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
 

Mehr von Thorsten Kamann

Scrum on rails
Scrum on railsScrum on rails
Scrum on rails
Thorsten Kamann
 
Scrum and distributed teams
Scrum and distributed teamsScrum and distributed teams
Scrum and distributed teams
Thorsten Kamann
 
Effizente Entwicklung für verteilte Projekte
Effizente Entwicklung für verteilte ProjekteEffizente Entwicklung für verteilte Projekte
Effizente Entwicklung für verteilte Projekte
Thorsten Kamann
 
Spring 3 - Der dritte Frühling
Spring 3 - Der dritte FrühlingSpring 3 - Der dritte Frühling
Spring 3 - Der dritte Frühling
Thorsten Kamann
 
Spring 3 - An Introduction
Spring 3 - An IntroductionSpring 3 - An Introduction
Spring 3 - An Introduction
Thorsten Kamann
 
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and MavenWebtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
Thorsten Kamann
 
My Daily Spring - Best Practices with the Springframework
My Daily Spring - Best Practices with the SpringframeworkMy Daily Spring - Best Practices with the Springframework
My Daily Spring - Best Practices with the Springframework
Thorsten Kamann
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development Environments
Thorsten Kamann
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Thorsten Kamann
 
Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?
Thorsten Kamann
 
Spring 2.0
Spring 2.0Spring 2.0
Spring 2.0
Thorsten Kamann
 
Spring 2.0
Spring 2.0Spring 2.0
Spring 2.0
Thorsten Kamann
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Thorsten Kamann
 

Mehr von Thorsten Kamann (13)

Scrum on rails
Scrum on railsScrum on rails
Scrum on rails
 
Scrum and distributed teams
Scrum and distributed teamsScrum and distributed teams
Scrum and distributed teams
 
Effizente Entwicklung für verteilte Projekte
Effizente Entwicklung für verteilte ProjekteEffizente Entwicklung für verteilte Projekte
Effizente Entwicklung für verteilte Projekte
 
Spring 3 - Der dritte Frühling
Spring 3 - Der dritte FrühlingSpring 3 - Der dritte Frühling
Spring 3 - Der dritte Frühling
 
Spring 3 - An Introduction
Spring 3 - An IntroductionSpring 3 - An Introduction
Spring 3 - An Introduction
 
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and MavenWebtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
 
My Daily Spring - Best Practices with the Springframework
My Daily Spring - Best Practices with the SpringframeworkMy Daily Spring - Best Practices with the Springframework
My Daily Spring - Best Practices with the Springframework
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development Environments
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
 
Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?
 
Spring 2.0
Spring 2.0Spring 2.0
Spring 2.0
 
Spring 2.0
Spring 2.0Spring 2.0
Spring 2.0
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
 

Let’s groove with Groovy

  • 1. Thorsten Kamann ● thorsten.kamann@itemis.de 1
  • 2. Agenda Was ist Groovy? Testing Getting started Grails Syntax Groovy Module GroovyBeans IDE-Support XML-Processing Links Groovy Builder Thorsten Kamann ● thorsten.kamann@itemis.de 2
  • 3. Was ist Scripting? • Skriptsprachen sind Programmiersprachen, die vor allem für kleine, überschaubare Programmieraufgaben gedacht sind • Kein Deklarationszwang für Variablen • Automatische Speicherverwaltung • Werden in der Regel ohne getrennte Übersetzungsphase ausgeführt (d. h. sie werden „interpretiert“) Thorsten Kamann ● thorsten.kamann@itemis.de 3
  • 4. Was ist Groovy? • Eine dynamische Sprache • Inspiriert von Ruby, Python, Smalltalk • Entwickelt für die Java-Plattform – Um sie Java-Entwicklern zugänglich zu machen – Um möglichst viel der Java-Syntax wieder verwenden zu können – Um eine einfache Anbindung zu Enterprise- Systemen anzubieten Thorsten Kamann ● thorsten.kamann@itemis.de 4
  • 5. Thorsten Kamann ● thorsten.kamann@itemis.de 5
  • 6. Getting started • Download des aktuellen Release von http://groovy.codehaus.org • Entpacken des Archivs • Setzen der Umgebungsvariable GROOVY_HOME • Hinzufügen von %GROOVY_HOME%bin zur PATH- Variable • Starten von groovyConsole und Eingabe von println „Hallo Welt“ mit anschliessendem STRG-R Thorsten Kamann ● thorsten.kamann@itemis.de 6
  • 8. Getting started: Embedding Java- Anwendung Bean-Scripting- Groovy- Groovy- Groovy ANT Framework Shell Classloader ScriptEngine Maven (BSF) Groovy Script Thorsten Kamann ● thorsten.kamann@itemis.de 8
  • 9. Getting started: Embedding – Ist ein allgemeine Möglichkeit, jede beliebige Scriptsprache in Java-Anwendungen einzubinden – Groovy bietet aber leichtgewichtigere und leistungsfähigere Möglichkeiten der Einbindung Thorsten Kamann ● thorsten.kamann@itemis.de 9
  • 10. Getting started: Embedding – Groovy-Shell bietet die Möglichkeit des Ein- und Auslesens von Variablen mittels des Binding- Objekts Binding binding = new Binding(); binding.setVariable(quot;fooquot;, new Integer(2)); GroovyShell shell = new GroovyShell(binding); Object value = shell.evaluate( quot;println 'Hello World!'; x = 123; return foo * 10quot;); assert value == 20; assert binding.getVariable(quot;x„) == 123; Thorsten Kamann ● thorsten.kamann@itemis.de 10
  • 11. Getting started: Embedding – Lädt Groovy-Klassen dynamisch und ermöglicht den direkten Zugriff auf deren Methoden ClassLoader parent = getClass().getClassLoader(); GroovyClassLoader loader = new GroovyClassLoader(parent); Class groovyClass = loader.parseClass( new File(quot;script.groovyquot;)); GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance(); Object[] args = {}; groovyObject.invokeMethod(quot;runquot;, args); Thorsten Kamann ● thorsten.kamann@itemis.de 11
  • 12. Getting started: Embedding – Lädt Groovy-Klassen dynamisch und ermöglicht den direkten Zugriff auf deren Methoden GroovyClassLoader gcl = new GroovyClassLoader(); Class clazz = gcl.parseClass( myStringwithGroovyClassSource, quot;SomeName.groovyquot;); Object aScript = clazz.newInstance(); MyInterface myObject = (MyInterface) aScript; myObject.interfaceMethod(); Thorsten Kamann ● thorsten.kamann@itemis.de 12
  • 13. Getting started: Embedding – Dies ist die leistungsfähige Möglichkeit, um Groovy-Skripte auszuführen. String[] roots = new String[] {quot;/my/groovy/script/pathquot;}; GroovyScriptEngine gse = new GroovyScriptEngine(roots); Binding binding = new Binding(); binding.setVariable(quot;inputquot;, quot;worldquot;); gse.run(quot;hello.groovyquot;, binding); System.out.println(binding.getVariable(quot;outputquot;)); Thorsten Kamann ● thorsten.kamann@itemis.de 13
  • 14. Getting started: Embedding – ANT-Task, mit dem eine beliebige Anzahl von Groovy-Skripten ausgeführt werden kann – GroovyC-Task, der Groovy-Skripte (Klassen) zu Java Bytecode kompiliert – Erstellen von Ant-Tasks mit Groovy und dem Ant-Builder – Erzeugen von Ant-Skripten Thorsten Kamann ● thorsten.kamann@itemis.de 14
  • 15. Getting started: Embedding – Unterstützung mittels des M2-Ant-Plugins – Auf http://mojo.codehaus.org/ existieren bereits Maven- Tools für direkte Unterstützung von Groovy: • Groovy-Compiler • Groovy-Archetype • Tools, um Maven-Plugins mit Groovy zu entwickeln Thorsten Kamann ● thorsten.kamann@itemis.de 15
  • 16. Getting started: Embedding – Groovy kann direkt von der Eingabeaufforderung groovy script.groovy [arguments] ausgeführt werden – Alternativ kann über den Dialog Ordneroptionen-->Dateitypen die Extension *.groovy an groovy.bat gebunden werden. Thorsten Kamann ● thorsten.kamann@itemis.de 16
  • 17. Getting started: Embedding – Groovy kann direkt von der Konsole mittels groovy script.groovy [arguments] ausgeführt werden – Alternativ kann in die 1. Zeile eines Groovy-Skripts #!/usr/bin/env groovy eingefügt werden. – So kann mit chmod +x script.groovy ./script.groovy das Skript ausgeführt werden Thorsten Kamann ● thorsten.kamann@itemis.de 17
  • 18. Thorsten Kamann ● thorsten.kamann@itemis.de 18
  • 19. Die Syntax: Groovy vs. Java – Package-, Import-Mechanismus – Class und Method Definition – Kontrollstrukturen (ausser for(init;test,inc)) – Operatoren, Ausdrücke und Zuweisungen – Exeption Handling – Literale – Instantiierung, Referenzen Thorsten Kamann ● thorsten.kamann@itemis.de 19
  • 20. Die Syntax: Groovy vs. Java – Vereinfachter Zugriff auf Java-Objekte mit neuen Ausdrücken und Operatoren – Zusätzliche Möglichkeiten, um Objekte zu erstellen – Neue Konstrollstrukturen – Neue Datentypen – Alles ist ein Objekt Thorsten Kamann ● thorsten.kamann@itemis.de 20
  • 21. Die Syntax: Groovy vs. Java – groovy.lang.*, groovy.util.* – java.lang.*, java.util.*, java.net.*, java.io.* – java.math.BigInteger, java.math.BigDecimal Thorsten Kamann ● thorsten.kamann@itemis.de 21
  • 22. Die Syntax assert(true) assert 1 == 1 def x = 1 assert x == 1 def y=1; assert y == 1 Thorsten Kamann ● thorsten.kamann@itemis.de 22
  • 23. Die Syntax: Datentypen – Alles ist ein Objekt – Keine primitiven Datentypen – Automatisches Wrapping (Boxing/Unboxing) – Optionales Typing – Statisches/Dynamisches Typing Thorsten Kamann ● thorsten.kamann@itemis.de 23
  • 24. Die Syntax: Datentypen Typ Beispiel java.lang.Integer 15, 0x1234ffff java.lang.Long 100L, 100l java.lang.Float 1.23F, 1.23f java.lang.Double 1.23D, 1.23d java.math.BigInteger 123g, 456G java.math.BigDecimal 1.23, 4.56, 1.4E4, 2.8e4, 1.23g, 1.23G Thorsten Kamann ● thorsten.kamann@itemis.de 24
  • 25. Die Syntax: Datentypen – Whole word Matcher – Find Matcher – Count – Foreach – Replace – Split Thorsten Kamann ● thorsten.kamann@itemis.de 25
  • 26. Die Syntax: Datentypen //Finder assert „Hello Groovy!“ =~ /o.G/ //Matcher assert „Hello Groovy!“ ==~ /HellosGroovy!/ //Replace assert „Hello Groovy!“.replaceAll(/Hello/, „Hi“) == „Hi Groovy!“ //Split assert „Hello Groovy!“.split(/ /).size == 2 Thorsten Kamann ● thorsten.kamann@itemis.de 26
  • 27. Die Syntax: Datentypen – Basieren auf einfachen Strings – Bieten allerdings eine erweiterte Funktionalität – Sie müssen in doppelten Anführungszeichen definiert werden – Unterstützen Platzhalter • ${expression} • $expression Thorsten Kamann ● thorsten.kamann@itemis.de 27
  • 28. Die Syntax: Datentypen me = „Thorsten“ age = 34 location = „Neuss“ line = „Ich heisse $name, bin $age und wohne in $location“ assert line == „Ich heisse Thorsten, bin 34 und wohne in Neuss“ assert line instancof java.lang.String Thorsten Kamann ● thorsten.kamann@itemis.de 28
  • 29. Die Syntax: Datentypen Start/End Zeichen Beispiel GString? Backslash? Einfache Anführungszeichen ‚Hallo Thorsten„   Doppelte Anführungszeichen „Hallo $name“   Dreifache Anführungszeichen „„„----------------   Total: $0.02 ---------------„„„ Dreifache doppelte “““---------------   Anführungszeichen Line with text --------------“““ Forward Slash /x(d*)y/   Thorsten Kamann ● thorsten.kamann@itemis.de 29
  • 30. Die Syntax: Datentypen greeting = „Hello Groovy!“ assert greeting[0] == „H“ assert greeting [6..11] == „Groovy“ assert ‚Hi‘ + greeting – ‚Hello‘ == „Hi Groovy!“ assert greeting.count(„o“) = 3 assert „x“.padLeft(3) == „ x“ assert „x“.padRight(3) == „x „ assert „x“.center(3) == „ x „ assert „x“ * 3 == „xxx“ Thorsten Kamann ● thorsten.kamann@itemis.de 30
  • 31. Die Syntax: Datentypen (collective) List list = [] assert list.size == 0 list = [‚a‘, ‚b‘, ‚c‘] assert list.size == 3 && list[1] = ‚b‘ list << ‚d‘ assert list.size == 4 list += ‚e‘ assert list.size == 5 assert list – ‚d‘ == [‚a‘, ‚b‘, ‚c‘, ‚e‘] Thorsten Kamann ● thorsten.kamann@itemis.de 31
  • 32. Die Syntax: Datentypen (collective) – Sind Listen mit einem definierten Anfangs- und Endwert – Nahezu jedes Objekt kann in einer Range verwaltet werden • Methoden next und previous müssen implementiert werden • Das Interface java.lang.Comparable muss implementiert werden Thorsten Kamann ● thorsten.kamann@itemis.de 32
  • 33. Die Syntax: Datentypen (collective) def range = 0..10 assert range.contains(0) assert range.contains(10) range = 0..<10 assert range.contains(0) assert !range.contains(10) Thorsten Kamann ● thorsten.kamann@itemis.de 33
  • 34. Die Syntax: Datentypen (collective) Map map = [:] assert map.size == 0 map = [a:1, b:2,c:3] assert map.size = 3 assert map.get(„a“) == 1 assert map[‚b‘] == 2 assert map.c == 3 map.e = 4 assert map.e == 4 Thorsten Kamann ● thorsten.kamann@itemis.de 34
  • 35. Die Syntax: Datentypen (collective) – Expandos ermöglichen die Erzeugung von dynamischen Objekten def player = new Expando() player.name = “Thorstenquot; player.greeting = { quot;Hello, my name is $player.namequot; } assert player.greeting() == quot;Hello, my name is Thorstenquot; Thorsten Kamann ● thorsten.kamann@itemis.de 35
  • 36. Die Syntax: Closures – Codeblöcke – Können einen Wert/Objekt zurückgeben – Referenzieren und verwenden Variablen – call()(implizit/explizit) führt die Closure aus – Können an eine Variable gebunden werden – Ähneln Java Inner Classes Thorsten Kamann ● thorsten.kamann@itemis.de 36
  • 37. Die Syntax: Closures List list = [1, 2, 3] list.each{ entry -> println „entry $entry“ } Ausgabe: entry 1 entry 2 entry 3 Thorsten Kamann ● thorsten.kamann@itemis.de 37
  • 38. Die Syntax: Closures public void each(Closure closure){ for (it: listItems){ closure(it).call(); } } Thorsten Kamann ● thorsten.kamann@itemis.de 38
  • 39. Die Syntax: Closures Class MethodClosureSample(){ boolean validate(String value){ return StringUtils.isNotEmpty(value); } } MethodClosureSample sample = new MethodeClosureSample() List success = [„Hello“, „World“, „!“] List fails = [„Hello“, „“, „World“, „!“] assert success.each(sample.&validate) assert !fails.each(sample.&validate) Thorsten Kamann ● thorsten.kamann@itemis.de 39
  • 40. Die Syntax: Closures – Transformiert eine Closure mit vielen Parametern in eine Closure mit weniger Parametern – Dabei werden Parameter mit Werten vorbelegt def adder = {x, y -> return x+y} def addOne = adder.curry(1) assert addOne(5) == 6 Thorsten Kamann ● thorsten.kamann@itemis.de 40
  • 41. Die Syntax: Closures Closure Beschreibung collect Sammelt Objekte und fügt sie in eine neue Liste ein each Führt für jedes Element aus find Findet ein Element findAll Findet alle Elemente anhand von Kriterien min(Comparator) Gibt den min. Wert aus der Collection zurück max(Comparator) Gibt den max. Wert aus der Collection zurück sort(Comparator) Sortiert die Collection (Comparator ist optional) unique Entfernt doppelte Werte aus der Collection Thorsten Kamann ● thorsten.kamann@itemis.de 41
  • 42. Die Syntax: Kontrollstrukturen • Runtime type Evaluation criterion required for truth Boolean Booleanwert muss true sein Matcher Der reguläre Ausdruck muss mindestens 1 Treffer haben Collection Die Collection darf nicht leer sein Map Die Map darf nicht leer sein String Der String darf ebenfalls nicht leer sein Number Muss ungleich 0 sein Alles andere Die Objektreferenz muss ungleich null sein Thorsten Kamann ● thorsten.kamann@itemis.de 42
  • 43. Die Syntax: If-Statement • If (true) assert true Else assert false If (1){ assert true }else{ assert false } If (0) assert false Else if (1) assert true Else assert false (1 > 0)? assert true: assert False Thorsten Kamann ● thorsten.kamann@itemis.de 43
  • 44. Die Syntax: Kontrollstrukturen – Kann mit jedem Datentyp verwendet werden switch (10){ case 0 : assert false; break; case 0..9 : assert false; break; case [8,9,11] : assert false; break; case Float : assert false; break; case {it%3==0} : assert false; break; case ~/../ : assert true; break; default : assert false; break; } Thorsten Kamann ● thorsten.kamann@itemis.de 44
  • 45. Die Syntax: Looping def list = [1, 2, 3, 4, 5] while (list){ list.remove() } assert list == [] while (list.size() < 3){ list << list.size()+1 } assert list == [1, 2, 3] Thorsten Kamann ● thorsten.kamann@itemis.de 45
  • 46. Die Syntax: Looping for (String i in ‘a‘..‘c‘) store += i assert store == ‘abc‘ for (i in [1, 2, 3]){ store += i} assert store == ‘123‘ def myString = ‘Hello Groovy!‘ for (i in 0..myString.size()){ store += myString[i]} assert store == myString Entspricht dem Java Equivalent: for (int i=0;i<upperBound;i++){} Thorsten Kamann ● thorsten.kamann@itemis.de 46
  • 47. Die Syntax: Return/Break/Continue Boolean someMethod(){ if (false){ return false } return true } Thorsten Kamann ● thorsten.kamann@itemis.de 47
  • 48. Die Syntax: Return/Break/Continue while (true){ if (someCondition){ break } } Thorsten Kamann ● thorsten.kamann@itemis.de 48
  • 49. Die Syntax: Return/Break/Continue for(item in items){ if (someCondition){ continue } } Thorsten Kamann ● thorsten.kamann@itemis.de 49
  • 50. Die Syntax: Exception – Ähnliche Unterstützung wie in Java • try-catch-finally • try-catch • try-finally – Checked-Exception werden als Runtime- Excpetion hochgereicht Thorsten Kamann ● thorsten.kamann@itemis.de 50
  • 51. Die Syntax: OO und Groovy – Identisch mit Klassen in Java – Können Felder, Konstruktoren, Methoden enthalten – Konstruktoren und Methoden können lokale Variablen verwenden Thorsten Kamann ● thorsten.kamann@itemis.de 51
  • 52. Die Syntax: OO und Groovy – Lokale Variablen und Felder müssen deklariert werden – Java Modifiers werden verwendet: • private, protected, public, final, static • Bei fehlendem Modifier wird eine Property erzeugt Thorsten Kamann ● thorsten.kamann@itemis.de 52
  • 53. Die Syntax: OO und Groovy def map = [a:[b:[c:1]]] assert map.a.b.c == 1 try{ assert map a.x.c == null }catch (NullPointerException npe){ Fängt die NPE } assert map?.a.?x?.c == null Thorsten Kamann ● thorsten.kamann@itemis.de 53
  • 54. Thorsten Kamann ● thorsten.kamann@itemis.de 54
  • 55. Groovy Beans – Sind wie JavaBeans – Getter/Setter werden zur Laufzeit erzeugt – Event-Support wird mit vereinfachten Methoden ermöglicht Thorsten Kamann ● thorsten.kamann@itemis.de 55
  • 56. Groovy Beans Customer.groovy: Customer.java: class Customer { public class Customer { int id private int id = 0; String name private String name; } public int getId(){ return id; } public void setId(int id){ this.id = id; } ... } Thorsten Kamann ● thorsten.kamann@itemis.de 56
  • 57. Groovy Beans – Wenn eine Property als private gekennzeichnet ist, wird ein Java Field benutzt, um diese Property zu repräsentieren Thorsten Kamann ● thorsten.kamann@itemis.de 57
  • 58. Groovy Beans – Wenn eine Property als public oder protected gekennzeichnet wird, werden Getter- und Setter- Methoden mit der gleichen Sichtbarkeit und ein Feld mit der Sichtbarkeit private auf Bytecode- Ebene erzeugt Thorsten Kamann ● thorsten.kamann@itemis.de 58
  • 59. Groovy Beans – Wenn keine Getter- oder Setter-Methoden für Properties mit der Sichtbarkeit public oder protected deklariert wurden, werden fehlende Getter- und Setter-Methoden mit der gleichen Sichtbarkeit automatisch auf Bytecode-Ebene erzeugt Thorsten Kamann ● thorsten.kamann@itemis.de 59
  • 60. Groovy Beans – Mit selbst deklarierten Getter- und Setter- Methoden können die von der Groovy-Runtime generierten Methoden überschrieben werden Thorsten Kamann ● thorsten.kamann@itemis.de 60
  • 61. Groovy Beans Groovy: Java: def button = new JButton(Push me!”) final JButton button = new Jbutton(„Push me!“); button.actionPerformed = {event -> button.addEventListener( println button.text new IActionListener(){ } public void actionPerformed( ActionEvent event){ System.out.println( button.getText()); } }); Thorsten Kamann ● thorsten.kamann@itemis.de 61
  • 62. Thorsten Kamann ● thorsten.kamann@itemis.de 62
  • 63. XML-Processing XML-Support Edit Create XML-Parser MarkupBuilder XMLSlurper NodeBuilder DOMCategroy DOM StAX DOM4J JAXEN DOM DOM4J SAX XOM JDOM XPATH XOM JDOM Thorsten Kamann ● thorsten.kamann@itemis.de 63
  • 64. XML-Processing – Groovy bietet reichhaltige Unterstützung für das XML-Processing – GPath (Xpath) Ausdrücke erlauben schnelle Navigation im XML-Dokument – DOMCategory stellt mächtige Navigationselemente zur Verfügung Thorsten Kamann ● thorsten.kamann@itemis.de 64
  • 65. XML-Processing DOM Element Expression Beschreibung Element .elementName Alle Kindelemente mit dem .„elementName„ angegebenen Namen Element [index] Kindelement mit dem [index] Element .@attrName Attribut mit den angebenen Namen .„@attrName„ .[„@attrName„] Element .name() Name des aktuellen Elements Element .parent() Das Elternelement Element .text() Der Textinhalt des Elements Thorsten Kamann ● thorsten.kamann@itemis.de 65
  • 66. XML-Processing //XML-Parser def xml = new XmlParser().parseText(SOME_XML_TEXT) //XML-Slurper def xml = new XmlSlurper().parseText(SOME_XML_TEXT) //DOMCategory def reader = new StringReader(SOME_XML_TEXT) def doc = DOMBuilder.parse(reader) def records = doc.documentElement use (DOMCategory) { //do something } Thorsten Kamann ● thorsten.kamann@itemis.de 66
  • 67. Thorsten Kamann ● thorsten.kamann@itemis.de 67
  • 68. Groovy Builder – Groovy bietet Unterstützung für die Arbeit mit Baumartige Strukturen: • XML, HTML, Ant Tasks, Swing UI's, SWT UI„s Your XML HTML ANT Swing SWT Builder GroovyObjectSupport BuilderSupport Thorsten Kamann ● thorsten.kamann@itemis.de 68
  • 69. Groovy Builder – eine einheitliche Schnittstelle • Elemente sind Closures • Attribute sind Maps – Vollständige Integration anderer Groovy-Features • Collections • Arrays • Conditions • ... Thorsten Kamann ● thorsten.kamann@itemis.de 69
  • 70. Groovy Builder builder = new <person> MarkupBuilder(writer) <name first=“Thorsten“ builder.person() { last=“Kamann“> name(first:“Thorstenquot;, <age>34</age> last:“Kamannquot;) { </name> age(quot;34quot;) </person> } } Thorsten Kamann ● thorsten.kamann@itemis.de 70
  • 71. Groovy Builder def writer = new FileWriter(“markup.html“) def html = new groovy.xml.MarkupBuilder(writer) html.html{ head{ title ‘Hello Groovy!‘ } body{ h1 ‘Hello Groovy‘ p(style:‘font-weight: bold;‘, ‘This is built by Groovy.‘) } } Thorsten Kamann ● thorsten.kamann@itemis.de 71
  • 72. Groovy Builder Thorsten Kamann ● thorsten.kamann@itemis.de 72
  • 73. Groovy Builder def ant = new groovy.util.AntBuilder() ant.mkdir(dir:myDir) ant.copy(todir:myDir) { fileset(dir:quot;src/testquot;) { include(name:quot;**/*.groovyquot;) } } Thorsten Kamann ● thorsten.kamann@itemis.de 73
  • 74. Groovy Builder def swing = new groovy.swing.SwingBuilder() def frame = swing.frame(title:'Password'){ passwordField(columns:30, actionPerformed: {event -> println event.source.text System.exit(0) }) } frame.pack() frame.show() Thorsten Kamann ● thorsten.kamann@itemis.de 74
  • 75. Groovy Builder Thorsten Kamann ● thorsten.kamann@itemis.de 75
  • 76. Groovy Builder bb = new grails.spring.BeanBuilder() bb.beans{ CustomerService(org.x.y.z.CustomerServiceImpl){ customerDao = CustomerDao } CustomerDao(org.x.y.z.CustomerDaoImpl){ sessionFactory = MySessionFactory } ApplicationContext context = bb.createApplicationContext() } Thorsten Kamann ● thorsten.kamann@itemis.de 76
  • 77. Thorsten Kamann ● thorsten.kamann@itemis.de 77
  • 78. Testing Groovy Testing TPTP Unit Coverage UI-Test Webservice-Test jUnit Corbertura SoapUI Mocks HTML Unit Canoo Webtest Stubs Thorsten Kamann ● thorsten.kamann@itemis.de 78
  • 79. Testing – jUnit ist in der Groovy-Runtime verankert – Zusätzliche Assert-Statements – Leicht integrierbar mit Ant und Maven – Groovy liefert auch Groovy Mocks Thorsten Kamann ● thorsten.kamann@itemis.de 79
  • 80. Testing assertArrayEquals(Object[] expected, Object[] value) assertLength(int length, char[] array) assertLength(int length, int[] array) assertLength(int length, Object[] array) assertContains(char expected, char[] array) assertContains(int expected, int[] array) assertToString(Object value, String expected) assertInspect(Object value, String expected) assertScript(final String script) shouldFail(Closure code) shouldFail(Class clazz, Closure code) Thorsten Kamann ● thorsten.kamann@itemis.de 80
  • 81. Testing import groovy.mock.interceptor.MockFor def mocker = new MockFor(Collaborator.class) mocker.demand.one(1..2) { 1 } mocker.demand.two() { 2 } mocker.use { def caller = new Caller() assertEquals 1, caller.collaborateOne() assertEquals 1, caller.collaborateOne() assertEquals 2, caller.collaborateTwo() } Thorsten Kamann ● thorsten.kamann@itemis.de 81
  • 82. Testing – Resourcen (*.xml, Spring) können zur Laufzeit erzeugt werden – Zugriffe auf private Java-Ressourcen sind einfacher (kein Reflection) – Stubs und Mocks sind einfacher – 100%ige Integration in den Buildprozess (Ant, Maven) Thorsten Kamann ● thorsten.kamann@itemis.de 82
  • 83. Thorsten Kamann ● thorsten.kamann@itemis.de 83
  • 84. Grails – MVC-Framework • Basierend auf Spring-MVC und Hibernate – JSP oder GSP – Einfache AJAX-Integration – Sehr performant – Integrierter Job-Scheduler Thorsten Kamann ● thorsten.kamann@itemis.de 84
  • 85. Grails – Domänenklassen (mit GORM) – Controller – Services – Jobs – CRUD-Anwendung in No-Time – AJAX (Dojo, Yahoo, Scriptacolous, Prototype) – Vollständig integriert Thorsten Kamann ● thorsten.kamann@itemis.de 85
  • 86. Thorsten Kamann ● thorsten.kamann@itemis.de 86
  • 87. Groovy Module class Client{ String name Einfache Properties String email Address address 1:1 Beziehung static hasMany = [orders: Order] 1:* Beziehung static constraints = { static belongsTo=Client name(blank:false,size:5..20) email(email:true) } Constraints } Thorsten Kamann ● thorsten.kamann@itemis.de 87
  • 88. Groovy Module Thorsten Kamann ● thorsten.kamann@itemis.de 88
  • 89. Thorsten Kamann ● thorsten.kamann@itemis.de 89
  • 90. IDE-Support – Assistenten für Groovy-Klassen und –Unittests – Komplette Integration in Eclipse – Syntax-Coloring – Syntax-Checking – Word-Completion – Duck-Typing Thorsten Kamann ● thorsten.kamann@itemis.de 90
  • 91. IDE-Support Instance variable Method completion as completion Groovy Properties Complex completion Thorsten Kamann ● thorsten.kamann@itemis.de 91
  • 92. IDE-Support Typed local variable Duck-Typing Thorsten Kamann ● thorsten.kamann@itemis.de 92
  • 93. Thorsten Kamann ● thorsten.kamann@itemis.de 93
  • 94. Links und Ressourcen Groovy in Action von Dierk Koenig, Andrew Glover, Paul King, Guillaume Laforge - Taschenbuch: 696 Seiten - Verlag: Manning (Januar 2007) - Sprache: Englisch - ISBN-10: 1932394842 - ISBN-13: 978-1932394849 Thorsten Kamann ● thorsten.kamann@itemis.de 94
  • 95. Links und Ressourcen • Groovy Webseite http://groovy.codehaus.org/ • Groovy Series Podcast http://groovy.codehaus.org/Groovy+Series • Groovy Blogs http://www.groovyblogs.org/ • Webseite des Referenten (Blog, Wiki) http://www.thorsten-kamann.de Thorsten Kamann ● thorsten.kamann@itemis.de 95
  • 96. Thorsten Kamann ● thorsten.kamann@itemis.de 96