InstallHandler インターフェース
管理パッケージのインストールまたはアップグレード後にカスタムコードを実行できます。
名前空間
使用方法
ア��リケーション開発者は、このインターフェースを実装して、登録者が管理パッケージをインストールまたはアップグレードした後に自動的に実行される Apex コードを指定できます。これにより、登録者の組織の詳細に基づいてパッケージのインストールまたはアップグレードをカスタマイズできます。たとえば、スクリプトを使用して、カスタム設定の入力、サンプルデータの作成、インストーラへのメール送信、外部システムへの通知、または大きなデータセットに新しい項目を入力するための一括処理操作の起動などができます。
インストール後スクリプトは、テストを実行した後に呼び出され、デフォルトのガバナ制限が適用されます。パッケージを示す特殊なシステムユーザとして実行するため、スクリプトによって実行されるすべての操作は、パッケージによって行われているように見えます。このユーザには、UserInfo を使用してアクセスできます。このユーザは実行時にのみ確認でき、テストの実行中には確認できません。
スクリプトが失敗すると、インストール/アップグレードは中止されます。スクリプト内のエラーは、パッケージの [Apex エラーを通知] 項目に指定されたユーザにメールされます。ユーザが指定されていない場合、インストール/アップグレードの詳細は利用できません。
インストール後スクリプトには、他に次のような特性があります。
- バッチジョブ、スケジュールされたジョブ、および今後のジョブを開始できます。
- セッション ID にアクセスできません。
- 非同期操作を使用するコールアウトのみを実行できます。コールアウトは、スクリプトが実行され、インストールが完了およびコミットされた後に実行されます。
InstallHandler インターフェースには、onInstall という、インストール/アップグレード時に実行されるアクションを指定する単一のメソッドがあります。
onInstall メソッドは、次の情報を提供するコンテキストオブジェクトを引数として取ります。
- インストールが実施される組織の組織 ID
- インストールを開始したユーザのユーザ ID
- 以前にインストールされたパッケージのバージョン番号 (Version クラスを使用して指定)。これは、1.2.0 のように、常に 3 つの番号で構成されています。
- インストールがアップグレードかどうか
- インストールがプッシュかどうか
コンテキスト引数は、データ型が InstallContext インターフェースであるオブジェクトです。このインターフェースは、システムによって自動的に実装されます。InstallContext インターフェースの次の定義では、コンテキスト引数にコールできるメソッドを示しています。
InstallHandler の実装例
次のインストール後スクリプトのサンプルは、パッケージのインストール/アップグレード時に次のアクションを実行します。
-
以前のバージョンが null である場合、つまりパッケージが初めてインストールされている場合、スクリプトは次を行う
- 「Newco」という新しいアカウントを作成し、作成されたことを検証する。
- 「Client Satisfaction Survey」というカスタムオブジェクト Survey の新しいインスタンスを作成する。
- 登録者に、パッケージのインストールを確認するメールメッセージを送信する。
- 以前のバージョンが 1.0 である場合、「Upgrading from Version 1.0」という Survey の新しいインスタンスを作成する。
- パッケージがアップグレードである場合、「Sample Survey during Upgrade」という Survey の新しいインスタンスを作成する。
- アップグレードがプッシュで実行されている場合、「Sample Survey during Push」という Survey の新しいインスタンスを作成する。
インストール後スクリプトは、Test クラスの新しい testInstall メソッドを使ってテストできます。このメソッドが取る引数は、次のとおりです。
- InstallHandler インターフェースを実装するクラス
- 既存のパッケージのバージョン番号を指定する Version オブジェクト
- インストールがプッシュである場合は true である省略可能な Boolean 値。デフォルトは false です。
このサンプルでは、PostInstallClass Apex クラスに実装されたインストール後スクリプトのテスト方法を説明しています。