ninja tricks for groovy system scripting for jdk.io 2016
TRANSCRIPT
![Page 1: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/1.jpg)
01
![Page 2: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/2.jpg)
About me02
![Page 3: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/3.jpg)
Andrey AdamovichJava/Groovy developer
DevOps guy, automation junkie
Coauthor of Groovy 2 Cookbook
Coorganizer of @latcraft and @devternity
••••
03
![Page 4: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/4.jpg)
Exposed to operationsMaintenance scripts (backup, cleaning, monitoring)
Scheduled/CRON jobs (transfers, conversions, notifications)
Automation tasks (deployment, packaging, testing)
Web applications (status pages, back doors, dashboards)
••••
04
![Page 5: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/5.jpg)
Why Groovy?05
![Page 6: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/6.jpg)
Native system scriptingBash, Dash, Zsh, Fish, Csh etc.
Bat, Cmd and, eventually, PowerShell (PoSH)••
06
![Page 7: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/7.jpg)
Arrays in BAT?
07
![Page 8: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/8.jpg)
BASH vs. PoSH
08
![Page 9: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/9.jpg)
Scripting languagesPerl
Python
Ruby
Lua
Javascript
...
••••••
09
![Page 10: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/10.jpg)
Multiplatformsupport
10
![Page 11: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/11.jpg)
Does it workon Windows?
11
![Page 12: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/12.jpg)
Operationalsimplicity
12
![Page 13: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/13.jpg)
Maintainablecode
13
![Page 14: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/14.jpg)
Stableecosystem14
![Page 15: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/15.jpg)
Richextensionlibrary
15
![Page 16: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/16.jpg)
Groovy is just a JAR
16
![Page 17: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/17.jpg)
Reuse JVMknowledge17
![Page 18: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/18.jpg)
sdkman.io
18
![Page 19: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/19.jpg)
sdkman.iocurl ‐s http://get.sdkman.io | bash
sdk install groovy 2.4.6
sdk default groovy 2.4.6
sdk list groovy
01.
02.
03.
04.
19
![Page 20: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/20.jpg)
PoSH GVMInstall‐Module posh‐gvm
Import‐Module posh‐gvm
gvm help
01.
02.
03.
20
![Page 21: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/21.jpg)
Speed up!21
![Page 22: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/22.jpg)
GroovyServ
22
![Page 23: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/23.jpg)
Files,directories,and otheranimals23
![Page 24: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/24.jpg)
Readingf = new File('test.txt')
String textContent = f.text
byte[] binaryContent = file.bytes
01.
02.
03.
24
![Page 25: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/25.jpg)
Writing If << 'hello, this is a test file'
f.text = new URL('http://server/my_data.json').text
file.bytes = [ 65, 66, 67, 68 ] as byte[]
01.
02.
03.
25
![Page 26: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/26.jpg)
Writing IIfile.text = '''What's in a name? That which we call a rose
By any other name would smell as sweet.'''
file << 'What\'s in a name? That which we call a rose\n'
file << 'By any other name would smell as sweet.'
01.
02.
03.04.
05.
26
![Page 27: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/27.jpg)
Writing IIIfile.withWriter { Writer writer ‐>
writer << 'What\'s in a name? That which we call a rose\n'
writer << 'By any other name would smell as sweet.'
}
file.withOutputStream { OutputStream stream ‐>
stream << 'What\'s in a name? That which we call a rose\n'
stream << 'By any other name would smell as sweet.'
}
01.
02.
03.
04.
05.06.
07.
08.
09.
27
![Page 28: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/28.jpg)
Linebylinedef lines = f.readLines()
lines.each { String line ‐>
println line
}
01.
02.
03.
04.
28
![Page 29: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/29.jpg)
eachLine and eachBytef.eachLine { String line ‐>
println line
}
file.eachByte { int b ‐>
...
}
01.
02.
03.
04.
05.
06.
29
![Page 30: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/30.jpg)
Filtering IoutputFile.withPrintWriter { writer ‐>
inputFile.eachLine { line ‐>
if (!line.startsWith('#')) {
writer.println(line)
}
}
}
01.
02.
03.
04.
05.
06.
07.
30
![Page 31: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/31.jpg)
Filtering IIinputFile.filterLine(outputFile.newWriter()) { line ‐>
!line.startsWith('#')
}
01.
02.
03.
31
![Page 32: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/32.jpg)
Filtering IIIoutputFile.withWriter { Writer writer ‐>
inputFile.withReader { Reader reader ‐>
reader.transformLine(writer) { String line ‐>
line.replaceAll('\t', ' ')
}
}
}
01.
02.
03.
04.
05.
06.
07.
32
![Page 33: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/33.jpg)
Filtering IVinputFile.withReader { reader ‐>
reader.transformLine(outputFile.newWriter()) { line ‐>
line.replaceAll('\t', ' ')
}
}
01.
02.
03.
04.
05.
33
![Page 34: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/34.jpg)
Filtering VoutputFile.text = inputFile.text.replaceAll('\t', ' ')01.
34
![Page 35: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/35.jpg)
Walking thepath
35
![Page 36: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/36.jpg)
eachFile and eachDirf.eachFile { File file ‐>
...
}
f.eachDir { File dir ‐>
...
}
01.
02.
03.
04.
05.
06.
36
![Page 37: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/37.jpg)
Recursive walking IcurrentDir.eachFileRecurse { File file ‐>
println file.name
}
currentDir.eachDirRecurse { File dir ‐>
println dir.name
}
01.
02.
03.
04.
05.
06.
37
![Page 38: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/38.jpg)
Recursive walking IIcurrentDir.traverse { File file ‐>
if (file.name.endsWith('.groovy')) {
println file.name
}
}
01.
02.
03.
04.
05.
38
![Page 39: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/39.jpg)
Recursive walking IIIcurrentDir.traverse(nameFilter: ~/.*\.groovy/) { File file ‐>
println file.name
}
01.
02.
03.
39
![Page 40: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/40.jpg)
Recursive walking IVimport static groovy.io.FileType.*
...
currentDir.traverse(
type: FILES,
nameFilter: ~/.*\.groovy/,
excludeNameFilter: ~/^C.*$/) { File file ‐>
println file.name
}
01.
02.
03.
04.
05.
06.
07.
08.
40
![Page 41: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/41.jpg)
Extending File IFile.metaClass.safeDelete = {
if (exists()) {
if (isDirectory()) {
if (!deleteDir()) {
def msg = "Unable to delete a directory: ${name}"
throw new IOException(msg)
}
...
01.
02.
03.
04.
05.
06.
07.
08.
41
![Page 42: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/42.jpg)
Extending File II ...
} else {
if (!delete()) {
def msg = "Unable to delete a file: ${name}"
throw new IOException(msg)
}
}
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09. 42
![Page 43: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/43.jpg)
Extending File IIIFile f = new File('test.txt')
f.safeDelete()
File d = new File('test_dir')
d.safeDelete()
01.
02.
03.
04.
43
![Page 44: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/44.jpg)
Base script44
![Page 45: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/45.jpg)
Base script IBaseScript.groovy :
abstract class BaseScript extends Script {
static {
File.metaClass.safeDelete = {
if (exists()) {
...
}
}
01.
02.
03.
04.
05.
06.
07.
45
![Page 46: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/46.jpg)
Base script IIdelete.groovy :
new File('idonotexist.txt').safeDelete()01.
46
![Page 47: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/47.jpg)
Base script IIIgroovy ‐b BaseScript delete.groovy01.
47
![Page 48: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/48.jpg)
Externalcommands48
![Page 49: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/49.jpg)
External commands Idef exitValue = "ls ‐l".execute().exitValue()
if (!exitValue) {
println "Command failed with exit code: ${exitValue}"
}
01.
02.
03.
04.
49
![Page 50: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/50.jpg)
External commands IIprintln "ls".execute().text()
println "ls".execute().inputStream.eachLine { println it }
"grep abc".execute().waitForOrKill(1000)
01.
02.
03.
50
![Page 51: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/51.jpg)
External commands IIIProcess process = "command".execute()
def out = new StringBuffer()
def err = new StringBuffer()
process.waitForProcessOutput(out, err)
01.
02.
03.
04.
51
![Page 52: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/52.jpg)
External commands IV"less temp.txt".execute().pipeTo("grep error".execute()).text
def proc1 = "less temp.txt".execute()
def proc2 = "grep error".execute()
proc1 | proc2
println proc2.text
01.
02.
03.
04.
05.
52
![Page 53: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/53.jpg)
Arguments53
![Page 54: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/54.jpg)
CliBuilderdef cli = new CliBuilder(usage:'ls')
cli.a('display all files')
cli.l('use a long listing format')
cli.t('sort by modification time')
def options = cli.parse(args)
01.
02.
03.
04.
05.
54
![Page 55: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/55.jpg)
Defensivescripting
55
![Page 56: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/56.jpg)
Do you likeNPEs?
56
![Page 57: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/57.jpg)
Even simple things can cause NPEJava:
System.out.println(user.
getAddress().
getCity())
Groovy:
println user.
address.
city
01.
02.
03.
01.
02.
03. 57
![Page 58: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/58.jpg)
Safe navigation operator (?.)println user?.
address?.
city
01.
02.
03.
58
![Page 59: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/59.jpg)
Elvis operator (?:)println user?.
address?.
city ?: "No idea"
01.
02.
03.
59
![Page 60: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/60.jpg)
Closures forDSLs
60
![Page 61: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/61.jpg)
Imaginary DSLtransaction {
request {
id = '2L'
name = 'PUT'
amount = 25
}
request {
...
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.61
![Page 62: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/62.jpg)
DSL: transaction() methoddef transaction(Closure cl) {
def processor = new RequestProcessor()
try {
processor.init()
cl.delegate = processor
cl()
sendRequests()
} finally {
processor.cleanup()
}}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.62
![Page 63: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/63.jpg)
DSL: request() methodclass RequestProcessor {
def requests = []
def request(Closure cl) {
def request = new Request()
requests << request
cl.delegate = request
cl()
}
...
01.
02.
03.
04.
05.
06.
07.
08.
09. 63
![Page 64: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/64.jpg)
DSL: Request structureclass Request {
String id
String name
String amount
}
01.
02.
03.
04.
05.
64
![Page 65: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/65.jpg)
Datamanipulation
65
![Page 66: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/66.jpg)
XMLimport groovy.util.XmlSlurper
def xmlSource = new File('shakespeare.xml')
def bibliography = new XmlSlurper().parse(xmlSource)
println bibliography.author
bibliography.play
.findAll { it.year.toInteger() > 1592 }
.each { println it.title }
01.
02.
03.
04.
05.
06.
07.
66
![Page 67: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/67.jpg)
JSONimport groovy.json.JsonSlurper
def reader = new FileReader('ui.json')
def ui = new JsonSlurper().parse(reader)
ui.items.each { println it.type }
println ui.items[0]
.axes
.find {
it.fields.contains('y')
}.title
01.
02.
03.
04.
05.
06.
07.
08.
09. 67
![Page 68: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/68.jpg)
Grab yourstuff!
68
![Page 69: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/69.jpg)
@Grab: import@Grab('org.apache.httpcomponents:httpclient:4.2.1')
import org.apache.http.impl.client.DefaultHttpClient
import org.apache.http.client.methods.HttpGet
01.
02.
03.
69
![Page 70: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/70.jpg)
@Grab: variable@Grab('org.apache.httpcomponents:httpclient:4.2.1')
def httpClient =
new org.apache.http.impl.client.DefaultHttpClient()
01.
02.
03.
70
![Page 71: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/71.jpg)
@Grab: method@Grab('org.apache.httpcomponents:httpclient:4.2.1')
def getHttpClient() {
new org.apache.http.impl.client.DefaultHttpClient()
}
01.
02.
03.
04.
71
![Page 72: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/72.jpg)
@Grab: class@Grab('org.apache.httpcomponents:httpclient:4.2.1')
class Searcher {
def httpClient
Searcher() {
httpClient =
new org.apache.http.impl.client.DefaultHttpClient()
}
}
01.
02.
03.
04.
05.
06.
07.
08.
72
![Page 73: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/73.jpg)
@Grab: multiple@Grapes([
@Grab('org.apache.httpcomponents:httpclient:4.2.1'),
@Grab('org.ccil.cowan.tagsoup:tagsoup:1.2')])
class Searcher { ... }
01.
02.
03.
04.
73
![Page 74: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/74.jpg)
@Grab: repository@GrabResolver(name='codehaus',
root='http://repository.codehaus.org/')
class Searcher { ... }
01.
02.
03.
74
![Page 75: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/75.jpg)
@Grab: exclude@GrabExclude(group='commons‐codec',
module='commons‐codec')
class Searcher { ... }
01.
02.
03.
75
![Page 76: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/76.jpg)
HTTP76
![Page 77: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/77.jpg)
HTTPBuilder: import@Grab(
group='org.codehaus.groovy.modules.http‐builder',
module='http‐builder',
version='0.6'
)
import groovyx.net.http.*
01.
02.
03.
04.
05.
06.
77
![Page 78: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/78.jpg)
HTTPBuilder: instantiationdef baseUrl = 'http://api.duckduckgo.com'
def queryString = 'q=groovy&format=json&pretty=1'
def http = new HTTPBuilder(baseUrl)
01.
02.
03.
78
![Page 79: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/79.jpg)
HTTPBuilder: requesthttp.request(Method.POST) {
send ContentType.URLENC, queryString
response.success = { response, reader ‐>
println response.statusLine
println reader.text
}
response.failure = { response ‐>
println response.statusLine
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.79
![Page 80: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/80.jpg)
SQL80
![Page 81: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/81.jpg)
SQL: settingsimport groovy.sql.Sql
def dbSettings = [
url: 'jdbc:hsqldb:hsql://localhost/cookingdb',
driver: 'org.hsqldb.jdbcDriver',
user: 'sa',
password: ''
]
01.
02.03.
04.
05.
06.
07.
08.
81
![Page 82: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/82.jpg)
SQL: querydef sql = Sql.newInstance(dbSettings)
sql.eachRow('SELECT * FROM COOKBOOK') { cookbook ‐>
printf '%‐20s%s\n',
cookbook.id,
cookbook[1]
}
01.
02.03.
04.
05.
06.
07.
82
![Page 83: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/83.jpg)
Groovy as a server (GaaS?)> groovy ‐l 4444 ‐e "println new Date()" &
> telnet localhost 4444
hey groovy give me the date
Wed Feb 04 10:03:23 EET 2015
01.
02.
03.
04.
83
![Page 84: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/84.jpg)
Ratpack84
![Page 85: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/85.jpg)
Ratpack: import@Grab("io.ratpack:ratpack‐groovy:1.1.1")
import static ratpack.groovy.Groovy.ratpack
01.
02.
85
![Page 86: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/86.jpg)
Ratback: script bodyratpack {
handlers {
get {
response.send "This is the app root (try: /date)"
}
get("date") {
response.send new Date().toString()
}
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.86
![Page 87: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/87.jpg)
Sshoogr87
![Page 88: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/88.jpg)
Sshoogr: import@Grab(
group='com.aestasit.infrastructure.sshoogr',
module='sshoogr',
version='0.9.16')
import static com.aestasit.ssh.DefaultSsh.*
01.
02.
03.
04.
05.
88
![Page 89: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/89.jpg)
Sshoogr: defaultsdefaultUser = 'root'
defaultKeyFile = new File('secret.pem')
execOptions {
verbose = true
showCommand = true
}
01.
02.
03.
04.
05.
06.
89
![Page 90: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/90.jpg)
Sshoogr: connectionremoteSession {
url = 'user2:654321@localhost:2222'
exec 'rm ‐rf /tmp/*'
exec 'touch /var/lock/my.pid'
remoteFile('/var/my.conf').text = "enabled=true"
}
01.
02.
03.
04.
05.
06.
90
![Page 91: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/91.jpg)
Sshoogr: multiline contentremoteFile('/etc/yum.repos.d/puppet.repo').text = '''
[puppet]
name=Puppet Labs Packages
baseurl=http://yum.puppetlabs.com/el/
enabled=0
gpgcheck=0
'''
01.
02.
03.
04.
05.
06.
07.
91
![Page 92: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/92.jpg)
Sshoogr: file copyingremoteSession {
scp {
from { localDir "$buildDir/application" }
into { remoteDir '/var/bea/domain/application' }
}
}
01.
02.
03.
04.
05.
06.
92
![Page 93: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/93.jpg)
Sshoogr: command resultdef result = exec(command: '/usr/bin/mycmd',
failOnError: false, showOutput: false)
if (result.exitStatus == 1) {
result.output.eachLine { line ‐>
if (line.contains('WARNING')) {
throw new RuntimeException("First warning: ${line}")
}
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09. 93
![Page 94: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/94.jpg)
Sshoogr: shortcutsif (ok('/usr/bin/mycmd')) {
...
}
if (fail('/usr/bin/othercmd')) {
...
}
01.
02.
03.
04.
05.
06.
94
![Page 95: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/95.jpg)
Sshoogr: tunnelstunnel('1.2.3.4', 8080) { int localPort ‐>
def url = "http://localhost:${localPort}/flushCache"
def result = new URL(url).text
if (result == 'OK') {
println "Cache is flushed!"
} else {
throw new RuntimeException(result)
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09. 95
![Page 96: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/96.jpg)
Sshoogr: prefix/suffixprefix('sudo ') {
exec 'rm ‐rf /var/log/abc.log'
exec 'service abc restart'
}
suffix(' >> output.log') {
exec 'yum ‐y install nginx'
exec 'yum ‐y install mc'
exec 'yum ‐y install links'
}
01.
02.
03.
04.
05.
06.
07.
08.
09. 96
![Page 97: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/97.jpg)
Summary97
![Page 98: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/98.jpg)
TakeawaysGroovy scripts are portable
Groovy scripts are concise
Groovy scripts are powerful
Well, the name is groovy as well!
••••
98
![Page 99: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/99.jpg)
Mange tak!99
![Page 100: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/100.jpg)
Questions?100
![Page 101: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/101.jpg)
Happyscripting!
101
![Page 102: Ninja tricks for Groovy system scripting for jdk.io 2016](https://reader031.vdocuments.us/reader031/viewer/2022030315/5883ed0e1a28ab34428b555f/html5/thumbnails/102.jpg)
Devternity12 of December, 2016, Riga
Software Excellence Conference
4 tracks, 30+ speakers, 6 workshops
http://devternity.com
••••
102