读书人

Kettle插件开发(变换步骤)

发布时间: 2012-08-03 00:12:14 作者: rapoo

Kettle插件开发(转换步骤)

1、开发Kettle设计器UI。

(1)新建配置UI,继承BaseStepDialog并实现StepDialogInterface接口。如:

public XXXXDialogextendsBaseStepDialog implementsStepDialogInterface{

}

(2)实现open()方法,open方法将在双击节点配置时调用,弹出配置窗口。

在open()方法中,可通过如下代码获取配置宣窗口控件:

Shell parent =getParent();

Display display =parent.getDisplay();

shell= new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MIN| SWT.MAX);

之后可在shell上增加各种需要配置的表单、表格控件。

完成窗口各种控件绘制后,可以使用Dialog构造器参数中的StemMeta中的历史配置数据填充到控件上。

在处理“确定”或“保存”事件时,将新的配置数据保存到StepMeta中。

在open()方法中要注意kettle配置信息的正确变更,StemMeta类中提供了一组方法来设置/获取Step的修改状态,

kettle使用StemMeta的修改状态来判断整个转换的修改状态,如果设置有变化,将会用特殊的粗体来标识选项卡。当在关闭你修改的文件时,kettle也会根据这个状态来提醒你是否保存文件。所以在Dialog类中必须正确的更新StemMeta类的修改状态。通常的方法是,给每一个UI控件都注册一个更改的监听器(modification listener),如果配置信息变化,将会更改StemMeta的状态。但是当用户点击取消按钮时,之前的变化已经提交到后台,所以在取消按钮触发时,更改状态需要恢复老的值。同时调用dispose()方法。

2、Kettle的国际化。

Kettle插件的国际化,每支持一种语言,需要在插件包的子包messages下面增加一种语言的配置文件,即

messages_${locale}.properties,支持英文为:messages_en_US.properties,中文为:messages_zh_CN.properties。在程序中通过BaseMessages.getString(Classclass,String key)获取国际化的字符串。第一个参数是插件包里一个类的class,第二个参数是配置文件中的Key,为了方便,大多数插件包中定义一个静态的变量PKG作为第一个参数,如下所示:

publicclassLookupStepDialogextendsBaseStepDialog implementsStepDialogInterface {

privatestaticClass PKG = LookupStepMeta.class; // for i18n purposes

// builds and shows the dialog

publicString open() {

/************** snip **************/

shell.setText(BaseMessages.getString(PKG,"VoldemortDialog.Shell.Title"));

/************** snip **************/

}

}

3、实现Meta类。

Meta类需要跟踪在Dialog里的转换配置信息,用于存储各种配置信息,当创建一个新的转换的时候,Kettle会调用setDefault()方法,可以在这个方法中做一些参数的初始化。一个转换步骤通常包括对行式流数据的增加、修改、删除操作。Meta类必须标识出这个转换步骤对行数据结构的改变,Kettle会调用getFields()这个方法来获取行数据结构的变化。Kettle会传入上一个转换的行数据结构RowMetaInterface,在Meta类中进行一系列转换后,作为输出到下一个步骤。如下所示,在上一步的数据结构基础上,增加一系列的字段:

publicvoidgetFields(RowMetaInterfacer, String origin, RowMetaInterface[] info, StepMeta nextStep, VariableSpacespace) {

// append the outputFields to the output

for(inti= 0; i < outputField.length; i++)

{

ValueMetaInterfacev =newValueMeta(outputField[i], outputType[i]);

v.setLength(outputLength[i]);

v.setPrecision(outputPrecision[i]);

v.setCurrencySymbol(outputCurrency[i]);

v.setConversionMask(outputFormat[i]);

v.setDecimalSymbol(outputDecimal[i]);

v.setGroupingSymbol(outputGroup[i]);

v.setOrigin(origin);

r.addValueMeta(v);

}

}

Kettle允许每一个转换步骤进行一个一致的校验,每一个步骤都可以确保被正确的应用。执行校验时将调用check(List<CheckResultInterface>remarks, TransMeta transmeta, StepMeta stepMeta, RowMetaInterface prev, Stringinput[], String output[], RowMetaInterface info)方法,这个方法将往remarks参数中增加

CheckResult类,CheckResult对应各种校验结果。如下所示:

publicvoidcheck(List<CheckResultInterface>remarks, TransMeta transmeta, StepMeta stepMeta, RowMetaInterface prev, Stringinput[], String output[], RowMetaInterface info) {

CheckResultcr;

// See if we have input streams leading to this step!

if(input.length > 0) {

cr=newCheckResult(CheckResult.TYPE_RESULT_OK,BaseMessages.getString(PKG, "VoldemortStep.Check.StepIsReceivingInfoFromOtherSteps"),stepMeta);

remarks.add(cr);

}else{

cr=newCheckResult(CheckResult.TYPE_RESULT_ERROR,BaseMessages.getString(PKG, "VoldemortStep.Check.NoInputReceivedFromOtherSteps"),stepMeta);

remarks.add(cr);

}

}

Meta类还负责序列化和反序列化所有的配置信息到XML或者资源库repository。在保存到XML文件时会调用getXML()保存所有配置信息到XML,当从XML文件读取配置信息时,会调用loadXML()方法。同样的方法会调用saveRep()和loadRep()方法,保存配置信息到资源库,或从资源库读取配置信息。

Meta类的另一个功能是负责自身实例的深度复制,在用户复制一个转换步骤的时候会调用clone()方法来进行相关操作。所有在Meta的中我们需要根据具体的需求实现clone()方法,如下所示:

publicObjectclone() {

// field by field copy is default

LookupStepMetaretval = (LookupStepMeta)super.clone();

// add proper deep copy for the collections

intnrKeys = keyField.length;

retval.allocate(nrKeys);

for(inti=0;i<nrKeys;i++)

{

retval.keyField[i] = keyField[i];

retval.outputField[i] = outputField[i];

retval.outputDefault[i] = outputDefault[i];

retval.outputType[i] = outputType[i];

retval.outputCurrency[i] = outputCurrency[i];

retval.outputDecimal[i] = outputDecimal[i];

retval.outputFormat[i] = outputFormat[i];

retval.outputGroup[i] = outputGroup[i];

retval.outputLength[i] = outputLength[i];

retval.outputPrecision[i] = outputPrecision[i];

}

returnretval;

}

最后Meta类还要为Kettle实现配置对话框类Dialog、Data、step三个类的实例化。如下所示:

publicStepDialogInterfacegetDialog(Shell shell, StepMetaInterface meta, TransMeta transMeta, Stringname) {

returnnewLookupStepDialog(shell, meta, transMeta, name);

}

publicStepInterfacegetStep(StepMeta stepMeta, StepDataInterface stepDataInterface,intcnr, TransMeta transMeta, Trans disp) {

returnnewLookupStep(stepMeta, stepDataInterface, cnr,transMeta, disp);

}

publicStepDataInterfacegetStepData() {

returnnewLookupStepData();

}

4、转换步骤Step类。

Step类是Kettle真正实现行式数据处理的类。在转换开始的时候会调用init()方法,在转换步骤结束的时候会调用dispose()方法,比如可以在init方法中建立数据库连接,在dispose方法中关闭连接,释放资源。

你也许已经注意到了,整个过程是:在Dialog类中进行各种参数配置,然后保存到Meta类中,最后在Step类中使用您配置的各种参数。BaseStep类给我们提供了一个方法environmentSubstitute()用来获取设置中的当前变量的值,如下所示:

publicbooleaninit(StepMetaInterfacesmi, StepDataInterface sdi) {

meta= (LookupStepMeta) smi;

data= (LookupStepData) sdi;

// get a voldemort client

StringbootstrapUrl = "tcp://"+environmentSubstitute(meta.getVoldemortHost())+":"+environmentSubstitute(meta.getVoldemortPort());

StoreClientFactoryfactory =newSocketStoreClientFactory(newClientConfig().setBootstrapUrls(bootstrapUrl));

data.voldemortClient= factory.getStoreClient(environmentSubstitute(meta.getVoldemortStore()));

if(data.voldemortClient ==null){

returnfalse;

}

returnsuper.init(smi, sdi);

}

publicvoiddispose(StepMetaInterfacesmi, StepDataInterface sdi) {

meta= (LookupStepMeta) smi;

data= (LookupStepData) sdi;

data.voldemortClient=null;

super.dispose(smi,sdi);

}

Step类中processRow()方法将处理上一个转换步骤中处理完的一行一行的数据,处理完成后会提交给下一个转换步骤。在proecessRow方法中,调用getRow()方法获取到上一个转换步骤输入的一行数据,调用putRow()方法将数据提交给下一步,如果还有数据要处理return true,如果所有数据处理完毕,调用setOutputDone()并return false。

5、Data类。

Data类用于临时存储数据使用,可以在Step类中直接、快速的访问Data类中的各种临时数据。如下所示:

publicclassLookupStepDataextendsBaseStepData implementsStepDataInterface {

publicRowMetaInterface outputRowMeta;

// precomputed default objects

publicObject[] defaultObjects;

// the size of the input rows

publicintinputSize;

// where the key field indexes are

publicint[] keyFieldIndex;

publicStoreClient<Object, String> voldemortClient;

// meta info for a string conversion

publicValueMetaInterface[] conversionMeta;

publicLookupStepData()

{

super();

}

}

6、插件定义(配置)。

如下所示:

<?xmlversion="1.0"encoding="UTF-8"?>

<plugin

id="VoldemortLookup"

iconfile="icon.png"

description="Voldemort Lookup"

tooltip="Looks up key values in Voldemort"

category="Experimental"

classname="plugin.voldemort.lookup.LookupStepMeta">

<libraries>

<libraryname="voldemort-lookup.jar"/>

<libraryname="lib/*.jar"/>

</libraries>

</plugin>

需要在配置文件中配置图标,分类,Meta类及引用的jar包。


原文:http://type-exit.org/adventures-with-open-source-bi/2010/06/developing-a-custom-kettle-plugin-looking-up-values-in-voldemort/

读书人网 >编程

热点推荐