ディレクトリ構造を書き出してみる

昨日Mavenを試していて、にっきに載せるときはディレクトリ構造を手で書いていた。↓こんなやつ


directory/
+--file1.txt
+--file2.txt
また同じようなの書くこともあるかもしれないのでスクリプト作っとこう。今はやりのGroovyで挑戦だ〜。
...
かなり苦戦。
FileはConpositeパターンになってるんだからVisitorでやるか?でもスクリプトだしもっとシンプルにできないかな?やっぱりClosure使ったほうがかっこいいよな。
といろいろ考えながらいじりまくった挙句、こんなところに落ち着きました。

import java.io.File

rootPath = args.size() > 0 ? args[0] : '.'
outputPath = args.size() > 1 ? args[1] : 'directories.txt'

new File(outputPath).withWriter { writer |
new DirectoryScanner(rootPath).eachFileRecurse { depth, file |
indent = ' ' * depth
mark = file.isDirectory() ? '/' : ''

writer.writeLine "${indent}+--${file.name}${mark}"
}
}

class DirectoryScanner {
depth = 0
directory

DirectoryScanner(path) {
this.directory = new File(path).getCanonicalFile()
}

void eachFileRecurse(closure) {
eachFileRecurse(directory, closure)
}

void eachFileRecurse(file, closure) {
closure(depth, file)
if (file.isDirectory()) {
depth++
file.eachFile {
eachFileRecurse(it, closure)
}
depth--
}
}
}

DirectoryScannerにディレクトリ構造を辿らせて、見つけたディレクトリまたはファイルをどうするかはClosureで書くと。やっぱりClosure使うとソースがシンプルで読みやすいね〜。
でもちょっと気になるのがコマンドライン引数の値を取得するとこ。足りないときの処理が書きづらかった。配列でOutOfBoundsExceptionを回避してデフォルト値を使うような仕組みが欲しくなったけど、この場合にしか使わないかもなぁ。
Groovyはかなり楽しいのでもっと使ってみたくなってきた。なんか思いついたらどんどん使っていこう。