10.1 ECMA式ビルダについて

Designerには、ECMAScriptインタープリタと式エディタが組み込まれています。式エディタでは、ワークフローデータを参照したり変更したりするスクリプト式を作成できます。 たとえば、スクリプティングを使って次のことができます。

この項では、スクリプトティングの使用時に利用できる技術や機能について説明します。

メモ:ワークフローの式を定義するには、ワークフローアクティビティの設定方法について理解しておく必要があります。また、ワークフロー内で使用できるさまざまなデータタイプについても知っておく必要があります。 ワークフローアクティビティの詳細については、セクション 8.0, ワークフローアクティビティの参照を参照してください。ワークフロー内で使用可能なシステム変数については、セクション 4.3.3, ワークフローデータについての理解を参照してください。

10.1.1 ECMAScriptについて

ECMAScriptは、ホスト環境(この場合はDesigner)でオブジェクトの操作に使用するオブジェクト指向のスクリプト言語です。ECMAScript (ECMA-262とISO/IEC 16262)は、JavaScript (Netscape*)とJScript* (Microsoft*)の基盤になる標準ベースのスクリプト言語です。 ECMAScriptは、Designerのグラフィカルユーザインタフェースのような、ホスト環境の既存の機能を補ったり拡張したりするために使用します。ホスト環境であるDesignerは、ECMAScriptに処理のため、さまざまなオブジェクトへのアクセスを提供します。 ECMAScriptは、それらのオブジェクトを操作するJavaによく似た言語を提供します。

ECMAScriptは、拡張性に富み、正規表現などの強力な文字列処理ツールを備えています。このため、Designerの機能を拡張する理想的な言語として利用できます。

メモ:ECMAScriptの詳細については、欧州コンピュータ製造工業会(ECMA)のWebサイトを参照してください。

10.1.2 ECMAScriptの機能

スクリプティングを利用すると、細かく調整されたカスタムロジックをワークフローに組み込むことができるだけでなく、データ操作の柔軟性も大幅に向上します。これは、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に使用し、ドキュメント構造内のさまざまな要素を処理できます。

10.1.3 ECMA式ビルダの使用

Designerでは、ユーザアプリケーションデザインツールのさまざまな場所からECMAScriptにアクセスできます。最も一般的なアクセスフォームは、式ビルダからのアクセスです。次のボタンが表示されていれば、いつでも式ビルダを表示できます。

このボタンは、条件アクティビティの[プロパティ]画面や、エンタイトルメントプロビジョニングアクティビティの[データ項目マッピング]ビューなどのDesignerのディスプレイにあります。このボタンをクリックすると、ECMA式ビルダが表示されます。

図 10-1 ECMA式ビルダ

ECMA式ビルダのトップペインには、使用可能なオブジェクト、メソッド、およびプロパティの選択リストがあります(すべてサイズ変更可能)。項目をロールオーバーすると、ECMAScriptステートメントの作成に役立つツールヒントが表示されます。選択リスト内の任意の項目をダブルクリックすると、ウィンドウ下部の編集ペインに、対応するECMAScriptステートメントが表示されます。図では、[ECMAScript変数]ペインで[プロセス]選択リストが選択され、[名前]変数がダブルクリックされています。このワークフロー変数のコンテンツにアクセスできるECMAScript式が、編集ペインに自動的に挿入されます。

この項では、次のトピックについて説明します。

構文のチェック

ECMA式ビルダには、[シンタックスのチェック]ボタンがあります。 このボタンをクリックすると、ECMAScriptインタープリタにより、式の構文がチェックされます。ECMAScriptの構文に問題が見つかった場合は、エラーメッセージが表示されます。 その場合は式を編集し、必要に応じて再検証することができます。検証はオプションです。

メモ:構文のチェック時には、式は実行されません。構文がチェックされるだけです。ECMAScriptはインタープリタ言語なので、構文のチェック時には、ランタイムに依存する式はチェックされません。これらの式が有効なECMAScript構文に準拠しているかどうかが確認されるだけです。

DNの選択

ECMA式ビルダには、[識別ボールト]ボタンもあります。このボタンは、識別ボールトからDNを選択する必要があるアクティビティ(開始アクティビティ、承認アクティビティ、エンタイトルメントアクティビティなど)の操作中に表示されます。

図 10-2 [識別ボールト]ボタン

[識別ボールト]ボタンをクリックすると、識別ボールトをナビゲートしてDNを選択するためのダイアログボックスが表示されます。識別ボールトに接続していない場合は、識別ボールトを使用できないことを示すため、[識別ボールト]ボタンがかすんだ表示になります。

ECMAScript変数

このペインには、現在のコンテキストに関連する変数の名前が表示されます。たとえば、プロビジョニング要求定義エディタを使用している場合、現在のワークフロープロセスのシステム変数、現在のアクティビティのシステム変数、および現在のワークフローで作成されたフローデータ変数が表示されます。変数名をダブルクリックすると、その変数がスクリプトに挿入されます。ワークフローで使用できるシステム変数については、セクション 4.3.3, ワークフローデータについての理解を参照してください。

ECMA式ビルダでは、次の2つのメソッドを使ってフローデータ変数を読み取ることができます。

表 10-1 フローデータ変数を読み取るメソッド

メソッド

説明

flowdata.get(variable-name)

ワークフロードキュメント内の変数(XPath式表示)のノード値として文字列を返します。

flowdata.getObject(variable-name)

ワークフロードキュメント内の変数(XPath式表示)のノード値としてオブジェクトを返します。このメソッドを使って複数値コントロールの値を取得できます。

関数/メソッド

ECMA式ビルダで使用できる関数とメソッドの説明は、セクション 10.3, ECMAScript APIを参照してください。

ECMAScript演算子

次の表では、ECMA式ビルダで使用できる演算子について説明します。

表 10-2 Math

演算子

説明

+ 加算

2つの数値(リテラルまたは変数)の和を返します。

- 減算

一方の数からもう一方の数を差し引きます。

* 乗算

2つの数値(リテラルまたは変数)の積を返します。

/ 除算

一方の数をもう一方の数で割ります。

表 10-3 割り当て

演算子

説明

= 割り当て

右辺のオペランドの値を左辺のオペランドに割り当てます。

+= これに足す

左辺のオペランドと右辺のオペランドを足し合わせた結果を左辺のオペランドに割り当てます。たとえば「a += b」は「a = a + b」と同じことです。

-= これから引く

左辺のオペランドから右辺のオペランドを差し引いた結果を左辺のオペランドに割り当てます。たとえば「a -= b」は「a = a - b」と同じことです。

*= これに掛ける

2つのオペランドを掛け合わせた結果を左辺のオペランドに割り当てます。たとえば「a *= b」は「a = a * b」と同じことです。

/= これを割る

左辺のオペランドを右辺のオペランドで割った結果を左辺のオペランドに割り当てます。たとえば「a /= b」は「a = a / b」と同じことです。

%= モジュラス

左辺のオペランドを右辺のオペランドで割った余りを左辺のオペランドに割り当てます。たとえば「a %= b」は「a = a % b」と同じことです。

&= Bitwise ANDをこれに適用する

オペランドのBitwise ANDを実行し、結果を左辺のオペランドに割り当てます。たとえば「a &= b」は「a = a & b」と同じことです。

|= Bitwise ORをこれに適用する

オペランドのBitwise ORを実行し、結果を左辺のオペランドに割り当てます。たとえば「a |= b」は「a = a | b」と同じことです。

<<= Bitwise左シフトをこれに適用する

オペランドのBitwise左シフトを実行し、結果を左辺のオペランドに割り当てます。たとえば「a <<= b」は「a = a << b」と同じことです。

>>= Bitwise記号付き右シフトをこれに適用する

オペランドのBitwise右シフトを実行し、結果を左辺のオペランドに割り当てます。たとえば「a >>= b」は「a = a >> b」と同じことです。

>>>= Bitwise記号なし右シフトをこれに適用する

オペランドのBitwise記号なし右シフトを実行し、結果を左辺のオペランドに割り当てます。たとえば「a >>>= b」は「a = a> >> b」と同じことです。

表 10-4 その他

演算子

説明

% モジュラス

左辺のオペランドを右辺のオペランドで割った余りの整数を返します。

++ 自動増分

オペランドを1増分します(オペランドの前後で使用可能)。

-- 自動減分

オペランドを1減分します(オペランドの前後で使用可能)。

~ Bitwise NOT

オペランドのビットを反転させます。

& Bitwise AND

両方のオペランドの対応ビットが1であるとき、各ビット位置に1を返します。

| Bitwise OR

少なくとも一方のオペランドの対応ビットが1であるとき、各ビット位置に1を返します。

^ Bitwise XOR

どちらか一方だけのオペランドの対応ビットが1であるとき、各ビット位置に1を返します。

<< Bitwise左シフト

第1オペランドのバイナリ表現の数字を、第2オペランドで指定された桁数だけ左にシフトします。このとき、空になった右端の下位ビット位置には0が入り、左端の上位ビットは破棄されます。

>> 記号付きBitwise右シフト

第1オペランドのバイナリ表現の数字を、第2オペランドで指定された桁数だけ右にシフトし、右端の下位ビットは破棄されます。空になった左端には、最上位(左端)ビットがコピーされ、元の符号を保持します。

>>> 記号なしBitwise右シフト

第1オペランドのバイナリ表現の数字を、第2オペランドで指定された桁数だけ右にシフトします。右端の下位ビットは破棄され、空になった左端の上位ビットには0が入ります。

表 10-5 リレーショナル

演算子

説明

== 等しい

右辺のオペランドの値を左辺のオペランドに割り当てます。

!= 等しくない

両辺のオペランドが等しくない場合にブール値のtrueを返します。

< より小さい

左辺のオペランドが右辺のオペランドより小さい場合にtrueを返します。

> より大きい

左辺のオペランドが右辺のオペランドより大きい場合にtrueを返します。

<= より小さいか等しい

左辺のオペランドが右辺のオペランドより小さいか右辺のオペランドと等しい場合にtrueを返します。

>= より大きいか等しい

左辺のオペランドが右辺のオペランドより大きいか右辺のオペランドと等しい場合にtrueを返します。

表 10-6 論理演算

演算子

説明

&& AND

両辺のオペランドがtrueの場合はブール値のtrue、そうでない場合はfalseを返します。

|| OR

どちらかのオペランドがtrueの場合はtrueを返します。両辺のオペランドがfalseの場合はfalseを返します。

! NOT

一方のオペランドをtrueに変換できる場合(またはこれがブール値でない場合)はfalseを返します。オペランドをfalseに変換できる場合はtrueを返します。

表 10-7 文字列

演算子

説明

+ 連結

2つの文字列オペランドを連結し、その和集合になる文字列を返します。

VDX Expr

このペインでは、識別ボールトに定義されているエンティティ定義(セクション 3.2, エンティティおよび属性の操作を参照)を、スクリプトに挿入することができます。システムエンティティ、ユーザ定義エンティティの両方を使用できます。識別ボールトからデータを取得する式のフォーマットは、次のとおりです。

IDVault.get(dn, object-type, attribute)

たとえば、データ項目の受信者のマネージャ情報を取得したい場合、VDX Exprパネルの[ユーザ]ノードを展開し、[マネージャ]項目をダブルクリックします。すると、IDVault.get({ここにDN式を入力}, 'user', 'manager')という式が挿入されます。この式は、マネージャのDN (LDAP識別名)の文字列を評価します。

特殊文字の使用

ECMA式ビルダでは、エスケープシーケンスを使って、リテラル文字列で特殊文字を使用できます。エスケープシーケンスはバックスラッシュ文字(\)で開始します。 次の表に、よく使用するエスケープシーケンスを示します。

表 10-8 エスケープシーケンス

エスケープシーケンス

文字

\b

バックスペース

\f

フォームフィード

\n

復帰改行

\r

キャリッジリターン

\t

水平タブ

\”

二重引用符

\\

円記号(\)

\’

アポストロフィ

\uとそのすぐ後に続く4桁の16進数を使って、ユニコード文字を指定することもできます。次に例を示します。

表 10-9 ユニコード文字のエスケープシーケンス

エスケープシーケンス

文字

\u00A3

ポンド記号(£)

\u20AC

ユーロ記号(€)

10.1.4 Javaの統合について

Javaは、外部Javaオブジェクトへのブリッジを提供するECMA式ビルダを通して、ワークフロープロセスに統合されています。ECMA式ビルダからJavaクラスにアクセスするには、ワークフローエンジンのクラスパスにクラスを配置する必要があります。このためには、ユーザアプリケーションWARファイル(IDM.war)内のWEB-INF\libディレクトリにJavaクラスを追加します。

メモ:フォームアクションスクリプトは、プロビジョニング要求定義エディタのその他の部分で使用できるECMAScriptとは異なり、サーバ上ではなくブラウザ上で実行されます。フォームアクションスクリプトからのディレクトリアクセスはすべて、ブラウザからサーバへのAJAX呼び出しを通して処理されます。詳細については、セクション 10.3.1, フォームアクションスクリプトメソッドを参照してください。

ユーザアプリケーションWARへのJavaクラスの追加

  1. WARファイルユーティリティを使ってIDM.warファイルを開きます。IDM.warファイルは、アプリケーションサーバの\server\IDM\deployディレクトリ内にあります。

  2. WEB-INF\libディレクトリにJavaクラスをコピーします。

ECMAScriptからの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★」を参照してください。

10.1.5 XPathの統合について

この項では、次のトピックについて説明します。

ワークフロー内のXPath

プロビジョニング要求定義ワークフローは、フローデータという特殊なオブジェクトをサポートします(セクション 4.3.3, ワークフローデータについての理解を参照)。 フローデータオブジェクトは、DOMの一種です。つまり、メモリ内のオブジェクトとして作成されたXMLドキュメントです。XPath構文を使って、フローデータDOMの構造をナビゲートしたり、要素やコンテンツを追加、変更、または削除したりできます。

フローデータへのオブジェクトの追加

構文

flowdata.parent/child[1]
flowdata.reason

フローデータからのオブジェクトの取得

構文

flowdata.getObject('parent/child[1]')
flowdata.get('reason')

flowdata.get()メソッドとflowdata.getObject()メソッドについては、表 10-1を参照してください。

統合アクティビティのXPath

ECMAScriptインタープリタは、統合アクティビティ内のカスタムメソッドXPath()を認識します。このメソッドでは、次のような式を作成できます。

Input.XPath("GetBNQuoteSoapIn/GetBNQuote/sISBN")

ECMA式ビルダで、選択リストからノードを選択すると、このような式が自動的に作成されます。

統合アクティビティでは、W3Cで採用されているXPathアドレス指定構文を使用します。XPath構文は、URIアドレス指定構文と似ていますが、XMLのアドレス指定や操作に役立つ高度な機能を多数備えています。次の表に、よく使用する構文規則をいくつか紹介します。

表 10-10 XPath構文

XPath構文

説明

/

スラッシュ1個は、要素の絶対パスを表します。たとえば、/ABCと指定すると、ルート要素ABCが選択されます。

//

2重のスラッシュは、条件を満たすパス内のすべての要素を表します。たとえば、//ABCと指定すると、すべてのABCのオカレンスが選択されます。 //ABC//DEFと指定すると、ABCの子であるすべてのDEF要素が選択されます。

*

アスタリスクを指定すると、先行するパス内のすべての要素が選択されます。たとえば、*ABC/DEFと指定すると、要素ABC/DEFで囲まれたすべての要素が選択されます。//*と指定すると、すべての要素が選択されます。

[ ]

角括弧は、特定の要素を指定するときに使用します。たとえば、/ABC[3]と指定すると、ABC内の3番目の要素が選択されます。 つまり、角括弧は、SQLステートメントのWhere句に類似したフィルタとして使用できます。//ABC[“Table”]と指定すると、「Table」というコンテンツを持つすべての要素が選択されます。

@

アットマークは、指定された属性を持つ要素を選択するときに使用します。たとえば、/ABC@nameと指定すると、ABC内の「name」という属性を持つすべての要素が選択されます。

|

縦棒は、複数のパスを指定するときに使用します。たとえば、//ACB|//DEFと指定すると、ACB内のすべての要素とDEF内のすべての要素が選択されます。

$

ドル記号は、現在のドキュメントの他に参照するドキュメントがある場合に使用します。INVOICEBATCH/INVOICE[SELLER/NAME= $PROJECT/USERCONFIG/COMPANYNAME]

関数()

XPathには、XPathアドレスに追加できる多数の関数が用意されています。たとえば、//*[count(*)=2]と指定すると、子を2つ持つすべての要素が選択されます。

数値演算子()

XPathには、XPathアドレスに追加できる多数の数値演算子が用意されています。たとえば、/ABC|position() mod 2 = 0]と指定すると、ABC内のすべての偶数要素が選択されます。

使用できるすべての演算子については、W3推奨のXML Path Language (XPath)を参照してください。

10.1.6 パフォーマンスについて

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言語について詳しく学ぶことをお勧めします。そのことが、パフォーマンスのボトルネックの解決に役立ちます。