Kettle使用的是JavaScript来作为它的脚本实现,使用的是mozilla的rhino 1.5r5版本实现,如果你打算实现一些复杂的计算过程,比如字符串分割,数据类型转换,条件计算等等,你都应该使用脚本语言来搞定。
我们在某种应用环境下使用脚本语言来实现一些动态的功能大部分原因都是为了避免编程,一个复杂一点的应用程序,比如像是Kettle这种工具,或是报表工具,它们不可能提供全部功能,把什么都做成图形化,应用条件永远都是复杂的,如果你不想研究代码和程序的结构,甚至你都不知道怎样编程,脚本语言绝对是一种简单的解决方案,而JavaScript语言又是其中入门门槛非常低的一种,你完全可以多看一些例子,尝试模仿一些脚本来解决问题,也许会有一点难以调试和测试,但总比自己编程要好的多。
下面的这个例子将会使用JavaScript弹出一个对话框来接受两个参数,都是时间类型,其中的UI组件是使用的swt的一些类,Kettle使用的是swt作为其UI组件,如果你对swt有了解的话会更容易理解这些UI组件,当然这并不需要你有swt编程的经验或者其他GUI设计的经验。
打开Kettle下载目录下的samples / transformation / JavaScript dialog.ktr文件(使用Kettle File菜单里面的import from an xml file。你会看到一个包含3个步骤的转换。
第一个步骤使用generate rows产生一条测试数据,测试数据包含一个DateFromProposal时间字段和一个DateToProposal时间字段。
第二个步骤使用JavaScript来实现动态的参数转变,它会连续弹出两次对话框,要求输入一个起始值和结束值,然后它会调用一些JavaScript函数来对日期格式做一些处理,
第三个步骤使用Dummy来接受输入,你完全可以使用File output步骤来查看输出。
我们先看一下第二部中的JavaScript代码:(删掉了开头的注释)
vardisplay;
vardisplayHasToBeDisposed=false;
varshell=null;
try{
display=Packages.org.eclipse.swt.widgets.Display.getCurrent();
shell=display.getActiveShell();
} catch(e) {
// if it runs in batch mode (Pan or preview mode) no Display is available, so we have to create one
display=newPackages.org.eclipse.swt.widgets.Display();
displayHasToBeDisposed=true;
shell=newPackages.org.eclipse.swt.widgets.Shell(display);
}
// if we run in Pan we need to load the properties:
if(!Packages.org.pentaho.di.ui.core.PropsUI.isInitialized()) {
Packages.org.pentaho.di.ui.core.PropsUI.init(display,2); //2=TYPE_PROPERTIES_PAN
}
vardateDefaultFrom=DateFromProposal.getString().substr(0,10); //only the date and not the time
vardialogDateFrom=newPackages.org.pentaho.di.ui.core.dialog.EnterTextDialog(shell, "Date from", "Please enter the beginning date", dateDefaultFrom);
vardateFromAsString=dialogDateFrom.open();
if(dateFromAsString!=null&& dateFromAsString.length()>0) {
vardateDefaultTo=DateToProposal.getString().substr(0,10); //only the date and not the time;
vardialogDateTo=newPackages.org.pentaho.di.ui.core.dialog.EnterTextDialog(shell, "Date to", "Please enter the ending date", dateDefaultTo);
vardateToAsString=dialogDateTo.open();
if(dateToAsString!=null&& dateToAsString.length()>0) {
// here you could check or change formats a.s.o
} else{
// stop transformation when user cancels
throw newPackages.java.lang.RuntimeException("Input canceled by the user.");
}
} else{
// stop transformation when user cancels
throw newPackages.java.lang.RuntimeException("Input canceled by the user.");
}
if(displayHasToBeDisposed) {
display.dispose();
}
Display 和 shell 都是swt 里面的对象,你只用知道他们是表示UI的就可以了.
DateFromProposal和DateToProposal都是前面传过来的字段,dateFromAsString和dateToAsString都是需要输出的内容,整个脚本只是简单的取了两个日期变量的时间部分,使用了字符串操作的substr()函数。
其中有三点需要注意:
1. dialog对象的初始化方式:使用的构造函数类型为
EnterTextDialog(Shell parent, String title, String message, String text) , 另一种构造函数类型是加一个参数fixed :
EnterTextDialog(Shell parent, String title, String message, String text, boolean fixed)
fixed代表字体是否用固定宽度,text参数代表的是输入在对话框里面的值,一般可以默认为空或输入一段用户提示信息,例子中是设置成原先转换之前的值,相当于默认值。
2. 使用open()函数取得输入值
我们调用dialog 的open()函数取得输入的值。
3. 异常的处理方式
基本上是一个标准的java 语法的try catch throw .
最后运行一下并查看输出,运行的时候什么都不输入接受默认值就可以了,最后查看输出,以下是文本方式的输出,以分号分割
DateFromProposal;DateToProposal;dateFromAsString;dateToAsString
2006/01/01 00:00:00.000;2006/12/31 00:00:00.000;2006/01/01;2006/12/31
最后需要注意的是这种方式的实现可能将来会直接用一个新的step来实现,不用这样写脚本。