astahプラグイン開発勉強会
DESCRIPTION
社内で実施したAstahプラグイン開発勉強会の資料です。TRANSCRIPT
+
astah* プラグイン開発勉強会2013/5/29
朱峰 錦司 @kjstylepp
2+お品書き
astah* とは
astah* プラグインとは
astah* プラグインを作ろう
astah* プラグイン開発勉強会 2013/5/29
+
2013/5/29astah* プラグイン開発勉強会
3
astah* とは
4+astah*
株式会社チェンジビジョンが提供するツールのブランド名 以前は「 JUDE 」という名前だった
昔、 JUDE は当社でもけっこう使って気がするけど、最近はよくわからない…
社長は平鍋健児さん( @hiranabe ) アジャイルとかリーンスタートアップ界隈で有名人 株式会社永和システムマネジメントの副社長もしてたり 「 astah 」というキーワードでツイートするとたまに反応
してくれる
コンセプト:「最も身近なソフトウェア開発設計支援ツール」
astah* プラグイン開発勉強会 2013/5/29
5+astah* でできること お絵かき
ソフトウェア設計 各種 UML ER 図 データフロー図 フローチャート CRUD 図… etc
思考の整理 マインドマップ
共有 Web 経由での成果物参照 Web 経由でのコメンの追加
※ エディションによってできることに差がある
astah* プラグイン開発勉強会 2013/5/29
6+エディションによる違い
ダイアグラム描画については…機能 astah*
communityastah* UML
astah* professional
UML2.xクラス図、ユースケース図、シーケンス図、アクティビティ図、コミュニケーション図、ステートマシン図、コンポーネント図、配置図、合成構造図、オブジェクト図、パッケージ図
✓ ✓ ✓
Eriksson-Penker のプロセス図 参照 ✓ ✓
マインドマップ 参照 ✓ ✓
ER 図 参照 参照 ✓
フローチャート 参照 参照 ✓
CRUD 参照 参照 ✓
データフロー図( DFD ) 参照 参照 ✓
要求テーブル 参照 参照 ✓
要求図 参照 参照 ✓※http://astah.change-vision.com/ja/feature/comparison-table.htmlから引用
慣れるまではとりあえず UML 書ければ OK
しかも商用利用可!
本格的に開発で使うならやっぱり professional
が欲しいですね
astah* プラグイン開発勉強会 2013/5/29
+
2013/5/29astah* プラグイン開発勉強会
7
astah* プラグインとは
8+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* プラグイン開発勉強会 2013/5/29
9+どんなプラグインがあるか(1)
この手のツールのプラグインは主に以下の3 ジャンルに分類可能(と思う…) インポート系
外部ファイルを astah* で扱えるモデルに変換 FreeMind のインポート 各種プログラミング言語のリバース
加工系 astah* で扱えるモデルをこねくりまわす。なんでもあり。
エクスポート系 astah* で扱えるモデルを外部ファイルに変換
yUML 形式にエクスポート MSOffice 描画オブジェクトにエクスポート
astah* プラグイン開発勉強会 2013/5/29
10+どんなプラグインがあるか(2)
DB リバースプラグイン ER モデルの生成
DB サーバに接続し、スキーマ情報からモデルをリバース キー/リレーションなどの情報もばっちり
生成したモデルの自動レイアウトなども可能
http://astah.change-vision.com/ja/feature/db-reverse-plugin.html
astah* プラグイン開発勉強会 2013/5/29
11+どんなプラグインがあるか(3)
品質スイートプラグイン ステートチャートの活用
マトリクスに変換し、振る舞いの網羅性のレビュー 遷移パスを抽出し、テストケースとして活用
似たようなことをやっている人がいたような…(ry クラス図/シーケンス図の活用
クラス間依存関係を可視化し、結合度合いのレビュー クラス図とシーケンス図の整合性のレビュー
http://astah.change-vision.com/ja/feature/quality-plugin.html
astah* プラグイン開発勉強会 2013/5/29
12+どんなプラグインがあるか(4)
Office連携プラグイン日本人歓喜!!!
何かの勉強会で平鍋さん談 astah* と Office のダイレクト連携
Office のオブジェクト挿入メニューから astah* で編集中のモデルを描画オブジェクトとしてインポート可能
画像として保存 ->Office に貼り付け、をショートカット
http://astah.change-vision.com/ja/feature/office-plugin.html
astah* プラグイン開発勉強会 2013/5/29
13+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* プラグイン開発勉強会 2013/5/29
14+エディションによる違い
モデルの操作については…
モデルの参照 モデルの作成※ モデルの編集※ モデルの削除※クラス図 ○ ○ ○ ○ユースケース図 ○ ○ ○ ○ステートマシン図 ○ ○ ○ ○アクティビティ図 ○ × × ×シーケンス図 ○ ○ ○ ○コミュニケーション図 ○ × × ×コンポーネント図 × × × ×配置図 × × × ×合成構造図 ○ ○ ○ ○フローチャート ○ × × ×データフロー図 (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* プラグイン開発勉強会 2013/5/29
15+
Plugin A Plugin B
プラグインの動作する仕組み
プラグインは OSGi Runtime 上で動作 Eclipse でおなじみのプラグイン機構 OSGi Bundle 形式のプラグイン jar を plugins
フォルダに配置すれば OK
astah* ツール
UI 拡張ポイント astah* API
OSGi Runtime
ggrks (ごめんなさい、私も詳しくないです… )
astah* プラグイン開発勉強会 2013/5/29
+
2013/5/29astah* プラグイン開発勉強会
16
astah* プラグインを作ろう
17+ハンズオンの内容 公式のチュートリアル
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* プラグイン開発勉強会
18+astah* Plug-in SDK
mavenベースのプラグイン開発支援ツール プロジェクト作成、ビルド、 astah* ツール起動などのコマン
ド群を提供 2013 年 5 月現在、 Ver1.1 が最新
利用方法 好きな場所に配置する コマンド群の入った bin フォルダにパスを通す プラグインの動作確認対象の astah* ツールの場所を設定ファ
イルに記述 デフォルト設定で astah* ツールをインストールしている場合は必要なし Mac だと「 astah community 」などのような半角スペースを扱えない
バグがあるっぽい 「 astah_community 」のように変更したらうまく動く 家で勉強してるときにいきなりハマって心が折れかけた…
astah* プラグイン開発勉強会 2013/5/29
19+(参考) maven の proxy突破
settings.xml の作成 setting.xml ではないので注意 {%HOME}/.m2/settings.xml
2013/5/29astah* プラグイン開発勉強会
<settings> <proxies> <proxy> <active>true</active> <protocol>http</protocol> <host>{proxy のアドレス }</host> <port>8080</port> <username>{ アカウント名 }</username> <password>{ パスワード }</password> </proxy> </proxies></settings>
20+(参考) astah* ツールのインストール場所の指定
settings.xml の編集 {%ASDK_HOME}/conf/settings.xml
2013/5/29astah* プラグイン開発勉強会
<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版をここに
インストールしています
21+SDK の動作確認
パスが通っているかどうか
astah* ツールが起動するかどうか
2013/5/29astah* プラグイン開発勉強会
>asdkastah* 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*...
22+テンプレートプラグイン(1)
プラグイン開発プロジェクトの作成 プロジェクトを配置したいフォルダに移動
2013/5/29astah* プラグイン開発勉強会
>astah-generate-project[INFO] Scanning for projects...…(初回はすごく長い)…Define value for property 'groupId': : com.exampleDefine value for property 'artifactId': : SampleOfAstahPluginDefine value for property ‘version’: 1.0-SNAPSHOT: : (空欄)Define value for property ‘package’: com.example: : (空欄)Confirm properties configuration:groupId: com.exampleartifactId: SampleOfAstahPluginversion: 1.0-SNAPSHOTpackage: com.example Y: : (空欄)[INFO] ------------------------------------------------------------------…
識別子プロジェクト名
23+テンプレートプラグイン(2)
テンプレートプラグインの起動 作成したプロジェクトフォルダに移動
2013/5/29astah* プラグイン開発勉強会
>astah-build[INFO] Scanning for projects...…(初回はすごく長い)…[INFO] ------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------ …>astah-launch[INFO] Scanning for projects...…[INFO] ------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------…
24+テンプレートプラグイン(3)
メニューが追加されていることを確認
2013/5/29astah* プラグイン開発勉強会
これ
25+テンプレートプラグイン(4)
テンプレートプロジェクトを Eclipse にインポート Eclipse プロジェクトファイルの作成
Eclipse から既存のプロジェクトをインポート
2013/5/29astah* プラグイン開発勉強会
>astah-mvn eclipse:eclipse
ここから作成したプロジェクトのルートフォルダを指定
26+(参考) m2e を使う場合
Maven プロジェクトとしてインポート可能 Eclipse プロジェクトファイルの作成は必要なし
各種コマンドも Eclipse 上から実行可能 MAVEN_HOME に SDK のルートディレクトリを
追加する必要あり
2013/5/29astah* プラグイン開発勉強会
27+テンプレートプラグイン(5)
着目するファイル src/main/resouces/plugin.xml
拡張ポイントの設定ファイル テンプレートではメニューの定義と、メニュー押下時の
振る舞いの定義クラスを指定 src/main/java/com.example/TemplateAction.java
メニュー押下時の振る舞いを実装
2013/5/29astah* プラグイン開発勉強会
28+テンプレートプラグイン(6)
plugin.xml の確認
2013/5/29astah* プラグイン開発勉強会
<?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>
拡張ポイントを指定
メニューを追加するグループ
グループメニューを追加
メニューを追加
押下時に実施される振る舞いを設定
29+HelloWorld プラグイン(1)
テンプレートプラグインを再利用してHelloWorld プラグインを作ろうヘルプメニューに独自メニューを追加 プロジェクトを開いていなくても Hello World 画面を表示 テンプレートプラグインはプロジェクトが開いていない
とエラーを表示する
2013/5/29astah* プラグイン開発勉強会
30+HelloWorld プラグイン(2)
plugin.xml に新たな actionSet を追加
2013/5/29astah* プラグイン開発勉強会
<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
31+HelloWorld プラグイン(3)
Hell oWorldAction クラスの作成
2013/5/29astah* プラグイン開発勉強会
public class HelloWorldAction implements IPluginActionDelegate {
@Overridepublic 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 を実装
32+HelloWorld プラグイン(4)
プラグインをビルドし、 HelloWorld のプロンプトが表示されることを確認
2013/5/29astah* プラグイン開発勉強会
33+CountClasses プラグイン(1)
プロジェクト内に存在するクラス数を表示するプラグインを作ろう プロジェクト内にパッケージがある場合は配下の
クラス数を再帰的にカウントする
2013/5/29astah* プラグイン開発勉強会
クラス数が 3 つであることを表
示
※http://astah.change-vision.com/ja/plugin-tutorial/example.html から引用
34+CountClasses プラグイン(2)
plugin.xml に新たな actionSet を追加
2013/5/29astah* プラグイン開発勉強会
呼び出すクラスはCountClassesActio
n
<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>
35+CountClasses プラグイン(3)
CountClassesAction クラスの作成(1)
2013/5/29astah* プラグイン開発勉強会
public class CountClassesAction implements IPluginActionDelegate {
@Overridepublic 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 がない場合を想
定
36+CountClasses プラグイン(4)
CountClassesActoin クラスの作成(2)
2013/5/29astah* プラグイン開発勉強会
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); } }
}}
クラスならリストに追加
パッケージなら再帰的に検査
37+CountClasses プラグイン(4)
プラグインをビルドし、クラス数が正しく表示されることを確認(1)
2013/5/29astah* プラグイン開発勉強会
38+CountClasses プラグイン(5)
プラグインをビルドし、クラス数が正しく表示されることを確認(2)
2013/5/29astah* プラグイン開発勉強会
デフォルトの javaプロジェクトには137 クラス存在
39+HelloWorldView プラグイン(1)
もうひとつの拡張ポイント、タブ View の追加を行うプラグインを作りましょう
plugin.xml に新たな extension を追加
2013/5/29astah* プラグイン開発勉強会
<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 を使う
40+HelloWorldView プラグイン(2)
HelloWorldView クラスの作成
2013/5/29astah* プラグイン開発勉強会
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;
}
@Overridepublic String getDescription() {
return "Hello World View Plugin";}
@Overridepublic String getTitle() {
return "Hello World View";}
…}
拡張タブを実現するためにIPluginExtraTabView を実装
タブ自体は Swing のJPanel
41+(参考) EventListner の登録
ProjectEventListner astah* ツール上でモデルの編集など、プロジェク
トに変更が発生した場合、この Listner を実装したクラスは変更のオブザーバーになれる
実装するメソッド public void projectOpened(ProjectEvent e){} public void projectChanged(ProjectEvent e){} public void projectClosed(ProjectEvent e){}
チュートリアルの例では HelloWorldView にこのListener を実装している が、メソッドには何も実装していないのでサンプルとして
は参考にはならない…
2013/5/29astah* プラグイン開発勉強会
42+HelloWorldView プラグイン(3)
プラグインをビルドし、拡張タブが表示されることを確認
2013/5/29astah* プラグイン開発勉強会
ここ
43+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* プラグイン開発勉強会 2013/5/29
44
+みんなで何かおもしろいプラグイン作りましょう!
2013/5/29 astah* プラグイン開発勉強会