OSWorkflow的Validators,Registers和Conditions[原]

来源:互联网 发布:c 编程实例 编辑:程序博客网 时间:2024/05/29 03:01

三、OSWorkflowValidators

OSWorkflow的函数一样,OSWorkflowvalidators也有三种不同的形式:Java-based, BeanShellBSFJava-basedValidators必须实现com.opensymphony.workflow.Validator接口(或者如果通过远程EJB的话,要实现com.opensymphony.workflow.ValidatorRemote接口)。在所有的Java-based validators中,都要抛出InvalidInputException异常。

但是在BeanShell BSF的实现中,情况稍微有点不同,因为在scripts中抛出的异常无法在Java运行时环境中传播出去。为了达到这个目的,BeanShellBSF所返回的值要作为错误消息返回,逻辑是这样的:

--如果返回的是一个InvalidInputException对象,那么这个对象会立即被抛出到客户端。

--如果返回的是一个Map,那么这个Map被用于InvalidInputException中的 错误/错误消息对。

--如果返回的是一个String[],那么偶数值被用做关键字(key),奇数值被用做所对应的值,这样就可以构造出上面的所述的Map

--如果不是上面的三种情况,返回值将被转换为一个String对象,并且作为一个错误消息。

四、OSWorkflowRegisters

OSWorkflow中的Register是一个运行时的变量,它能够动态的注册到workflow的定义文件中。Registers在很多场合都是很有用的。例如:你想提供让workflow在它的描述符文件中就能访问一个实体的方法。这时,你就可以定义一个Register来封装这个实体。如果这个实体是一个本地的session EJB的话,你就要使用com.opensymphony.workflow.util.ejb.local.LocalEJBRegister注册类。例如,在后面的post-function中,你就可以访问这个实体,并且可以通过beanshell script来调用这个实体中的方法。

Registers也有三种实现方式:Java-based, BeanShellBSF.

1. Java-based

Java-based registers 必须实现com.opensymphony.workflow.Register接口(或者如果是远程ejb的话,你要实现com.opensymphony.workflow.RegisterRemote接口)

2. BeanShell and BSF registers

通过script返回的值或对象将是你注册的对象。

注:在registers的接口中,你只需要一个args Map参数就行了,这是因为registers的调用根本不管用户的输入。

3. 例子:

下面的例子将说明register的功能和用途。在这里register被用于一个简单的日志register,它有一个可访问的变量"log",这个log变量可以在可以在整个工作流的生命期内被访问。日志记录器可以做很多有用的工作,比如说将工作流的实例id加入到日志记录中。我们在workflow的描述符文件的顶层定义register

<registers>

    <register type="class" variable-name="log">

      <arg name="class.name">com.opensymphony.workflow.util.LogRegister</arg>

      <arg name="addInstanceId">true</arg>

    </register>

</registers>

从代码中可以看到,我们创建了一个名为logLogRegister,还指定了一个值为true的参数addInstanceId

我们可以在workflow描述符文件中的任何地方使用这个变量。例如:

<function type="beanshell" name="bsh.function">

  <arg name="script">transientVars.get("log").info("function called");</arg>

</function>

上面的函数将输出"function called",同时在输出前附加了workflow的实例id

五、Conditions

BSFBeanshellscript中,有一个特别的对象叫做"jn"。这个变量是com.opensymphony.workflow.JoinNodes类的一个实例,被用于join-conditions中。除此之外,conditionsfunctions的不同在于,conditions必须返回一个truefalse的值。这个值可以是一个"true""false"的字串,也可以是一个"true""false"的布尔值,甚至是一个含有toString()的函数,其返回值为"true""false"的对象。

每个condition一定是作为一个conditions的子标签被定义的。当你使用"AND"类型,所有的condition标签的值必须都是"true",整个conditions才能是true。否则,整个conditions将返回"false"。如果你使用"OR"类型,那么只要有一个condition标签的值为"true",整个conditions就为true,而只有当所有的condition标签的值必须都是"false",整个conditions才能是false。如果你想要更复杂的逻辑判断,那么你就要自己考虑使用ConditionConditionRemote接口、BeanShell或者是BSF来实现。注意:如果在conditions标签中只含有一个condition的话,类型可以省略。

下面是OSWorkflow自带的一些标准的conditions

  --OSUserGroupCondition - 使用OSUser来判断调用者是否在参数"group"中。

  --StatusCondition - 判断当前步骤的状态是否与参数"status"相同。

  --AllowOwnerOnlyCondition - 如果调用者是指定的步骤的所有者的话,那么只返回true,如果没有指明步骤的话,就返回当前步骤。

  --DenyOwnerCondition - AllowOwnerOnlyCondition功能相反。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾照分数扣36分怎么办 驾照12分不够扣怎么办 驾照b证扣分了怎么办 违章18分不够扣怎么办 b2驾驶证扣11分怎么办 驾照一共扣30分怎么办 驾照扣了100分怎么办 驾照扣40多分怎么办 驾照被扣69分怎么办 驾照被扣200多分怎么办 b2驾照扣了分怎么办 驾驶证在外地被冒用怎么办 身份证被冒用办驾照怎么办 外国人在中国境内死了怎么办 台风来临时航船应该怎么办 越南攻占太平岛台湾怎么办 厨房下水pvc管三通漏水怎么办 pvc下水管道接口漏水怎么办 马航机场转机行李怎么办 习惯了光脚开车怎么办 遇到暴恐分子时该怎么办视频 中国人在菲律宾失踪了怎么办 高跟凉鞋前面磨脚怎么办 小孩子偷邻居家的钱怎么办 碰见美国人说叙利亚诈骗团伙怎么办 日服的火焰纹章闪退怎么办 冒险岛没潜能的怎么办 冒险岛法师运气不够怎么办 cad文件打开老是闪退白屏怎么办 上古卷轴5坏档怎么办 冒险岛2 65级后怎么办 第二次起诉离婚对方不同意怎么办 起诉离婚对方不同意离婚怎么办 我12爸妈离婚该怎么办 苹果迅雷下载的链接打不开怎么办 苹果上装的迅雷打不开怎么办 mp4进水水干了后打不开怎么办 迅雷闪退ios10.3怎么办 用辣椒辣到眼睛怎么办 辣椒辣到眼皮了怎么办 眼被辣椒辣了怎么办