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.
4. Was ist Scripting?
Skriptsprachen sind Programmiersprachen, die vor allem für
kleine, überschaubare Programmieraufgaben gedacht sind
Copyright 2006 Thorsten Kamann
5. Was ist Scripting?
Skriptsprachen sind Programmiersprachen, die vor allem für
kleine, überschaubare Programmieraufgaben gedacht sind
Kein Deklarationszwang für Variablen
Copyright 2006 Thorsten Kamann
6. Was ist Scripting?
Skriptsprachen sind Programmiersprachen, die vor allem für
kleine, überschaubare Programmieraufgaben gedacht sind
Kein Deklarationszwang für Variablen
automatische Speicherverwaltung
Copyright 2006 Thorsten Kamann
7. Was ist Scripting?
Skriptsprachen sind Programmiersprachen, die vor allem für
kleine, überschaubare Programmieraufgaben gedacht sind
Kein Deklarationszwang für Variablen
automatische Speicherverwaltung
werden in der Regel ohne getrennte Übersetzungsphase
ausgeführt (d. h. sie werden „interpretiert“)
Copyright 2006 Thorsten Kamann
9. Was ist Groovy?
Eine dynamische Sprache
Inspiriert von Ruby, Python, Smalltalk
Copyright 2006 Thorsten Kamann
10. Was ist Groovy?
Eine dynamische Sprache
Inspiriert von Ruby, Python, Smalltalk
Entwickelt für die Java-Plattform
Copyright 2006 Thorsten Kamann
11. Was ist Groovy?
Eine dynamische Sprache
Inspiriert von Ruby, Python, Smalltalk
Entwickelt für die Java-Plattform
Um sie Java-Entwicklern zugänglich zu machen
Copyright 2006 Thorsten Kamann
12. Was ist Groovy?
Eine dynamische Sprache
Inspiriert von Ruby, Python, Smalltalk
Entwickelt für die Java-Plattform
Um sie Java-Entwicklern zugänglich zu machen
Um möglichst viel der Java-Syntax wieder verwenden zu
können
Copyright 2006 Thorsten Kamann
13. Was ist Groovy?
Eine dynamische Sprache
Inspiriert von Ruby, Python, Smalltalk
Entwickelt für die Java-Plattform
Um sie Java-Entwicklern zugänglich zu machen
Um möglichst viel der Java-Syntax wieder verwenden zu
können
Um eine einfache Anbindung zu Enterprise-Systemen
anzubieten
Copyright 2006 Thorsten Kamann
14. Was ist Groovy?
Eine dynamische Sprache
Inspiriert von Ruby, Python, Smalltalk
Entwickelt für die Java-Plattform
Um sie Java-Entwicklern zugänglich zu machen
Um möglichst viel der Java-Syntax wieder verwenden zu
können
Um eine einfache Anbindung zu Enterprise-Systemen
anzubieten
Das Ergebnis des JSR 241: The Groovy Programming Language
Copyright 2006 Thorsten Kamann
17. Getting Started
Download des aktuellen Release von
http://groovy.codehaus.org
Entpacken des Archivs
Copyright 2006 Thorsten Kamann
18. Getting Started
Download des aktuellen Release von
http://groovy.codehaus.org
Entpacken des Archivs
Setzen der Umgebungsvariable GROOVY_HOME
Copyright 2006 Thorsten Kamann
19. Getting Started
Download des aktuellen Release von
http://groovy.codehaus.org
Entpacken des Archivs
Setzen der Umgebungsvariable GROOVY_HOME
Hinzufügen von %GROOVY_HOME%bin zur PATH-Variable
Copyright 2006 Thorsten Kamann
20. Getting Started
Download des aktuellen Release von
http://groovy.codehaus.org
Entpacken des Archivs
Setzen der Umgebungsvariable GROOVY_HOME
Hinzufügen von %GROOVY_HOME%bin zur PATH-Variable
Starten von groovyConsole und Eingabe von
println „Hallo Welt“
mit anschliessendem STRG-R
Copyright 2006 Thorsten Kamann
23. Embedding
Groovy kann auf 4 verschiedene Arten in Java-Anwendungen
eingebunden werden
Copyright 2006 Thorsten Kamann
24. Embedding
Groovy kann auf 4 verschiedene Arten in Java-Anwendungen
eingebunden werden
Copyright 2006 Thorsten Kamann
25. Embedding
Groovy kann auf 4 verschiedene Arten in Java-Anwendungen
eingebunden werden
Copyright 2006 Thorsten Kamann
26. Embedding
Groovy kann auf 4 verschiedene Arten in Java-Anwendungen
eingebunden werden
Copyright 2006 Thorsten Kamann
27. Embedding
Groovy kann auf 4 verschiedene Arten in Java-Anwendungen
eingebunden werden
Copyright 2006 Thorsten Kamann
28. Embedding mit dem BSF
Ist ein allgemeine Möglichkeit, jede beliebige Scriptsprache
in Java-Anwendungen einzubinden
Copyright 2006 Thorsten Kamann
29. Embedding mit dem BSF
Ist ein allgemeine Möglichkeit, jede beliebige Scriptsprache
in Java-Anwendungen einzubinden
Groovy bietet aber leichtgewichtigere und leistungsfähigere
Möglichkeiten der Einbindung
Copyright 2006 Thorsten Kamann
30. Embedding mit GroovyShell
GroovyShell bietet die Möglichkeit des Ein- und Auslesens
von Variablen mittels des Binding-Objekts
Copyright 2006 Thorsten Kamann
31. Embedding mit GroovyShell
GroovyShell bietet die Möglichkeit des Ein- und Auslesens
von Variablen mittels des Binding-Objekts
Binding binding = new Binding();
binding.setVariable(quot;fooquot;, new Integer(2));
GroovyShell shell = new GroovyShell(binding);
Object value = shell.evaluate(
quot;println 'Hello World!'; x = 123; return foo * 10quot;);
assert value.equals(new Integer(20));
assert binding.getVariable(quot;xquot;).equals(new Integer(123));
Copyright 2006 Thorsten Kamann
32. Embedding mit GroovyClassLoader
Der GroovyClassLoader lädt Groovy-Klassen dynamisch und
ermöglicht den direkten Zugriff auf deren Methoden
Copyright 2006 Thorsten Kamann
33. Embedding mit GroovyClassLoader
Der GroovyClassLoader lädt Groovy-Klassen dynamisch und
ermöglicht den direkten Zugriff auf deren Methoden
ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new
GroovyClassLoader(parent);
Class groovyClass = loader.parseClass(
new File(quot;script.groovyquot;));
GroovyObject groovyObject =
(GroovyObject) groovyClass.newInstance();
Object[] args = {};
groovyObject.invokeMethod(quot;runquot;, args);
Copyright 2006 Thorsten Kamann
34. Embedding mit GroovyClassLoader
Der GroovyClassLoader lädt Groovy-Klassen dynamisch und
ermöglicht den direkten Zugriff auf deren Methoden
GroovyClassLoader gcl = new GroovyClassLoader();
Class clazz = gcl.parseClass(
myStringwithGroovyClassSource, quot;SomeName.groovyquot;);
Object aScript = clazz.newInstance();
MyInterface myObject = (MyInterface) aScript;
myObject.interfaceMethod();
Copyright 2006 Thorsten Kamann
35. Embedding mit GroovyScriptEngine
Dies ist die leistungsfähige Möglichkeit um Groovy-Skripte
auszuführen. Das Binding-Objekt befüllt dabei die Skripte
mit Daten
Copyright 2006 Thorsten Kamann
36. Embedding mit GroovyScriptEngine
Dies ist die leistungsfähige Möglichkeit um Groovy-Skripte
auszuführen. Das Binding-Objekt befüllt dabei die Skripte
mit Daten
String[] roots = new String[] {quot;/my/groovy/script/pathquot;};
GroovyScriptEngine gse = new GroovyScriptEngine(roots);
Binding binding = new Binding();
binding.setVariable(quot;inputquot;, quot;worldquot;);
gse.run(quot;hello.groovyquot;, binding);
System.out.println(binding.getVariable(quot;outputquot;));
Copyright 2006 Thorsten Kamann
37. Embedding mit Ant
ANT-Task, mit dem eine beliebige Anzahl von Groovy-
Skripten ausgeführt werden können
Copyright 2006 Thorsten Kamann
38. Embedding mit Ant
ANT-Task, mit dem eine beliebige Anzahl von Groovy-
Skripten ausgeführt werden können
GroovyC-Task, der Groovy-Skripte (Klassen) zu Java
Bytecode kompiliert
Copyright 2006 Thorsten Kamann
39. Embedding mit Ant
ANT-Task, mit dem eine beliebige Anzahl von Groovy-
Skripten ausgeführt werden können
GroovyC-Task, der Groovy-Skripte (Klassen) zu Java
Bytecode kompiliert
Erstellen von Ant-Tasks mit Groovy und dem Markup-Builder
Copyright 2006 Thorsten Kamann
40. Embedding mit Ant
ANT-Task, mit dem eine beliebige Anzahl von Groovy-
Skripten ausgeführt werden können
GroovyC-Task, der Groovy-Skripte (Klassen) zu Java
Bytecode kompiliert
Erstellen von Ant-Tasks mit Groovy und dem Markup-Builder
Erzeugen von Ant-Skripten
Copyright 2006 Thorsten Kamann
41. Embedding mit Maven 2
Maven 2 wird offiziell mittels des Maven2-Ant-Plugins
unterstützt
Copyright 2006 Thorsten Kamann
42. Embedding mit Maven 2
Maven 2 wird offiziell mittels des Maven2-Ant-Plugins
unterstützt
Es existiert aber ein Groovy-Maven-Plugin, mit dem
beliebige Groovy-Skripte ausgeführt werden können
Copyright 2006 Thorsten Kamann
43. Embedding mit Maven 2
Maven 2 wird offiziell mittels des Maven2-Ant-Plugins
unterstützt
Es existiert aber ein Groovy-Maven-Plugin, mit dem
beliebige Groovy-Skripte ausgeführt werden können
In der Sandbox von http://mojo.codehaus.org/
existieren bereits Maven-Tools für direkte Unterstützung
von Groovy
Copyright 2006 Thorsten Kamann
44. Embedding mit Maven 2
Maven 2 wird offiziell mittels des Maven2-Ant-Plugins
unterstützt
Es existiert aber ein Groovy-Maven-Plugin, mit dem
beliebige Groovy-Skripte ausgeführt werden können
In der Sandbox von http://mojo.codehaus.org/
existieren bereits Maven-Tools für direkte Unterstützung
von Groovy
Groovy-Compiler
Copyright 2006 Thorsten Kamann
45. Embedding mit Maven 2
Maven 2 wird offiziell mittels des Maven2-Ant-Plugins
unterstützt
Es existiert aber ein Groovy-Maven-Plugin, mit dem
beliebige Groovy-Skripte ausgeführt werden können
In der Sandbox von http://mojo.codehaus.org/
existieren bereits Maven-Tools für direkte Unterstützung
von Groovy
Groovy-Compiler
Groovy-Archetype
Copyright 2006 Thorsten Kamann
46. Embedding mit Maven 2
Maven 2 wird offiziell mittels des Maven2-Ant-Plugins
unterstützt
Es existiert aber ein Groovy-Maven-Plugin, mit dem
beliebige Groovy-Skripte ausgeführt werden können
In der Sandbox von http://mojo.codehaus.org/
existieren bereits Maven-Tools für direkte Unterstützung
von Groovy
Groovy-Compiler
Groovy-Archetype
Tools, um Maven-Plugins mit Groovy zu entwickeln
Copyright 2006 Thorsten Kamann
47. Embedding in Windows
Groovy kann direkt von der Eingabeaufforderung oder über
Start-->Ausführen mittels
groovy script.groovy [arguments]
ausgeführt werden
Copyright 2006 Thorsten Kamann
48. Embedding in Windows
Groovy kann direkt von der Eingabeaufforderung oder über
Start-->Ausführen mittels
groovy script.groovy [arguments]
ausgeführt werden
Alternativ kann über den Dialog
Ordneroptionen-->Dateitypen die Extension
*.groovy an groovy.bat gebunden werden.
Copyright 2006 Thorsten Kamann
49. Embedding in Linux
Groovy kann direkt von der Konsole mittels
groovy script.groovy [arguments]
ausgeführt werden
Copyright 2006 Thorsten Kamann
50. Embedding in Linux
Groovy kann direkt von der Konsole mittels
groovy script.groovy [arguments]
ausgeführt werden
Alternativ kann in die 1. Zeile eines Groovy-Skripts
#!/usr/bin/env groovy
eingefügt werden. So kann mit
chmod +x script.groovy
./script.groovy
das Skript ausgeführt werden
Copyright 2006 Thorsten Kamann
54. Die Syntax: Closures
Closures
sind anonyme Codeblöcke
geben einen Wert zurück
referenzieren und verwenden Variablen
Copyright 2006 Thorsten Kamann
55. Die Syntax: Closures
Closures
sind anonyme Codeblöcke
geben einen Wert zurück
referenzieren und verwenden Variablen
werden oft wie Anonyme Inner Classes in Java benutzt
Copyright 2006 Thorsten Kamann
56. Die Syntax: Closures
Closures
sind anonyme Codeblöcke
geben einen Wert zurück
referenzieren und verwenden Variablen
werden oft wie Anonyme Inner Classes in Java benutzt
werden erst ausgeführt, wenn call() auf der Closure
aufgerufen wird
Copyright 2006 Thorsten Kamann
57. Die Syntax: Closures
Closures
sind anonyme Codeblöcke
geben einen Wert zurück
referenzieren und verwenden Variablen
werden oft wie Anonyme Inner Classes in Java benutzt
werden erst ausgeführt, wenn call() auf der Closure
aufgerufen wird
können an eine Variable gebunden werden
Copyright 2006 Thorsten Kamann
59. Die Syntax: Closures (Beispiele)
Beispiele:
{ name -> println name }
Copyright 2006 Thorsten Kamann
60. Die Syntax: Closures (Beispiele)
Beispiele:
{String x, int y -> println quot;hey $x the value is $yquot;}
Copyright 2006 Thorsten Kamann
61. Die Syntax: Closures (Beispiele)
Beispiele:
{ reader ->
while (true) {
line = reader.readLine()
}
}
Copyright 2006 Thorsten Kamann
62. Die Syntax – Collections (Listen)
Listen erzeugen immer eine Instanz von java.util.List
Copyright 2006 Thorsten Kamann
63. Die Syntax – Collections (Listen)
Listen erzeugen immer eine Instanz von java.util.List
def list = [5, 6, 7, 8]
assert list.get(2) == 7
assert list instanceof java.util.List
Copyright 2006 Thorsten Kamann
64. Die Syntax – Collections (Listen)
Listen erzeugen immer eine Instanz von java.util.List
def emptyList = []
assert emptyList.size() == 0
emptyList.add(5)
assert emptyList.size() == 1
Copyright 2006 Thorsten Kamann
65. Die Syntax – Collections (Ranges)
Ranges erzeugen Listen mit sequentiellen Werten
Copyright 2006 Thorsten Kamann
66. Die Syntax – Collections (Ranges)
Ranges erzeugen Listen mit sequentiellen Werten
Es gibt inklusive und exklusive Ranges
Copyright 2006 Thorsten Kamann
67. Die Syntax – Collections (Ranges)
Ranges erzeugen Listen mit sequentiellen Werten
Es gibt inklusive und exklusive Ranges
def range = 5..8
assert range.contains(6)
assert range.contains(8)
Copyright 2006 Thorsten Kamann
68. Die Syntax – Collections (Ranges)
Ranges erzeugen Listen mit sequentiellen Werten
Es gibt inklusive und exklusive Ranges
def range = 5..<8
assert range.contains(6)
assert !range.contains(8)
Copyright 2006 Thorsten Kamann
69. Die Syntax: Collections (Maps)
Maps basieren auf einer Implementierung von java.util.Map
Copyright 2006 Thorsten Kamann
70. Die Syntax: Collections (Maps)
Maps basieren auf einer Implementierung von java.util.Map
def map = [name:quot;Gromitquot;, likes:quot;cheesequot;, id:1234]
assert map.get(quot;namequot;) == quot;Gromitquot;
assert map[quot;namequot;] == quot;Gromitquot;
Copyright 2006 Thorsten Kamann
71. Die Syntax: Collections (Maps)
Maps basieren auf einer Implementierung von java.util.Map
def emptyMap = [:]
emptyMap.foo = 5
assert emptyMap.foo == 5
Copyright 2006 Thorsten Kamann
72. Die Syntax: Collections (Expando)
Expandos ermöglichen die Erzeugung von dynamischen
Objekten
Copyright 2006 Thorsten Kamann
73. Die Syntax: Collections (Expando)
Expandos ermöglichen die Erzeugung von dynamischen
Objekten
def player = new Expando()
player.name = quot;Peterquot;
player.greeting = { quot;Hello, my name is $player.namequot; }
assert player.greeting() == quot;Hello, my name is Peterquot;
Copyright 2006 Thorsten Kamann
74. Die Syntax: Collections (each)
Iterator mittels einer Closure
Copyright 2006 Thorsten Kamann
76. Die Syntax: Collections (collect)
Erzeugt eine neue Liste mit dem Ergebnis der Closure
Copyright 2006 Thorsten Kamann
77. Die Syntax: Collections (collect)
Erzeugt 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
78. Die Syntax: Collections (find)
Gibt das erste Element einer Collection zurück, welches der
Expression in der Closure entspricht
Copyright 2006 Thorsten Kamann
79. Die Syntax: Collections (find)
Gibt das erste Element einer Collection zurück, welches der
Expression in der Closure entspricht
def value = [1, 2, 3].find { it > 1 }
assert value == 2
Copyright 2006 Thorsten Kamann
80. Die Syntax: Collections (findAll)
Gibt eine Collection mit allen Elementen, die denen der
Expression in der Closure entsprechen, zurück
Copyright 2006 Thorsten Kamann
81. Die Syntax: Collections (findAll)
Gibt eine Collection mit allen Elementen, die denen der
Expression in der Closure entsprechen, zurück
def value = [1, 2, 3].findAll { it > 1 }
assert value == [2, 3]
Copyright 2006 Thorsten Kamann
82. Die Syntax: Collections (inject)
Fügt einen zusätzlichen Wert zu einer Iteration hinzu
Copyright 2006 Thorsten Kamann
83. Die Syntax: Collections (inject)
Fügt einen zusätzlichen Wert zu einer Iteration hinzu
def value = [quot;Javaquot;, quot;C#quot;, quot;C++quot;, quot;VBquot;]
.inject(quot;Languages: quot;){str, item -> str+quot; quot;+item}
assert value == „Languages: Java C# C++ VB“
Copyright 2006 Thorsten Kamann
84. Die Syntax: Collections (every)
Gibt true zurück, wenn alle Werte in der Collection der
Expression in der Closure entsprechen
Copyright 2006 Thorsten Kamann
85. Die Syntax: Collections (every)
Gibt true zurück, wenn alle Werte in der Collection der
Expression in der Closure entsprechen
def value = [1, 2, 3].every { it < 5 }
assert value
Copyright 2006 Thorsten Kamann
86. Die Syntax: Collections (every)
Gibt true zurück, wenn alle Werte in der Collection der
Expression in der Closure entsprechen
def value = [1, 2, 3].every { item -> item < 3 }
assert !value
Copyright 2006 Thorsten Kamann
87. Die Syntax: Collections (any)
Gibt true zurück, wenn mindestens ein Wert in der
Collection der Expression in der Closure entspricht
Copyright 2006 Thorsten Kamann
88. Die Syntax: Collections (any)
Gibt true zurück, wenn mindestens ein Wert in der
Collection der Expression in der Closure entspricht
def value = [1, 2, 3].any { item -> item > 3 }
assert value == false
Copyright 2006 Thorsten Kamann
89. Die Syntax: Collections (any)
Gibt true zurück, wenn mindestens ein Wert in der
Collection der Expression in der Closure entspricht
def value = [1, 2, 3].any { it > 2 }
assert value
Copyright 2006 Thorsten Kamann
90. Die Syntax: Collections (max/min)
Gibt den maximalen Wert einer Collection zurück. Die
Objekte in dieser Collection müssen Comparable sein
Copyright 2006 Thorsten Kamann
91. Die Syntax: Collections (max/min)
Gibt den maximalen Wert einer Collection zurück. Die
Objekte in dieser Collection müssen Comparable sein
def value = [9, 4, 2, 10, 5].max()
assert value == 10
Copyright 2006 Thorsten Kamann
92. Die Syntax: Collections (max/min)
Gibt den maximalen Wert einer Collection zurück. Die
Objekte in dieser Collection müssen Comparable sein
def value = [9, 4, 2, 10, 5].min()
assert value == 2
Copyright 2006 Thorsten Kamann
93. Die Syntax: Collections (max/min)
Gibt den maximalen Wert einer Collection zurück. Die
Objekte in dieser Collection müssen Comparable sein
def value = ['x', 'y', 'a', 'z'].min()
assert value == 'a'
Copyright 2006 Thorsten Kamann
94. Die Syntax: Collections (join)
Fügt einen String zu den Werten einer Collection hinzu
Copyright 2006 Thorsten Kamann
95. Die Syntax: Collections (join)
Fügt einen String zu den Werten einer Collection hinzu
def value = [1, 2, 3].join('-')
assert value == '1-2-3'
Copyright 2006 Thorsten Kamann
96. Die Syntax: Collections (Beispiele)
Ranges verwenden, um Teile von Listen zu extrahieren
def list = 100..200
def sub = list[1, 3, 20..25, 33]
assert sub == [101, 103, 120, 121, 122, 123, 124, 125, 133]
Copyright 2006 Thorsten Kamann
97. Die Syntax: Collections (Beispiele)
Rückwärts gerichtete Ranges
def text = quot;nice cheese gromit!quot;
def name = text[3..1]
assert name == quot;eciquot;
Copyright 2006 Thorsten Kamann
98. Die Syntax: Collections (Beispiele)
Negative Ranges – Index beginnt beim letzten Zeichen
def text = quot;nice cheese gromit!quot;
def x = text[-1]
assert x == quot;!quot;
Copyright 2006 Thorsten Kamann
99. Die Syntax: Collections (Beispiele)
Negative Ranges – Index beginnt beim letzten Zeichen
def text = quot;nice cheese gromit!quot;
def name = text[-7..-2]
assert name == quot;gromitquot;
Copyright 2006 Thorsten Kamann
100. Die Syntax: Looping (while)
Groovy unterstützt das aus Java bekannte while{..}
Konstrukt
Copyright 2006 Thorsten Kamann
101. Die Syntax: Looping (while)
Groovy unterstützt das aus Java bekannte while{..}
Konstrukt
def x = 0
def y = 5
while ( y-- > 0 ) {
x++
}
assert x == 5
Copyright 2006 Thorsten Kamann
102. Die Syntax: Looping (for)
Die for-Schleife ist einfacher und arbeitet mit Arrays und
Collections
Copyright 2006 Thorsten Kamann
103. Die Syntax: Looping (for)
Die for-Schleife ist einfacher und arbeitet mit Arrays und
Collections
def x = 0
for ( i in 0..9 ) {
x += i
}
assert x == 45
Copyright 2006 Thorsten Kamann
104. Die Syntax: Looping (for)
Die for-Schleife ist einfacher und arbeitet mit Arrays und
Collections
x = 0
for ( i in [0, 1, 2, 3, 4] ) {
x += i
}
assert x == 10
Copyright 2006 Thorsten Kamann
105. Die Syntax: Looping (each)
each ist eine Closure. Dadurch ist eine sehr kompakte
Abarbeitung von Schleifen möglich
Copyright 2006 Thorsten Kamann
106. Die Syntax: Looping (each)
each ist eine Closure. Dadurch ist eine sehr kompakte
Abarbeitung von Schleifen möglich
def stringList = [quot;javaquot;, quot;pythonquot;, quot;rubyquot;, quot;c#quot;, quot;groovyquot;]
stringList.each() { print quot; ${it}quot; };
// java python ruby c# groovy
Copyright 2006 Thorsten Kamann
107. Die Syntax: Looping (each)
each ist eine Closure. Dadurch ist eine sehr kompakte
Abarbeitung von Schleifen möglich
def stringMap = [quot;Suquot; : quot;Sundayquot;, quot;Moquot; : quot;Mondayquot;]
stringMap.each() { key, value ->
println quot;${key} == ${value}quot; };
// Su == Sunday
// Mo == Monday
Copyright 2006 Thorsten Kamann
108. Die Syntax: Looping (eachWithIndex)
Unterscheidet sich vom Looping mit each dadurch, dass ein
Index mitgeführt wird
Copyright 2006 Thorsten Kamann
109. Die Syntax: Looping (eachWithIndex)
Unterscheidet sich vom Looping mit each dadurch, dass ein
Index mitgeführt wird
def stringList = [quot;javaquot;, quot;pythonquot;, quot;rubyquot;, quot;c#quot;, quot;groovyquot;]
stringList.eachWithIndex() {
obj, i -> println quot; ${i}: ${obj}quot; };
// 0: java 1: python 2: ruby 3: c# 4: groovy
Copyright 2006 Thorsten Kamann
110. Die Syntax: Looping (eachWithIndex)
Unterscheidet sich vom Looping mit each dadurch, dass ein
Index mitgeführt wird
def stringMap = [quot;Suquot; : quot;Sundayquot;, quot;Moquot; : quot;Mondayquot;]
stringMap.eachWithIndex() {
obj, i -> println quot; ${i}: ${obj}quot; };
// 0: Su=Sunday
// 1: Mo=Monday
Copyright 2006 Thorsten Kamann
111. Die Syntax: Conditions (if...else)
Groovy unterstützt die aus Java bekannten if...else
Konstrukte
Copyright 2006 Thorsten Kamann
112. Die Syntax: Conditions (if...else)
Groovy unterstützt die aus Java bekannten if...else
Konstrukte
def x = (y > 1) ? quot;workedquot; : quot;failedquot;
if (x){
...
}else{
...
}
Copyright 2006 Thorsten Kamann
113. Die Syntax: Conditions (switch)
Das switch-Statement unterstützt Klassenvergleiche,
Inhalte von Collections (Lists, Ranges), reguläre Ausdrücke
und equals Vergleiche
Copyright 2006 Thorsten Kamann
114. Die Syntax: Conditions (switch)
Das switch-Statement unterstützt Klassenvergleiche,
Inhalte von Collections (Lists, Ranges), reguläre Ausdrücke
und equals Vergleiche
switch ( x ) {
case („foo“): ...
case (20..30): ...
case (Integer): ...
default: ...
}
Copyright 2006 Thorsten Kamann
115. XML
Proc e s s ing
Copyright 2006 Thorsten Kamann
129. GroovyMarkup
Groovy bietet Unterstützung für die Arbeit mit Markup-
Languages:
XML, HTML, SAX, W3C DOM, Ant Tasks, Swing UI's
GroovyMarkup bietet eine einheitliche Schnittstelle
Elemente sind Closures
Attribute sind Maps
Copyright 2006 Thorsten Kamann
130. GroovyMarkup
Groovy bietet Unterstützung für die Arbeit mit Markup-
Languages:
XML, HTML, SAX, W3C DOM, Ant Tasks, Swing UI's
GroovyMarkup bietet eine einheitliche Schnittstelle
Elemente sind Closures
Attribute sind Maps
Vollständige Integration anderer Groovy-Features
Collections, Arrays, Conditions, ...
Copyright 2006 Thorsten Kamann
137. GPath
Ist eine Expression-Language für Daten mit Baumstrukturen
Implementierung für XML
Pfade zu einem Element können spezifiziert werden
a.b.c findet alle <c>-Elemente innerhalb aller <b>
innerhalb aller <a>
Copyright 2006 Thorsten Kamann
138. GPath
Ist eine Expression-Language für Daten mit Baumstrukturen
Implementierung für XML
Pfade zu einem Element können spezifiziert werden
a.b.c findet alle <c>-Elemente innerhalb aller <b>
innerhalb aller <a>
Auch Attribute können spezifiziert werden
a[quot;@hrefquot;] -> findet alle href-Attribute in <a>-
Elementen
a.@href -> eine Alternativ-Syntax dazu
Copyright 2006 Thorsten Kamann
141. GroovyBeans
GroovyBeans sind wie JavaBeans, nur einfacher zu
definieren
Customer.groovy:
class Customer {
int id
String name
}
Copyright 2006 Thorsten Kamann
142. GroovyBeans
GroovyBeans sind wie JavaBeans, nur einfacher zu
definieren
Customer.groovy: Customer.java:
class Customer { public class Customer {
int id private int id = 0;
String name private String name;
}
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
...
}
Copyright 2006 Thorsten Kamann
143. GroovyBeans
Regeln für Properties:
Wenn eine Property als private gekennzeichnet ist,
wird ein Java Field benutzt, um diese Property zu
repräsentieren
Copyright 2006 Thorsten Kamann
144. GroovyBeans
Regeln für Properties:
Wenn eine Property als public oder protected
gekennzeichnet wird, werden Getter- und Setter-
Methoden mit der gleichen Sichtbarkeit und ein Feld mit
der Sichtbarkeit private auf Bytecode-Ebene erzeugt
Copyright 2006 Thorsten Kamann
145. GroovyBeans
Regeln für Properties:
Wenn keine Getter- oder Setter-Methoden für Properties
mit der Sichtbarkeit public oder protected deklariert
wurden, werden fehlende Getter- und Setter-Methoden
mit der gleichen Sichtbarkeit automatisch auf Bytecode-
Ebene erzeugt
Copyright 2006 Thorsten Kamann
146. GroovyBeans
Regeln für Properties:
Mit selbst deklarierten Getter- und Setter-Methoden
können die von der Groovy-Runtime generierten
Methoden überschrieben werden
Copyright 2006 Thorsten Kamann
149. Reguläre Ausdrücke
Reguläre Ausdrücke werden von Groovy nativ unterstützt
Die ~quot;...quot; Expression wird automatisch in ein Java-Pattern
Objekt kompiliert
Copyright 2006 Thorsten Kamann
150. Reguläre Ausdrücke
Reguläre Ausdrücke werden von Groovy nativ unterstützt
Die ~quot;...quot; Expression wird automatisch in ein Java-Pattern
Objekt kompiliert
=~ Create Matcher
Copyright 2006 Thorsten Kamann
151. Reguläre Ausdrücke
Reguläre Ausdrücke werden von Groovy nativ unterstützt
Die ~quot;...quot; Expression wird automatisch in ein Java-Pattern
Objekt kompiliert
=~ Create Matcher
assert quot;cheesecheesequot; =~ /cheese/
Copyright 2006 Thorsten Kamann
152. Reguläre Ausdrücke
Reguläre Ausdrücke werden von Groovy nativ unterstützt
Die ~quot;...quot; Expression wird automatisch in ein Java-Pattern
Objekt kompiliert
=~ Create Matcher
assert quot;cheesecheesequot; =~ /cheese/
==~ Matches Regex
Copyright 2006 Thorsten Kamann
153. Reguläre Ausdrücke
Reguläre Ausdrücke werden von Groovy nativ unterstützt
Die ~quot;...quot; Expression wird automatisch in ein Java-Pattern
Objekt kompiliert
=~ Create Matcher
assert quot;cheesecheesequot; =~ /cheese/
==~ Matches Regex
assert quot;cheesecheesequot; ==~ /.*ees.*/
Copyright 2006 Thorsten Kamann
156. Grails
Grails ist ein Webapplication-Framework
Es vereinfacht die Entwicklung von Webanwendungen durch
das Coding By Convention-Paradigma
Copyright 2006 Thorsten Kamann
157. Grails
Grails ist ein Webapplication-Framework
Es vereinfacht die Entwicklung von Webanwendungen durch
das Coding By Convention-Paradigma
die Verwendung von Spring/Hibernate
Copyright 2006 Thorsten Kamann
158. Grails
Grails ist ein Webapplication-Framework
Es vereinfacht die Entwicklung von Webanwendungen durch
das Coding By Convention-Paradigma
die Verwendung von Spring/Hibernate
eigene GSP (Groovy Server Pages) mit dynamischen
TagLibraries
Copyright 2006 Thorsten Kamann
164. Grails
Die zentrale Komponente ist die Domänenklasse (Entity)
Daraus können der Controller und die Views für eine CRUD-
Anwendung generiert werden
Copyright 2006 Thorsten Kamann
165. Grails
Die zentrale Komponente ist die Domänenklasse (Entity)
Daraus können der Controller und die Views für eine CRUD-
Anwendung generiert werden
Anbindung an Enterprise-Systeme kann über SpringBeans
erfolgen
Copyright 2006 Thorsten Kamann
166. Grails
Die zentrale Komponente ist die Domänenklasse (Entity)
Daraus können der Controller und die Views für eine CRUD-
Anwendung generiert werden
Anbindung an Enterprise-Systeme kann über SpringBeans
erfolgen
Als View-Technologie ist zur Zeit JSP und GSP vorgesehen
Copyright 2006 Thorsten Kamann
167. Grails
Die zentrale Komponente ist die Domänenklasse (Entity)
Daraus können der Controller und die Views für eine CRUD-
Anwendung generiert werden
Anbindung an Enterprise-Systeme kann über SpringBeans
erfolgen
Als View-Technologie ist zur Zeit JSP und GSP vorgesehen
Eclipse Integration ist in Arbeit
Copyright 2006 Thorsten Kamann
168. Grails
Die zentrale Komponente ist die Domänenklasse (Entity)
Daraus können der Controller und die Views für eine CRUD-
Anwendung generiert werden
Anbindung an Enterprise-Systeme kann über SpringBeans
erfolgen
Als View-Technologie ist zur Zeit JSP und GSP vorgesehen
Eclipse Integration ist in Arbeit
Sehr leichte Integration in eine MDSD-Umgebung
Copyright 2006 Thorsten Kamann
171. GORM
Ist der OR-Mapper für Grails
Unter der Haube wird Hibernate 3 verwendet
Copyright 2006 Thorsten Kamann
172. GORM
Ist der OR-Mapper für Grails
Unter der Haube wird Hibernate 3 verwendet
Die Konfiguration wird komplett in den Groovy-Files
vorgenommen
Copyright 2006 Thorsten Kamann
173. GORM
Ist der OR-Mapper für Grails
Unter der Haube wird Hibernate 3 verwendet
Die Konfiguration wird komplett in den Groovy-Files
vorgenommen
Alle Features von Hibernate werden unterstützt
Copyright 2006 Thorsten Kamann
174. GORM
Ist der OR-Mapper für Grails
Unter der Haube wird Hibernate 3 verwendet
Die Konfiguration wird komplett in den Groovy-Files
vorgenommen
Alle Features von Hibernate werden unterstützt
In Verbindung mit Spring ist es möglich, Transaktionen in
Grails-Anwendungen flexibel zu verwalten
Copyright 2006 Thorsten Kamann
177. Groovlets
Groovlets sind Java-Servlets in Groovy geschrieben
Es gibt ein GroovyServlet, welches Groovy-Skripte
automatisch kompiliert, ausführt und cached
Copyright 2006 Thorsten Kamann
178. Groovlets
Groovlets sind Java-Servlets in Groovy geschrieben
Es gibt ein GroovyServlet, welches Groovy-Skripte
automatisch kompiliert, ausführt und cached
Copyright 2006 Thorsten Kamann
179. Groovlets
Implizite Variablen:
Variable Gebunden an Bemerkung
Request ServletRequest
Response ServletResponse
Context ServletContext
Application ServletContext
Session getSession(false)
Out response.getWriter() Können nicht re-assigned werden
Cout response.getOutputStream() Können nicht re-assigned werden
Html new MarkupBuilder(out) Können nicht re-assigned werden
Copyright 2006 Thorsten Kamann
183. GSQL
Vereinfacht das Arbeiten mit SQL
Unterstützung von SQL-Queries und -Statements
Closures bieten komfortables Arbeiten mit den ResultSets
Copyright 2006 Thorsten Kamann
184. GSQL
Vereinfacht das Arbeiten mit SQL
Unterstützung von SQL-Queries und -Statements
Closures bieten komfortables Arbeiten mit den ResultSets
def sql = Sql.newInstance(quot;urlquot;, quot;userquot;,quot;pwdquot;, quot;driverquot;)
sql.eachRow(quot;select * from FOOD where type=${foo}quot;) {
println quot;Gromit likes ${it.name}quot;
}
Copyright 2006 Thorsten Kamann
185. GSQL
Vereinfacht das Arbeiten mit SQL
Unterstützung von SQL-Queries und -Statements
Closures bieten komfortables Arbeiten mit den ResultSets
def sql = Sql.newInstance(quot;urlquot;, quot;userquot;,quot;pwdquot;, quot;driverquot;)
def food = sql.dataSet('FOOD')
def cheese = food.findAll { it.type == 'cheese' }
cheese.each { println quot;Eat ${it.name}quot; }
Copyright 2006 Thorsten Kamann
188. Ant-Scripting
Bietet eine Schnittstelle, um Ant-Tasks per Groovy-Script zu
erstellen und zu benutzen
ant = new AntBuilder()
ant.echo(message:quot;mapping it via attribute!quot;)
ant.echo(quot;Hello World!quot;)
Copyright 2006 Thorsten Kamann
189. Ant-Scripting
Bietet eine Schnittstelle, um Ant-Tasks per Groovy-Script zu
erstellen und zu benutzen
ant = new AntBuilder()
try{
ant.javac(srcdir:quot;/srcquot;, destdir:quot;/dest/quot; )
}catch(Throwable thr){
ant.mail(mailhost:quot;hostquot;, subject:quot;build failurequot;){
from(address:quot;buildmaster@anywhere.comquot;),
to(address:quot;dev-team@anywhere.comquot;)
message(quot;Unable to compile sources.quot;)
}
}
Copyright 2006 Thorsten Kamann
191. Groovy Templates
Bietet ein Framework, um eine eigene Template-Engine zu
entwickeln
Copyright 2006 Thorsten Kamann
192. Groovy Templates
Bietet ein Framework, um eine eigene Template-Engine zu
entwickeln
Enthalten ist die SimpleTemplateEngine, die JSP-like
mittels Scripts, Scriptlets und EL parameterisierte Texte
generieren kann
Copyright 2006 Thorsten Kamann
193. Groovy Templates (Beispiel)
def text = 'Dear quot;${firstname} ${lastname}quot;,nSo nice to
meet you in <% print city %>.'
def binding = [quot;firstnamequot;:quot;Peterquot;, quot;lastnamequot;:quot;Schulzequot;,
quot;cityquot;:quot;Dortmundquot;]
def engine = new SimpleTemplateEngine()
template = engine.createTemplate(text).make(binding)
def result = 'Dear quot;Peter Schulzequot;,nSo nice to meet you in
Dortmund.'
assert result == template.toString()
Copyright 2006 Thorsten Kamann
194. S ic he rhe it
Copyright 2006 Thorsten Kamann
197. Sicherheit
Groovy-Skripte können innerhalb des Java Security-
Managers ausgeführt werden
security.policy:
grant codeBase quot;file:/serverCodeBase/restrictedClientquot; {
permission java.security.AllPermission;
};
Copyright 2006 Thorsten Kamann
198. Sicherheit
Groovy-Skripte können innerhalb des Java Security-
Managers ausgeführt werden
security.policy:
grant codeBase quot;file:/serverCodeBase/restrictedClientquot; {
permission java.security.AllPermission;
};
Java-Code:
new GroovyShell().evaluate(
new GroovyCodeSource(
clientscriptStr,
quot;RestrictedScriptquot;,
quot;/serverCodeBase/restrictedClientquot;)
Copyright 2006 Thorsten Kamann
200. Scriptom
Scriptom ist ein optionales Modul für die Verwendung mit
dem Windows Scripting Host oder OLE COM Automation
Copyright 2006 Thorsten Kamann
201. Scriptom
Scriptom ist ein optionales Modul für die Verwendung mit
dem Windows Scripting Host oder OLE COM Automation
import org.codehaus.groovy.scriptom.ActiveXProxy
def explorer = new
ActiveXProxy(quot;InternetExplorer.Applicationquot;)
explorer.Visible = true
explorer.AddressBar = true
explorer.Navigate(quot;http://www.itemis.de/quot;)
Copyright 2006 Thorsten Kamann
202. Scriptom
Scriptom ist ein optionales Modul für die Verwendung mit
dem Windows Scripting Host oder OLE COM Automation
import org.codehaus.groovy.scriptom.ActiveXProxy
import java.io.File
def word = new ActiveXProxy(quot;Word.Applicationquot;)
word.Documents.Open(new File(args[0]).canonicalPath)
word.ActiveDocument.SaveAs(new File(args[0] - quot;.docquot; +
quot;.htmlquot;).canonicalPath, 8)
word.Quit()
Copyright 2006 Thorsten Kamann
204. Weitere Module
Gant
Gant ist ein Build-Tool auf Basis von Ant. Anstatt XML zu
verwenden, wird ein Groovy-Dialekt benutzt, um die Ant-
Targets und -Tasks zu konfigurieren.
Copyright 2006 Thorsten Kamann
205. Weitere Module
Google Data Support
Google bietet den Zugriff auf seine Services. Mit Google
Data Support wird der Zugriff darauf wesentlich
vereinfacht.
Copyright 2006 Thorsten Kamann
207. Weitere Module
Groovy Jabber-RPC
Damit können XML-RPC Aufrufe über das Jabber-Protokol
abgesetzt werden. Bietet die Möglichkeit sowohl einen
Server als auch einen Client zu erstellen.
Copyright 2006 Thorsten Kamann
208. Weitere Module
Groovy Monkey
Groovy Monkey ist ein Port des Eclipse-Monkey Projekts.
Damit kann Eclipse über Groovy-Scripts automatisiert
werden.
Copyright 2006 Thorsten Kamann
209. Weitere Module
Groovy SOAP
Damit können sowohl ein Soap-Server als auch ein Soap-
Client erstellt werden.
Copyright 2006 Thorsten Kamann
211. Weitere Module
Process
Wird auch GrooSH – Groovy Shell – genannt. Hiermit ist es
möglich Funktionen einer (Unix-)Shell nachzubilden.
Copyright 2006 Thorsten Kamann
238. IDE-Support (Groovy Monkey)
Groovy Monkey ist ein Aufsatz auf Eclipse Monkey
Damit kann Eclipse geskriptet werden
Copyright 2006 Thorsten Kamann
239. IDE-Support (Groovy Monkey)
Groovy Monkey ist ein Aufsatz auf Eclipse Monkey
Damit kann Eclipse geskriptet werden
Nützlich für
Automatisierungs-Task (Quelltext-Suche, Erstellen von
Tasks)
Copyright 2006 Thorsten Kamann
240. IDE-Support (Groovy Monkey)
Groovy Monkey ist ein Aufsatz auf Eclipse Monkey
Damit kann Eclipse geskriptet werden
Nützlich für
Automatisierungs-Task (Quelltext-Suche, Erstellen von
Tasks)
Erstellen von LaunchManagern
Copyright 2006 Thorsten Kamann
241. IDE-Support (Groovy Monkey)
Groovy Monkey ist ein Aufsatz auf Eclipse Monkey
Damit kann Eclipse geskriptet werden
Nützlich für
Automatisierungs-Task (Quelltext-Suche, Erstellen von
Tasks)
Erstellen von LaunchManagern
Prototyping von Plugins
Copyright 2006 Thorsten Kamann
242. IDE-Support (Groovy Monkey)
Groovy Monkey ist ein Aufsatz auf Eclipse Monkey
Damit kann Eclipse geskriptet werden
Nützlich für
Automatisierungs-Task (Quelltext-Suche, Erstellen von
Tasks)
Erstellen von LaunchManagern
Prototyping von PlugIns
Basiert auf dem Eclipse-Job API
Copyright 2006 Thorsten Kamann
243. Zus a mme n-
Fa s s ung
Copyright 2006 Thorsten Kamann
245. Zusammenfassung
Groovy ist schon sehr weit fortgeschritten
Es gibt eine grosse Anzahl an zusätzlichen Modulen, die die
meisten Anwendungsfälle abdecken
Copyright 2006 Thorsten Kamann
246. Zusammenfassung
Groovy ist schon sehr weit fortgeschritten
Es gibt eine grosse Anzahl an zusätzlichen Modulen, die die
meisten Anwendungsfälle abdecken
Durch die Standardisierung (JSR 241) ist auch eine gewisse
Zukunftssicherheit gewährleistet
Copyright 2006 Thorsten Kamann
247. Zusammenfassung
Groovy ist schon sehr weit fortgeschritten
Es gibt eine grosse Anzahl an zusätzlichen Modulen, die die
meisten Anwendungsfälle abdecken
Durch die Standardisierung (JSR 241) ist auch eine gewisse
Zukunftssicherheit gewährleistet
Groovy ist leicht erlernbar, da sehr viele Ähnlichkeiten mit
der Java-Syntax bestehen
Copyright 2006 Thorsten Kamann
248. Zusammenfassung
Groovy ist schon sehr weit fortgeschritten
Es gibt eine grosse Anzahl an zusätzlichen Modulen, die die
meisten Anwendungsfälle abdecken
Durch die Standardisierung (JSR 241) ist auch eine gewisse
Zukunftssicherheit gewährleistet
Groovy ist leicht erlernbar, da sehr viele Ähnlichkeiten mit
der Java-Syntax bestehen
Neben dem leistungsfähigen API von Groovy steht die
gesamte API von Java zur Verfügung
Copyright 2006 Thorsten Kamann