Velocity用Eclipse plugin・Veloeclipseの導入とStruts2対応

Velocity用Eclipse plugin

VelocityのtemplateをEclipseで編集したいので探してみた。
↓を入れるだけ
de.veloeclipse.update

ユーザー・ディレクティブ対応

VeloeclipseはHTMLタグやディレクティブの入力補完に対応し、
ブロック・ディレクティブの閉じ漏れをエラーとして表示してくれる。
しかし、当然知らないディレクティブには対応していない。
このままではユーザー・ディレクティブの入力補完は効かないし、
ブロック・ディレクティブであるユーザー・ディレクティブが記述されていると
それだけでエラー表示されてしまう。
なので、使用するユーザー・ディレクティブについて教えてやらないといけない。


ウィンドウ>設定>Veloeclipseにユーザー・ディレクティブのリスト
という項目があるのでここから新規に追加していけばよい。
数が多いと手動で設定していくのが大変面倒くさくなるし、
各開発者が同じ設定を個別にやるのは大変アホくさい。


workspace/.metadata/.plugins/org.eclipse.core.runtime/.settings/de.byteaction.velocity.ui.prefs
↑の設定ファイルの↓の項目に設定すればよい。
de.byteaction.velocity.vaulttec.ui.velocity.userDirectives=
書き方は各ディレクティブの、「ディレクティブ名 [タイプ]」をカンマ区切りで、末尾に余計なカンマがあるのは問題ない。
↓のようになる。
sfile [Line],sform [Block]

Struts2対応

Struts2のカスタムタグはVelocityではユーザー・ディレクティブとして実現されている。
これらを全部登録してやらないとStruts2+Velocity開発でVeloeclipseは使い物にならない。
Struts2 JUnit PluginのStrutsTestCaseでは、
実際にアプリを動かす時と同じ形でstruts.xmlの設定を持ってこれる
(com.opensymphony.xwork2.XWorkTestCase.container)ので、これを使う。
Struts2+Velocityで使えるユーザディレクティブの設定は、
org.apache.struts2.views.velocity.VelocityManagerにて、
各TagLibrary実装classとstruts.xmlの設定から行われるのでコードを参考にする。

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.apache.struts2.StrutsTestCase;
import org.apache.struts2.views.TagLibrary;
import org.apache.velocity.runtime.directive.Directive;
import org.apache.velocity.runtime.directive.DirectiveConstants;


public class ExportUserDirectiveTest extends StrutsTestCase {
    public void test() throws Exception {
        List<TagLibrary> list = new ArrayList<TagLibrary>();
        Set<String> prefixes = container.getInstanceNames(TagLibrary.class);
        for (String prefix : prefixes) {
            list.add(container.getInstance(TagLibrary.class, prefix));
        }
        StringBuilder sb = new StringBuilder("de.byteaction.velocity.vaulttec.ui.velocity.userDirectives=");
        for(TagLibrary taglib : list){
            for(Class clazz : taglib.getVelocityDirectiveClasses()){
                Directive directive = (Directive)clazz.newInstance();
                sb.append(directive.getName());
                sb.append(" [");
                sb.append(directive.getType() == DirectiveConstants.BLOCK  ? "Block" : "Line");
                sb.append("],");
            }
        }
        System.out.println(sb.toString());
    }
}

これを流せば、Struts2+Velocityでのカスタムタグ拡張の初歩 - 文殊堂の方法で定義したものも含めて、
ユーザー・ディレクティブのVeloeclipse用設定が手に入るので、
Eclipseを落として貼り付けて起動すればおk。