無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

ネストしたタスクのサポート

自作のタスクで、ネストしたタスク(要素)を受け付けるようにするには、

  1. ネストしたタスクに対応するオブジェクトを作成し、
  2. タスクに、↑のオブジェクトを設定(または作成)するAPIを追加

します。

ネストしたタスクに対応するオブジェクト
  • publicなデフォルトコンストラクタ(引数なしコンストラクタ)を持つこと。(※addメソッドを使う場合)
  • ネストしたタスクが受け付ける属性に対応するsetterを用意します。
  • クラス名に規約はありません。タスク要素名に対応するクラス名を付ける必要はありません。
    • (付けた方がわかりやすいけど。)
  • org.apache.tools.ant.Taskを継承する必要はありません。
↑のオブジェクトを設定(作成)するAPI
  • 以下のいずれかをタスクに追加します。
メソッド 動作
void add<タスク名>(<オブジェクト>) void addFoo( Foo foo ){...} Ant側で作成されたオブジェクトが設定されます。(そのため、オブジェクトにはデフォルトコンストラクタが必要です。)呼び出されたタイミンクでは、属性は未設定です。
void addConfigured<タスク名>(<オブジェクト>) void addConfiguredFoo( Foo foo ){...} Ant側で作成されたオブジェクトが設定されます。(そのため、オブジェクトにはデフォルトコンストラクタが必要です。)呼び出されたタイミンクで属性が設定されています。
<オブジェクト> create<タスク名>() Foo createFoo( ){...} 返されたオブジェクトに対して、属性が設定されます。API内で返すオブジェクトを覚えておく必要があります。
サンプル
package ant;

import java.util.ArrayList;
import java.util.List;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;

/**
 * ネストされたタスクをサポートするタスク
 */
public class NestedTask extends Task {

    /**
     * ネストされたタスクの値が格納されるリスト
     */
    private List<WithName> list = new ArrayList<WithName>();

    /**
     * タスクを実行する。
     * @see Task#execute()
     */
    public void execute() throws BuildException {
        for ( WithName wn : list) {
            System.out.println( wn.name );
        }
    }

    /**
     * ネストしたKitten要素の値を設定する
     * @param kitten Kitten要素の値
     */
    public final void addKitten ( WithName kitten ) {
        this.list.add( kitten );
    }

    /**
     * ネストしたPenguin要素の値を設定する
     * @return Penguin要素の値
     */
    public final WithName createPenguin ( ) {
        WithName wn = new WithName();
        this.list.add( wn );
        return wn;
    }

    /**
     * ネストしたPanda要素の値を設定する
     * @param panda Panda要素の値
     */
    public final void addConfiguredPanda ( WithName panda ) {
        this.list.add( panda );
    }

    /**
     * ネストした要素に対応するオブジェクト。
     */
    public static class WithName {

        private String name;

        /**
         * デフォルトコンストラクタ / ※必須
         */
        public WithName () {}

        /**
         * 名前を設定する。
         * @param name 名前
         */
        public final void setName ( String name ) {
            this.name = name;
        }
    }
}

build.xml

<?xml version="1.0" encoding="euc-jp"?>
<project name="call-animals" default="call-animals" basedir=".">

  <!-- コンパイル済みタスクの配置パスを指定する -->
  <path id="lib.path">
    <pathelement location="../../class" />
  </path>

  <!-- タスクを定義する -->
  <taskdef name="call-animals" classname="ant.NestedTask" classpathref="lib.path"/>

  <target name="call-animals">
     <!-- 実行 -->
     <call-animals>
        <!-- 子要素をいろいろ指定 -->
        <kitten name="mii"/>
        <penguin name="penny"/>
        <panda name="shanshan"/>
        <kitten name="tora"/>
        <kitten name="shiro"/>
     </call-animals>
  </target>

</project>

実行結果です。

[xxx@xxxx]$ ant
Buildfile: build.xml

hello:
[call-animals] mii
[call-animals] penny
[call-animals] shanshan
[call-animals] tora
[call-animals] shiro

BUILD SUCCESSFUL
Total time: 2 seconds

参考: Antでの開発-独自タスクの記述