ホスト・アクセス・クラス・ライブラリー (HACL) はオブジェクト・モデルがとても単純なので、簡単に使うことができます。一般的には、5 つか 6 つのプライマリー・クラスを使用することにより、どのような HACL アプレットでもほとんどの機能を利用することができます。これらのクラスはすべて、特定のホスト・コンピューターへのセッションに関連しており、 ECLSession のインスタンスから入手できます。
最初に行うことは、ECLSession クラスを使用してホストとのセッションを定義することです。これは、セッション構成を構成しているキーワードと値の対が存在する、java.util.Properties オブジェクトによって構成されています。セッションには、タイプ (3270、5250、VT)、ホスト、ポート、ID、表示スペース・ディメンション (たとえば、24 行 x 80 桁)、コード・ページ、およびセッション・タイプに特有のその他のものを含むさまざまな構成パラメーターがあります。ホストを除くすべてのパラメーターには、タイプを含んだ 3270 エミュレーション・セッションのデフォルト値があります。
以下のサンプルでは、指定のホストまたは TN3270/5250 サーバーへのセッションを定義していますが、通信を開始してはいません。
ECLSession s = null; Properties p = new Properties(); // This is the name of the host or TN server p.put(ECLSession.SESSION_HOST, new String("myHost")); // Set the SESSION_CODEBASE parameter when running from a Web page. // The use of 'this' assumes that the current class extends // java.applet.Applet // p.put(ECLSession.SESSION_APPLET, this); try { s = new ECLSession(p); } catch(ECLErr e) { System.out.println(e.GetMsgText()); }
ターゲット・ホストとのセッションを定義した後で、表示スペースにアクセスし、対話することができます。表示スペースは、ECLPS クラスにカプセル化されており、そのインスタンスは ECLSession の GetPS() メソッドを使用して取得できます。 ECLPS には、テキストの操作、検索の実行、ホストへのキーストロークの送信、カーソルの処理を行うメソッドがあります。
以下のサンプルでは、上記で確立したセッションから ECLPS のインスタンスを取得しています。
ECLPS ps = s.GetPS()
ECLPS のインスタンスが確立された後で、表示スペースの変更通知を受信するように登録することができます。表示スペースが変更されるたびに、登録済みオブジェクトに通知されます。このイベント通知モデルは、表示スペースとの対話を進めるためにアプリケーションが使用する基本メカニズムです。
以下のサンプル・コードでは、現行クラスを ECLPS のインスタンスに登録し、ターゲット・ホストとの通信を開始しています。このサンプルは、ECLPS に登録されるまでは、ホストとのセッション (StartCommunication() への呼び出し) を開始しないことに注意してください。これは、アプレットでの不適切な動作を引き起こす可能性のある表示スペース・イベントを見逃さないようにするためです。
try { ps.RegisterPSEvent(this); } catch(ECLErr e) { System.out.println(e.GetMsgText()); } // Start the session after registration so we don't // miss any presentation space events. s.StartCommunication()
これで表示スペース・イベントに登録できましたが、クラスがイベントを受信できるようにするメソッドを実装する必要があります。 これらのメソッドは、 ECLPSListener インターフェースによって定義されますが、登録したいクラスには、このインターフェースを実装する必要があります。
ECLPSListener インターフェースは、表示スペース内で生じるさまざまな種類のイベントを処理する 3 つのメソッドで構成されています。 PSNotifyEvent() メソッドは、エラーでない通常のイベントを処理し、イベントを受信して処理するためのメイン・メソッドです。 PSNotifyStop() メソッドは停止イベントを処理し、 PSNotifyError() メソッドはイベント生成中に生じるエラーを処理します。
以下のサンプルでは、画面を認識し、それらの異なる画面に対して処理を行うサンプルの PSNotifyEvent() メソッドを定義しています。
public void PSNotifyEvent(ECLPSEvent evt) { if (ps.SearchText("some text on the login screen", ps.SEARCH_FORWARD)) { ps.SendKeys("myUserID"+ps.FWDTAB_STR+"myPW"+ps.ENTER_STR); } return; }
直前のサンプルでは、特定のホスト画面 (「login prompt」など) を認識した後で、現行カーソル位置からユーザー ID とパスワードをホストに送信します。このサンプルでは、他の 2 つのメソッド (PSNotifyStop() と PSNotifyError() ) は示されていないことに注意してください。これらは、ECLPSListener インターフェースに準拠させるために実装する必要があります。
初めての HACL アプレットについて行わなければならないことは、これがすべてです。
Host On-Demand には、ユーザー定義のアプレットをロードして実行する機能があります。ユーザー・アプレットは、「アプレットの実行」ダイアログから、または「始動アプレット」として立ち上げることができます。「アプレットの再生」ダイアログは、「ボタン」か「補助」プルダウン・メニューを使用して表示できます。このダイアログでは、ユーザー定義クラスの名前 (.class 拡張子なし) を入力するよう求められ、デフォルトのコンストラクターを使用してクラスのインスタンスが構成され、現行セッションへのアクセスがクラスに与えられます。「始動アプレット」は、「セッション構成」ウィンドウの「拡張」タブで指定できます。
パーソナル・コミュニケーションズには、
Host On-Demand の「アプレットの実行」機能に似ている「Java アプレットの実行」機能だけがあります。
アプレットのロード時に呼び出されるメソッドは、 ECLAppletInterface と呼ばれるインターフェースで定義されています。このインターフェースは、この機能を使用して実行されるアプレットのメイン・クラスによって実装されなければなりません。
アプレットを実際のエミュレーター・ウィンドウ内で実行できるようにするために、最初に実装する必要があるのはデフォルトのコンストラクターです。デフォルトのコンストラクターはパラメーターを持っておらず、クラスが動的にロードされるときに呼び出されます。デフォルトのコンストラクターには、コードが含まれている必要はありません。
以下のサンプルでは、 MyClass と呼ばれるアプレット・クラス用のデフォルトのコンストラクターを定義しています。
public MyClass() { }
これ以外に定義する必要があるのは、 ECLAppletInterface を実装するのに必要な init() メソッドだけです。これはアプレットのロード時に呼び出す唯一の (コンストラクター以外の) メソッドなので、 init() メソッドが確実にアプレットを停止して実行するようにしなければなりません。これを行うために、ECLPS に登録して PS 通知イベントの受信を開始します。
PS イベントを登録するだけではアプレットが開始されることはありません。なぜならおそらくアプレットは最初の PS イベントを待っており、アプレットの開始時には保留中のイベントがないからです。この問題に対処するには、現在の表示スペースをすぐに認識するよう試みるか、独自の PS イベントを生成して PSNotifyEvent() メソッドにそのイベントを処理させることができます。
以下のサンプルでは、init() メソッドを定義しており、表示スペースの初期状態を処理する方法の 1 つを示しています。このサンプルでは、MyClass が ECLAppletInterface だけでなく ECLPSListener を実装していることを想定しています。
public void init(ECLSession session) { ps = session.GetPS(); // Register with ECLPS to receive updates and new screens try { ps.RegisterPSEvent(this); } catch(Exception e) { System.out.println("Registration Exception"); } // Call our PSNotifyEvent() method to handle the initial state of the PS PSNotifyEvent(new ECLPSEvent(ps)); }
ECLPSListener インターフェースで要求されているように、PSNotifyEvent()、PSNotifyStop()、および PSNotifyError() メソッドも定義しなければならないことを忘れないでください。さらに、MyClass は、そのクラス宣言において ECLAppletInterface を実装する必要があります。