式言語でも導入してみる?

昔作っていたETLツールもどきに機能追加の依頼があって。
要するに、SSISが使えれば(゚?゚)イラネみたいなカンジのものですけどネ。
このツールでは設定ファイルに従って、ファイル操作だのETLだのといったタスクを順次実行していたわけですが。
で、やっぱり前のタスクの成功/失敗によって、後続タスクの実行有無を切り替えたいよね〜みたいな要求があって(・ω・)


そうなると、条件分岐と分岐するための条件設定をどこかで行う必要が出てくるわけで。
かつ、設定ファイルの変更で動作を変えられるようにもしたいということで、式言語でやろうかなっと思ってみたりしました(・∀・)


.NETで式言語を組み込もうとした場合、JScriptでJScriptCodeProviderを使ってevalするか、ANTLRを使うか、あるいはIronPythonでも使ってみる?、なんてあたりが思いつくわけですが(´ω`)
まあ、今回はANTLRを使うことに。
JavaのプロジェクトにANTLRを組み込んでいて多少知っていたり、Spring.NETのExpressionEvaluatorを使うと簡単に利用できるので(´・∀・`)


やり方としては、まずSpring.NETの中からSpring.Core.dll、antlr.runtime.dll、log4net.dllを拾ってきて参照設定に追加。
で、サンプルコードはこんなカンジで。

using Spring.Expressions;

public class Context
{
    public Hashtable variables = new Hashtable();

    public Hashtable Variables
    {
        get { return this.variables; }
    }
}

static void Main() 
{
    object result;
    Context context = new Context();

    // Contextのメンバに値を設定
    result = ExpressionEvaluator.GetValue( context, "Variables['usausa'] = true" ); 

    // Contextのメンバで条件判定
    result = ExpressionEvaluator.GetValue( context, "Variables['usausa'] == true" );
    if ( Convert.ToBoolean( result ) == true )
    {
        System.Diagnostics.Debug.WriteLine( "条件を満たしているだよもん" );
    }
}

Contextは式言語とやりとりするためのクラス。
式言語からは、VariablesとかけばContext.Variablesにアクセスできるデス。
で、ExpressionEvaluator.GetValue(object root ,string expression)のexpressionに設定ファイルの内容を使えば、そこに式言語でプログラムの動作を制御できるように出来るのです。
とりえあずコレで自分のやりたいことは満たせるかな(・∀・)


さて、引き続き午後からはFTPタスクでも作るべ(´ω`)