Help us understand the problem. What is going on with this article?

MetadataComponentDependencyAPIとPlantUMLでクラス図を作成しよう!

はじめに

 クラス図書いてますか?私はSalesforceの導入に携わるようになってあまり書いたことがありません。(笑)
 作成しなくなった理由は、個人的な考えですが、Platformを利用しているため、ビジネスロジック部分の実装のみで、基本的な処理パターンの図を一度作成してしまえば、名前や形を少し直すだけで再利用できてしまうためだと考えています。もし、作成する必要がある場合は、他システム連携や、何か特別な実装をしている時ではないでしょうか?
 ただし、お客様によっては共通アプリケーションアーキテクチャに従って実装している機能でもクラス図を納品対象にするお客様は少なくありません。目的としては、ドキュメントをひと目見るだけで共通アプリケーションアーキテクチャに従っていない機能を検出できる以外に、プログラムの構造を把握していない人に情報を共有し、仕様変更や追加要望、障害対応時の影響調査で漏れなく確認部分を把握したいという目的があります。
 しかし、手動で作成したUMLは、詳細設計で初版を作成した後に、仕様変更や追加要望、障害対応でプログラムに修正が入る度にメンテナンスが必要で、複数のチームがシステムをリリースするために様々な作業を並行して実施している中で、精度の高いドキュメント修正に十分な工数や期間が確保できない場合が多々あり、複数の作業を掛け持ちしている開発担当者や引継ぎ担当者が修正作業すると漏れやミスが発生しやすく、いつの間にか品質が低下し納品のためだけのドキュメントとして、納品前に一人の担当者がまとめて作成することもたびたび見てきました。
 そうした中で、タイムリーにその時の組織の状態をボタン一つでUMLが生成できるようになれば、オブジェクト提議書とともに強力なツールになると考えています。ああ、前の会社でも同じことを言ってたような・・・
 今回は、Winter’19でベータ版としてリリースされた、MetadataComponentDependencyAPIとPlantUMLを使ってタイムリーに簡単にクラス図を作成します。
 実行すると下のクラス図が作成できます。(※クラス名を削除しています。)
dependency.png

Dependency APIとは

 メタデータ間の依存関係を取得できるAPIで、Summer'18でpilot版、現在Winter'20でベータ版になりました。
 現在、Sandboxのみ利用できる状態になっており、次回のリリースで運用組織(DE組織を含む?)に拡張されるとのことです。楽しみですね。
 私が初めて知ったのは、去年のDreamforce'18のセッションでMetadataComponentDependencyAPIのデモが紹介されていました。
Dependency API
 そのデモでは、SFDXコマンドでMetadataComponentDependencyAPIからメタデータの依存情報を取得してDot言語に変換し、Dotコマンドでモデルを生成するデモを紹介されていました。
 見ていて「おおー!」と驚いたのが記憶に残っています。
クラス図
 サポートされているメタデータは、Dreamforce'18の資料で古いですがのせておきます。
スクリーンショット 2019-12-22 18.42.49.png

参考資料
ToolingAPI

PlantUMLとは

 目で見て理解できるPlantUML用の形式で書かれたテキストファイルを読み込ませるとUMLが生成できるオープンソースのJavaのツールで、Graphviz (Graph Visualization Software) を利用しています。
リファレンス

考慮事項

 RESTやSOAP APIを利用してクエリで情報を取得するため、検索結果の最大取得件数:2000件の制限があります。表示するメタデータの件数が多い場合には、MetadataComponentId項目やRefMetadataComponentId項目でクラス図で出力したいメタデータのID指定するのが有効だと考えています。
以下の条件は、ヘルプでサポートされてないとのことです。

  • ORDER BY
  • count()関数
  • queryMore()
  • WHERE句でMetadataComponentNameの利用
  • WHERE句でRefMetadataComponentNameの利用
  • WHERE句で=, !=, AND, or OR以外の利用
  • WHERE句でRefMetadataComponentType = ‘StandardEntity’条件利用
  • WHERE句でMetadataComponentType項目またはRefMetadataComponentType項目でLIKEの利用
  • OFFSET

それでは試してみましょう!

 今回は、POST MANを使用して、REST APIでMetadataComponentDependencyAPIにアクセスし依存情報を取得します。取得された情報をPlantUML用の形式に変換してクラス図を作成します。

MetadataComponentDependencyAPIをPOSTMANから実行

 ToolingAPIを使ってMetadataComponentDependencyAPI用のクエリを実行します。

{Instance_URL}/services/data/v47.0/tooling/query?q=SELECT+MetadataComponentId,+MetadataComponentName,+ MetadataComponentNamespace,+MetadataComponentType,+RefMetadataComponentId,+ RefMetadataComponentName,+RefMetadataComponentNamespace,+RefMetadataComponentType+
FROM+MetadataComponentDependency+
WHERE+RefMetadataComponentType+=+'ApexClass'

 POSTMANで、クエリを実行すると下記のような状態になります。Body部分のJSONをコピーして[dependency.json](任意)を作成します。
POSTMAN

PlantUMLでクラス図を生成

 作業用フォルダを作成し、PlantUMLページからダウンロードしたjarと先ほどPOSTMANの取得結果から作成した[dependency.json]を配置します。そのほかの、[change.py]と[config.txt]は下記の手順で作成できます。
スクリーンショット 2019-12-22 18.58.31.png

 Macでプリインストールされている言語の一つPython言語で、JSONからPlantUML用の形式に変換するプログラムファイルを作成します。Windowsの場合、PowerShellで書いてもイイですね!

change.py
import sys
import json

# Load Json File from ComandLine argument
with open(sys.argv[1], 'r') as f:
    data = json.load(f)
# Output
markuplist = ["@startuml\n\n"]
for member in data['records']:
    comp_name = member['MetadataComponentName']
    ref_name = member['RefMetadataComponentName']
    ref_type = member['RefMetadataComponentType']
    markuplist.append(comp_name + " --|> " + ref_name + " : " + ref_type + "\n")
markuplist.append("\n@enduml")
with open(sys.argv[2], mode='w') as of:
    of.writelines(markuplist)

 PantUML実行時の設定ファイルを作成します。

config.txt
skinparam backgroundColor #EEEBDC
skinparam classAttributeIconSize 0
skinparam componentStyle uml2

 PlatUMLは、Graphvizを利用しているため実行前にインストールします。

brew install graphviz

 PlantUML形式変換用のプログラムを実行して、読み込み用のテキストファイルを作成します。

python change.py ./dependency.json ./dependency.txt    

 PlantUML読み込み用のテキストファイルが作成されました。
スクリーンショット 2019-12-22 12.16.57.png

 PlantUMLを実行して、クラス図を作成します。

java -jar plantuml.jar -config ./config.txt dependency.txt

 読み込みファイルと同じファイル名のクラス図の画像ファイルが作成されました。

dependency.png

最後に

 いかがだったでしょうか?
 DependencyAPIから依存情報を取得して、PlantUMLでグラフを生成しました。
 実際に操作してみると、タイムリーに簡単にクラス図が作成できる事が実感できました。
 PlantUMLはクラス図意外にもシーケンス図などいろいろなUML図を作成できるので試してみてください。では、

SevenstarsRock
SalesforceやMuleSoft導入のプロジェクトに関わっております。個人的に興味を持ったことを検証して記事にしています。
accenture
ストラテジー、コンサルティング、デジタル、テクノロジー、オペレーションズの5つの領域でサービスを提供する総合コンサルティング企業
https://www.accenture.com/jp-ja/new-applied-now
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした