グローバル スクリプト

このトピックでは、ClearQuest グローバル スクリプトの概念を説明します。

グローバル スクリプトを使用すると、スキーマ内の任意のフックからの呼び出しが可能な共通関数を定義できます。 グローバル スクリプトは一種のサブルーチン ライブラリです。Rational® ClearQuest® ソフトウェアが グローバル スクリプトを直接呼び出すことはありません。

グローバル スクリプトは、同じフック コードを呼び出す複数のレコード タイプがある場合に役立ちます。 グローバル スクリプトを使用すると、フック コードを集中管理できるため、フック コードをさまざまな位置にコピーする必要がなくなります。 たとえば、Rational ClearQuest の Email パッケージにあるグローバル スクリプトを使用すると、1 つのグローバル スクリプトを呼び出すだけで複数の通知送信アクションを実行できます。

グローバル スクリプトを実行する唯一の方法は、別のスクリプトから呼び出すことです。 ただし、最終的にグローバル スクリプトへの呼び出しは、フィールド フック、アクション フックまたはレコード スクリプトなどの、レコード ベースのフックへの呼び出しにトレース バックする必要があります。 グローバル スクリプトへの呼び出しは、常にレコード ベースのフックまで追跡されるため、 各グローバル スクリプトは、暗黙の entity オブジェクトと共に提供されます。 この entity オブジェクトは、呼び出しが発生したレコード ベースのフックに渡されます。

VBScript と Perl のいずれを使用してもスクリプトを作成できますが、 一方の言語タイプからもう一方の言語タイプを呼び出すことはできません。 グローバル スクリプトを記述する場合は、それを呼び出すスクリプトと同じ言語で記述してください。

グローバル フックでは関数のみを使用してください。なぜなら、 グローバル スクリプトのコードは、関数内のコード以外すべて実行されるためです。

詳細については、「スクリプトの作成」と「スクリプトを使用するための動作状況」を参照してください。

関連スクリプトの例については、「グローバル スクリプト例」を参照してください。

グローバル スクリプトのサブルーチンの使用

Perl では、変数 $entity と $session がグローバル変数で、フックの実行時にアクティブになります。この変数は実行時に定義され、 グローバル スクリプト コード内で使用できます。ただし、グローバル スクリプトのコンテキストの中から、この変数を使って Entity オブジェクト メソッドや Session オブジェクト メソッドを呼び出すことはできません。

グローバル スクリプト コードが この変数を使用してメソッド ($entity->GetSession など) を呼び出すと、 スキーマの確認が失敗します。なぜなら、$session と $entity は 実行時まで定義されないためです。たとえば、次のコードをグローバル サブルーチンの外側で使用すると失敗します。 その理由は、未定義の値 ($session) に対してメソッドを呼び出すことができないからです。
$info = $session->GetProductInfo();
$session 呼び出しをグローバル サブルーチン内に配置しても、 それだけでは十分でありません。たとえば、次のコードもコンパイル時に $productInfo の 解決が試行されるため、同じ理由で失敗します。
$productInfo = GetProductInfo();
   sub GetProductInfo
   {
       return $session->GetProductInfo();
   }

$productInfo などのグローバル変数を使用する代わりに、GetProductInfo() を 呼び出して値を取得します。

Perl フックの実行中は、$session には常に 現行セッションが設定されます。しかし、最適のパフォーマンスを得るには、Session または Entity オブジェクト データに 依存するグローバル変数の定義は避け、代わりにグローバル アクセス機能 (たとえば、GetUserLoginName() など) を 作成して値を取得してください。

グローバル スクリプトのクローン作成

グローバル スクリプトは、ほかのフック (Access Control フック、Initialization フック、Validation フックなど) から呼び出せるサブルーチンの集合体として使用することを前提としています。このため、すべてのグローバル スクリプト コードは、フックの実行のたびに使用される Perl コード部分に含まれます。しかし、グローバル スクリプト コードには サブルーチン スコープの外部にある (ファイル スコープの) ステートメントも含むことができます。

バージョン 7.0.1 以降、 グローバル スクリプトのクローンを作成する新しい Perl フックの機能拡張が使用可能になりました。 この機能拡張を有効にすると、Perl フック環境が作成され、すべての グローバル スクリプト コードのコンパイルとクローン作成が行われ、新しいフック環境が作成されます。 クローン作成プロセスによってコードの再コンパイルの必要がなくなり、フック環境で構文解析ツリーを 共有できるようになります。スクリプトのクローン作成は時間と各 Perl フック環境のメモリの 節約になるので、パフォーマンスの改善につながります (特に、Rational ClearQuest Web で 大きく改善されます)。

スキーマ開発者は、グローバル スクリプトを作成するとき、 クローン作成の使用法を検討する必要があります。 グローバル フックのクローン作成が有効な場合、グローバル スクリプトに含まれるファイル スコープ ステートメントは 1 回 しか実行されません。以降の Perl インタープリタには、その実行結果のクローンが作成されます。 クローン作成が無効の場合は、フック環境が作成されるたびにこのコードが実行されます (レコード アクションごとに 1 度とレコード スクリプトの呼び出しごとに 1 度)。

クローンの グローバル スクリプト内のセットアップ コードが実行されることに関する混乱を避けるため、 ファイル スコープのセットアップ コードはサブルーチンに移動して、特別なスコープを持つ our グローバル変数を 使用してセットアップ状態を確認してください。セットアップ コードが複数回実行されることは避けながら、 各フック環境で必ず 1 度は実行されるようにできます。 このセットアップ サブルーチンは、セットアップを完了する必要があるフックから 呼び出すことができます。例を次に示します。
  our $run_once;
   sub DoSetup
   {
       return if defined($run_once);
       $run_once = 1;
       # do setup here
   }
sub Defect_Initialization {
 DoSetup();
 # …
 # …
 #reset of Defect_Initialization code….
 # …
 }

このサンプル コードでは、フック環境の作成時には $run_once 変数は 定義されていません。クローン作成時も、この変数は未定義の ままです。フックの最初の実行で DoSetup() を呼び出すと、 セットアップ コードが実行されます。

注: Perl グローバル ス クリプトのクローン作成には、コードによって呼び出 される Perl ライブラリがスレッド セーフでなければ なりません。例えば、
use Win32::OLE;
は、クローン作成された フック コードでは使用できません (ただし、アクション フック、フィールド フック、およびレコード フックなどのクローン以外のフック コードでは使用できます)。Win32::OLE はスレッド セーフではありませんが、ClearQuest Web マルチスレッド環境の外側では使用できます。 たとえば、グローバル スクリプト内で
require Win32::OLE; import Win32::OLE;
を使用して、Win32::OLE モジュールのクローンが作成されないようにすることはできますが、このモジュールは、Rational ClearQuest Web との組み合わせで使用するスキーマでは使用できませ ん。

フィードバック