マクロと組み合わせた ZIE Host Access Toolkit 製品

別製品の ZIE Host Access Toolkit に組み込まれているクラスを使用して、マクロ変数の動的作成、マクロ・アクションの実行、およびマクロの実行が可能です。ここでは、ZIE Host Access Toolkit 製品の使用例を示します。

図 1 は、ユーザーの ID とパスワード のプロンプトを出し、ホストにログオンして Welcome! と表示する、 マクロの 1 つ目のバージョンを示しています。このバージョンのマクロは ZIE Host Access Toolkit を使用しません。
図 1. ユーザーの ID と パスワードのプロンプトを出すサンプル・マクロ
<HAScript name="Logon" description="" timeout="60000" pausetime="300"
          promptall="true" author="" creationdate="" supressclearevents="false"
          usevars="true" >

  <screen name="Screen1" entryscreen="true" exitscreen="false" transient="false">

    <description>
      <oia status="NOTINHIBITED" optional="false" invertmatch="false" />
    </description>

    <actions>
      <prompt name="'UserID:'" description="" row="20" col="16" len="8"
              default="" clearfield="false" encrypted="false" movecursor="true"
              xlatehostkeys="true" assigntovar="" varupdateonly="false" />
      <input value="'[tab]'" row="0" col="0" movecursor="true"
              xlatehostkeys="true" encrypted="false" />
      <prompt name="'Password:'" description="" row="21" col="16" len="8"
              default="" clearfield="false" encrypted="true" movecursor="true"
              xlatehostkeys="true" assigntovar="" varupdateonly="false" />
      <input value="'[enter]'" row="0" col="0" movecursor="true"
              xlatehostkeys="true" encrypted="false" />
    </actions>
    <nextscreens timeout="0" >
      <nextscreen name="Screen2" />
    </nextscreens>
  </screen>

  <screen name="Screen2" entryscreen="false" exitscreen="true" transient="false">
    <description>
      <oia status="NOTINHIBITED" optional="false" invertmatch="false" />
      <numfields number="7" optional="false" invertmatch="false" />
      <numinputfields number="1" optional="false" invertmatch="false" />
    </description>
    <actions>
      <message title="" value="'Welcome!'" />
    </actions>
    <nextscreens timeout="0" >
    </nextscreens>
  </screen>

</HAScript>
このマクロを Host Access Beans プログラムで使用し、 ユーザー ID を変数に格納して、後で使用する (例えば、Welcome メッセージ の中で) ために保管したいとします。この用途のために直接マクロを変更することもできますが、 このためのプログラムを作成する理由の 1 つは、 さまざまな状況に応じて多数の異なるマクロを保持しなくて済むようにすることです。代わりに、マクロの基本バージョンを作成し、プログラムを使用して マクロを状況に応じて変更できます。次に、Java でこの変更を行う方法の例を示します。
図 2. 変数更新アクションとプロンプト・アクションを変更する Java コード
// Assume macro is an instantiated Macro with the appropriate listeners set up.
// (See the Javadoc for the Macro bean and the Macro variables demo program,
// MacroVariablesDemo.java, in the ZIE Host Access Toolkit samples directory
// for details.)
// Assume macroString is a String containing the previous macro script

macro.setMacro(macroString);
MacroScreens ms = macro.getParsedMacro();
ms.createVariableString("$userid$", null);   //creates a variable $userid$ with
                                             //initial value of ""
MacroScreen mscrn = ms.get(0);   //get the first screen
MacroActions mas = mscrn.getActions();   //get the actions from the first screen
MacroActionPrompt map = (MacroActionPrompt)mas.get(0);   //get the first prompt action
map.setAssignToVar("$userid$"); //assign the prompt response to the variable $userid$
MacroScreen mscrn2 = ms.get(1); //get the second screen
MacroActions mas2 = mscrn2.getActions(); //get the actions from the second screen
MacroActionMessage mam = (MacroActionMessage)mas2.get(0); //get the message action
mam.setMessage("'Welcome ' + $userid$ + '!'"); //change the message to now be a
                                               //personalized message using $userid$
macro.setParsedMacro(ms); //reset the macro with the updated MacroScreens
macro.play(); //play the macro with the changes for variables 
ここで、Screen2 のアクションに 2 つ目のメッセージを追加したいとします。このメッセージには、画面から抽出した時刻と日付を表示します。この場合、 macro.setParsedMacro(ms) の前に次の行を追加します。
図 3. 2 つ目のメッセージの追加
//create a variable $datetimestamp$ with initial value ""
ms.createVariableString("$datetimestamp$", null);

//create new extract to get date and time from second row of screen
MacroActionExtract mae = new MacroActionExtract(2, 35, 2, 71, "'datetimeextract'");

//assign the date and time string to $datetimestamp$
mae.setAssignToVar("$datetimestamp$");

//add the extract after the first message
mas2.add(mae);

//create a new message to display the date and timestamp
MacroActionMessage mam2 = new MacroActionMessage(
   "'You have logged on at ' + $datetimestamp$", "'Date Time Stamp'");

//add the message after the extract
mas2.add(mam2);
変数を含む属性が MacroScreens に関連付けられる時点で、 変数は既に作成済みであることが必要なので注意してください (createVariable() メソッドの 1 つを使用して)。例えば、次のコード・シーケンスも有効です。
図 4. 代替コード・シーケンス
MacroActionExtract mae = new MacroActionExtract(2, 35, 2, 71, "'datetimeextract'");
mae.setAssignToVar("$datetimestamp$");
ms.createVariableString("$datetimestamp$", null);
mas2.add(mae);
MacroActionMessage mam2 = new MacroActionMessage("'You have logged on at ' +
   $datetimestamp$", "'Date Time Stamp'");
mas2.add(mam2);

MacroActionExtract が MacroActions に追加される前に $datetimestamp$ が作成されるので、前記のシーケンスは有効です (MacroActions は、 元は MacroScreens から取り出されたものなので、既に MacroScreens と関連付けられています)。前記のシーケンスの最後に createVariable() メソッドが呼び出される場合、 シーケンスは無効になります。これは、MacroActionExtract と MacroActionMessage が MacroActions に追加されて MacroScreens に関連付けられた時点では、 変数 $datetimestamp$ は使用可能でないからです。

MacroScreens メソッド isUseVars() のデフォルト値は false です。ただし、MacroScreens に対して createVariable() メソッドの 1 つを 呼び出した場合、isUseVars() は自動的に true を戻します。変数を作成せず、属性から変数と算術式がスキャンされるようにしたい場合は (例えば、 チェーニングした子マクロを作成していて、子マクロが自身の変数を 持たず、親からの変数を期待している場合)、MacroScreens に対して setUseVars(true) を 呼び出す必要があります。

変数または式を引数にすることができる属性には、 setAttribute(String) メソッドと、getAttributeRaw() または isAttributeRaw() の どちらかのメソッドを使用できます。式を使用して MacroActionInput の行属性を表したい場合は、setRow("$rowvar$ + 1") を 呼び出すことができます。その後、getRow() を呼び出すとこの式の評価値 (整数) が戻されます。 一方、getRowRaw() を呼び出すと "$rowvar$ + 1" が戻されます。次のようにすると、NumberFormatException が出されることに注意してください。
図 5. NumberFormatException を 引き起こすコード
MacroActionInput mai = new MacroActionInput();
mai.setRow("$rowvar$ + 1");
int row = mai.getRow(); 
これは、isUseVars() が true になる MacroScreens に mai がまだ関連付けられていないからです。このため、"$rowvar$ + 1" は変数 + 1 ではなくストリングとして扱われます。もう 1 つの注意点として、setAttribute() メソッドの呼び出しによる変数と式の セットアップは、これらの属性を含むオブジェクトが MacroScreens に 関連付けられた後で行えば、処理時間の節約が期待できます。 このようにしないと、属性が MacroScreens に追加された時点で、 属性の変数/式を再度構文解析する必要が生じます。

VariableException クラスを使用して、無効な式 (例: "45 *") や 正しくない演算オペランド (例: "'3a' * 2") などの例外を検出できます。

プログラム式マクロ MacroVariablesDemo.java を使用するサンプル・プログラムが、ZIE Host Access Toolkit の samples ディレクトリーにあります。