Eclipseプラグイン実践テクニック(4)

ビルド機能を応用してXML検証機能を作る



NTTデータ先端技術 竹添直樹
NTTデータ 基盤システム事業本部 岡本隆史
2006/12/9


ネイチャをプロジェクトに追加する

 最後に、作成したネイチャをプロジェクトに付与できるようにします。ここでは以下のように、プロジェクトのプロパティ・ページでネイチャの付与・除去を行えるようにしてみます。「XMLバリデーションを行う」にチェックを入れるとプロジェクトにネイチャが追加され、さらにネイチャによってビルダが追加されます。逆にチェックを外すと、ネイチャは削除されビルダも除去されます。

図2 プロパティ・ページ

 プロパティ・ページを追加するには、拡張ポイントorg.eclipse.ui.propertyPagesを使用します。plugin.xmlは以下のようになります。

リスト9 プロパティ・ページの定義
<extension
    point="org.eclipse.ui.propertyPages">
    <page
        adaptable="true"
        class="jp.sf.amateras.builder.XMLWorkbenchPropertyPage"
        id="jp.sf.amateras.builder.page"
        name="XML"
        objectClass="org.eclipse.core.resources.IProject"/>
</extension>

 class属性で指定しているXMLWorkbenchPropertyPageがプロパティ・ページです。実装は以下のとおりです。若干長めですが、処理そのものはチェックボックスのチェック状態に応じてネイチャの追加もしくは削除を行っているだけの単純なものです。

リスト10 XMLWorkbenchPropertyPage
public class XMLWorkbenchPropertyPage extends PropertyPage
implements IWorkbenchPropertyPage {
    private Button check;
    /** ユーザー・インターフェイスを作成 */
    protected Control createContents(Composite parent) {
        Composite composite = new Composite(parent, SWT.NULL);
        composite.setLayout(new GridLayout());
        composite.setLayoutData(
            new GridData(GridData.FILL_BOTH));
        check = new Button(composite, SWT.CHECK);
        check.setText("XMLバリデーションを行う");
        try {
            // 初期値をセット
            IProject project = (IProject)getElement();
            check.setSelection(project.hasNature(
                                        XMLNature.NATURE_ID));
        } catch(CoreException ex){
            ex.printStackTrace();
        }
        return composite;
    }
    /** OKボタンが押下された場合の処理 */
    public boolean performOk() {
        try {
            if(check.getSelection()){
                addNature();
            } else {
                removeNature();
            }
            return true;
        } catch(CoreException ex){
            ex.printStackTrace();
            return false;
        }
    }
    /** ネイチャを追加する */
    private void addNature() throws CoreException {
        IProject project = (IProject)getElement();
        IProjectDescription description =
            project.getDescription();
        String[] natures = description.getNatureIds();
        for (int i = 0; i < natures.length; ++i) {
            if (XMLNature.NATURE_ID.equals(natures[i])) {
                return;
            }
        }
        String[] newNatures = new String[natures.length + 1];
        System.arraycopy(natures, 0, newNatures
                                         , 0, natures.length);
        newNatures[natures.length] = XMLNature.NATURE_ID;
        description.setNatureIds(newNatures);
        project.setDescription(description, null);
    }
    /** ネイチャを削除する */
    private void removeNature() throws CoreException {
        IProject project = (IProject)getElement();
        IProjectDescription description =
            project.getDescription();
        String[] natures = description.getNatureIds();
        for (int i = 0; i < natures.length; ++i) {
            if (XMLNature.NATURE_ID.equals(natures[i])) {
                String[] newNatures =
                    new String[natures.length - 1];
                System.arraycopy(natures, 0, newNatures, 0, i);
                System.arraycopy(natures, i + 1, newNatures
                                 , i, natures.length - i - 1);
                description.setNatureIds(newNatures);
                project.setDescription(description, null);
                return;
            }
        }
    }
}

 以上で、ネイチャおよびビルダと、それを有効にするためのプロパティ・ページの実装は完了です。実際にネイチャを有効にして、XMLファイルのバリデーションが行われることを確認してみてください。

Eclipseの持つ機能を実践的に利用する

 今回で作成したサンプルはここからダウンロードすることができます。が、実はほぼ同じ機能を提供するプラグインがPDEPlug-in Development Environment、Eclipseのプラグインを作成するためのプラグイン開発環境)のテンプレート・ウィザードにも用意されていますので、そちらを見ていただいてもよいでしょう。

 冒頭でも述べたとおり、ビルダは実際にはビルド処理だけでなく、バリデーション処理に利用することもできます。インクリメンタル・ビルドによって利用者はストレスなく、リアルタイムに問題個所を把握することができます。

 また、エラーマーカリソース・マーカ)はプロジェクト・エクスプローラや問題ビューにも表示されるため見落とすこともありません。プログラム開発環境としてEclipseの持つ最も強力な機能の1つといってもよいと思います。利用機会は限られるかもしれませんが、使いやすいプラグインの開発に役立てていただければ、と思います。

 次回は、Eclipse上でPDEのマニフェスト・エディタのようなHTML風のGUIを実現するEclipse Formsを解説したいと思います。お楽しみに!

3/3

 INDEX
第4回 ビルド機能を応用してXML検証機能を作る
  Page1
XMLのバリデーションを行うビルダの実装
ネイチャについて
  Page2
ビルダの機能を応用してSAXパースする
Page3
ネイチャをプロジェクトに追加する
Eclipseの持つ機能を実践的に利用する


Java Solution全記事一覧



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

注目のテーマ

Java Agile 記事ランキング

本日 月間