Kettle — Spoon加载源码解析

在Kettle中,我们知道Spoon是其中最重要的一个组件。它可以让我们以图形化的方式开发转换和作业等工作。

在spoon中Kettle采用了Xul界面技术和Swt相结合的方式进行图形界面的开发。

启动流程

1)首先程序在启动时会创建一个spoon.log日志

Path parent = Paths.get( System.getProperty( "user.dir" ) + File.separator + "logs" );

Path path = Files.createFile( Paths.get( parent.toString(), "spoon.log" ) );

final FileOutputStream fos = new FileOutputStream( path.toFile() );

System.setOut( new PrintStream( new TeeOutputStream( originalSystemOut, fos ) ) );

System.setErr( new PrintStream( new TeeOutputStream( originalSystemErr, fos ) ) );

KettleLogStore.OriginalSystemOut = System.out;

KettleLogStore.OriginalSystemErr = System.err;

2)接下来将会使用一个单独的线程来执行环境初始化的过程。包括插件类类型的注册和用类加载器加载插件类等。

// 注册ui插件的类型

registerUIPluginObjectTypes();

// 初始化环境,这里会做非常多的事情

KettleEnvironment.init();

插件注册类PluginRegistry提供了对Kettle环境中所有插件的访问。PluginRegistry支出注册类型和插件、查询每个类别的插件列表、列出每种类型的插件等。

3)然后会创建一个Swt中的显示支持类Display,然后进行事件监听的注册

Display display = new Display();

// openDoch和close事件注册监听

OsHelper.initOsHandlers( display );

4)然后就是显示界面。Splash类中封装了Swt的Shell类和增加了一些属性。

splash = new Splash( display );

5)然后就是对创建一个Spoon对象,并设置相关属性,然后调用start()方法。里面会调用xxx.xul文件(这里源码启动可能会找不到文件,拷贝到相应的目录即可),获取具体组件。如果没有错误,则会正常启动出现Spoon的界面。

默认主界面用到的xul文件在pentaho-kettle\assemblies\static\src\main\resources\ui下

Kettle — Spoon加载源码解析_第1张图片

XUL技术在Spoon中的使用

这里先看一下Spoon是如何加载使用xul文件,下面是Spoon在启动过程中加载主界面的xul过程。

Spoon.Main()->Spoon.start()->Spoon.open()->Window.open()->Window.create()->Spoon.createContents(Composite)【在Spoon中重写了Window.createContents(Composite)方法】->Spoon.init(TransMeta){

         // 加载xul文件

         KettleXulLoader xulLoader = new KettleXulLoader();

         // 加载返回XulDomContainer对象

         mainSpoonContainer = xulLoader.loadXul( XUL_FILE_MAIN, new XulSpoonResourceBundle() );

         // 将当前容器注册时间处理程序

         mainSpoonContainer.addEventHandler( this );

}

再看一下加载的Spoon.xul文件。





   

  

   

  

    

    

    

         

    

    

    

    

  

 

  

    

    

    

    

    

  

 

  

         

在xul中照样可以通过加载其他的xul文件;还可以通过command参数绑定事件;通过占位符实现国际化。

你可能感兴趣的:(Kettle)