本ページではメニューの追加を例に、astah*のプラグイン開発を紹介します。


プラグインプロジェクトの新規作成

プラグインプロジェクトを新規作成します。プラグインプロジェクトを作成したいディレクトリへ移動し、次のコマンドを入力しましょう。

注意
プロジェクトのフォルダはスペースを含まないフォルダにするようにしてください。


astah* professional、UML、System Safetyの場合
> astah-generate-project

astah* SysMLの場合
> astah-sysml-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

ビルドが成功すると、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として扱っています。