説明

ビジネス用コンピュータ・システム及びその動作制御方法

【課題】プロセッサと、メモリと、ハード・ドライブとを有するビジネス用コンピュータ・システムの動作を制御するシステムを提供する。
【解決手段】ビジネス用コンピュータ・システムは、コンピュータ・システムの状態マシンの実施を定義する仕様言語ステートメントを含むハード・ドライブ上に格納された仕様言語ファイルと、仕様言語ファイルから仕様言語ステートメントを抽出するため、および抽出された仕様言語ステートメントを解釈するためのパーサと、実行可能なコンパイル済みプログラム・ステートメントを含むビジネス・ロジック・モジュールより構成されるビジネス・ロジック・アプリケーション・プログラムとを備え、パーサは、仕様言語ファイルからパーサによって抽出されたメッセージを処理するために、ビジネス・ロジック・モジュールのうちの少なくとも1つを呼び出す。

【発明の詳細な説明】
【技術分野】
【0001】
本開示は、コンピュータで実施されるビジネス用コンピュータ・システムに関し、特に、販売時点でビジネス・トランザクションを処理するためにコンピュータで実施されるコンピュータ・システムに関する。
【背景技術】
【0002】
ビジネス用コンピュータ・システム(以下、適宜「ビジネス・システム」という)は、ビジネス・トランザクションまたは機能を容易にするようにプログラミングされたコンピュータ・システムとして記述することができる。例えば、コンピュータは、ユーザからの入力を受け入れるように、およびトランザクションの明細を明らかにし、トランザクション・イベントのログを報告するために、特定の環境でイベントが発生した場合にそれらを検出するように、プログラミングすることができる。管理者がこれらの報告を使用して、業務に関する情報を引き出すか、または効率を向上させるためにビジネスの様々な面を修正することができる。例えば、在庫管理システムは、トランザクションの検証、製品が在庫に入庫された場合のこれの記録、および在庫から製品が出庫された時点での製品累積の更新のためにプログラミングされたコンピュータで構成することができる。これらのトランザクションに使用されるデータは、キーボードを通して、またはバーコード・リーダなどを通して、入力することができる。その後このシステムは、現在の在庫レベルおよび発生したトランザクションのボリューム・レベルを管理者に報告するために、1つまたは複数の報告を生成することができる。
【0003】
一般的に遭遇する他のビジネス・システムは、通常、小売店の販売時点場所で使用されるチェックアウト・ステーションである。これらの販売時点(POS)ステーションは、単純な電子キャッシュ・レジスタとするか、または複雑なセルフ・チェックアウト・ステーションとすることができる。より複雑なPOSシステムには、オペレータからのコマンド入力のためのキーパッド、バーコードの読み取りおよびアイテムの計量のためのセンサ、ならびに、それぞれデータの読み取りおよび格納ならびにリモート・サイトへのデータの通信のためのデータベースおよび通信機器が含まれる。これらのPOSシステムは周知のものである。これらのPOSステーションでは、購入物品は識別可能なようにスキャンされる。端末は、中央リポジトリから価格を取り出し、より柔軟な物品の価格付けをサポートすることができる。すべての購入アイテムがPOS端末に提示されると、小計が累積され、税金または値引きがあれば計算され、合計支払い金額が消費者に表示される。POS端末またはステーションは、トランザクションに関する支払いを処理するための、キャッシュ・レジスタ機能、クレジットまたはデビット・カード・リーダ、あるいはスマート・カード・インタフェースも含むことができる。提示された支払いが確認されると、物品は消費者に引き渡される。販売が完了すると、ステーションは在庫管理システムと通信し、販売されたアイテムについて在庫を更新することができる。
【0004】
POSチェックアウト・ステーションは、通常、端末と、単価コード(UPC:Unit Price Code)を読み取るためおよび物品の重量を決定するためのスキャナ/秤と、レジ係のキーパッドおよびディスプレイと、支払い入力のためのPOS端末と、レシート・プリンタと、つり銭ユニットと、いったんスキャンされた物品を保持するためのチェックアウト領域とを含む。POS端末は、また、ディスプレイと、プロセッサと、メモリと、プログラム済み命令と、ステーションの動作を制御するためのデータ周辺装置とを含む。プログラム済み命令は、物品の価格に関してデータベースを照会し、合計を算出し、チェックアウト・ステーションを通じて物品の購入に関する他の機能を実行するモジュールを含むことができる。一部のチェックアウト・ステーションは、また、チェックアウト時に不正な物品の差し替えが発生する確率を減らすために、秤および/またはカメラなどのセンサからのデータを使用するセキュリティ・アプリケーション・プログラムを含むこともできる。
【0005】
チェックアウト・ステーションは、多くの異なる企業によって製造される。POSシステムの動作は一般に似ているが、各製造業者は、異なる方法でトランザクションを実行するプログラム・コードを実施する。例えば、キーパッドのキーによって生成されるコードまたはセンサ・システムとのインタフェースは、製造業者によってわずかに異なる方法で実施することができる。したがって、POSシステムの1つまたは複数のプロセッサによって実行されるプログラミングは、製造業者によって異なる。
【0006】
ほとんどの製造業者は、チェックアウト・ステーションに必要なすべての機能を実施する1つの単一プログラムを有するのではなく、何らかのタイプのモジュラ・プログラミングを備えるPOSシステム・コントローラを実施する。モジュラ・プログラミングでは、POSシステムによって実施されるビジネス・ロジックがサブ機能にセグメント化される。これらのサブ機能は、離散プログラミング・オブジェクトまたはモジュールとして実施される。これらのモジュールまたはオブジェクトには、オブジェクトまたはモジュールが出力を生成するために処理する入力データが提供される。このプログラミングのためのモジュラ方式を使用して、コンピュータ・プログラムの保守を容易にし、システムの機能を区分化して、新しい機能をより簡単に組み込めるように修正する。
【0007】
上記モジュールおよびオブジェクトは、プログラムの保守および適合性を容易にする一方で、通常は、トランザクションまたは他のビジネス・プロセスを実施するために階層構造に結合される。モジュールを互いに結合するために使用される階層および制御論理は、プログラミング言語でも実施される。制御論理および階層を実施するプログラミング・ステートメントは、POSシステム用のフレームワークを形成する。これらのプログラム・ステートメントは、POSシステムの種々のサブ機能を実施するために使用されるプログラム・オブジェクトおよびモジュールの実行を制御するために、コンパイルされ、コンピュータ上にインストールされる。このようにPOSシステムのすべての制御論理を実施することは、モジュラ・プログラミングの原理に反する。トランザクションを処理するために制御論理を変更しなければならない場合、POSシステムを実施するコンピュータ上で、ビジネス・ロジックに関するプログラミング・ステートメントを改訂、再コンパイル、および再インストールしなければならない。さらに、プログラミング論理が実行される製造業者のプラットフォームと互換性のある方法で、この変更を再プログラミングしなければならない。すなわち、ビジネス・ロジックは、製造業者のサブ機能の実施と互換性のある方法で修正しなければならない。したがって、POSシステムに関するビジネス・ロジックを実行する制御論理の修正には、システム向けのハードウェア環境およびシステムの実施に使用されるプログラミング言語に十分注意を払う必要がある。
【発明の開示】
【発明が解決しようとする課題】
【0008】
システムは、実行可能なコンピュータ論理を再コンパイルする必要なしに柔軟性を提供するような形で、プロセッサと、メモリと、ハード・ドライブとを有するビジネス・システムの動作を制御する。このシステムは、ビジネス・システムの状態マシンの実施を定義する仕様言語ステートメントを含むハード・ドライブ上に格納された仕様言語ファイルと、仕様言語ファイルから仕様言語ステートメントを抽出するため、および抽出された仕様言語ステートメントを解釈するためのパーサと、実行可能なコンパイル済みプログラム・ステートメントを含むビジネス・ロジック・モジュールより構成されるビジネス・ロジック・アプリケーション・プログラムとを備え、パーサは、仕様言語ファイルからパーサによって抽出されたメッセージを処理するために、ビジネス・ロジック・モジュールのうちの少なくとも1つを呼び出す。
【課題を解決するための手段】
【0009】
上記システムによって実施可能な方法は、実行可能なコンピュータ論理を再コンパイルする必要なしに柔軟性を提供する形で、ビジネス・システムの動作を制御する。この方法は、仕様言語ステートメントを使用してビジネス・システムの状態マシンの実施を定義するステップと、ビジネス・システムを実施するために仕様言語ステートメントを解釈するステップと、解釈された仕様言語ステートメントからパーサによって抽出されたメッセージを処理するために、実行可能なコンパイル済みプログラム・ステートメントを含むビジネス・ロジック・モジュールを呼び出すステップとを含む。
【0010】
本明細書で説明するシステムおよび方法の利点および特徴は、添付の図面および以下の詳細な説明を再検討することから明確に理解することができる。
【0011】
本開示に記載されたシステムおよび方法は、種々の構成要素および構成要素の配置構成ならびに種々の方法の形を取ることができる。図面は、例示的実施形態および代替実施形態を示すことのみを目的とし、本発明を制限するものとして解釈されるべきではない。
【発明を実施するための最良の形態】
【0012】
図1に、本発明の原理に従って修正することが可能なチェックアウト・ステーションを示す。チェックアウト・ステーション10は、フィーダ・ユニット14と、チェックスタンド18とを含むことができる。フィーダ・ユニット14は、フィーダ・ベルト20と、フィーダ・ベルト20を動作させるモータおよび制御回路用のハウジング22とを含む。フィーダ・ユニット14は、フィーダ・ベルトがスキャナ/秤ユニット26と位置合わせ可能なように、チェックスタンド18と可動的に結合される。チェックスタンド18は、スキャナ/秤ユニット26と、消費者端末34と、支払いデータ入力用の支払い端末38と、レシート・プリンタ44とを含む。スキャナ/秤ユニット26は、ガラスまたは他の透明なプラテン上で光るレーザを使用して、製品またはパッケージに貼付されたバーコードからのデータを入力する。ユニット26は、また、重量ベースの価格/単位で販売される物品の重量を測定するための秤を含むことができる。消費者端末34は、スキャナ/秤ユニット26を通して入力された物品のデータを表示する。支払い端末38は、クレジット・カード、デビット・カード、および他の支払い方法をサポートするためのカード・リーダ32を組み込む任意の周知のPOS端末とすることができる。レシート・プリンタ44は、購入した物品および支払いの方法を箇条書きにしたレシートを消費者に提供する。
【0013】
レシート・プリンタ44およびスキャナ/秤ユニット26は、その床面としてセキュリティ秤48を有するバッグ受け台46によって分離することができる。消費者がスキャンおよび計量した物品を格納するためのバッグは、バッグ受け台46内の吊りレール50から吊り下げられる。セキュリティ秤48は、スキャナ/秤26から導出された物品の重量データ、またはスキャン済みの単位製品コード(UPC:Unit Product Code)を使用するデータベースを使用して、スキャン済みの物品のみがセキュリティ秤上に置かれていることを検証する。端末34内で動作するセキュリティ・アプリケーション・プログラムは、スキャンされていない物品がセキュリティ秤領域に追加されていないかどうかを判別するために、セキュリティ秤48を監視する。チェックスタンド18のインジケータ・ポール52の終端に取り付けられた3色インジケータ内で、警告または警報色光を光らせることによって、検査を必要とする特異な条件を信号によって示すことができる。チェックスタンド領域に対応するビデオ・データを生成するために、インジケータ・ポール52上にセキュリティ・カメラ56を取り付けることができる。データベース、ディスク・ドライブ、またはステーションの動作に必要な他のコンピュータ周辺機器を、チェックスタンド18内に配置された周辺トレイ60内に収容することができる。チェックスタンド18は、また、トランザクションに関する支払いとして、消費者から貨幣または硬貨を受け取るための上部貨幣モジュール40を含む。モジュール40は、また、消費者のつり銭のうちの硬貨部分を返却する硬貨支払機36を含む一方で、下部貨幣モジュール42は、消費者のつり銭のうちの紙幣部分を返却する。モジュール40は、また、消費者に支払われるつり銭の中に、消費者から受け取った現金を提供するための現金リサイクル・ユニット(図示せず)も含むことができる。
【0014】
図1に示すように、消費者は、フィーダ・ベルト20上に物品を置くことが可能であり、ベルト20が駆動して物品をベルト20の端部まで運び、ここでシャットオフ機構がベルト20を停止させる。次に消費者は、ベルト20から物品を1つずつ取り除き、製品データの検索および/または計量のためにスキャナ/秤26上を移動させる。別の方法として、消費者は、購入用の物品が入ったカートをフィーダ・ユニット22に隣接するように引き寄せ、カートからスキャナ/秤26上へ物品を置くこともできる。次に、スキャン済みの物品をセキュリティ秤48上のバッグに入れることができる。すべての物品がスキャンされると、消費者は支払い端末38または貨幣モジュール40を通して支払いを行い、モジュール44からのつり銭とプリンタ44からのレシートを受け取ることができる。次に消費者は、セキュリティ秤48からバッグを取り外し、ステーション10を離れることができる。このチェックアウト・ステーション10の動作は、通常は、端末34に組み込まれたプロセッサによって制御される。
【0015】
ビジネス・ロジック・システムの状態マシン実施を動作させるために使用可能なシステムを示すブロック図が図2に示されている。システム100は、ハード・ドライブ上に格納可能な状態マシン定義104と、状態マシン定義104から仕様言語ステートメントを抽出するため、および抽出された仕様言語ステートメントを解釈するためのパーサ108と、ビジネス・ロジック・モジュールより構成されるビジネス・ロジック・アプリケーション・プログラム110とを含む。ビジネス・ロジック・モジュールは、より詳細に以下で説明するアクションとして示すことが可能な、実行可能なコンパイル済みプログラム・ステートメントを含む。パーサは、状態マシン定義の仕様言語ステートメントからパーサによって抽出されたメッセージを処理するために、ビジネス・アプリケーション・プログラム110のビジネス・ロジック・モジュールを呼び出す。仕様言語ステートメントは、好ましくは仕様言語ファイル内に含まれる。これらのステートメントは、ビジネス・システムの状態マシン実施を定義する。
【0016】
より詳細には、以下でより詳細に説明するチェックアウト・ステーションなどのビジネス・システムに関する仕様言語定義は、チェックアウト・ステーション用の販売時点(POS)システムの製造業者によって提供されるデータ・リンク・ライブラリ(DLL)を使用する。仕様言語ステートメントによって定義される状態マシン実施は、DLLに含まれるビジネス・ロジック・モジュールを使用して、チェックアウト・ステーションを動作させる。これらのモジュールは、チェックアウト・ステーションの製造業者によって開発されたコンパイル済みの実行可能コンピュータ・コードである。これらのモジュールは、バーコードの読み取り、販売トランザクションの累積および合計、商品の計量、支払いの処理、およびレシートの発行などのシステムの動作を実施する。これらの機能をチェックアウト・システムに編成するビジネス・ロジックは、仕様言語ステートメントによって定義される状態マシン実施に従って実行される。状態マシン実施は、また、他の仕様言語文書および/またはカスタマイズされたDLLによって補足することもできる。
【0017】
システム初期設定が実行されると、以下でより詳細に説明するように、パーサは、仕様言語ファイルからの仕様言語ステートメントの抽出を開始する。抽出された仕様言語ステートメントは、パーサによって解釈される。この解釈は、以下でより詳細に説明するように、それらのタグによる仕様言語ステートメントの識別、および解釈された仕様言語ステートメントで識別されたビジネス・ロジック・モジュールへの呼び出しの起動を含む。以下でより詳細に説明するように、これらのビジネス・ロジック・モジュールは、プログラミング言語オブジェクトによって実施することができる。オブジェクトはメソッドを含むことが可能であり、これらのメソッドは、仕様言語ステートメントから抽出されたメッセージなどのデータを処理するために、パーサによって呼び出される。これらのオブジェクトは、システムを動作させるためのビジネス・ロジックの最小単位である、アクションを実施するために使用される。したがって、仕様言語ファイルは、チェックアウト・ステーションの動作に必要なビジネス・ロジックを定義するためのフレームワークを提供し、DLLのモジュールまたはオブジェクトは、ビジネス・ロジックを実施するために必要な実行可能コンピュータ・コードを提供する。この構造によって、チェックアウト・ステーションの動作ならびに保守の修正が容易になる。より詳細には、チェックアウト・ステーションの動作は、コンピュータ内の実行可能コードを再コンパイルおよびインストールする必要なしに、仕様言語ステートメントを変更するだけで修正することができる。
【0018】
次に、チェックアウト・ステーションの実施についてより詳細に説明する。この実施では、チェックアウト・ステーションの動作を制御するための状態マシンの生成および状態マシンの初期設定について説明する。次に、仕様言語ステートメントを式に編成することを含む仕様言語ステートメントの構造に関する詳細が提供される。これらの式は、仕様言語ステートメント内の式タグ(expression tag)を特定するため、および特定された式タグに従って、対応するタグ間の仕様言語ステートメントを解釈するために、パーサ内に組み込まれた式インタプリタ(expression interpreter)によって解釈することができる。ビジネス・ロジック・モジュールを呼び出して仕様言語ファイルから抽出されたメッセージを処理するために、メソッド・インボーカをパーサに組み込むこともできる。チェックアウト・ステーションに対して実施されるアクションに関する詳細について説明する。状態マシン実施のデバッグ、アクションを実施するクラスに対するJAVAサポートの提供、およびビジネス・システムの動作を増大するための状態マシン実施のクラスタ化に関する追加の特徴についても説明する。
【0019】
ビジネス・システムを動作させるために、状態マシンのインスタンスが生成される。状態マシンのインスタンスを生成するために、CStateMachineFactoryオブジェクトの静的ファクトリ・メソッドBuildStateMachineを、パラメータのリストと共に呼び出すことができる。CStateMachineFactoryオブジェクトは、チェックアウト・ステーションなどのビジネス・システム・プラットフォームの製造業者によって提供されるプログラミング言語オブジェクトである。メソッド呼び出し用のパラメータには、状態マシンの固有名、状態マシン定義を含むuniversal resource locater(URL)、ライブラリ名、およびディレクトリ・パスが含まれる。状態マシン定義は、状態マシンに関するデータ値および規則セットを生成するために使用される。ライブラリ名は、好ましくは、状態マシンのインスタンスを戻す実際のファクトリ・メソッドを含む。ディレクトリ・パスは、状態マシンの生成時にファクトリによってロードされるすべてのファイルを含む。BuildStateMachineメソッドをCStateMachineFactoryオブジェクトから戻すことによって、初期設定を必要とする完全に機能する状態マシンが提供される。
【0020】
状態マシンの生成時に、ファクトリ・オブジェクトは、CSMLoaderなどのローダ・クラスのインスタンスまたはその派生物のうちの1つを使用して、状態マシンのインスタンスをロードする。このクラスは、SAXパーサ実施を使用して、仕様言語を式などの適切なデータ構造に解析する。以下でより詳細に説明するように、好ましい仕様言語ファイルはXML(Extensible Markup Language:拡張可能マークアップ言語)で記述される。SAXパーサを使用して、状態マシンを動作させるために状態マシン定義ファイルのXMLを解析する。CContentHandlerなどのコンテンツ・ハンドラ・クラスの実施によって、個々のタグが処理される。構築時に、各タグとその対応するハンドラ・クラスとを関連付けるマップが生成される。このマッピングは、XPath式をキーとして使用することによって達成される。XPath式は、停止タグが検出されるまで、フォワードスラッシュ記号「/」文字をタグ名と連結させることによって構築される。その後、タグ名およびその関連するフォワードスラッシュ文字は、最後の停止タグに達するまで除去される。
【0021】
SAXパーサは、仕様言語ファイルを解析する場合、ステートメントの構造の妥当性を検査する。例示的なXML仕様ファイルで遭遇する可能性のあるステートメント構造については、以下でより詳細に説明する。構造の妥当性検査中に検出されるいかなるエラーも、エラー・ログで報告される。エラー・ログに含まれるエラー・メッセージを生成するハンドラは、(1)状態、メッセージ、アクション、定数、タイマ、または変数の重複定義、(2)定義されていない状態、メッセージ、アクション、定数、タイマ、または変数、(3)状態、メッセージ、アクション、定数、タイマ、または変数の無効な名前、および(4)矛盾するタグ・オプションを検出する。
【0022】
仕様言語ファイルによって定義される状態マシン実施は、カスタマイズ済みDLLを含むことができる。状態マシンのファクトリ実施は、それぞれがオプションで提供可能ないくつかのエントリ・ポイントについて、これらのDLLを検索する。ファクトリ・オブジェクトは、DLLによって定義されていないエントリ・ポイントがあれば、これに対してデフォルトの実施を使用する。これらのエントリ・ポイントは、以下で説明するように、「C」スタイルのエントリ・ポイントとすることができる。これらのエントリ・ポイントは、(1)サポートされるアクション名の登録/登録解除、(2)状態マシン・インスタンスの生成/破棄、および(3)任意の必要なプラグイン・オブジェクトの生成/破棄に対するサポートを提供する。アクションの生成/破棄をサポートするために、テンプレート・メソッドを使用することもできる。以下のエントリ・ポイントが提供可能である。
【0023】
【表1】

【0024】
アクション登録/登録解除における第1のエントリ・ポイントは、このライブラリによってサポートされるすべてのアクションの名前リストを戻す。これは、ライブラリが生成される場合、初期設定時に1回呼び出される。エントリ・ポイントの署名は次のとおりである。
HRESULT__declspec(dllexport)RegisterAll(const_TCHAR***,HTRACE).
この呼び出しの第1のパラメータは、名前アレイへのポインタのアドレスである。このアレイは、呼び出しによって戻され、解放されてはならない。第2のパラメータは、Traceオブジェクトへのハンドルである。状態マシンが破棄プロセス中である場合、名前は解放される。これを容易にするために、状態マシンは以下のエントリ・ポイントを呼び出す。
void__declspec(dllexport)UnregisterAll().
これでわかるように、このエントリ・ポイントはいかなるパラメータも取らず、何の値も戻さない。
【0025】
状態マシン・ファクトリ作成/破壊カテゴリ内の第1のエントリ・ポイントは、CStateMachineFactoryのインスタンスへのポインタを戻す。これは、CStateMachineFactoryによって初期設定時に1回呼び出される。エントリ・ポイントの署名は次のとおりである。
HRESULT__declspec(dllexport)BuildStateMachineFactory(HTRACE
hTrace,STATE_MACHINE_NAMESPACE::CStateMachineFactory**).
このメソッドは、2つのパラメータ、すなわちTraceオブジェクトへのハンドルと、新しく構築されたファクトリ状態マシンへの戻されたポインタのアドレスを取る。生成中にエラーが発生しなかった場合、エントリ・ポイントは、S_OKを戻す。他のいかなる値もエラーである。このカテゴリ内の第2のエントリ・ポイントは、終了時に状態マシン・ファクトリを解放するために使用される。その署名は次のとおりである。
HRESULT__declspec(dllexport)ReleaseStateMachineFactory(HTRACE
hTrace,STATE_MACHINE_NAMESPACE::CStateMachineFactory*).
このメソッドは、2つのパラメータ、すなわちTraceオブジェクトへのハンドルと、破壊される状態マシン・ファクトリへのポインタを取る。破壊中にエラーが発生しなかった場合、エントリ・ポイントは、S_OKを戻す。他のいかなる値もエラーである。これらのオプション・メソッドが宣言されない場合、CStateMachineFactoryのデフォルト・インスタンスが生成される。
【0026】
状態マシン・ローダ作成/破壊カテゴリ内の第1のエントリ・ポイントは、CSMLoaderのインスタンスへのポインタを戻す。これは、CStateMachineFactoryによって、要求された状態マシン・インスタンスの構築および初期設定に使用される。エントリ・ポイントの署名は次のとおりである。
HRESULT__declspec(dllexport)BuildStateMachineLoader(HTRACE
hTrace,STATE_MACHINE_NAMESPACE::CSMLoader**).
このメソッドは、2つのパラメータ、すなわちTraceオブジェクトへのハンドルと、新しく構築されたCSMLoaderへの戻されたポインタのアドレスを取る。生成中にエラーが発生しなかった場合、エントリ・ポイントは、S_OKを戻す。他のいかなる値もエラーである。このカテゴリ内の第2のエントリ・ポイントは、終了時に状態マシン・ローダを解放するために使用される。その署名は次のとおりである。
HRESULT__declspec(dllexport)ReleaseStateMachineLoader(HTRACE
hTrace,STATE_MACHINE_NAMESPACE::CSMLoader*).
このメソッドは、2つのパラメータ、すなわちTraceオブジェクトへのハンドルと、破壊される状態マシン・ローダへのポインタを取る。破壊中にエラーが発生しなかった場合、エントリ・ポイントは、S_OKを戻す。他のいかなる値もエラーである。これらのオプション・メソッドが宣言されない場合、CSMLoaderのデフォルト・インスタンスが生成される。
【0027】
状態マシン作成/破壊カテゴリ内の第1のエントリ・ポイントは、状態マシンのインスタンスへのポインタを戻す。これは、CStateMachineFactoryによって初期設定時に1回呼び出される。エントリ・ポイントの署名は次のとおりである。
HRESULT__declspec(dllexport)BuildStateMachine(const_TCHAR*HTRACE
hTrace STATE_MACHINE_NAMESPACE::IStateMachine**)
【0028】
このメソッドは、XMLファイルのURLと、Traceオブジェクトへのハンドルと、新しく構築された状態マシンへの戻されたポインタのアドレスの3つのパラメータを取る。生成中にエラーが発生しなかった場合、エントリ・ポイントは、S_OKを戻す。他のいかなる値もエラーである。このカテゴリ内の第2のエントリ・ポイントは、終了時に状態マシンを解放するために使用される。その署名は次のとおりである。
HRESULT__declspec(dllexport)ReleaseStateMachine(HTRACE
hTrace,STATE_MACHINE_NAMESPACE::IStateMachine*).
このメソッドは、Traceオブジェクトへのハンドルと、破壊される状態マシンへのポインタの2つのパラメータを取る。破壊中にエラーが発生しなかった場合、エントリ・ポイントは、S_OKを戻す。他のいかなる値もエラーである。
【0029】
クラスタ生成/破壊カテゴリ内の第1のエントリ・ポイントは、2つ以上の協働する状態マシンからなる状態マシンのインスタンスへのポインタを戻す。これは、CStateMachineFactoryによって初期設定時に1回呼び出される。エントリ・ポイントの署名は、HRESULT__declspec(dllexport)BuildCluster(const_TCHAR*HTRACE
hTrace,STATE_MACHINE_NAMESPACE::CCluster**)である。
【0030】
このメソッドは、XMLファイルのURLと、Traceオブジェクトへのハンドルと、新しく構築された状態マシン・クラスタへの戻されたポインタのアドレスの3つのパラメータを取る。構築中にエラーが発生しなかった場合、エントリ・ポイントは、S_OKを戻す。他のいかなる値もエラーである。このカテゴリ内の第2のエントリ・ポイントは、終了時に状態マシンを解放するために使用される。その署名は、HRESULT __declspec(dllexport)ReleaseCluster(HTRACE
hTrace,STATE_MACHINE_NAMESPACE::CCluster*)である。このメソッドは、Traceオブジェクトへのハンドルと、破壊される状態マシン・クラスタへのポインタの2つのパラメータを取る。破壊中にエラーが発生しなかった場合、エントリ・ポイントは、S_OKを戻す。他のいかなる値もエラーである。
【0031】
プラグイン作成/破壊カテゴリ内の第1のエントリ・ポイントは、新しいタグを使用して状態マシン定義言語を拡張するための機構を提供する、ファクトリ・オブジェクトのインスタンスへのポインタを戻す。これは、CStateMachineFactoryによって初期設定時に1回呼び出される。エントリ・ポイントの署名は、HRESULT__declspec(dllexport)GetPlugin(const_TCHAR*,IPlugin**,HTRACE)である。このメソッドは、プラグインの記号名と、新しく構築されたIPluginオブジェクトへの戻されたポインタのアドレスと、Traceオブジェクトへのハンドルの3つのパラメータを取る。構築中にエラーが発生しなかった場合、エントリ・ポイントは、S_OKを戻す。他のいかなる値もエラーである。このカテゴリ内の第2のエントリ・ポイントは、終了時にpluginオブジェクトを解放するために使用される。その署名は、HRESULT__declspec(dllexport)ReleasePlugin(IPlugin*,HTRACE)である。このメソッドは、破壊されるIPluginへのポインタと、Traceオブジェクトへのハンドルの2つのパラメータを取る。破壊中にエラーが発生しなかった場合、エントリ・ポイントは、S_OKを戻す。他のいかなる値もエラーである。
【0032】
DLLで公開された各アクションに対して、2つのアクション・ファクトリ・メソッド・エントリ・ポイントがある。このカテゴリ内のどちらのエントリ・ポイントも、アクションそれ自体と同じファイルに含まれる登録マクロによって生成されるべきである。例えば、状態マシン内にはCSendMsgと呼ばれるアクションがある。sendmsg.cppファイルの底部には、コードREGISTER_SM_ACTION(SendMsg)が常駐する。マクロREGISTER_SM_ACTIONそれ自体が、ファイルActionBase.h内に以下のように定義されている。
#define SM_REGISTRATION_PREFIXSM.
#define REGISTER_SM_ACTION(NAME)\
DECLARE_CLASS_CREATION_DESTRUCTION(NAME)\
DECLARE_REGISTRATION_CLASS(SM_REGISTRATION_PREFIX,NAME)\
DEFINE_REGISTRATION(NAME)
これらのマクロは、アクションに必要なエントリ・ポイントを自動的に生成し、それらをCRegistrationManagerに公開する。状態マシンの各構成要素ユーザは、一意の登録マクロおよび登録プレフィックスを作成し、そのマクロをDLL内に定義されたすべてのアクションに使用する。
【0033】
このカテゴリ内の第1のエントリ・ポイントは、新しく作成されたタイプTのアクションのインスタンスへのポインタを戻す。このエントリ・ポイントは、静的テンプレート・メンバ関数である。これは、アクションを生成するためにCXMLStateMachineファクトリによって呼び出される。エントリ・ポイントの署名は次のとおりである。
IAction*CCreateable<T,IAction>::NewInstance()
このカテゴリ内の第2のエントリ・ポイントは、上記エントリ・ポイントによって生成されたアクションを解放するために使用される。この署名は次のとおりである。
void CCreateable<T,IAction>::ReleaseInstance(IAction*)
このメソッドは、パラメータとして、解放するためのアクションのアドレスを取る。
【0034】
BuildStateMachineメソッドを戻すと、戻された状態マシンのインスタンスの開始メソッドを呼び出すことによって、初期設定が完了する。このメソッドは、状態マシンを実行するために使用される新しいワーカー・スレッド・パラメータで呼び出される。すべての状態マシン・アクションは、このワーカー・スレッドを使用して実行される。
【0035】
状態マシンはメッセージを処理し、規則を実行する。メッセージの処理は、非同期または同期のいずれかとすることができる。メッセージ処理および規則セットの実行は、状態マシン要素によって実行される。次に、メッセージ処理、規則セット実行、およびこれらのタスクを実行するための状態マシン要素について、より詳細に説明する。
【0036】
状態マシンは、メッセージの受け入れ、およびそれに応答する規則セットの実行によって動作する。StateMachineの実行は、非同期動作の場合はPostMsgメソッド、または同期動作の場合はSendMsgメソッドのいずれかを使用して、メッセージをCSynchronizedQueueに配置することによって調整される。非同期動作の場合、PostMsgは戻りコードを待たない。同期動作の場合、SendMsgメソッドは、そのメッセージに関する最後のアクションが処理されるまで待機し、規則セットによって設定された何らかの戻りコードを戻す。ワーカー・スレッドは、CSynchronizedQueueからメッセージを除去し、グローバル状態にそのメッセージに関する規則セットが存在するか否かを判別する。メッセージに関する規則セットが存在する場合、その規則セットが最初に実行される。この規則セットは、現在の状態から遷移しない場合がある。
【0037】
次にワーカー・スレッドは、現在の状態にそのメッセージに関する規則セットが存在するか否かを判別する。存在する場合、その規則セットを実行する。存在しない場合、ワーカー・スレッドは、XML定義では状態名「*」で示される、「any」状態と呼ばれる特別な状態にそのメッセージに関する規則セットが存在するか否かを判別する。any状態で規則セットが発見された場合は、これが実行される。規則セットが発見されなかった場合、メッセージは、メッセージを処理するかまたは処理しない可能性のあるデフォルト・ハンドラ・メソッドに渡される。基本状態マシン用のデフォルト・ハンドラは、メッセージが無視されたことを示すエントリをログに記録するだけである。状態マシン・クラスタ用のデフォルト・ハンドラは、メッセージの処理が可能なクラスタ内の任意の他の状態マシンにメッセージを渡す。
【0038】
規則セットは、ゼロ以上のIAction、およびゼロ以上の他の状態への遷移からなる。IActionは、以下でより詳細に説明する状態マシン要素である。IActionが存在する場合、それらは、IActionが「偽」を戻す、IActionが例外を投げる(障害)、またはこれ以上シーケンス内にIActionがない、のうちの1つが発生するまで順番に実行される。IActionが「偽」を戻した場合、規則セットは、実行される偽アクションを指定することができる。他の状態への遷移も指定することができる。例外が投げられた場合、状態マシンはこの例外を受け取り、これをログ記録し、規則セットによって指定された任意のオプション障害アクション、およびオプションで、規則セットによって指定された障害状態への遷移を実行する。シーケンス内にこれ以上IActionがない場合、規則セットはオプションで新しい状態への遷移を指定することができる。
【0039】
非同期メッセージ処理は、状態マシンの通常モードの動作である。メッセージは、PostMsgメソッドを呼び出すことによって非同期にされる。PostMsgからの戻りは即時である。この通知されただけのメッセージは、将来何らかの時点で処理される。
【0040】
同期メッセージ処理も提供されるが、これはデッドロックの可能性があるため、制限的に使用される。メッセージを生成するいずれのアクションも、デッドロックを発生させる可能性がある。メッセージは、SendMsgメソッドを呼び出すことによって同期にされる。同期メッセージがキューに追加されると、呼び出し側スレッドは待機状態に入る。状態マシンは、所与のメッセージに関するすべてのアクションが実行されると、待機スレッドを発信する。
【0041】
状態マシンによって使用されるすべての要素は、それぞれが状態マシンの異なる面を表す抽象ベース・クラスとして実施される一連のインタフェースによって外部的に(およびCAbstractStateMachineによって内部的に)表される。一般に、すべての外部表現は読み取り専用であり、修正用のいかなる機構も提供しない。次に、これらの要素について説明する。
【0042】
IStateMachineインタフェースは、状態マシンそれ自体を表す。これは、読み取り専用で状態マシンの様々な要素にアクセスするためのメソッド・セットを提供する。すべての実施の詳細は、このクラスのユーザに対して隠される。別段の指定がない限り、アクションは、このインタフェースを通してのみ、状態マシンにアクセスすることができる。
【0043】
IMessageインタフェースは、実行する規則セットを決定する際に使用される状態マシンへの入力の読み取り専用表現を提供する。各IMessageは、その名前によって一意に識別される。名前は、状態マシン内の2Dマップに第1のキーを提供する。IMassage名は、区切り文字用にXMLパーサによって使用されるものを除く、任意の文字を含むことができる。無効の文字には、「<」、「>」、および「&」が含まれる。
【0044】
IStateインタフェースは、状態マシンが常駐可能な状態の読み取り専用表現を提供する。各IStateは、その名前によって一意に識別される。名前は、状態マシン内の2Dマップに第2のキーを提供する。IState名は、区切り文字用にXMLパーサによって使用されるものを除く、任意の文字を含むことができる。無効の文字には、「<」、「>」、および「&」が含まれる。
【0045】
IActionインタフェースは、状態マシンへの入力に応答して実行可能な作業の最小単位、すなわちビジネス・ロジックを表す。この表現は読み取り専用である。一般に、IActionの実施は小さく、2つ以上の関数は含まない。この制約によって、他の規則セット内のIActionを再使用することができる。さらに、IActionが小さくなるほど、そのデバッグおよび保守が容易になる。各IActionは、名前によって表される。この名前は、1つのILibrary内で一意である。IAction名は、英数文字のみを含むことができる。
【0046】
さらにアクションを区別し、名前の衝突を避けるために、アクションはネームスペース内に常駐することができる。この場合、名前は、「.」文字で分けられたネームスペース名とアクション名の2つの部分からなる。例えば、ネームスペース「tb」内で「StartTransaction」と名付けられたアクションは、「tb.StartTransaction」と呼ばれる。次に、ネームスペースに関する詳細を示す。
【0047】
ILibraryは、DLLの表現である。これは、状態マシンで使用されるIActionセットを管理するための機能を提供する。各IActionは、動的にロードされ、必要に応じてDLLから生成される。またオプションで、前述のように、状態マシンの挙動をカスタマイズするために使用される一連のエントリ・ポイントも提供することができる。
【0048】
IConstantインタフェースは、StateMachineで使用可能な定数値の読み取り専用表現である。これは、IVariableへの式または割り当てで使用可能である。各IConstantは、その名前によって一意に識別される。IConstant名は、英数文字および「_」文字の両方を含むことができる。定数に関する定義について、以下でより詳細に説明する。
【0049】
StateMachine実施により、必要に応じて使用される変数の生成が可能である。IVariableインタフェースは、これらの変数を表す。ほとんどの他の要素とは異なり、IVariableは読み取り専用ではなく、その値を変更することができる。各IVariableはその名前によって一意に識別される。IVariable名は、英数文字および「_」文字の両方を含むことができる。変数に関する定義について、以下でより詳細に説明する。
【0050】
StateMachine実施は、定期的に反復するかまたは1回のみで満了するタイマの生成をサポートする。任意のタイマは、満了するごとに、状態マシンによって処理されるタイムアウト・メッセージを生成する。ITimerインタフェースは、これらのタイマを表す。各ITimerはその名前によって一意に識別される。ITimer名は、英数文字および「_」文字の両方を含むことができる。タイマの定義は、対応するタイムアウト・メッセージの生成も示唆することに留意されたい。このメッセージには、タイマ名に付加された文字列「_timeout」を含む名前が割り当てられる。タイマの定義について、以下でより詳細に説明する。
【0051】
StateMachine実施は、キー付きテーブルの指定を可能にする。テーブル内の各エントリは関連するキーを有する。各キーは1つの値を言い表す。キーおよび値は、文字列データまたは整数データのいずれかとすることができる。各ILookupTableは、その名前によって一意に識別される。ILookupTable名は、英数文字および「_」文字の両方を含むことができる。ルックアップ・テーブルの定義について、以下でより詳細に説明する。
【0052】
StateMachine実施は、いくつかの方法で式を使用する。各式は、IStateMachineインタフェースのGetExpressionファクトリ・メソッドから取得されるIExpressionインタフェースのインスタンスによって表される。XML解析の制限により、式は、以下の文字によってXMLエンティティとして表されることに留意されたい。
【0053】
【表2】

【0054】
StateMachine実施は、XMLにおける拡張タグの使用を可能にする。これらのタグは、IPluginのインスタンスを介して処理される。IPluginインタフェースは、状態マシンそれ自体によって使用されていないタグを処理するために必要なサービスを提供する。各IPluginは、その名前によって一意に識別される。IPlugin名は、英数文字および「_」文字の両方を含むことができる。プラグインを状態マシンへと展開することに関するさらなる情報について、以下で説明する。
【0055】
IProcedureインタフェースは、実行可能なアクションのセットを表す。各IProcedureはその名前によって一意に識別される。IProcedure名は英字で始まり、英数文字および「_」文字の両方を含むことができる。プロシージャに関するさらなる情報について、以下で説明する。
【0056】
ISynchTableインタフェースは、状態遷移前に複数のイベントを調整するための機構である。各ISynchTableは、その名前によって一意に識別される。ISynchTable名は英字で始まり、英数文字および「_」文字の両方を含むことができる。同期化イベントに関するさらなる情報について、以下で説明する。
【0057】
状態マシンの動作は、その実行の終了のために2つのフェーズを必要とする。第1のフェーズでは、状態マシンの実行スレッドは、状態マシンのStopメソッドを呼び出すことによって停止される。このメソッドは、スレッドが完了し、首尾よく終了されるまで戻されない。状態マシン終了の第2のフェーズは、CStateMachineFactoryオブジェクトのReleaseStateMachine静的メソッドを呼び出すことによって起動される。この静的メソッドは、Traceオブジェクトに対するハンドル、および解放される状態マシン・インスタンスへのポインタを含むパラメータを受け入れる。
【0058】
有効な状態マシンXMLに関する好ましいXML仕様言語ファイルの構造は、以下のように、<state−machine>タグで始まる。
<state-machine modal=false>

</state-machine>
<state−machine>タグは、オプションのモード属性を有する。この属性は、未知のメッセージを処理するために使用される挙動を変更するために使用することが可能であり、以下でより詳細に説明する。モード属性を使用不可にするために、「偽」の値に設定される。この属性は、通常の環境下では使用されない。
【0059】
残りのXMLファイルは、セクションに構造化され、その第1が、従う規則で使用される要素を定義する。すべての要素は規則内での使用に先立って定義される。これらの要素には、ライブラリ、タイマ、定数、変数、状態、メッセージ、アクション、およびルックアップ・テーブルが含まれる。各要素タイプは、図3に示された関連するリスト・タグに含まれる。
【0060】
ライブラリ定義は、<library>タグと、それに続くDLLの名前を識別する名前属性からなる。名前は、完全に修飾される場合がある。修飾されない場合、DLLの探索で使用される実行可能モジュールの通常の検索順序が使用される。オプションの<comment>タグを含むことができる。図4に、例示的ライブラリ・リストを示す。
【0061】
図5に示すように、タイマ定義は、<timer>タグと、それに続くタイマの名前を識別する名前属性からなる。この名前は、タイムアウト時に使用されるメッセージを生成するためにも使用される。オプションの<comment>タグを含むことができる。
【0062】
図6に示すように、定数定義は、<constant>タグと、それに続く定数の名前を識別する名前属性、および定数のタイプを識別するオプションのタイプ属性からなる。タイプ属性が指定されない場合、定数のタイプはデフォルトで整数となる。タイプ属性は、以下のテーブルに指定された値のうちの1つを有することができる。
【0063】
【表3】

【0064】
所与の定数の値に、必須の<value>タグが続く。オプションの<comment>タグを含むことができる。
【0065】
変数定義は、<variable>タグと、それに続く変数の名前を識別する名前属性、および変数のタイプを識別するオプションのタイプ属性からなる。タイプ属性が指定されない場合、変数のタイプはデフォルトで整数となる。タイプ属性は、以下のテーブルに指定された値のうちの1つを有することができる。
【0066】
【表4】

【0067】
さらに、以下のテーブルに示すように、変数について、初期値、最大値、および最小値を定義することができる。
【0068】
【表5】

【0069】
図7の例は、整数の暗黙タイプ、0の初期値、0の最小値、および100の最大値を有する、my_variableと命名された変数の定義を示す。
【0070】
図8に示すように、状態定義は、<state−definition>タグと、それに続く状態の名前を識別する名前属性からなる。オプションの<comment>タグを含めることができる。さらに、<initial/>タグを使用して、唯一の状態を初期状態として識別しなければならない。また、状態特定規則に先立って規則について検査されるグローバル状態として状態を識別するオプションの<global>タグも指定することができる。状態がグローバルとしてマーク付けされている場合、初期状態としてマーク付けすることはできない。
【0071】
図9に示すように、メッセージ定義は、<msg>タグと、それに続くメッセージの名前を識別する名前属性からなる。オプションで、この定義は、以下のタグのいずれかまたはすべてを含むことができる。
【0072】
【表6】

【0073】
図10に示すように、アクション定義は、<action>タグと、それに続くアクションの名前を識別する名前属性からなる。オプションの<comment>タグを含めることができる。パラメータは、オプションの<parameter>タグを介して指定することもできる。複数の<parameter>タグを指定することができる。1つのパラメータ文字列のみが必要な場合、パラメータはactionタグのパラメータ属性を使用して指定することができる。
【0074】
図11に示すように、ルックアップ・テーブル定義は、<lookup−table>タグと、それに続く以下の属性からなる。
【0075】
【表7】

【0076】
<lookup−table>タグには、ゼロ以上の<lookup−entry>タグが続くことができる。これらタグのそれぞれが、キー属性および値属性を指定する。このテーブルを使用するルックアップは、マッチング・キーに関するテーブルを通して検索すること、および対応する値を戻すことを含む。
【0077】
プロパティは、1つの文字列を、タグの値および属性内の他の文字列と置換する機能を提供する。プロパティ定義は、<property>タグと、それに続くプロパティの名前を識別する名前属性、および置換される値を識別する値属性からなる。プロパティを使用するためには、「%」文字で囲むものとする。プロパティ定義の例は、<property name="SOMENAME"value="c:\file\path">である。
【0078】
ネームスペースは、異なるオブジェクト内に定義されたアクションと名前との衝突を防ぐのに役立つ機能を提供する。複数のアクションは、異なるネームスペース内に常駐する限り、同じ名前を有することができる。例えば、StartTransactionと命名された2つの異なるアクションは、TBオブジェクトとRAPオブジェクトに常駐することができる。区別するために、これらはそれぞれ別々のネームスペース、tbおよびrap内に常駐し、tb.StartTransactionおよびrap.StartTransactionと呼ばれる。以下の例のネームスペースは、以下のように使用されるのに先立って定義される。
<state-machine>

<namespace name="tb"/>
<namespace name="rap"/>

</state-machine>
【0079】
StaratTransactionアクションを参照する規則は、以下の構文を使用する。
<rules>
<state name="State-1">
<message name="Message-1">
<message-rule-list>
<rule action-name="tb.StartTransaction"/>
<rule action-name="rap.StartTransaction"/>
</message-rule-list>
</message>

</state>

</rules>
【0080】
規則の定義は、このマシンの有効な状態を定義することによって、以下の例のように開始される。
<rules>
<state name="State-1"/>

<state name="State-n"/>
</rules>
【0081】
各状態タグは、状態タグ内で受け取り可能な有効メッセージのセットを有する。
<rules>
<state name="State-1">
<message name="Message-1"/>

<message name="Message-n"/>
</state>

</rules>
【0082】
「*」状態内にそのメッセージに関するハンドラがない場合、デフォルトでは、状態内に含まれないいかなるメッセージも無視される。<state>タグは、その状態に入った場合に、匿名タイマが開始されることを指定する、オプションのタイムアウト属性も含むことができる。その状態から離れる前にタイマがタイムアウトした場合、その状態内に定義された<timeout−rule−list>ハンドラによって処理される。
【0083】
規則のセット(規則セット)は、オプションで各メッセージ・タグに定義される。何の規則も定義されない場合、何のアクションも実行されない。規則セットは以下のフォーマットを有する。
<rules>
<state name="State-1">
<message name="Message-1">
<message-rule-list>
<rule action-name=…/>
<rule action-name=…/>

<rule action-name=…/>
<success-transition>…</success-transition>
</message-rule-list>
</message>

</state>

</rules>
【0084】
<success−transition>タグは、規則セット内のすべてのアクションが実行された際に「真」を戻す場合、状態マシンの遷移先である状態の名前を指定する。<success−transition>タグが指定されない場合、何の遷移も発生しない。
【0085】
規則タグ定義は、<rule>要素からなる。規則の他の部分は、すべてオプションである。規則のオプション部分は、下記を含む。
・実行するアクション
・上記第1のアクションが「偽」を戻した場合に実行するアクション
・上記第1のアクションが例外を投げた場合に実行するアクション
上記いずれのオプション・アクションも指定されない場合、規則は、Execute()メソッドが呼び出された場合は何も実行しないCNullActionを実行する。
【0086】
規則定義は以下のようになる。
<rules>
<state>
<state-name>State-1</state-name>
<message>
<message-name>Message-1</message-name>
<message-rule-list>
<rule action-name="…">
<on-failure-action>…</on-failure-action>
<on-exception-action></on-exception-action>
</rule>
<success-transition>…</success-transition>
</message-rule-list>
</message>

</state>

</rules>
【0087】
アクション・タグ定義は、使用するアクションの名前を指定し、アクションによって使用されるゼロ以上の<parameter>タグを指定することができる。アクションが1つのパラメータしか必要としない場合、<action>または<rule>タグ上のパラメータ属性を使用して指定することができる。アクション・タグのフォーマットは、以下の形を有することができる。

<rules>
<state>
<state-name>State-1</state-name>
<message>
<message-name>Message-1</message-name>
<message-rule-list>
<rule action-name="SomeAction">
<parameter value="SomeAction"/>

<parameter value="SomeAction"/>

</rule>
<success-transition>…</success-transition>
</message-rule-list>
</message>

</state>

</rules>
【0088】
状態は、また、状態への入口または状態からの出口で実行される入口および/または出口タグ・セット規則を有することができる。この規則セットに対する唯一の制約は、入る/出る状態以外には遷移できないということである。エントリ・リスト・タグは以下の形を有することができる。
<rules>
<state>
<state-name>State-1</state-name>

<entry-rule-list>
<rule action-name="SomeAction">
<parameter value="SomeAction"/>

<parameter value="SomeAction"/>
</rule>
</entry-rule-list>
<exit-rule-list>

</exit-rule-list>
</state>

</rules>
【0089】
いかなる状態マシン仕様文書も、他の状態マシン仕様文書を埋め込むことができる。例えば、状態マシンXML文書は、まとめて処理するために他のXML文書を埋め込むことができる。StateMachineは、埋め込まれた文書を含めるための<include>タグを提供し、そのURLは名前属性によって指定される。文書を状態マシン仕様ファイル内に埋め込み、アクション、状態、メッセージの共通セット、ならびに、基本ファイル内の要素を指定変更するための顧客特定設定要素のセットを提供することができる。例えば、以下のオリジナル・ファイルは、処理される4つの埋め込み文書を含む。
<state-machine>
<include name="other-document-url.xml">
<include name="other-document2-url.xml">
<include name="other-document3-url.xml">
<include name="other-document4-url.xml">

</state-machine>
【0090】
埋め込まれたファイルは、最上位に<state−machine>タグを有していなければならない。例えば、前の例に含まれたother−document−url.xmlは、正当な状態マシンXML文書でなければならず、state−machineタグで始まるものとしなければならない。
【0091】
状態マシンは、メッセージ・ハンドラが共通規則のグループを実行できるようにする新しいプロシージャ機能を提供する。プロシージャとは、任意のメッセージ・ハンドラから呼び出すことが可能な規則の集合のことである。この規則セットの実行が完了すると、実行は、オリジナルのメッセージ・ハンドラに戻る。
【0092】
プロシージャ・タグは、以下の例に示すように、<procedure>タグを使用して定義される。
<procedure name="Null">
<procedure-rule-list>
<rule action-name=…>

<procedure-rule-list>
</procedure>
【0093】
プロシージャは、必須の名前属性を有する<argument>タグを使用して定義されたゼロ以上の引数タグを有することができる。引数は、名前属性上の名前を使用して、プロシージャ内のいずれでも変数として参照することができる。プロシージャから戻ると、引数の値は未定義である。引数は以下のように定義することができる。
<procedure name="Null">
<argument name="arg1"type="string"default-value="">
<procedure-rule-list>
<rule action-name=…>

<procedure-rule-list>
</procedure>
【0094】
【表8】

【0095】
<return>タグを使用して、呼び出し側に実行を戻す。戻りタグの例は以下のとおりである。
<procedure name="Null">
<rule action-name=…>

<return>
</procedure>
プロシージャが戻ると、実行は、<call>規則に従って次の規則を再開する。
【0096】
プロシージャは、以下の例のように<call>タグを使用して実行される。
<call name="Null"/>
名前属性は必須であり、以前に定義されたプロシージャの名前を指定する。<call>規則は、<rule>タグを配置できる場所であればどこにでも配置することができる。
【0097】
プロシージャ用の<call>タグは、パラメータ・タグの値も指定することができる。これらの値は、<parameter>タグによって以下の例のように表される。
<call name="Null">
<parameter type="string"value="Hello World!">
<call name="Null">
パラメータが省略された場合、対応する<argument>タグによって指定された任意のデフォルト値を採用する。パラメータは定位置にあり、すなわち第1のパラメータは指定された第1の引数と合致し、第2のパラメータは第2の引数と合致する。
【0098】
時には、状態間を遷移するまでに、複数のイベントが発生するのを待つ必要がある。すべてのイベントを追跡するには、各イベントを待つ複数の状態、または、特定のイベントが受け取られた場合に設定される一連のフラグのいずれかが必要である。このような特徴は一般的であるため、状態マシンは複数のイベントを追跡するための特別な構造を提供する。ISynchTableオブジェクトは、予想されるイベントのテーブルを提供する。イベントが受け取られる場合、ISynchTableは、どれが受け取られるかを追跡する。一連の内部アクションは、ISynchTableの状態を管理および監視する機能を提供する。これらは以下のとおりである。
【0099】
【表9】

【0100】
SynchTableは、以下の例のように<synch−table>タグを使用して定義される。
<synch-table name="STable1">
<entry>Message 1</entry>
<entry>Message 2</entry>

<entry>Message n</entry>
</synch-table>
【0101】
ある種のタグは、実行される一連のアクションを決定する際に式を使用する。これらのタグは条件付き論理を提供し、<if>、<else−if>、<select>、および<while>を含む。式は、左側、オプションの演算子、およびオプションの右側からなる。左側および右側は、変数、定数、または値とすることができる。サポートされる演算子は以下のとおりである。
【0102】
【表10】

【0103】
式が左側のみからなる場合、その式は、式の値が「ゼロ」または「空」でなければ「真」と評価する。そうでなければ、式は「偽」と評価する。さらに、インタフェースIEvaluateableを実施するいかなるアクションも、式として使用することができる。アクションのExecuteメソッドが呼び出され、式の結果として使用されるブール値が戻される。「!」演算子を任意の式に適用することができる。この演算子は、それに続く、式を評価した結果を否定する。式は、式タグと、タグ間に提供された仕様言語ステートメントを使用して定義される。例示的な式のグループは、次に提示する論理構造を含むことができる。
【0104】
<if>タグが所与の式を評価し、「真」の場合、その中に含まれる規則セットを実行する。図12に、if式の例を示す。オプションで、<if>タグの後に<else>タグを続けることができる。式が「偽」と評価した場合、<else>タグ内の規則セットが実行される。図13に、else定義を示す。またオプションで、<if>タグの後に<else−if>タグを続けることができる。このタグは式属性を含む。式が「真」と評価した場合、<else−if>タグ内の規則セットが実行される。図14に、else−if定義を示す。
【0105】
<select>タグは、一連の式の評価に基づいて、一連の規則セットのうちの1つを実行することができる。図15に、select定義を示す。<select>タグは、囲まれた<when>タグ内に与えられた一連の式の評価に基づいて、一連の規則セットのうちの1つを実行することができる。図16に、when定義を示す。デフォルトの選択は、<otherwise>タグを使用して指定することができる。前のすべての式が失敗した場合、<otherwise>タグ内に指定された規則セットが実行される。図17に、otherwise定義を示す。
【0106】
<for>タグは、アクション・セットの反復実行を可能にする。図18に、for定義を示す。「for」式内のvariable属性は、制御ループに使用するための制御変数を指定する。そのためには整数変数のみが使用可能である。initial−value属性は、制御変数を開始する初期値を指定する。limit属性は、制御変数の最大値を指定する。制御変数値がこの値を超えた場合、ルーピングは終了する。increment属性は、ループの各反復について制御変数の増加を指定する。<while>タグは、アクション・セットの反復実行を可能にする。図19に、while定義を示す。expression属性が「真」のままである限り、アクションは再度実行される。
【0107】
<timeout−rule−list>タグは、タイマからのタイムアウト・メッセージ用のハンドラを定義するための便利なショートカット機構を提供する。オプションのtimer−name属性は、名前によってタイマを識別することができる。この属性が指定されない場合、処理されるタイマは状態によって設定された属性に対応しなければならない。タイムアウト規則リストは、<message>定義と同じレベルに常駐する。図20に、タイムアウト規則リストの例を示す。
【0108】
<break>タグは、メッセージ・ハンドラに現在のメッセージに対する規則の実行を停止させる機構を提供する。これは、<rule>タグが常駐できる場所ではいずれでも有効である。図21に、breakタグの使用例を示す。
【0109】
<yield>タグは、メッセージ・ハンドラに現在のメッセージに対する規則の実行を停止させる他の機構を提供する。さらに、現在の状態マシンが、以下でより詳細に説明する協働する状態マシンのクラスタのメンバである場合、グループ内の何らかの他の状態マシンにフォーカスを渡す。協働するグループのメンバでない場合、<break>タグと同様に動作する。これは、<rule>タグが常駐できる場所ではいずれでも有効である。図22に、yieldタグの使用例を示す。
【0110】
<assert>規則タグによって識別されるアサーション・サポートは、XML規則内の何らかの特定のポイントで「真」を保持するように予測される条件を指定する。その条件が「真」を保持しない場合、アサーションは失敗する。アサーション障害時に実行されるアクションは、状態マシンがどのようにコンパイルされたかに依存する。状態マシンがReleaseモードでコンパイルされた場合、アサーションは、規則セットの障害として扱われる例外を投げ、障害ハンドラが実行される。状態マシンがDebugモードでコンパイルされた場合、状態マシンの実行は中断され、図23に示されたアサーション・ダイアログ・ボックスが表示される。アサーション・ダイアログ・ボックス上のボタンを押すことによって実行されるアクションは、以下のとおりである。
【0111】
【表11】

【0112】
状態マシンによって維持されるデータ・オブジェクトを表示するための機構を提供するために、データ・モデル・エクスプローラに状態マシン実施を提供することができる。状態マシン内に格納された各オブジェクトは、関連するメタデータ・セットを有する。このメタデータは、以下のものを含む。
【0113】
【表12】

【0114】
現在、データ・モデル・エクスプローラはJavaサポートと連携する場合のみ使用可能である。Javaサポートについては、以下でより詳細に説明する。図24に、データ・モデル・エクスプローラ・ウィンドウの例を示す。
【0115】
環境変数テキストは、XMLステートメント内の値および属性に置き換えることができる。一例として、以下の環境変数が生成されたものと仮定する。
SCOT_BASE=c:\scot
この変数は、以下の例のように、変数名を「%」記号で囲むことによって置き換えることができる。
<tag attribute="%SCOT_BASE%\filename.txt">.
結果として生じるテキストは、以下と等価である。
<tag attribute="c:\scot\filename.txt">.
【0116】
プロパティ値は、仕様言語ステートメント内の値および属性に置き換えることができる。これらは環境変数として扱われる。プロパティおよび環境変数が同じ名前を共有する場合、プロパティ値は、環境変数によってセットアップされた値を指定変更する。一例として、以下のプロパティがXML言語ステートメント内に定義され、<property−list>ステートメントがそれに続くものと仮定する。
<property name="SCOT_BASE"value="c:\scot">.
この値は、以下の例のように、プロパティ名を「%」記号で囲むことによって置き換えることができる。
<tag attribute="%SCOT_BASE%\filename.txt">.
結果として生じるテキストは、以下と等価である。
<tag attribute="c:\scot\filename.txt">.
【0117】
基本的な状態マシン実施によって、いくつかのアクションが提供される。組込みアクションのリスト例を以下に示す。
【0118】
【表13】

【0119】
名前付き変数に値を割り当てるために、assign−variable組込みアクションが使用される。以下のパラメータを受け入れる。
【0120】
【表14】

【0121】
状態マシン・スタックからすべての状態を除去するために、clean−state組込みアクションが使用される。パラメータはない。
【0122】
名前付き変数の値を減分するために、decrement−variable組込みアクションが使用される。以下のパラメータを有する。
【0123】
【表15】

【0124】
状態マシンを所与の状態に強制的に遷移するために、goto−state組込みアクションが使用される。以下のパラメータを有する。
【0125】
【表16】

【0126】
名前付き変数の値を増分するために、increment−variable組込みアクションが使用される。以下のパラメータを有する。
【0127】
【表17】

【0128】
ISynchTableインスタンス内のすべてのイベントが受け取られた場合、is_all_complete組込みアクションは「真」を戻す。以下のパラメータを有する。
【0129】
【表18】

【0130】
ISynchTableインスタンス内のいずれかのイベントが受け取られた場合、is_any_complete組込みアクションは「真」を戻す。以下のパラメータを有する。
【0131】
【表19】

【0132】
パラメータ・リスト内に指定されたすべてのイベントがISynchTableインスタンスによって受け取られた場合、is_complete組込みアクションは「真」を戻す。以下のパラメータを有する。
【0133】
【表20】

【0134】
特定のタイマが現在計時中であるか否かを判別するために、式でis_timer_timing組込みアクションが使用される。以下のパラメータを有する。
【0135】
【表21】

【0136】
デバッグ・ログに出力ラインを追加するために、log組込みアクションが使用される。以下のパラメータを有する。
【0137】
【表22】

【0138】
アプリケーション・イベント・ログに出力ラインを追加するために、log−event組込みアクションが使用される。以下のパラメータを有する。
【0139】
【表23】

【0140】
所与の正規表現に照らして文字列をテストするために、match組込みアクションが使用される。以下のパラメータを有する。
【0141】
【表24】

【0142】
以前にスタックに保存された状態に状態マシンを遷移するために、pop−state組込みアクションが使用される。スタックが空の場合、このアクションはエラーをログに記録し、実行チェーンを終了する。このアクションにはパラメータがない。
【0143】
現在の状態または何らかの所与の状態をスタックに保存するために、push−state組込みアクションが使用される。以下のパラメータを有する。
【0144】
【表25】

【0145】
現在のメッセージをそれ自体に再送するために、状態マシンによってresend−msg組込みアクションが使用される。このアクションにはパラメータがない。
【0146】
ISynchTableインスタンスを既知の状態にリセットするために、reset組込みアクションが使用される。以下のパラメータを有する。
【0147】
【表26】

【0148】
メッセージをそれ自体に送信するために、状態マシンによってsend−msg組込みアクションが使用される。以下のパラメータを有する。
【0149】
【表27】

【0150】
タイマを開始するために、start−timer組込みアクションが使用される。以下のパラメータを有する。
【0151】
【表28】

【0152】
タイマを停止するために、stop−timer組込みアクションが使用される。所与のタイマが現在アクティブでない場合、アクションは失敗する。以下のパラメータを有する。
【0153】
【表29】

【0154】
ISynchTableインスタンス内のエントリを更新するために、update組込みアクションが使用される。デフォルトでは、現在のメッセージをイベントとして使用する。イベントは、オプションで指定することができる。以下のパラメータを有する。
【0155】
【表30】

【0156】
タイマがタイムアウトするのを待つために、wait−timer組込みアクションが使用される。所与のタイマが現在アクティブでない場合、アクションは失敗する。以下のパラメータを有する。
【0157】
【表31】

【0158】
注:このアクションは、メインの状態マシン・スレッドでハード待ちを実行する。このアクションは、待機が完了するまでいかなる他のメッセージも処理できないため、慎重に使用される。
【0159】
クラスタ内の何らかの他の状態マシンへの制御を解放するために、yield組込みアクションが使用される。このクラスタに対して他の状態マシンが定義されていない場合、このアクションは、実行の現在のチェーンを停止するためにのみ働く。このアクションにはパラメータがない。
【0160】
状態マシン内には2つの異なる種類のクラスが定義されている。第1は、プロパティを備えていない抽象基本クラスであり、すべてのメソッドは純粋に仮想として定義される。これらのタイプ・クラスに関するクラス名の最初の文字は、IClassNameのように「I」である。第2の種類のクラスは、定義されたプロパティおよび/またはメソッドを有する具象実施態様または抽象基本クラスのいずれかである。この種のクラスに関するクラス名は、CClassNameのように文字「C」で始まる。例示的クラス名および各クラスの簡単な説明のリストを、以下のテーブルに示す。
【0161】
【表32−1】

【表32−2】

【表32−3】

【0162】
図25に、非一時状態マシン・クラスに関するクラス図を示す。各クラスは、クラスに関連付けられたメソッドを含む。図中で、三角形を通して他のクラスに結合されたクラスは、高位クラスの継承を表す。図中で、ダイヤ形を通して他のクラスに結合されたクラスは、関連クラスを表す。
【0163】
以下のテーブルは、タグ・マッピングへのXPath式のリストを含む。これらは、どのCContentHandlerクラスが現在のXMLタグを処理するか否かを決定するために、SMLoaderによって使用される。
【0164】
【表33−1】

【表33−2】

【0165】
図26のクラス図中のほとんどのクラスは、XMLファイルの解析のためにのみ使用され、解析が完了すると解放される。一時的でないものは、状態マシンによって使用されるクラスである。
【0166】
最新バージョンの状態マシンは、Javaアプリケーション向けのサポートを提供する。状態マシンは、クラスcom.ncr.statem.StateMachineのインスタンスによって表される。このJavaクラスは、JavaアクションをC++アクションと共に実行させることができる、基礎となるC++ CJavaStateMachineオブジェクトと対話する。状態マシン向けのJavaサポートは、statemj.dllと呼ばれる別の実行可能DLLとして提供される。このDLLは、Java向けのすべてのサポート・クラス、ならびにJavaアクションをサポートするJava Native Interface(JNI)コードを提供する。Javaサポートは、状態マシンへのプラグインとして実施されている。したがって、Javaプラグインは、以下のステートメントと共にXML定義に追加される。

<plugin-list>
<plugin
name="Java.Factory"/>
</plugin-list>.
【0167】
クラスcom.ncr.statem.StateMachineのすべてのインスタンスは、com.ncr.statem.StateMachineFactoryクラスを介して生成される。createメソッドは、完全にロードされたStateMachineインスタンスを戻す。以下の署名を有する。
public static StateMachine create(String_name
,String_url
,String_dllName
,String_configDir);
この呼び出しステートメントでは、_nameパラメータが状態マシンの固有名を指定する。_urlパラメータは、この状態マシンに関するXML定義を含むURLを指定する。_dllNameパラメータは、Javaサポートを含む共有dllの名前を指定する。_configDirパラメータは、URL関連検索に使用するためのディレクトリを指定する。
【0168】
アクションはJavaで定義することが可能であり、C++で定義されたアクションと共存することができる。実際のところ、すべての内部アクションはC++アクションである。C++アクションとは異なり、Javaアクションは使用に先立って登録されない。その代わりに、Java反映機能を使用して生成される。名前付きクラスのインスタンスは、最初に遭遇した際にオンデマンドで生成され、状態マシンの存続期間全体を通じて維持される。状態マシンの終了時に、Javaアクションは廃棄される。以下に、Javaアクション定義の例を示す。<class>タグの追加により、このアクションがJavaアクションとして識別される。<class>タグ上のname属性が、アクションの完全に修飾されたクラス名を指定する。
<action-list>
<action name="SomeAction">
<class name="com.ncr.ActionName">
</action>
</action-list>
【0169】
以下で説明する、共有データ・モデルに格納されたJavaオブジェクトのいかなるフィールドにも、状態マシンによって使用される式でアクセスすることができる。これらのフィールドは、フィールドに関するアクセサ・メソッドを呼び出すことによってアクセスされる。getXXX()の形のアクセサ・メソッドのみを呼び出すことが可能であり、ここでXXXはアクセスするフィールドの名前である。オブジェクトそれ自体は、そのXPath名を介して共有データ・モデルから参照される。式で使用するための構文は、以下のとおりである。
$(xpath-expression)[.method-name()][[index]]
上式で、xpath−expressionは、所望のJavaオブジェクトのXPath式である。「/」文字で始まる単純な絶対XPath式のみがサポートされる。
method−nameはアクセサ・メソッド名である。メソッド名はオプションである。これが指定されない場合、オブジェクトそれ自体が値に使用される。indexはアレイ・インデックスを指定する。このパラメータは、データ・モデルから戻されるオブジェクトが、ArrayListなどのインデックスを介してそのメンバにアクセスする機能を指定するアレイまたはJavaコレクションのいずれかである必要がある。Javaによってサポートされるネイティブ・タイプのみが直接操作可能である。これらは、int、long、およびBooleanを含む。java.lang.Stringクラスは特別であり、直接アクセスすることもできる。他のすべてのユーザ定義Javaオブジェクトは、オブジェクトのtoString()メソッドを呼び出すことによって間接的に操作される。
【0170】
以下の例で、式"$(/transaction/current-instance).getTotalDue()&gt;0"は、最初に、xpath式「/transaction/current−instance」を使用して、共有データ・モデルからのオブジェクト・ルックアップを実行する。次にこの式は、そのオブジェクトのgetTotalDueメソッドの位置を特定し、これを呼び出す。最後にこの式は、そのメソッドから戻されたlong値とゼロとを比較する。値がゼロよりも大きい場合、「真」の値が戻される。値がゼロより小さいかまたは等しい場合、「偽」の値が戻される。
【0171】
図26に、Javaをサポートするために使用されるクラスに関するクラス図を示す。ここでも、各クラスで使用可能なメソッドを図中に示す。Javaサポート・クラスが以下のテーブルで識別され、テーブルに続いて各クラスについて簡単に説明する。
【0172】
【表34】

【0173】
com.ncr.statem.StateMachineクラスは、メインState Machineクラスである。このクラスは、状態マシンの機能にアクセスするための機構を提供する。以下のものを提供する。
・LookupTableおよびActionなどの基礎となるデータ構造へのアクセス
・状態マシンにメッセージを送信/通知する機能
・アクションが使用するためのオブジェクト用のキー付きストレージを提供するために使用されるDataModelオブジェクトへのアクセス
com.ncr.statem.StateMachineの各インスタンスについて、基礎となるC++のCJavaStateMachineオブジェクトが存在する。
【0174】
com.ncr.statem.StateMachineClusterクラスは、協働するcom.ncr.statem.StateMachineインスタンスのコレクションを表す。これは、それ自体がcom.ncr.statem.StateMachineのインスタンスであり、com.ncr.statem.StateMachineを使用するために有効な場所であれば、どこでも使用することができる。これは、com.ncr.statem.StateMachineについて上述した機能と同じ機能と、現在アクティブな状態マシン・インスタンスへのメッセージのルーティングを提供する。com.ncr.statem.StateMachineClusterの各インスタンスについて、基礎となるC++のCJavaClusterオブジェクトが存在する。
【0175】
com.ncr.statem.Actionクラスは、すべてのJavaアクションが実施しなければならないインタフェースである。executeおよびgetResultの2つのメソッドが提供される。前者は、C++ IActionインタフェースのExecuteメソッドに対応する。後者は、「真」または「偽」の戻り値を取得するための機能を提供する。C++の世界では、この機能は、pResultパラメータの設定によって達成される。パラメータはJavaでの値によって渡されるため、この手法は使用されない。生成される各com.ncr.statem.Actionクラスについて、基礎となるCJavaActionのC++オブジェクトが存在する。
【0176】
com.ncr.statem.Messageクラスは、状態マシンへの入力として使用される。このクラスは、C++実施におけるIMessageの等価物を提供する。このクラスの各インスタンスについて、C++側に基礎となるCJavaMessageが存在する。
【0177】
com.ncr.statem.LookupTableクラスは、C++実施におけるILookupTableの等価物を提供する。com.ncr.statem.LookupTableとILookupTableインスタンスとの間には、1対1の対応が存在する。com.ncr.statem.LookupTableの各インスタンスについて、基礎となるILookupTableオブジェクトが存在する。
【0178】
C++のJavaネイティブ・クラスが次のテーブルで識別され、以下で簡単に説明される。
【0179】
【表35】

【0180】
CJavaStateMachineクラスはCXMLStateMachineから導出され、Javaアクションが状態マシンから実行できるようにするために必要な機能を提供する。
【0181】
CJavaActionクラスは、Classパス、および対応するcom.ncr.statem.Actionのexecuteメソッドの呼び出しに関連する他の情報を保存するためのバッキング・ストアを提供する。
【0182】
CJavaMessageクラスは、状態マシンでの対応するcom.ncr.statem.Messageの使用に関連するJNI情報を保存するための、バッキング・ストアを提供する。
【0183】
CJavaActionProxyクラスは、ローディング・プロセス中のクラス情報を保存する。この情報は、CJavaActionおよびその対応するcom.ncr.statem.Actionを生成するために、後で使用される。
【0184】
CJavaPluginFactoryクラスは、Javaサポートを状態マシンに接続する為に必要なIPluginインタフェースを提供する。
【0185】
前述のコードは、Javaネイティブ・メソッドの実施に使用される。しかし、Javaネイティブ・インタフェースが「C」プログラミング言語で実施されるため、実際のクラスはない。クラスおよびそれらの機能を以下のテーブルに列挙する。
【0186】
【表36】

【0187】
状態マシンは、複数の状態マシンが協働的に動作する構成もサポートする。この構成では、1つの状態マシンが基本状態マシンに指定され、「フォーカス」と認められる。すべてのメッセージは、最初にフォーカスを備える状態マシンに向けて送られる。その状態マシンがメッセージを処理しない場合、そのメッセージを処理できる状態マシンがもしもあれば、それがどれであるかを調べるために、すべての他の状態マシンが問い合わせられる。他の状態マシンがメッセージを処理できる場合、それがフォーカスを獲得し、現在実行中の状態マシンとなる。
【0188】
各状態マシンは、XML定義ファイルに定義された休止状態を有する。この状態に入ると、状態マシンは、基本状態マシンでない限りフォーカスを失う。状態マシンは、それらをスタック上に配置することによって追跡される。スタックのトップは現在実行中の状態マシンであり、フォーカスを有する。新しい状態マシンはフォーカスを獲得すると、スタックに追加される。状態マシンは、フォーカスを失うとスタックのトップから除去され、使用可能なプールに戻される。スタックの新しいトップがフォーカスを取り戻し、中止した時点から実行を再開する。
【0189】
現在実行中の状態マシンは、2つの方法でフォーカスを失う可能性がある。状態マシンは、yieldアクションを実行することによって、自発的にフォーカスを他の状態マシンに引き渡す。フォーカスを失うもう1つの方法は、状態マシンが処理しない旨のメッセージを受け取ることである。この無効性により、「フォーカス」を備える状態マシンは、そのメッセージを処理できる他の状態マシンにそのフォーカスを譲ることになる。協働する状態マシンのセットは、CClusterクラスのインスタンスによって管理される。このクラスは、スタックの保守および構成要素状態マシンへの役割の委任の責務を負う。
【0190】
クラスタを定義するXMLステートメントは、トップ・レベルの<state−machine−cluster>タグと、それに続く、構成要素状態マシンを識別する1つまたは複数の<state−machine>タグとを有する。これらのタグでは、以下の属性が可能である。
・両方のタグのname属性は、構成要素を参照する際に使用可能な固有名である。
・url属性は、状態マシンに使用されるXML定義を含むファイルのURLを識別する。
・library属性は、関連する状態マシン要素を含むライブラリの名前を識別する。このライブラリは、状態マシンがロードされる前にロードしなければならない。
【0191】
クラスタ定義は、XMLステートメントでは以下のようになる可能性がある。
<?xml version="1.0"?>
<state-machine-cluster name="Fastlane">
<state-machine name="CustomerMode"
url="FastLaneCustomerMode.xml"
library="statemj" default="true"/>
<state-machine name="StoreMode"
url="FastLaneStoreMode.xml"
library="statemj"/>
<state-machine name="AssistMode"
url="FastLaneAssistMode.xml"
library="statemj"/>
<state-machine name="MaintenanceMode"
url="FastLaneMaintenanceMode.xml"
library="statemj"/>
<state-machine name="ErrorMode"
url="FastLaneErrorMode.xml"
library="statemj"/>
</state-machine-cluster>
【0192】
モーダル状態マシンとは、未知のメッセージを処理するためのデフォルトの挙動が変更されている状態マシンのことである。モーダル状態マシンは、制御およびメッセージをクラスタの他のメンバに渡すのではなく、明示的<yield>タグに遭遇するまで、メッセージをキューに入れる。この時点で、モーダル状態マシンは制御を他の状態マシンに譲り、キューに入れられていたすべてのメッセージを再送する。モーダル状態マシンは、<state−machine>タグにmodal=属性を追加することによって、以下のように定義される。
<state-machine modal="true">

</state-machine>
【0193】
動作の準備をするために、状態マシン実施は、XMLなどの仕様言語で設計および記述される。定義内の仕様言語ステートメントは、チェックアウト・ステーションなどのビジネス・プラットフォーム上でシステム機能を実施する、実行可能コンピュータ・コードを呼び出すアクションを含む。仕様言語ステートメントを含む仕様ファイルは、ビジネス・プラットフォームのハード・ドライブまたはその他に格納される。パーサ・アプリケーション・プログラムも、ビジネス・システムを制御するプロセッサによる実行のために、ビジネス・プラットフォームのハード・ドライブまたはメモリに格納される。
【0194】
動作を開始するために、状態マシン実施が初期設定され、ワーカー・スレッドが提供される。パーサは、状態マシン定義の仕様言語ステートメントの解釈を開始する。この解釈には、ビジネス・プラットフォームのビジネス・ロジック・モジュールの呼び出しと、仕様言語ステートメントの解析を続行するための戻された値の評価とが含まれる。状態マシン実施定義の解析は、状態マシンが終了ポイントに到達するまで続行される。その後、状態マシン実施は、実施の解析が再度開始される前の再初期設定を必要とする。
【0195】
ビジネス・システムの動作を修正するために必要な変更は、ビジネス・プラットフォームが修正されていない限り、ビジネス・ロジックに必要な変更のみである。ビジネス・ロジックは仕様言語で記述されるため、仕様ファイル内の構造は、再コンパイルおよびシステム内の他のコンピュータ・コードのインストールの必要なしに、変更することができる。代わりに、新しいバージョンの仕様言語ファイルがハード・ドライブに書き込まれる。次に、この新しいバージョンは初期設定時に検証され、ビジネス・システムを制御するために新しい仕様ファイルの解析が開始される。
【0196】
以上、本発明について、例示的プロセスおよびシステム構成要素の説明によって示し、様々なプロセスおよび構成要素についてかなり詳細に説明してきたが、出願人は、添付の特許請求の範囲を制約すること、またはこうした細部に限定することを意図しない。当業者であれば、追加の利点および修正も容易に明らかとなろう。したがって本発明は、その最も広義の態様において、図示および説明された特定の細部、実施、または例に限定されるものではない。したがって、出願人の全体的な発明の概念の趣旨または範囲から逸脱することなく、こうした細部から逸脱することが可能である。
【図面の簡単な説明】
【0197】
【図1】ビジネス・ロジックおよびチェックアウト・ステーションを実施するための仕様言語ファイル・インタプリタを有するチェックアウト・ステーションを示す斜視図である。
【図2】システムに関するビジネス・ロジックを実施するために仕様言語インタプリタを使用するシステムを示すブロック図である。
【図3】状態マシンを定義するために使用可能なXMLファイル構造の一例を示す図である。
【図4】図3のファイル構造で使用可能なライブラリ定義の一例を示す図である。
【図5】図3のファイル構造で使用可能なタイマ定義の一例を示す図である。
【図6】図3のファイル構造で使用可能な定数定義の一例を示す図である。
【図7】図3のファイル構造で使用可能な変数定義の一例を示す図である。
【図8】図3のファイル構造で使用可能な状態定義の一例を示す図である。
【図9】図3のファイル構造で使用可能なメッセージ定義の一例を示す図である。
【図10】図3のファイル構造で使用可能なアクション定義の一例を示す図である。
【図11】図3のファイル構造で使用可能なルックアップ・テーブル定義の一例を示す図である。
【図12】図3のファイル構造で使用可能なif式の一例を示す図である。
【図13】図12のif式で使用可能なelse式の一例を示す図である。
【図14】図3のファイル構造で使用可能なelse−if式の一例を示す図である。
【図15】図3のファイル構造で使用可能なselect式の一例を示す図である。
【図16】図3のファイル構造で使用可能なwhen式の一例を示す図である。
【図17】図3のファイル構造で使用可能なotherwise式の一例を示す図である。
【図18】図3のファイル構造で使用可能なfor式の一例を示す図である。
【図19】図3のファイル構造で使用可能なwhile式の一例を示す図である。
【図20】図3のファイル構造で使用可能なtimeout−rule−list式の一例を示す図である。
【図21】図3のファイル構造で使用可能なbreak式の一例を示す図である。
【図22】図3のファイル構造で使用可能なyield式の一例を示す図である。
【図23】状態マシン実施で使用可能なアサーション・ダイアログ・ボックスの一例を示す図である。
【図24】図3のファイル構造で使用可能なデータ・モデル・エクスプローラの一例を示す図である。
【図25A】状態マシン実施で使用可能な非一時クラスの例示的セットを示すクラス図の一部である。
【図25B】状態マシン実施で使用可能な非一時クラスの例示的セットを示すクラス図の一部である。
【図25C】状態マシン実施で使用可能な非一時クラスの例示的セットを示すクラス図の一部である。
【図25D】状態マシン実施で使用可能な非一時クラスの例示的セットを示すクラス図の一部である。
【図25E】状態マシン実施で使用可能な非一時クラスの例示的セットを示すクラス図の一部である。
【図25F】状態マシン実施で使用可能な非一時クラスの例示的セットを示すクラス図の一部である。
【図25G】状態マシン実施で使用可能な非一時クラスの例示的セットを示すクラス図の一部である。
【図25H】状態マシン実施で使用可能な非一時クラスの例示的セットを示すクラス図の一部である。
【図25】状態マシン実施で使用可能な非一時クラスの例示的セットを示すクラス図(図25A〜図25H)の全体構成図である。
【図26A】図3のファイル構造を解析するために使用可能な一時クラスを示すクラス図の一部である。
【図26B】図3のファイル構造を解析するために使用可能な一時クラスを示すクラス図の一部である。
【図26C】図3のファイル構造を解析するために使用可能な一時クラスを示すクラス図の一部である。
【図26D】図3のファイル構造を解析するために使用可能な一時クラスを示すクラス図の一部である。
【図26E】図3のファイル構造を解析するために使用可能な一時クラスを示すクラス図の一部である。
【図26F】図3のファイル構造を解析するために使用可能な一時クラスを示すクラス図の一部である。
【図26】図3のファイル構造を解析するために使用可能な一時クラスを示すクラス図(図26A〜図26F)の全体構成図である。
【図27】状態マシン実施のJavaサポートに使用可能なクラスを示すクラス図である。

【特許請求の範囲】
【請求項1】
プロセッサと、メモリと、ハード・ドライブとを有するビジネス用コンピュータ・システムの動作を制御するためのシステムであって、前記システムが、
ハード・ドライブ上に格納された仕様言語ファイルであって、前記ファイルがコンピュータ・システムの状態マシンの実施を定義する仕様言語ステートメントを含む仕様言語ファイルと、
前記仕様言語ファイルから仕様言語ステートメントを抽出するため、および前記抽出された仕様言語ステートメントを解釈するためのパーサと、
ビジネス・ロジック・モジュールより構成されるビジネス・ロジック・アプリケーション・プログラムであって、前記ビジネス・ロジック・モジュールが、実行可能なコンパイル済みプログラム・ステートメントを含むビジネス・ロジック・アプリケーション・プログラムとを備え、
前記パーサが、前記仕様言語ファイルから前記パーサによって抽出されたメッセージを処理するために、前記ビジネス・ロジック・モジュールのうちの少なくとも1つを呼び出すコンピュータ・システム。
【請求項2】
前記パーサが、
前記仕様言語ステートメント内の式タグを特定するため、および前記特定された式タグに従って、対応するタグ間の前記仕様言語ステートメントを解釈するための式インタプリタと、
ビジネス・ロジック・モジュールを呼び出すためのメソッド・インボーカであって、前記仕様言語ファイルから前記パーサによって抽出されたメッセージを使用して前記ビジネス・ロジック・モジュール呼び出しをサポートするインボーカとを備える、請求項1に記載のコンピュータ・システム。
【請求項3】
前記ビジネス・ロジック・モジュールがプログラミング言語オブジェクトである、請求項1に記載のコンピュータ・システム。
【請求項4】
複数の仕様ファイルであって、各ファイルがビジネス・システムの状態マシン実施を定義する仕様言語ステートメントを含む複数の仕様ファイルをさらに備え、
前記パーサが、現在解析されている前記仕様ファイルを識別するフォーカス変数を維持する、請求項1に記載のコンピュータ・システム。
【請求項5】
前記仕様言語ステートメントが、拡張可能マークアップ言語(XML)ステートメントで記述される、請求項1に記載のコンピュータ・システム。
【請求項6】
前記パーサが、前記コンピュータ・システムのプロセッサによって実行されるアプリケーション・プログラムである、請求項1に記載のコンピュータ・システム。
【請求項7】
前記ビジネス・ロジック・モジュールがプログラミング言語オブジェクトである、請求項1に記載のコンピュータ・システム。
【請求項8】
前記プログラミング言語オブジェクトが、C++オブジェクトおよびJavaオブジェクトのうちの1つである、請求項7に記載のコンピュータ・システム。
【請求項9】
状態マシンを生成するため、ならびに、JavaクラスおよびC++オブジェクトのうちの1つで実施されるアクションを呼び出すためのJavaアプリケーションにおけるJavaサポート・インタフェースをさらに備える、請求項2に記載のコンピュータ・システム。
【請求項10】
前記パーサが、メッセージを処理するためのメソッドを有さずに解析される前記仕様言語ファイル内の前記仕様言語ステートメントによって定義される前記状態マシン実施に応答してフォーカス状態を変更する、請求項4に記載のコンピュータ・システム。
【請求項11】
プロセッサと、メモリと、ハード・ドライブとを有するビジネス用コンピュータ・システムの動作を制御するための方法であって、
仕様言語ステートメントを使用して、コンピュータ・システムの状態マシン実施を定義するステップと、
前記コンピュータ・システムを実施するために前記仕様言語ステートメントを解釈するステップと、
解釈された仕様言語ステートメントからパーサによって抽出されたメッセージを処理するために、実行可能なコンパイル済みプログラム・ステートメントを含むビジネス・ロジック・モジュールを呼び出すステップとを含むコンピュータ・システムの動作制御方法。
【請求項12】
仕様言語ステートメントを解釈する前記ステップが、
前記仕様言語ステートメント内の式タグを特定するステップと、
前記特定された式タグに従って、対応するタグ間の前記仕様言語ステートメントを解釈するステップと、
前記仕様言語ステートメントから抽出されたメッセージを使用して、ビジネス・ロジック・モジュールを呼び出すステップとをさらに含む、請求項11に記載のコンピュータ・システムの動作制御方法。
【請求項13】
ビジネス・ロジック・モジュールを呼び出す前記ステップが、
プログラミング言語オブジェクト内のメソッドを呼び出すステップをさらに含む、請求項11に記載のコンピュータ・システムの動作制御方法。
【請求項14】
複数の仕様言語ファイルをクラスタ化するステップであって、各仕様言語ファイルが、ビジネス・システムの状態マシン実施を定義する仕様言語ステートメントを含むステップと、
現在解析されている前記複数の仕様言語ファイル内の前記仕様ファイルを識別するために、フォーカス変数を維持するステップとをさらに含む、請求項11に記載のコンピュータ・システムの動作制御方法。
【請求項15】
仕様言語ステートメントを解釈する前記ステップが、
拡張可能マークアップ言語(XML)ステートメントを解釈するステップをさらに含む、請求項11に記載のコンピュータ・システムの動作制御方法。
【請求項16】
前記仕様言語ステートメント解釈ステップが、
前記ビジネス・システムのプロセッサを使用してアプリケーション・プログラムを実行するステップを含む、請求項11に記載のコンピュータ・システムの動作制御方法。
【請求項17】
ビジネス・ロジック・モジュールを呼び出す前記ステップが、
プログラミング言語オブジェクトを呼び出すステップを含む、請求項11に記載の方法。
【請求項18】
プログラミング言語オブジェクトを呼び出す前記ステップが、C++オブジェクトおよびJavaオブジェクトのうちの1つを呼び出すステップを含む、請求項17に記載のコンピュータ・システムの動作制御方法。
【請求項19】
状態マシン実施の定義に含まれるJavaサポート・インタフェースを通してJavaアクション・クラスを呼び出すステップをさらに含む、請求項12に記載のコンピュータ・システムの動作制御方法。
【請求項20】
メッセージを処理するためのメソッドを有さずに解析されている前記仕様言語ファイル内の前記仕様言語ステートメントによって定義される前記状態マシン実施に応答して、前記フォーカス変数の状態を変更するステップをさらに含む、請求項14に記載のコンピュータ・システムの動作制御方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate

【図22】
image rotate

【図23】
image rotate

【図24】
image rotate

【図25A】
image rotate

【図25B】
image rotate

【図25C】
image rotate

【図25D】
image rotate

【図25E】
image rotate

【図25F】
image rotate

【図25G】
image rotate

【図25H】
image rotate

【図25】
image rotate

【図26A】
image rotate

【図26B】
image rotate

【図26C】
image rotate

【図26D】
image rotate

【図26E】
image rotate

【図26F】
image rotate

【図26】
image rotate

【図27】
image rotate


【公開番号】特開2008−140390(P2008−140390A)
【公開日】平成20年6月19日(2008.6.19)
【国際特許分類】
【出願番号】特願2007−308661(P2007−308661)
【出願日】平成19年11月29日(2007.11.29)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
【出願人】(391007161)エヌ・シー・アール・コーポレイション (85)
【氏名又は名称原語表記】NCR CORPORATION
【Fターム(参考)】