clmap記法

概要

 clmap記法は複数のクロージャをまとめて定義するための記法です。
 インタフェースが同じクロージャをまとめて定義できます。

 clmap記法は tpacライブラリを利用したDSLです。tpacライブラリの詳細は tpacを参照してください。
 以下、tpac記法と重複する説明は省いています。

ハンドル

宣言

 宣言のタグ名は「clmap」です。
 指定できる子要素は map, closure, data, configハンドルです。
 いずれも省略あるいは複数個の指定が可能です。

#! clmap:sample

 指定できるキーはmapハンドルを参照してください。

mapハンドル

 mapハンドルは複数のクロージャをまとめます。
 指定できる子要素は map, closure, data, configハンドルです。
 いずれも省略あるいは複数個の指定が可能です。

 以下のキーを指定できます。すべて省略可です。

closureハンドル

 closureハンドルはひとつのクロージャに相当します。
 デフォルトキーにテキストとしてソースコードを記述します。
 指定できる子要素はありません。

 指定できるキーはmapハンドルを参照してください。

dataハンドル

 dataハンドルには、静的データをtpacの形式で記述します。
 指定できる子要素はありません。
 通常のハンドルと同じくテキスト、マップ、スカラー値などのデータを記述できます。

configハンドル

 configハンドルには、静的データをConfigSlurperの形式で記述します。
 指定できる子要素はありません。
 テキストとして記述します。
 GroovyのConfigSlurperで解析可能な形式で記述してください。

クロージャパス

 tpac文書ではハンドルを参照するとき、タグと名前を連結した文字列をパスに使います。
 clmap記法ではタグを省略したパスを使えます。便宜上、これをクロージャパスと呼びます。

 n個のマップが階層を構成し、その下位にある closureハンドルを参照したい場合、絶対クロージャパスのフォーマットは以下となります。

/${宣言の名前}/${mapハンドルの名前1}/ ... /${mapハンドルの名前n}#${closureハンドルの名前}

大域変数

 宣言(Clmapクラス)とmapハンドル(ClmapMapクラス)には大域変数を設定できます。
 メンバ変数であるpropertiesマップに格納したキーが大域変数名、値がその変数値となります。

クロージャの生成

 引数、戻り値は以下の順番で探し 初めにみつかったもの が使用されます。
 たとえば mapハンドルに argsキーを指定し、下位の closureハンドルはすべて argsキーを省略すると、生成されるクロージャはすべて同じ引数になります。

  1. closureハンドルに指定された args, returnキー
  2. closureハンドルが所属する mapハンドルあるいは宣言の args, returnキー
  3. さらに上位の mapハンドルあるいは宣言の args, returnキー

 dec, prefix, suffixキーについては階層が上位のものから順番に連結します。
 たとえば宣言に prefixハンドルで処理を記述すると、この clmap文書で生成されるすべてのクロージャの先頭でその処理が実行されます。

 clmap文書のサンプルを以下に示します。

#! clmap:sample
#-dec
	import org.apache.commons.lang3.StringUtils
#-prefix
	println 'BGN HERE'
#-suffix
	println 'END HERE'

#> map:map1
#-args
	String yourName
#-return
	String result
#-dec
	String cmnString = 'This is'
#-prefix
	result = ''
#-suffix
	result += '!'
#>> closure:key1
	result = StringUtils.trim("   ${cmnString} ${yourName}.   ")

 上記の clmap文書からクロージャパス「/sample/map1#key1」で参照されるクロージャのコードは以下のとおりです。
 読みやすいよう整形しています。

import org.apache.commons.lang3.StringUtils

String cmnString = 'This is'

{ String yourName ->
	String result
	println 'BGN HERE'
	result = ''
	result = StringUtils.trim("   ${cmnString} ${yourName}.   ")
	println 'END HERE'
	result += '!'
	return result
}