InstallHandler インターフェース
管理パッケージのインストールまたはアップグレード後にカスタムコードを実行できます。
名前空間
使用方法
アプリケーション開発者は、このインターフェースを実装して、登録者が管理パッケージをインストールまたはアップグレードした後に自動的に実行される Apex コードを指定できます。パッケージのインストールやアップグレードは、登録者の組織の詳細に基づいてカスタマイズできます。たとえば、スクリプトを使用して、カスタム設定の入力、サンプルデータの作成、インストーラーへのメール送信、外部システムへの通知、または大きなデータセットに新しい項目を入力するための一括処理操作の起動などができます。
インストール後スクリプトは、テストを実行した後に呼び出され、デフォルトのガバナ制限が適用されます。パッケージを示す特殊なシステムユーザーとして実行するため、スクリプトによって実行されるすべての操作は、パッケージによって行われているように見えます。このユーザーには、UserInfo を使用してアクセスできます。このユーザーは実行時にのみ表示され、テストの実行中には表示されません。
スクリプトが失敗すると、インストールやアップグレードは中止されます。スクリプト内のエラーは、パッケージの [Apex エラーを通知] 項目に指定されたユーザーにメールされます。ユーザーが指定されていない場合、インストールやアップグレードの詳細は利用できません。
インストール後スクリプトには、他に次のような特性があります。
- バッチジョブ、スケジュールされたジョブ、および今後のジョブを開始できます。
- セッション ID にアクセスできません。
- 非同期操作を使用するコールアウトのみを実行できます。コールアウトは、スクリプトが実行され、インストールが完了およびコミットされた後に実行されます。
- パッケージ内の別の Apex クラスで with sharing キーワードが使用されている場合、その Apex クラスをコールできません。このキーワードによってパッケージの正常なインストールが妨げられる可能性があります。詳細は『Apex 開発者ガイド』を参照してください。
InstallHandler インターフェースには、onInstall という、インストールやアップグレード時に実行されるアクションを指定する単一のメソッドがあります。
1public interface InstallHandler {
2 void onInstall(InstallContext context)
3};
onInstall メソッドは、次の情報を提供するコンテキストオブジェクトを引数として取ります。
- インストールが実施される組織の組織 ID。
- インストールを開始したユーザーのユーザー ID。
- 以前にインストールされたパッケージのバージョン番号 (Version クラスを使用して指定)。バージョンは、1.2.0 のように、常に 3 つの番号で構成されています。
- インストールがアップグレードかどうか。
- インストールがプッシュかどうか。
コンテキスト引数は、データ型が InstallContext インターフェースであるオブジェクトです。このインターフェースは、システムによって自動的に実装されます。InstallContext インターフェースの次の定義では、コンテキスト引数にコールできるメソッドを示しています。
1public interface InstallContext {
2 ID organizationId();
3 ID installerId();
4 Boolean isUpgrade();
5 Boolean isPush();
6 Version previousVersion();
7}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 の新しいインスタンスを作成する。
1public class PostInstallClass implements InstallHandler {
2 global void onInstall(InstallContext context) {
3 if(context.previousVersion() == null) {
4 Account a = new Account(name='Newco');
5 insert(a);
6
7 Survey__c obj = new Survey__c(name='Client Satisfaction Survey');
8 insert obj;
9
10 User u = [Select Id, Email from User where Id =:context.installerID()];
11 String toAddress= u.Email;
12 String[] toAddresses = new String[]{toAddress};
13 Messaging.SingleEmailMessage mail =
14 new Messaging.SingleEmailMessage();
15 mail.setToAddresses(toAddresses);
16 mail.setReplyTo('support@package.dev');
17 mail.setSenderDisplayName('My Package Support');
18 mail.setSubject('Package install successful');
19 mail.setPlainTextBody('Thanks for installing the package.');
20 Messaging.sendEmail(new Messaging.Email[] { mail });
21 }
22 else
23 if(context.previousVersion().compareTo(new Version(1,0)) == 0) {
24 Survey__c obj = new Survey__c(name='Upgrading from Version 1.0');
25 insert(obj);
26 }
27 if(context.isUpgrade()) {
28 Survey__c obj = new Survey__c(name='Sample Survey during Upgrade');
29 insert obj;
30 }
31 if(context.isPush()) {
32 Survey__c obj = new Survey__c(name='Sample Survey during Push');
33 insert obj;
34 }
35 }
36 }インストール後スクリプトは、Test クラスの新しい testInstall メソッドを使ってテストできます。このメソッドが取る引数は、次のとおりです。
- InstallHandler インターフェースを実装するクラス。
- 既存のパッケージのバージョン番号を指定する Version オブジェクト。
- インストールがプッシュである場合は true である省略可能な Boolean 値。デフォルトは、false です。
このサンプルでは、PostInstallClass Apex クラスに実装されたインストール後スクリプトのテスト方法を説明しています。
1@isTest
2static void testInstallScript() {
3 PostInstallClass postinstall = new PostInstallClass();
4 Test.testInstall(postinstall, null);
5 Test.testInstall(postinstall, new Version(1,0), true);
6 List<Account> a = [Select id, name from Account where name ='Newco'];
7 System.assertEquals(1, a.size(), 'Account not found');
8 }