Designerには、ECMAScriptインタープリタと式エディタが組み込まれています。式エディタでは、ワークフローデータを参照したり変更したりするスクリプト式を作成できます。 たとえば、スクリプティングを使って次のことができます。
フローデータ要素の下にワークフローに必要なデータ項目を作成する。
データに対して基本的な文字列操作、日付操作、数値操作、リレーショナル操作、連結操作、および論理操作を実行する。
より高度なデータ操作を実行するため、標準またはカスタムJavaクラスを呼び出す。
式を使ってランタイム制御を行い、次の操作を実行する。
フォームフィールドラベルを変更または上書きする。
フォームフィールドデータを初期化する。
電子メールアドレスとコンテンツをカスタマイズする。
エンタイトルメントの付与または取り消しの権限およびパラメータを設定する。
終了したアクティビティのデータを評価し、条件アクティビティを使って条件付きでワークフローパスをたどる。
条件付きでトリガされる異なったログメッセージを単一のログアクティビティで書き出す。
この項では、スクリプトティングの使用時に利用できる技術や機能について説明します。
メモ:ワークフローの式を定義するには、ワークフローアクティビティの設定方法について理解しておく必要があります。また、ワークフロー内で使用できるさまざまなデータタイプについても知っておく必要があります。 ワークフローアクティビティの詳細については、セクション 8.0, ワークフローアクティビティの参照を参照してください。ワークフロー内で使用可能なシステム変数については、セクション 4.3.3, ワークフローデータについての理解を参照してください。
ECMAScriptは、ホスト環境(この場合はDesigner)でオブジェクトの操作に使用するオブジェクト指向のスクリプト言語です。ECMAScript (ECMA-262とISO/IEC 16262)は、JavaScript (Netscape*)とJScript* (Microsoft*)の基盤になる標準ベースのスクリプト言語です。 ECMAScriptは、Designerのグラフィカルユーザインタフェースのような、ホスト環境の既存の機能を補ったり拡張したりするために使用します。ホスト環境であるDesignerは、ECMAScriptに処理のため、さまざまなオブジェクトへのアクセスを提供します。 ECMAScriptは、それらのオブジェクトを操作するJavaによく似た言語を提供します。
ECMAScriptは、拡張性に富み、正規表現などの強力な文字列処理ツールを備えています。このため、Designerの機能を拡張する理想的な言語として利用できます。
メモ:ECMAScriptの詳細については、欧州コンピュータ製造工業会(ECMA)のWebサイトを参照してください。
スクリプティングを利用すると、細かく調整されたカスタムロジックをワークフローに組み込むことができるだけでなく、データ操作の柔軟性も大幅に向上します。これは、ECMAScript拡張機能の一部として、DOMおよびXPath関連のオブジェクトやメソッドが式ビルダに組み込まれているからです。
ECMAScriptは、特にメモリ内のDOMを操作するときに役に立ちます。 ECMA式ビルダは、W3C DOM Level 2の仕様に従って、XMLドキュメントをメモリ内オブジェクトとして作成します。DOM 2仕様では、ECMAScriptバインディング(W3C推奨仕様「★ECMAScript Language Binding★」を参照)が定義され、DOMツリーコンテンツにすぐにアクセスできる多数のメソッドおよびプロパティが用意されています。ECMA式ビルダは、フローデータのDOMを認識します。ECMA式ビルダでは、W3Cで定義されているDOM用のあらゆるECMAScript拡張機能を使用できます。
ECMAScriptは、XPathなどの他の式言語とDOMを結び付けるブリッジとしても機能します。このため、XPath構文をDOMに使用し、ドキュメント構造内のさまざまな要素を処理できます。
Designerでは、ユーザアプリケーションデザインツールのさまざまな場所からECMAScriptにアクセスできます。最も一般的なアクセスフォームは、式ビルダからのアクセスです。次のボタンが表示されていれば、いつでも式ビルダを表示できます。
このボタンは、条件アクティビティの[プロパティ]画面や、エンタイトルメントプロビジョニングアクティビティの[データ項目マッピング]ビューなどのDesignerのディスプレイにあります。このボタンをクリックすると、ECMA式ビルダが表示されます。
図 10-1 ECMA式ビルダ
ECMA式ビルダのトップペインには、使用可能なオブジェクト、メソッド、およびプロパティの選択リストがあります(すべてサイズ変更可能)。項目をロールオーバーすると、ECMAScriptステートメントの作成に役立つツールヒントが表示されます。選択リスト内の任意の項目をダブルクリックすると、ウィンドウ下部の編集ペインに、対応するECMAScriptステートメントが表示されます。図では、
ペインで 選択リストが選択され、 変数がダブルクリックされています。このワークフロー変数のコンテンツにアクセスできるECMAScript式が、編集ペインに自動的に挿入されます。この項では、次のトピックについて説明します。
ECMA式ビルダには、
ボタンがあります。 このボタンをクリックすると、ECMAScriptインタープリタにより、式の構文がチェックされます。ECMAScriptの構文に問題が見つかった場合は、エラーメッセージが表示されます。 その場合は式を編集し、必要に応じて再検証することができます。検証はオプションです。メモ:構文のチェック時には、式は実行されません。構文がチェックされるだけです。ECMAScriptはインタープリタ言語なので、構文のチェック時には、ランタイムに依存する式はチェックされません。これらの式が有効なECMAScript構文に準拠しているかどうかが確認されるだけです。
ECMA式ビルダには、
ボタンもあります。このボタンは、識別ボールトからDNを選択する必要があるアクティビティ(開始アクティビティ、承認アクティビティ、エンタイトルメントアクティビティなど)の操作中に表示されます。図 10-2 [識別ボールト]ボタン
ボタンをクリックすると、識別ボールトをナビゲートしてDNを選択するためのダイアログボックスが表示されます。識別ボールトに接続していない場合は、識別ボールトを使用できないことを示すため、[識別ボールト]ボタンがかすんだ表示になります。
このペインには、現在のコンテキストに関連する変数の名前が表示されます。たとえば、プロビジョニング要求定義エディタを使用している場合、現在のワークフロープロセスのシステム変数、現在のアクティビティのシステム変数、および現在のワークフローで作成されたフローデータ変数が表示されます。変数名をダブルクリックすると、その変数がスクリプトに挿入されます。ワークフローで使用できるシステム変数については、セクション 4.3.3, ワークフローデータについての理解を参照してください。
ECMA式ビルダでは、次の2つのメソッドを使ってフローデータ変数を読み取ることができます。
ECMA式ビルダで使用できる関数とメソッドの説明は、セクション 10.3, ECMAScript APIを参照してください。
次の表では、ECMA式ビルダで使用できる演算子について説明します。
表 10-2 Math
演算子 |
説明 |
---|---|
+ 加算 |
2つの数値(リテラルまたは変数)の和を返します。 |
- 減算 |
一方の数からもう一方の数を差し引きます。 |
* 乗算 |
2つの数値(リテラルまたは変数)の積を返します。 |
/ 除算 |
一方の数をもう一方の数で割ります。 |
表 10-3 割り当て
表 10-4 その他
表 10-5 リレーショナル
このペインでは、識別ボールトに定義されているエンティティ定義(セクション 3.2, エンティティおよび属性の操作を参照)を、スクリプトに挿入することができます。システムエンティティ、ユーザ定義エンティティの両方を使用できます。識別ボールトからデータを取得する式のフォーマットは、次のとおりです。
IDVault.get(dn, object-type, attribute)
たとえば、データ項目の受信者のマネージャ情報を取得したい場合、VDX Exprパネルの[ユーザ]ノードを展開し、[マネージャ]項目をダブルクリックします。すると、IDVault.get({ここにDN式を入力}, 'user', 'manager')という式が挿入されます。この式は、マネージャのDN (LDAP識別名)の文字列を評価します。
Javaは、外部Javaオブジェクトへのブリッジを提供するECMA式ビルダを通して、ワークフロープロセスに統合されています。ECMA式ビルダからJavaクラスにアクセスするには、ワークフローエンジンのクラスパスにクラスを配置する必要があります。このためには、ユーザアプリケーションWARファイル(IDM.war)内のWEB-INF\libディレクトリにJavaクラスを追加します。
メモ:フォームアクションスクリプトは、プロビジョニング要求定義エディタのその他の部分で使用できるECMAScriptとは異なり、サーバ上ではなくブラウザ上で実行されます。フォームアクションスクリプトからのディレクトリアクセスはすべて、ブラウザからサーバへのAJAX呼び出しを通して処理されます。詳細については、セクション 10.3.1, フォームアクションスクリプトメソッドを参照してください。
WARファイルユーティリティを使ってIDM.warファイルを開きます。IDM.warファイルは、アプリケーションサーバの\server\IDM\deployディレクトリ内にあります。
WEB-INF\libディレクトリにJavaクラスをコピーします。
Javaクラスにアクセスするには、ECMA式ビルダでインライン関数を作成します。関数のインスタンスを作成し、この関数内でECMAScript構文を使ってJavaメソッドを呼び出します。次に、ベクタの作成例を示します。
function list() { v=new java.util.Vector(); v.add('{Enter Item 1}'); v.add('{Enter Item 2}'); return v; }; list();
カスタムJavaクラスにアクセスするには、クラス名の前に「Packages」というプレフィックスを付けます。次に例を示します。
v = new Packages.com.novell.myClass("value");
ECMA式ビルダはMozilla* Rhinoに基づいています。Rhinoは、完全にJavaで記述されたJavaScriptのオープンソース実装です。ECMAScriptからJavaにアクセスする方法の詳細については、「★Scripting Java★」を参照してください。
この項では、次のトピックについて説明します。
プロビジョニング要求定義ワークフローは、フローデータという特殊なオブジェクトをサポートします(セクション 4.3.3, ワークフローデータについての理解を参照)。 フローデータオブジェクトは、DOMの一種です。つまり、メモリ内のオブジェクトとして作成されたXMLドキュメントです。XPath構文を使って、フローデータDOMの構造をナビゲートしたり、要素やコンテンツを追加、変更、または削除したりできます。
フローデータへのオブジェクトの追加
フローデータからのオブジェクトの取得
flowdata.get()メソッドとflowdata.getObject()メソッドについては、表 10-1を参照してください。
ECMAScriptインタープリタは、統合アクティビティ内のカスタムメソッドXPath()を認識します。このメソッドでは、次のような式を作成できます。
Input.XPath("GetBNQuoteSoapIn/GetBNQuote/sISBN")
ECMA式ビルダで、選択リストからノードを選択すると、このような式が自動的に作成されます。
統合アクティビティでは、W3Cで採用されているXPathアドレス指定構文を使用します。XPath構文は、URIアドレス指定構文と似ていますが、XMLのアドレス指定や操作に役立つ高度な機能を多数備えています。次の表に、よく使用する構文規則をいくつか紹介します。
表 10-10 XPath構文
使用できるすべての演算子については、W3推奨のXML Path Language (XPath)を参照してください。
ECMAScriptはインタープリタ言語なので、式に含まれるすべてのスクリプト行が解析され、同等のJava構文に変換されてから実行されます。このため、コードのオーバーヘッドが大きくなり、純粋なJavaと比べてスクリプトの実行速度が遅くなります。ECMAScriptを使用する前に、パフォーマンスの問題について考慮する必要があります。
現在のコンポーネントおよびサービスで最適なパフォーマンスを得るには、次のガイドラインが役に立ちます。
ECMAScriptから呼び出すことができるカスタムJavaクラスを使ってタスクを実行できるかどうかを考える。
スクリプティングによる細かい調整が必要な場合は、ECMAScriptを使用する。
パフォーマンス向上の鍵は、実装方法にあります。たとえば、正しいアルゴリズムを選択し、変数をできるだけ再使用するということです。処理の速い言語で書かれた不適切なコードよりも、処理の遅い言語で書かれた良いコードのほうが、高いパフォーマンスを発揮することがあります。Javaで書かれたコードのほうが、ECMAScriptで書かれた同等のロジックよりパフォーマンスが高いとは限りません。なぜなら、JavaにはJavaのオーバーヘッド制約があるからです。たとえば、コンストラクタの呼び出しチェーンがその好例です(他のオブジェクトを継承するJavaオブジェクトのコンストラクタを呼び出すと、その上位(祖先)のすべてのオブジェクトが呼び出される)。
ECMAScriptのコアオブジェクト(String、Array、Dateなど) には、データの操作、書式設定、解析、ソート、文字列変換、配列変換などに使用する便利なメソッドが多数組み込まれています。これらのメソッドは、高度に最適化されたJavaコードによって、インタープリタ内に実装されています。 データ解析や書式設定のための関数をカスタマイズして作成してもかまいませんが、利用できるときはこれらのメソッドを利用するほうが賢明です。たとえば、長い文字列を区切り記号の位置で複数の部分文字列に分割したい場合、indexOf()とsubstring()の2つのStringメソッドを含むループを作成する方法があります。ループを使って文字列の解析を行い、結果として生成された部分文字列を配列内のスロットに割り当てます。しかし、この方法は効率がよくありません。そこで、次のようなシンプルな方法を使用することもできます。
var myArrayOfSubstrings = bigString.split( delimiter );
ECMAScriptのStringメソッドsplit()は、指定の区切り記号の位置で文字列を分割し、部分文字列の配列を生成します。このメソッドはネイティブJavaで実行されるので、1行のスクリプトを変換するだけでもインタープリタが必要です。一方、ループを使ってindexOf()とsubstring()を繰り返し呼び出す方法では、インタープリタは不要な上、関数呼び出しのオーバーヘッドもかからないので、パフォーマンスに悪影響がありません。
組み込みのECMAScriptメソッドを上手に利用することで、パフォーマンスを向上させることができます。大量のスクリプトを使用する場合は、ECMAScript言語について詳しく学ぶことをお勧めします。そのことが、パフォーマンスのボトルネックの解決に役立ちます。