1、开发Kettle设计器UI。
(1)新建配置UI,继承BaseStepDialog 并实现StepDialogInterface接口。如:
public XXXXDialogextends BaseStepDialog implements StepDialogInterface {
}
(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作为第一个参数,如下所示:
public class LookupStepDialogextends BaseStepDialog implements StepDialogInterface {
private static Class PKG = LookupStepMeta.class; // for i18n purposes
// builds and shows the dialog
public String open() {
/************** snip **************/
shell.setText(BaseMessages.getString(PKG,"VoldemortDialog.Shell.Title"));
/************** snip **************/
}
}
3、实现Meta类。
Meta类需要跟踪在Dialog里的转换配置信息,用于存储各种配置信息,当创建一个新的转换的时候,Kettle会调用setDefault()方法,可以在这个方法中做一些参数的初始化。一个转换步骤通常包括对行式流数据的增加、修改、删除操作。Meta类必须标识出这个转换步骤对行数据结构的改变,Kettle会调用getFields()这个方法来获取行数据结构的变化。Kettle会传入上一个转换的行数据结构RowMetaInterface,在Meta类中进行一系列转换后,作为输出到下一个步骤。如下所示,在上一步的数据结构基础上,增加一系列的字段:
public void getFields(RowMetaInterfacer, String origin, RowMetaInterface[] info, StepMeta nextStep, VariableSpacespace) {
// append the outputFields to the output
for (int i= 0; i < outputField.length; i++)
{
ValueMetaInterfacev = new ValueMeta(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对应各种校验结果。如下所示:
public void check(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= new CheckResult(CheckResult.TYPE_RESULT_OK,BaseMessages.getString(PKG, "VoldemortStep.Check.StepIsReceivingInfoFromOtherSteps"),stepMeta);
remarks.add(cr);
}else {
cr= new CheckResult(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()方法,如下所示:
public Objectclone() {
// field by field copy is default
LookupStepMetaretval = (LookupStepMeta) super.clone();
// add proper deep copy for the collections
int nrKeys = keyField.length;
retval.allocate(nrKeys);
for (int i=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];
}
return retval;
}
最后Meta类还要为Kettle实现配置对话框类Dialog、Data、step三个类的实例化。如下所示:
public StepDialogInterfacegetDialog(Shell shell, StepMetaInterface meta, TransMeta transMeta, Stringname) {
return new LookupStepDialog(shell, meta, transMeta, name);
}
public StepInterfacegetStep(StepMeta stepMeta, StepDataInterface stepDataInterface, int cnr, TransMeta transMeta, Trans disp) {
return new LookupStep(stepMeta, stepDataInterface, cnr,transMeta, disp);
}
public StepDataInterfacegetStepData() {
return new LookupStepData();
}
4、转换步骤Step类。
Step类是Kettle真正实现行式数据处理的类。在转换开始的时候会调用init()方法,在转换步骤结束的时候会调用dispose()方法,比如可以在init方法中建立数据库连接,在dispose方法中关闭连接,释放资源。
你也许已经注意到了,整个过程是:在Dialog类中进行各种参数配置,然后保存到Meta类中,最后在Step类中使用您配置的各种参数。BaseStep类给我们提供了一个方法environmentSubstitute()用来获取设置中的当前变量的值,如下所示:
public boolean init(StepMetaInterfacesmi, StepDataInterface sdi) {
meta= (LookupStepMeta) smi;
data= (LookupStepData) sdi;
// get a voldemort client
StringbootstrapUrl = "tcp://"+environmentSubstitute(meta.getVoldemortHost())+":"+environmentSubstitute(meta.getVoldemortPort());
StoreClientFactoryfactory = new SocketStoreClientFactory(new ClientConfig().setBootstrapUrls(bootstrapUrl));
data.voldemortClient= factory.getStoreClient(environmentSubstitute(meta.getVoldemortStore()));
if (data.voldemortClient == null){
return false;
}
return super.init(smi, sdi);
}
public void dispose(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类中的各种临时数据。如下所示:
public class LookupStepDataextends BaseStepData implements StepDataInterface {
public RowMetaInterface outputRowMeta;
// precomputed default objects
public Object[] defaultObjects;
// the size of the input rows
public int inputSize;
// where the key field indexes are
public int[] keyFieldIndex;
public StoreClient<Object, String> voldemortClient;
// meta info for a string conversion
public ValueMetaInterface[] conversionMeta;
public LookupStepData()
{
super();
}
}
6、插件定义(配置)。
如下所示:
<?xml version="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>
<library name="voldemort-lookup.jar"/>
<library name="lib/*.jar"/>
</libraries>
</plugin>
需要在配置文件中配置图标,分类,Meta类及引用的jar包。