program MyUIProgram type UIProgram {inputUIRecord = myInitialContainer}
// the Record parts for the following two declarations are shown
// in a later description of the "gateway record" data property
myInitialContainer InitialContainer;
myRepeatedContainer RepeatedContainer;
endCondition Boolean = false;
start, end Int;
myDataArray MySQLRecord[];
function main()
while (endCondition == false)
// The logic retrieves data (not shown)
// and determines what portion to send.
for (i int from start to end)
myRepeatedContainer.sendList[i] = myDataArray[n];
n = n + 1;
end
// no explicit JSON conversion is required here.
converse myRepeatedContainer;
// set endCondition in response to an input value
end
end
end
この例では、while ループが終了するのは、プログラムがリクエスターからの特定の値に応答して終了条件を設定する時点です。while ループが終了するもう 1 つの状況として、リクエスターが ServiceLib.endStatefulServiceSession を呼び出す時点があります。 2 番目の方法は推奨されません。特に、ゲートウェイ・サービスのリクエスターが Rich UI アプリケーションであり、EGL Rich UI プロキシーが UI プログラムと同じセッション内にある場合は推奨されません。 この場合、ServiceLib.endStatefulServiceSession 関数を呼び出して UI プログラムを終了すると、Rich UI アプリケーションがサービスにアクセスできなくなります。
program MyOtherUIProgram type UIProgram {}
const MENU_FORM int = 0;
const FORM_ONE int = 1;
const FORM_TWO int = 2;
// レコード・パーツは示されていません
myMenuContainer MenuContainer; // 整数を保持します (メニュー項目)
myFormOneContainer FormOneContainer; // フォーム 1 のデータとフォーム ID を保持します
myFormTwoContainer FormTwoContainer; // フォーム 2 のデータとフォーム ID を保持します
endCondition Boolean = false;
formNumber Int = MENU_FORM;
function main()
while (endCondition == false)
case (formNumber)
when (MENU_FORM)
converse myMENUContainer;
// 何らかの方法で処理され、formNumber が設定されます
when (FORM_ONE)
converse myFormOneContainer;
// 何らかの方法で処理され、formNumber が設定されます
when (FORM_TWO)
converse myFormTwoContainer;
// process in some way
endCondition = true;
otherwise
// 例外をスローします
end
end
end
end
EGL デプロイメント記述子エディターを使用して UI ゲートウェイ・サービスを Web サービスとしてデプロイするときには、そのサービスをコーディングした場合と同様に、デプロイメント記述子項目を使用できます。ステートフル EGL REST-RPC サービスをデプロイするには、エディターの「サービス・デプロイメント」タグでそのサービスがステートフルであることを指定できます。
UI プログラムの完全な例は『UI プログラムおよびデータ・グリッドを使用したエンドツーエンド処理』に記載されています。
リクエスターは JSON フォーマットでビジネス・データを受け渡しおよび受け取ります。また JSON 文字列は UIGatewayRecord 型のレコードのフィールドに組み込まれます。これについては、次のセクションで説明します。一般にこの型のレコードを操作するのは、UI プログラムをコーディングする場合ではなく、リクエスターをコーディングする場合です。
Record UIGatewayRecord
uiProgramName STRING;
data STRING;
dataEncoding EncodingKind;
terminated Boolean;
end
gateRec.uiProgramName = "myPkg.Translate";
サービスは、リクエスターに応答する際に、フィールド値が次に呼び出す EGL パーツを表していることを確認します (次に呼び出すパーツがある場合)。この場合も、通常は UI プログラムでゲートウェイ・レコードを明示的に更新しません。
Record InitialContainer
initialValue INT;
end
Record RepeatedContainer
numberOfRecords INT;
pageNumber INT = 1;
sendList theSQLRecord[]{};
end
gatewayServiceVar UIGatewayService{@BindService{bindingKey="UIGatewayService"}};
http://localhost:8080/MyWebProject/restservices/uiGatewayService
gateRec UIGatewayRecord;
gatewayRec.data = ServiceLib.convertToJSON( sendToProgram );
文字列には、UI プログラム向けの内容が反映されます。
call gatewayServiceVar.invokeProgram(gateRec)
returning to callbackFunc onException handleException;
function invokeProgram(gatewayRecord UIGatewayRecord INOUT);
function callbackFunc(gatewayRecord UIGatewayRecord in)
UI プログラム converse ステートメントに応答するリクエスターの場合、受け取るゲートウェイ・レコードの data フィールドの内容の構造は、UI プログラムに返される data フィールドの内容の構造と同等でなければなりません。データの内容は、異なっていてもかまいません。
UI プログラムに送信されるデータには、呼び出す EGL パーツの完全修飾名が含まれます。つまり、このデータにはパッケージ名とパーツ名が含まれます。パーツに別名がある場合、パーツ名の代わりにこの別名が使用されます。パーツは、別の UI プログラムであるか、または EGL ライブラリーである場合があります。
ServiceLib.convertFromJSON( gatewayRecord.data, dataRecord);
EGL2156E プログラム MyUIProgram に関連付けられているセッションが無効になりました。(EGL2156E The session associated with program MyUIProgram was invalidated.)
リクエスターは JSON 変換関数を使用しますが、UI プログラムは通常は JSON 変換関数を使用しません。
レコードにデータが取り込まれるときに、JSON 変換関数は使用されません。変換は自動的に処理されます。
show ステートメントは、UI プログラムから呼び出されるライブラリーでのみ有効です。
特定の converse ステートメントにより送信されるデータは、そのステートメントで受信されるデータと同じ構造でなければなりません。
show ステートメントと converse ステートメントでは JSON 変換関数は使用されません。リクエスターがプログラムを再度呼び出し、このプログラムによって converse ステートメントの後に続くステートメントが処理される場合は、必要な変換が自動的に処理されます。これには、converse ステートメントの後で行われる変換も含まれます。
このデフォルト値を受け入れるメリットは、ユーザーの思考時間中にアプリケーション・サーバー・リソースを解放できる点です。ただし、プログラム出口を有効にするには追加のコーディングが必要なことがあります。これは、EGL ランタイム・コードがファイルとデータベース接続を閉じ、ライブラリーを解放し、converse ステートメントで保存されない EGL システム変数の値をリセットするためです。
詳しくは、『テキスト UI プログラムのセグメンテーション』を参照してください。
UI プログラムの生成時には、j2ee ビルド記述子オプションが yes に設定されていることを確認してください。
Record MyException type Exception end
Program MyUIProgram type UIProgram {}
function main()
try
// リレーショナル・データベースからデータ配列を取得する
get mySQLRecord;
onException(except AnyException)
throw new MyException{message =
"Error at get mySQLRecord: " + except.message};
end
end
end
リクエスターとの継続的な会話中に UI プログラムがタイムアウトになると、次回リクエスターがこのプログラムを呼び出すときに例外が返されます。