スポンサー広告 - スポンサーサイト

--/--/-- (--) --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【プログラミング】JAVA - WinMerge用プラグイン - プロパティファイルの比較

2013/11/17 (日) 22:36

仕事でプロパティファイルの比較をする必要があったのですが、
一方はコメントあり、もう一方はコメントなし、設定値の記述順もばらばら。
という状況で、有効な設定行だけを抽出して差を確認したかったのです。
単純に「WinMerge」で比較しても、当然上手く比較できません。
そこで、「WinMerge」用のプラグインを作ることにしました。
どんな動作にするかというと、Javaの「java.util.Properties」で読み込み、
キーでソートして出力するという単純な物です。
このAPIで読み込むと、コメント行が除去されます。ついでにUnicode コード変換された文字も元に戻ります。
読み込んだ後に「java.util.TreeMap」に詰め直してソートします。
もしかしたら世の中に需要があるかもしれないのでソースを公開します。
適当に書き換えて使ってください。

package tak.tools;

import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.Enumeration;
import java.util.Properties;
import java.util.TreeMap;

/**
* プロパティファイルを読み込んで、キーの値でソートして出力します。
* コメント行は無視されます。
* 実行可能JARを生成してください。
*
* @author tak
*
*/
public class PropertiesOutput {

/**
* メイン
*
* @param args プロパティファィルのフルパス
*/
public static void main(String[] args) {

final Properties prop = new Properties();

try {
prop.load(new InputStreamReader(new FileInputStream(args[0]), "UTF-8"));
outputList(System.out, prop);
} catch (Exception e) {
e.printStackTrace();
}

}

/**
* プロパティの出力
*
* @param out 出力先
* @param prop 対象プロパティファイル
*/
private static void outputList(PrintStream out, Properties prop) {

// キーでソート
TreeMap<String, String> map = new TreeMap<String, String>();

// プロパティの抽出
for (Enumeration<?> e = prop.keys(); e.hasMoreElements();) {
String key = (String) e.nextElement();
map.put(key, (String) prop.getProperty(key));
}

// プロパティの出力
for (String key : map.keySet()) {
out.println(key + "=" + map.get(key));
}

}

}


続いて、WinMerge用のプラグインファイルです。
MergePlugins ディレクトリに配置します。
※64Bit版では動かないかもしれません。
<scriptlet>

<implements type="Automation" id="dispatcher">
<property name="PluginEvent"><get/></property>
<property name="PluginDescription"><get/></property>
<property name="PluginFileFilters"><get/></property>
<property name="PluginIsAutomatic"><get/></property>
<method name="UnpackFile"/>
<method name="PackFile"/>
</implements>

<script language="VBS">

Option Explicit

'環境に応じて変更してください
Const jarPath = "上記JAVAをJAR化して配置したフルパス"

Function get_PluginEvent()
get_PluginEvent = "FILE_PACK_UNPACK"
End Function

Function get_PluginDescription()
get_PluginDescription = "Compare Propertis Files"
End Function

Function get_PluginFileFilters()
get_PluginFileFilters = "\.properties$;\.conf$"
End Function

Function get_PluginIsAutomatic()
get_PluginIsAutomatic = True
End Function

Function UnpackFile(fileSrc, fileDst, pbChanged, pSubcode)
Dim fso
Dim fo
Dim ws
Dim exec

Set fso = CreateObject("Scripting.FileSystemObject")
Set fo = fso.CreateTextFile(fileDst, True)
Set ws = CreateObject("WScript.Shell")
Set exec = ws.Exec("java -jar """ + jarPath + """ """ + fileSrc + """")
fo.Write(exec.StdOut.ReadAll())

Set exec = Nothing
Set ws = Nothing
fo.Close
Set fo = Nothing
Set fso = Nothing

pbChanged = True
pSubcode = 0
UnpackFile = True

End Function

Function PackFile(fileSrc, fileDst, pbChanged, pSubcode)
PackFile = False
End Function

</script>
</scriptlet>

関連記事

コメントの投稿

非公開コメント

Re: ありがとうございます

お役に立てて良かったです。
公開については全然構いません。

ありがとうございます

このページを見つけることができ大変助かりました。
多言語対応と、64bitでの動作確認を行ったので、改善したものをこちらのページの紹介と共に自分のBlogで公開してもよろしいでしょうか?
検索フォーム
RSSリンクの表示
カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。