250
Copyright 2006 Thorsten Kamann von und mit Thorsten Kamann

Groovy - Rocks or Not?

Embed Size (px)

DESCRIPTION

In dem in Kürze zu erwartenden Java 6 ist der Support für dynamische Scriptsprachen enthalten. Mit Groovy ist eine Scriptsprache entwickelt worden, die die Vorteile einer Scriptsprache und einer mächtigen Sprache wie Java verbindet. In diesem Vortrag stelle ich Grovvy und die verschiedenen Subprojekte vor und diskutiere die möglichen Anwendungsfälle. Dieser Vortrag findet im Rahmen des Dortmunder Kreises statt.

Citation preview

Page 1: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

von und mit Thorsten Kamann

Page 2: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

EinleitungEinleitungGetting StartedGetting StartedEmbeddingEmbeddingDie SyntaxDie SyntaxGroovy Highlights Groovy Highlights

XML-Processing, Markup, GPath, Groovy Beans, RegEX...XML-Processing, Markup, GPath, Groovy Beans, RegEX...ModuleModule

Grails, Gorm, Scriptom...Grails, Gorm, Scriptom...TestingTestingIDE-SupportIDE-SupportZusammenfassung/LinksZusammenfassung/Links

Page 3: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Einle itung

Page 4: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Scripting?Was ist Scripting?

Skriptsprachen sind Programmiersprachen, die vor allem für Skriptsprachen sind Programmiersprachen, die vor allem für kleine, überschaubare Programmieraufgaben gedacht sindkleine, überschaubare Programmieraufgaben gedacht sind

Page 5: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Scripting?Was ist Scripting?

Skriptsprachen sind Programmiersprachen, die vor allem für Skriptsprachen sind Programmiersprachen, die vor allem für kleine, überschaubare Programmieraufgaben gedacht sindkleine, überschaubare Programmieraufgaben gedacht sind

Kein Deklarationszwang für VariablenKein Deklarationszwang für Variablen

Page 6: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Scripting?Was ist Scripting?

Skriptsprachen sind Programmiersprachen, die vor allem für Skriptsprachen sind Programmiersprachen, die vor allem für kleine, überschaubare Programmieraufgaben gedacht sindkleine, überschaubare Programmieraufgaben gedacht sind

Kein Deklarationszwang für VariablenKein Deklarationszwang für Variablenautomatische Speicherverwaltungautomatische Speicherverwaltung

Page 7: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Scripting?Was ist Scripting?

Skriptsprachen sind Programmiersprachen, die vor allem für Skriptsprachen sind Programmiersprachen, die vor allem für kleine, überschaubare Programmieraufgaben gedacht sindkleine, überschaubare Programmieraufgaben gedacht sind

Kein Deklarationszwang für VariablenKein Deklarationszwang für Variablenautomatische Speicherverwaltungautomatische Speicherverwaltungwerden in der Regel ohne getrennte Übersetzungsphase werden in der Regel ohne getrennte Übersetzungsphase

ausgeführt (d. h. sie werden „interpretiert“)ausgeführt (d. h. sie werden „interpretiert“)

Page 8: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Groovy?Was ist Groovy?

Eine dynamische SpracheEine dynamische Sprache

Page 9: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Groovy?Was ist Groovy?

Eine dynamische SpracheEine dynamische SpracheInspiriert von Ruby, Python, SmalltalkInspiriert von Ruby, Python, Smalltalk

Page 10: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Groovy?Was ist Groovy?

Eine dynamische SpracheEine dynamische SpracheInspiriert von Ruby, Python, SmalltalkInspiriert von Ruby, Python, SmalltalkEntwickelt für die Java-PlattformEntwickelt für die Java-Plattform

Page 11: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Groovy?Was ist Groovy?

Eine dynamische SpracheEine dynamische SpracheInspiriert von Ruby, Python, SmalltalkInspiriert von Ruby, Python, SmalltalkEntwickelt für die Java-PlattformEntwickelt für die Java-Plattform

Um sie Java-Entwicklern zugänglich zu machenUm sie Java-Entwicklern zugänglich zu machen

Page 12: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Groovy?Was ist Groovy?

Eine dynamische SpracheEine dynamische SpracheInspiriert von Ruby, Python, SmalltalkInspiriert von Ruby, Python, SmalltalkEntwickelt für die Java-PlattformEntwickelt für die Java-Plattform

Um sie Java-Entwicklern zugänglich zu machenUm sie Java-Entwicklern zugänglich zu machenUm möglichst viel der Java-Syntax wieder verwenden zu Um möglichst viel der Java-Syntax wieder verwenden zu

könnenkönnen

Page 13: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Groovy?Was ist Groovy?

Eine dynamische SpracheEine dynamische SpracheInspiriert von Ruby, Python, SmalltalkInspiriert von Ruby, Python, SmalltalkEntwickelt für die Java-PlattformEntwickelt für die Java-Plattform

Um sie Java-Entwicklern zugänglich zu machenUm sie Java-Entwicklern zugänglich zu machenUm möglichst viel der Java-Syntax wieder verwenden zu Um möglichst viel der Java-Syntax wieder verwenden zu

könnenkönnenUm eine einfache Anbindung zu Enterprise-Systemen Um eine einfache Anbindung zu Enterprise-Systemen

anzubietenanzubieten

Page 14: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Was ist Groovy?Was ist Groovy?

Eine dynamische SpracheEine dynamische SpracheInspiriert von Ruby, Python, SmalltalkInspiriert von Ruby, Python, SmalltalkEntwickelt für die Java-PlattformEntwickelt für die Java-Plattform

Um sie Java-Entwicklern zugänglich zu machenUm sie Java-Entwicklern zugänglich zu machenUm möglichst viel der Java-Syntax wieder verwenden zu Um möglichst viel der Java-Syntax wieder verwenden zu

könnenkönnenUm eine einfache Anbindung zu Enterprise-Systemen Um eine einfache Anbindung zu Enterprise-Systemen

anzubietenanzubietenDas Ergebnis des JSR 241: Das Ergebnis des JSR 241: The Groovy Programming Language

Page 15: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GettingS ta rted

Page 16: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Getting StartedGetting Started

Download des aktuellen Release von Download des aktuellen Release von http://groovy.codehaus.orghttp://groovy.codehaus.org

Page 17: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Getting StartedGetting Started

Download des aktuellen Release von Download des aktuellen Release von http://groovy.codehaus.orghttp://groovy.codehaus.org

Entpacken des ArchivsEntpacken des Archivs

Page 18: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Getting StartedGetting Started

Download des aktuellen Release von Download des aktuellen Release von http://groovy.codehaus.orghttp://groovy.codehaus.org

Entpacken des ArchivsEntpacken des ArchivsSetzen der Umgebungsvariable Setzen der Umgebungsvariable GROOVY_HOME

Page 19: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Getting StartedGetting Started

Download des aktuellen Release von Download des aktuellen Release von http://groovy.codehaus.orghttp://groovy.codehaus.org

Entpacken des ArchivsEntpacken des ArchivsSetzen der Umgebungsvariable Setzen der Umgebungsvariable GROOVY_HOMEHinzufügen von Hinzufügen von %GROOVY_HOME%\bin zur zur PATH-Variable-Variable

Page 20: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Getting StartedGetting Started

Download des aktuellen Release von Download des aktuellen Release von http://groovy.codehaus.orghttp://groovy.codehaus.org

Entpacken des ArchivsEntpacken des ArchivsSetzen der Umgebungsvariable Setzen der Umgebungsvariable GROOVY_HOMEHinzufügen von Hinzufügen von %GROOVY_HOME%\bin zur zur PATH-Variable-VariableStarten von Starten von groovyConsole und Eingabe von und Eingabe von

println „Hallo Welt“ mit anschliessendem mit anschliessendem STRG-R

Page 21: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Getting StartedGetting Started

Page 22: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding

Page 23: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

EmbeddingEmbedding

Groovy kann auf 4 verschiedene Arten in Java-Anwendungen Groovy kann auf 4 verschiedene Arten in Java-Anwendungen eingebunden werdeneingebunden werden

Page 24: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

EmbeddingEmbedding

Groovy kann auf 4 verschiedene Arten in Java-Anwendungen Groovy kann auf 4 verschiedene Arten in Java-Anwendungen eingebunden werdeneingebunden werden

Page 25: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

EmbeddingEmbedding

Groovy kann auf 4 verschiedene Arten in Java-Anwendungen Groovy kann auf 4 verschiedene Arten in Java-Anwendungen eingebunden werdeneingebunden werden

Page 26: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

EmbeddingEmbedding

Groovy kann auf 4 verschiedene Arten in Java-Anwendungen Groovy kann auf 4 verschiedene Arten in Java-Anwendungen eingebunden werdeneingebunden werden

Page 27: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

EmbeddingEmbedding

Groovy kann auf 4 verschiedene Arten in Java-Anwendungen Groovy kann auf 4 verschiedene Arten in Java-Anwendungen eingebunden werdeneingebunden werden

Page 28: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit dem BSFEmbedding mit dem BSF

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

Page 29: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit dem BSFEmbedding mit dem BSF

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

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

Page 30: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit GroovyShellEmbedding mit GroovyShell

GroovyShell bietet die Möglichkeit des Ein- und Auslesens GroovyShell bietet die Möglichkeit des Ein- und Auslesens von Variablen mittels des von Variablen mittels des Binding-Objekts-Objekts

Page 31: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit GroovyShellEmbedding mit GroovyShell

GroovyShell bietet die Möglichkeit des Ein- und Auslesens GroovyShell bietet die Möglichkeit des Ein- und Auslesens von Variablen mittels des von Variablen mittels des Binding-Objekts-Objekts

Binding binding = new Binding();binding.setVariable("foo", new Integer(2));GroovyShell shell = new GroovyShell(binding);Object value = shell.evaluate( "println 'Hello World!'; x = 123; return foo * 10");assert value.equals(new Integer(20));assert binding.getVariable("x").equals(new Integer(123));

Page 32: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit GroovyClassLoaderEmbedding mit GroovyClassLoader

Der GroovyClassLoader lädt Groovy-Klassen dynamisch und Der GroovyClassLoader lädt Groovy-Klassen dynamisch und ermöglicht den direkten Zugriff auf deren Methodenermöglicht den direkten Zugriff auf deren Methoden

Page 33: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit GroovyClassLoaderEmbedding mit GroovyClassLoader

Der GroovyClassLoader lädt Groovy-Klassen dynamisch und Der GroovyClassLoader lädt Groovy-Klassen dynamisch und ermöglicht den direkten Zugriff auf deren Methodenermöglicht den direkten Zugriff auf deren Methoden

ClassLoader parent = getClass().getClassLoader();GroovyClassLoader loader = new GroovyClassLoader(parent);Class groovyClass = loader.parseClass(

new File("script.groovy"));GroovyObject groovyObject =

(GroovyObject) groovyClass.newInstance();Object[] args = {};groovyObject.invokeMethod("run", args);

Page 34: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit GroovyClassLoaderEmbedding mit GroovyClassLoader

Der GroovyClassLoader lädt Groovy-Klassen dynamisch und Der GroovyClassLoader lädt Groovy-Klassen dynamisch und ermöglicht den direkten Zugriff auf deren Methodenermöglicht den direkten Zugriff auf deren Methoden

GroovyClassLoader gcl = new GroovyClassLoader();Class clazz = gcl.parseClass(

myStringwithGroovyClassSource, "SomeName.groovy");Object aScript = clazz.newInstance();MyInterface myObject = (MyInterface) aScript;myObject.interfaceMethod();

Page 35: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit GroovyScriptEngineEmbedding mit GroovyScriptEngine

Dies ist die leistungsfähige Möglichkeit um Groovy-Skripte Dies ist die leistungsfähige Möglichkeit um Groovy-Skripte auszuführen. Das Binding-Objekt befüllt dabei die Skripte auszuführen. Das Binding-Objekt befüllt dabei die Skripte mit Datenmit Daten

Page 36: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit GroovyScriptEngineEmbedding mit GroovyScriptEngine

Dies ist die leistungsfähige Möglichkeit um Groovy-Skripte Dies ist die leistungsfähige Möglichkeit um Groovy-Skripte auszuführen. Das Binding-Objekt befüllt dabei die Skripte auszuführen. Das Binding-Objekt befüllt dabei die Skripte mit Datenmit Daten

String[] roots = new String[] {"/my/groovy/script/path"};GroovyScriptEngine gse = new GroovyScriptEngine(roots);Binding binding = new Binding();binding.setVariable("input", "world");gse.run("hello.groovy", binding);System.out.println(binding.getVariable("output"));

Page 37: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit AntEmbedding mit Ant

ANT-Task, mit dem eine beliebige Anzahl von Groovy-ANT-Task, mit dem eine beliebige Anzahl von Groovy-Skripten ausgeführt werden könnenSkripten ausgeführt werden können

Page 38: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit AntEmbedding mit Ant

ANT-Task, mit dem eine beliebige Anzahl von Groovy-ANT-Task, mit dem eine beliebige Anzahl von Groovy-Skripten ausgeführt werden könnenSkripten ausgeführt werden können

GroovyC-Task, der Groovy-Skripte (Klassen) zu Java GroovyC-Task, der Groovy-Skripte (Klassen) zu Java Bytecode kompiliertBytecode kompiliert

Page 39: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit AntEmbedding mit Ant

ANT-Task, mit dem eine beliebige Anzahl von Groovy-ANT-Task, mit dem eine beliebige Anzahl von Groovy-Skripten ausgeführt werden könnenSkripten ausgeführt werden können

GroovyC-Task, der Groovy-Skripte (Klassen) zu Java GroovyC-Task, der Groovy-Skripte (Klassen) zu Java Bytecode kompiliertBytecode kompiliert

Erstellen von Ant-Tasks mit Groovy und dem Markup-BuilderErstellen von Ant-Tasks mit Groovy und dem Markup-Builder

Page 40: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit AntEmbedding mit Ant

ANT-Task, mit dem eine beliebige Anzahl von Groovy-ANT-Task, mit dem eine beliebige Anzahl von Groovy-Skripten ausgeführt werden könnenSkripten ausgeführt werden können

GroovyC-Task, der Groovy-Skripte (Klassen) zu Java GroovyC-Task, der Groovy-Skripte (Klassen) zu Java Bytecode kompiliertBytecode kompiliert

Erstellen von Ant-Tasks mit Groovy und dem Markup-BuilderErstellen von Ant-Tasks mit Groovy und dem Markup-BuilderErzeugen von Ant-SkriptenErzeugen von Ant-Skripten

Page 41: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit Maven 2Embedding mit Maven 2

Maven 2 wird offiziell mittels des Maven2-Ant-Plugins Maven 2 wird offiziell mittels des Maven2-Ant-Plugins unterstütztunterstützt

Page 42: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit Maven 2Embedding mit Maven 2

Maven 2 wird offiziell mittels des Maven2-Ant-Plugins Maven 2 wird offiziell mittels des Maven2-Ant-Plugins unterstütztunterstützt

Es existiert aber ein Groovy-Maven-Plugin, mit dem Es existiert aber ein Groovy-Maven-Plugin, mit dem beliebige Groovy-Skripte ausgeführt werden könnenbeliebige Groovy-Skripte ausgeführt werden können

Page 43: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit Maven 2Embedding mit Maven 2

Maven 2 wird offiziell mittels des Maven2-Ant-Plugins Maven 2 wird offiziell mittels des Maven2-Ant-Plugins unterstütztunterstützt

Es existiert aber ein Groovy-Maven-Plugin, mit dem Es existiert aber ein Groovy-Maven-Plugin, mit dem beliebige Groovy-Skripte ausgeführt werden könnenbeliebige Groovy-Skripte ausgeführt werden können

In der Sandbox von In der Sandbox von http://mojo.codehaus.org/ existieren bereits Maven-Tools für direkte Unterstützung existieren bereits Maven-Tools für direkte Unterstützung von Groovyvon Groovy

Page 44: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit Maven 2Embedding mit Maven 2

Maven 2 wird offiziell mittels des Maven2-Ant-Plugins Maven 2 wird offiziell mittels des Maven2-Ant-Plugins unterstütztunterstützt

Es existiert aber ein Groovy-Maven-Plugin, mit dem Es existiert aber ein Groovy-Maven-Plugin, mit dem beliebige Groovy-Skripte ausgeführt werden könnenbeliebige Groovy-Skripte ausgeführt werden können

In der Sandbox von In der Sandbox von http://mojo.codehaus.org/ existieren bereits Maven-Tools für direkte Unterstützung existieren bereits Maven-Tools für direkte Unterstützung von Groovyvon GroovyGroovy-CompilerGroovy-Compiler

Page 45: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit Maven 2Embedding mit Maven 2

Maven 2 wird offiziell mittels des Maven2-Ant-Plugins Maven 2 wird offiziell mittels des Maven2-Ant-Plugins unterstütztunterstützt

Es existiert aber ein Groovy-Maven-Plugin, mit dem Es existiert aber ein Groovy-Maven-Plugin, mit dem beliebige Groovy-Skripte ausgeführt werden könnenbeliebige Groovy-Skripte ausgeführt werden können

In der Sandbox von In der Sandbox von http://mojo.codehaus.org/ existieren bereits Maven-Tools für direkte Unterstützung existieren bereits Maven-Tools für direkte Unterstützung von Groovyvon GroovyGroovy-CompilerGroovy-CompilerGroovy-ArchetypeGroovy-Archetype

Page 46: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding mit Maven 2Embedding mit Maven 2

Maven 2 wird offiziell mittels des Maven2-Ant-Plugins Maven 2 wird offiziell mittels des Maven2-Ant-Plugins unterstütztunterstützt

Es existiert aber ein Groovy-Maven-Plugin, mit dem Es existiert aber ein Groovy-Maven-Plugin, mit dem beliebige Groovy-Skripte ausgeführt werden könnenbeliebige Groovy-Skripte ausgeführt werden können

In der Sandbox von In der Sandbox von http://mojo.codehaus.org/ existieren bereits Maven-Tools für direkte Unterstützung existieren bereits Maven-Tools für direkte Unterstützung von Groovyvon GroovyGroovy-CompilerGroovy-CompilerGroovy-ArchetypeGroovy-ArchetypeTools, um Maven-Plugins mit Groovy zu entwickelnTools, um Maven-Plugins mit Groovy zu entwickeln

Page 47: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding in WindowsEmbedding in Windows

Groovy kann direkt von der Eingabeaufforderung oder über Groovy kann direkt von der Eingabeaufforderung oder über Start-->Ausführen mittels mittels

groovy script.groovy [arguments]ausgeführt werdenausgeführt werden

Page 48: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding in WindowsEmbedding in Windows

Groovy kann direkt von der Eingabeaufforderung oder über Groovy kann direkt von der Eingabeaufforderung oder über Start-->Ausführen mittels mittels

groovy script.groovy [arguments]ausgeführt werdenausgeführt werden

Alternativ kann über den Dialog Alternativ kann über den Dialog Ordneroptionen-->Dateitypen die Extension die Extension *.groovy an an groovy.bat gebunden werden. gebunden werden.

Page 49: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding in LinuxEmbedding in Linux

Groovy kann direkt von der Konsole mittelsGroovy kann direkt von der Konsole mittelsgroovy script.groovy [arguments]

ausgeführt werdenausgeführt werden

Page 50: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Embedding in LinuxEmbedding in Linux

Groovy kann direkt von der Konsole mittelsGroovy kann direkt von der Konsole mittelsgroovy script.groovy [arguments]

ausgeführt werdenausgeführt werdenAlternativ kann in die 1. Zeile eines Groovy-Skripts Alternativ kann in die 1. Zeile eines Groovy-Skripts

#!/usr/bin/env groovyeingefügt werden. So kann miteingefügt werden. So kann mit

chmod +x script.groovy./script.groovy

das Skript ausgeführt werdendas Skript ausgeführt werden

Page 51: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

DieSyntax

Page 52: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: ClosuresDie Syntax: Closures

Closures Closures sind anonyme Codeblöckesind anonyme Codeblöcke

Page 53: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: ClosuresDie Syntax: Closures

Closures Closures sind anonyme Codeblöckesind anonyme Codeblöckegeben einen Wert zurückgeben einen Wert zurück

Page 54: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: ClosuresDie Syntax: Closures

Closures Closures sind anonyme Codeblöckesind anonyme Codeblöckegeben einen Wert zurückgeben einen Wert zurückreferenzieren und verwenden Variablen referenzieren und verwenden Variablen

Page 55: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: ClosuresDie Syntax: Closures

Closures Closures sind anonyme Codeblöckesind anonyme Codeblöckegeben einen Wert zurückgeben einen Wert zurückreferenzieren und verwenden Variablen referenzieren und verwenden Variablen werden oft wie Anonyme Inner Classes in Java benutztwerden oft wie Anonyme Inner Classes in Java benutzt

Page 56: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: ClosuresDie Syntax: Closures

Closures Closures sind anonyme Codeblöckesind anonyme Codeblöckegeben einen Wert zurückgeben einen Wert zurückreferenzieren und verwenden Variablen referenzieren und verwenden Variablen werden oft wie Anonyme Inner Classes in Java benutztwerden oft wie Anonyme Inner Classes in Java benutztwerden erst ausgeführt, wenn call() auf der Closure werden erst ausgeführt, wenn call() auf der Closure

aufgerufen wirdaufgerufen wird

Page 57: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: ClosuresDie Syntax: Closures

Closures Closures sind anonyme Codeblöckesind anonyme Codeblöckegeben einen Wert zurückgeben einen Wert zurückreferenzieren und verwenden Variablen referenzieren und verwenden Variablen werden oft wie Anonyme Inner Classes in Java benutztwerden oft wie Anonyme Inner Classes in Java benutztwerden erst ausgeführt, wenn call() auf der Closure werden erst ausgeführt, wenn call() auf der Closure

aufgerufen wirdaufgerufen wirdkönnen an eine Variable gebunden werdenkönnen an eine Variable gebunden werden

Page 58: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Closures (Beispiele)Die Syntax: Closures (Beispiele)

Beispiele:Beispiele:

{ item++ }

Page 59: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Closures (Beispiele)Die Syntax: Closures (Beispiele)

Beispiele:Beispiele:

{ name -> println name }

Page 60: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Closures (Beispiele)Die Syntax: Closures (Beispiele)

Beispiele:Beispiele:

{String x, int y -> println "hey $x the value is $y"}

Page 61: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Closures (Beispiele)Die Syntax: Closures (Beispiele)

Beispiele:Beispiele:

{ reader ->while (true) {

line = reader.readLine() }}

Page 62: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax – Collections (Listen)Die Syntax – Collections (Listen)

Listen erzeugen immer eine Instanz von java.util.ListListen erzeugen immer eine Instanz von java.util.List

Page 63: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax – Collections (Listen)Die Syntax – Collections (Listen)

Listen erzeugen immer eine Instanz von java.util.ListListen erzeugen immer eine Instanz von java.util.List

def list = [5, 6, 7, 8]assert list.get(2) == 7assert list instanceof java.util.List

Page 64: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax – Collections (Listen)Die Syntax – Collections (Listen)

Listen erzeugen immer eine Instanz von java.util.ListListen erzeugen immer eine Instanz von java.util.List

def emptyList = []assert emptyList.size() == 0emptyList.add(5)assert emptyList.size() == 1

Page 65: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax – Collections (Ranges)Die Syntax – Collections (Ranges)

Ranges erzeugen Listen mit sequentiellen WertenRanges erzeugen Listen mit sequentiellen Werten

Page 66: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax – Collections (Ranges)Die Syntax – Collections (Ranges)

Ranges erzeugen Listen mit sequentiellen WertenRanges erzeugen Listen mit sequentiellen WertenEs gibt inklusive und exklusive RangesEs gibt inklusive und exklusive Ranges

Page 67: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax – Collections (Ranges)Die Syntax – Collections (Ranges)

Ranges erzeugen Listen mit sequentiellen WertenRanges erzeugen Listen mit sequentiellen WertenEs gibt inklusive und exklusive RangesEs gibt inklusive und exklusive Ranges

def range = 5..8assert range.contains(6)assert range.contains(8)

Page 68: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax – Collections (Ranges)Die Syntax – Collections (Ranges)

Ranges erzeugen Listen mit sequentiellen WertenRanges erzeugen Listen mit sequentiellen WertenEs gibt inklusive und exklusive RangesEs gibt inklusive und exklusive Ranges

def range = 5..<8assert range.contains(6)assert !range.contains(8)

Page 69: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (Maps)Die Syntax: Collections (Maps)

Maps basieren auf einer Implementierung von java.util.MapMaps basieren auf einer Implementierung von java.util.Map

Page 70: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (Maps)Die Syntax: Collections (Maps)

Maps basieren auf einer Implementierung von java.util.MapMaps basieren auf einer Implementierung von java.util.Map

def map = [name:"Gromit", likes:"cheese", id:1234]assert map.get("name") == "Gromit"assert map["name"] == "Gromit"

Page 71: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (Maps)Die Syntax: Collections (Maps)

Maps basieren auf einer Implementierung von java.util.MapMaps basieren auf einer Implementierung von java.util.Map

def emptyMap = [:]emptyMap.foo = 5assert emptyMap.foo == 5

Page 72: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (Expando)Die Syntax: Collections (Expando)

Expandos ermöglichen die Erzeugung von dynamischen Expandos ermöglichen die Erzeugung von dynamischen ObjektenObjekten

Page 73: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (Expando)Die Syntax: Collections (Expando)

Expandos ermöglichen die Erzeugung von dynamischen Expandos ermöglichen die Erzeugung von dynamischen ObjektenObjekten

def player = new Expando()player.name = "Peter"player.greeting = { "Hello, my name is $player.name" }assert player.greeting() == "Hello, my name is Peter"

Page 74: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (each)Die Syntax: Collections (each)

Iterator mittels einer ClosureIterator mittels einer Closure

Page 75: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (each)Die Syntax: Collections (each)

Iterator mittels einer ClosureIterator mittels einer Closure

[1, 2, 3].each { item -> print "${item}-" }

Page 76: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (collect)Die Syntax: Collections (collect)

Erzeugt eine neue Liste mit dem Ergebnis der ClosureErzeugt eine neue Liste mit dem Ergebnis der Closure

Page 77: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (collect)Die Syntax: Collections (collect)

Erzeugt eine neue Liste mit dem Ergebnis der ClosureErzeugt eine neue Liste mit dem Ergebnis der Closure

def value = [1, 2, 3].collect { it * 2 }assert value == [2, 4, 6]

Page 78: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (find)Die Syntax: Collections (find)

Gibt das erste Element einer Collection zurück, welches der Gibt das erste Element einer Collection zurück, welches der Expression in der Closure entsprichtExpression in der Closure entspricht

Page 79: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (find)Die Syntax: Collections (find)

Gibt das erste Element einer Collection zurück, welches der Gibt das erste Element einer Collection zurück, welches der Expression in der Closure entsprichtExpression in der Closure entspricht

def value = [1, 2, 3].find { it > 1 }assert value == 2

Page 80: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (findAll)Die Syntax: Collections (findAll)

Gibt eine Collection mit allen Elementen, die denen der Gibt eine Collection mit allen Elementen, die denen der Expression in der Closure entsprechen, zurückExpression in der Closure entsprechen, zurück

Page 81: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (findAll)Die Syntax: Collections (findAll)

Gibt eine Collection mit allen Elementen, die denen der Gibt eine Collection mit allen Elementen, die denen der Expression in der Closure entsprechen, zurückExpression in der Closure entsprechen, zurück

def value = [1, 2, 3].findAll { it > 1 }assert value == [2, 3]

Page 82: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (inject)Die Syntax: Collections (inject)

Fügt einen zusätzlichen Wert zu einer Iteration hinzuFügt einen zusätzlichen Wert zu einer Iteration hinzu

Page 83: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (inject)Die Syntax: Collections (inject)

Fügt einen zusätzlichen Wert zu einer Iteration hinzuFügt einen zusätzlichen Wert zu einer Iteration hinzu

def value = ["Java", "C#", "C++", "VB"].inject("Languages: "){str, item -> str+" "+item}

assert value == „Languages: Java C# C++ VB“

Page 84: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (every)Die Syntax: Collections (every)

Gibt Gibt true zurück, wenn alle Werte in der Collection der zurück, wenn alle Werte in der Collection der Expression in der Closure entsprechenExpression in der Closure entsprechen

Page 85: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (every)Die Syntax: Collections (every)

Gibt Gibt true zurück, wenn alle Werte in der Collection der zurück, wenn alle Werte in der Collection der Expression in der Closure entsprechenExpression in der Closure entsprechen

def value = [1, 2, 3].every { it < 5 }assert value

Page 86: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (every)Die Syntax: Collections (every)

Gibt Gibt true zurück, wenn alle Werte in der Collection der zurück, wenn alle Werte in der Collection der Expression in der Closure entsprechenExpression in der Closure entsprechen

def value = [1, 2, 3].every { item -> item < 3 }assert !value

Page 87: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (any)Die Syntax: Collections (any)

Gibt Gibt true zurück, wenn mindestens ein Wert in der zurück, wenn mindestens ein Wert in der Collection der Expression in der Closure entsprichtCollection der Expression in der Closure entspricht

Page 88: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (any)Die Syntax: Collections (any)

Gibt Gibt true zurück, wenn mindestens ein Wert in der zurück, wenn mindestens ein Wert in der Collection der Expression in der Closure entsprichtCollection der Expression in der Closure entspricht

def value = [1, 2, 3].any { item -> item > 3 }assert value == false

Page 89: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (any)Die Syntax: Collections (any)

Gibt Gibt true zurück, wenn mindestens ein Wert in der zurück, wenn mindestens ein Wert in der Collection der Expression in der Closure entsprichtCollection der Expression in der Closure entspricht

def value = [1, 2, 3].any { it > 2 }assert value

Page 90: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (max/min)Die Syntax: Collections (max/min)

Gibt den maximalen Wert einer Collection zurück. Die Gibt den maximalen Wert einer Collection zurück. Die Objekte in dieser Collection müssen Objekte in dieser Collection müssen Comparable sein sein

Page 91: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (max/min)Die Syntax: Collections (max/min)

Gibt den maximalen Wert einer Collection zurück. Die Gibt den maximalen Wert einer Collection zurück. Die Objekte in dieser Collection müssen Objekte in dieser Collection müssen Comparable sein sein

def value = [9, 4, 2, 10, 5].max()assert value == 10

Page 92: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (max/min)Die Syntax: Collections (max/min)

Gibt den maximalen Wert einer Collection zurück. Die Gibt den maximalen Wert einer Collection zurück. Die Objekte in dieser Collection müssen Objekte in dieser Collection müssen Comparable sein sein

def value = [9, 4, 2, 10, 5].min()assert value == 2

Page 93: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (max/min)Die Syntax: Collections (max/min)

Gibt den maximalen Wert einer Collection zurück. Die Gibt den maximalen Wert einer Collection zurück. Die Objekte in dieser Collection müssen Objekte in dieser Collection müssen Comparable sein sein

def value = ['x', 'y', 'a', 'z'].min()assert value == 'a'

Page 94: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (join)Die Syntax: Collections (join)

Fügt einen Fügt einen String zu den Werten einer Collection hinzu zu den Werten einer Collection hinzu

Page 95: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (join)Die Syntax: Collections (join)

Fügt einen Fügt einen String zu den Werten einer Collection hinzu zu den Werten einer Collection hinzu

def value = [1, 2, 3].join('-')assert value == '1-2-3'

Page 96: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (Beispiele)Die Syntax: Collections (Beispiele)

Ranges verwenden, um Teile von Listen zu extrahierenRanges verwenden, um Teile von Listen zu extrahieren

def list = 100..200def sub = list[1, 3, 20..25, 33]assert sub == [101, 103, 120, 121, 122, 123, 124, 125, 133]

Page 97: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (Beispiele)Die Syntax: Collections (Beispiele)

Rückwärts gerichtete RangesRückwärts gerichtete Ranges

def text = "nice cheese gromit!"def name = text[3..1]assert name == "eci"

Page 98: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (Beispiele)Die Syntax: Collections (Beispiele)

Negative Ranges – Index beginnt beim letzten ZeichenNegative Ranges – Index beginnt beim letzten Zeichen

def text = "nice cheese gromit!"def x = text[-1]assert x == "!"

Page 99: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Collections (Beispiele)Die Syntax: Collections (Beispiele)

Negative Ranges – Index beginnt beim letzten ZeichenNegative Ranges – Index beginnt beim letzten Zeichen

def text = "nice cheese gromit!"def name = text[-7..-2]assert name == "gromit"

Page 100: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (while)Die Syntax: Looping (while)

Groovy unterstützt das aus Java bekannte while{..} Groovy unterstützt das aus Java bekannte while{..} KonstruktKonstrukt

Page 101: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (while)Die Syntax: Looping (while)

Groovy unterstützt das aus Java bekannte while{..} Groovy unterstützt das aus Java bekannte while{..} KonstruktKonstrukt

def x = 0def y = 5while ( y-- > 0 ) { x++}assert x == 5

Page 102: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (for)Die Syntax: Looping (for)

Die for-Schleife ist einfacher und arbeitet mit Arrays und Die for-Schleife ist einfacher und arbeitet mit Arrays und Collections Collections

Page 103: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (for)Die Syntax: Looping (for)

Die for-Schleife ist einfacher und arbeitet mit Arrays und Die for-Schleife ist einfacher und arbeitet mit Arrays und Collections Collections

def x = 0for ( i in 0..9 ) { x += i}assert x == 45

Page 104: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (for)Die Syntax: Looping (for)

Die for-Schleife ist einfacher und arbeitet mit Arrays und Die for-Schleife ist einfacher und arbeitet mit Arrays und Collections Collections

x = 0for ( i in [0, 1, 2, 3, 4] ) { x += i}assert x == 10

Page 105: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (each)Die Syntax: Looping (each)

each ist eine Closure. Dadurch ist eine sehr kompakte ist eine Closure. Dadurch ist eine sehr kompakte Abarbeitung von Schleifen möglichAbarbeitung von Schleifen möglich

Page 106: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (each)Die Syntax: Looping (each)

each ist eine Closure. Dadurch ist eine sehr kompakte ist eine Closure. Dadurch ist eine sehr kompakte Abarbeitung von Schleifen möglichAbarbeitung von Schleifen möglich

def stringList = ["java", "python", "ruby", "c#", "groovy"]stringList.each() { print " ${it}" }; // java python ruby c# groovy

Page 107: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (each)Die Syntax: Looping (each)

each ist eine Closure. Dadurch ist eine sehr kompakte ist eine Closure. Dadurch ist eine sehr kompakte Abarbeitung von Schleifen möglichAbarbeitung von Schleifen möglich

def stringMap = ["Su" : "Sunday", "Mo" : "Monday"]stringMap.each() { key, value ->

println "${key} == ${value}" };// Su == Sunday// Mo == Monday

Page 108: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (eachWithIndex)Die Syntax: Looping (eachWithIndex)

Unterscheidet sich vom Looping mit Unterscheidet sich vom Looping mit each dadurch, dass ein dadurch, dass ein Index mitgeführt wirdIndex mitgeführt wird

Page 109: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (eachWithIndex)Die Syntax: Looping (eachWithIndex)

Unterscheidet sich vom Looping mit Unterscheidet sich vom Looping mit each dadurch, dass ein dadurch, dass ein Index mitgeführt wirdIndex mitgeführt wird

def stringList = ["java", "python", "ruby", "c#", "groovy"]stringList.eachWithIndex() {

obj, i -> println " ${i}: ${obj}" }; // 0: java 1: python 2: ruby 3: c# 4: groovy

Page 110: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Looping (eachWithIndex)Die Syntax: Looping (eachWithIndex)

Unterscheidet sich vom Looping mit Unterscheidet sich vom Looping mit each dadurch, dass ein dadurch, dass ein Index mitgeführt wirdIndex mitgeführt wird

def stringMap = ["Su" : "Sunday", "Mo" : "Monday"]stringMap.eachWithIndex() {

obj, i -> println " ${i}: ${obj}" };// 0: Su=Sunday// 1: Mo=Monday

Page 111: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Conditions (if...else)Die Syntax: Conditions (if...else)

Groovy unterstützt die aus Java bekannten Groovy unterstützt die aus Java bekannten if...else KonstrukteKonstrukte

Page 112: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Conditions (if...else)Die Syntax: Conditions (if...else)

Groovy unterstützt die aus Java bekannten Groovy unterstützt die aus Java bekannten if...else KonstrukteKonstrukte

def x = (y > 1) ? "worked" : "failed"if (x){

...}else{

...}

Page 113: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Conditions (switch)Die Syntax: Conditions (switch)

Das Das switch-Statement unterstützt Klassenvergleiche, -Statement unterstützt Klassenvergleiche, Inhalte von Collections (Lists, Ranges), reguläre Ausdrücke Inhalte von Collections (Lists, Ranges), reguläre Ausdrücke und und equals Vergleiche Vergleiche

Page 114: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Die Syntax: Conditions (switch)Die Syntax: Conditions (switch)

Das Das switch-Statement unterstützt Klassenvergleiche, -Statement unterstützt Klassenvergleiche, Inhalte von Collections (Lists, Ranges), reguläre Ausdrücke Inhalte von Collections (Lists, Ranges), reguläre Ausdrücke und und equals Vergleiche Vergleiche

switch ( x ) {case („foo“): ...case (20..30): ...case (Integer): ...default: ...

}

Page 115: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XMLProc es s ing

Page 116: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

Groovy bietet reichhaltige Unterstützung für das XML-Groovy bietet reichhaltige Unterstützung für das XML-ProcessingProcessing

Page 117: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

Page 118: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

Page 119: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

Page 120: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

Page 121: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

Groovy bietet reichhaltige Unterstützung für das XML-Groovy bietet reichhaltige Unterstützung für das XML-ProcessingProcessing

Gpath (Xpath) Ausdrücke erlauben schnelle Navigation im Gpath (Xpath) Ausdrücke erlauben schnelle Navigation im XML-DokumentXML-Dokument

Page 122: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

Groovy bietet reichhaltige Unterstützung für das XML-Groovy bietet reichhaltige Unterstützung für das XML-ProcessingProcessing

Gpath (Xpath) Ausdrücke erlauben schnelle Navigation im Gpath (Xpath) Ausdrücke erlauben schnelle Navigation im XML-DokumentXML-Dokument

DOMCategory stellt mächtige Navigationselemente zur DOMCategory stellt mächtige Navigationselemente zur VerfügungVerfügung

Page 123: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-ProcessingDOM Klasse Methode Beschreibung

Element .'child' .getElementsByTagName('child') Element .child .getElementsByTagName('child') Element .'*' .getElementsByTagName('*') Element .'@attr' .getAttribute('attr') Element .text() .firstChild.nodeValue Element .name() .nodeName Element .parent() .parentNode Element .children() .childNodes NodeList .size() .length NodeList .list()NodeList [n] .item(n) NodeList .text() .collect{ it.text() } NodeList .child .getElementsByTagName('child')

Page 124: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XML-Processing mit XML-ParserXML-Processing mit XML-Parserdef records = new XmlParser().parseText(XmlExamples.CAR_RECORDS)

def allRecords = records.car.size()assert allRecords == 3

def allNodes = records.depthFirst().size()assert allNodes == 10

Page 125: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

XML-Processing mit DOMCategoryXML-Processing mit DOMCategorydef reader = new StringReader(XmlExamples.CAR_RECORDS)def doc = DOMBuilder.parse(reader)def records = doc.documentElement

use (DOMCategory) { assert 9 == records.'*'.size() def cars = records.'car' assert cars[0].parent() == records assert 3 == cars.size()}

Page 126: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyMarkup

Page 127: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyMarkupGroovyMarkup

Groovy bietet Unterstützung für die Arbeit mit Markup-Groovy bietet Unterstützung für die Arbeit mit Markup-Languages:Languages:XML, HTML, SAX, W3C DOM, Ant Tasks, Swing UI'sXML, HTML, SAX, W3C DOM, Ant Tasks, Swing UI's

Page 128: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyMarkupGroovyMarkup

Groovy bietet Unterstützung für die Arbeit mit Markup-Groovy bietet Unterstützung für die Arbeit mit Markup-Languages:Languages:XML, HTML, SAX, W3C DOM, Ant Tasks, Swing UI'sXML, HTML, SAX, W3C DOM, Ant Tasks, Swing UI's

Page 129: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyMarkupGroovyMarkup

Groovy bietet Unterstützung für die Arbeit mit Markup-Groovy bietet Unterstützung für die Arbeit mit Markup-Languages:Languages:XML, HTML, SAX, W3C DOM, Ant Tasks, Swing UI'sXML, HTML, SAX, W3C DOM, Ant Tasks, Swing UI's

GroovyMarkup bietet eine einheitliche SchnittstelleGroovyMarkup bietet eine einheitliche SchnittstelleElemente sind ClosuresElemente sind ClosuresAttribute sind MapsAttribute sind Maps

Page 130: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyMarkupGroovyMarkup

Groovy bietet Unterstützung für die Arbeit mit Markup-Groovy bietet Unterstützung für die Arbeit mit Markup-Languages:Languages:XML, HTML, SAX, W3C DOM, Ant Tasks, Swing UI'sXML, HTML, SAX, W3C DOM, Ant Tasks, Swing UI's

GroovyMarkup bietet eine einheitliche SchnittstelleGroovyMarkup bietet eine einheitliche SchnittstelleElemente sind ClosuresElemente sind ClosuresAttribute sind MapsAttribute sind Maps

Vollständige Integration anderer Groovy-FeaturesVollständige Integration anderer Groovy-FeaturesCollections, Arrays, Conditions, ...Collections, Arrays, Conditions, ...

Page 131: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyMarkup (Beispiel)GroovyMarkup (Beispiel)builder = new MarkupBuilder(writer) builder.person() {

name(first:"Megan", last:"Smith") {age("33")

}}

Page 132: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyMarkup (Beispiel)GroovyMarkup (Beispiel)builder = new MarkupBuilder(writer) builder.person() {

name(first:"Megan", last:"Smith") {age("33")

}}

<person><name first=“Megan“ last=“Smith“>

<age>33</age></name>

</person>

Page 133: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GPath

Page 134: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GPathGPath

Ist eine Expression-Language für Daten mit BaumstrukturenIst eine Expression-Language für Daten mit Baumstrukturen

Page 135: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GPathGPath

Ist eine Expression-Language für Daten mit BaumstrukturenIst eine Expression-Language für Daten mit Baumstrukturen

Page 136: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GPathGPath

Ist eine Expression-Language für Daten mit BaumstrukturenIst eine Expression-Language für Daten mit BaumstrukturenImplementierung für XMLImplementierung für XML

Page 137: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GPathGPath

Ist eine Expression-Language für Daten mit BaumstrukturenIst eine Expression-Language für Daten mit BaumstrukturenImplementierung für XMLImplementierung für XMLPfade zu einem Element können spezifiziert werdenPfade zu einem Element können spezifiziert werden

a.b.c findet alle findet alle <c>-Elemente innerhalb aller -Elemente innerhalb aller <b> innerhalb aller innerhalb aller <a>

Page 138: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GPathGPath

Ist eine Expression-Language für Daten mit BaumstrukturenIst eine Expression-Language für Daten mit BaumstrukturenImplementierung für XMLImplementierung für XMLPfade zu einem Element können spezifiziert werdenPfade zu einem Element können spezifiziert werden

a.b.c findet alle findet alle <c>-Elemente innerhalb aller -Elemente innerhalb aller <b> innerhalb aller innerhalb aller <a>

Auch Attribute können spezifiziert werdenAuch Attribute können spezifiziert werdena["@href"] -> findet alle href-Attribute in -> findet alle href-Attribute in <a>--

ElementenElementena.@href -> eine Alternativ-Syntax dazu -> eine Alternativ-Syntax dazu

Page 139: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyBeans

Page 140: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyBeansGroovyBeans

GroovyBeans sind wie JavaBeans, nur einfacher zu GroovyBeans sind wie JavaBeans, nur einfacher zu definierendefinieren

Page 141: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyBeansGroovyBeans

GroovyBeans sind wie JavaBeans, nur einfacher zu GroovyBeans sind wie JavaBeans, nur einfacher zu definierendefinieren

Customer.groovy:class Customer { int id String name}

Page 142: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyBeansGroovyBeans

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

this.id = id; } ...}

Customer.groovy:class Customer { int id String name}

GroovyBeans sind wie JavaBeans, nur einfacher zu GroovyBeans sind wie JavaBeans, nur einfacher zu definierendefinieren

Page 143: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyBeansGroovyBeans

Regeln für Properties:Regeln für Properties:Wenn eine Property als Wenn eine Property als private gekennzeichnet ist, gekennzeichnet ist,

wird ein Java Field benutzt, um diese Property zu wird ein Java Field benutzt, um diese Property zu repräsentierenrepräsentieren

Page 144: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyBeansGroovyBeans

Regeln für Properties:Regeln für Properties:Wenn eine Property als Wenn eine Property als public oder oder protected

gekennzeichnet wird, werden Getter- und Setter-gekennzeichnet wird, werden Getter- und Setter-Methoden mit der gleichen Sichtbarkeit und ein Feld mit Methoden mit der gleichen Sichtbarkeit und ein Feld mit der Sichtbarkeit der Sichtbarkeit private auf Bytecode-Ebene erzeugt auf Bytecode-Ebene erzeugt

Page 145: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyBeansGroovyBeans

Regeln für Properties:Regeln für Properties:Wenn keine Getter- oder Setter-Methoden für Properties Wenn keine Getter- oder Setter-Methoden für Properties

mit der Sichtbarkeit mit der Sichtbarkeit public oder oder protected deklariert deklariert wurden, werden fehlende Getter- und Setter-Methoden wurden, werden fehlende Getter- und Setter-Methoden mit der gleichen Sichtbarkeit automatisch auf Bytecode-mit der gleichen Sichtbarkeit automatisch auf Bytecode-Ebene erzeugtEbene erzeugt

Page 146: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyBeansGroovyBeans

Regeln für Properties:Regeln für Properties:Mit selbst deklarierten Getter- und Setter-Methoden Mit selbst deklarierten Getter- und Setter-Methoden

können die von der Groovy-Runtime generierten können die von der Groovy-Runtime generierten Methoden überschrieben werdenMethoden überschrieben werden

Page 147: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

RegEx

Page 148: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Reguläre AusdrückeReguläre Ausdrücke

Reguläre Ausdrücke werden von Groovy nativ unterstütztReguläre Ausdrücke werden von Groovy nativ unterstützt

Page 149: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Reguläre AusdrückeReguläre Ausdrücke

Reguläre Ausdrücke werden von Groovy nativ unterstütztReguläre Ausdrücke werden von Groovy nativ unterstütztDie Die ~"..." Expression wird automatisch in ein Java-Pattern "..." Expression wird automatisch in ein Java-Pattern

Objekt kompiliertObjekt kompiliert

Page 150: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Reguläre AusdrückeReguläre Ausdrücke

Reguläre Ausdrücke werden von Groovy nativ unterstütztReguläre Ausdrücke werden von Groovy nativ unterstütztDie Die ~"..." Expression wird automatisch in ein Java-Pattern "..." Expression wird automatisch in ein Java-Pattern

Objekt kompiliertObjekt kompiliert=~ Create Matcher Create Matcher

Page 151: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Reguläre AusdrückeReguläre Ausdrücke

Reguläre Ausdrücke werden von Groovy nativ unterstütztReguläre Ausdrücke werden von Groovy nativ unterstütztDie Die ~"..." Expression wird automatisch in ein Java-Pattern "..." Expression wird automatisch in ein Java-Pattern

Objekt kompiliertObjekt kompiliert=~ Create Matcher Create Matcherassert "cheesecheese" =~ /cheese/

Page 152: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Reguläre AusdrückeReguläre Ausdrücke

Reguläre Ausdrücke werden von Groovy nativ unterstütztReguläre Ausdrücke werden von Groovy nativ unterstütztDie Die ~"..." Expression wird automatisch in ein Java-Pattern "..." Expression wird automatisch in ein Java-Pattern

Objekt kompiliertObjekt kompiliert=~ Create Matcher Create Matcherassert "cheesecheese" =~ /cheese/

==~ Matches Regex Matches Regex

Page 153: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Reguläre AusdrückeReguläre Ausdrücke

Reguläre Ausdrücke werden von Groovy nativ unterstütztReguläre Ausdrücke werden von Groovy nativ unterstütztDie Die ~"..." Expression wird automatisch in ein Java-Pattern "..." Expression wird automatisch in ein Java-Pattern

Objekt kompiliertObjekt kompiliert=~ Create Matcher Create Matcherassert "cheesecheese" =~ /cheese/

==~ Matches Regex Matches Regexassert "cheesecheese" ==~ /.*ees.*/

Page 154: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Gra ils

Page 155: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GrailsGrails

Grails ist ein Webapplication-FrameworkGrails ist ein Webapplication-Framework

Page 156: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GrailsGrails

Grails ist ein Webapplication-FrameworkGrails ist ein Webapplication-FrameworkEs vereinfacht die Entwicklung von Webanwendungen durchEs vereinfacht die Entwicklung von Webanwendungen durch

das Coding By Convention-Paradigmadas Coding By Convention-Paradigma

Page 157: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GrailsGrails

Grails ist ein Webapplication-FrameworkGrails ist ein Webapplication-FrameworkEs vereinfacht die Entwicklung von Webanwendungen durchEs vereinfacht die Entwicklung von Webanwendungen durch

das Coding By Convention-Paradigmadas Coding By Convention-Paradigmadie Verwendung von Spring/Hibernatedie Verwendung von Spring/Hibernate

Page 158: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GrailsGrails

Grails ist ein Webapplication-FrameworkGrails ist ein Webapplication-FrameworkEs vereinfacht die Entwicklung von Webanwendungen durchEs vereinfacht die Entwicklung von Webanwendungen durch

das Coding By Convention-Paradigmadas Coding By Convention-Paradigmadie Verwendung von Spring/Hibernatedie Verwendung von Spring/Hibernateeigene GSP (Groovy Server Pages) mit dynamischen eigene GSP (Groovy Server Pages) mit dynamischen

TagLibrariesTagLibraries

Page 159: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Grails (Screenshots)Grails (Screenshots)

Page 160: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Grails (Screenshots)Grails (Screenshots)

Page 161: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Grails (Screenshots)Grails (Screenshots)

Page 162: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Grails (Screenshots)Grails (Screenshots)

Page 163: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GrailsGrails

Die zentrale Komponente ist die Domänenklasse (Entity)Die zentrale Komponente ist die Domänenklasse (Entity)

Page 164: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GrailsGrails

Die zentrale Komponente ist die Domänenklasse (Entity)Die zentrale Komponente ist die Domänenklasse (Entity)Daraus können der Controller und die Views für eine CRUD-Daraus können der Controller und die Views für eine CRUD-

Anwendung generiert werdenAnwendung generiert werden

Page 165: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GrailsGrails

Die zentrale Komponente ist die Domänenklasse (Entity)Die zentrale Komponente ist die Domänenklasse (Entity)Daraus können der Controller und die Views für eine CRUD-Daraus können der Controller und die Views für eine CRUD-

Anwendung generiert werdenAnwendung generiert werdenAnbindung an Enterprise-Systeme kann über SpringBeans Anbindung an Enterprise-Systeme kann über SpringBeans

erfolgenerfolgen

Page 166: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GrailsGrails

Die zentrale Komponente ist die Domänenklasse (Entity)Die zentrale Komponente ist die Domänenklasse (Entity)Daraus können der Controller und die Views für eine CRUD-Daraus können der Controller und die Views für eine CRUD-

Anwendung generiert werdenAnwendung generiert werdenAnbindung an Enterprise-Systeme kann über SpringBeans Anbindung an Enterprise-Systeme kann über SpringBeans

erfolgenerfolgenAls View-Technologie ist zur Zeit JSP und GSP vorgesehenAls View-Technologie ist zur Zeit JSP und GSP vorgesehen

Page 167: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GrailsGrails

Die zentrale Komponente ist die Domänenklasse (Entity)Die zentrale Komponente ist die Domänenklasse (Entity)Daraus können der Controller und die Views für eine CRUD-Daraus können der Controller und die Views für eine CRUD-

Anwendung generiert werdenAnwendung generiert werdenAnbindung an Enterprise-Systeme kann über SpringBeans Anbindung an Enterprise-Systeme kann über SpringBeans

erfolgenerfolgenAls View-Technologie ist zur Zeit JSP und GSP vorgesehenAls View-Technologie ist zur Zeit JSP und GSP vorgesehenEclipse Integration ist in ArbeitEclipse Integration ist in Arbeit

Page 168: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GrailsGrails

Die zentrale Komponente ist die Domänenklasse (Entity)Die zentrale Komponente ist die Domänenklasse (Entity)Daraus können der Controller und die Views für eine CRUD-Daraus können der Controller und die Views für eine CRUD-

Anwendung generiert werdenAnwendung generiert werdenAnbindung an Enterprise-Systeme kann über SpringBeans Anbindung an Enterprise-Systeme kann über SpringBeans

erfolgenerfolgenAls View-Technologie ist zur Zeit JSP und GSP vorgesehenAls View-Technologie ist zur Zeit JSP und GSP vorgesehenEclipse Integration ist in ArbeitEclipse Integration ist in ArbeitSehr leichte Integration in eine MDSD-UmgebungSehr leichte Integration in eine MDSD-Umgebung

Page 169: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Gorm

Page 170: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GORMGORM

Ist der OR-Mapper für GrailsIst der OR-Mapper für Grails

Page 171: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GORMGORM

Ist der OR-Mapper für GrailsIst der OR-Mapper für GrailsUnter der Haube wird Hibernate 3 verwendetUnter der Haube wird Hibernate 3 verwendet

Page 172: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GORMGORM

Ist der OR-Mapper für GrailsIst der OR-Mapper für GrailsUnter der Haube wird Hibernate 3 verwendetUnter der Haube wird Hibernate 3 verwendetDie Konfiguration wird komplett in den Groovy-Files Die Konfiguration wird komplett in den Groovy-Files

vorgenommenvorgenommen

Page 173: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GORMGORM

Ist der OR-Mapper für GrailsIst der OR-Mapper für GrailsUnter der Haube wird Hibernate 3 verwendetUnter der Haube wird Hibernate 3 verwendetDie Konfiguration wird komplett in den Groovy-Files Die Konfiguration wird komplett in den Groovy-Files

vorgenommenvorgenommenAlle Features von Hibernate werden unterstütztAlle Features von Hibernate werden unterstützt

Page 174: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GORMGORM

Ist der OR-Mapper für GrailsIst der OR-Mapper für GrailsUnter der Haube wird Hibernate 3 verwendetUnter der Haube wird Hibernate 3 verwendetDie Konfiguration wird komplett in den Groovy-Files Die Konfiguration wird komplett in den Groovy-Files

vorgenommenvorgenommenAlle Features von Hibernate werden unterstütztAlle Features von Hibernate werden unterstütztIn Verbindung mit Spring ist es möglich, Transaktionen in In Verbindung mit Spring ist es möglich, Transaktionen in

Grails-Anwendungen flexibel zu verwaltenGrails-Anwendungen flexibel zu verwalten

Page 175: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Groovle ts

Page 176: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovletsGroovlets

Groovlets sind Java-Servlets in Groovy geschriebenGroovlets sind Java-Servlets in Groovy geschrieben

Page 177: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovletsGroovlets

Groovlets sind Java-Servlets in Groovy geschriebenGroovlets sind Java-Servlets in Groovy geschriebenEs gibt ein GroovyServlet, welches Groovy-Skripte Es gibt ein GroovyServlet, welches Groovy-Skripte

automatisch kompiliert, ausführt und cachedautomatisch kompiliert, ausführt und cached

Page 178: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovletsGroovlets

Groovlets sind Java-Servlets in Groovy geschriebenGroovlets sind Java-Servlets in Groovy geschriebenEs gibt ein GroovyServlet, welches Groovy-Skripte Es gibt ein GroovyServlet, welches Groovy-Skripte

automatisch kompiliert, ausführt und cachedautomatisch kompiliert, ausführt und cached

Page 179: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovletsGroovlets

Implizite Variablen:Implizite Variablen:Variable Gebunden an BemerkungRequest ServletRequest Response ServletResponseContext ServletContextApplication ServletContext Session getSession(false) Out response.getWriter() Können nicht re-assigned werdenCout response.getOutputStream() Können nicht re-assigned werdenHtml new MarkupBuilder(out) Können nicht re-assigned werden

Page 180: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GSQL

Page 181: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GSQLGSQL

Vereinfacht das Arbeiten mit SQL Vereinfacht das Arbeiten mit SQL

Page 182: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GSQLGSQL

Vereinfacht das Arbeiten mit SQL Vereinfacht das Arbeiten mit SQL Unterstützung von SQL-Queries und -StatementsUnterstützung von SQL-Queries und -Statements

Page 183: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GSQLGSQL

Vereinfacht das Arbeiten mit SQL Vereinfacht das Arbeiten mit SQL Unterstützung von SQL-Queries und -StatementsUnterstützung von SQL-Queries und -StatementsClosures bieten komfortables Arbeiten mit den ResultSetsClosures bieten komfortables Arbeiten mit den ResultSets

Page 184: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GSQLGSQL

Vereinfacht das Arbeiten mit SQL Vereinfacht das Arbeiten mit SQL Unterstützung von SQL-Queries und -StatementsUnterstützung von SQL-Queries und -StatementsClosures bieten komfortables Arbeiten mit den ResultSetsClosures bieten komfortables Arbeiten mit den ResultSets

def sql = Sql.newInstance("url", "user","pwd", "driver")sql.eachRow("select * from FOOD where type=${foo}") {

println "Gromit likes ${it.name}"}

Page 185: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GSQLGSQL

Vereinfacht das Arbeiten mit SQL Vereinfacht das Arbeiten mit SQL Unterstützung von SQL-Queries und -StatementsUnterstützung von SQL-Queries und -StatementsClosures bieten komfortables Arbeiten mit den ResultSetsClosures bieten komfortables Arbeiten mit den ResultSets

def sql = Sql.newInstance("url", "user","pwd", "driver")def food = sql.dataSet('FOOD')def cheese = food.findAll { it.type == 'cheese' }cheese.each { println "Eat ${it.name}" }

Page 186: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Ant-Sc ripting

Page 187: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Ant-ScriptingAnt-Scripting

Bietet eine Schnittstelle, um Ant-Tasks per Groovy-Script zu Bietet eine Schnittstelle, um Ant-Tasks per Groovy-Script zu erstellen und zu benutzenerstellen und zu benutzen

Page 188: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Ant-ScriptingAnt-Scripting

Bietet eine Schnittstelle, um Ant-Tasks per Groovy-Script zu Bietet eine Schnittstelle, um Ant-Tasks per Groovy-Script zu erstellen und zu benutzenerstellen und zu benutzen

ant = new AntBuilder()ant.echo(message:"mapping it via attribute!") ant.echo("Hello World!")

Page 189: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Ant-ScriptingAnt-Scripting

Bietet eine Schnittstelle, um Ant-Tasks per Groovy-Script zu Bietet eine Schnittstelle, um Ant-Tasks per Groovy-Script zu erstellen und zu benutzenerstellen und zu benutzen

ant = new AntBuilder()try{

ant.javac(srcdir:"/src", destdir:"/dest/" )}catch(Throwable thr){

ant.mail(mailhost:"host", subject:"build failure"){from(address:"[email protected]"), to(address:"[email protected]")message("Unable to compile sources.")

}}

Page 190: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

GroovyTempla te s

Page 191: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Groovy TemplatesGroovy Templates

Bietet ein Framework, um eine eigene Template-Engine zu Bietet ein Framework, um eine eigene Template-Engine zu entwickelnentwickeln

Page 192: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Groovy TemplatesGroovy Templates

Bietet ein Framework, um eine eigene Template-Engine zu Bietet ein Framework, um eine eigene Template-Engine zu entwickelnentwickeln

Enthalten ist die SimpleTemplateEngine, die JSP-like Enthalten ist die SimpleTemplateEngine, die JSP-like mittels Scripts, Scriptlets und EL parameterisierte Texte mittels Scripts, Scriptlets und EL parameterisierte Texte generieren kanngenerieren kann

Page 193: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Groovy Templates (Beispiel)Groovy Templates (Beispiel)def text = 'Dear \"${firstname} ${lastname}\",\nSo nice to meet you in <% print city %>.'

def binding = ["firstname":"Peter", "lastname":"Schulze", "city":"Dortmund"]

def engine = new SimpleTemplateEngine()template = engine.createTemplate(text).make(binding)

def result = 'Dear "Peter Schulze",\nSo nice to meet you in Dortmund.'

assert result == template.toString()

Page 194: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

S icherhe it

Page 195: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

SicherheitSicherheit

Groovy-Skripte können innerhalb des Java Security-Groovy-Skripte können innerhalb des Java Security-Managers ausgeführt werdenManagers ausgeführt werden

Page 196: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

SicherheitSicherheit

Groovy-Skripte können innerhalb des Java Security-Groovy-Skripte können innerhalb des Java Security-Managers ausgeführt werdenManagers ausgeführt werden

Page 197: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

SicherheitSicherheit

Groovy-Skripte können innerhalb des Java Security-Groovy-Skripte können innerhalb des Java Security-Managers ausgeführt werdenManagers ausgeführt werden

security.policy:grant codeBase "file:/serverCodeBase/restrictedClient" {

permission java.security.AllPermission;};

Page 198: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

SicherheitSicherheit

Groovy-Skripte können innerhalb des Java Security-Groovy-Skripte können innerhalb des Java Security-Managers ausgeführt werdenManagers ausgeführt werden

security.policy:grant codeBase "file:/serverCodeBase/restrictedClient" {

permission java.security.AllPermission;};Java-Code:new GroovyShell().evaluate(

new GroovyCodeSource(clientscriptStr, "RestrictedScript", "/serverCodeBase/restrictedClient")

Page 199: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Sc riptomSc riptom

Page 200: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

ScriptomScriptom

Scriptom ist ein optionales Modul für die Verwendung mit Scriptom ist ein optionales Modul für die Verwendung mit dem Windows Scripting Host oder OLE COM Automationdem Windows Scripting Host oder OLE COM Automation

Page 201: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

ScriptomScriptom

Scriptom ist ein optionales Modul für die Verwendung mit Scriptom ist ein optionales Modul für die Verwendung mit dem Windows Scripting Host oder OLE COM Automationdem Windows Scripting Host oder OLE COM Automation

import org.codehaus.groovy.scriptom.ActiveXProxydef explorer = new

ActiveXProxy("InternetExplorer.Application")explorer.Visible = trueexplorer.AddressBar = trueexplorer.Navigate("http://www.itemis.de/")

Page 202: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

ScriptomScriptom

Scriptom ist ein optionales Modul für die Verwendung mit Scriptom ist ein optionales Modul für die Verwendung mit dem Windows Scripting Host oder OLE COM Automationdem Windows Scripting Host oder OLE COM Automation

import org.codehaus.groovy.scriptom.ActiveXProxyimport java.io.Filedef word = new ActiveXProxy("Word.Application")word.Documents.Open(new File(args[0]).canonicalPath)word.ActiveDocument.SaveAs(new File(args[0] - ".doc" + ".html").canonicalPath, 8)word.Quit()

Page 203: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Weite reModule

Page 204: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Weitere ModuleWeitere Module

Gant Gant

Gant ist ein Build-Tool auf Basis von Ant. Anstatt XML zu Gant ist ein Build-Tool auf Basis von Ant. Anstatt XML zu verwenden, wird ein Groovy-Dialekt benutzt, um die Ant-verwenden, wird ein Groovy-Dialekt benutzt, um die Ant-Targets und -Tasks zu konfigurieren.Targets und -Tasks zu konfigurieren.

Page 205: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Weitere ModuleWeitere Module

Google Data Support Google Data Support

Google bietet den Zugriff auf seine Services. Mit Google Google bietet den Zugriff auf seine Services. Mit Google Data Support wird der Zugriff darauf wesentlich Data Support wird der Zugriff darauf wesentlich vereinfacht.vereinfacht.

Page 206: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Weitere ModuleWeitere Module

GramGram

Gram unterstützt bei der Verwendung von Xdoclet-Tags und Gram unterstützt bei der Verwendung von Xdoclet-Tags und Annotations in Groovy-Scripts.Annotations in Groovy-Scripts.

Page 207: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Weitere ModuleWeitere Module

Groovy Jabber-RPCGroovy Jabber-RPC

Damit können XML-RPC Aufrufe über das Jabber-Protokol Damit können XML-RPC Aufrufe über das Jabber-Protokol abgesetzt werden. Bietet die Möglichkeit sowohl einen abgesetzt werden. Bietet die Möglichkeit sowohl einen Server als auch einen Client zu erstellen.Server als auch einen Client zu erstellen.

Page 208: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Weitere ModuleWeitere Module

Groovy MonkeyGroovy Monkey

Groovy Monkey ist ein Port des Eclipse-Monkey Projekts. Groovy Monkey ist ein Port des Eclipse-Monkey Projekts. Damit kann Eclipse über Groovy-Scripts automatisiert Damit kann Eclipse über Groovy-Scripts automatisiert werden.werden.

Page 209: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Weitere ModuleWeitere Module

Groovy SOAPGroovy SOAP

Damit können sowohl ein Soap-Server als auch ein Soap-Damit können sowohl ein Soap-Server als auch ein Soap-Client erstellt werden.Client erstellt werden.

Page 210: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Weitere ModuleWeitere Module

GroovySWTGroovySWT

Auch SWT-UI's können mittels Groovy erstellt werden.Auch SWT-UI's können mittels Groovy erstellt werden.

Page 211: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Weitere ModuleWeitere Module

ProcessProcess

Wird auch GrooSH – Groovy Shell – genannt. Hiermit ist es Wird auch GrooSH – Groovy Shell – genannt. Hiermit ist es möglich Funktionen einer (Unix-)Shell nachzubilden.möglich Funktionen einer (Unix-)Shell nachzubilden.

Page 212: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Weitere ModuleWeitere Module

XMLRPCXMLRPC

Ermöglicht XML-RPC Calls an lokale oder enfernte RPC-Ermöglicht XML-RPC Calls an lokale oder enfernte RPC-Server abzusetzen.Server abzusetzen.

Page 213: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Tes ting

Page 214: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 215: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 216: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 217: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 218: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 219: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 220: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 221: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 222: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 223: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 224: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 225: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 226: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 227: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

TestingTesting

Page 228: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Testing - jUnit-TestingTesting - jUnit-Testing

Basiert auf jUnit und erweitert die AssertsBasiert auf jUnit und erweitert die Asserts

Page 229: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Testing - jUnit-TestingTesting - jUnit-Testing

Basiert auf jUnit und erweitert die AssertsBasiert auf jUnit und erweitert die Asserts 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)

Page 230: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDESupport

Page 231: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Page 232: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Page 233: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Page 234: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Page 235: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Page 236: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Page 237: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-Support (Groovy Monkey)IDE-Support (Groovy Monkey)

Groovy Monkey ist ein Aufsatz auf Eclipse MonkeyGroovy Monkey ist ein Aufsatz auf Eclipse Monkey

Page 238: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-Support (Groovy Monkey)IDE-Support (Groovy Monkey)

Groovy Monkey ist ein Aufsatz auf Eclipse MonkeyGroovy Monkey ist ein Aufsatz auf Eclipse MonkeyDamit kann Eclipse geskriptet werdenDamit kann Eclipse geskriptet werden

Page 239: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-Support (Groovy Monkey)IDE-Support (Groovy Monkey)

Groovy Monkey ist ein Aufsatz auf Eclipse MonkeyGroovy Monkey ist ein Aufsatz auf Eclipse MonkeyDamit kann Eclipse geskriptet werdenDamit kann Eclipse geskriptet werdenNützlich fürNützlich für

Automatisierungs-Task (Quelltext-Suche, Erstellen von Automatisierungs-Task (Quelltext-Suche, Erstellen von Tasks)Tasks)

Page 240: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-Support (Groovy Monkey)IDE-Support (Groovy Monkey)

Groovy Monkey ist ein Aufsatz auf Eclipse MonkeyGroovy Monkey ist ein Aufsatz auf Eclipse MonkeyDamit kann Eclipse geskriptet werdenDamit kann Eclipse geskriptet werdenNützlich fürNützlich für

Automatisierungs-Task (Quelltext-Suche, Erstellen von Automatisierungs-Task (Quelltext-Suche, Erstellen von Tasks)Tasks)

Erstellen von LaunchManagernErstellen von LaunchManagern

Page 241: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-Support (Groovy Monkey)IDE-Support (Groovy Monkey)

Groovy Monkey ist ein Aufsatz auf Eclipse MonkeyGroovy Monkey ist ein Aufsatz auf Eclipse MonkeyDamit kann Eclipse geskriptet werdenDamit kann Eclipse geskriptet werdenNützlich fürNützlich für

Automatisierungs-Task (Quelltext-Suche, Erstellen von Automatisierungs-Task (Quelltext-Suche, Erstellen von Tasks)Tasks)

Erstellen von LaunchManagernErstellen von LaunchManagernPrototyping von PluginsPrototyping von Plugins

Page 242: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

IDE-Support (Groovy Monkey)IDE-Support (Groovy Monkey)

Groovy Monkey ist ein Aufsatz auf Eclipse MonkeyGroovy Monkey ist ein Aufsatz auf Eclipse MonkeyDamit kann Eclipse geskriptet werdenDamit kann Eclipse geskriptet werdenNützlich fürNützlich für

Automatisierungs-Task (Quelltext-Suche, Erstellen von Automatisierungs-Task (Quelltext-Suche, Erstellen von Tasks)Tasks)

Erstellen von LaunchManagernErstellen von LaunchManagernPrototyping von PlugInsPrototyping von PlugIns

Basiert auf dem Eclipse-Job APIBasiert auf dem Eclipse-Job API

Page 243: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Zus ammen-Fas s ung

Page 244: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

ZusammenfassungZusammenfassung

Groovy ist schon sehr weit fortgeschrittenGroovy ist schon sehr weit fortgeschritten

Page 245: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

ZusammenfassungZusammenfassung

Groovy ist schon sehr weit fortgeschrittenGroovy ist schon sehr weit fortgeschrittenEs gibt eine grosse Anzahl an zusätzlichen Modulen, die die Es gibt eine grosse Anzahl an zusätzlichen Modulen, die die

meisten Anwendungsfälle abdeckenmeisten Anwendungsfälle abdecken

Page 246: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

ZusammenfassungZusammenfassung

Groovy ist schon sehr weit fortgeschrittenGroovy ist schon sehr weit fortgeschrittenEs gibt eine grosse Anzahl an zusätzlichen Modulen, die die Es gibt eine grosse Anzahl an zusätzlichen Modulen, die die

meisten Anwendungsfälle abdeckenmeisten Anwendungsfälle abdeckenDurch die Standardisierung (JSR 241) ist auch eine gewisse Durch die Standardisierung (JSR 241) ist auch eine gewisse

Zukunftssicherheit gewährleistetZukunftssicherheit gewährleistet

Page 247: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

ZusammenfassungZusammenfassung

Groovy ist schon sehr weit fortgeschrittenGroovy ist schon sehr weit fortgeschrittenEs gibt eine grosse Anzahl an zusätzlichen Modulen, die die Es gibt eine grosse Anzahl an zusätzlichen Modulen, die die

meisten Anwendungsfälle abdeckenmeisten Anwendungsfälle abdeckenDurch die Standardisierung (JSR 241) ist auch eine gewisse Durch die Standardisierung (JSR 241) ist auch eine gewisse

Zukunftssicherheit gewährleistetZukunftssicherheit gewährleistetGroovy ist leicht erlernbar, da sehr viele Ähnlichkeiten mit Groovy ist leicht erlernbar, da sehr viele Ähnlichkeiten mit

der Java-Syntax bestehender Java-Syntax bestehen

Page 248: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

ZusammenfassungZusammenfassung

Groovy ist schon sehr weit fortgeschrittenGroovy ist schon sehr weit fortgeschrittenEs gibt eine grosse Anzahl an zusätzlichen Modulen, die die Es gibt eine grosse Anzahl an zusätzlichen Modulen, die die

meisten Anwendungsfälle abdeckenmeisten Anwendungsfälle abdeckenDurch die Standardisierung (JSR 241) ist auch eine gewisse Durch die Standardisierung (JSR 241) ist auch eine gewisse

Zukunftssicherheit gewährleistetZukunftssicherheit gewährleistetGroovy ist leicht erlernbar, da sehr viele Ähnlichkeiten mit Groovy ist leicht erlernbar, da sehr viele Ähnlichkeiten mit

der Java-Syntax bestehender Java-Syntax bestehenNeben dem leistungsfähigen API von Groovy steht die Neben dem leistungsfähigen API von Groovy steht die

gesamte API von Java zur Verfügunggesamte API von Java zur Verfügung

Page 249: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

Links

Page 250: Groovy - Rocks or Not?

Copyright 2006 Thorsten Kamann

LinksLinks

Groovy HomepageGroovy Homepagehttp://groovy.codehaus.org/

JSR 241JSR 241http://www.jcp.org/en/jsr/detail?id=241

GrailsGrailshttp://grails.codehaus.org/

Artikel über GroovyArtikel über Groovyhttp://groovy.codehaus.org/Articles

Webseite des AutorsWebseite des Autorshttp://www.planetes.de/thorsten-kamann