Groovy - Rocks or Not?

Preview:

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

Copyright 2006 Thorsten Kamann

von und mit Thorsten Kamann

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

Copyright 2006 Thorsten Kamann

Einle itung

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

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

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

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“)

Copyright 2006 Thorsten Kamann

Was ist Groovy?Was ist Groovy?

Eine dynamische SpracheEine dynamische Sprache

Copyright 2006 Thorsten Kamann

Was ist Groovy?Was ist Groovy?

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

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

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

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

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

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

Copyright 2006 Thorsten Kamann

GettingS ta rted

Copyright 2006 Thorsten Kamann

Getting StartedGetting Started

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

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

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

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

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

Copyright 2006 Thorsten Kamann

Getting StartedGetting Started

Copyright 2006 Thorsten Kamann

Embedding

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

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

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

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

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

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

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

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

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));

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

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);

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();

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

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"));

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

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

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

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

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

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

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

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

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

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

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

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.

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

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

Copyright 2006 Thorsten Kamann

DieSyntax

Copyright 2006 Thorsten Kamann

Die Syntax: ClosuresDie Syntax: Closures

Closures Closures sind anonyme Codeblöckesind anonyme Codeblöcke

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

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

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

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

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

Copyright 2006 Thorsten Kamann

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

Beispiele:Beispiele:

{ item++ }

Copyright 2006 Thorsten Kamann

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

Beispiele:Beispiele:

{ name -> println name }

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"}

Copyright 2006 Thorsten Kamann

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

Beispiele:Beispiele:

{ reader ->while (true) {

line = reader.readLine() }}

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

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

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

Copyright 2006 Thorsten Kamann

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

Ranges erzeugen Listen mit sequentiellen WertenRanges erzeugen Listen mit sequentiellen Werten

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

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)

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)

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

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"

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

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

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"

Copyright 2006 Thorsten Kamann

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

Iterator mittels einer ClosureIterator mittels einer Closure

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}-" }

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

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]

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

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

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

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]

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

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“

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

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

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

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

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

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

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

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

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

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'

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

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'

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]

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"

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 == "!"

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"

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

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

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

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

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

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

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

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

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

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

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

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

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{

...}

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

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: ...

}

Copyright 2006 Thorsten Kamann

XMLProc es s ing

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

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

Copyright 2006 Thorsten Kamann

XML-ProcessingXML-Processing

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

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

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')

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

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()}

Copyright 2006 Thorsten Kamann

GroovyMarkup

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

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

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

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, ...

Copyright 2006 Thorsten Kamann

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

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

}}

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>

Copyright 2006 Thorsten Kamann

GPath

Copyright 2006 Thorsten Kamann

GPathGPath

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

Copyright 2006 Thorsten Kamann

GPathGPath

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

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

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>

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

Copyright 2006 Thorsten Kamann

GroovyBeans

Copyright 2006 Thorsten Kamann

GroovyBeansGroovyBeans

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

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}

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

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

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

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

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

Copyright 2006 Thorsten Kamann

RegEx

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

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

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

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/

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

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.*/

Copyright 2006 Thorsten Kamann

Gra ils

Copyright 2006 Thorsten Kamann

GrailsGrails

Grails ist ein Webapplication-FrameworkGrails ist ein Webapplication-Framework

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

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

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

Copyright 2006 Thorsten Kamann

Grails (Screenshots)Grails (Screenshots)

Copyright 2006 Thorsten Kamann

Grails (Screenshots)Grails (Screenshots)

Copyright 2006 Thorsten Kamann

Grails (Screenshots)Grails (Screenshots)

Copyright 2006 Thorsten Kamann

Grails (Screenshots)Grails (Screenshots)

Copyright 2006 Thorsten Kamann

GrailsGrails

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

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

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

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

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

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

Copyright 2006 Thorsten Kamann

Gorm

Copyright 2006 Thorsten Kamann

GORMGORM

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

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

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

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

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

Copyright 2006 Thorsten Kamann

Groovle ts

Copyright 2006 Thorsten Kamann

GroovletsGroovlets

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

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

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

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

Copyright 2006 Thorsten Kamann

GSQL

Copyright 2006 Thorsten Kamann

GSQLGSQL

Vereinfacht das Arbeiten mit SQL Vereinfacht das Arbeiten mit SQL

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

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

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}"}

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}" }

Copyright 2006 Thorsten Kamann

Ant-Sc ripting

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

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!")

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:"buildmaster@anywhere.com"), to(address:"dev-team@anywhere.com")message("Unable to compile sources.")

}}

Copyright 2006 Thorsten Kamann

GroovyTempla te s

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

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

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()

Copyright 2006 Thorsten Kamann

S icherhe it

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

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

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;};

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")

Copyright 2006 Thorsten Kamann

Sc riptomSc riptom

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

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/")

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()

Copyright 2006 Thorsten Kamann

Weite reModule

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.

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.

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.

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.

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.

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.

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.

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.

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.

Copyright 2006 Thorsten Kamann

Tes ting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

TestingTesting

Copyright 2006 Thorsten Kamann

Testing - jUnit-TestingTesting - jUnit-Testing

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

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)

Copyright 2006 Thorsten Kamann

IDESupport

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

Copyright 2006 Thorsten Kamann

IDE-SupportIDE-Support

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

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

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)

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

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

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

Copyright 2006 Thorsten Kamann

Zus ammen-Fas s ung

Copyright 2006 Thorsten Kamann

ZusammenfassungZusammenfassung

Groovy ist schon sehr weit fortgeschrittenGroovy ist schon sehr weit fortgeschritten

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

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

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

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

Copyright 2006 Thorsten Kamann

Links

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

Recommended