+ astah*プラグイン

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