Kettle插件开发(转换步骤)

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()方法。

 

2Kettle的国际化。

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实现配置对话框类DialogDatastep三个类的实例化。如下所示:

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

 

5Data类。

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包。


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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值