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

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

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

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

2013/11/17 (日) 22:44

プロパティファイルに引き続き、INIファイルの比較が必要になりました。
具体的には、php.ini の設定の違いを洗い出したかったのですが、
同じ流れでWinMerge用のプラグインを作ってみました。
もしかしたら世の中に需要があるかもしれないのでソースを公開します。
適当に書き換えて使ってください。

package tak.tools;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.TreeMap;

/**
* INIファイルを読み込んで、セクションごとにキーの値でソートして出力します。
* コメント行は無視されます。
* 実行可能JARを生成してください。
*
* @author tak
*
*/
public class IniOutput {

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

try {
outputList(System.out, createIniMap(args[0]));
} catch (Exception e) {
e.printStackTrace();
}

}

/**
* INIファイルを読み込んでMAPを生成
*
* @param path INIファイルのパス
* @return セクションごとに纏めたMAP
* @throws IOException 例外発生時
*/
private static TreeMap<String, TreeMap<String, ArrayList<String>>> createIniMap(String path) throws IOException {

TreeMap<String, TreeMap<String, ArrayList<String>>> map = new TreeMap<String, TreeMap<String, ArrayList<String>>>();

BufferedReader br = null;

try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "Windows-31J"));

String line;
String section = "";
while ((line = br.readLine()) != null) {

// 前後の空白を除去
line = line.trim();

// コメントアウトを除去
if (line.indexOf(";") >= 0) {
line = line.replaceFirst(";.*$", "");
}

// 空行なので飛ばす
if (line.length() == 0) {
continue;
}

if (line.matches("^\\[.*\\]$")) {
// セクション
section = line;

// 初回登場時は器を用意
if (!map.containsKey(section)) {
map.put(section, new TreeMap<String, ArrayList<String>>());
}

} else {
// 設定
int hoge = line.indexOf("=");
String key = line.substring(0, hoge).trim();
String value = line.substring(hoge + 1).trim();

// 同一のキーがあるかもしれないのでリストで保持する
if(!map.get(section).containsKey(key)){
ArrayList<String> list = new ArrayList<String>();
list.add(value);
map.get(section).put(key, list);
}else{
map.get(section).get(key).add(value);
}

}

}

} finally {
if (br != null) {
br.close();
}
}

return map;
}

/**
* INIファイルマップの出力
*
* @param out 出力先
* @param ini 対象INIファイル
*/
private static void outputList(PrintStream out, TreeMap<String, TreeMap<String, ArrayList<String>>> ini) {

for (String section : ini.keySet()) {
out.println(section);
for (String key : ini.get(section).keySet()) {
ArrayList<String> list = ini.get(section).get(key);

// 昇順でソート
Collections.sort(list);
for (String value : list) {
out.println(key + "=" + value);
}
}
}

}
}


続いて、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 = "C:\Program Files\WinMerge\MergePlugins\iniOutput.jar"

Function get_PluginEvent()
get_PluginEvent = "FILE_PACK_UNPACK"
End Function

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

Function get_PluginFileFilters()
get_PluginFileFilters = "\.ini$"
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>

関連記事

コメントの投稿

非公開コメント

検索フォーム
RSSリンクの表示
カレンダー
05 | 2017/06 | 07
- - - - 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 -
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。