テンプレート・エンジンVelocity
2016/04/22 Javaツール勉強会資料
QTS / ISIT 神戸隆行(かんど たかゆき)
自己紹介 - 全般
2016/04/22Javaツール勉強会2
 九州先端科学技術研究所(ISIT)の方から来ました
 職場はそこだけど所属はQuoliarc Technology Solutions Ltd.
 チーフソフトウェアエンジニア(…といっても従業員は1人、院の指導教官
がCTO)
 数学ソフトウェア(数値解析、数式処理)、プログラム最適化、動的再構
成可能プロセッサ向けコンパイラと来て今はPTaaSを作っています
 連絡先:
 Twitter: @ChihiroShiiji
 Facebook: takayuki_kando
 mail: kando@nerimadors.or.jp
 趣味プロジェクト: TRPGオンラインセッションツールの開発
 趣味: イラスト描き、コスプレ?
自己紹介 - Velocityとの関わり
2016/04/22Javaツール勉強会3
 PTaaS (Platform for TaaS)
 開発ツールをネットワークのサービスとして提供する(Tool as
a Service)ためのプラットフォーム
 技術的には「XMPPベースのマルチユーザ遠隔分散ビルド」
システム
 Velocityの用途
 分散ビルドシステムがツールのために動的に起動するVM設
定用シェルスクリプトの生成
 テスト環境用Antファイルの生成
本日のお題
4
 テンプレート・エンジンの位置づけと使いどころ
 Velocityの紹介
 サンプル
 Ant(XML)ファイルの生成
 テンプレートをリソース内に同梱する
 パラメータの受け渡し
 パラメータの埋め込み
 初期化シェルスクリプトの生成
 制御命令の使用例
 Velocityの構文の紹介
 嵌りどころ
2016/04/22Javaツール勉強会
テキスト・ファイルの生成
5
 プログラムの持つデータからテキストファイルを作る
 用途
 データ受け渡しや保存のため
 テキストにしておくと検証やテストデータの作成が簡単
 様々な環境の間でデータ交換ができる
 可視化のため人間可読な形式で出力する
 例:
 近年のWebアプリケーションで生成する機会は多い
 HTML、CSS、XML、YAML、JSON
 伝統的には言語処理系の出力段で必要とされてきた
 コンパイラ(アセンブリ・コード出力)
 トランスレータ(変換後ソースコードの出力)
 マクロ・プロセッサ(TeXやCプリプロセッサの展開後出力)
2016/04/22Javaツール勉強会
ファイルの生成の方式(1)
2016/04/22Javaツール勉強会6
 ツリー構造とプリティプリンタ
 適用局面:
 構造が前もってできている
 例:
 XML/HTML文書のDOMとプリティプリンタ
 MapやListによるオブジェクト・ツリーとYAMLやJSONライブラリの出力メソッド
 イベント投入方式(仮名)
 適用局面:
 構造は有るがファイルの全貌が見えない
 例:
 各種ロガー
 XML Pull parserのプリティプリンタ
 テンプレート方式
 適用局面:
 構造は気にせずテンプレートとなる文書の部分改変で作成できる
 例:
 Velocity
 JSP(Java Server Page)
ファイルの生成の方式(2)
2016/04/22Javaツール勉強会7
 前頁の組み合わせもある
 ツリー構造の出力の実装にイベント投入方式や微小なテンプ
レート方式を利用するようなこともある
 String.format()は微小なテンプレートと見ることもできる
代表的なファイルの生成の方式と得失
ツリー構造とプリティプリンタ テンプレート・エンジン
8
 プログラム内のデータが持
つオブジェクトのツリー構造
とそれを構造化文書として
整形出力する出力ルーチン
(プリティプリンタ)
 得失
 ツリー構造がある場合
 様々な構造をガッツリ作る場
合に利点
 ツリー構造を組み立てるのが
結構手間
 「テンプレート」となる文書の
一部に値を埋め込んだり、
条件分岐や反復を埋め込
んで文書の一部を条件に応
じて変形して出力する
 得失
 ツリー構造がない場合でも利
用し易い
 パラメタの埋め込みなど一部
だけを改変する場合に特に便
利
 生成するごとに構造が大きく
変わる場合には却って手間
2016/04/22Javaツール勉強会
Apache Velocity
9
 Javaで割と古参の汎用テンプレートエンジン
 公式サイト
 Apache Velocity Site - The Apache Velocity Project
 http://velocity.apache.org/
 2016/04/21現在、最新版は1.7(2010年)
 Java SE 8でももちろん動く
 明記されてないようだがJava SE 4以上が動作条件ではないか?
 依存ライブラリ
 Apache Commons
 Collections
 https://commons.apache.org/proper/commons-collections/
 Lang
 https://commons.apache.org/proper/commons-lang/
2016/04/22Javaツール勉強会
Velocity Engine
Velocityの処理の流れ
2016/04/22Javaツール勉強会10
VTLで記述される
テンプレート
VelocityContex
t
(実態は
<名前→オブ
ジェクト>マッ
プ)
Template
(コンパイル済
テンプレート)
マージ処理 出力
テンプレート
コンパイラ
プログラムから
データ供給
VTL(Velocity Template Language)の例
11
<HTML>
<BODY>
Hello $customer.Name!
<table>
#foreach( $mud in $mudsOnSpecial )
#if ( $customer.hasPurchased($mud) )
<tr>
<td>
$flogger.getPromo( $mud )
</td>
</tr>
#end
#end
</table>
<!-- 後略 -->
Apache Velocity User Guide
http://velocity.apache.org/engine/devel/user-guide.html#What_is_Velocity より
2016/04/22Javaツール勉強会
• #~(改行)は処理命令(制御文など)
• ##~(改行)と#*~*#はコメント
• $名前、${名前}はオブジェクト参照
• 処理命令と参照以外はそのまま出力される
サンプル1
Ant(XML)ファイルの生成
2016/04/22Javaツール勉強会12
 Gist:
 https://gist.github.com/TakayukiKando/e6a49a4c5ea7e6
95a5eb03757ef2458d
 利用機能
 テンプレートをリソース内に同梱する
 パラメータの受け渡し
 パラメータの埋め込み
 利用動機
 極一部のパラメタしか置き変えない
 将来置き換えるパラメタは増えるかも
サンプル2
初期化シェルスクリプトの生成
2016/04/22Javaツール勉強会13
 Gist:
 https://gist.github.com/TakayukiKando/cc504de4e81b273af12
59ed2ea6fb3b4
 利用機能
 行コメント##
 制御命令(#set, #parse, #if, #foreach)
 参照オブジェクトのメソッド呼び出し
 利用動機
 パラメータが変っても変わらない決まり切った構文が結構多い
 最初は自前でスクリプト生成Factory Objectパターンで実装していたが
メンテナンスが全然楽でなかったので移行
 OS固有の仕組みをテンプレートにカプセル化
 テンプレート差し替えで複数のOSに対応できる
 最初はFactory Objectのパラメタにしようと思っていたがパラメタだけで
済まなかった
Velocityハマりポイント
14
 Apache Commonsライブラリに依存している
 collectionsとlang
 変数はVelocityContextを通じて明示的に渡す必要があ
る
 渡し忘れに注意
 オブジェクトのプロパティ参照構文がオブジェクトのフィー
ルド参照に見えるが実際はgetter呼び出しの略記
 構文が似ているので油断しているとついフィールドを参照しよ
うとしてしまう
2016/04/22Javaツール勉強会
まとめ
15
 テンプレート・エンジンの位置づけと使いどころ
 構造がない文書
 構造がある範囲で一定している文書
 改変が一部だけに限られる文書
 Velocityの紹介
 サンプル
1. Ant(XML)ファイルの生成
 テンプレートをリソース内に同梱する
 パラメータの受け渡し
 パラメータの埋め込み
2. 初期化シェルスクリプトの生成
 制御命令の使用例
 Velocityの構文の紹介
 ハマりどころ
2016/04/22Javaツール勉強会
参考文献
16
 User Guide(Ver.1.7)
 http://velocity.apache.org/engine/devel/user-guide.html
 VTL Reference(Ver.1.7)
 http://velocity.apache.org/engine/devel/vtl-reference-guide.html
 Velocity | TECHSCORE(テックスコア)
 http://www.techscore.com/tech/Java/ApacheJakarta/Velocity/in
dex/
 ユーザ・ガイド(Ver.1.4)日本語訳
 http://www.jajakarta.org/velocity/velocity-1.4/docs-ja/user-
guide.html
 VTLリファレンス(Ver.1.4)日本語訳
 http://www.jajakarta.org/velocity/velocity-1.4/docs-ja/vtl-
reference-guide.html
2016/04/22Javaツール勉強会

テンプレート・エンジンVelocity