2017.05.23

Groovyスクリプトが書けるアダプタを作ってみました

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

みなさん、こんにちは。製品開発部の李です。

GUIで楽に開発出来る弊社のSkyOnDemandとDCSpiderですが、利用しているうちに実現できない処理や、とてもたくさんのアイコンを並べないと実現出来ない場面に出会ったことはありませんか?
今回はそういった問題を解決する、SkyOnDemand、DCSpiderの機能を拡張できるSDKについて紹介したいと思います。

公開はしておりませんが、SkyOnDemand、DCSpiderではアダプタを作成する形で機能を追加するためのSDKがあります。SDKの詳細な説明については、ここでは触れませんが、今回はアダプタ作成の流れを簡単に説明していきます。

複雑なテキスト処理やフィルタリングなど、プログラムでは書きやすいがアイコンでは効率的に作成するのが難しい場合があります。都度アダプタを作成するよりは実行効率の面で劣るが、スクリプトを記述出来るならある程度汎用性があって対応できると思ったので、今回は「スクリプトを記述して実行できるアダプタ」を、例として作成してみます。スクリプトの言語ですがSkyOnDemandのスクリプト内で動的に実行するため、今回は記述する上で相性がいいGroovyスクリプトを使います。

アダプタの作り方

構成要素としてはXMLファイルやリソースなどがありますが、アダプタは基本的にJavaのクラスとして作成します。
アダプタは以下の3つのインターフェースを実装することで実装していきます。実際のコードを見たほうがイメージしやすいと思いますので、コードを抜粋して説明していきます。

DataProcessingModuleComponent

コンポーネント(アダプタ)を表すクラスで、リソースとの関連や、アダプタとオペレーションの関連を表すクラス。
今回作成するGroovyアダプタでは一種類のオペレーションしかありませんので、以下の様な簡単な実装になります。

public class GroovyAdapterModuleComponent extends AdapterModuleComponent {
	public OperationFactory[] getOperationFactories() throws Exception {
		return new OperationFactory[] { new GroovyAdapterOperationFactory() };
	}
}

このインターフェースの実装によって、ツールパレットにオペレーションのアイコンが一つ表示されます。

OperationFactory

アダプタの設定画面での入力部品や型定義、独自のUI実装などに関する定義を記述します。

	//設定ダイアログ内の入力部品の定義。今回は複数行テキストを一つだけ追加。
	public OperationConfigurator createOperationConfigurator(OperationConfiguration conf,
			OperationContext context) throws Exception {
		OperationConfigurator configurator = new OperationConfigurator(conf, context);
		
		MultipleLineFillin scriptBox = new MultipleLineFillin();
		scriptBox.setLabel("スクリプト入力");
		scriptBox.setRows(40);
		configurator.addSimpleParameter(new SimpleParameter("GROOVY_SCRIPT", scriptBox));
		...
	}

このインターフェースの実装で、このようなアダプタのパラメータ設定ダイアログが定義されます。今回はサンプルとして、全カラムの英字を小文字に変換するGroovyスクリプトを作りました。


最初の二つのインターフェースは実装と言うより定義に近いもので、他のフレームワークでは設定ファイルで表現するようなものになりますが、インターフェースとして実装ることでより自由度のある実装が可能です。

Operation

スクリプトの実行時における処理そのものを実装するためのインターフェース。

public class GroovyAdapterOperation implements Operation {
	//配置されだアダプタが実行時に呼ばれるメソッド
	public Map execute(Map inputData) throws Exception {
		//OperationFactoryで指定したテキストBOXにセットされたスクリプトを読み込む
		String scriptStr = conf.getValue(GroovyAdapterOperationFactory.KEY_GROOVY_SCRIPT).toString();
		//Groovyエンジンのコンテナにパラメータを渡すためのオブジェクトを生成
		Binding binding = new Binding();
		//スクリプト内で使用できるように、アダプタ内で取りうるすべての変数を詰めて、
		//Groovyスクリプトで最初から使える暗黙な変数としてセット
		LoggingContext log = context.log();
		binding.setVariable("conf", this.conf);
		binding.setVariable("context", this.context);
		binding.setVariable("inputData", inputData);
		binding.setVariable("log", log);
		//スクリプトを実行
		GroovyShell shell = new GroovyShell(binding)
		//戻り値を取る
		Object value = shell.evaluate(scriptStr);
		//戻り値をSpiderに返す
		Map ret = new HashMap();
		ret.put(GroovyAdapterOperationFactory.KEY_RESULT, value);
		return ret;
	}
}

JVMの中でスクリプトを実行する方法は色々ありますが、今回はGroovyShellを使って実装しました。基本的にはGroovyスクリプトを実行するためのコンテナを用意することと、アダプタのインターフェースとのやり取りしかしてないので、処理らしき処理はありませんが。

あとはいつものようにマッパーやアダプタを繋げて、GUIベースで処理を作成しています。今回のスクリプトは単純な文字列置換を実装しましたが、例えば「複数のカラムにあるURLに対しURLエンコードを掛けたい」とか、「あるカラムにあるファイルパスをファイル名とパスで2つのカラムに分割したい」など、細かいテキスト処理が必要な場面などでスクリプトの力を発揮できると思います。

最後に

以上がアダプタを作成する簡単の流れです。このように、Javaで簡単に実装することができますので、データ連携のことでお困りの点がございましたら、ぜひこちらまでお問い合わせください。

1 件

関連する記事