Kettle体系结构与源码分析.doc_第1页
Kettle体系结构与源码分析.doc_第2页
Kettle体系结构与源码分析.doc_第3页
Kettle体系结构与源码分析.doc_第4页
Kettle体系结构与源码分析.doc_第5页
已阅读5页,还剩140页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Kettle程序分析1. 简介ETL是数据抽取(Extract)、转换(Transform)、装载(Load)的过程。Kettle是一款国外开源的ETL工具,有两种脚本文件transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。2. 相关概念Job:一个作业,由不同逻辑功能的entry组件构成,数据从一个entry组件传递到另一个entry组件,并在entry组件中进行相应的处理。Transformation:完成针对数据的基础转换,即一个数据转换过程。Entry:实体,即job型组件。用来完成特定功能应用,是job的组成单元、执行单元。Step:步骤,是Transformation的功能单元,用来完成整个转换过程的一个特定步骤。Hop:工作流或转换过程的流向指示,从一个组件指向另一个组件,在kettle源工程中有三种hop,无条件流向、判断为真时流向、判断为假时流向。3. 体系结构kettle平台是整个系统的基础,包括元数据管理引擎、数据集成引擎、UI和插件管理模块。(1) 元数据管理引擎元数据管理引擎管理ktr、kjb或者元数据库,插件通过该引擎获取基本信息,主要包括TransMeta、JobMeta和StepMeta三个类。TransMeta类,定义了一个转换(对应一个.ktr文件),提供了保存和加载该文件的方法;JobMeta类,同样对应于一个工作(对应一个.kjb文件),提供保存和加载方法;StepMeta类,保存的是Step的一些公共信息的类,每个类的具体的元数据将保存在显示了StepMetaInterface的类里面。(2) 数据集成引擎数据集成引擎包括Step引擎、Job引擎和数据库访问引擎三大部分,主要负责调用插件,并返回相应信息。(3) UIUI显示Spoon这个核心组件的界面,通过xul实现菜单栏、工具栏的定制化,显示插件界面接口元素,其中的TransGraph类和JobGraph类是用于显示转换和Job的类。l TransGraph类TransGraph类与显示选中转换标签后,红框内的编辑区对象对应org.pentaho.di.ui.spoon.trans包中的TransGraph类。l JobGraph类JobGraph类与显示选中Job标签后,红框内的编辑区对象对应org.pentaho.di.ui.spoon.job包中的JobGraph类。(4) 插件管理模块Kettle是众多“可供插入的地方”(扩展点)和“可以插入的东西”(扩展)共同组成的集合体。在我们的生活中,电源接线板就是一种“扩展点”,很多“扩展”(也就是电线插头)可以插在它上面。插件管理引擎主要负责插件的注册,在Kettle中不管是以后的扩展还是系统集成的功能,本质上来讲都是插件,管理方式和运行机制是一致的。系统集成的功能点也均实现了对应的扩展接口,只是在插接的说明上略有不同。Kettle的扩展点包括step插件、job entry插件、Database插件、Partioner插件、debugging插件。4. 功能模块Kettle的主要包括四大功能模块:Chef工作(job)设计工具(GUI方式);Kitchen工作(job)执行器(命令行方式);Spoon转换(transform)设计工具(GUI方式);Span转换(trasform)执行器(命令行方式)。(1) Chef工作(job)设计器这是一个GUI工具,操作方式主要通过拖拽。何谓工作?多个作业项,按特定的工作流串联起来,形成一项工作。正如:我的工作是软件开发。我的作业项是:设计、编码、测试!先设计,如果成功,则编码,否则继续设计,编码完成则开始设计,周而复始,作业完成。1) Chef中的作业项转换:指定更细的转换任务,通过Spoon生成,通过Field来输入参数;SQL:sql语句执行;FTP:下载ftp文件;邮件:发送邮件;检查表是否存在;检查文件是否存在;执行shell脚本:如dos命令。批处理:(注意:windows批处理不能有输出到控制台)。Job包:作为嵌套作业使用。JavaScript执行:如果有自已的Script引擎,可以很方便的替换成自定义Script,来扩充其功能;SFTP:安全的Ftp协议传输;HTTP方式的上传/下载。2) 工作流工作流是作业项的连接方式,分为三种:无条件,成功,失败。为了方便工作流使用,KETTLE提供了几个辅助结点单元(也可将其作为简单的作业项):Start单元:任务必须由此开始。设计作业时,以此为起点。OK单元:可以编制做为中间任务单元,且进行脚本编制,用来控制流程。ERROR单元:用途同上。DUMMY单元:什么都不做,主要是用来支持多分支的情况。3) 存储方式支持XML存储,或存储到指定数据库中。一些默认的配置(如数据库存储位置),在系统的用户目录下,单独建立了一个.Kettle目录,用来保存用户的这些设置。4) LogView:可查看执行日志。(2) Kitchen作业执行器是一个作业执行引擎,用来执行作业。这是一个命令行执行工具,参数如下: -rep : Repository name任务包所在存储名 -user : Repository username执行人 -pass : Repository password执行人密码 -job : The name of the job to launch任务包名称 -dir : The directory (dont forget the leading / or /) -file : The filename (Job XML) to launch -level : The logging level (Basic, Detailed, Debug, Rowlevel, Error, Nothing)指定日志级别 -log : The logging file to write to指定日志文件 -listdir: List the directories in the repository列出指定存储中的目录结构。 -listjobs : List the jobs in the specified directory列出指定目录下的所有任务 -listrep: List the defined repositories列出所有的存储 -norep : Dont log into the repository不写日志(3) Spoon转换过程设计器 GUI工作,用来设计数据转换过程,创建的转换可以由Pan来执行,也可以被Chef所包含,作为作业中的一个作业项。1) Input-Steps:输入步骤Text file input:文本文件输入可以支持多文件合并,有不少参数,基本一看参数名就能明白其意图。Table input:数据表输入实际上是视图方式输入,因为输入的是sql语句。当然,需要指定数据源(数据源的定制方式在后面讲一下)Get system info:取系统信息就是取一些固定的系统环境值,如本月最后一天的时间,本机的IP地址之类。Generate Rows:生成多行。这个需要匹配使用,主要用于生成多行的数据输入,比如配合Add sequence可以生成一个指定序号的数据列。XBase InputExcel InputXML Input2) Output-Steps:输出步聚Text file output:文本文件输出。这个用来作测试蛮好,呵呵。很方便的看到转换的输出。Table output:输出到目的表。Insert/Update:目的表和输入数据行进行比较,然后有选择的执行增加,更新操作。Update:同上,只是不支持增加操作。XML Output:XML输出。3) Look-up:查找操作l Data Basel Streaml Procedurel Database join4) Transform转换l Select values对输入的行记录数据的字段进行更改(更改数据类型,更改字段名或删除)数据类型变更时,数据的转换有固定规则,可简单定制参数。可用来进行数据表的改装。l Filter rows对输入的行记录进行指定复杂条件的过滤。用途可扩充sql语句现有的过滤功能。但现有提供逻辑功能超出标准sql的不多。l Sort rows对指定的列以升序或降序排序,当排序的行数超过5000时需要临时表。l Add sequence为数据流增加一个序列,这个配合其它Step(Generate rows, rows join),可以生成序列表,如日期维度表(年、月、日)。l Dummy不做任何处理,主要用来作为分支节点。l Join Rows对所有输入流做笛卡儿乘积。l Aggregate聚合,分组处理l Group by分组,用途可扩充sql语句现有的分组,聚合函数。但我想可能会有其它方式的sql语句能实现。l Java Script value使用mozilla的rhino作为脚本语言,并提供了很多函数,用户可以在脚本中使用这些函数。l Row Normaliser该步骤可以从透视表中还原数据到事实表,通过指定维度字段及其分类值,度量字段,最终还原出事实表数据。l Unique rows去掉输入流中的重复行,在使用该节点前要先排序,否则只能删除连续的重复行。l Calculator提供了一组函数对列值进行运算,用该方式比用户自定义JAVA SCRIPT脚本速度更快。l Merge Rows用于比较两组输入数据,一般用于更新后的数据重新导入到数据仓库中。l Add constants:增加常量值。l Row denormaliser同Normaliser过程相反。l Row flattener表扁平化处理,指定需处理的字段和扃平化后的新字段,将其它字段做为组合Key进行扃平化处理。除了上述基本节点类型外还定义了扩展节点类型SPLITFIELDS:按指定分隔符拆分字段;EXECUTE SQL SCRIPT:执行SQL语句;CUBE INPUT:CUBE输入;CUBE OUTPUT:CUBE输出。(4) Pan转换的执行工具命令行执行方式,可以执行由Spoon生成的转换任务。同样,不支持调度。参数与Kitchen类似。(5) 其它l Connection可以配置多个数据源,在Job或是Trans中使用,这意味着可以实现跨数据库的任务。支持大多数市面上流行的数据库。5. 概念模型Kettle的执行分为两个层次:Job和Transformation。两个层次的最主要区别在于数据传递和运行方式。(1) Transformation(转换)Transformation(转换)是由一系列被称之为step(步骤)的逻辑工作的网络。转换本质上是数据流。下图是一个转换的例子,这个转换从文本文件中读取数据,过滤,然后排序,最后将数据加载到数据库。本质上,转换是一组图形化的数据转换配置的逻辑结构。转换的两个相关的主要组成部分是step(步骤)和hops(节点连接)。转换文件的扩展名是.ktr。1) 转换机制每个转换步骤都是ETL数据流里面的一个任务。转换步骤包括输入、处理和输出。输入步骤从外部数据源获取数据,例如文件或者数据库;处理步骤处理数据流,字段计算,流处理等,例如整合或者过滤。输出步骤将数据写回到存储系统里面,例如文件或者数据库。转换步骤示例2) Steps(步骤)Steps(步骤)是转换的建筑模块,比如一个文本文件输入或者一个表输出就是一个步骤。每个步骤用于完成某种特定的功能,通过配置一系列的步骤就可以完成你所需要完成的任务。a) Step类图简介每个类都有其特定的目的及扮演的角色。以TableInput为例,下图说明了这4个类的继承体系。StepInterface继承体系实现StepInterface接口的类,在转换运行时,将是数据实际处理的位置。每个执行线程都表示一个实现StepInterface的实例。BaseStep实现了StepInterface是各step具体实现类的基类。完成了公用的处理函数,如putRow(),但是对于更具体的processRow()在StepBase的子类中。StepBase的主要成员有public ArrayList inputRowSets,outputRowSets;StepBase的子类每次从inputRowSets中取出一行数据,向outputRowSets中写入一行数据。StepDataInterface继承体系实现StepDataInterface接口的类为数据类,当插件执行时,对于每个执行执行的线程都是唯一的。保存于step相关的数据信息,比如行的元数据信息。StepMetaInterface继承体系实现了StepMetaInterface接口的类为元数据类。它的职责是保存和序列化特定步骤的实例配置,例如保存步骤的名称、字段名称等,如何生成加载xml或者读写数据库。StepDialogInterface继承体系实现了StepDialogInterface接口的类为对话框类,该类实现了该步骤与用户交互的界面,它显示一对话框,通过对话框用户可以根据自己的要求进行步骤的设定。该对话框类与元数据类关系非常密切,对话框里面的配置数据均会保存在元数据类里面。b) 步骤间交互通信类步骤之间通信机制RowSet的实现类,负责步骤之间的相互通信,rowset对象即是前一个step的成员也是后一个step的成员,访问是线程安全的。RowSet实现类内存快照RowSet类中包含源step,目标step和由源向目标发送的一个rowMeta和一组data。其中data数据是以行为单位的队列(queArray)。一个RowSet作为此源step的outputrowsets的一部分。同时作为目标step的inputRowsets一部分。源Step每次向队列中写一行数据,目标step每次从队列中读取一行数据。RowSet实现类c) 行元数据所有的data均为object对象。步骤与步骤之间以行为单位进行处理,自然需要知道每行的结构,即行元数据。行元数据至少需要包括类型、名称,当然还可能包括字段长度、精度等常见内容。行元数据不仅在执行的时候需要,而且在转换设置的时候同样需要。每个步骤的行元数据都会保存在.ktr文件或者数据库里面,所以可以根据步骤名称从TransMeta对象中获取行元数据。行元数据的UML类图结构如下所示,主要有单元格元数据组成行元数据。在现有的版本中,支持的数据类型有String、Date、BigNumber、Boolean、SerializableType、Binary、Integer、Numberic。行元数据UML类图3) Hops(节点连接)Hops(节点连接)是数据的通道,用于连接两个步骤,使得元数据从一个步骤传递到另一个步骤。节点连接决定了贯穿在步骤之间的数据流,步骤之间的顺序不是转换执行的顺序。当执行一个转换时,每个步骤都以自己的线程启动,并不断的接受和推送数据。注意:所有的步骤是同步开启和运行的,所以步骤的初始化的顺序是不可知的。因为我们不能在第一个步骤中设置一个变量,然后在接下来的步骤中使用它。在一个转换中,一个步骤可以有多个连接,数据流可以从一个步骤流到多个步骤。在Spoon中,hops就想是箭,它不仅允许数据从一个步骤流向另一个步骤,也决定了数据流的方向和所经步骤。如果一个步骤的数据输出到了多个步骤,那么数据既可以是复制的,也可以是分发的。4) Trans配置及开启Trans执行时序图在真正运行trans之前,还需要对运行模式进行一个设置。设置结果,会传给TransGraph.start(executionConfiguration)。配置界面如下所示:执行转换模式设置实例化Trans的基本流程如下,Trans类是最后真正执行转换的类。实例化之前需要配置启动项,保持.ktr文件同步,然后实例化Trans类。最后,开启后台程序,这样不会影响UI的操作,真正的转换在后台执行。实例化Trans流程图5) Trans执行trans类的执行由execute()负责,主要包含两个步骤:转换执行前的准备工作和所有线程的开启。Trans每一个步骤都会对应一个独立的线程,线程之间通过RowSet进行通信交互。a) 执行准备(prepareExecution)主要完成对通信类的初始化,对步骤的包装初始化。最后启动各个步骤初始化线程,即调用各个步骤的init()方法。准备结束之后,步骤之间的通信机制完成了,各个步骤的初始化工作也完成了。具体的流程如下所示:准备执行流程图b) 转换处理执行Trans转换执行引擎类,通过startThreads()启动步骤线程。为所有步骤添加监听器,在开启监听进程对所有线程进行监听。具体的步骤如下图所示:启动所有步骤线程(2) Jobs(工作)Jobs(工作)是基于工作流模型的,协调数据源、执行过程和相关依赖性的ETL活动。Jobs(工作)将功能性和实体过程聚合在了一起,由工作节点连接、工作实体和工作设置组成,工作文件的扩展名是.kjb。下图是一个工作的例子。一个工作中展示的任务有从FTP获取文件、核查一个必须存在的数据库表是否存在、执行一个转换、发送邮件通知一个转换中的错误等。最终工作的结果可能是数据仓库的更新等。1) 机制一个job项代表ETL控制流中的一项逻辑任务。Job项将会顺序执行,每个job项会产生一个结果,能作为别的分支上job项的条件。2) 类图简介Job entry类图结构3) Job配置及开启Job开启时序图Job的开启与Trans相类似,配置执行的参数,检查.kjb文件是否发生变化,实例化一个Job对象,开启该线程。4) Job执行步骤Job执行步骤6. kettle数据流图程序正常工作需要3种类型的文件:1) 配置文件程序首先是从系统中读取相关的配置文件,用来初始化程序。然后加载组件库到程序中,组件的加载需要用到相关的XML文件和图标。2) 工作文件Kjb文件是job的工作文件,ktr文件是transformation的工作文件,要打开或者运行一个job或者transformation,需要存在相应的kjb或ktr文件。3) 数据文件需要处理的数据。(1) 顶层数据流图(2) 第一层数据流图(3) 第二层数据流图1) 作业执行2) 转换执行7. 插件扩展机制Kettle并不能做到热插拔,每次添加或者删除插件的时候都需要重启。安装或删除插件,只需要在plugins文件夹下添加或删除对应的文件即可。Kettle的扩展点包括step插件、job entry插件、Database插件、Partioner插件、debugging插件,这里我们重点介绍step、job entry、database插件。暴露的扩展点如下表所示:表 1 Step扩展接口Java接口基类主要功能StepMetaInterfaceBaseStepMeta存储step设置信息验证step设置信息序列化step设置信息提供获取step类的方法StepDialogInterfaceBaseStepDialogstep属性信息配置窗口StepInterfaceBaseStep处理rowsStepDataInterfaceBaseStepData为数据处理提高数据存储表 2 job entry扩展接口Java接口基类主要功能JobEntryInterfaceJobEntryBase存储job entry设置信息序列化job entry设置信息提供获取job entry类的方法执行job entry任务JobEntryDialogInterfaceJobEntryDialogjob entry属性信息配置窗口表 3 Database 扩展接口Java接口基类主要功能DatabaseInterfaceBaseDatabaseMeta访问各类数据库(1) 插件的建立Kettle中的插件包含两部分,一是系统本身就已经实现的功能点,在源码目录src中说明,如kettle-steps.xml;二是系统之外开发的插件,在plugins目录对应插件目录下的plugins.xml说明,plugins/steps/S3CsvInput/plugins.xml。1) 系统集成插件定义表 4 系统自带插件定义内容位置插件说明信息src/kettle-steps.xml,所有插件集中说明插件源码src与src-ui下,org.pentaho.di.steps.插件名插件图片插件说明xml中说明插件界面文字说明org.pentaho.di.steps.插件名.messages插件说明信息中包括描述信息、类名(包括package,反射用)、父级目录(Spoon左侧栏目录)、提示信息和图片信息。Kettle使用国家化方式编程,所以软件中的所有文字描述均由messages_*.properties提供。系统集成插件说明xml结构如下:2) 扩展插件定义所有新开发的扩展插件,均放在同一的目录下进行管理,插件管理模块会自动去该目录下进行搜索查找。插件目录结构如下所示:表 5 扩展插件定义内容位置插件说明信息plugins/插件类型/插件名称/plugin.xml插件源码*.jar插件图片plugins/插件类型/插件名称/插件依赖包plugins/插件类型/插件名称/扩展插件与系统集成插件的说明内容相似,扩展插件增加ID属性和依赖属性,同时他的目录结构、描述信息和提示信息均能进行国际化配置。扩展插件说明xml结构如下:(2) 插件的注册Spoon在启动的时候会对所有插件进行注册,并保存在PluginRegistry类里面。平台通过查找PluginRegistry注册表获取插件信息。Kettle安装插件需要进行重启,卸载插件也只需简单的删除plugins目录结构下对应的文件即可。插件注册时序图plugin注册相关的UML类图(3) 插件查找PluginRegistry提供了插件查找功能,准确的来说是插件信息的查找功能。以steps在左侧功能栏里面的显示为例,进行插件查找的说明。提供了getPlugins获取指定插件类型列表、getPlugin获取指定成名插件、getCateories获取目录结构、getClass获取指定插件类等方法。Spoon中step列表左侧显示由Spoon.refreshCoreObjects()函数实现,如果选择时trans相关的内容,将显示所有的step插件。流程图如下所示:spoon界面step插件显示流程(4) 插件调用Kettle中调用插件时,平台通过元素管理引擎获取对应的插件信息,通过反射生成插件对象,调用对应的函数。Kettle以外观模式的方式调用插件,我们以双击某个插件图表,弹出对应配置界面为例进行说明。Spoon界面交互相关的处理器都封装到SpoonDelegates中,根据不同的事件类型调用对应的事件处理函数。UML类图如下所示。事件代理类SpoonStepsDelegate提供了与UI交互相关的处理事件,如复制、删除、粘贴、编辑等。双击某个step时会调用编辑功能,编辑功能是对插件StepDialogInterface的封装。时序图如下:双击编辑step时序图双击是TransGraph对象注册的时间,双击是根据页面上的坐标信息获取双击的stepmeta对象(来自于*.ktr)。然后,将这个对象传给事件代理类处理,根据stepmeta对象,获取对应的插件类名,通过反射生成StepDialogInterface的实例并调用open()方法。(5) 插件间通信Kettle插件之间天生就具有通信共享数据的特点,kettle中最主要通信方式是通过插件之间共同关联一个数据类对象的方式进行通信;使用单例模式实现插件间信息共享。8. 核心包(模块)、类和接口kettle包含的核心包(模块)、类和接口,分为辅助层(底层)、逻辑层和界面层。其对应的源码包结构是core,src, ui的顺序,如下列表所示。界面层ui界面层核心面板模块Spoon类菜单加载树面板显示标签页管理拖拽事件JobGraph类是标签(tabItem)页的控制者(Controller),代表工作区中的一个标签页。界面组件适配模块xul把swt开发包内的界面组件做适当的修改,可以更加灵活地以配置文件的方式动态加载菜单,工具栏,更加灵活地处理事件信息。测试结果展示模块JobHistoryDelegate类历史信息JobLogDelegate类日记信息JobGridDelegate类执行过程信息其他SpoonDelegates类该类是一个代理类,代理工作任务的相关操作。SpoonJobDelegate类该类是job型代理类,控制所有的job。逻辑层srcJob模块.pentaho.di.job实现job(作业)的逻辑功能,包括创建job、维护job及执行job等。Trans模块.pentaho.di.Trans处理transformation任务。其他EnvUtil类负责kettle的环境设置PropsUI类储存各种用户设置信息PluginLoader类对外提供加载插件jar包功能。辅助层(底层)core文件操作org.pentaho.di.core.vfs. KettleVFS.java文件的基本操作org.pentaho.di.core.xml.XMLHandlerxml的基本操作多语言应用Uitl.Messages.Java实现多语言支持异常处理org.pentaho.di.core.exception负责异常处理日志模块org.pentaho.di.core.logging日志信息元数据表示模块org.pentaho.di.core.row主要作用是读取kettle文件,生成元数据信息,或保存元数据常量类Props类保存用户的节本设置信息。PropsUI类保存用户的界面层的设置信息。Const类保存常量信息。界面字符显示BaseMessages类负责界面字符串的显示GlobalMessages类MessageHandler类LanguageChoice类LAFMessageHandler类其他ResolverUtil类解析类,多种用途Props类该类主要用来存储所有的用户与程序间的交互信息,例如界面颜色、布局等。Plugin类算法组件描述类,是所有算法组件的基本的元数据信息Result类算法结果类,保存Job运算结果PDIClassLoader类装载类,装载插件jar包的类。(1) 界面层1) 核心面板模块a) Spoon类Spoon类是图形界面的入口类,它处于整个程序运行的核心地位,连接界面和逻辑功能,从界面获取配置。Spoon类作用主要是主界面的Handle,实现界面的显示、刷新、菜单加载、菜单及界面按钮功能的实现、工作流信息的收集等。即与界面相关的、与delegates相关的、与props相关的。Spoon的一些重要的成员函数如下表:表6-1 Spoon的一些成员变量变量作用备注private static Spoon staticSpoonSpoon类身的静态变量,创建程序唯一的Spoon静态对象,表示整个程序用户界面。在Spoon的main函数中被创建生成public SpoonDelegates delegates这个对象存储整个应用程序的所有job和transformation的信息,用来控制用户任务。Delegate :代理public PropsUI propsPropsUI类主要是用来存储用户和程序的交互信息,比如说程序工作区的背景颜色、字体颜色、图标的大小、布局等,以及最近使用文档和上次关闭时kettle的状态等。在taticSpoon被创建过程中生成Spoon的一些重要函数:main函数public static void main(String a) throws KettleException 主要是初始化主界面和进入事件监听循环。Spoon构造函数public Spoon(Display d, Repository rep)组件加载private static void initPlugins() throws KettleException Spoon界面初始化public void init(JobMeta ti) 添加菜单监听器public void addMenuListeners()复制当前选的组件public void copyJobentries()执行工作流public void executeJob() public void executeJob(JobMeta jobMeta, boolean local, boolean remote,Date replayDate, boolean safe) jobMeta为当前的工作流(当前选择的标签tab中的工作流)。编辑工作流public void editJobProperties(String id) 编辑组件public void editJobEntry() public void editJobEntry(JobMeta jobMeta, JobEntryCopy je)添加标签页private void addTabs()保存kjb文件public boolean saveXMLFile()public boolean save(EngineMetaInterface meta, String fname, boolean export)创建JobEntrypublic JobEntryCopy newJobEntry(JobMeta jobMeta, String typeDesc,boolean openit) l 菜单加载Spoon中加载菜单是在界面初始化的时候完成的,Spoon.init()函数完成界面的初始化,然后调用addMenu()添加菜单。菜单加载原理:Kettle通过读取配置文件的方式加载主菜单。当Kettle建立Shell对象时,需要为Shell对象增加菜单。这个任务有XulHelper完成。详细过程见6.9XulHelper.createMenuBar(XUL_FILE_MENUBAR, shell,new XulMessages();XulHelper解析配置文件,根据配置文件,生成相应的menubar,menu,menuitem或menuseparator。每一项都可能有自己的id,快捷键和label,并且id和快捷键在handler中注册(但是没有说明每一个菜单项调用哪个方法)。加载完之后,需要对每一个id和快捷键加上事件的触发的函数。该过程通过读取ui/perties文件获得一个id对应的事件函数体名称,Handler在把id和对应的函数体关联起来,这样每次事件触发都有hanhler统一根据id调用相应的函数。l 树面板显示Kettle主界面中的树面板是通过addTree()函数添加的。Spoon类中的mainComposite变量就代表树面板,view、design 、expandAll、collapseAll、selectionFilter和coreObjectsTree分别表示主对象树、核心对象、编辑框、展开按钮、收起按钮和树列表。如下图l 标签页管理标签页实际上就是一个TabItem类,标签页的管理涉及到两个类对象: Spoon中的delegates.tabs和Spoon中的和delegates.trans,它们都管理着所有的正在编辑的页面,但是各有各的职责。tabs的职责的是维护标签页列表List tabMap (TabMapEntry中有变量TabItem tabItem),包括列表元素的增删查找等,以及实现标签选择、不选择和关闭等事件。和delegates.trans类似,主要的职责是记录job标签页的信息,根据标签页维护这一个jobMeta列表 Map jobMap;原理:(以增加一个job为例)当触发一个增加job的事件时,Spoon会将首先事件委托给SpoonJobDelegate处理。SpoonJobDelegate会把增加标签页面的工作交给SpoonTabsDelegate处理。同理,当关闭一个标签页时,Spoon会首先事件委托给SpoonJobDelegate处理。SpoonJobDelegate会把去除标签页面的工作交给SpoonTabsDelegate处理。l 拖拽事件这里拖拽事件是指将树面板中的组件拖拽到标签页中。原理:SpoonTreeDelegate监听树的事件信息,当有拖拽离开事件发生时,SpoonTreeDelegate会把算法在核心对象树的文本展示保存到全局变量,当在编辑面板有拖拽放下事件发生时会根据得到的全局变量在算法列表里索引相应的算法,实例化一个相应的算法类和算法界面类。SpoonTreeDelegate的dragSetData()内有拖拽离开事件发生后的代码。data = treeObject.getItemText();event.data = new DragAndDropContainer(type, data);最后将事件和携带的组件信息传递到JobGraph类中的drop函数中,这个函数是处理拖拽放下事件的。该函数的其中三个语句如下:DragAndDropContainer container = (DragAndDropContainer) event.data;String entry = container.getData();container.getType() JobEntryCopy jge = spoon.newJobEntry(jobMeta, entry, false);可见,首先根据传入的事件数据event.data构建DragAndDropContainer对象,然后从中获取组件类型描述信息(entry)、组件类型(container.getType)。最后根据类型描述构建JobEntryCopy对象。这样便实现了拖拽添加组件。b) JobGraph类是标签(tabItem)页的控制者(Controller),代表工作区中的一个标签页。负责标签页上的各种触发事件的传递或处理,比如说:将组件拖拽到工作区事件、编辑entry事件、删除entry或者hop事件、移动组件位置等等;还有获取当前工作区中的工作流界面信息;还有响应标签页的菜单选择事件,菜单如下图:JobGraph类重要成员如下:/相应的jobMeta对象,每一个标签页就是一个工作流,也就是一个jobMetaprotected JobMeta jobMeta/ Job类对象,它是一个线程对象,负责当前jobMeta的执行private Job jobprivate Repository rep; private Job parentJob; private JobTracker jobTracker;用于跟踪日志记录private Date startDate, endDate, currentDate, logDate, depDate;private boolean active, stopped;状态位 private List sourceRows; 返回结果的数据内容 private Result result;每次执行完一个jobentry返回结果一些重要的函数:public JobGraph(Composite par, final Spoon spoon, final JobMeta jobMeta)这是它的构造函数。该函数不仅构造了JobGraph的对象,而且在这里同时设置了很多的监听器,比如监听鼠标的按下、移动、放开事件、选择事件等。双击事件canvas.addMouseListener(new MouseAdapter() 双击事件主要是指双击工作区的entry,进入entry的编辑对话框。当然也可能是双击工作区的其他地方。拖拽事件ddTarget.addDropListener(new DropTargetListener() 拖拽事件的一个主要功能是选择需要添加的entry,加入到job中来,即创建新的entry并加入到jobMeta中。当然也可能是拖动已有的entry改变其位置。显示标签页上的新建菜单的下拉菜单public void newFileDropDown() 标签页上的打开菜单 public void openFile() 标签页的保存菜单 public void saveFile() 运行工作流public void runJob() Start()函数函数主要是开启job的线程,执行当前工作流。主要代码如下:job = new Job(log, jobMeta.getName(), jobMeta.getFilename(), null);job.start();2) 组件适配模块该模块的主要作用是把swt开发包内的界面组件做适当的修改,可以更加灵活地以配置文件的方式动态加载菜单,工具栏,更加灵活地处理事件信息。其包结构如下:使用的原理:每一个XulMenuBar或XulToolBar都有自己的一个EventHandler成员,所有的MenuItem和XulToolBarButton都有唯一的id,这些内容可以通过配置文件读取。所有的MenuItem和XulToolBarButton会把自己的id和处理函数在EventHandler中注册,EventHandler维护一个列表,表示不同事件的id和对应的处理函数,快捷键,处理对象。如下图当触发相应的Item或Button时,它们同一把id作为参数,调用handler的处理函数,handler根据索引得到相应的函数名,对象实例,通过反射调用,对象实例的函数方法。完成触发动作。3) 测试结果展示模块结果的展示就是将执行结果展示到界面上。要展示的内容包括三个方面的信息:历史信息、日记信息和执行过程信息。执行完任务后调用JobGraph.addAllTabs()添加三个标签来分别显示这三个方面的内容。JobHistoryDelegate类,表示历史信息。JobLogDelegate类,表示日记信息。JobGridDelegate类,表示执行过程信息。当job运行时会设置 jobGridDelegate.jobTracker = job.getJobTracker();当每次job运行结束之后会将结果保存到jobTracker对象内。JobGridDelegate会循环读取这个运行结果内容,并且把运行结果展示在界面上。4) ui其他重要的类a) SpoonDelegates类该类是一个代理类,代理工作任务的相关操作。它的部分成员变量如下:名称作用备注public SpoonJobDelegate jobsJob代理,控制所有job,通过其对job进行处理项目重点研究public SpoonTabsDelegate tabs界面的标签对象,控制所有标签页,通过其对标签进行处理public SpoonTransformationDelegate transTransformation代理,控制所有转换,通过其对转换进行处理public SpoonStepsDelegate stepsStep(步骤,Transformation的执行单元)处理代理public SpoonDBDelegate db数据库操作代理,控制当前数据库连接,处理与数据库相关的操作该类只有一个成员函数,用来初始化生成所有成员变量:public SpoonDelegates(Spoon spoon)b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论