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

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



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


XMLのバリデーションを行うビルダの実装

 Java開発環境としてEclipseを見た場合、ほかのIDEと比べて特に大きなメリットと呼べるのがインクリメンタル・ビルド機能です。これは、Javaソースコードを変更して保存すると、その場でコンパイルが行われ、エラーがあれば表示されるというものです。今回はこのインクリメンタル・ビルドの実現方法について解説したいと思います。

 なお、インクリメンタル・ビルドといっても、必ずしもビルドを行う必要はありません。これまでの連載でXMLエディタやXMLファイル生成用のウィザードを開発してきましたので、今回はXMLファイルのバリデーション検証)を行うビルダを作成してみることにします。

ネイチャについて

ネイチャとは何か?

 プロジェクトでビルダを有効にするためには、まずネイチャを作成する必要があります。ネイチャとはプロジェクトの属性の一種で、どのプラグインがそのプロジェクトを受け持つかを示すマークのようなものです。

 例えば、Javaプロジェクトは自身がJavaプロジェクトであることを示すためにJavaネイチャを持っていますし、プラグインプロジェクトはJavaネイチャに加えてプラグインネイチャを持っています。

 普段Eclipseを使っているだけだと、あまり意識する機会はないかもしれませんが、プラグインのルートフォルダにある「.project」というファイルを見ると、そのプロジェクトがどのネイチャを持っているかが分かります。

リスト1 .project
<?xml version="1.0" encoding="UTF-8"?>
    <projectDescription>
        <name>jp.sf.amateras.builder</name>
中略
        <natures>
            <nature>org.eclipse.pde.PluginNature</nature>
            <nature>org.eclipse.jdt.core.javanature</nature>
        </natures>
    </projectDescription>

ネイチャを作成してみよう

 ネイチャを定義するには、拡張ポイントorg.eclipse.core.resources.naturesを使用します。plugin.xmlは以下のようになります。

リスト2 ネイチャの定義
<extension
    id="XMLNature"
    name="XMLネイチャ"
    point="org.eclipse.core.resources.natures">
    <runtime>
        <run class="jp.sf.amateras.builder.XMLNature">
        </run>
    </runtime>
</extension>

 プロジェクトにネイチャが追加または削除される際に、run要素のclass属性で指定されているXMLNatureが呼び出されます。このクラスはorg.eclipse.core.resources.IProjectNatureインターフェイスを実装する必要があります。ソースコードは以下のようになります。

リスト3 XMLNature
public class XMLNature implements IProjectNature {
    public static final String NATURE_ID =             "jp.sf.amateras.builder.XMLNature";
    private IProject project;

    public void configure() throws CoreException { // … (1)
        // ビルダを追加
        IProjectDescription desc = project.getDescription();
        ICommand[] commands = desc.getBuildSpec();
        for (int i = 0; i < commands.length; ++i) {
            if (commands[i].getBuilderName().equals
                (XMLBuilder.BUILDER_ID)) {
                return;
            }
        }
        ICommand[] newCommands =
             new ICommand[commands.length + 1];
        System.arraycopy(commands, 0, newCommands
                         , 0, commands.length);
        ICommand command = desc.newCommand();
        command.setBuilderName(XMLBuilder.BUILDER_ID);
        newCommands[newCommands.length - 1] = command;
        desc.setBuildSpec(newCommands);
        project.setDescription(desc, null);
    }

    public void deconfigure() throws CoreException {// … (2)
        // ビルダを削除
        IProjectDescription description =             getProject().getDescription();
        ICommand[] commands = description.getBuildSpec();
        for (int i = 0; i < commands.length; ++i) {
            if (commands[i].getBuilderName().equals
                (XMLBuilder.BUILDER_ID)) {
                ICommand[] newCommands = new                     ICommand[commands.length - 1];
                System.arraycopy(commands, 0, newCommands
                                                 , 0, i);
                System.arraycopy(commands, i + 1
                , newCommands, i, commands.length - i - 1);
                description.setBuildSpec(newCommands);
                return;
            }
        }
    }

    public IProject getProject() {
        return this.project;
    }

    public void setProject(IProject project) {
        this.project = project;
    }
}

 (1)のconfigure()メソッドでビルダの追加(2)のdeconfigure()メソッドでビルダの削除を行っています。これらのメソッドは、それぞれネイチャの追加時、削除時に呼び出されます。

 
1/3

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



Java Solution全記事一覧



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

注目のテーマ

Java Agile 記事ランキング

本日 月間