+
astah*プラグイン開発勉強会
2013/5/29
朱峰 錦司 @kjstylepp
+
お品書き
astah*とは
astah*プラグインとは
astah*プラグインを作ろう
astah*プラグイン開発勉強会
2
2013/5/29
+
2013/5/29astah*プラグイン開発勉強会
3
astah*とは
+
astah*
株式会社チェンジビジョンが提供するツール
のブランド名
 以前は「JUDE」という名前だった
 昔、JUDEは当社でもけっこう使って気がするけど、最近は
よくわからない…
 社長は平鍋健児さん(@hiranabe)
 アジャイルとかリーンスタートアップ界隈で有名人
 株式会社永和システムマネジメントの副社長もしてたり
 「astah」というキーワードでツイートするとたまに反応
してくれる
コンセプト:「最も身近なソフトウェア開発
設計支援ツール」
astah*プラグイン開発勉強会
4
2013/5/29
+
astah*でできること
 お絵かき
 ソフトウェア設計
 各種UML
 ER図
 データフロー図
 フローチャート
 CRUD図…etc
 思考の整理
 マインドマップ
 共有
 Web経由での成果物参照
 Web経由でのコメンの追加
※エディションによってできることに差がある
astah*プラグイン開発勉強会
5
2013/5/29
+
エディションによる違い
ダイアグラム描画については…
機能
astah*
community
astah*
UML
astah*
professional
UML2.x
クラス図、ユースケース図、シーケンス
図、アクティビティ図、コミュニケー
ション図、ステートマシン図、コンポー
ネント図、配置図、合成構造図、オブ
ジェクト図、パッケージ図
✓ ✓ ✓
Eriksson-Penkerのプロセス図 参照 ✓ ✓
マインドマップ 参照 ✓ ✓
ER図 参照 参照 ✓
フローチャート 参照 参照 ✓
CRUD 参照 参照 ✓
データフロー図(DFD) 参照 参照 ✓
要求テーブル 参照 参照 ✓
要求図 参照 参照 ✓
※http://astah.change-vision.com/ja/feature/comparison-table.htmlから引用
慣れるまではとりあえ
ずUML書ければOK
しかも商用利用可!
本格的に開発で使うなら
やっぱりprofessionalが
欲しいですね
astah*プラグイン開発勉強会
6
2013/5/29
+
2013/5/29astah*プラグイン開発勉強会
7
astah*プラグイン
とは
+
astah*プラグイン
astah*が提供する拡張ポイントを経由して、
お好みの機能を追加できる
 2011年10月のVer6.5でβ(?)初登場
 それまでもastah* Labsにはひっそりとあった
 2012年3月のVer6.6で正式対応
それなりの数のプラグインがすでに公開中
 公式のプラグイン紹介
 http://www.slideshare.net/ChangeVision/astah-plugins
 Github上には2013年5月時点で40弱のリポジトリ
 https://github.com/search?q=astah
astah*プラグイン開発勉強会
8
2013/5/29
+
どんなプラグインがあるか(1)
この手のツールのプラグインは主に以下の3
ジャンルに分類可能(と思う…)
 インポート系
 外部ファイルをastah*で扱えるモデルに変換
 FreeMindのインポート
 各種プログラミング言語のリバース
 加工系
 astah*で扱えるモデルをこねくりまわす。なんでもあり。
 エクスポート系
 astah*で扱えるモデルを外部ファイルに変換
 yUML形式にエクスポート
 MSOffice描画オブジェクトにエクスポート
astah*プラグイン開発勉強会
9
2013/5/29
+
どんなプラグインがあるか(2)
DBリバースプラグイン
 ERモデルの生成
 DBサーバに接続し、スキーマ情報からモデルをリバース
 キー/リレーションなどの情報もばっちり
 生成したモデルの自動レイアウトなども可能
 http://astah.change-vision.com/ja/feature/db-reverse-plugin.html
astah*プラグイン開発勉強会
10
2013/5/29
+
どんなプラグインがあるか(3)
品質スイートプラグイン
 ステートチャートの活用
 マトリクスに変換し、振る舞いの網羅性のレビュー
 遷移パスを抽出し、テストケースとして活用
 似たようなことをやっている人がいたような…(ry
 クラス図/シーケンス図の活用
 クラス間依存関係を可視化し、結合度合いのレビュー
 クラス図とシーケンス図の整合性のレビュー
 http://astah.change-vision.com/ja/feature/quality-plugin.html
astah*プラグイン開発勉強会
11
2013/5/29
+
どんなプラグインがあるか(4)
Office連携プラグイン
 日本人歓喜!!!
 何かの勉強会で平鍋さん談
 astah*とOfficeのダイレクト連携
 Officeのオブジェクト挿入メニューからastah*で編集中の
モデルを描画オブジェクトとしてインポート可能
 画像として保存->Officeに貼り付け、をショートカット
 http://astah.change-vision.com/ja/feature/office-plugin.html
astah*プラグイン開発勉強会
12
2013/5/29
+
astah* API
 astah*にはastah* APIが存在
 astah*のモデルを扱うJavaインターフェース群
 Thread-safeではない(はず)
 公式利用ガイド/JavaDocあり
 http://members.change-vision.com/javadoc/astah-api/6_7_0-
43495/api/ja/doc
 http://members.change-vision.com/javadoc/astah-api/6_7_0-
43495/api/ja/doc/javadoc/
 APIが提供する機能
 モデルの参照/作成/編集/削除
 図の参照/作成/編集/削除
 XML入出力
※エディションによってできることが異なる
astah*プラグイン開発勉強会
13
2013/5/29
+
エディションによる違い
モデルの操作については…
モデルの参照 モデルの作成※ モデルの編集※ モデルの削除※
クラス図 ○ ○ ○ ○
ユースケース図 ○ ○ ○ ○
ステートマシン図 ○ ○ ○ ○
アクティビティ図 ○ × × ×
シーケンス図 ○ ○ ○ ○
コミュニケーション図 ○ × × ×
コンポーネント図 × × × ×
配置図 × × × ×
合成構造図 ○ ○ ○ ○
フローチャート ○ × × ×
データフロー図(DFD) ○ × × ×
ER図 ○ △ △ △
CRUD × × × ×
マインドマップ × × × ×
要求テーブル × × × ×
要求図 ○ △ △ △
トレーサビリティマップ × × × ×
※astah* UML, professionalのみ。△はastah* professionalのみ。
※http://members.change-vision.com/javadoc/astah-api/6_7_0-43495/api/ja/doc/index.htmlから引用
プラグインを作るなら
professionalじゃないと
楽しくない…
astah*プラグイン開発勉強会
14
2013/5/29
+
Plugin A Plugin B
プラグインの動作する仕組み
プラグインはOSGi Runtime上で動作
 Eclipseでおなじみのプラグイン機構
 OSGi Bundle形式のプラグインjarをpluginsフォル
ダに配置すればOK
astah*ツール
UI拡張ポイント astah* API
OSGi Runtime
ggrks (ごめんなさい、私も詳しくないです…)
astah*プラグイン開発勉強会
15
2013/5/29
+
2013/5/29astah*プラグイン開発勉強会
16
astah*プラグイン
を作ろう
+
ハンズオンの内容
 公式のチュートリアル
 http://astah.change-vision.com/ja/plugin-tutorial/index.html
 元ネタというかほぼそのまま
 本日の講師の環境
 astah* community6.7
 JDK7
 まぁ6でも問題ないとは思いますが
 Eclipse3.8.2
 JDT
 コマンド叩いたりとかはコマンドプロンプトでやるのでm2eは使いま
せん
 拡張ポイントやAPIを1回使ってみるのが目的
 詳細な使用などは説明しません
 興味のある人はチュートリアルやその他資料を参照のこと
2013/5/29astah*プラグイン開発勉強会
17
+
astah* Plug-in SDK
 mavenベースのプラグイン開発支援ツール
 プロジェクト作成、ビルド、astah*ツール起動などのコマン
ド群を提供
 2013年5月現在、Ver1.1が最新
 利用方法
 好きな場所に配置する
 コマンド群の入ったbinフォルダにパスを通す
 プラグインの動作確認対象のastah*ツールの場所を設定ファ
イルに記述
 デフォルト設定でastah*ツールをインストールしている場合は必要
なし
 Macだと「astah community」などのような半角スペースを扱えない
バグがあるっぽい
 「astah_community」のように変更したらうまく動く
 家で勉強してるときにいきなりハマって心が折れかけた…
astah*プラグイン開発勉強会
18
2013/5/29
+
(参考)mavenのproxy突破
settings.xmlの作成
 setting.xmlではないので注意
 {%HOME}/.m2/settings.xml
2013/5/29astah*プラグイン開発勉強会
19
<settings>
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>{proxyのアドレス}</host>
<port>8080</port>
<username>{アカウント名}</username>
<password>{パスワード}</password>
</proxy>
</proxies>
</settings>
+ (参考)astah*ツールのインストール場所の指定
settings.xmlの編集
 {%ASDK_HOME}/conf/settings.xml
2013/5/29astah*プラグイン開発勉強会
20
<profile>
<id>astah-community-windows-x86</id>
<activation>
<activeByDefault>false</activeByDefault>
<file>
<exists>C:/Applications/astah_community/astah-community.jar</exists>
</file>
</activation>
<properties>
<astahPath>C:/Applications/astah_community/</astahPath>
<astahEdition>community</astahEdition>
</properties>
…
</profile> 私はzip版をここに
インストールしています
+
SDKの動作確認
パスが通っているかどうか
astah*ツールが起動するかどうか
2013/5/29astah*プラグイン開発勉強会
21
>asdk
astah* Plug-in SDK version: 1.1
>astah-launch
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- astah-maven-plugin:1.0.0:launch (default-cli) @ standalone-pom ---
[INFO] Launching astah*...
+
テンプレートプラグイン(1)
プラグイン開発プロジェクトの作成
 プロジェクトを配置したいフォルダに移動
2013/5/29astah*プラグイン開発勉強会
22
>astah-generate-project
[INFO] Scanning for projects...
…
(初回はすごく長い)
…
Define value for property 'groupId': : com.example
Define value for property 'artifactId': : SampleOfAstahPlugin
Define value for property „version‟: 1.0-SNAPSHOT: :(空欄)
Define value for property „package‟: com.example: :(空欄)
Confirm properties configuration:
groupId: com.example
artifactId: SampleOfAstahPlugin
version: 1.0-SNAPSHOT
package: com.example
Y: :(空欄)
[INFO] ------------------------------------------------------------------
…
識別子
プロジェクト名
+
テンプレートプラグイン(2)
テンプレートプラグインの起動
 作成したプロジェクトフォルダに移動
2013/5/29astah*プラグイン開発勉強会
23
>astah-build
[INFO] Scanning for projects...
…
(初回はすごく長い)
…
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------
…
>astah-launch
[INFO] Scanning for projects...
…
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------
…
+
テンプレートプラグイン(3)
メニューが追加されていることを確認
2013/5/29astah*プラグイン開発勉強会
24
これ
+
テンプレートプラグイン(4)
テンプレートプロジェクトをEclipseにイン
ポート
 Eclipseプロジェクトファイルの作成
 Eclipseから既存のプロジェクトをインポート
2013/5/29astah*プラグイン開発勉強会
25
>astah-mvn eclipse:eclipse
ここから作成したプロジェクトの
ルートフォルダを指定
+
(参考)m2eを使う場合
Mavenプロジェクトとしてインポート可能
 Eclipseプロジェクトファイルの作成は必要なし
各種コマンドもEclipse上から実行可能
 MAVEN_HOMEにSDKのルートディレクトリを追加する
必要あり
2013/5/29astah*プラグイン開発勉強会
26
+
テンプレートプラグイン(5)
着目するファイル
 src/main/resouces/plugin.xml
 拡張ポイントの設定ファイル
 テンプレートではメニューの定義と、メニュー押下時の振
る舞いの定義クラスを指定
 src/main/java/com.example/TemplateAction.java
 メニュー押下時の振る舞いを実装
2013/5/29astah*プラグイン開発勉強会
27
+
テンプレートプラグイン(6)
plugin.xmlの確認
2013/5/29astah*プラグイン開発勉強会
28
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<extension point="com.change_vision.astah.ui.actionSets">
<actionSet
label="%action_set_label"
visible="true"
id="com.example.SampleOfAstahPlugin.actionSet">
<menu
id="SampleOfAstahPlugin"
label="%menu_group"
path="tool/SampleOfAstahPlugin">
</menu>
<action
label="%menu_label"
icon="icons/sample.gif"
class="com.example.TemplateAction"
tooltip="%menu_tooltip"
menubarPath="tool/SampleOfAstahPlugin/"
id="SampleOfAstahPlugin">
</action>
</actionSet>
</extension>
</plugin>
拡張ポイントを指定
メニューを追加
するグループ
グループ
メニューを追加
メニューを追加
押下時に実施される
振る舞いを設定
+
HelloWorldプラグイン(1)
テンプレートプラグインを再利用して
HelloWorldプラグインを作ろう
 ヘルプメニューに独自メニューを追加
 プロジェクトを開いていなくてもHello World画面
を表示
 テンプレートプラグインはプロジェクトが開いていないと
エラーを表示する
2013/5/29astah*プラグイン開発勉強会
29
+
HelloWorldプラグイン(2)
plugin.xmlに新たなactionSetを追加
2013/5/29astah*プラグイン開発勉強会
30
<actionSet
label=“HelloWorldプラグイン“
visible="true"
id=“com.example.actions.HelloWorld”>
<menu
id=“HelloWorld”
label=“HelloWorldメニューグループ”
path=“help/HelloWorld”>
</menu>
<action
label=“HelloWorldメニュー”
icon=“icons/sample.gif”
class=“com.example.actions.HelloWorldAction”
tooltip=“HelloWorld”
menubarPath=“help/HelloWorld/”
id=“HelloWorldAction”>
</action>
</actionSet>
呼び出すクラスは
HelloWorldAction
+
HelloWorldプラグイン(3)
Hell oWorldActionクラスの作成
2013/5/29astah*プラグイン開発勉強会
31
public class HelloWorldAction implements IPluginActionDelegate {
@Override
public Object run(IWindow arg0) throws UnExpectedException {
try {
JOptionPane.showMessageDialog(arg0.getParent(),
"HelloWorld!");
} catch (Exception e) {
JOptionPane.showMessageDialog(arg0.getParent(),
"Exception occuerd!",
"Alert",
JOptionPane.ERROR_MESSAGE);
throw new UnExpectedException();
}
return null;
}
}
astah*ツールの
UIはSwing
アクションを実現するために
IPluginActionDelegateを実装
+
HelloWorldプラグイン(4)
プラグインをビルドし、HelloWorldのプロン
プトが表示されることを確認
2013/5/29astah*プラグイン開発勉強会
32
+
CountClassesプラグイン(1)
プロジェクト内に存在するクラス数を表示す
るプラグインを作ろう
 プロジェクト内にパッケージがある場合は配下の
クラス数を再帰的にカウントする
2013/5/29astah*プラグイン開発勉強会
33
クラス数が3つで
あることを表示
※http://astah.change-vision.com/ja/plugin-tutorial/example.htmlから引用
+
CountClassesプラグイン(2)
plugin.xmlに新たなactionSetを追加
2013/5/29astah*プラグイン開発勉強会
34
呼び出すクラスは
CountClassesAction
<actionSet
label=“CountClassesプラグイン”
visible=“true”
id=“com.example.actions.CountClasses”>
<menu
id=“CountClasses”
label=“CountClassesメニューグループ”
path=“tool/CountClasses”>
</menu>
<action
label=“CountClassesメニュー”
icon=“icons/sample.gif”
class=“com.example.actions.CountClassesAction”
tooltip=“CountClasses”
menubarPath=“tool/CountClasses/”
id=“com.example.actions.CountClassesAction”>
</action>
</actionSet>
+
CountClassesプラグイン(3)
CountClassesActionクラスの作成(1)
2013/5/29astah*プラグイン開発勉強会
35
public class CountClassesAction implements IPluginActionDelegate {
@Override
public Object run(IWindow window) throws UnExpectedException {
try {
AstahAPI api = AstahAPI.getAstahAPI();
ProjectAccessor projectAccessor = api.getProjectAccessor();
IModel iCurrentProject = projectAccessor.getProject();
List<IClass> classList = new ArrayList<IClass>();
getAllClasses(iCurrentProject, classList);
JOptionPane.showMessageDialog(window.getParent(),
"There are " + classList.size() + " classes.");
} catch (ProjectNotFoundException e) {
JOptionPane.showMessageDialog(window.getParent(),
"Please open a project.",
"Warning",
JOptionPane.WARNING_MESSAGE);
throw new UnExpectedException();
} catch (Exception e) {
JOptionPane.showMessageDialog(window.getParent(),
"Exception occured.",
"Alert",
JOptionPane.ERROR_MESSAGE);
throw new UnExpectedException();
}
return null;
}
扱うProject
オブジェクトの取得
Projectを扱うときは
Projectがない場合を想
定
+
CountClassesプラグイン(4)
CountClassesActoinクラスの作成(2)
2013/5/29astah*プラグイン開発勉強会
36
private void getAllClasses(INamedElement namedElement, List<IClass> classList)
throws ClassNotFoundException, ProjectNotFoundException {
if (namedElement instanceof IPackage) {
for (INamedElement ownedNamedElement : ((IPackage) namedElement).getOwnedElements()) {
getAllClasses(ownedNamedElement, classList);
}
} else if (namedElement instanceof IClass) {
classList.add((IClass) namedElement);
for(IClass nestedClasses : ((IClass) namedElement).getNestedClasses()) {
getAllClasses(nestedClasses, classList);
}
}
}
}
クラスなら
リストに追加
パッケージなら
再帰的に検査
+
CountClassesプラグイン(4)
プラグインをビルドし、クラス数が正しく表
示されることを確認(1)
2013/5/29astah*プラグイン開発勉強会
37
+
CountClassesプラグイン(5)
プラグインをビルドし、クラス数が正しく表
示されることを確認(2)
2013/5/29astah*プラグイン開発勉強会
38
デフォルトのjava
プロジェクトには
137クラス存在
+
HelloWorldViewプラグイン(1)
もうひとつの拡張ポイント、タブViewの追加
を行うプラグインを作りましょう
plugin.xmlに新たなextensionを追加
2013/5/29astah*プラグイン開発勉強会
39
<extension point="com.change_vision.astah.ui.view">
<view
id="com.example.view.HelloWorldView"
type="extraTab"
class="com.example.view.HelloWorldView">
</view>
</extension>
呼び出すクラスは
HelloWorldView
Viewの拡張はこの
extensionを使う
+
HelloWorldViewプラグイン(2)
HelloWorldViewクラスの作成
2013/5/29astah*プラグイン開発勉強会
40
public class HelloWorldView extends JPanel implements IPluginExtraTabView {
public HelloWorldView() {
setLayout(new BorderLayout());
add(createLabelPane(), BorderLayout.CENTER);
}
private Component createLabelPane() {
JLabel label = new JLabel("Hello World!");
JScrollPane pane = new JScrollPane(label);
return pane;
}
@Override
public String getDescription() {
return "Hello World View Plugin";
}
@Override
public String getTitle() {
return "Hello World View";
}
…
}
拡張タブを実現するために
IPluginExtraTabViewを実装
タブ自体はSwingのJPanel
+
(参考)EventListnerの登録
ProjectEventListner
 astah*ツール上でモデルの編集など、プロジェク
トに変更が発生した場合、このListnerを実装した
クラスは変更のオブザーバーになれる
 実装するメソッド
 public void projectOpened(ProjectEvent e){}
 public void projectChanged(ProjectEvent e){}
 public void projectClosed(ProjectEvent e){}
 チュートリアルの例ではHelloWorldViewにこの
Listenerを実装している
 が、メソッドには何も実装していないのでサンプルとして
は参考にはならない…
2013/5/29astah*プラグイン開発勉強会
41
+
HelloWorldViewプラグイン(3)
プラグインをビルドし、拡張タブが表示され
ることを確認
2013/5/29astah*プラグイン開発勉強会
42
ここ
+
astah* communityで動くプラグイン
コードを読んでみよう
 yUML tool for Astahプラグイン
 http://astah.change-vision.com/ja/feature/yuml-plugin.html
 Astah Scriptプラグイン
 http://astah.change-vision.com/ja/feature/script-plugin.html
 PHP-Export Plug-in
 https://github.com/tobitobita/php-export/blob/master/README_ja.md
 (参考)最新Eclipseでも動くJavaのリバースツール「JD-Eclipse(の改造版)」
 http://mchr3k.github.io/jdeclipse-realign/
astah*プラグイン開発勉強会
43
2013/5/29
+ みんなで何かおもしろい
プラグイン作りましょう!
2013/5/29 astah*プラグイン開発勉強会 44

Astahプラグイン開発勉強会