第5回 HSQLDBプラグインを動かしてみよう

萩原 巧
リトルソフト株式会社
2006/11/18


入力情報をEclipseに保存

 HSQLDBの情報入力ができるようになった田中君、このページでは、入力した情報をEclipseに保存するロジックの実装を行う。

長尾君 「以前(注:3回目の連載)に、プラグインで設定した内容はプリファレンスストア(PreferenceStore)と呼ばれる領域に保存されると説明したけど、覚えているかな?」
田中君 「うん、覚えているよ」
長尾君 「ここからは、入力した各種HSQLDBの情報をプリファレンスストアに保存する処理を説明するよ」

・プリファレンスストアの定義

長尾君 「まずは、HSQLPreferencePageCompositeクラスに、プリファレンスストアの定義とセッター、ゲッターメソッドを追加しよう。これはプラグインクラス(HSQLDBPluginクラス)のgetPreferenceStore()メソッドで取得したプリファレンスストアをHSQLPreferencePageCompositeクラスで使用できるようにするために必要なんだ」

HSQLPreferencePageCompositeクラスにプリファレンスストアを追加
private IPreferenceStore preferenceStore = null;

// …略…

public void setPreferenceStore(
                IPreferenceStore preferenceStore){
    this.preferenceStore = preferenceStore;
}

public IPreferenceStore getPreferenceStore(){
    return preferenceStore;
}

・プリファレンスストアの受け渡しと保存

長尾君 「続いて、プラグインクラス(HSQLDBPluginクラス)のプリファレンスストアをHSQLPreferencePageCompositeクラスに定義したプリファレンスストアに渡す部分は以下のソースコードになるよ。HSQLPreferencePageクラスのcreateContentsメソッドに以下の2行を追加しよう」

HSQLPreferencePageクラスのcreateContentsメソッドに2行追加
protected Control createContents(Composite parent) {
    page = new HSQLPreferencePageComposite(
                                 parent,SWT.EMBEDDED);
    page.setPreferenceStore(
                     getPreferenceStore()); // 追加(1)
    page.doLoad();                          // 追加(2)
    return page;
}

田中君 「HSQLPreferencePageCompositeクラスに、プリファレンスストアを設定している (1)けれど、doLoadメソッドは(2)まだ作成していないよね」
長尾君 「doLoadメソッドについては、後ほど説明するよ。説明が多くなってしまうけど次は、設定画面の[適用]ボタンや[OK]ボタンがクリックされたらプリファレンスストアに保存する処理を実装しよう。この処理はHSQLPreferencePageクラスのperformOkメソッドをオーバーライドするよ」

[適用]や[OK]ボタンがクリックされたら、プリファレンスストアに保存する

HSQLPreferencePageクラスのperformOkメソッドをオーバーライド
public boolean performOk() {
    page.doStore();                                    //(1)
    HSQLDBPlugin.getDefault().savePluginPreferences(); //(2)
    return true;
}

長尾君 「(2)では、[HSQLDBPlugin]クラスのスタティックメソッドの[getDefault]を実行することによって、プラグインのインスタンスを取得し、[savePluginPreferences]メソッドで、プリファレンスストアの内容を保存するんだ」
田中君 「(2)の処理の前に実行するdoStoreメソッド(1)はどのような処理なの?」
長尾君 「doStoreメソッドは、HSQLDB設定画面で登録した内容をプリファレンスストアに登録する処理。さっき出てきた、doLoadメソッドはdoStoreとは逆に、プリファレンスストアの内容をHSQLDB設定画面に読み込む処理だ。実際のソースを見ながら説明しよう」

HSQLPreferencePageComposite クラス doStore メソッド
public void doStore() {
    String dbName = "";
    String dbPath = "";
    String dbPort = "";

    // listDBListが保持しているデータを取得して
    // セミコロン区切り文字列を生成する
    for (int i=0;i<listDBList.getItemCount();i++){
        // データベース名称、パス、ポートをセミコロンで
        // 連結します。例:C\:\\database\\plugin_db
        dbName += (getDBName(i) + ";");
        dbPath += (getDBPath(i) + ";");
        dbPort += (getDBPort(i) + ";");
    }

    // 生成した文字列をプリファレンスストアに設定
    getPreferenceStore().setValue("DBName", dbName); //(1)
    getPreferenceStore().setValue("DBPath", dbPath);
    getPreferenceStore().setValue("DBPort", dbPort);
}

長尾君 「プリファレンスストアの[setValue]メソッド(1)では、第1引数に名称、第2引数には値を設定しよう。第2引数に設定した値がプリファレンスストアに設定されるんだ。このプラグインで管理を行う、データベース名称、データベースパス、データベースポート3つのセミコロン区切り文字列を登録しよう」

コラム プリファレンスストア登録イメージ
HSQLPreferencePageCompositeクラスのdoStoreメソッドで設定した値は、[workspace\.metadata\plugins\org.eclipse.core.runtime\.settings]フォルダのプラグインID.prefsというファイルに、以下のようなイメージで保存されます。

<イメージ例>
DBPath= C\:\\database\\plugin_db;C\:\\database\\test_db; ←セミコロン区切り文字列
DBPort=9001;9002;
DBName=plugin_db;test_db;

HSQLPreferencePageComposite クラス doLoad メソッド
public void doLoad() {
    // プリファレンスストアの内容を取得して
    // 文字列の配列にパースします
    String[] dbNameArray = parseString(
        getPreferenceStore().getString("DBName")); //(1)
    String[] dbPathArray = parseString(
        getPreferenceStore().getString("DBPath"));
    String[] dbPortArray = parseString(
        getPreferenceStore().getString("DBPort"));

    for (int i = 0; i < dbNameArray.length; i++) {
        // HSQLDBConnectDefinitionをインスタンス化して、
        // listDBListに設定します
        HSQLDBConnectDefinition dbDef
        = new HSQLDBConnectDefinition(dbNameArray[i]
            ,dbPathArray[i],dbPortArray[i]);
        listDBList.setData(dbNameArray[i],dbDef);
        listDBList.add(dbNameArray[i]);
    }

    if (listDBList.getItemCount() > 0){
        // 先頭のDB情報を選択状態にします
        listDBList.select(0);
        // 先頭のDB情報をテキストボックスに表示させます
        setupDefinitionInputText(0);
    }
}

//(2)セミコロン区切り文字列を文字列の配列にパースします
private String[] parseString(String parseString) {
    StringTokenizer st
    = new StringTokenizer(parseString, ";");
    ArrayList list = new ArrayList();
    while (st.hasMoreTokens()) {
        list.add(st.nextToken());
    }
    return (String[])list.toArray(new String[list.size()]);
}

長尾君 「プリファレンスストアの[getValue]メソッド(1)では、プリファレンスストアに登録されているデータベース名称、データベースパス、データベースポートの値を取得できるんだ。その値はセミコロン区切り文字列なので、[parseString]メソッド(2)にて、文字列の配列に変換するんだ。セミコロン区切り文字列から変換した文字配列を使用して、listDBListに値を設定することによって、プリファレンスストアに登録された値が表示される仕組みになるんだ」
田中君 「プリファレンスストアを活用して、入力したHSQLDBの情報が登録される仕組みは分かったよ。これらの値は、Eclipseを再起動しても保持されているんだよね?」
長尾君 「これらの値はファイル(上記コラム:プリファレンスストア登録イメージをご覧ください)に保存されるので、Eclipseを再起動しても消えることはないよ。安心して。これでHSQLDBの情報管理部分の実装は完成したから、ここで動作の確認を行ってみよう」
田中君 「はーい」

今回の実装の動作確認と最終回予告

 田中君は、プラグインの動作確認を行った。

  • HSQLDB情報の登録
  • HSQLDB情報の削除
  • Eclipseを再起動しても登録した値が保持されている

 以上のすべて正常に動作することを確認して長尾君に報告した。

田中君 「長尾君、すべての動作を確認したよ。すごいね。僕がここまでできちゃったよ。いよいよこの後は……」
長尾君 「HSQLDBの起動処理だ」
田中君 「そうだね。あと少し、頑張るぞー!」

 と、いうことでHSQLDBの管理部分の実装をすべて終了した田中君、次回はいよいよ最終回。登録したHSQLDBの各種情報を基にHSQLDBを起動したり、停止させる処理やHSQLDBデータベースマネージャを起動する処理の実装を行います。

 なお、今回作成したソースコードはココからダウンロードできます。このソースには、入力チェックをはじめとする今回説明し切れなかった部分も含まれています。実際のソースを俯瞰(ふかん)して、より理解を深めていっていただければ幸いです。

 次回、最終回もお楽しみに!

3/3

Index
第5回 HSQLDBプラグインを動かしてみよう
  Page1
HSQLDB情報画面の処理実装の概要
新規追加ダイアログの作成
追加ボタンのクリックイベントの実装とダイアログの表示
  Page2
追加した情報を反映
削除ボタンの処理を実装
Page3
入力情報をEclipseに保存
今回の実装の動作確認と最終回予告



Java Solution全記事一覧



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

注目のテーマ

Java Agile 記事ランキング

本日 月間