皆様こんにちは。株式会社ROBOT PAYMENT システム課で、請求管理ロボ for Salesforce の開発チームに所属している木村です。
今回は、SalesforceのMetadataComponentDependencyオブジェクトを利用して、ApexClass同士の参照関係がわかるクラス図を作成してみましたのでご紹介したいと思います。
Saesforceではオブジェクト間のER図は、Salesforce DevToolsなどのツールを利用すればサクッと生成可能です。しかし、クラス図の作成にあたっては組織のメタデータ参照を上手くしながら自力で作成するしかないと認識しております。
背景
もともと外部に開発を委託していた請求管理ロボ for Salesforce の内製化にあたり、我々の管理パッケージソースコードの仕様詳細を把握する活動や、仕様変更や追加要望による修正に伴う影響範囲をもれなく確認する時には、タイムリーにその時の組織の状態を把握し簡単に図示できれば便利だと考えます。さらに、チームへの新規参画者など仕様把握を必要とする人への情報共有にも利用できると考えています。
MetadataComponentDependencyAPIとは?
組織のメタデータ間の依存関係を取得できるAPIになります。(参考)
これは、組織のApexCodeの取得が可能な開発者向けのTooling Apiで、SOQLを利用したメタデータへのアクセスを可能にします。 なお、当Tooling APIの利用にあたっては、『1 つのクエリで指定できるレコードは 2000 件まで』の制限事項に注意が必要です。そのため、取得するメタデータ数の超過が懸念される場合、MetadataComponentId項目や、MetadataComponentType項目にてクラス図として作成したいメタデータのみ取得するようにしたいです。(取得項目は、こちら参考)。
注意事項としては、MetadataComponentNameと RefMetadataComponentNameの項目を指定できません。そのため、特定のApexClassのみ取得したい場合には、先ずMetadataComponentTypeでApexClassを条件に取得します。その後、取得結果から該当のApexClass名をソートしてRefMetadataComponentIdもしくは、MetadataComponentIdを確認する手順が必要になります。
また、当API内部でのSOQLの使用においては以下の制限事項もあります。
(調べたいApexClass名をWHERE句で指定できると便利なのですが、、、)
- ORDER BY は使用不可
- SELECT count() は使用不可
- queryMore() は使用不可
- OFFSET句は使用不可
- WHERE句で=, !=, AND, OR以外は使用不可
- WHERE句でMetadataComponentName項目は指定不可
- WHERE句で RefMetadataComponentName項目は指定不可
- WHERE句でRefMetadataComponentType項目の ‘StandardEntity’は指定不可
- WHERE句でMetadataComponentType項目でLIKEは使用不可
- WHERE句でRefMetadataComponentType項目でLIKEは使用不可
ということで使ってみた。
今回はPostmanでMetadataComponentDependencyAPIを実行します。
対象のApexClassのRefMetadataComponentIdがわかっているため、Idにてソートをしました。
リクエストサンプルは以下です。
{{見たい組織のインスタンスURL}}/services/data/v47.0/tooling/query?q=SELECT+MetadataComponentId,+MetadataComponentName,+ MetadataComponentNamespace,+MetadataComponentType,+RefMetadataComponentId,+ RefMetadataComponentName,+RefMetadataComponentNamespace,+RefMetadataComponentType+FROM+MetadataComponentDependency+WHERE+MetadataComponentId+=+'該当のId'
以下のレスポンスが返ってきました!
レスポンスをMermaid用記法に変換
今回はクラス図作成にあたり、Mermaid記法を用います。
上記で返ってきたJsonファイルをMermaid記法に変換するファイルをPHP言語にて作成します。
// コマンドライン引数からJSONファイルを読み込む
$jsonFile = $argv[1];
$baseName = pathinfo($jsonFile, PATHINFO_FILENAME);
$outputFile = $baseName . ".md";
// ファイルを読み込んでデコード
$jsonData = json_decode(file_get_contents($jsonFile), true);
// 出力用の配列を準備
$markupList = ["```mermaid\n\nclassDiagram". "\n\n"];
// データを解析してmarkupListに追加
foreach ($jsonData['records'] as $member) {
$compName = $member['MetadataComponentName'];
$refName = $member['RefMetadataComponentName'];
$markupList[] = " class ". $compName."{\n\n }"."\n".
" class ". $refName."{\n\n }"."\n"
." ".$compName . " --> " . $refName . " : " . "\n\n";
}
$markupList[] = "\n```";
file_put_contents($outputFile, implode('', $markupList));
php DependencyApiToMermaid.php {{該当のJsonファイル名}}
にて実行。
以下のファイル生成に成功!
生成されたMermaid記法を元に、Notionにメモしておく、など。
まとめ
上記の流れで、MetadataComponentDependencyAPIを利用し、クラス図に起こすところまで成功しました!
ある程度規模の大きいSalesforce組織では、組織内のApexClassの参照関係が複雑になるかと思います。タイムリーに組織内のApexClassの参照関係を簡単に把握するためにも、MetadataComponentDependencyAPIの機能は積極的に活用していきたいです。
We are hiring!!
ROBOT PAYMENTでは一緒に働く仲間を募集しています!!!
speakerdeck.com
www.robotpayment.co.jp