Google Guice2.0 を知ってから、今までラッピングして書いてたものを、分解し
組み直しの傾向がある。
Velocityテンプレートを生成インジェクトさせる @Provides を書いてみる。
この色の部分はリテラルで書いているが、
Guice の Module に実装させるものの中で、外部要求に依存するものを
全てパラメータ化したらしたで、呼び出しも苦労する。→悩みは尽きない。
結局、この @Provides メソッドを含む Module を
様々なシチュエーション毎に書いていくことなり、下手な共通プログラムは
必要ないのかもしれない。
インジェクト対象の Template 変数が、1つしかないのなら、@Named は不要である。
@Provides @Named("TEMPLATE")
protected Template providedTemplate(){
VelocityEngine velocityEngine = new VelocityEngine();
Properties prop = new Properties();
Template template = null;
try{
prop.setProperty("resource.loader","file,class");
prop.setProperty("file.resource.loader.class", FileResourceLoader.class.getName());
prop.setProperty("file.resource.loader.path","./sample/vm");
prop.setProperty("class.resource.loader.class", ClasspathResourceLoader.class.getName());
prop.setProperty("input.encoding","Windows-31J");
prop.setProperty("output.encoding","Windows-31J");
// velocity ログを出力させない設定!
prop.setProperty("runtime.log.logsystem.class","org.apache.velocity.runtime.log.NullLogSystem");
// Velocity初期化
velocityEngine.init(prop);
template = velocityEngine.getTemplate("sample.vm");
}catch(Exception e){
throw new RuntimeException(e);
}
return template;
}
----------------------------------------------------------
インジェクトされる側は、、、
@Inject @Named("TEMPLATE") private Template template;
VelocityContext を生成してMapを用意できたら
template#merge() を実行する
----------------------------------------------------------
==========================================
import org.apache.velocity.Template;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import org.apache.velocity.runtime.resource.loader.FileResourceLoader;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.name.Named;
public class VelocityModule extends AbstractModule{
private String vmfilename;
private String vmloadpath;
/**
* コンストラクタ.
* ローカルスレッド変数 VelocityConfigure.get()実行結果を
* テンプレートを探す場所とする。
* @param vmfilename テンプレートファイル名
*/
public VelocityModule(String vmfilename){
this.vmfilename = vmfilename;
this.vmloadpath = VelocityConfigure.get();
}
/**
* コンストラクタ.
* @param vmfilename テンプレートファイル名
* @param vmloadpath テンプレートを探すPATH、NULL を指定すると
* VelocityModule(String vmfilename)コンストラクタと同じ効果がある
*/
public VelocityModule(String vmfilename,String vmloadpath){
this.vmfilename = vmfilename;
this.vmloadpath = vmloadpath==null ? VelocityConfigure.get() : vmloadpath;
}
@Override
protected void configure(){
}
@Provides @Named("TEMPLATE")
protected Template providedTemplate(){
VelocityEngine velocityEngine = new VelocityEngine();
Properties prop = new Properties();
Template template = null;
try{
prop.setProperty("resource.loader", "file,class");
prop.setProperty("file.resource.loader.class", FileResourceLoader.class.getName());
prop.setProperty("file.resource.loader.path",this.vmloadpath);
prop.setProperty("class.resource.loader.class", ClasspathResourceLoader.class.getName());
prop.setProperty("input.encoding","Windows-31J");
prop.setProperty("output.encoding","Windows-31J");
// velocity ログを出力させない設定!
prop.setProperty("runtime.log.logsystem.class","org.apache.velocity.runtime.log.NullLogSystem");
// Velocity初期化
velocityEngine.init(prop);
template = velocityEngine.getTemplate(this.vmfilename);
}catch(Exception e){
throw new RuntimeException(e);
}
return template;
}
}
====================================
public final class VelocityConfigure{
private static ThreadLocal<String> vmloadPath;
private VelocityConfigure(){}
/**
* Velocity検索ロードパス設定
* @param loadPath 検索ロードパス
*/
public final static void set(String loadPath){
if (vmloadPath==null){
vmloadPath = new InheritableThreadLocal<String>(){
@Override
protected synchronized String initialValue(){
return ".";
}
};
}
vmloadPath.set(loadPath);
}
/**
* スレッド内で設定した検索ロードパスの参照
* @return 検索ロードパス
*/
public final static String get(){
if (vmloadPath==null){
vmloadPath = new InheritableThreadLocal<String>(){
@Override
protected synchronized String initialValue(){
return ".";
}
};
}
return vmloadPath.get();
}
}