マクロ言語の機能

XML の使用

Host On-Demand マクロ言語の XML 構文

Host On-Demand マクロは、Host On-Demand マクロ言語の XML エレメントを 使用して XML スクリプトに保管されます。 ここでは XML のいくつかの規則について説明し、Host On-Demand マクロ言語 の例を示します。

コード・エディター

コード・エディターを使用して、マクロ・スクリプトの XML テキストを 直接編集できます (コード・エディターを参照)。

コード・エディターとシステム・クリップボードの間で、テキストの カット・アンド・ペーストを行うことができます。 コード・エディターと、他の XML エディターやテキスト・エディターとの間で テキストを転送できるので、この機能は非常に重要です。

エレメントの階層

図 80 は、Host On-Demand マクロ言語の XML エレメント すべての開始タグのリストです。 このリストは、XML 構文の観点から見て有効なものではなく、 同じタイプのエレメントを複数指定できる個所を示していません。 ただしこのリストでは、他の XML エレメント内で指定できる XML エレメントを インデントによって示しています。例えば、リストの最初にあるエレメント (<HAScript> エレメント) は まったくインデントされていません。これは、このエレメントがマスター・エレメントであり、 他のエレメントをすべて含むことを示しています。 2 番目のエレメント (<import> エレメント) は、<HAScript> エレメントの 内側にあり、<type> エレメントを含みます。 以降も同様です。

図 80. Host On-Demand マクロ言語のエレメントの階層
<HAScript>                 スクリプト内の他のエレメントをすべて囲みます。
   <import>                <type> エレメントのコンテナー。
      <type>               インポートしたデータ型 (Java クラス) を宣言します。
   <vars>                  <create> エレメントのコンテナー。
      <create>             変数を作成し、初期化します。
   <screen>                1 つのマクロ画面に関する情報を含む画面エレメント。
      <description>        ディスクリプターのコンテナー。
         <attrib>          特定のフィールド属性を記述します。
         <cursor>          カーソルの位置を記述します。
         <customreco>      カスタム認識エレメントを参照します。
         <numfields>       画面内のフィールドの数を記述します。
         <numinputfields>  画面内の入力フィールドの数を記述します。
         <string>          画面の文字ストリングを記述します。
         <varupdate>       変数に値を割り当てます。
      <actions>            アクションのコンテナー。
         <boxselection>    ホスト・アプリケーション画面に選択ボックスを描画します。
         <commwait>        指定の通信状況が発生するまで待ちます。
         <custom>          カスタム・アクションを呼び出します。
         <extract>         ホスト・アプリケーション画面からデータをコピーします。
         <else>            else 条件を挿入できます。
         <filexfer>        ファイルをアップロードまたはダウンロードします。
         <if>              if 条件を挿入できます。
         <input>           ホスト・アプリケーションにキー・ストロークを送ります。
         <message>         ユーザーにメッセージを表示します。
         <mouseclick>      マウス・クリックをシミュレートします。
         <pause>           指定の時間だけ待ちます。
         <perform>         ユーザー提供の Java メソッドを呼び出します。
         <playmacro>       別のマクロを呼び出します。
         <prompt>          ユーザーにプロンプトを出して情報の入力を促します。
         <trace>           トレース・レコードを書き出します。
         <varupdate>       変数に値を割り当てます。
      <nextscreens>           <nextscreen> エレメントのコンテナー。
         <nextscreen>         有効な次のマクロ画面の名前を指定します。
      <recolimit>             認識限度に達した場合にアクションを行います。

エレメントの階層と、対応するマクロ・スクリプトの構造については、 本書のさまざまな個所で説明しています。 特に、次のセクションを参照してください。

個々のエレメントの説明については、マクロ言語エレメントを参照してください。

マクロ・スクリプトへのコメントの挿入

XML スタイルのコメント・ブラケット <!-- --> を 使用してコメントのテキストを囲むことにより、<HAScript> エレメント内の 任意の個所にコメントを挿入できます。

コメントは、次の用途に便利です。

コメントの形式

マクロ・スクリプトを保管する際に、コメントが次の形式に準拠するように、コード・エディターは必要に応じてコメントの形式を修正します。

コメントをどこに入れても、コード・エディターはこの方式に従って コメントを整列します (コメントの例を参照)。

コメント・エラー

コード・エディターは、次の状況が発生するとエラー・メッセージを表示します。

また、<HAScript> エレメントの外側でブラケット <!-- --> を 使用することはできません。 このようにした場合、コード・エディターはスクリプトを保管する際に これらのコメント・ブラケットと囲まれたテキストを破棄します。

コメントの例

次に、コメント・ブラケット <!-- --> を使用してコメントを挿入する例をいくつか示します。

<!--
A multi-line comment that comments on
the following <screen> element
-->
<screen name="Screen1" entryscreen="true" exitscreen="false" transient="false">

<!-- A comment on the following <description> element -->
<description>
   <oia status="NOTINHIBITED" optional="false" invertmatch="false" />
</description>

<! A comment on the following <actions> element -->
<actions>
   <mouseclick row="4" col="16" />
   <input value="3[enter]" row="0" col="0" movecursor="true"
             xlatehostkeys="true" />
</actions>
<!--
BEGIN
An accidental comment that surrounds part of
a <nextscreens> element,  thereby corrupting
the macro script.
You will get an error when you try to save
this macro script
<nextscreens timeout="0" >
   <nextscreen name="Screen2" />
END of accidental comment
-->
</nextscreens>
</screen>

<trace> エレメントを使用したマクロ・スクリプトのデバッグ

デバッグの際に <trace> エレメントを使用して、 テキストと値をトレース出力先に送ることができます。 特に、出力に変数の名前を組み込むと、マクロ・ランタイムは 変数の名前と値の両方を中括弧 {} で囲んで出力に表示します。 次に例を示します。

図 81. <trace> エレメントの使用例
<vars>
<create name="$var1$" type="string" value="'original'" />
</vars>
.
.
<actions>
<trace type="SYSOUT" value="'Before update: '+$var1$" />
<varupdate name="$var1$" value="'updated'" />
<trace type="SYSOUT" value="'After update: '+$var1$" />
</actions>

前の図に示したコードは、次のテキストを Java コンソールに出力します。

図 82. <trace> エレメントの使用例の出力
Before update: +{$var1$ = original}
After update: +{$var1$ = updated}

<trace> アクションが、それぞれの変数の変数名と変数の内容を 両方とも中括弧 {} で囲んで表示している点に注意してください。

マクロと組み合わせた Host Access Toolkit 製品の使用

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

図 83 は、ユーザーの ID とパスワード のプロンプトを出し、ホストにログオンして Welcome! と表示する、 マクロの 1 つ目のバージョンを示しています。 このバージョンのマクロは Host Access Toolkit を使用しません。

図 83. ユーザーの 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 でこの変更を行う方法の例を示します。

図 84. 変数更新アクションとプロンプト・アクションを変更する 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 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) の前に次の行を追加します。

図 85. 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 つを使用して)。例えば、次のコード・シーケンスも有効です。

図 86. 代替コード・シーケンス
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 が出されることに注意してください。

図 87. 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 を使用するサンプル・プログラム が、Host Access Toolkit の samples ディレクトリーにあります。