はじめに
結論から言うと、この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 |
フローに取り込み動かしてみる
では、実際にフローに取り込んでみます。
まず、フローを開くと、取引先作成処理というプラグインが作成されていることがわかります。
説明文もこの通り、describeメソッドで定義した内容になっています。
今回は、取引先名と従業員数をフロー内で画面入力し、Insertする簡単な処理を作成。
Apexクラスに渡す時はフローの変数との対応づけをします。
そして実行(今回はデバッグで確認)。
この通り作成もされています。
なぜProcess.Pluginインタフェースを推奨しないのか
冒頭で説明した、実用的ではない理由。
Apex開発者ガイドにもこう記載されています。
アノテーションは、すべてのデータ型と一括操作をサポートしています。アノテーションをクラスに実装すると、クラスはフロー、プロセス、および Custom Invocable Actions REST API エンドポイントから参照できます。
単純に使える範囲が広く、インターフェースのみで使える機能もないことから、@InvocableMethodアノテーションが推奨されるのです。
結構いろんなクラスを覚えた割には、なんだか虚しい結果…
まとめ
- フロー定義には@InvocableMethodアノテーション推奨
- 扱えるデータ型が限定される
- Process.Pluginインタフェースで定義したクラスはフローでしか使用できない
コメント