Aglets Workbench

To Aglets Workbench Home page Searcherアプリケーション

解説

トラブルシューティング

プログラム解説

このプログラムは以下のクラスで構成されています。

Searcherクラス

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クラス

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についてより詳細な情報をお望みならソースコードをお読み下さい。


IBM home page | 日本IBM | 著作権 | 商標
Last modified: Fri December 27 12:00:00 JST 1996