本ページではメニューの追加を例に、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

Note
ASDKを新しいバージョンに更新した場合、pom.xml をテキストエディタで開き、astah-maven-plugin のバージョンがASDKに同梱されたものと合っているか確認しましょう。
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が同梱されています。

Note
Eclipseはパッケージを解凍するだけでインストールでき、既存の開発環境に影響を与えません。本チュートリアルの実施にはこちらのパッケージをお勧めします。もちろん既存環境にm2eをインストールしてastah*プラグインを開発することもできます。既存環境へのインストールは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のプロジェクトとしてインポートしてください。

Note
インストール中、Connectorのインストールを勧める画面が表示される事があります。このConnectorは、astah*プラグイン開発に必要なものなので、インストールしてください。



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として扱っています。