クラス・プロジェクションの定義
ここでは、クラスをコンパイルまたは削除したときの動作をカスタマイズする手段を提供するクラス・プロジェクションについて説明します。
概要
クラス・プロジェクションは、クラスをコンパイルまたは削除したときの動作をカスタマイズする手段を提供します。クラス・プロジェクションは、クラス定義をプロジェクション・クラスと関連させます。プロジェクション・クラス (%Projection.AbstractProjectionOpens in a new tab クラスから派生) は、InterSystems IRIS® データ・プラットフォームが自動的に追加のコードを生成するために、次の 2 つの時点で使用するメソッドを提供します。
-
クラスがコンパイルされるとき
-
クラスが削除されるとき
このメカニズムは、Java プロジェクション (プロジェクションの語源) によって、クラスがコンパイルされるときは常に、必要なクライアント・バインディング・コードを自動的に生成するために使用されます。
クラスにプロジェクションを追加する
クラス定義にプロジェクションを追加するには、クラス定義内の Projection 文を使用します。
class MyApp.Person extends %Persistent
{
Projection JavaClient As %Projection.Java(ROOTDIR="c:\java");
}
この例では、%Projection.JavaOpens in a new tab プロジェクション・クラスを使用する JavaClient というプロジェクションを定義しています。プロジェクション・クラスのメソッドが呼び出されるとき、そのメソッドは ROOTDIR パラメータの値を受け取ります。
クラスには、一意に名付けられた複数のプロジェクションを含めることができます。複数のプロジェクションの場合、各プロジェクション・クラスのメソッドは、クラスがコンパイルされるとき、または削除されるときに呼び出されます。複数のプロジェクションが処理される順序は、未定義です。
InterSystems IRIS には、以下のプロジェクション・クラスが用意されています。
クラス | 説明 |
---|---|
%Projection.JavaOpens in a new tab | Java からのクラスへのアクセスを可能にする、Java クライアント・クラスを生成します。 |
%Projection.Monitor | このクラスを、ログ・モニタで使用するルーチンとして登録します。メタデータが Monitor.Application、Monitor.Alert、Monitor.Item、および Monitor.ItemGroup に書き込まれます。Monitor.Sample という新規の永続クラスが作成されます。 |
%Projection.MVOpens in a new tab | MV からクラスへのアクセスを可能にする MV クラスを生成します。 |
%Projection.StudioDocumentOpens in a new tab | このクラスをスタジオで使用するルーチンとして登録します。 |
%Studio.Extension.ProjectionOpens in a new tab | XData メニュー・ブロックをメニュー・テーブルに投影します。 |
また、独自のプロジェクション・クラスを生成し、組み込みのプロジェクション・クラスと同様に使用することもできます。
新規プロジェクション・クラスの作成
新規のプロジェクション・クラスを作成するには、%Projection.AbstractProjectionOpens in a new tab クラスのサブクラスを作成し、プロジェクション・インタフェース・メソッドを実装して (サブセクションを参照)、必要なクラス・パラメータを定義します。例えば、以下のようになります。
Class MyApp.MyProjection Extends %Projection.AbstractProjection
{
Parameter MYPARAM;
/// This method is invoked when a class is compiled
ClassMethod CreateProjection(cls As %String, ByRef params) As %Status
{
// code here...
QUIT $$$OK
}
/// This method is invoked when a class is 'uncompiled'
ClassMethod RemoveProjection(cls As %String, ByRef params, recompile as %Boolean) As %Status
{
// code here...
QUIT $$$OK
}
}
プロジェクション・インタフェース
すべてのプロジェクション・クラスは、クラスのライフ・サイクル中に発生する特定のイベントに応じて呼び出される一連のメソッド、プロジェクション・インタフェースを実装します。このインタフェースは、以下のメソッドで構成されています。
CreateProjection() メソッドは、クラス定義のコンパイルが完了した後に、クラス・コンパイラによって呼び出されるクラス・メソッドです。このメソッドは、プロジェクション用に定義されたパラメータ値 (パラメータ名によって添え字にされている) を含む配列と同様、コンパイルされたクラスの名前を渡されます。
RemoveProjection() メソッドは、以下のいずれかの場合に呼び出されるクラス・メソッドです。
-
クラス定義が削除されたとき
-
クラスのリコンパイルの開始時
このメソッドは、削除されるクラスの名前、プロジェクション用に定義されたパラメータ値を含む配列 (パラメータ名によって添え字にされている)、メソッドがリコンパイルの一部として呼び出されているかを示す、またはクラス定義が削除されていることを示すフラグを渡されます。
プロジェクションを含むクラス定義がコンパイルされるとき、以下のイベントが発生します。
-
クラスが以前にコンパイルされている場合、新規のコンパイルが開始される前に、そのクラスはアンコンパイルされます (つまり、以前のコンパイルのすべての結果は削除されます)。ここで、コンパイラはリコンパイルが発生することを示したフラグ付きで、すべてのプロジェクションに対して RemoveProjection() メソッドを呼び出します。
この時点でクラスは存在しないので、RemoveProjection() メソッド内部から関連するクラスのメソッドを呼び出すことができないことに注意してください。
また、以前に (プロジェクションなしで) コンパイルされたクラスに対する新規のプロジェクション定義を追加する場合、CreateProjection() メソッドが今までに呼び出されたことがなくても、コンパイラは次のコンパイル時に RemoveProjection() メソッドを呼び出します。このメソッドを実装するときは、この可能性に備えて計画するようにしてください。
-
クラスが完全にコンパイルされた後 (つまり、使用準備ができたということ)、コンパイラはすべてのプロジェクションに対して CreateProjection() メソッドを呼び出します。
クラス定義が削除されたとき、すべてのプロジェクションに対して、RemoveProjection() メソッドが削除フラグを付けて呼び出されます。