Process.Pluginインタフェースを使用したフロー定義

スポンサーリンク

はじめに

結論から言うと、このProcess.Pluginインタフェースを使用したフロー定義は実用的ではありません。
なぜなら、先日紹介した@InvocableMethodアノテーションを使用したフロー定義の方が上位互換にあたり、わざわざProcess.Pluginインタフェースを使用する必要がないからです。

Apexクラスからフロー定義をする方法として、テストには一応出題されるみたいなので、
知識として押さえておきましょう。

Apexクラス作成

上記を念頭に入れて、フローで取り込み可能なApexクラスをProcess.Pluginインタフェースを使用して作ります。

作り方は、Process.Pluginインタフェースをimplementsに宣言します。
Process.Pluginインタフェースはdescribeメソッドとinvokeメソッドを要します。

このようなApexクラスを作成
AccountFlowMethod.cls

global class AccountFlowMethod implements Process.Plugin {
    // フローの説明文を記述する
    global Process.PluginDescribeResult describe() {
        Process.PluginDescribeResult result = new Process.PluginDescribeResult();
        result.Name = '取引先作成処理';
        result.Tag = 'customFlow';

        // 引数の説明
        List<Process.PluginDescribeResult.InputParameter> inputParams = new         List<Process.PluginDescribeResult.InputParameter>();
        inputParams.add(new Process.PluginDescribeResult.InputParameter('accountName',
Process.PluginDescribeResult.ParameterType.STRING, true));
        inputParams.add(new Process.PluginDescribeResult.InputParameter('numberOfEmployees',
Process.PluginDescribeResult.ParameterType.Decimal, false));
        result.inputParameters = inputParams;

        // 戻り値の説明
        List<Process.PluginDescribeResult.OutputParameter> outputParams = new List<Process.PluginDescribeResult.OutputParameter>();
        outputParams.add(
            new Process.PluginDescribeResult.OutputParameter('ID',    Process.PluginDescribeResult.ParameterType.STRING)
        );
        result.outputParameters = outputParams;
        return result;
    }

        // フロー内の処理
        global Process.PluginResult invoke(Process.PluginRequest request) {
        // Process.PluginRequestから値を取得
        String accountName = (String) request.inputParameters.get('accountName');
        Decimal numberOfEmployees = (Decimal)request.inputParameters.get('numberOfEmployees');

        // ここにフロー処理を入れる
        Account a = new Account();
        a.Name = accountName;
        a.NumberOfEmployees = (Integer)numberOfEmployees;
        insert a;

        // フローに戻り値を返却
        Map<String,Object> outputResult = new Map<String,Object>();
        outputResult.put('ID', a.Id);
        Process.PluginResult result = new Process.PluginResult(outputResult);
        return result;
    }
}

describeメソッド

describeメソッドは、名前やフローの説明文について定義します。

PluginDescribeResultクラスに色々な説明文が定義されていますが、何がどうなるかは実際に表示されるフローを見た方が早いでしょう(後述にキャプチャあり)。

引数

なし

戻り値

Process.PluginDescribeResult クラス。
定義した説明文はフロー上に表示されます。

invokeメソッド

invokeメソッドでフローの実処理を入れます。

引数

Process.PluginRequestクラス。
入力パラメータを渡すことができるが、扱えるデータ型は限られている。
複数渡すことができ、フロー内の変数と対応させる。

戻り値

Process.PluginDescribeResult クラス。
出力パラメータ。
複数渡すことができ、フロー内の変数と対応させる。

引数、戻り値ともに扱えるデータ型は限られており、フローでも使用できるデータ側でないと
使用できないみたいです、ということでそれがその対応表。

フローデータ型
Number Decimal
Date datetime/date
DateTime datetime/date
Boolean Boolean および numeric (値が 1 または 0 のみ)
text String

フローに取り込み動かしてみる

では、実際にフローに取り込んでみます。

まず、フローを開くと、取引先作成処理というプラグインが作成されていることがわかります。

フローからApexで定義したプラグインが使用可能に

説明文もこの通り、describeメソッドで定義した内容になっています。

今回は、取引先名と従業員数をフロー内で画面入力し、Insertする簡単な処理を作成。
作成したプラグインをフローに取り込む

Apexクラスに渡す時はフローの変数との対応づけをします。
プラグインへの引数の設定

プラグインからの戻り値の設定

そして実行(今回はデバッグで確認)。
フローのプラグイン動作をデバッグ確認

この通り作成もされています。

プラグインを取り込んだフローの実行結果

なぜProcess.Pluginインタフェースを推奨しないのか

冒頭で説明した、実用的ではない理由。

Apex開発者ガイドにもこう記載されています。

インターフェースは、Blob、Collection、sObject、および Time データ型と一括操作をサポートしていません。インターフェースをクラスに実装すると、クラスはフローからしか参照できません。
アノテーションは、すべてのデータ型と一括操作をサポートしています。アノテーションをクラスに実装すると、クラスはフロー、プロセス、および Custom Invocable Actions REST API エンドポイントから参照できます。

単純に使える範囲が広く、インターフェースのみで使える機能もないことから、@InvocableMethodアノテーションが推奨されるのです。

結構いろんなクラスを覚えた割には、なんだか虚しい結果…

まとめ

  • フロー定義には@InvocableMethodアノテーション推奨
  • 扱えるデータ型が限定される
  • Process.Pluginインタフェースで定義したクラスはフローでしか使用できない

コメント