技术开发 频道

ClearQuest的Hook机制

    【IT168 技术文章】

    ClearQuest中有很多类型的Hook, 每种Hook都有其自身的特点与作用, 如果把用在一个不属于它的位置, 就会导致错误的发生, 以下的转贴中对CQ中的Hook机制做了详尽的描述, 同时也希望大家能把自己所写的一些有用的Hook发出来, 大家共同学习:)

    什么是Hook?

    在ClearQuest里,Hook就是用户用某种语言编写的一小段代码,会在操作某个记录(Record)的特定时候触发执行。它可以检查某个记录的字段是否满足复杂的约束条件,可以限制特定的当前用户才有权限操作,可以限制上传文件的大小,可以在对特定的事件记录日志,可以动态灵活的生成各种选择列表,甚至可以更灵活的和其他Rational工具,如ClearCase、Requirement工具等集成。

    Hook的种类

    在ClearQuest中定义了四种Hook:

    1. 字段(Field )Hook

    2. 操作(Action )Hook

    3. 记录类型(Entity)Hook

    4. 全局(Global) Hook

    字段 (Field)Hook字段 Hook可以在运行时检查字段的值约束条件,赋予它缺省值,或者根据当前情况调整其他字段等。

    根据触发时机,字段Hook又可以分为以下几类:

    1. 缺省值 (Default Value)Hook缺省值Hook设置字段的缺省值。在ClearQuest Designer中,可以直接为记录字段设置常量的缺省值。如果缺省值要求是动态生成的,还可以编写字段的缺省值Hook脚本来实现。缺省值Hook在开始SUBMIT类型操作时触发调用。

    2. 选择列表(Chioce List)Hook

    选择列表Hook生成并返回字段可选择的有效值列表。选择列表可以用下拉列表框控件展示。在ClearQuest Designer中,可以直接为记录字段设置简单的可选择的有效值列表。如果可选择的有效值生成规则复杂,则需借助编写选择列表Hook脚本来动态生成。选择列表Hook紧接着Default Value Hook后触发调用。

    3. 权限检查(Permission)Hook

    记录的字段是否必须设定由其在各个状态下的Behavior属性指定。其可为只读的、强制设定的、可选的和使用Hook四种类型。如果在某一状态下,属性Behavior设定为使用Hook,则会调用这个字段的权限检查(Permission)Hook来限制满足条件的用户才能存取本字段。其可用于设定复杂的安全检查机制。权限检查Hook在最初存取字段时触发调用。

    4. 值改变(Value Changed)Hook

    当字段的值发生变化时触发值改变(Value Changed)Hook。值改变Hook可用于设定和本字段的值有联动关系的其他字段值。

    5. 有效验证(Validation)Hook

    当字段的值发生变化时,在运行完值改变Hook后还会进一步触发有效验证Hook,可用于检查当前记录的字段是否有效、是否满足设定的规则。

    操作 (Action)Hook

    操作 Hook可以检查执行操作的权限,验证整个记录的有效性,或当操作完成后发送通知。根据触发时机,操作Hook又可以分为以下几类:

    1. 权限控制(Access Control )Hook

    权限控制Hook用于检查当前用户是否有权限执行本操作。

    2. 初始化(Initialization)Hook

    初始化Hook用于在执行本操作前初始化该记录,比如设定字段值等。它在显示记录表单前触发调用。

    3. 有效验证(Validation)Hook

    在提交记录的变更前(也就是点击Apply按钮提交变更到数据库去)会触发有效验证Hook,用于验证整个记录复杂的规则。

    4. 提交(Commit)Hook在提交记录的变更到数据库前最后触发运行的是提交Hook。

    5. 通知(Notification)Hook

    在提交记录的变更到数据库后触发运行。

    记录类型(Record)hook

    记录类型hook是针对某一记录类型定义的hook,在Record Scripts中编写。它的使用方法有三种:

    1) 在本记录类型的其他Hook中调用,使用entity类的FireNamedHook方法直接调用。

    2) 将其和某个Form上的某个控件的某个事件关联起来,当发生此事件时触发hook。具体操作是双击要关联的控件,在控件的Extended tab中,为此控件的具体事件选择想要触发的记录类型Hook。

    例如,下图中是在对defect form上的Apply按钮的Click事件设置相应的记录类型hook

    3) 创建类型为"RECORD_SCRIPT_ALIAS"的操作,将其和记录类型hook关联起来。 "RECORD_SCRIPT_ALIAS"类型其实提供了一种自定义操作的方式。其具体的操作内容由和其相关的记录类型hook来决定。

    全局(Global)Hook

    全局Hook实际上就是全局函数,可以在任何hooks中调用。调用方式就像在程序里调用一个函数一样。以Perl脚本为例:

    $result = OneofMyGlobalHooks($session, $entity);

    除了Global Hook, 其他三种Hook都是和某一个记录类型相关的,均在对某一特定纪录对象的操作中触发执行。Global Hook是不会被直接触发执行的。

    Hook调用顺序

    ClearQuest中能定义这么多种类的Hook,它们的调用顺序又是怎样的呢?我们从四个阶段来说明:

    开始执行一个操作时,顺序调用:

    1) 操作 Access Control Hook

    2) 字段Permission Hook

    3) 操作 Initialization Hook

    4) 字段Default Value Hook

    5) 字段Choice List Hook

    设置字段值时,顺序调用:

    6) 字段Value Changed Hook

    7) 字段Validation Hook

    8) 如果需要重新计算字段的可选择有效值列表,字段Choice List Hook

    验证记录有效性时,顺序调用:

    9) 字段Validation Hook

    10)操作 Validation Hook

    提交记录(到数据库)时,顺序调用:

    11)操作 Commit Hook

    12)操作 Notification Hook

    BASE类型的操作的Hooks

    在ClearQuest Designer中,可以定义一种特殊的操作:BASE类型的操作。和其他类型的操作一样,BASE类型的操作也可以定义上边的五种操作 Hook。Base 类型的操作的各个Hook会在所有其它操作的相同类型的Hook触发前调用。

    可以定义多个Base 类型的操作和它们的各种Hooks。而Base操作的同一种类型的Hook的调用顺序按照其在ClearQuest Designer定义的顺序来执行。

    例如,在某个模板中为某记录类型顺序定义操作 myBaseAction1和myBaseAction2,均为BASE类型。两者均定义了Initialization Hook。则在这个模板所对应的用户数据库中,在针对这种类型的记录的所有操作的初始化阶段,都会先调用myBaseAction1的Initialization Hook脚本,再调用myBaseAction2的Initialization Hook的脚本,最后调用本操作自身的Initialization Hook的脚本(如果定义的话)。

    怎样定义Hooks

    Hooks的语言种类:

    Hook根据定义所用的语言不同,还可以分为以下几类:

    1. VB脚本

    2. Perl脚本

    3. 常量

    4. 常量列表

    所有的Hook类型,不管是字段还是操作的,都支持VB脚本和Perl脚本。一个Hook可以同时定义这两种脚本,其中Windows平台上缺省使用VB脚本,而Unix和Linux平台上只能使用Perl脚本。如果想改变Windows平台上的缺省脚本语言,可以在模板的属性里面设置。如下图所示:

    常量就是定义其为一个常量值;常量列表就是定义字段选择列表。只有字段Default Value Hook和字段Choice List Hook支持常量和常量列表。

    ClearQuest以前还提供用SQL语言编写Hook的功能,现在已经取消。但是ClearQuest系统仍能兼容运行以前定义的SQL Hook。

    Hook类型 和 Hook语言对应表:

    如何编写Hook脚本

    一个Hook脚本其实就是一个方法,可以用VB脚本语言或者Perl脚本语言编写。ClearQuest提供了这两种脚本语言的API。VB脚本的API是用一个COM库来实现,Perl脚本的则是用一个名为CQPerlExt的perl package实现。他们都提供了一些ClearQuest重要的类和方法。

    下图是此API提供的ClearQuest类和它们之间的关系:

    由于Hook都是在对一个记录的操作中触发执行的,ClearQuest会传给被触发的Hook当前记录对象(entity)。在VB脚本中它是缺省操作对象;在Perl脚本中它是$entity。从这个记录对象出发,可以得到象session对象,、记录的各个fieldinfo对象、当前的database对象,等等。

    以Perl脚本为例,下面这段代码取出id为MyDB00000001的defect记录,改变了它的description字段值,并提交改变,写到数据库中:

    $session = $entity->GetSession();

    $anotherEntity = $session->LoadEntity("defect", "MyDB00000001";

    $anotherEntity->EditEntity("modify";

    $anotherEntity->SetFieldValue("description", "updated description";

    $anotherEntity->Validate();

    $anotherEntity->Commit();

    关于具体的类及其方法的使用描述,请参见ClearQuest随身附带的文档"cq_api.pdf"。

   

0
相关文章