本ページではメニューの追加を例に、astah*のプラグイン開発を紹介します。
プラグインプロジェクトの新規作成
プラグインプロジェクトを新規作成します。
プラグインプロジェクトを作成したいディレクトリへ移動し、次のコマンドを入力してください。
astah* professional、UML
> astah-generate-project
astah* SysML
> astah-sysml-generate-project
astah* System Safety
> astah-safety-generate-project
続いてgroupId、artifactId、version、パッケージを指定してください。
Parameter | Description |
groupId | プロジェクトの識別名を指定します。 一般的には、プロジェクトのルートパッケージ名を指定します。 |
artifactId | プロジェクト名を指定します。 生成されるフォルダ名やjarファイルの名前に使用されます。 |
version | プロジェクトのバージョンを指定します。 |
package | プロジェクトのパッケージ名を指定します。 groupIdと同じか、下層のパッケージ名を指定してください。 |
エラーがなければ、指定したartifact idと同名のフォルダがプラグインプロジェクトとして作成されます。
生成されたプロジェクトの内容を簡単に説明します。
File Name | Description |
pom.xml | プロジェクトのビルド情報や、ライブラリの依存情報、Mavenプラグインの設定などを記述します。 |
Activator.java | プラグインがロードされるときに実行されます。 プラグインの初期化処理や終了処理などを定義します。 |
plugin.xml | メニューなどの拡張ポイントを設定します。この例では、astah*の拡張ポイントとしてメニュー定義を記述します。記述方法は、後ほどプラグインの作り方で説明します。 |
plugin.properties | プラグインで使用するラベルなどの多言語化のための仕組みです。デフォルトではplugin.propertiesの値が使用され、日本語のラベルを提供する場合はplugin_jp.propertiesに記述される値が使用されます。 |
開発中のプラグインを読み込む
開発中のプラグインを読み込むために、まずはビルドしましょう。
1. 作成したプラグインプロジェクトのディレクトリへ移動します
2. 次のコマンドを実行します
> astah-build
astah-maven-plugin は astah-plugin-SDK-x.x\repository\com\change_vision\astah\astah-maven-plugin にあります。
ビルドが成功すると、targetフォルダが作成され、その中に[artifact id]-[version].jar
というファイルが作成されています。このファイルがプラグインファイルです。
続いて、このプラグインファイルを読み込んでastah*を起動します。
次のコマンドを実行しましょう。
> astah-launch
すると、プラグインが読み込まれた状態でastah*が起動します。
[ヘルプ]-[プラグイン一覧]メニューを見ると、次のようにテンプレートのプラグインが 読み込まれていることを確認できます。
また、[ツール]メニューの下部にメニューが追加されています。
IDEにプラグインプロジェクトをインポートする
astah* Plug-in SDKはMavenベースのツールです。しかし、実際のプラグイン開発では、astah* Plug-in
SDKのみで開発を進めるよりも、EclipseやIntelliJ IDEAなど、IDEと連携して開発する場合がほとんどでしょう。
ここでは、EclipseとIntelliJへのプラグインプロジェクトのインポート方法を解説します。お使いのIDEにインポートしてみましょう。
Eclipse
EclipseとMavenを連携させるm2eをインストールしておくと、Eclipse上からMavenのコマンドを実行できます。
Eclipseとm2eのインストール
Eclipseとm2eをインストールします。EclipseのサイトよりEclipse IDE for Java Developersをダウンロードしてください。このパッケージにはm2eが同梱されています。
astah* Plug-in SDKをEclipseのMAVEN_HOMEとして設定する
Eclipseを起動し、ワークスペースを選択後、astah* Plug-in
SDKをMAVEN_HOMEに設定します。
[Window]-[Preferences]を開き、[Maven]-[Installations]を選択します。下図のようにInstallationsに、astah*
Plug-in SDKのインストールフォルダ(ASDK_HOME)を追加してください。
これでEclipse上に読み込む準備ができました。Mavenのプロジェクトとしてインポートしてください。
IntelliJ IDEA
IntelliJ IDEAには標準でMavenとの連携機能が組み込まれています。
IntelliJ IDEAをダウンロード
IntelliJのサイトより、ダウンロードしてください。
初回起動時は、プロジェクトの新規作成ウィザードが立ち上がります。既にお使いの場合は「astah* Plug-in SDKをIntelliJ
IDEAのMAVEN_HOMEとして設定する」を行ってからプロジェクトをインポートしてください。
生成したプラグインプロジェクトをIntelliJ IDEAにインポート
生成したプラグインプロジェクトをインポートしましょう。通常の手順と同様のため、割愛します。不明点はIntelliJのヘルプをご参照ください。
astah* Plug-in SDKをIntelliJ IDEAのMAVEN_HOMEとして設定
astah* Plug-in SDKをIntelliJ
IDEAのMAVEN_HOMEとして設定しましょう。
IntelliJを起動後、[File]-[Settings]を開き、[Maven]を選択します。下図のように、Maven
home directoryのOverrideにチェックし、astah* Plug-in SDKのインストールフォルダ(ASDK_HOME)を指定してください。
これでクラスパスが設定されます。
メッセージを表示するメニューを作成する
astah*のプラグインを作成するには、astah*が提供する拡張ポイントの内容を<extension>タグのpoint属性でplugin.xmlに記述する必要があります。現時点で提供している拡張ポイントは以下の2つです。
Extension Point Name | Descrption |
com.change_vision.astah.ui.actionSets | astah*のメニューに独自メニューを追加 |
com.change_vision.astah.ui.view | astah*の拡張ビューに独自タブを追加 |
これから追加するのは、メニューです。下記はメニューを追加する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.helloworld.actionSet"> <menu id="helloworld" label="%menu_group" path="tool/helloworld"> </menu> <action label="%menu_label" icon="icons/sample.gif" class="com.example.actions.HelloWorldAction" tooltip="%menu_tooltip" menubarPath="tool/helloworld/" id="com.example.actions.HelloWorldAction"> </action> </actionSet> </extension> </plugin>
この例では<menu>タグを追加し 、[ツール]メニューに[サンプルメニュー]を追加しています。<action>タグでは、[サンプルメニュー]にHello
Worldプラグインのメニューを追加しています。
メニューの追加位置は、<menu>タグのpath属性と、<action>タグのmenubarPath属性で指定します。toolは[ツール]メニューのidで、<menu>タグのpath属性と、<action>タグのmenubarPath属性には各メニューのidを記述します。<menu>の中にpath属性とmenubarPath属性は、各メニューのidはastah* メニューID一覧を参照してください。
<actionSet>タグは各<action>タグをグループ化します。<action>タグのclass属性で、メニューが押されたときに呼ばれるアクションを定義します。
まとめると下記のようになります。
Tag Name | Attribute | Required | Description |
plugin | ○ | ||
extension | ○ | 拡張ポイントを指定します | |
point | ○ | com.change_vision.astah.ui.actionSetsを指定 | |
actionSet | ○ | メニューバーにメニューを追加するグループを指定します | |
label | (未使用) | ||
visible | (未使用) | ||
id | メニューグループのIDを指定します | ||
menu | グループメニューを追加します | ||
label | ○ | グループメニューのラベルを指定します | |
id | ○ | グループメニューのIDを指定します | |
path | ○ | 表示したい位置を指定します | |
action | メニューを追加します。 | ||
label | ○ | メニューのラベルを指定します | |
icon | (未使用) | ||
class | ○ | 押下した時のクラスを指定します | |
tooltip | (未使用) | ||
menubarPath | ○ | 表示したい位置を指定します | |
id | ○ | メニューのIDを指定します |
ラベルの国際化対応
<action>タグのlabel属性には”%menu_label”と記述されています。これは、ラベルの表示を国際化するための記法です。”menu_label”という文字列はキー名です。ラベルの内容は、plugin.propertiesとplugin_ja.propertiesに記述します。
plugin.properties:
menu_label=&Hello World
plugin_ja.properties:
menu_label=こんにちは、ワールド(&H)
日本語環境であればplugin_ja.propertiesから、”こんにちは、ワールド”という文字列がロードされます。それ以外の環境ではplugin.propertiesから”Hello World”という文字列がロードされます。
アクションを作成する
メニューバーにメニューを追加できました。これから”Hello World”のメッセージを表示するアクションを作成します。アクションはIPluginActionDelegateインタフェースを実装したクラスで定義します。
/* * パッケージ名は、生成したプラグインのパッケージ名よりも * 下に移してください。 * プラグインのパッケージ名=> com.example * com.change_vision.astah.extension.plugin => X * com.example => O * com.example.internal => O * learning => X */ package com.example.actions; import javax.swing.JOptionPane; import com.change_vision.jude.api.inf.ui.IPluginActionDelegate; import com.change_vision.jude.api.inf.ui.IWindow; public class HelloWorldAction implements IPluginActionDelegate { public Object run(IWindow window) throws UnExpectedException { try { JOptionPane.showMessageDialog(window.getParent(), "Hello World"); } catch (Exception e) { JOptionPane.showMessageDialog(window.getParent(), "Exception occured", "Alert", JOptionPane.ERROR_MESSAGE); throw new UnExpectedException(); } return null; }
IPluginActionDelegateインタフェースのrun()メソッドは、対応するastah*のメニューが押されたときに呼び出されます。例では[Hello World]メニューが押されたときに”Hello World”という文字列が書かれたダイアログを表示しています。実行中に発生するエラーはIPluginActionDelegateインタフェースの内部クラスUnExpectedExcetpionとして扱っています。