セレクターをプログラムする

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

独自のセレクターを定義する事に興味がありますか? 簡単に可能です!

まず、あなたが定義したいセレクターの型を決めます。 型には3種類あり、それぞれに定義方法は下記になります。 最初にカスタムセレクターを紹介しましょう。

  1. カスタムセレクター

    カスタムセレクターは独自のセレクターを定義するためにAntが提供するカテゴリーです。 独自のセレクターを定義する場合、<custom> 要素を使用し、 その中にそのセレクターのクラス名を指定します。 詳細はセレクターのページのカスタムセレクターの章を見てください。 <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 TestCasesを使用しています。−詳しくはorg.apache.tools.ant.BuildFileTest extends junit.framework.TestCase。 これに含まれる機能はビルドファイルを基にしたテストプロジェクトの作成し、セレクターのテストに必要な目標を実行します。 この作業には、BuildFileTestという機能を使用します。セレクターのテストにはさらに別の作業:ファイルセットの準備、セレクターのインスタンス化、 セレクターの作成、結果のチェックなども必要です。また、BaseExtendSelectorの拡張を通常行うため、 これらをテストする事も必要です。(e.g. setError())

上記の理由により、セレクターのテストにはベースクラスが必要です。org.apache.tools.ant.types.selectors.BaseSelectorTest.

このクラスはTestCaseを拡張し、Antエsユニットテストに含むことが出来ます。 これはプレコンフィギュアされたBuildFileTestを保持します。 コンフィギュレーションはsrc/etc/testcases/types/selectors.xmlの解析により行われます。 BaseSelectorTestは、多数の選択を扱う、役に立つメソッドを提供します。

"テストケース”や"テスト環境”といった文言は頻繁に使用されているため、このスペシャルなテスト環境には、bedという新しい名前を付けました。 テスト環境を初期化するのにはsetUp()メソッドを、削除するにはtearDown()メソッドを使用するように、(寝る前にベットメイキングをするように)、このbedに対してはmakeBed()cleanupBed()を使用します。

一般的なテストシナリオ

  1. ベットの準備
  2. セレクターをインスタンス化
  3. セレクター作成
  4. セレクターを動かす
  5. 結果を検証
  6. ベッドを片付ける

インスタンス化の一般的な方法では、あなたの作成したセレクターのオブジェクトを戻して、getInstance()をオーバーライドしなければなりません。 選択と検証の作業の簡素化のために、BaseSelectorTestはperformTests()というメソッドを提供します。 これは文字型配列filenamesの中でファイル(またディレクトリー)を反復し、与えられたセレクターが予期した結果を返すかどうかチェックします。 もしエラーが起きた場合は(特にセレクターが望んだ値を返さない場合)、テストが失敗となり、失敗したファイル名がログに残ります。

テストの例:

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

public class MySelectorTest extends BaseSelectorTest {

    public MySelectorTest(String name) {
        super(name);
    }

    public BaseSelector getInstance() {
        return new MySelector();
    }

    public void testCase1() {
        try {
            // initialize test environment 'bed'
            makeBed();

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

            // do the tests
            performTests(s, "FTTTTTTTTTTT");  // First is not selected - rest is

        } finally {
            // cleanup the environment
            cleanupBed();
        }
    }
}
    
エラー発生例: 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プロジェクトのインスタンスを渡します。これは通常はビルドファイルの実行の中で行われますが、この特別な環境の中では行われません。 従って、このメソッドはセレクターに自分用のプロジェクトオブジェクトを使用できる能力を与えます(getProject())。 例としてはロギング機能などです。

ロギング

開発中、または開発後、アウトプット情報が必要となる時があるでしょう。 そこでロギングが必要となります。セレクターはBaseExtendSelectorや、直にBaseSelectorを拡張しているので、 Ant DataTypeということになり、つまり、ProjectComponentということになります。 これが意味することは、あなたは、プロジェクトオブジェクト、つまりロギング機能ににアクセス出来るという事です。 ProjectComponentlogメソッドを提供し、それはプロジェクトのインスタンスにアクセスします。 ロギングの例:

        log( "message" );
    
or
        log( "message" , loglevel );
    
loglevelには下記の値のうちの一つを使用


Copyright © 2002-2004 The Apache Software Foundation. All rights Reserved.

[訳注:これは松田明子が翻訳しました。日本語訳に対するコメントがあれば report@jajakarta.orgに送ってください]