タイトルJava Watch on the X》3 - 今度こそ「JavaからAppleScript」を実行する(2)カテゴリー開発情報, Java, AppleScript, Java Watch on the X
作成日2001/11/29 1:1:36作成者新居雅行
【MDOnline読者様限定コンテンツ】
AppleScriptのプログラムを実行するAppleScriptRunnerの解説を行うが、ポイントになるのはdoScriptだけになるだろう。AppleScriptうんぬんというよりも、Javaから外部のプロセスを動かす一般的な手法の解説が中心だ。

まず、ここではAppleScriptのプログラムを動かすために、osascriptコマンドの内容を知っておく必要がある。詳細はTerminalでman osascriptを実行して見てもらいたいが、まずはスクリプトプログラムを標準入力で受け取り、それを実行することができる。また、ファイルにあるプログラムの実行もできるようになっている。そして、出力結果についてのいくつかのスイッチがあるが、デフォルトで使うことにする。すると、Human Readableつまり人間が読みやすい形式となる。ただ、場合によってはある部分のスクリプトの実行結果を、別のスクリプトで使うのであれば、「-s s」というフラグをつけて実行するのもよいだろう。
たとえば、デフォルトの状態で実行したとき、Finderに対してselectionで選択項目を取り出すと、戻り値(result)は、フォルダ項目を選択していれば、

folder OS_Mail_Environment

のようになる。選択しているフォルダ名と、クラス名のfolderだけが表示されている。同じプログラムを「-s s」というスイッチをosascriptにつけて実行すると、以下のように、スクリプトプログラム中でそのまま使える形式で、Finderで選択されているフォルダへの参照形式の文字列が得られる。

{folder "OS_Mail_Environment" of folder "msyk" of folder "Users" of startup disk of application "Finder"}

また、「-s o」というスイッチだと、エラー出力と結果が同じく標準出力に出てくる。今回のプログラムはスクリプトのエラーを検知するために、エラーはエラー出力に出すデフォルトのままにしてある。

スクリプトを動かす部分の根幹のプログラム部分を抜き出しておこう。以下の通りだ。

public class AppleScriptRunner {

private static String osascript = "/usr/bin/osascript";
//スクリプトを実行するコマンドのへのパス
private static String errorMessage = null;
//スクリプトのエラーメッセージを保持する変数
private static boolean isPrintScript = false;

public static synchronized String doScript(String script) throws Exception {
errorMessage = null;

if(isPrintScript) { //スクリプトを標準出力に書き出す場合
System.out.println("========== Execute the following script:");
System.out.println(script);
System.out.println("==========");
}
StringBuffer resultStr = new StringBuffer(""); //実行結果を得るための文字列
StringBuffer errorStr = new StringBuffer(""); //実行エラーを得るための文字列
try {
Process doProcess = Runtime.getRuntime().exec(osascript);
//osascriptコマンドを実行する
InputStream errStd = doProcess.getErrorStream();
//標準入出力、エラー出力へのストリームを参照
InputStream inStd = doProcess.getInputStream();
OutputStream outStd = doProcess.getOutputStream();
outStd.write(script.getBytes());
//スクリプトプログラムを、出力し、osascriptの標準入力へ突っ込む
outStd.close(); //スクリプトが終了したことを標準出力に教える
byte buffer[] = new byte[1024]; //バッファを用意
int readLength; //バッファから読み取ったデータ長
while((readLength = inStd.read(buffer, 0 , 1024)) >= 0)
resultStr.append(new String(buffer, 0, readLength));
//osascriptの標準出力を取得
while((readLength = errStd.read(buffer, 0 , 1024)) >= 0)
errorStr.append(new String(buffer, 0, readLength));
//osascriptのエラー出力を取得
if(errorStr.length() > 0) //エラー出力から文字列の出力があれば、
// エラーであるとみなし、エラー文字列を保持
errorMessage = errorStr.toString();
}
catch(Exception e) {
//内部で起こった例外は、呼び出し元にそのままスルー
throw e;
}
return resultStr.toString(); //出力結果を文字列として戻す
}

(続く)
関連リンク