最終回 プラグインを配布してみんなに使ってもらおう


萩原 巧
リトルソフト株式会社
2006/12/13



 HSQLDB100%PureJavaのリレーショナルDBの1つ)の管理画面を実装した田中君。いよいよHSQLDBを起動する部分の実装をおこない、HSQLDBプラグインを完成させ、さらには完成したHSQLDBプラグインの配布イメージを作成します。

編集部注:HSQLDBプラグインの概要については、連載第3回ご覧ください。
HSQLDB起動、停止ダイアログの作成

長尾君 「まずは、HSQLDB起動ダイアログとHSQLDB停止ダイアログを作成しよう」
田中君 「そういえば、この2つのダイアログって、以前作成したHSQLDB設定画面に似ているね」

HSQLDB設定画面(作成済み)

長尾君 「田中君の指摘のとおり、HSQLDB起動ダイアログとHSQLDB停止ダイアログの2つは、HSQLDB設定画面前回作成した[HSQLPreferencePageComposite]クラス)を再利用することによって、簡単に作成することができるんだ」
田中君 「コンポーネント(クラス)の再利用なんて、なんだかとてもオブジェクト指向らしいアプローチだね。さすが、長尾君っ!」
長尾君 「早速、2つのダイアログを作成しよう。HSQLDB起動、停止ダイアログの見た目はタイトル文字を除いてすべて同じだよね。だから、実質的には1つのダイアログでHSQLDBの起動と停止を行うことができるようにする、と考えて実装しよう」
田中君 見た目がほとんど同じなのに、ダイアログのクラスをたくさん作成するのは分かりづらいし、保守性も悪くなりがちだよね

 ダイアログクラスを作成します。以下のように設定してください。

項目名称 内容
パッケージ hsqldb.dlgs] と設定してください
名前(クラス名) HSQLActionDialog]と設定してください
スーパークラス org.eclipse.jface.dialogs.Dialog]と設定してください(Dialogクラスについては、第5回目のコラム[ダイアログとは]をご覧ください)

長尾君 org.eclipse.jface.dialogs.Dialogを継承したクラスは以前(連載5回目)に作成したから、ダイアログの概要は理解できるよね。それでは、以下のソースを記述しよう」

HSQLActionDialog クラス
public class HSQLActionDialog extends Dialog{

    private HSQLPreferencePageComposite page = null;  // (1)
    private String dbName = "";
    private String dbPath = "";
    private String dbPort = "";
    private String title = "";

    public HSQLActionDialog(Shell parent, String title) {
        super(parent);
        this.title = title;
    }

    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(title);
    }

    protected Control createDialogArea(Composite parent) {
        super.createDialogArea(parent);
        page = new HSQLPreferencePageComposite(parent
                               ,SWT.EMBEDDED , this); // (2)
        page.setPreferenceStore(HSQLDBPlugin.getDefault()
                             .getPreferenceStore());  // (3)
        page.doLoad();                                // (4)
        return page;
    }

    protected Point getInitialSize() {
        return new Point(445,325);
    }

    protected void buttonPressed(int buttonId) {      // (5)
        if (buttonId == IDialogConstants.OK_ID) {
            int idx
                = page.getListDBList().getSelectionIndex();
            if (idx<0) return;
            dbName = page.getDBName(idx);
            dbPath = page.getDBPath(idx);
            dbPort = page.getDBPort(idx);
        }
        super.buttonPressed(buttonId);
    }

    public String getDBName() {                       // (6)
        return dbName;
    }

    public String getDBPath() {
        return dbPath;
    }

    public String getDBPort() {
        return dbPort;
    }
}

 (1):HSQLDB設定画面の見た目(コンポジット)である[HSQLPreferencePageComposite]クラスのフィールドを宣言します。

 (2):createDialogAreaメソッドにて、HSQLPreferencePageCompositeのインスタンスを生成しますが、コンストラクタの第3引数に自分自身(this)を設定するとともに、HSQLPreferencePageCompositeクラスのコンストラクタを追加します。以下のコンストラクタを追加してください。

HSQLPreferencePageComposite クラスの追加コンストラクタ
    public HSQLPreferencePageComposite(Composite parent
                                      , int style
                                      , Object parentObj) {
        super(parent, style);
        initialize();
        if (parentObj.getClass() == HSQLActionDialog.class){
            setSize(
             new org.eclipse.swt.graphics.Point(445,257));
            listDBList.setBounds(
                new org.eclipse.swt.graphics.Rectangle(
                                             4,24,160,227));
            buttonAdd.setBounds(
                new org.eclipse.swt.graphics.Rectangle(
                                             301,229,69,22));
            buttonRemove.setBounds(
                new org.eclipse.swt.graphics.Rectangle(
                                             371,229,65,22));
            buttonAdd.setVisible(false);
            buttonRemove.setVisible(false);
            editMode = false;
        }
    }

 新たに作成したコンストラクタでは、第3引数のクラスが[HSQLActionDialog]か確認を行い、その場合は、コンポジットのサイズを小さくする(setSize(…))とともに、[追加][削除]ボタンの非表示化(setVisible(false))等を行います。

 (3):当プラグインのプリファレンスストアを取得し、その内容をHSQLPreferencePageCompositeクラスに設定を行い、HSQLDBの各種設定情報をロードできるようにします。

 (4):Loadメソッドにて、プリファレンスストアの内容をHSQLPreferencePageCompositeクラスに展開を行います。

 (5):buttonPressedをオーバーライドして、ダイアログの[OK][キャンセル]ボタンがクリックされたときの処理を記述します。引数のbuttonIdがIDialogConstants.OK_ID([OK]ボタンがクリックされたことを示す)ならば、HSQLPreferencePageCompositeクラスのゲッターメソッドを実行して、HSQLDBの各種値を取得します。

 (6):HSQLDBの各種値のゲッターメソッドです。DB名称、DBパス、DBポートそれぞれのゲッターを作成します。

田中君 「HSQLActionDialogクラスのソースは、前に作成したHSQLAddDefinitionDialogクラスと同じメソッドを使っている部分が多いね」
長尾君 「そうだね、これはconfigureShellメソッドをはじめとして、親クラスのメソッドのオーバーライドや親クラスで定義された抽象メソッドの実装をする部分が多いから、結果として同じメソッドを使用している部分が多くなるんだ。このように、プラグイン開発では文字通り、あらかじめ定義されたメソッド(プラグ)に実装(イン)するということがとても多いんだ。だから、クラスのAPIドキュメントを積極的に読んで、メソッドやクラスの仕様を理解するとプログラムが速く進むよ」
田中君 「了解です」
長尾君 「ダイアログの作成はこれで終了だよ。見た目の部分(HSQLPreferencePageComposite)はすでに作成してあったから、つなぎ合わせるだけだったね」

HSQLDB起動、停止ダイアログの表示

長尾君 「続いては、Eclipseのメニューボタンがクリックされたら、作成したHSQLActionDialogが表示される処理を記述しよう」

メニューをクリックするとHSQLDB起動ダイアログが表示される

田中君 「Eclipseのメニューは以前追加したから、クリック以降の処理を書くんだね」
長尾君 「以前作成した[HSQLStartAction]にある[run]メソッド(runメソッドはボタンがクリックされたときに実行されます)に以下の処理を追加しよう」

    public void run(IAction action) {
        try{
            final HSQLActionDialog dlg
                 = new HSQLActionDialog(null
                         ,"HSQLDB 起動ダイアログ");   // (1)
            if (dlg.open() == Dialog.OK){             // (2)
                System.out.println("OKがクリックされた");
            }
        } catch(Exception e){                         // (3)
            MessageDialog.openInformation(null,"HSQLDBPlugin",
                "HSQLDB 起動処理中にエラーが発生しました。\n"
                     + e.getMessage());
        }
    }

 (1):HSQLDB起動ダイアログのインスタンス化を行います、第2引数にはこの画面のタイトル「HSQLDB起動ダイアログ」を設定します。

 (2):5回目の連載で作成した「HSQLDB新規追加ダイアログ」と同じように、ダイアログのOKボタンがクリックされたときの処理を記述します。本来はOKボタンがクリックされたら、HSQLDB起動処理が実行されるのですが、まだ実装していないので、仮の処理(コンソール出力)を実装します。

 (3):runメソッド内で何らかの例外が発生した場合に備え、例外を捕捉する処理を実装します。

長尾君 「この処理自体はいまの田中君には簡単だね。この処理はHSQLDB起動ダイアログの表示だけど、続いて、HSQLDB停止ダイアログ表示処理を実装しよう。内容としては、HSQLDB起動ダイアログ表示処理と同様だ。[HSQLStopAction]にある[run]メソッド([run]メソッドはボタンがクリックされたときに実行されます)に以下の処理を追加しよう」

    public void run(IAction action) {
        try{
            final HSQLActionDialog dlg
                = new HSQLActionDialog(null
                     ,"HSQLDB 停止ダイアログ");       // (1)
            if (dlg.open() == Dialog.OK){
                System.out.println("OKがクリックされた");
            }
        } catch(Exception e){
            MessageDialog.openInformation( null,"HSQLDBPlugin"
                ,"HSQLDB 停止処理中にエラーが発生しました。\n"
                    + e.getMessage());
        }
    }

 (1):HSQLDB停止ダイアログのインスタンス化を行います。HSQLDB起動ダイアログと同じように実装を行います。第2引数にはこの画面のタイトル「HSQLDB停止ダイアログ」を設定します。

筆者注:HSQLDB起動、停止ダイアログの実装は、分かりやすさを重視したので、あえて冗長なソースになっています。ダウンロードできるサンプルソースでは、抽象クラスを使用し、冗長な構成を避けて実装しています。興味がある方はぜひご覧ください。
長尾君 「ここまで実装したら、HSQLDB起動、停止ダイアログが表示されるか確認を行おう」

  田中君は、HSQLDB起動、停止ダイアログの表示確認を行った。

HSQLDB起動、停止ダイアログの表示確認

田中君 「ちゃんとダイアログが表示できたね」

HSQLDatabaseManager起動処理の作成

長尾君 「HSQLDB起動、停止ダイアログの表示ができたら続いて、HSQLDatabaseManagerの起動処理を実装するけど、この処理はすごく簡単だよ。HSQLDB起動、停止ダイアログと同じように、[HSQLDatabaseManagerAction]にある[run]メソッド([run]メソッドはボタンがクリックされたときに実行されます)に以下の処理を追加しよう」
編集部注HSQLDatabaseManagerを起動するにはHSQLDBライブラリ「hsqldb.jar」が必要です。このライブラリを、プラグインプロジェクトのライブラリパスに追加してください。hsqldb.jar はHSQLDBのページから取得できます。
    public void run(IAction action) {
        org.hsqldb.util.DatabaseManager manager
            = new org.hsqldb.util.DatabaseManager();
        manager.main();                             // (1)
    }

 (1):HSQLDatabaseManagerのクラスである[org.hsqldb.util.DatabaseManager]のインスタンス化を行い、mainメソッドを実行します。

田中君 「これだけ?」
長尾君 「うん、これだけだよ。この処理によって、EclipseからHSQLDatabaseManagerを起動することができるようになるんだ。早速、起動を確認してみよう!」

HSQLDatabaseManagerの起動を確認

田中君 「起動できたね。ここまでできれば、次はいよいよ……」
長尾君 「HSQLDBの起動処理の実装だ!」

1/3

Index
第6回 プラグインを配布してみんなに使ってもらおう
Page1
HSQLDB起動、停止ダイアログの作成
HSQLDB起動、停止ダイアログの表示
HSQLDatabaseManager起動処理の作成
  Page2
HSQLDBを起動するために必須プラグインを使う
HSQLDB起動、停止メソッドの作成
  Page3
作ったプラグインをみんなに配布しよう!
おわりに ― プラグインを自作する意義とは? ―



Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間