独自のセレクターを定義したいですか?簡単です!
まず、定義するセレクターのタイプを選択します。3つのタイプがあり、それぞれにレシピがあります。おそらく、最初のタイプであるカスタムセレクターを使用することになるでしょう。
これは、Apache Antが独自のセレクターを定義するために特に提供しているカテゴリです。セレクターを使用したい場所ではどこでも、<custom>
要素を使用し、その中にセレクターのクラス名を指定します。詳細は、セレクターページのカスタムセレクターセクションを参照してください。<custom>
要素は、コアセレクターを使用できる場所であればどこでも使用できます。たとえば、セレクターコンテナ内に含めることができます。
新しいカスタムセレクターを作成するには、org.apache.tools.ant.types.selectors.ExtendFileSelector
を実装するクラスを作成する必要があります。最も簡単な方法は、<param>
タグのサポートに必要なすべてのメソッドを提供する便利なベースクラスorg.apache.tools.ant.types.selectors.BaseExtendSelector
を使用することです。まず、isSelected()
メソッドをオーバーライドし、必要に応じてverifySettings()
メソッドをオーバーライドします。カスタムセレクターでパラメーターを設定する必要がある場合は、setParameters()
メソッドをオーバーライドし、渡されるパラメーターを好きなように解釈することもできます。コアセレクターのいくつかは、カスタムセレクターとしても使用できるため、その方法を示しています。
これらは、Ant自体で使用されるセレクターです。これらのいずれかを実装するには、Ant内にあるクラスの一部を変更する必要があります。
まず、org.apache.tools.ant.types.selectors.FileSelector
を実装するクラスを作成します。すべてのメソッドを最初から自分で実装するか、多くのメソッドに妥当なデフォルトの動作を提供する便利なクラスであるorg.apache.tools.ant.types.selectors.BaseSelector
を拡張することができます。
必要なメソッドは1つだけです。public boolean isSelected(File basedir, String filename, File file)
は、この作業全体の真の目的です。指定されたファイルがリストから選択されるべきかどうかによって、「true」または「false」を返します。
org.apache.tools.ant.types.selectors.BaseSelector
を使用している場合は、利用できる定義済みの動作もいくつかあります。属性の設定やタグの追加で問題が発生した場合は、setError(String errmsg)
を呼び出すと、クラスは問題があることを認識します。次に、isSelected()
メソッドの先頭でvalidate()
を呼び出すと、エラーメッセージの内容を含むBuildException
がスローされます。validate()
メソッドは、verifySettings()
を呼び出すため、設定の整合性をチェックする最後の機会も提供します。このメソッドをオーバーライドし、セレクターの設定方法に問題が見つかった場合は、その中でsetError()
を呼び出します。
toString()
もオーバーライドすることをお勧めします。
org.apache.tools.ant.types.selectors.SelectorContainer
にセレクターのadd()
メソッドを配置します。これはインターフェースであるため、それを実装するクラス、つまりorg.apache.tools.ant.types.AbstractFileSet
、org.apache.tools.ant.taskdefs.MatchingTask
、およびorg.apache.tools.ant.types.selectors.BaseSelectorContainer
にもメソッドの実装を追加する必要があります。そこに配置されると、コアセレクターが適切な場所であればどこでも使用できるようになります。新しいセレクターコンテナのアイデアがありますか?新しいものを作成するのは問題ありません
org.apache.tools.ant.types.selectors.SelectorContainer
を実装する新しいクラスを作成します。これにより、新しいコンテナは今後登場する新しいセレクターにアクセスできるようになります。ここでも、org.apache.tools.ant.types.selectors.BaseSelectorContainer
という便利なクラスが利用できます。public boolean isSelected(String filename, File file)
メソッドを実装します。おそらく、配下のセレクターを反復処理したいので、それを行うイテレーターを取得するためにselectorElements()
を使用します。org.apache.tools.ant.types.selectors.SelectorContainer
とその実装であるorg.apache.tools.ant.types.AbstractFileSet
とorg.apache.tools.ant.types.selectors.BaseSelectorContainer
にコンテナのadd()
メソッドを配置します。堅牢なコンポーネント(そしてセレクターは(プロジェクト)コンポーネントです)のために、テストは必要です。タスクのテストには、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によって処理されるため、テストは実際のテストシナリオのみを処理する必要があります
通常のテストシナリオは次のとおりです
テストの例は次のとおりです
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`は次の値のいずれかです
org.apache.tools.ant.Project.MSG_ERR
org.apache.tools.ant.Project.MSG_WARN
org.apache.tools.ant.Project.MSG_INFO
(デフォルト)org.apache.tools.ant.Project.MSG_VERBOSE
org.apache.tools.ant.Project.MSG_DEBUG