以下所示是一个规则的示例文件,后面对文件中所含的各个标记进行了说明。
<RULES>
<RULE>
<NAME>客户机有足够的内存</NAME>
<DESCRIPTION>检查客户机是否有足够的内存运行该应用程序</DESCRIPTION>
<VIOLATION> //ROWSET[@TABLE='MGMT_ECM_HW']/ROW/AVAIL_MEMORY_SIZE_IN_MB[number() < $arg=SIZE$] </VIOLATION>
<SEVERITY level="CRITICAL">
<PARAM id='SIZE'>100</PARAM>
<MOREINFO>
<TEXT>内存少于 100 MB 时应用程序无法运行。</TEXT>
</MOREINFO>
</SEVERITY>
<SEVERITY level="WARNING">
<PARAM id='SIZE'>150</PARAM>
<MOREINFO>
<TEXT>接近最低内存水平</TEXT>
</MOREINFO>
</SEVERITY>
</RULE>
</RULES>
本示例演示了一个可用于检查客户机是否有足够内存来运行应用程序的规则。<VIOLATION> 是一个 XPATH 表达式,小程序将根据包含其收集到的所有数据的 XML 文件对该表达式求值。请注意,由于 violation 是嵌入 XML 文件的 XPATH 表达式,XPATH 中的某些字符 (例如“<”、“>”和“&”) 必须用实体替换。如果 XPATH 表达式返回一个非空节点集,则规则失败。例如,当客户机的可用内存少于特定的量时,该规则将失败。触发违规的实际内存量可以用不同的严重性级别进行配置。
在本例中,小程序首先会将 VIOLATION 表达式中的子字符串“$arg=SIZE$”替换为“100”,然后对该表达式求值。如果客户机的可用内存少于 100 MB,该规则将以严重状态失败。小程序将指明该状态,并显示消息“内存少于 100 MB 时应用程序无法运行”。如果规则通过,小程序会将“$arg=SIZE$”替换为 150 并再次尝试;如果规则失败,小程序将显示消息“接近最低内存水平”。如果小程序通过了所有指定严重性级别,而没有发现违规情况,则表明该规则成功。
在上面的示例中,每种违规情况显示的附加信息 (如 <TEXT> 元素中所指定的) 都不是动态的。但管理员可能希望在检测到违规情况时告诉用户他或她的内存量。这种想法可以通过在 <MOREINFO> 标记下使用 <ARG> 元素来实现。假设规则代码如下:
<RULE>
<NAME>客户机有足够的内存</NAME>
<DESCRIPTION>检查客户机是否有足够的内存运行该应用程序</DESCRIPTION>
<VIOLATION> //ROWSET[@TABLE='MGMT_ECM_HW']/ROW/AVAIL_MEMORY_SIZE_IN_MB[number() < $arg=SIZE$] </VIOLATION>
<SEVERITY level="CRITICAL">
<PARAM id='SIZE'>100</PARAM>
<MOREINFO>
<TEXT>内存少于 100 MB 时应用程序无法运行。您只有 {0} MB 可用内存</TEXT>
<ARG>//ROWSET[@TABLE='MGMT_ECM_HW']/ROW/AVAIL_MEMORY_SIZE_IN_MB/text()</ARG>
</MOREINFO>
</SEVERITY>
</RULE>
如果检测到严重的违规情况,小程序将对 <ARG> 元素中的 XPATH 表达式求值,并将该值插入 <MOREINFO> 文本中字符串“{0}”所在的位置,以生成类似“内存少于 100 MB 时应用程序无法运行。您只有 45 MB 内存可用”的消息。元素 <ARG> 的值必须是有效的 XPATH 表达式。可以指定多个参数;小程序将对第一个表达式求值,并用该值替代“{0}”,用第二个表达式的值替代“{1}”,依此类推。如果有任何 XPATH 表达式返回多个节点,小程序将建立一个逗号分隔的节点列表。
要对多个客户机区域设置使用同一规则,管理员可以使用资源绑定以启用 <NAME>、<DESCRIPTION> 和 <TEXT> 元素的翻译。资源绑定是使用 <BUNDLE> 元素指定的,如下所示:
<RULES>
<BUNDLE id="bundle1">acme.bundles.RuleBundle</BUNDLE>
<BUNDLE id="bundle2">ruleBundle.xml</BUNDLE>
<RULE>
<NAME resource="name@bundle1">客户机有足够的内存</NAME>
<DESCRIPTION resource="description@bundle2">此规则检查客户机是否有足够的内存运行该应用程序</DESCRIPTION>
<VIOLATION> //ROWSET[@TABLE='MGMT_ECM_HW']/ROW/AVAIL_MEMORY_SIZE_IN_MB[number() < $arg=SIZE$] </VIOLATION>
<SEVERITY level="CRITICAL">
<PARAM id='SIZE'>100</PARAM>
<MOREINFO>
<TEXT resource=" moreinfo@bundle2 ">您只有 {0} MB 内存。</TEXT>
<ARG>//ROWSET[@TABLE='MGMT_ECM_HW']/ROW/AVAIL_MEMORY_SIZE_IN_MB/text()</ARG>
</MOREINFO>
</SEVERITY>
</RULE>
</RULES>
资源绑定可以是小程序 JAR 文件中的 Java 类文件、服务器上的 Java 类文件或者服务器上的 XML 文件。所有 Java 资源绑定类必须扩展 Java.util.ResourceBundle,而所有 XML 资源绑定必须使用如下所示的格式:
<BUNDLE>
<STRING id='Hello'>Hola</STRING>
<STRING id='moreinfo'>Solo tienes {0} MB de memoria</STRING>
</BUNDLE>
小程序会先找到其当前区域设置的两个字母的代码,例如“es”。在对 BUNDLE 标记进行语法分析时,小程序首先会假定该标记的值是 Java 类名称。小程序将使用区域设置代码修改这个类名称,然后尝试从小程序 JAR 文件中加载这个类。这样,对于上例中的第一个 BUNDLE,如果区域设置为“es”,小程序将尝试加载 acme.bundles.RuleBundle_es。如果该类不存在,小程序将尝试从服务器加载它,将部署页所在的目录作为类路径的根目录;这样,对于第一个绑定,如果用户从 http://www.company.com/csa/CSA 获得 CSA 小程序,该小程序将尝试加载 http://www.company.com/csa/acme/bundles/RuleBundle_es.class。如果此步骤失败,小程序会将 BUNDLE 标记的值视为服务器上的 XML 文件的名称;对于第二个 <BUNDLE> 元素,小程序将尝试下载 http://www.company.com/csa/ruleBundle_es.xml。
如果小程序在指定了资源属性的规则中遇到 NAME、DESCRIPTION 或 TEXT 标记,它会首先尝试查找并显示指定的资源。如果指定的绑定对当前区域设置不可用,或者指定的 ID 在该绑定中不存在,小程序将显示该标记本身的值。例如,在上面指定的规则文件中,假设区域设置为西班牙语 (es),但 ruleBundle_es.xml 文件中没有 ID 为“description”的资源;如果客户机只有 45 MB 内存可用,小程序将显示
El cliente tiene bastante memoria - 此规则检查客户机是否有足够的内存来运行该应用程序。
- X Solo tienes 45 MB de memoria
最后,可能会有无需对特定规则求值的情况。例如,用于检查用户的 Netscape 浏览器设置是否正确的规则在用户使用 Internet Explorer 访问该应用程序时就不需要进行求值。因此,管理员可以为每个规则指定一个或多个预定条件,如下所示:
<RULES>
<PRECONDITION id="a">//ROWSET[TABLE='MGMT_ECM_CSA']/ROW/BROWSER_TYPE[text() = ‘Netscape']</PRECONDITION>
<PRECONDITION id="b">//ROWSET[TABLE='MGMT_ECM_CSA']/ROW/BROWSER_VERSION[number() > 4]</PRECONDITION>
<RULE precondition="a,b">
<NAME>客户机有足够的内存</NAME>
<DESCRIPTION >此规则检查客户机是否有足够的内存运行该应用程序</DESCRIPTION>
<VIOLATION> //ROWSET[@TABLE='MGMT_ECM_HW']/ROW/AVAIL_MEMORY_SIZE_IN_MB[number() < $arg=SIZE$] </VIOLATION>
<SEVERITY level="CRITICAL">
<PARAM id='SIZE'>100</PARAM>
<MOREINFO>
<TEXT>内存少于 100 MB 时应用程序无法运行。您只有 {0} MB 可用内存</TEXT>
<ARG>//ROWSET[@TABLE='MGMT_ECM_HW']/ROW/AVAIL_MEMORY_SIZE_IN_MB/text()</ARG>
</MOREINFO>
</SEVERITY>
</RULE>
</RULES>
对于每个预定条件,小程序都将对指定的 XPATH 表达式求值。如果表达式返回非空结果集,则符合预定条件 (请注意,这些语义与 <VIOLATION> 元素中的 XPATH 表达式相反)。具有预定条件列表的规则仅在符合列出的所有预定条件时才会被求值。
下面是最后一个示例,其中列出规则文件的所有可用元素,还有一个表,其中对所有元素进行了汇总。
<RULES>
<PRECONDITION id="a">//ROWSET[TABLE='MGMT_ECM_CSA']/ROW/BROWSER_TYPE[text() = ‘Netscape']</PRECONDITION>
<PRECONDITION id="b">//ROWSET[TABLE='MGMT_ECM_CSA']/ROW/BROWSER_VERSION[number() > 4]</PRECONDITION>
<BUNDLE id="bundle1">acme.bundles.RuleBundle</BUNDLE>
<BUNDLE id="bundle2">ruleBundle.xml</BUNDLE>
<RULE>
<NAME resource="name@bundle1">客户机有足够的内存</NAME>
<DESCRIPTION resource="description@bundle2">此规则检查客户机是否有足够的内存运行该应用程序</DESCRIPTION>
<VIOLATION> //ROWSET[@TABLE='MGMT_ECM_HW']/ROW/AVAIL_MEMORY_SIZE_IN_MB[number() < $arg=SIZE$] </VIOLATION>
<SEVERITY level="CRITICAL">
<PARAM id='SIZE'>100</PARAM>
<MOREINFO>
<TEXT resource=" moreinfo@bundle2 ">您只有 {0} MB 内存。</TEXT>
<ARG>//ROWSET[@TABLE='MGMT_ECM_HW']/ROW/AVAIL_MEMORY_SIZE_IN_MB/text()</ARG>
</MOREINFO>
</SEVERITY>
</RULE>
</RULES>
| 标记名称 | 说明 |
|---|---|
| RULES | 这是 XML 文件的顶级标记 |
| BUNDLE |
此标记指定转换所使用的资源绑定。此标记的值是文件名或 Java 类名。规则引擎将读取此字符串,并首先尝试在小程序 JAR 中查找具有此名称的文件。此文件中预计包含到各种语言的字符串的资源 ID 映射。如果此类文件不存在,则将字符串视为 Java 资源绑定类的名称。资源绑定中的字符串使用以下语法引用:<资源 id>@<绑定 id>。 |
| PRECONDITION | 此标记指定一个必须返回用于评估规则的非空节点集的 XPATH 表达式。“id”属性指定预处理的 ID。规则可指定应通过列出其 ID 来加以评估的预处理列表。 |
| RULE | 此标记提供所要评估的单个节点。规则的严重性用 <SEVERITY> 标记指定 (见下文)。必须至少为规则指定一个严重性标记。标记具有可选的“precondition”属性,用于指定预处理 ID 的列表 (由逗号分隔)。评估规则前,必须满足所有预处理条件。如果未满足预处理条件,规则的状态就会标记为“Not Applicable”,且根本不会显示在客户机 UI 中。RULE 标记的子代包括 NAME、DESCRIPTION、VIOLATION、SEVERITY 及 MOREINFO。 |
| NAME |
此标记指定规则的名称并标识资料档案库中的标记。 注:此标记中必须包含值,不能为空。 |
| DESCRIPTION | 这是对规则的说明。 |
| VIOLATION |
此标记列出对给定规则所要检查的违规情况。违规是用 CSA 条件语言 (CSA Condition Language) 指定的。 |
| SEVERITY | 规则可具有三种严重性级别:INFO、WARNING 及 CRITICAL。SEVERITY 节点中所含子代 ARG 的数必须与 VIOLATION 节点中的表达式所能接受的参数数相等。当规则引擎评估规则时,它将评估严重性级别中所指定的每个参数集的 VIOLATION 条件 (从 CRITICAL 开始,然后按严重性的顺序下移)。当引擎遇到失败的条件时,就会将此规则声明为失败,其严重性级别也将等于导致失败的参数的严重性级别。如果所指定的所有级别条件都得到满足,规则即宣告通过。SEVERITY 节点的子代包括 PARAM 和 MOREINFO |
| PARAM | 此标记指定应替换到表达式中的参数值。此标记的“id”属性必须与表达式中的某个参数的名称匹配。 |
| MOREINFO |
此标记指定在用户单击失败的规则旁边的“详细信息”按钮时所显示的信息。MOREINFO 的子代包括 TEXT 和 ARG。 注:MOREINFO 节点可以是 severity 节点的子级 (在指定多种严重性的情况下),或者是此规则自身的子级。 |
| TEXT | 此标记指定在单击“详细信息”按钮时所显示的文本。“resource”属性指定了资源绑定中的字符串 - 如果此字符串不存在,则显示节点的值。此文本 (在资源绑定中或在节点自身中) 可以利用“{0}”、“{1}”等指定参数的插入位置。在这种情况下,ARG 节点中的表达式在经过计算后将按指定的顺序插入文本中。如果指定的 ARG 节点数超出字符串中的插槽数,则额外的节点将予以忽略。 |
| ARG |
此标记以 CSA 条件语言 (CSA Condition Language) 指定可求值并插入 MOREINFO 文本中的表达式。 |
版权所有 © 1996,2007,Oracle。保留所有权利。