Velocityは「ApacheJakartaプロジェクト」のテンプレートエンジンで、Javaベースで作られている。テンプレートエンジンは「雛形になるドキュメント」に必要な値を埋め込んで合成して成果物を作成するソフトウエアで、今回は、「Velocity」というやつを使ってみようと思う。また、ついでに「Log4J」というこれも「ApacheJakartaプロジェクト」のJavaプログラム用のログ APIを使ってみようかと思う。最近はJava関連のネタ多いけど、今回もJava関連で。。サーバ周りでまだやることあるんだけど・・
ダウンロード(Apache Velocity Project)http://velocity.apache.org/
今回やること
- ・Velocityを使うための設定
- ・log4jの設定と使用
- ・Velocityを使ったサンプルの作成
サンプルの概要は以下
URLが入力されているCSVファイルを読み込んでブックマークHTMLファイルとして出力する
入力
出力
- 0.1. プロパティーファイルの作成
- 0.2. Log4Jのプロパティー
- 0.3. Velocityのプロパティー
- 0.4. Libの準備(今回のサンプル作成で必要な物)
- 0.5. ・Velocityを使ったサンプルの作成
- 0.6. Eclipseのビルドパスの設定
- 0.7. ・入力ファイルの作成
- 0.8. ・vm(テンプレートファイルの作成)
- 0.9. ・Javaソースの作成
- 0.9.1. ../workspace/Velocity/src/brokendish/verocity/VerocityMakeMain.java
- 0.9.2. ../workspace/Velocity/src/brokendish/verocity/VerocityBookmarkMake.java
- 0.9.3. ../workspace/Velocity/src/brokendish/velocity/util/BookmarksStruct.java
- 0.9.4. ../workspace/Velocity/src/brokendish/velocity/util/FileUtil.java
- 0.9.5. ../workspace/Velocity/src/brokendish/velocity/util/StructSet.java
- 0.10. ・実行結果
- 0.11. 出力ファイル
- 0.12. ・ログ
- 1. ここからは別のサンプル
- 1.12.1. /workspace/Verocity-Shell/src/brokendish/verocityshell/VerocityMakeMain.java
- 1.12.2. /workspace/Verocity-Shell/src/brokendish/verocityshell/VerocityJobShellMake.java
- 1.12.3. /workspace/Verocity-Shell/src/brokendish/velocityshell/util/StructSet.java
- 1.12.4. /workspace/Verocity-Shell/src/brokendish/velocityshell/util/JobShellStruct.java
- 1.12.5. /workspace/Verocity-Shell/src/brokendish/velocityshell/util/FileUtil.java
- 1.12.6. /workspace/Verocity-Shell/input/JobList.csv
- 1.12.7. /eclipse/workspace/Verocity-Shell/vm/JobShell.vm
・Velocity、log4jを使うための設定
ディレクトリの作成
以下のようなディレクトリ構成にする。
プロパティーファイルの作成
Log4Jのプロパティー
../eclipse/workspace/Velocity/properties/log4j.properties
log4j.debug=false log4j.rootLogger=INFO, Console, file log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout # log4j.appender.Console.layout.ConversionPattern=%t %c#%M %p %m%n log4j.appender.Console.layout.ConversionPattern=%d %5p %c{1} - %m%n # direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=log/VelocityTest.log log4j.appender.file.Append=true log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %5p %c{1} - %m%n |
Velocityのプロパティー
../eclipse/workspace/Velocity/properties/velocity.properties
resource.loader=class class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader input.encoding=UTF-8 |
Libの準備(今回のサンプル作成で必要な物)
(Apache Velocity Project)http://velocity.apache.org/からダウンロードしてきたものを配置する
・Velocityを使ったサンプルの作成
Eclipseのビルドパスの設定
・入力ファイルの作成
../eclipse/workspace/Velocity/input/BookmarkList.csv
Brokendish Blog,https://brokendish.org Google,http://google.com yahoo,http://yahoo.co.jp あいうえお,http://1263456789 赤青黄色,http://abcsdefg |
・vm(テンプレートファイルの作成)
../eclipse/workspace/Velocity/vm/BookmarkHTML.vm
<html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> #foreach(${bml} in ${bookMarkslst}) <strong>${bml.name}</strong> <br> <a href="${bml.url}" > ${bml.url}</a> <br><br> #end ##ここから下はテスト ここはコメント文 テスト --------------------------------------------------------------- if文の動作 比較 --------------------------------------------------------------- Javaからの値 aaa=$aaa bbb=$bbb ccc=$ccc ①----if文の動作 数値比較---- ##右辺の値を左辺に代入する #set($aaa = 1) #set($bbb = 3) aaa=$aaa bbb=$bbb #if($aaa < $bbb) ${aaa} より ${bbb}は大きい #else ${aaa} より ${bbb}は大きくない #end </html> |
・Javaソースの作成
../workspace/Velocity/src/brokendish/verocity/VerocityMakeMain.java
package brokendish.verocity; public class VerocityMakeMain { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ VerocityBookmarkMake aa = new VerocityBookmarkMake(); aa.MakeTest(); } } |
../workspace/Velocity/src/brokendish/verocity/VerocityBookmarkMake.java
package brokendish.verocity; import java.io.File; import java.io.StringWriter; import java.util.ArrayList; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import brokendish.velocity.util.BookmarksStruct; import brokendish.velocity.util.FileUtil; import brokendish.velocity.util.StructSet; public class VerocityBookmarkMake { private String Log4jPROPERTIES; private String TEMPLATEVM; private String INPUTFile; private String OUTPUTFile; private String VELOCITYPROPERTIES; public VerocityBookmarkMake(){ // apache.log4jのプロパティーファイルの指定 Log4jPROPERTIES = "properties/log4j.properties"; // Velocityのプロパティーファイルの指定 VELOCITYPROPERTIES="properties/velocity.properties"; // テンプレートファイル TEMPLATEVM = "BookmarkHTML.vm"; // 入力ファイル INPUTFile = "input/BookmarkList.csv"; // 出力ファイル OUTPUTFile = "output/BookmarkList.html"; } public void MakeTest(){ // apache.log4jのインスタンス生成 Logger log = org.apache.log4j.Logger.getLogger( this.getClass() ); // apache.log4jのプロパティーファイルの指定 PropertyConfigurator.configure(Log4jPROPERTIES); try{ // プロパティーファイルを読み込む // LOG出力---------------------------------------------------- log.info("プロパティーファイル読込" + "<<< properties/velocity.properties"); Velocity.init(VELOCITYPROPERTIES); // VelocityContextを生成 // LOG出力---------------------------------------------------- log.info("VelocityContextを生成" ); VelocityContext vc = new VelocityContext(); // ファイル入力→ArrayListにする // LOG出力---------------------------------------------------- log.info("ファイル入力"); File fl = new File(INPUTFile); ArrayList infileAllay = new ArrayList(); infileAllay = FileUtil.inputFileToArray(fl); // BookmarksStruct型のArrayListを生成 // LOG出力---------------------------------------------------- log.info("BookmarksStruct型のArrayListに値を設定する"); ArrayList al = new ArrayList(); // 入力ファイルのArrayListをBookmarksStruct型の構造体にする // LOG出力---------------------------------------------------- log.info("入力ファイルのArrayListをBookmarksStruct型の構造体にする"); StructSet st = new StructSet(); al = st.arraySetBookmarks(infileAllay); // テンプレート(vm)にBookmarksStruct型のArrayListを渡す // LOG出力---------------------------------------------------- log.info("VelocityContextにデータを設定"); vc.put("bookMarkslst",al); vc.put("aaa", "9"); vc.put("bbb", "1"); vc.put("ccc", "END"); // テンプレートファイルを読み込み Template template = null; template = Velocity.getTemplate(TEMPLATEVM,"UTF-8"); // マージ後データ格納用 StringWriter w = new StringWriter(); // テンプレートとデータをマージする template.merge(vc, w); // LOG出力---------------------------------------------------- log.info("SYSOUTに表示してみる" +w.toString()); // LOG出力---------------------------------------------------- log.info("出たかな" ); /* // SYSOUTに表示してみる System.out.println(w.toString());*/ // ファイルに出力 // LOG出力---------------------------------------------------- log.info("ファイルに出力"); File ofl = new File(OUTPUTFile); FileUtil.fileWriter(w.toString(),ofl); w.close(); } catch(Exception e){ e.printStackTrace(); } } } |
../workspace/Velocity/src/brokendish/velocity/util/BookmarksStruct.java
package brokendish.velocity.util; public class BookmarksStruct { private String url; private String name; public String getUrl() { return url; } public String getName() { return name; } public void setUrl(String url) { this.url = url; } public void setName(String name) { this.name = name; } } |
../workspace/Velocity/src/brokendish/velocity/util/FileUtil.java
package brokendish.velocity.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; public class FileUtil { /** * 入力ファイルをArrayListに格納して返却 * * @param inputFile 入力ファイルパス * @return ArrayList */ public static ArrayList inputFileToArray(File inputFile){ ArrayList strAl = new ArrayList(); try{ FileReader infl = new FileReader(inputFile); BufferedReader bfr = new BufferedReader(infl); String ins = ""; while( (ins = bfr.readLine()) != null){ strAl.add(ins); } bfr.close(); } catch (IOException e){ e.printStackTrace(); } return(strAl); } /** * 文字列をファイルに出力 * * @param wr 文字列 * @param outputFile 出力ファイルのパス * */ public static void fileWriter(String wr,File outputFile){ try{ FileWriter filewriter = new FileWriter(outputFile); BufferedWriter bw = new BufferedWriter(filewriter); PrintWriter pw = new PrintWriter(bw); pw.print(wr); pw.close(); } catch (IOException e){ e.printStackTrace(); } } } |
../workspace/Velocity/src/brokendish/velocity/util/StructSet.java
package brokendish.velocity.util; import java.util.ArrayList; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class StructSet { /** * ArrayList を ArrayList型に設定して返却 * Splitで区切る * setName(sp[0]) * setUrl(sp[1]) * * @param al ArrayList * @return ArrayList */ public ArrayList arraySetBookmarks(ArrayList al){ // apache.log4jのインスタンス生成 Logger log = org.apache.log4j.Logger.getLogger( this.getClass() ); // apache.log4jのプロパティーファイルの指定 PropertyConfigurator.configure("properties/log4j.properties"); // BookmarksStruct型のArrayListを作成 ArrayList bkmlst = new ArrayList(); // String型のArrayListをSplitしてBookmarksStruct型にする // LOG出力---------------------------------------------------- log.info("String型のArrayListをSplitしてBookmarksStruct型にする"); for(String spli : al){ // BookmarksStruct(構造体みたいなの)生成 BookmarksStruct bkm = new BookmarksStruct(); String[] sp = spli.split(","); // CSVファイルのカンマ区切り順に設定する bkm.setName(sp[0]); bkm.setUrl(sp[1]); // ArrayListに追加 bkmlst.add(bkm); } return (bkmlst); } } |
・実行結果
出力ファイル
・ログ
ここからは別のサンプル
処理概要
入力ファイル(CSV)に記載されている「job」「step」「file」の項目を元にcshellを複数ファイル生成する。
「job」の単位で「job」+「.sh」をファイル名としてシェルを作成する。
「step」は「job」の単位内でのラベル名として設定し、「job」単位の最後のSTEPはEND_PROCに行くようにする。
(サンプルではJOBの正常終了の判定はしていないのでgotoの意味はない。STEP1からEND_PROCまで順次実行される)
/workspace/Verocity-Shell/src/brokendish/verocityshell/VerocityMakeMain.java
package brokendish.verocityshell; public class VerocityMakeMain { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ VerocityJobShellMake aa = new VerocityJobShellMake(); aa.MakeTest(); } } |
/workspace/Verocity-Shell/src/brokendish/verocityshell/VerocityJobShellMake.java
package brokendish.verocityshell; import java.io.File; import java.io.StringWriter; import java.util.ArrayList; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import brokendish.velocityshell.util.JobShellStruct; import brokendish.velocityshell.util.FileUtil; import brokendish.velocityshell.util.StructSet; public class VerocityJobShellMake { private String Log4jPROPERTIES; private String TEMPLATEVM; private String INPUTFile; private String OUTPUTFile; private String VELOCITYPROPERTIES; public VerocityJobShellMake(){ // apache.log4jのプロパティーファイルの指定 Log4jPROPERTIES = "properties/log4j.properties"; // Velocityのプロパティーファイルの指定 VELOCITYPROPERTIES="properties/velocity.properties"; // テンプレートファイル TEMPLATEVM = "JobShell.vm"; // 入力ファイル INPUTFile = "input/JobList.csv"; // 出力ファイル OUTPUTFile = "output/BookmarkList.html"; } public void MakeTest(){ // apache.log4jのインスタンス生成 Logger log = org.apache.log4j.Logger.getLogger( this.getClass() ); // apache.log4jのプロパティーファイルの指定 PropertyConfigurator.configure(Log4jPROPERTIES); try{ // プロパティーファイルを読み込む // LOG出力---------------------------------------------------- log.info("プロパティーファイル読込" + "<<< properties/velocity.properties"); Velocity.init(VELOCITYPROPERTIES); // VelocityContextを生成 // LOG出力---------------------------------------------------- log.info("VelocityContextを生成" ); VelocityContext vc = new VelocityContext(); // ファイル入力→ArrayListにする // LOG出力---------------------------------------------------- log.info("ファイル入力"); File fl = new File(INPUTFile); ArrayList<String> infileAllay = new ArrayList<String>(); infileAllay = FileUtil.inputFileToArray(fl); // JobShellStruct型のArrayListを生成 // LOG出力---------------------------------------------------- log.info("JobShellStruct型のArrayListに値を設定する"); ArrayList<JobShellStruct> al = new ArrayList<JobShellStruct>(); // 入力ファイルのArrayListをJobShellStruct型の構造体にする // LOG出力---------------------------------------------------- log.info("入力ファイルのArrayListをJobShellStruct型の構造体にする"); StructSet st = new StructSet(); al = st.arraySetBookmarks(infileAllay); //@@-----------loop---------------------------------------------- for(int i=0;i<al.size();i++){ // JobShellStruct型に入ってるデータを必要な分に区切ってテンプレートに渡す ArrayList<JobShellStruct> al2 = new ArrayList<JobShellStruct>(); while(true){ al2.add(al.get(i)); // nextstepの値が「"END_PROC"」だったらシェルをファイルに書き出す if(al.get(i).getNextstep().equals("END_PROC")){ break; } i++; } // テンプレート(vm)にJobShellStruct型のArrayListを渡す // LOG出力---------------------------------------------------- log.info("VelocityContextにデータを設定"); vc.put("jobshellLst",al2); // テンプレートファイルを読み込み Template template = null; template = Velocity.getTemplate(TEMPLATEVM,"UTF-8"); // マージ後データ格納用 StringWriter w = new StringWriter(); // テンプレートとデータをマージする template.merge(vc, w); // LOG出力---------------------------------------------------- log.info("SYSOUTに表示してみる" +w.toString()); // LOG出力---------------------------------------------------- log.info("出たかな" ); // ファイルに出力 // LOG出力---------------------------------------------------- log.info("ファイルに出力"); File ofl = new File("output/" + al.get(i).getJob() + ".sh"); FileUtil.fileWriter(w.toString(),ofl); w.close(); } //@@-----------loop---------------------------------------------- } catch(Exception e){ e.printStackTrace(); } } } |
/workspace/Verocity-Shell/src/brokendish/velocityshell/util/StructSet.java
package brokendish.velocityshell.util; import java.util.ArrayList; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class StructSet { /** * ArrayList<String> を ArrayList<JobShellStruct>型に設定して返却 * Splitで区切る * * @param al ArrayList<String> * @return ArrayList<BookmarksStruct> */ public ArrayList<JobShellStruct> arraySetBookmarks(ArrayList<String> al){ // apache.log4jのインスタンス生成 Logger log = org.apache.log4j.Logger.getLogger( this.getClass() ); // apache.log4jのプロパティーファイルの指定 PropertyConfigurator.configure("properties/log4j.properties"); // JobShellStruct型のArrayListを作成 ArrayList<JobShellStruct> bkmlst = new ArrayList<JobShellStruct>(); // String型のArrayListをSplitしてJobShellStruct型にする // LOG出力---------------------------------------------------- log.info("String型のArrayListをSplitしてBookmarksStruct型にする"); for(int i=0;i<al.size();i++){ // JobShellStruct(構造体みたいなの)生成 JobShellStruct bkm = new JobShellStruct(); String[] sp = al.get(i).split(","); // CSVファイルのカンマ区切り順に設定する bkm.setJob(sp[0]); bkm.setStep(sp[1]); bkm.setFile(sp[2]); // 次のステップ確認 if(al.size()>i+1){ String[] sp2 = al.get(i+1).split(","); if(sp[1].compareTo(sp2[1]) == 0 || sp[1].compareTo(sp2[1]) > -1){ bkm.setNextstep("END_PROC"); } else{ bkm.setNextstep("STEP_" + sp2[1]); } } else{ bkm.setNextstep("END_PROC"); } // ArrayListに追加 bkmlst.add(bkm); } return (bkmlst); } } |
/workspace/Verocity-Shell/src/brokendish/velocityshell/util/JobShellStruct.java
package brokendish.velocityshell.util; public class JobShellStruct { private String job; private String step; private String file; private String nextstep; public String getNextstep() { return nextstep; } public String getJob() { return job; } public String getStep() { return step; } public String getFile() { return file; } public void setJob(String job) { this.job = job; } public void setStep(String step) { this.step = step; } public void setFile(String file) { this.file = file; } public void setNextstep(String nextstep) { this.nextstep = nextstep; } } |
/workspace/Verocity-Shell/src/brokendish/velocityshell/util/FileUtil.java
package brokendish.velocityshell.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; public class FileUtil { /** * 入力ファイルをArrayListに格納して返却 * * @param inputFile 入力ファイルパス * @return ArrayList */ public static ArrayList<String> inputFileToArray(File inputFile){ ArrayList<String> strAl = new ArrayList<String>(); try{ FileReader infl = new FileReader(inputFile); BufferedReader bfr = new BufferedReader(infl); String ins = ""; while( (ins = bfr.readLine()) != null){ strAl.add(ins); } bfr.close(); } catch (IOException e){ e.printStackTrace(); } return(strAl); } /** * 文字列をファイルに出力 * * @param wr 文字列 * @param outputFile 出力ファイルのパス * */ public static void fileWriter(String wr,File outputFile){ try{ FileWriter filewriter = new FileWriter(outputFile); BufferedWriter bw = new BufferedWriter(filewriter); PrintWriter pw = new PrintWriter(bw); pw.print(wr); pw.close(); } catch (IOException e){ e.printStackTrace(); } } } |
/workspace/Verocity-Shell/input/JobList.csv
Job001,1,/var/log/ Job001,2,/var/log/apache2 Job001,3,/var/log/tomcat6 Job002,1,/home/ Job003,1,/etc/ssh Job003,2,/etc/ssl Job004,1,/etc/vim Job004,A,/etc/aa Job004,B,/etc/bb |
/eclipse/workspace/Verocity-Shell/vm/JobShell.vm
#!/bin/csh #foreach($lst in ${jobshellLst}) #------------------------------------------ #Shell Name -- ${lst.job} -- #------------------------------------------ STEP_${lst.step}: echo "--------------------------------------------" echo "STEP_"${lst.step} "Run Command::ls -ltra ${lst.file}" echo "--------------------------------------------" ls -ltra ${lst.file} goto ${lst.nextstep} #end END_PROC: echo "終了" pwd ----------------------------------------- |
結果の出力ファイル
Job001.sh
#!/bin/csh #------------------------------------------ #Shell Name -- Job001 -- #------------------------------------------ STEP_1: echo "--------------------------------------------" echo "STEP_"1 "Run Command::ls -ltra /var/log/" echo "--------------------------------------------" ls -ltra /var/log/ goto STEP_2 #------------------------------------------ #Shell Name -- Job001 -- #------------------------------------------ STEP_2: echo "--------------------------------------------" echo "STEP_"2 "Run Command::ls -ltra /var/log/apache2" echo "--------------------------------------------" ls -ltra /var/log/apache2 goto STEP_3 #------------------------------------------ #Shell Name -- Job001 -- #------------------------------------------ STEP_3: echo "--------------------------------------------" echo "STEP_"3 "Run Command::ls -ltra /var/log/tomcat6" echo "--------------------------------------------" ls -ltra /var/log/tomcat6 goto END_PROC END_PROC: echo "終了" pwd ----------------------------------------- |
Job002.sh
#!/bin/csh #------------------------------------------ #Shell Name -- Job002 -- #------------------------------------------ STEP_1: echo "--------------------------------------------" echo "STEP_"1 "Run Command::ls -ltra /home/" echo "--------------------------------------------" ls -ltra /home/ goto END_PROC END_PROC: echo "終了" pwd ----------------------------------------- |
Job003.sh
#!/bin/csh #------------------------------------------ #Shell Name -- Job003 -- #------------------------------------------ STEP_1: echo "--------------------------------------------" echo "STEP_"1 "Run Command::ls -ltra /etc/ssh" echo "--------------------------------------------" ls -ltra /etc/ssh goto STEP_2 #------------------------------------------ #Shell Name -- Job003 -- #------------------------------------------ STEP_2: echo "--------------------------------------------" echo "STEP_"2 "Run Command::ls -ltra /etc/ssl" echo "--------------------------------------------" ls -ltra /etc/ssl goto END_PROC END_PROC: echo "終了" pwd ----------------------------------------- |
Job004.sh
#!/bin/csh #------------------------------------------ #Shell Name -- Job004 -- #------------------------------------------ STEP_1: echo "--------------------------------------------" echo "STEP_"1 "Run Command::ls -ltra /etc/vim" echo "--------------------------------------------" ls -ltra /etc/vim goto STEP_A #------------------------------------------ #Shell Name -- Job004 -- #------------------------------------------ STEP_A: echo "--------------------------------------------" echo "STEP_"A "Run Command::ls -ltra /etc/aa" echo "--------------------------------------------" ls -ltra /etc/aa goto STEP_B #------------------------------------------ #Shell Name -- Job004 -- #------------------------------------------ STEP_B: echo "--------------------------------------------" echo "STEP_"B "Run Command::ls -ltra /etc/bb" echo "--------------------------------------------" ls -ltra /etc/bb goto END_PROC END_PROC: echo "終了" pwd ----------------------------------------- |