テンプレートをInject

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();
   }
}