Searcherファイル名に特定の文字列を含むものを探すためのユーティリティをAgletにより実現したものです。これは2つのAgletで出来ています。一方はSearcherで移動しないエージェントです。他方はSearcherSlaveといい移動するエージェントです。SearcherSlaveはSearcherにより送出され(続けて) 複数のリモートホストを特定の文字列を含むファイルを探しながらまわります。全てのファイル名を集め終わるとSearcherSlaveは最後にSearcherへ戻り、集めてきたファイル名を表示します。
のちほど述べます
2つ以上のAgletサーバーをネットワーク上で実行させます(Agletサーバーの実行方法についてはここをご覧ください)。
Tahitiの"new aglet"パネルでクラス名を"ibm.aglets.samples.Searcher"と指定して Searcher Agletを生成します(Agletの生成に関してのより詳細な情報はTahiti ユーザーガイドをご覧ください)。Searcher Agletが生成されるとダイアログ・ウィンドウが開きます。
"File Name Substring"というフィールドの下にSearcherSlaveの旅行計画(これから巡回していくリモートAgletサーバーのURL)のパネルがあります。その下に結果のファイル名が表示されるパネルがあります。
atp://aglets.trl.ibm.com
またAgletサーバーがデフォルトのポート番号(434)以外で動いているなら次のようになります。
atp://aglets.trl.ibm.com:500
"File Name Substring"フィールドに、それを含むファイルを見つけたい文字列を指定します。フィールドの値が空白であれば(うえの例をご覧ください) すべてのファイル名が一致するものとなります。なお正規表現はサポートしていません。
Goボタンを押します。新たなSearcherSlave Agletが 生成され目的のホストに対して送り出されます。エラーが起これば、それに対応した エラーメッセージがダイアログ・ウィンドウの下部のパネルに表示されます。
注意:SearcherSlaveは行き先のAgletサーバーのTahitiの"Security Configuration"ダイアログでアクセスが許可されているファイルだけしかサーチできません。
H3>5. AddressBookの更新 AddressBookの更新はボタンを一回クリックしてパネルを表示させ、アドレスを選択するかまたは(deleteボタンを使って)消去します。 addボタンを押すとアドレスフィールドにあるアドレスがアドレス帳に登録されます。このパネルを消すにはCloseボタンを押します。SearcherSlaveは各リモートAgletサーバーでサーチが成功したことを報告します。 これらのメッセージはメッセージパネルに表示されます(うえの例をご覧ください)。
ファイル名は<hostname>::<file name>の形で結果のパネルに表示されます。旅行計画のパネルからURLを選んでshowボタンを押すと、特定のリモートホストについてのファイル名だけが表示されます。
Agletのサンプルのトラブルシューティングに関してはここ をお読み下さい。
このプログラムは以下のクラスで構成されています。
SearcherクラスはSampleAglet抽象クラスを継承してステーショナリーなAgletとして作られます(SampleAglet 抽象クラスについてはここを参照してください)。Searcher クラスのgoメソッドでスレーブAgletが作られます。
private final static String SlaveClassName = "ibm.aglets.samples.SearcherSlave"; void go(Vector destinations, String str) { super.go((URL)(destinations.firstElement())); try { Slave.create(null, SlaveClassName, getAgletContext(), this, new SeqItinerary(destinations), str); } catch (IOException ae) { ..... } }
スレーブは幾つかのリモートAgletサーバーを示す旅行計画(URLのVectorであるdestinationパラメータ)と探したいファイルに含まれる文字列(strパラメータ)を与えられます。 SearcherAgletはスレーブのマスターと考えられます(Slave.createメソッドの中ではthisという引数で表わされています)。
各リモートAgletサーバーでは、スレーブが新たなSearcherInfoオブジェクトをつくります。それにはホストの名前と検索パターンに一致したファイル名のVectorが含まれています。 これらのオブジェクトは集められて最終的にはスレーブの作業結果になります(スレーブに関してはこの先をご覧ください)。
SearcherAgletはマスターとしてスレーブの結果を受け取ります(callbackメソッドで処理は行われます)、またスレーブが各ローカルホストで検索を果たせなかったときにはエラーメッセージを受け取ります(inErrorメソッドで処理されます)。callbackメソッドはスレーブが得た結果SerchInfoオブジェクトのVectorを結果として受け取り、(addResultListメソッドを介して)マッチしたファイル名をすべて結果表示のためのダイアローグウィンドウ上に表示します。
protected synchronized void callback(Object arg) { String ni; // Slave is back... setTheMessage("Searcher has returned"); _fileList = (Vector)arg; for (int i = 0; i < _fileList.size(); i++) { SearcherInfo si= (SearcherInfo)(_fileList.elementAt(i)); Vector v = si.getFileList(); String URLString = si.getURLString(); for (int j=0; j < v.size(); j++) { ((SearcherWindow)_msw).addResultList( SearcherInfo.getFullPathName(URLString, (String)(v.elementAt(j)))); } } }SampleAgletクラスのhandleMessageメソッドはオーバーライトされSearcherSlaveにより送られる、各ホストで検索がうまくいったかどうかを示す「状況報告」メッセージを受け取るようになっています。これらのメッセージの処理はプライベートなstatusReportメソッドの中で行われます。
public boolean handleMessage(Message msg) { if ("status report".equals(msg.kind)) { statusReport((String)(msg.getArg())); return false; } else return super.handleMessage(msg); }
SearcherSlaveクラスはスレーブクラスの中の抽象メソッドを実装しています。そのなかにinitializeJob()とdoJob()というメソッドがあります。 initializeJob()メソッドの中では、スレーブクラスのresultインスタンス変数を空白のVectorとして初期化しています。この変数はスレーブの仕事の最終結果を保存しておくためのものです。そしてこの変数には最終的にスレーブのいる各リモートAgletサーバーで収集された情報(SearcherInfoオブジェクト)をまとめて入れます。
protected synchronized void initializeJob () { RESULT = new Vector(); }
protected synchronized void doJob() throws AgletException { String filename, readPath; filename = (String)ARGUMENT; _fileList = new Vector(); //-- a slave is always untrusted readPath = getAgletContext().getProperty("aglets.tahiti.untrusted.read", ""); //-- match the file names and collect into the _fileList variable if (!readPath.equals("")) { find(filename.toLowerCase(), //-- case insensitive readPath.toLowerCase()); } ((Vector)RESULT).addElement( new SearcherInfo( getAgletContext().getHostingURL(), _fileList)); //-- send "status report" message to the master reportMaster("Completed search"); }
doJob()メソッドの中では、スレーブがアクセス(読み取り)の許可されたディレクトリ(ファイル)を検索し、指定された文字列を含むファイル名を検索するために再帰的にそのディレクトリを探索していくように実装されています。一致したファイル名と、そこのホスト名は新たなSearcherInfoオブジェクトの中に貯えられます。そしてこのオブジェクトはresultインスタンス変数に追加されます。
Searcher Agletについてより詳細な情報をお望みならソースコードをお読み下さい。