【原】品味kettle--(二)XUL框架内幕

 前话

        看了上篇文章,用源码从eclipse启动起来的kettle。相信你已经可以执行成功了,并且看到了软件的登录界面。没有设置什么密码啊,为什么要我输入用户名和密码呢?因为kettle的元数据是可以入库的,如果你选择的是文件的资源库,那么就不用输入密码了,这下你知道为什么了吧。当你看到kettle的操作界面,你是否特别想知道,这是怎么做到的,本文重点讲述下kettle你看到的界面所运用的技术。      

 

正文

 XUL Framework是一个试图为不同UI技术提供统一样式的项目(pentaho-xul)。它的目标是使得多种UI技术(如:SwingSWTGWT)能够提交出一个统一的用户接口而不必每次重写描述层。在20107月与Shandor XUL 分支版本合并。目前可以到https://bitbucket.org/codeoncoffee/shandor-xul/项目下下载到源码。但是找到跟此项目配套的源码,还比较困难。有知道的朋友请告知下。

 

XUL的常见案例有:普通对话框、可定制的菜单和工具栏、新的工具应用。

 

   相关jar包:  pentaho-xul-core-5.0.1-stable.jar    核心业务类与接口

 

pentaho-xul-swing-5.0.1-stable.jar   针对swing的具体实现

 

pentaho-xul-swt-5.0.1-stable.jar     针对swt的具体实现

 

jface.jar/swt.jar                swt等实现的第三方包

 

     XUL技术,在技术整合的时候,给我们上了很好的一课。善于把问题抽象出来,再具体扩展。从设计模式上来看,这种适配器、外观模式的设计思路,是比较普遍的。后面我们提到Kettle提供的数据库插件,也基本上基于此思路的,后面再详述。下面我们来具体看下core的代码结构。

【原】品味kettle--(二)XUL框架内幕_第1张图片

 

11.2.1 XUL文件

 

XUL是英文“XML User Interface Language”的首字母缩写。它是为了支持Mozilla系列的应用程序(如Mozilla FirefoxMozilla Thunderbird)而开发的使用者界面标示语言。顾名思义,它是一种应用XML来描述使用者界面的标示语言。PDI的界面就使用了XUL,节省了开发的时间。以文件kettle平台登录选择资源库的对话框来做示例。



 
 
     
    
		
			

 

资源变量:以${}包裹的参数,都是资源参数。在加载XUL文件时,可以通过传递资源参数         ResourceBundle ,在解析的时候,可以把参数传进去。

 

 

 

 

 XUL的运行

 

 

 

1)指定XulLoader加载XUL文件,解析出一个XulDomContainer

 

KettleXulLoader xulLoader = new KettleXulLoader();
      xulLoader.setOuterContext( shell );
      xulLoader.setSettingsManager( XulSpoonSettingsManager.getInstance() );
      container = xulLoader.loadXul( "org/pentaho/di/ui/repository/xul/repositories.xul", resourceBundle );

 

 

2)为XulDomContainer指定一个XulRunner

 

 final XulRunner runner = new SwtXulRunner();
      runner.addContainer( container );

 

 

3)为XulDomContainer添加Event Handlers

 

  BindingFactory bf = new DefaultBindingFactory();
      bf.setDocument( container.getDocumentRoot() );
      // repositoriesController是继承AbstractXulEventHandler
      repositoriesController.setBindingFactory( bf );  
      repositoriesController.setPreferredRepositoryName( preferredRepositoryName );
      repositoriesController.setMessages( resourceBundle );
      repositoriesController.setCallback( callback );
      repositoriesController.setShell( getShell() );
      container.addEventHandler( repositoriesController );

 

注意:

 

Event Handlers可以用script标签,在xul文件中直接指定。通过代码addEventHandler 添加的事件处理器,在调用的时候,默认是用该事件类的getName() 来指代该事件处理器的。如该例子中repositoriesControllergetName() 返回的就是repositoryLoginController。所以在xul文件上的动作是repositoryLoginController.editRepository()。这跟我们的mvc是不是有异曲同工之妙。

 


                    
                    

你可能感兴趣的:(OPENSOURCE,ETL,JAVA,BASE)