カスタムオペレーション開発でArcScript を拡張する方法


ArcScript の組み込みオペレーションセットは、事前に作成されたコード、特殊なユースケース、使い慣れた開発環境を利用するように拡張できます。ArcScript は、必要な機能を単純なインターフェースでラップする簡単なプロセスを通じて、C# およびJava で開発されたカスタム操作をサポートします。さらに、ArcScript は、コマンド、バッチファイル、コンパイル済みバイナリ(.exe および.jar)などの既存のコードを簡単に呼び出すことができます。

このページでは、カスタムオペレーションの開発と呼び出しのプロセスについて説明し、ArcScript コンテキスト内から外部コードを呼び出す例を説明します。


カスタムオペレーションの作成

カスタムオペレーションを開発するための基本原則は単純です。RSBOperation と呼ばれる2 メソッドのインターフェースを実装します。

このインターフェースについては以下で詳しく説明しますが、はじめにオペレーションにインプットを提供する方法と、オペレーションからアウトプットを返す方法を確認しておくと便利です。

オペレーションのインプットとアウトプット

インプットは、インプット項目を介してオペレーションに提供され、アウトプットは、アウトプット項目を介してオペレーションから返されます。ArcScript で項目は、属性(変数など)のシンプルな集まりです。

インプット項目

オペレーションを呼び出す場合、以下のようにin キーワードを使用することで、特定のアイテムをインプットとして提供できます。

<arc:set attr="myItem.file" value="C:\\temp\\file.txt" />
<arc:call op="fileRead" in="myItem" />

オペレーションは、インプット項目から予期される属性パラメータを定義しなければなりません。たとえば、上記で参照されているfileRead オペレーションは、file のみを必須のインプットパラメータとして定義します。

in キーワードで項目が指定されていない場合は、以下のように暗黙のデフォルト項目が使用されます。

<arc:set attr="file" value="C:\\temp\\file.txt" />
<arc:call op="fileRead" />

アウトプット項目

オペレーションを呼び出す場合、アウトプット項目は、以下のようにout キーワードで指定されます。

<arc:set attr="myItem.file" value="C:\\temp\\file.txt" />
<arc:call op="fileRead" in="myItem" out="outItem">
  <arc:set attr="myItem.file_length" value="[outItem.file:data | getlength()]" />
</arc:call>

オペレーションは、アウトプットとして提供する属性パラメータを定義する必要があります。たとえば、fileRead オペレーションは、file:data のみをインプットパラメータとして定義します。

RSBOperation インターフェース

RSBOperation インターフェースを実装するC#、.NET、およびJava クラスは、組み込みのオペレーションで使用されるものと同じarc:call キーワードを使用して呼び出すことができます。このインターフェースを理解することは、C# およびJava コードをArcScript オペレーションに変換する方法を理解することと同じです。

RSBOperation は、次の2 つのメソッドを定義します。

  • string Info()
  • void Exec(RSBContext ctx)

Info()

Info() メソッドは、オペレーションを記述する単純な文字列と、予期されるインプットパラメータおよびアウトプットパラメータを返します。この文字列のフォーマットは、以下のXML 構造です。

<arc:info desc="A description of the operation">
  <input name="myInputAttr" desc="A description of this input attribute" required=true />
  <input name="anotherInputAttr" desc="A description of this input attribute" />
  <output name="myOutputAttr" desc="A description of this output attribute" />
  <output name="anotherOutputAttr" desc="A description of this output attribute" />
</arc:info>

たとえば、以下は前のセクションで参照したfileRead オペレーションの完全なInfo() メソッドです。

public String info() {
    return "<arc:info desc='Reads a text file and pushes the data out.'>" +
    "<input name=file desc='The name of the file to read.' required=true/>" +
    "<input name=encoding desc='The encoding of the file.' default='UTF-8' />" +
    "<output name=data desc='The file data.'/>" + 
    "</arc:info>";
  }

Exec(RSBContext ctx)

Exec() メソッドは、オペレーションの処理を実行します。RSBContext オブジェクト(「ctx」)は、オペレーションのインプットおよびアウトプット属性へのアクセスを提供します。Exec() メソッドは、カスタムオペレーションの目的の機能をラップし、入力の読み取りと出力の書き込みのための単純なコードを含めるために使用する必要があります。

Exec() メソッドに関連するRSBContext メソッドは以下のとおりです。

  • GetInput(string attrName) — オペレーションに渡された「attrName」属性の値を返す
  • SetOutput(string attrName, string value) — オペレーションからプッシュされる「attrName」属性の値を設定
  • PushItem() — アウトプット項目をプッシュアウト:PushItem がない場合、オペレーションはアウトプットを提供しません。

Exec() メソッドの役割を明確にするために、C# で記述されたmyMagicParser というカスタムクラスを想像してください。このクラスは、生のインプット文字列に対して高度な解析プロシージャを実行し、Parse(string rawInput) のように、1 つのメソッドが解析プロシージャの詳細を抽象化するように記述されています。Exec() メソッドは、以下のようにこのクラスの機能をラップできます。

public void Exec(RSBContext ctx) {
  string rawInput = ctx.GetInput("raw");
  ctx.SetOutput("parsed", Parse(rawInput));
  ctx.PushItem();
}

このオペレーションの例でInfo() メソッドは、インプットパラメータとしてraw を、アウトプットパラメータとしてparsed をアドバタイズする必要があります。

Info() メソッドはインプットとアウトプットの単純な記述であり、Exec() メソッドは関数型論理の単なるラッパーであるため、既存のクラスを変更してRSBOperation インターフェースを実装するために必要な開発時間は最小限になります。

RSBOperation の参照

コードでインターフェースを実装するには、プロジェクトでRSSBus.dll(Windows)またはrssbus.jar(Java)を参照する必要があります。Windows の場合、含める.dll は次の場所にあります。

C:\Program Files\CData Arc\www\bin\RSSBus.dll

Java の場合、含める.jar ファイルは、アプリケーションをホストするサーバーのWEB-INF/lib フォルダにあります。たとえば、組み込みのJetty サーバーを使用する場合、ファイルは次の場所にあります。

/opt/arcesb/webapp/WEB-INF/lib/rssbus.jar

WEB-INF/lib フォルダへのこのパスは、Tomcat などの外部サーブレットでCData Arc をホストする際に異なる場合があります。

カスタムオペレーションの表示

C# またはJava クラスを変更してRSBOperation インターフェースを実装した後、カスタムクラス(オペレーション)を.dll または.jar にコンパイルする必要があります。生成されたバイナリファイルは、適切な場所にコピーしてArc に表示されるようにする必要があります。

カスタムオペレーションを含む.dll または.jar は、前のセクションでRSSBus.dll またはrssbus.jar ファイルが参照されたのと同じディレクトリに配置する必要があります。コンパイルされたファイルを適切なフォルダに配置したら、サーバーを再起動する必要があります。

ArcScript でカスタムオペレーションを呼び出す

カスタムオペレーションは、他の組み込みオペレーションと同じRSBOperation インターフェースを実装するため、同じarc:call 構文を使用して呼び出すことができます。arc:call ステートメントのop 属性では、以下の構文を使用する必要があります。

myFileName.myOpName

たとえば、カスタムクラスがmyMagicParserと呼ばれてcustomOp.dll にコンパイルされる場合、以下の構文が使用されます。

<arc:call op="customOp.myMagicParser" in="myInputItem" out="myOutputItem">

RSBOperation のインターフェース セクションのExec(RSBContext ctx) セクションで提供されているmyMagicParser の実装例では、予想されるインプット属性は「raw」で、アウトプット属性は「parsed」です。以下は、そのオペレーションを呼び出すための完全なArcScript スニペットです。

<arc:set attr="myString.raw" value="some example string to parse" />
<arc:call op="customOp.myMagicParser" in="myString" out="tempOut">
  <arc:set attr="myString.parsed" value="[tempOut.parsed]" />
</arc:call>
<!-- [myString.parsed] can be used to reference the parsed string -->

外部プロセスの起動

カスタムオペレーションの作成に加えて、ArcScript では、RSBOperation を実装するためのソースコードを変更することなく、事前にコンパイルされた実行可能ファイルを呼び出すサポートを行います。これによりArc は、アプリケーションでこのロジックを再実装することなしに、ビジネスロジックの重要な側面を実現する既存のプログラム、コマンド、またはバッチスクリプトと統合できます。

ArcScriptには、組み込みのオペレーションsysExecute が含まれており、外部コードを呼び出したり、引数をパラメータとして渡したり、プロセスからの標準出力にアクセスしたりすることができます。簡単な例として、whoami.exe 実行可能ファイルでsysExecute を使用することにより、whoami コマンドをArcScript コンテキスト内で実行できます。

<arc:set attr="executable.name" value="C:\\Windows\System32\\whoami.exe" />
<!-- arc:set attr="executable.arguments" value="some example command line arguments" -->
<arc:call op="sysExecute" in="executable" out="tempOut">
  <arc:set attr="out.data" value="[tempOut.sys:output]" />
</arc:call>

sysExecute は、コマンドプロンプトから直接実行できる任意のプログラムを実行することができます。




Ready to get started?

Use CData Arc's free 30-day trial to start building your own custom workflows today:

Download Now