Eclipseプラグインを作ってみよう!

第11回 YAMLファイルの読み書き

この記事を読むのに必要な時間:およそ 4.5 分

JYamlの設定

これまでの実装で通常のエディターと同様の動きをするようになったので,いよいよYAMLファイルの読み書きを実装しましょう。この機能を実現するために今回はJYamlを使用します。JYamlはJavaオブジェクトまたはListやMapなどのCollection系オブジェクトとYAMLドキュメントを相互変換するためのライブラリです。今回は2008年3月12日現在の最新バージョンである1.3を使用します。

ライブラリの配置

今回は,プラグインプロジェクト以下にlibsフォルダーを作成し,その下にライブラリを配置することにします。

ビルド・パスへの追加

次にJYamlを使ったコードをコンパイルできるようにするためにjyaml-1.3.jarをビルド・パスに追加します。

jyaml-1.3.jarをビルド・パスに追加する

jyaml-1.3.jarをビルド・パスに追加する

プラグインの設定

最後にプラグイン独自の設定を行います。まずplugin.xmlを開いて,⁠ラインタイム」タブの「クラスパス」にjyaml-1.3.jarを追加します。

「クラスパス」にjyaml-1.3.jarを追加する

「クラスパス」にjyaml-1.3.jarを追加する

次にリリースしたときのことを考慮してバイナリー・ビルドにjyaml-1.3.jarを含むようにします。⁠ビルド」タブの「バイナリー・ビルド」でlibsフォルダーにチェックを入れます。

「バイナリー・ビルド」にjyaml-1.3.jarを追加する

「バイナリー・ビルド」にjyaml-1.3.jarを追加する

YAMLファイルの読み書き

それではYAMLファイルの読み書きを実装します。まず,この機能をどこに実装するかを考えてみましょう。当初私は,FormDesignerEditorクラスに実装することを考えていました。しかしFieldオブジェクトのデータはテーブルビューアーが管理しているので,YAMLファイルへの読み書きはテーブルビューアーを生成・管理している FieldsMasterSelectionPartクラスに実装することにします。

YAMLファイルの書き込み

「保管」コマンドが実行されると,FormDesignerEditorクラスのdoSave()メソッドが実行されます。先ほども解説したように, doSave()メソッドで実行しているcommitPages()メソッドは保持しているIFormPageオブジェクトや IManagedFormオブジェクトに対してcommit()メソッドを呼び出していきます。そこでFieldsMasterSelectionPartクラスのcommit()メソッドをオーバーライドし,そこでYAMLファイルの書き込みを行うようにします。

FieldsMasterSectionPartクラスのcommit()メソッド

public class FieldsMasterSectionPart extends SectionPart implements IPartSelectionListener {
    ...
    @Override
    public void commit(boolean onSave) {
        super.commit(onSave);

        if (!onSave) {
            return;
        }

        assert (!(getManagedForm().getInput() instanceof IFileEditorInput));

        try {
            ((IFileEditorInput) getManagedForm().getInput()).getFile().setContents(
                    new ByteArrayInputStream(
                            formatYAMLString(getYAML()).getBytes("UTF-8")),  //$NON-NLS-1$
                    true,
                    false,
                    null);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }
    ...
}

変更状態をリセットするためにスーパークラスのcommit()メソッドを呼び出します。そのあとonSaveがtrueの場合にYAMLファイルへの書き込み処理を実行します。JYamlを使ったYAMLの文字列の生成部分はgetYAML()メソッドで実装しています。

保管されたYAMLファイル

- name: name
  description: 名前
  required:
    message: 名前は必須です。
- name: email
  description: メールアドレス
  required:
    message: メールアドレスは必須です。
  validator:
    - name: Email
      rule:
        allowDotBeforeAtmark: true
      message:
    - name: Compare
      rule:
        to: email2
      message: 確認用メールアドレスと一致しません。
- name: email2
  description: 確認用メールアドレス
  required:
    message: 確認用メールアドレスは必須です。

著者プロフィール

松藤秀治(まつふじひではる)

Piece Frameworkのプログラマー。担当はEclipseのプラグインとして開発されているPiece Frameworkの統合開発環境Piece_IDE。2007年5月に株式会社アイテマンを設立。