独自のセレクターのプログラミング

セレクタープログラミングAPI

独自のセレクターを定義したいですか?簡単です!

まず、定義するセレクターのタイプを選択します。3つのタイプがあり、それぞれにレシピがあります。おそらく、最初のタイプであるカスタムセレクターを使用することになるでしょう。

  1. カスタムセレクター

    これは、Apache Antが独自のセレクターを定義するために特に提供しているカテゴリです。セレクターを使用したい場所ではどこでも、<custom>要素を使用し、その中にセレクターのクラス名を指定します。詳細は、セレクターページのカスタムセレクターセクションを参照してください。<custom>要素は、コアセレクターを使用できる場所であればどこでも使用できます。たとえば、セレクターコンテナ内に含めることができます。

    新しいカスタムセレクターを作成するには、org.apache.tools.ant.types.selectors.ExtendFileSelectorを実装するクラスを作成する必要があります。最も簡単な方法は、<param>タグのサポートに必要なすべてのメソッドを提供する便利なベースクラスorg.apache.tools.ant.types.selectors.BaseExtendSelectorを使用することです。まず、isSelected()メソッドをオーバーライドし、必要に応じてverifySettings()メソッドをオーバーライドします。カスタムセレクターでパラメーターを設定する必要がある場合は、setParameters()メソッドをオーバーライドし、渡されるパラメーターを好きなように解釈することもできます。コアセレクターのいくつかは、カスタムセレクターとしても使用できるため、その方法を示しています。

  2. コアセレクター

    これらは、Ant自体で使用されるセレクターです。これらのいずれかを実装するには、Ant内にあるクラスの一部を変更する必要があります。

  3. セレクターコンテナ

    新しいセレクターコンテナのアイデアがありますか?新しいものを作成するのは問題ありません

セレクターのテスト

堅牢なコンポーネント(そしてセレクターは(プロジェクト)コンポーネントです)のために、テストは必要です。タスクのテストには、JUnitテストとルール、より具体的にはorg.apache.tools.ant.BuildFileRule extends org.junit.rules.ExternalResourceを使用します。ビルドファイルを読み取って(テスト)プロジェクトを設定し、セレクターテストに必要なターゲットを実行するなど、その機能の一部も必要です。そのため、BuildFileRuleを使用します。しかし、セレクターのテストには、ファイルのセットを用意し、セレクターをインスタンス化して設定し、選択作業などをチェックするなど、さらに作業が必要です。通常はBaseExtendSelectorを拡張するため、その機能もテストする必要があります(例:setError())。

そのため、セレクターテストを行うためのテストルールがあります:org.apache.tools.ant.types.selectors.BaseSelectorRule

このクラスはExternalResourceを拡張するため、Antの単体テストのセットに含めることができます。事前に設定されたBuildFileRuleのインスタンスを保持します。設定は、src/etc/testcases/types/selectors.xmlを解析することによって行われます。BaseSelectorRuleは、複数の選択を処理するためのヘルパーメソッドを提供します。

「テストケース」または「テスト環境」という用語は非常に頻繁に使用されるため、この特別なテスト環境には新しい名前が付けられました:_bed_。bedのセットアップとクリーンアップはすべてBaseSelectorRuleによって処理されるため、テストは実際のテストシナリオのみを処理する必要があります

通常のテストシナリオは次のとおりです

  1. セレクターをインスタンス化する
  2. セレクターを設定する
  3. セレクターに何らかの作業をさせる
  4. 作業を確認する

テストの例は次のとおりです

package org.apache.tools.ant.types.selectors;

public class MySelectorTest {

    @Rule
    public final BaseSelectorRule selectorRule = new BaseSelectorRule();

    @Test
    public void testCase1() {

        // Configure the selector
        MySelector s = new MySelector();
        s.addParam("key1", "value1");
        s.addParam("key2", "value2");
        s.setXX(true);
        s.setYY("a value");

        // do the tests
        assertEquals("FTTTTTTTT", selectorRule.selectionString(s));
    }
}

JUnitがログに記録するエラーの例として

[junit]     FAILED
[junit] Error for files: .;copy.filterset.filtered;tar/gz/asf-logo.gif.tar.gz
[junit] expected:<FTTTFTTTF...> but was:<TTTTTTTTT...>
[junit] junit.framework.ComparisonFailure: Error for files: .;copy.filterset.filtered;tar/gz/asf-logo.gif.tar.gz
[junit] expected:<FTTTFTTTF...> but was:<TTTTTTTTT...>
[junit]     at junit.framework.Assert.assertEquals(Assert.java:81)
[junit]     at org.apache.tools.ant.types.selectors.BaseSelectorTest.performTest(BaseSelectorTest.java:194)

上記で説明したように、テストクラスはgetInstance()メソッドを提供する必要があります。しかし、ここでは使用されていません。使用されているgetSelector()メソッドは基底クラスに実装されており、Antプロジェクトのインスタンスをセレクターに提供します。これは通常、通常のビルドファイルの実行内で行われますが、この特別な環境内では行われないため、このメソッドにより、セレクターは独自のProjectオブジェクト(getProject())を使用できます(たとえば、ログ記録用)。

ログ記録

開発中、そしておそらく後で、情報の出力が必要になる場合があります。そのため、ログ記録が必要です。セレクターはBaseExtendSelectorまたは直接BaseSelectorを拡張するため、Ant DataTypeであり、したがってProjectComponentです。
つまり、プロジェクトオブジェクトとそのログ記録機能にアクセスできます。ProjectComponent自体は、プロジェクトインスタンスへのアクセスを行うlog()メソッドを提供します。したがって、ログ記録は次のように簡単に行われます

log("message");

または

log("message", loglevel);

ここで、`loglevel`は次の値のいずれかです