ホスト・アクセス・クラス・ライブラリー (HACL) はオブジェクト・モデルがとても単純なので、 簡単に使うことができます。 ほとんどの機能を備えた、すべての HACL アプレットで使用できる 1 次クラスが、 5 つか 6 あります。 これらのクラスはすべて、 特定のホスト・コンピューターへのセッションに関連しており、 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 には、ユーザー定義のアプレットをロードして実行する機能があります。 ユーザー・アプレットは、「Run Applet」ダイアログから、 または「Startup Applet」として立ち上げることができます。 「Run Applet」ダイアログは、 「button bar」か「Assist」プルダウン・メニューを使用して表示できます。 このダイアログでは、 ユーザー定義クラスの名前 (.class 拡張子なし) を入力するよう求められ、 省略時のコンストラクターを使用してクラスのインスタンスが構成され、 Host On-Demand が使用している現行セッションへのアクセスがクラスに与えられます。 「Startup Applet」は、「session configuration」ウィンドウの「Advanced」タブで指定できます。
Host On-Demand によって呼び出されるメソッドは、 ECLAppletInterface と呼ばれるインターフェースで定義されています。 このインターフェースは、 Host On-Demand を使用して実行されるアプレットのメイン・クラスによってインプリメントされなければなりません。
Host On-Demand がここで作成したアプレットを呼び出せるようにするために、 最初にインプリメントする必要があるのは省略時のコンストラクターです。 省略時のコンストラクターはパラメーターを持っておらず、 クラスが動的にロードされるときに呼び出されます。 省略時のコンストラクターには、コードが含まれている必要はありません。
以下のサンプルでは、 MyClass と呼ばれるアプレット・クラス用の省略時コンストラクターを定義しています。
public MyClass()
これ以外に定義する必要があるのは、 ECLAppletInterface をインプリメントするのに必要な init() メソッドだけです。 これは Host On-Demand が呼び出す唯一の (コンストラクター以外の) メソッドなので、 init() メソッドが確実にアプレットを停止して実行するようにしなければなりません。 これを行うために、ECLPS に登録して PS 通知イベントの受信を開始します。
PS イベントを登録するだけではアプレットが開始されることはありません。 なぜならおそらくアプレットは最初の PS イベントを待っており、 アプレットの開始時には保留中のイベントがないからです。 この問題に取りかかるには、 現在のプレゼンテーション・スペースをすぐに認識するよう試みるか、 独自の PS イベントを生成して NotifyEvent() メソッドにそのイベントを処理させることができます。
以下のサンプルでは、init() メソッドを定義しており、 プレゼンテーション・スペースの初期状態を処理する方法の 1 つを示しています。 このサンプルでは、MyClass が ECLAppletInterface だけでなく ECLPSNotify をインプリメントしていることを想定しています。
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 をインプリメントしていることを定義する必要があります。