実行コンテキスト判定について

#1.実行コンテキストとは?([Trailheadの説明](https://trailhead.salesforce.com/ja/content/learn/modules/apex_basics_dotnet/execution_context))
ASP.NET アプリケーションの場合、コードはアプリケーションドメインのコンテキストで実行されます。Force.com 環境では、コードは実行コンテキスト内で実行されます。端的に言うと、このコンテキストはコードが実行されてから終了するまでの時間を表します。重要なのは、作成する Apex コード以外のコードが実行される可能性があると理解しておくことです。

このしくみを理解するには、プラットフォームで Apex コードを実行できる方法をすべて知っておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/a258e965-622e-4085-4cd3-6d81270b56da.png)
#2.実装例（ApexContextUtil）
```java

public class ExecutionContextMetaData {
    public Boolean isLightning			{get; private set;}
    public Boolean isLightningConsole	{get; private set;}
    public Boolean isSalesforce1		{get; private set;}
    public Boolean isVisualforce		{get; private set;}
    public Boolean isTrigger			{get; private set;}
    public Boolean isTest				{get; private set;}
    public Boolean isFuture				{get; private set;}
    public Boolean isQueueable			{get; private set;}
    public Boolean isBatch				{get; private set;}
    public Boolean isScheduled			{get; private set;}
    public Boolean isApexRest			{get; private set;}

    public ExecutionContextMetaData() {
        this.isLightning        = UserInfo.getUiThemeDisplayed() == 'Theme4d';
        this.isLightningConsole = UserInfo.getUiThemeDisplayed() == 'Theme4u';
        this.isSalesforce1      = UserInfo.getUiThemeDisplayed() == 'Theme4t';
        this.isVisualforce      = ApexPages.currentPage() != null;
        this.isTrigger          = Trigger.isExecuting;
        this.isTest             = Test.isRunningTest();
        this.isFuture           = System.isFuture();
        this.isQueueable        = System.isQueueable();
        this.isBatch            = System.isBatch();
        this.isScheduled        = System.isScheduled();
        this.isApexRest         = RestContext.request != null;
    }
}
```
#3.関連のメソッド概要
##[UserInfo.getUiThemeDisplayed()](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_userinfo.htm)
現在のユーザに表示されるテーマを返します。

- Theme1 — 古い Salesforce テーマ
- Theme2 — Salesforce Classic 2005 ユーザインターフェースのテーマ
- Theme3 — Salesforce Classic 2010 ユーザインターフェースのテーマ
- Theme4d — 最新の「Lightning Experience」Salesforce のテーマ
- Theme4t — Salesforce モバイルアプリケーションのテーマ
- Theme4u — Lightning コンソールのテーマ
- PortalDefault — Salesforce カスタマーポータルのテーマ
- Webstore — Salesforce AppExchange のテーマ

##[ApexPages.currentPage()](https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/apex_System_ApexPages_currentPage.htm)
現在のページの PageReference を返します。

##[Trigger.isExecuting](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_triggers_context_variables.htm)
Apex コードの現在のコンテキストがトリガである場合、true を返します。

##[Test.isRunningTest](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_test.htm)
テストクラスからコールされた場合、true を返します。その他の場合は、false を返します。

##[System.isFuture()](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_system.htm)
[@future](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_annotation_future.htm) メソッドから呼び出された場合は true を返します。その他の場合は、false を返します。

##[System.isQueueable()](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_system.htm)
Queueableクラスから呼び出した場合は true を返します。その他の場合は、false を返します。

##[System.isBatch()](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_system.htm)
Apex 一括処理ジョブが実行中のコードを呼び出した場合は true、呼び出していない場合は false を返します。API バージョン 35.0 以前では、キュー可能 Apex ジョブがコードを呼び出した場合も true を返します。

##[System.isScheduled()](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_system.htm)
現在実行中のコードが Apex のスケジュール済みジョブから呼び出された場合は true を返します。呼び出されていない場合は false を返します。

##[RestContext.request](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_restcontext.htm)
System.RestContext クラスを使用して、Apex REST メソッドの RestRequest オブジェクトと RestResponse オブジェクトにアクセスします。