Thorsten Kamann ● thorsten.kamann@itemis.de   1
Agenda
                    Was ist Groovy?              Testing
                     Getting started             Grails
  ...
Was ist Scripting?
• Skriptsprachen sind Programmiersprachen, die vor
  allem für kleine, überschaubare
  Programmieraufga...
Was ist Groovy?
• Eine dynamische Sprache
• Inspiriert von Ruby, Python, Smalltalk
• Entwickelt für die Java-Plattform
   ...
Thorsten Kamann ● thorsten.kamann@itemis.de   5
Getting started
• Download des aktuellen Release von
     http://groovy.codehaus.org
• Entpacken des Archivs
• Setzen der ...
Getting started
•

•
•
•

•



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

                                                Java-
                                        ...
Getting started: Embedding


      – Ist ein allgemeine Möglichkeit, jede beliebige
        Scriptsprache in Java-Anwendun...
Getting started: Embedding

      – Groovy-Shell bietet die Möglichkeit des Ein- und
        Auslesens von Variablen mitte...
Getting started: Embedding

      – Lädt Groovy-Klassen dynamisch und ermöglicht
        den direkten Zugriff auf deren Me...
Getting started: Embedding

      – Lädt Groovy-Klassen dynamisch und ermöglicht
        den direkten Zugriff auf deren Me...
Getting started: Embedding

      – Dies ist die leistungsfähige Möglichkeit, um
        Groovy-Skripte auszuführen.
     ...
Getting started: Embedding

      – ANT-Task, mit dem eine beliebige Anzahl von
        Groovy-Skripten ausgeführt werden ...
Getting started: Embedding

      – Unterstützung mittels des M2-Ant-Plugins
      – Auf http://mojo.codehaus.org/ existie...
Getting started: Embedding

      – Groovy kann direkt von der Eingabeaufforderung
          groovy script.groovy [argumen...
Getting started: Embedding

      – Groovy kann direkt von der Konsole mittels
            groovy script.groovy [arguments...
Thorsten Kamann ● thorsten.kamann@itemis.de   18
Die Syntax: Groovy vs. Java

      – Package-, Import-Mechanismus
      – Class und Method Definition
      – Kontrollstru...
Die Syntax: Groovy vs. Java

      – Vereinfachter Zugriff auf Java-Objekte mit neuen
        Ausdrücken und Operatoren
  ...
Die Syntax: Groovy vs. Java


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

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

       assert(true)

       assert 1 == 1

       def x = 1
       assert x == 1

       def y=1; assert y == ...
Die Syntax: Datentypen

      – Alles ist ein Objekt
      – Keine primitiven Datentypen
      – Automatisches Wrapping (B...
Die Syntax: Datentypen

      Typ                                Beispiel
      java.lang.Integer                  15, 0x1...
Die Syntax: Datentypen

      – Whole word Matcher
      – Find Matcher
      – Count
      – Foreach
      – Replace
    ...
Die Syntax: Datentypen

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

      //Matcher
      assert „Hello Groovy!“...
Die Syntax: Datentypen

      – Basieren auf einfachen Strings
      – Bieten allerdings eine erweiterte Funktionalität
  ...
Die Syntax: Datentypen

     me = „Thorsten“
     age = 34
     location = „Neuss“
     line = „Ich heisse $name, bin $age...
Die Syntax: Datentypen

      Start/End Zeichen                       Beispiel              GString? Backslash?
      Einf...
Die Syntax: Datentypen

       greeting = „Hello Groovy!“

       assert       greeting[0] == „H“
       assert       gree...
Die Syntax: Datentypen (collective)

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

      list = [‚a‘, ‚b‘, ‚c‘]
      ...
Die Syntax: Datentypen (collective)

      – Sind Listen mit einem definierten Anfangs- und
        Endwert
      – Nahezu...
Die Syntax: Datentypen (collective)

      def range = 0..10
      assert range.contains(0)
      assert range.contains(10...
Die Syntax: Datentypen (collective)

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

      map = [a:1, b:2,c:3]
      asse...
Die Syntax: Datentypen (collective)

      – Expandos ermöglichen die Erzeugung von
        dynamischen Objekten
         ...
Die Syntax: Closures

      – Codeblöcke
      – Können einen Wert/Objekt zurückgeben
      – Referenzieren und verwenden ...
Die Syntax: Closures

      List list = [1, 2, 3]

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

...
Die Syntax: Closures

      public void each(Closure closure){
        for (it: listItems){
          closure(it).call();
...
Die Syntax: Closures

      Class MethodClosureSample(){
        boolean validate(String value){
          return StringUt...
Die Syntax: Closures

      – Transformiert eine Closure mit vielen Parametern
        in eine Closure mit weniger Paramet...
Die Syntax: Closures

      Closure                      Beschreibung
      collect                      Sammelt Objekte u...
Die Syntax: Kontrollstrukturen
•
       Runtime type             Evaluation criterion required for truth
       Boolean   ...
Die Syntax: If-Statement
•
      If (true)               assert true
      Else                    assert false

      If ...
Die Syntax: Kontrollstrukturen

      – Kann mit jedem Datentyp verwendet werden
           switch (10){
                 ...
Die Syntax: Looping

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

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

      for (i in [1, 2, 3]){ ...
Die Syntax: Return/Break/Continue

      Boolean someMethod(){
             if (false){
                    return false
 ...
Die Syntax: Return/Break/Continue

      while (true){
             if (someCondition){
                    break
        ...
Die Syntax: Return/Break/Continue

      for(item in items){
             if (someCondition){
                    continue...
Die Syntax: Exception

      – Ähnliche Unterstützung wie in Java
            • try-catch-finally
            • try-catch
...
Die Syntax: OO und Groovy

      – Identisch mit Klassen in Java
      – Können Felder, Konstruktoren, Methoden
        en...
Die Syntax: OO und Groovy

      – Lokale Variablen und Felder müssen deklariert
        werden
      – Java Modifiers wer...
Die Syntax: OO und Groovy

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

      assert map.a.b.c == 1

      try{
             assert map ...
Thorsten Kamann ● thorsten.kamann@itemis.de   54
Groovy Beans

      – Sind wie JavaBeans
      – Getter/Setter werden zur Laufzeit erzeugt
      – Event-Support wird mit ...
Groovy Beans

 Customer.groovy:                             Customer.java:
 class Customer {                             p...
Groovy Beans

      – Wenn eine Property als private gekennzeichnet
        ist, wird ein Java Field benutzt, um diese Pro...
Groovy Beans

      – Wenn eine Property als public oder protected
        gekennzeichnet wird, werden Getter- und Setter-...
Groovy Beans

      – Wenn keine Getter- oder Setter-Methoden für
        Properties mit der Sichtbarkeit public oder
    ...
Groovy Beans

      – Mit selbst deklarierten Getter- und Setter-
        Methoden können die von der Groovy-Runtime
     ...
Groovy Beans

 Groovy:                                      Java:
 def button = new JButton(Push me!”)          final JBut...
Thorsten Kamann ● thorsten.kamann@itemis.de   62
XML-Processing
                                               XML-Support


                          Edit                ...
XML-Processing

      – Groovy bietet reichhaltige Unterstützung für das
        XML-Processing
      – GPath (Xpath) Ausd...
XML-Processing

      DOM Element               Expression       Beschreibung
      Element                   .elementName...
XML-Processing
  //XML-Parser
  def xml = new XmlParser().parseText(SOME_XML_TEXT)

  //XML-Slurper
  def xml = new XmlSlu...
Thorsten Kamann ● thorsten.kamann@itemis.de   67
Groovy Builder

      – Groovy bietet Unterstützung für die Arbeit mit
        Baumartige Strukturen:
            • XML, H...
Groovy Builder

      – eine einheitliche Schnittstelle
            • Elemente sind Closures
            • Attribute sind ...
Groovy Builder

  builder = new                               <person>
         MarkupBuilder(writer)                  <na...
Groovy Builder

  def writer = new FileWriter(“markup.html“)
  def html = new groovy.xml.MarkupBuilder(writer)
  html.html...
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(di...
Groovy Builder

  def swing = new groovy.swing.SwingBuilder()
  def frame = swing.frame(title:'Password'){
      passwordF...
Groovy Builder




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

      bb = new grails.spring.BeanBuilder()
      bb.beans{
         CustomerService(org.x.y.z.CustomerServ...
Thorsten Kamann ● thorsten.kamann@itemis.de   77
Testing
                                              Groovy Testing

                                                    ...
Testing

      – jUnit ist in der Groovy-Runtime verankert
      – Zusätzliche Assert-Statements
      – Leicht integrierb...
Testing

      assertArrayEquals(Object[] expected, Object[] value)
      assertLength(int length, char[] array)
      ass...
Testing

      import groovy.mock.interceptor.MockFor

      def mocker = new MockFor(Collaborator.class)
      mocker.dem...
Testing

      – Resourcen (*.xml, Spring) können zur Laufzeit
        erzeugt werden
      – Zugriffe auf private Java-Re...
Thorsten Kamann ● thorsten.kamann@itemis.de   83
Grails

      – MVC-Framework
            • Basierend auf Spring-MVC und Hibernate
      – JSP oder GSP
      – Einfache A...
Grails

      – Domänenklassen (mit GORM)
      – Controller
      – Services
      – Jobs
      – CRUD-Anwendung in No-Ti...
Thorsten Kamann ● thorsten.kamann@itemis.de   86
Groovy Module

      class Client{
        String name         Einfache Properties
        String email
        Address ad...
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...
IDE-Support
        Instance variable                     Method completion as
           completion                      ...
IDE-Support
          Typed local variable                Duck-Typing




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

                                              Groovy in Action
                                     ...
Links und Ressourcen
• Groovy Webseite
     http://groovy.codehaus.org/

• Groovy Series Podcast
     http://groovy.codeha...
Thorsten Kamann ● thorsten.kamann@itemis.de   96
Upcoming SlideShare
Loading in...5
×

Let’s groove with Groovy

2,206

Published on

Java 6 bietet Scripting-Support out-of-the-Box. Mit Groovy existiert eine Scriptsprache, die sich eng an Java anlehnt und reichlich Gebrauch der Java-Infrastruktur macht. Grund genug Groovy einmal genauer unter die Lupe zu nehmen.
Thorsten Kamann wird in seinem Vortrag die Grundkonzepte vorstellen. Anhand von einfachen Beispielen zeigt er die Mächtigkeit und Eleganz dieser Scriptsprache auf. Im 2. Teil des Vortrags geht er auf erweiterte Konzepte und Komponenten von Groovy ein.
Themen werden u.a. sein:

* Installation
* Syntax - Schleifen
* Bedingungen
* Closures
* GStrings
* Regex
* GroovyBeans
* GroovyBuilder
o XML
o HTML
o ANT
o Swing
o SWT
* Unit-Tests (jUnit, Stubs, Mocks, Code-Coverage,…)
* Weitere Groovy-Komponenten
* Grails

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

No Downloads
Views
Total Views
2,206
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
57
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Let’s groove with Groovy

  1. 1. Thorsten Kamann ● thorsten.kamann@itemis.de 1
  2. 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. 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. 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. 5. Thorsten Kamann ● thorsten.kamann@itemis.de 5
  6. 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
  7. 7. Getting started • • • • • Thorsten Kamann ● thorsten.kamann@itemis.de 7
  8. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 18. Thorsten Kamann ● thorsten.kamann@itemis.de 18
  19. 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. 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. 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. 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. 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. 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. 25. Die Syntax: Datentypen – Whole word Matcher – Find Matcher – Count – Foreach – Replace – Split Thorsten Kamann ● thorsten.kamann@itemis.de 25
  26. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 38. Die Syntax: Closures public void each(Closure closure){ for (it: listItems){ closure(it).call(); } } Thorsten Kamann ● thorsten.kamann@itemis.de 38
  39. 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. 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. 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. 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. 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. 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. 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. 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. 47. Die Syntax: Return/Break/Continue Boolean someMethod(){ if (false){ return false } return true } Thorsten Kamann ● thorsten.kamann@itemis.de 47
  48. 48. Die Syntax: Return/Break/Continue while (true){ if (someCondition){ break } } Thorsten Kamann ● thorsten.kamann@itemis.de 48
  49. 49. Die Syntax: Return/Break/Continue for(item in items){ if (someCondition){ continue } } Thorsten Kamann ● thorsten.kamann@itemis.de 49
  50. 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. 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. 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. 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. 54. Thorsten Kamann ● thorsten.kamann@itemis.de 54
  55. 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. 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. 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. 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. 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. 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. 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. 62. Thorsten Kamann ● thorsten.kamann@itemis.de 62
  63. 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. 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. 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. 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. 67. Thorsten Kamann ● thorsten.kamann@itemis.de 67
  68. 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. 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. 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. 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. 72. Groovy Builder Thorsten Kamann ● thorsten.kamann@itemis.de 72
  73. 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. 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. 75. Groovy Builder Thorsten Kamann ● thorsten.kamann@itemis.de 75
  76. 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. 77. Thorsten Kamann ● thorsten.kamann@itemis.de 77
  78. 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. 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. 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. 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. 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. 83. Thorsten Kamann ● thorsten.kamann@itemis.de 83
  84. 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. 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. 86. Thorsten Kamann ● thorsten.kamann@itemis.de 86
  87. 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. 88. Groovy Module Thorsten Kamann ● thorsten.kamann@itemis.de 88
  89. 89. Thorsten Kamann ● thorsten.kamann@itemis.de 89
  90. 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. 91. IDE-Support Instance variable Method completion as completion Groovy Properties Complex completion Thorsten Kamann ● thorsten.kamann@itemis.de 91
  92. 92. IDE-Support Typed local variable Duck-Typing Thorsten Kamann ● thorsten.kamann@itemis.de 92
  93. 93. Thorsten Kamann ● thorsten.kamann@itemis.de 93
  94. 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. 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. 96. Thorsten Kamann ● thorsten.kamann@itemis.de 96
  1. A particular slide catching your eye?

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

×