developer's diary

最近はc#のエントリが多いです

sdedit-4.01.jarを使ってテキストファイルをシーケンス図に変換してみる

Quick Sequence Diagram Editorというシーケンス図を記述するプログラムを見つけたので触ってみた際の記録。

シーケンス図はphpでログインの仕組みを作ったと仮定してみました。

※Amazon Linux AMIでの動作確認の記録です。

インストール

javaをインストール

yum install java

wgetでjarファイル取得

wget http://cznic.dl.sourceforge.net/project/sdedit/sdedit/4.0/sdedit-4.01.jar

ヘルプの表示を確認

java -jar sdedit-4.01.jar -h

簡単なシーケンスを作成

シーケンス図作成用のtextファイル作成

vim test.sd

test.sdの内容

cl:browser[a]
php1:index.php[a]
php2:login.php[a]
db:database[a]

cl:location\: login.php=php1[s].GET /
cl:login form=php2[s].GET /login.php
cl:location\: index.php=php2[s].POST /login.php
php2[s]: result=db.SELECT
cl:response page=php1[s].GET /

シーケンス図(png画像)生成

java -jar sdedit-4.01.jar -o test.png -t png test.sd

結果

f:id:mitsugi-bb:20140511230127p:plain

補足(日本語)

javaにそこまで詳しくないので正しい方法か分かりませんが、 以下の方法でひとまず日本語表示ができました。(環境は)

wget http://dl.ipafont.ipa.go.jp/IPAfont/ipam00303.zip
unzip ipam00303.zip 
mkdir /usr/share/fonts/ipa-mincho
mv ipam.ttf  /usr/share/fonts/ipa-mincho/

ファイルに日本語を入力

test.sdの内容に日本語を含ませる

cl:ブラウザ[a]
php1:index.php[a]
php2:login.php[a]
db:データベース[a]

cl:location\: login.php(リダイレクト)=php1[s].GET /
cl:login formを返却=php2[s].GET /login.php
cl:location\: index.php(リダイレクト)=php2[s].POST /login.php
php2[s]: result=db.SELECT
cl:response page=php1[s].GET /

実行時にパラメータにフォント追加

java -jar sdedit-4.01.jar -o test.png -t png --font "IPA Mincho" test.sd

結果

f:id:mitsugi-bb:20140511233831p:plain

アクターを追加してみる

テキストファル(設計)を以下のように修正

user:Actor
cl:ブラウザ[a]
php1:index.php[a]
php2:login.php[a]
db:データベース[a]

user[s]:cl.ブラウザ起動
cl:location\: login.php(リダイレクト)=php1[s].GET /
cl:login formを返却=php2.GET /login.php
cl:user[s].ログイン画面表示
cl:stop

user:cl.ユーザID、パスワード入力してログインボタン押下
cl:location\: index.php(リダイレクト)=php2[s].POST /login.php
php2[s]: result=db.SELECT
cl:response page=php1[s].GET /
cl:user[s].ログイン後のページ表示
cl:stop

結果

f:id:mitsugi-bb:20140512000000p:plain

枠を追加してみる

[c タイトル][/c]で囲むことで枠が追加される

user:Actor
cl:ブラウザ[a]
php1:index.php[a]
php2:login.php[a]
db:データベース[a]

[c トップページを起動したが、cookieがないためログイン画面に遷移]
user[s]:cl.ブラウザ起動
cl:location\: login.php(リダイレクト)=php1[s].GET /
cl:login formを返却=php2.GET /login.php
cl:user[s].ログイン画面表示
cl:stop
[/c]

[c ログイン画面よりログイン]
user:cl.ユーザID、パスワード入力してログインボタン押下
cl:location\: index.php(リダイレクト)=php2[s].POST /login.php
php2[s]: result=db.SELECT
cl:response page=php1[s].GET /
cl:user[s].ログイン後のページ表示
cl:stop
[/c]

結果

f:id:mitsugi-bb:20140512000451p:plain

分岐を作ってみる

user:Actor
cl:ブラウザ[a]
php1:index.php[a]
php2:login.php[a]
db:データベース[a]

[c トップページを起動したが、cookieがないためログイン画面に遷移]
user[s]:cl.ブラウザ起動
cl:location\: login.php(リダイレクト)=php1[s].GET /
cl:login formを返却=php2.GET /login.php
cl:user[s].ログイン画面表示
cl:stop
[/c]

[c ログイン画面よりログイン]
user:cl.ユーザID、パスワード入力してログインボタン押下

[c ログインチェック]
--[ログインに成功]
cl:location\: index.php(リダイレクト)=php2[s].POST /login.php
php2[s]: ユーザ存在あり=db.SELECT
cl:response page=php1[s].GET /
cl:user[s].ログイン後のページ表示
--[ログインに失敗]
cl:ログインエラーを返却=php2[s].POST /login.php
php2[s]: ユーザ存在なし=db.SELECT
cl:user[s].ログインエラーの画面表示
[/c]
cl:stop
[/c]

結果

f:id:mitsugi-bb:20140512001453p:plain

まとめ

結構利用できるかもしれない。

ただし、文法が間違ってるとすぐエラーになる。

エラー例1

Exception in thread "main" net.sf.sdedit.error.SemanticError: The mnemonic "s" is already defined for the lifeline "cl
    at net.sf.sdedit.diagram.Diagram.associateLifeline(Unknown Source)
    at net.sf.sdedit.diagram.MessageProcessor.findCallee(Unknown Source)
    at net.sf.sdedit.diagram.MessageProcessor._processMessage(Unknown Source)
    at net.sf.sdedit.diagram.MessageProcessor.processMessage(Unknown Source)
    at net.sf.sdedit.diagram.Diagram.readMessages(Unknown Source)
    at net.sf.sdedit.diagram.Diagram.generate(Unknown Source)
    at net.sf.sdedit.Main.createImage(Unknown Source)
    at net.sf.sdedit.Main.main(Unknown Source)

エラー例2

Exception in thread "main" net.sf.sdedit.error.SemanticError: Thread 1 has died
    at net.sf.sdedit.diagram.MessageProcessor.findCaller(Unknown Source)
    at net.sf.sdedit.diagram.MessageProcessor._processMessage(Unknown Source)
    at net.sf.sdedit.diagram.MessageProcessor.processMessage(Unknown Source)
    at net.sf.sdedit.diagram.Diagram.readMessages(Unknown Source)
    at net.sf.sdedit.diagram.Diagram.generate(Unknown Source)
    at net.sf.sdedit.Main.createImage(Unknown Source)
    at net.sf.sdedit.Main.main(Unknown Source)