discuss_ja@glassfish.java.net

Migration Toolの不具合の件

From: K K. <kana.akmt_at_gmail.com>
Date: Sun, 18 Jan 2009 18:05:47 +0900

荻布さん

こんばんは〜、コタケです。

今日は少し時間があったので、Migration Toolのソースコードをチェックアウトして、
以前ご報告したMigration Toolの不具合について調査してみました。
(Migrateボタン押下時にディスク容量不足でエラーになる件)

ビルドがうまくいかなかったため机上デバッグしかしていませんが、
一ヶ所気になるところがあったのでレポートします。

-------------------------
対象クラス:
sun.iasmt.supervisor.util.DiskSpaceEvaluator,java
-------------------------
対象メソッド:
  ◆getWindowsCmdByteCount

このメソッドでは、呼び出し元のgetWindowsAvailableSpaceから
コマンド文字列を受け取り、Runtime#execで実行を試みます。

この時、コマンドの実行結果をStreamから読み込み、その内容を
解析して使用可能なバイト数を取得しようとしているようですが、
ちょっと見たところ、「出力が英語で書かれている」ことを前提に
解析が行われているように思えます。

コード抜粋:
***********************
    private String getWindowsCmdByteCount(Process pr) throws
java.io.IOException {
        String byteCntString = null;
        InputStream is = pr.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        BufferedReader br = new BufferedReader(new InputStreamReader(bis));

        String line = "";
        Debug.write(Level.FINE,"Extracting byte count from Window's
BAT cmd output");
        while ((line = br.readLine()) != null) {
            Debug.write(Level.FINER,"Dir output line: " + line);
            if (line.toLowerCase().indexOf("bytes free") != -1) {
                String tmpLine = line;
                if (line.indexOf("Dir(s)") != -1) {
                    StringTokenizer st = new StringTokenizer(line, "Dir(s)");
                    if (st.hasMoreTokens()) {
                        tmpLine = st.nextToken();
                        tmpLine = st.nextToken();
                    }
                }

                StringTokenizer s = new StringTokenizer(tmpLine, "byte");
                tmpLine = s.nextToken();
                tmpLine = tmpLine.replaceAll(",", "");

                byteCntString = tmpLine.trim();
                break;
            }
        }
        br.close();
        bis.close();
        if (byteCntString == null) {
            Debug.write(Level.FINE,"Available bytes : byteCntString is null");
        } else {
            Debug.write(Level.FINE,"Available bytes (byteCntString) "
+ byteCntString);
        }
        return byteCntString;
    }

***********************

Windowsの日本語環境で実行した場合、コマンドの実行結果は日本語で
出力されると思うので、上記の方法で空きディスク容量は取得できないような
気がしてなりません。どうでしょう?

//パッと見ただけなので、ひょっとすると他のところで日本語環境への
//対応がなされている可能性はあるかもしれませんが...

-------------------------

Java SE 6 から FileクラスにgetFreeSpaceメソッドが追加されたので、
個人的にはこれを使用すると早いような気もするのですが。
(Migration Toolは5.0前提でしたっけ?)

----
Kana