Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

PlantUMLソースコードリーディング(1)

概要

PlantUML の仕様をソースコードから分析したくなったため、現時点(2020/01/03)でどのような設計で実装しているのか追いかけるための足ががりとなるポイントをまとめておく。(個別のPlantUMLのコマンド実装の設計については別記事で書いていきたい)

ソースコードリポジトリ

https://github.com/plantuml/plantuml

大まかな構造

net.sourceforge.plantuml.Run の実行時に受け取った文字列またはファイル内容のPlantUML用の文字列を解析処理に渡す処理がある。以下の順番で呼ばれる。

  1. net.sourceforge.plantuml.Run#main()
  2. net.sourceforge.plantuml.Run#manageAllFiles()
  3. net.sourceforge.plantuml.Run#processArgs()
  4. net.sourceforge.plantuml.Run#manageFileInternal()
  5. net.sourceforge.plantuml.BlockUml#getDiagram()
  6. net.sourceforge.plantuml.PSystemBuilder#createPSystem()
  7. net.sourceforge.plantuml.PSystemBuilder#getAllFactories()

ここで、net.sourceforge.plantuml.PSystemBuilder#getAllFactories() の処理で各モジュール(文字解析)が初期化されている。
Factoryを定義する際に、文字を解析するための文字パターンを各モジュールのどこかで定義している。
例えば、 colors というPlantUMLのコマンド の正規表現は以下の部分で定義されている。

ソースコード

public class PSystemColorsFactory extends PSystemSingleLineFactory {

    @Override
    protected AbstractPSystem executeLine(String line) {
        final Pattern pattern = Pattern.compile("^colors?\\s*(#?\\w+)?\\s*$");
        final Matcher matcher = pattern.matcher(line);
        if (matcher.matches()) {
            return new PSystemColors(matcher.group(1));
        }
        return null;
    }

}

シーケンス図を表示するPlantUMLのコマンドは以下の辺りで実装している。

ソースコード

public class SequenceDiagramFactory extends PSystemCommandFactory {

    // ...中略 ...

    @Override
    protected List<Command> createCommands() {

        final List<Command> cmds = new ArrayList<Command>();

        addCommonCommands1(cmds);

        cmds.add(new CommandActivate());
        cmds.add(new CommandDeactivateShort());

        cmds.add(new CommandParticipantA());
        cmds.add(new CommandParticipantA2());
        cmds.add(new CommandParticipantA3());
        cmds.add(new CommandParticipantA4());
        cmds.add(new CommandArrow());
        // ... 中略 ...
    }
}

矢印でノードおよび関係を定義する正規表現は この辺り で実装していると思われる。

まとめ

  • PlantUMLの実装解析についてのとっかかりとなる部分を記載
  • src/net/sourceforge/plantuml/モジュール名 という階層構造で整理されている
  • 機能が多い分、文字解析用のモジュールが多く読み解くのは大変
Eustace
ase
札幌に本社を構えるオープン系・Web系などのITシステム開発と支援で社会貢献する北海道・東京の独立系技術者集団です。 公共・自治体系の盤石なインフラ開発から、ビジネスの変化に追従できる先進的な開発まで、ニーズに合わせて対応できます。
https://www.ase.co.jp/
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