astahプラグイン開発勉強会

44
+ astah* ププププププププププ 2013/5/29 ププ ププ @kjstylepp

Upload: kinji-akemine

Post on 28-May-2015

4.865 views

Category:

Documents


12 download

DESCRIPTION

社内で実施したAstahプラグイン開発勉強会の資料です。

TRANSCRIPT

Page 1: Astahプラグイン開発勉強会

+

astah* プラグイン開発勉強会2013/5/29

朱峰 錦司 @kjstylepp

Page 2: Astahプラグイン開発勉強会

2+お品書き

astah* とは

astah* プラグインとは

astah* プラグインを作ろう

astah* プラグイン開発勉強会 2013/5/29

Page 3: Astahプラグイン開発勉強会

+

2013/5/29astah* プラグイン開発勉強会

3

astah* とは

Page 4: Astahプラグイン開発勉強会

4+astah*

株式会社チェンジビジョンが提供するツールのブランド名 以前は「 JUDE 」という名前だった

昔、 JUDE は当社でもけっこう使って気がするけど、最近はよくわからない…

社長は平鍋健児さん( @hiranabe ) アジャイルとかリーンスタートアップ界隈で有名人 株式会社永和システムマネジメントの副社長もしてたり 「 astah 」というキーワードでツイートするとたまに反応

してくれる

コンセプト:「最も身近なソフトウェア開発設計支援ツール」

astah* プラグイン開発勉強会 2013/5/29

Page 5: Astahプラグイン開発勉強会

5+astah* でできること お絵かき

ソフトウェア設計 各種 UML ER 図 データフロー図 フローチャート CRUD 図… etc

思考の整理 マインドマップ

共有 Web 経由での成果物参照 Web 経由でのコメンの追加

※ エディションによってできることに差がある

astah* プラグイン開発勉強会 2013/5/29

Page 6: Astahプラグイン開発勉強会

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

Page 7: Astahプラグイン開発勉強会

+

2013/5/29astah* プラグイン開発勉強会

7

astah* プラグインとは

Page 8: 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

Page 9: Astahプラグイン開発勉強会

9+どんなプラグインがあるか(1)

この手のツールのプラグインは主に以下の3 ジャンルに分類可能(と思う…) インポート系

外部ファイルを astah* で扱えるモデルに変換 FreeMind のインポート 各種プログラミング言語のリバース

加工系 astah* で扱えるモデルをこねくりまわす。なんでもあり。

エクスポート系 astah* で扱えるモデルを外部ファイルに変換

yUML 形式にエクスポート MSOffice 描画オブジェクトにエクスポート

astah* プラグイン開発勉強会 2013/5/29

Page 10: Astahプラグイン開発勉強会

10+どんなプラグインがあるか(2)

DB リバースプラグイン ER モデルの生成

DB サーバに接続し、スキーマ情報からモデルをリバース キー/リレーションなどの情報もばっちり

生成したモデルの自動レイアウトなども可能

http://astah.change-vision.com/ja/feature/db-reverse-plugin.html

astah* プラグイン開発勉強会 2013/5/29

Page 11: Astahプラグイン開発勉強会

11+どんなプラグインがあるか(3)

品質スイートプラグイン ステートチャートの活用

マトリクスに変換し、振る舞いの網羅性のレビュー 遷移パスを抽出し、テストケースとして活用

似たようなことをやっている人がいたような…(ry クラス図/シーケンス図の活用

クラス間依存関係を可視化し、結合度合いのレビュー クラス図とシーケンス図の整合性のレビュー

http://astah.change-vision.com/ja/feature/quality-plugin.html

astah* プラグイン開発勉強会 2013/5/29

Page 12: Astahプラグイン開発勉強会

12+どんなプラグインがあるか(4)

Office連携プラグイン日本人歓喜!!!

何かの勉強会で平鍋さん談 astah* と Office のダイレクト連携

Office のオブジェクト挿入メニューから astah* で編集中のモデルを描画オブジェクトとしてインポート可能

画像として保存 ->Office に貼り付け、をショートカット

http://astah.change-vision.com/ja/feature/office-plugin.html

astah* プラグイン開発勉強会 2013/5/29

Page 13: Astahプラグイン開発勉強会

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

Page 14: Astahプラグイン開発勉強会

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

Page 15: Astahプラグイン開発勉強会

15+

Plugin A Plugin B

プラグインの動作する仕組み

プラグインは OSGi Runtime 上で動作 Eclipse でおなじみのプラグイン機構 OSGi Bundle 形式のプラグイン jar を plugins

フォルダに配置すれば OK

astah* ツール

UI 拡張ポイント astah* API

OSGi Runtime

ggrks (ごめんなさい、私も詳しくないです… )

astah* プラグイン開発勉強会 2013/5/29

Page 16: Astahプラグイン開発勉強会

+

2013/5/29astah* プラグイン開発勉強会

16

astah* プラグインを作ろう

Page 17: 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* プラグイン開発勉強会

Page 18: Astahプラグイン開発勉強会

18+astah* Plug-in SDK

mavenベースのプラグイン開発支援ツール プロジェクト作成、ビルド、 astah* ツール起動などのコマン

ド群を提供 2013 年 5 月現在、 Ver1.1 が最新

利用方法 好きな場所に配置する コマンド群の入った bin フォルダにパスを通す プラグインの動作確認対象の astah* ツールの場所を設定ファ

イルに記述 デフォルト設定で astah* ツールをインストールしている場合は必要なし Mac だと「 astah community 」などのような半角スペースを扱えない

バグがあるっぽい 「 astah_community 」のように変更したらうまく動く 家で勉強してるときにいきなりハマって心が折れかけた…

astah* プラグイン開発勉強会 2013/5/29

Page 19: Astahプラグイン開発勉強会

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>

Page 20: Astahプラグイン開発勉強会

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版をここに

インストールしています

Page 21: Astahプラグイン開発勉強会

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*...

Page 22: 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] ------------------------------------------------------------------…

識別子プロジェクト名

Page 23: Astahプラグイン開発勉強会

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] ------------------------------------------------------------------…

Page 24: Astahプラグイン開発勉強会

24+テンプレートプラグイン(3)

メニューが追加されていることを確認

2013/5/29astah* プラグイン開発勉強会

これ

Page 25: Astahプラグイン開発勉強会

25+テンプレートプラグイン(4)

テンプレートプロジェクトを Eclipse にインポート Eclipse プロジェクトファイルの作成

Eclipse から既存のプロジェクトをインポート

2013/5/29astah* プラグイン開発勉強会

>astah-mvn eclipse:eclipse

ここから作成したプロジェクトのルートフォルダを指定

Page 26: Astahプラグイン開発勉強会

26+(参考) m2e を使う場合

Maven プロジェクトとしてインポート可能 Eclipse プロジェクトファイルの作成は必要なし

各種コマンドも Eclipse 上から実行可能 MAVEN_HOME に SDK のルートディレクトリを

追加する必要あり

2013/5/29astah* プラグイン開発勉強会

Page 27: Astahプラグイン開発勉強会

27+テンプレートプラグイン(5)

着目するファイル src/main/resouces/plugin.xml

拡張ポイントの設定ファイル テンプレートではメニューの定義と、メニュー押下時の

振る舞いの定義クラスを指定 src/main/java/com.example/TemplateAction.java

メニュー押下時の振る舞いを実装

2013/5/29astah* プラグイン開発勉強会

Page 28: Astahプラグイン開発勉強会

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>

拡張ポイントを指定

メニューを追加するグループ

グループメニューを追加

メニューを追加

押下時に実施される振る舞いを設定

Page 29: Astahプラグイン開発勉強会

29+HelloWorld プラグイン(1)

テンプレートプラグインを再利用してHelloWorld プラグインを作ろうヘルプメニューに独自メニューを追加 プロジェクトを開いていなくても Hello World 画面を表示 テンプレートプラグインはプロジェクトが開いていない

とエラーを表示する

2013/5/29astah* プラグイン開発勉強会

Page 30: Astahプラグイン開発勉強会

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

Page 31: Astahプラグイン開発勉強会

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 を実装

Page 32: Astahプラグイン開発勉強会

32+HelloWorld プラグイン(4)

プラグインをビルドし、 HelloWorld のプロンプトが表示されることを確認

2013/5/29astah* プラグイン開発勉強会

Page 33: Astahプラグイン開発勉強会

33+CountClasses プラグイン(1)

プロジェクト内に存在するクラス数を表示するプラグインを作ろう プロジェクト内にパッケージがある場合は配下の

クラス数を再帰的にカウントする

2013/5/29astah* プラグイン開発勉強会

クラス数が 3 つであることを表

※http://astah.change-vision.com/ja/plugin-tutorial/example.html から引用

Page 34: Astahプラグイン開発勉強会

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>

Page 35: Astahプラグイン開発勉強会

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 がない場合を想

Page 36: Astahプラグイン開発勉強会

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); } }

}}

クラスならリストに追加

パッケージなら再帰的に検査

Page 37: Astahプラグイン開発勉強会

37+CountClasses プラグイン(4)

プラグインをビルドし、クラス数が正しく表示されることを確認(1)

2013/5/29astah* プラグイン開発勉強会

Page 38: Astahプラグイン開発勉強会

38+CountClasses プラグイン(5)

プラグインをビルドし、クラス数が正しく表示されることを確認(2)

2013/5/29astah* プラグイン開発勉強会

デフォルトの javaプロジェクトには137 クラス存在

Page 39: Astahプラグイン開発勉強会

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 を使う

Page 40: Astahプラグイン開発勉強会

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

Page 41: Astahプラグイン開発勉強会

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* プラグイン開発勉強会

Page 42: Astahプラグイン開発勉強会

42+HelloWorldView プラグイン(3)

プラグインをビルドし、拡張タブが表示されることを確認

2013/5/29astah* プラグイン開発勉強会

ここ

Page 43: Astahプラグイン開発勉強会

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

Page 44: Astahプラグイン開発勉強会

44

+みんなで何かおもしろいプラグイン作りましょう!

2013/5/29 astah* プラグイン開発勉強会