+
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
© Copyright 2026 ExpyDoc