FeaturesPluginsDocs & SupportCommunityPartners

使用 BPEL 映射器编辑 BPEL 流程

本教程向您介绍如何使用 BPEL 映射器处理 XPath 表达式。BPEL 映射器是 NetBeans Enterprise Pack 中 BPEL 设计器功能的组件。使用强大的 BPEL 映射器功能,您可以处理谓词、使用 XPath 函数并可在一个业务流程内复制变量。

利用 BPEL 映射器,您可以添加和编辑针对某些业务流程元素(如 Assign、If、If 中的 ElseIf 元素、ForEach、RepeatUntil、While 和 Wait)的函数。每个元素都具有特定的表达式类型,如复制分配、条件表达式和时间函数等。例如,If、If 中的 ElseIf 元素以及 RepeatUntil 活动可以具有条件表达式;Assign 元素可以包括复制表达式;Wait 元素可以具有持续时间表达式;ForEach 活动可以具有包含整数值的表达式。使用 BPEL 映射器的图形界面,您还可以执行计算,具体方法是:向变量和 XSD 元素、属性及部件指定 XPath 运算和函数。

先决条件

要了解本教程,您需要具备 SOA 技术和 NetBeans IDE 的一些基本知识或编程经验。

系统要求

本教程假定您的系统满足 NetBeans Enterprise Pack 5.5 发行说明的“系统要求”主题中指定的要求。

本教程所需的软件

在开始之前,您必须在计算机中安装以下软件:

  • 包含 NetBeans Enterprise Pack 5.5 的 NetBeans IDE 5.5(下载

目录

返回页首


配置教程环境

在部署应用程序之前,必须正确配置 Sun Java System Application Server 和 JBI 运行环境,并且使它们处于运行状态。

请参见简单的同步 BPEL 流程教程中的“配置教程环境”部分,了解如何启动应用服务器。

返回页首


创建 SynchronousSample 项目

在本教程中,您将使用“同步 BPEL 流程”样例项目。

  1. 从 IDE 的主菜单中,选择“文件”>“新建项目”。
  2. 在“类别”列表中,展开“样例”节点,然后选择“面向服务的体系结构”节点。
  3. 在“项目”列表中,选择“同步 BPEL 流程”。
  4. 单击“下一步”。
  5. 接受缺省的项目名称 SynchronousSample 和项目位置值,或者根据需要更改这些值。
  6. 单击“完成”。
    现在,“项目”窗口会包含两个项目节点:一个是标记为 SynchronousSample 的 BPEL 模块项目节点,另一个是标记为 SynchronousSampleApplication 的复合应用程序项目节点。

返回页首


浏览“BPEL 映射器”窗口

  1. 在“项目”窗口中,展开 "SynchronousSample" 项目节点和“流程文件”节点。
  2. 双击 "SynchronousSample.bpel" 文件。
    IDE 将打开 BPEL 文件的“设计”视图。
  3. 在图中,选择 "Assign1" 元素。
    在 IDE 底部,将会打开 "Assign1" 元素的“BPEL 映射器”窗口。
  4. 展开位于“BPEL 映射器”窗口左侧的 "inputVar" 节点和右侧的 "outputVar" 节点。
    请注意,对于 "Assign1" 元素来说,其输入参数的值将被复制到输出参数。

Assign 元素的“BPEL 映射器”窗口,单击以放大
单击以放大

我们查看一下复制操作的源代码。要查看源代码,请在图中右键单击 "Assign1" 元素,然后从弹出式菜单中选择“转至源”。

在“源”视图中,您会看到以下代码,这些代码实现了将输入 "paramA" 的值复制到输出 "paramA" 中。

<copy>
<from>$inputVar.inputType/paramA</from><to>$outputVar.resultType/paramA</to>
</copy>

通过执行以下步骤,从“BPEL 映射器”窗口删除该操作:

  1. 单击“设计”标签打开“设计”视图,然后在图中选择 "Assign1" 元素。
  2. 在“BPEL 映射器”窗口中,单击连接输入和输出参数的线段,然后按 Delete 键。
    在“源”视图中,您会看到代码已不再包含复制操作:<assign name="Assign1"></assign>
  3. 单击“保存”。

返回页首


使用 BPEL 映射器编辑同步 BPEL 项目

下面的示例说明了如何使用 "current-date" 函数以及字符串函数 "concat" 和 "substring"。您还将使用字符串型和数值型函数,并了解如何使用 "count" 和 "last" 等节点集函数。此外,这些示例也说明了 "sum" 和 "equal" 运算的用法。

最后,您将创建两个测试用例以测试修改后的业务流程:

  • 对于测试用例 0,输入参数可以是任何字符串和测试数值,输出则是包含当前日期和时区的字符串。
  • 对于测试用例 1,输入参数可以是测试数值和节点集,输出则是包含元素数目、元素数目的总和以及最后一个元素的字符串。

添加变量

在此过程中,您将向业务流程添加 "todayIs" 变量(字符串类型)。此变量用于存储 "current-date" 函数返回的值。

  1. 如果在 IDE 中未打开 "SynchronousSample.bpel" 文件,请立即将其打开。
  2. 在“设计”视图中,右键单击 SynchronousSample 流程元素,然后选择“添加”>“变量”。
  3. 在“名称”字段中,输入 "todayIs"。
  4. 展开“内置类型”节点,然后选择 "string" 类型。
  5. 单击“确定”。
    在图中选择 "Assign1" 元素。现在,"todayIs" 变量已显示在“BPEL 映射器”窗口的两个树窗格中。

修改 XML 架构

在此过程中,您将修改现有 XML 架构元素的属性,并添加新的 "nTest" 元素。"nTest" 元素用于定义将要执行的 If 分支。稍后,您将在测试用例中使用 "nTest" 元素。

  1. 在“项目”窗口中,展开 "SynchronousSample" 项目节点和“流程文件”节点。
  2. 双击 "SynchronousSample.xsd" 节点。
    IDE 将打开 XML 架构文件的“架构”视图。
  3. 在“架构”视图列中,选择“复杂类型”> "simpleProcess" > "sequence" > "paramA"。
    您可以单击列按钮 以确保视图处于列模式。
  4. 在“属性”窗口中,将“最大出现次数”参数设置为 "unbounded" 以允许使用大于或等于 1 的值。
    如果尚未打开“属性”窗口,请选择“窗口”>“属性”或者按 Ctrl-Shift-7 组合键。

    在“XML 架构”视图中修改 ParamA 的属性,单击以放大
    单击以放大

  5. 在“架构”视图的第三列上,右键单击 "sequence" 元素,然后从弹出式菜单中选择“添加”>“元素”。
  6. 在“元素”对话框的“名称”字段中,输入 "nTest",然后选择“使用现有类型”选项。
  7. 展开“内置类型”节点,然后选择 "int" 类型。
  8. 单击“确定”。

    将元素添加到 XML 架构文件,单击以放大
    单击以放大

  9. 选择“文件”>“全部保存”。

编辑 BPEL 流程

在此过程中,您将向业务流程添加 If 和 Assign 活动。

  1. 如果在 IDE 中未打开 "SynchronousSample.bpel" 文件,请立即将其打开。
  2. 在“设计”视图中,选择组件面板上的 "If" 图标,将所选组件拖到设计区域中,并将其放在图的 "start" 和 "Assign1" 元素之间。
  3. 将 "Assign1" 元素移入 If1 元素,并将其放在主分支上(没有斜杠)。
  4. 在组件面板上,选择“分配”图标,并将其放在 If 元素中 "Assign1" 元素之后。
    此元素标记为 "Assign2"。
  5. 右键单击 If 元素,然后从弹出式菜单中选择“添加 Else If”。
  6. 在组件面板上,选择“分配”图标,并将其放在 ElseIf 分支中的图上。
    此元素标记为 "Assign3"。
    请参见下图以验证您的业务流程图是否与此图类似。

编辑同步样例 BPEL 流程,单击以放大
单击以放大

在 If 元素中添加条件

按照以下步骤,您可以指定执行 If 活动的条件。"nTest" 参数定义了值为 true 的 If 分支。对于 If 分支,"nTest" 等于 1,对于 ElseIf 分支,"nTest" 等于 2。

为 "If1" 元素指定条件:

  1. 在图中选择 "If1" 元素。
  2. 在“BPEL 映射器”窗口中的菜单栏上,选择“数值”> "Number Literal" 和“运算符”> "EQUAL"。
    映射窗格中会出现两个函数框。为方便起见,请拖动函数框将 "Number Literal" 框放在左侧,"EQUAL" 函数框放在右侧。
  3. 在“BPEL 映射器”窗口的左侧树窗格中,展开 "inputVar" 和 "inputType" 节点。
  4. 在左侧树窗格中选择 "nTest" 节点,然后将指针拖到 EQUAL 函数框中的 "any1" 参数。
  5. 在 "Number Literal" 函数框中,双击输入字段并输入 1。
  6. 选择 "Number Literal" 函数框,然后将指针拖到 EQUAL 函数框中的 "any2" 参数。
  7. 在 EQUAL 函数框中,选择 "return boolean" 参数,然后将指针拖到“BPEL 映射器”窗口右侧树窗格中的“结果”节点。
  8. 选择“文件”>“保存”。

配置 If 的条件,单击以放大
单击以放大

为 "ElseIf" 元素指定条件:

  1. 在图中选择 "ElseIf" 元素。
  2. 请重复前面的过程中对 If 元素执行的步骤,但输入 2 作为 "Number Literal" 的值。

配置 ElseIf 的条件,单击以放大
单击以放大

在 Assign 元素中添加表达式

在此过程中,您将使用源代码编辑器和 BPEL 映射器向 "Assign1"、"Assign2" 和 "Assign3" 元素添加表达式。

将表达式添加到 "Assign1" 元素中:

  1. 在图中选择 "Assign1" 元素。
  2. 在“BPEL 映射器”窗口中的菜单栏上,选择“日期时间”> "Current Date"。
    "Current Date" 函数框会出现在映射窗格中。
  3. 在 "Current Date" 函数框中,选择 "return string" 参数,然后将指针拖到“BPEL 映射器”右侧树窗格中的 "todayIs" 节点上。
  4. 选择“文件”>“保存”。

    Assign1 元素的表达式,单击以放大
    单击以放大

  5. 在图中右键单击 "Assign1" 元素,然后从弹出式菜单中选择“转至源”。

    在“源”视图中,"Assign1" 元素的 "copy" 运算符将 "return string" 参数的值复制到 "todayIs",如下所示:

  <assign name="Assign1">
    <copy>            
      <from>current-date()</from>
      <to variable="todayIs"/>         
    </copy>     
  </assign>  

将表达式添加到 "Assign2" 元素中:

"Assign2" 元素将构成以下输出字符串:"Hello!Today is 2006-11-17. Time zone is 03:00."

您需要按照以下格式使用包含当前日期的 "todayIs" 变量:"YYYY-MM-DD ZZ:ZZ",其中,"YYYY" 是当前年份,"MM" 是月份,"DD" 是日期,"ZZ:ZZ" 为时区。

  1. 在图中选择 "Assign2" 元素。
  2. 在“BPEL 映射器”窗口中的菜单栏上,选择“字符串”> "Concat",然后选择两次“字符串”> "Substring"。
    映射窗格中会出现三个函数框。为方便起见,请将两个 "Substring" 框拖到左侧,将 "Concat" 框拖到右侧。
  3. 要通过 "todayIs" 变量构成只包含日期而不包含时区的字符串,请完成以下步骤:
    1. 在左侧树窗格中选择 "todayIs" 节点,然后将指针拖到第一个 Substring 函数框中的 "string" 参数。
    2. 在函数框中双击 "number",然后键入 "1"。
      这是将要复制的 "todayIs" 字符串的起始位置。
    3. 在函数框中双击 "number?",然后键入 "10"。
      这是将要复制的符号数。
  4. 要通过 "todayIs" 变量构成只包含时区而不包含日期的字符串,请完成以下步骤:
    1. 在左侧树窗格中选择 "todayIs" 节点,然后将指针拖到第二个 Substring 函数框中的 "string" 参数。
    2. 在函数框中双击 "number",然后键入 "11"。
      这是将要复制的 "todayIs" 字符串的起始位置。

    注意:这里 "number?" 不是 Substring 函数的必需参数:当不指定参数时,Substring 函数会将字符串从起始位置复制到字符串结束。

  5. 要构成本部分开始时提及的输出 Concat 字符串,请完成以下步骤:
    1. 在“BPEL 映射器”窗口的左侧树窗格中,展开 "inputVar" 和 "inputType" 节点。
    2. 在左侧树窗格中选择 "paramA" 节点,然后将指针拖到 Concat 函数框中的 "string1" 参数。
      这样会复制输入参数中的字符串。
    3. 在 Concat 函数框中双击 "string2",然后键入 "Today is"。
      这是为了构成用于输出的字符串,此字符串将会添加到输出字符串中。
    4. 在第一个 Substring 函数框中,选择 "return string" 参数,然后将指针拖到 Concat 函数框的 "string3"。
      这样会复制当前的日期而不包含时区。
    5. 在 Concat 函数框中双击 "string4",然后键入 ".Time zone is"。
      此字符串将位于当前日期之后。
    6. 在第二个 Substring 函数框中,选择 "return string" 参数,然后将指针拖到 Concat 函数框的 "string5"。
      这样会复制时区而不包含当前日期。
    7. 在 Concat 函数框中双击 "string6",然后键入 "."。
      此字符串会添加到时区之后。
    8. 在“BPEL 映射器”窗口的右侧树窗格中,展开 "outputVar" 和 "resultType" 节点。
    9. 在 Concat 函数框中,选择 "return string" 参数,然后将指针拖到“BPEL 映射器”窗口右侧树窗格中的 "paramA" 节点。
      这样会将 Concat 函数的结果复制到输出。
  6. 选择“文件”>“保存”。

    Assign2 元素的表达式,单击以放大
    单击以放大

  7. 在图中右键单击 "Assign2" 元素,然后从弹出式菜单中选择“转至源”。

    在“源”视图中,"Assign2" 元素的 "copy" 运算符会形成包含当前日期和时区的字符串,如下所示:

    <assign name="Assign2">    
    <copy>
    <from>concat($inputVar.inputType/ns0:paramA, ' Today is ', substring($todayIs, 1, 10), '. Time zone is ', substring($todayIs, 11), '.')</from> <to>$outputVar.resultType/ns0:paramA</to>
    </copy>
    </assign>

将表达式添加到 "Assign3" 元素中:

您将使用源代码编辑器为 "Assign3" 元素添加表达式。

注意:如有必要,您可以在使用源代码编辑器添加表达式后,在 BPEL 映射器中编辑该元素。

  1. 在 BPEL 图中右键单击 "Assign3" 元素,然后从弹出式菜单中选择“转至源”。
  2. 使用以下内容替换 <assign name="Assign3"/> 字符串:
    <assign name="Assign3">    
    <copy>
    <from>concat('There are/is ', count($inputVar.inputType/ns0:paramA), ' element(s) in nodeset.', 'Sum of element(s) is ', sum($inputVar.inputType/ns0:paramA), '. Last element is ', $inputVar.inputType/ns0:paramA[last()], '.')</from> <to>$outputVar.resultType/ns0:paramA</to>
    </copy>
    </assign>
  3. 选择“文件”>“保存”。
  4. 单击编辑器工具栏中的“设计”按钮切换到“设计”视图,然后在“BPEL 映射器”窗口中查看结果。
  5. 在 BPEL 图中选择 "Assign3" 元素。

    Assign3 元素的表达式,单击以放大
    单击以放大

    "Assign3" 元素的表达式会显示复制到 "paramA" 的节点数,计算所有节点的总和,并提供最后一个节点的值。将输出以下样例字符串:"There are/is 3 element(s) in nodeset.Sum of element(s) is 6. Last element is 3."

返回页首


将项目部署到应用服务器上

开始测试您的业务流程之前,需要将“BPEL 模块”项目添加为 JBI 模块,并将其部署到应用服务器上。

要执行此操作,请按照简单的同步 BPEL 流程教程中“将项目部署到应用服务器上”部分所述的步骤。

返回页首


创建测试用例

要测试修改后的 BPEL 流程,请创建以下步骤所描述的测试用例("TestCase0" 和 "TestCase1")。对于 "TestCase0",输入参数是用于测试的字符串和数字,输出是包含当前日期和时区的字符串。对于 TestCase1,输入参数是测试数字和节点集,输出是包含元素数目、元素数目的总和及最后一个元素的字符串。

创建 "TestCase0":

  1. 在“项目”窗口中,依次展开 "SynchronousSampleApplication"、“测试”和 "TestCase0" 节点。"TestCase0" 节点包含了以下两个 XML 文件:“输入”(输入文件)和“输出”(输出文件)。
  2. 双击“输入”文件节点,然后使用以下内容替换缺省内容:
    <soapenv:Envelope xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:syn="http://xml.netbeans.org/schema/SynchronousSample">
      <soapenv:Body>
        <syn:typeA> <syn:paramA>Hello!</syn:paramA> <syn:nTest>1</syn:nTest> </syn:typeA>
      </soapenv:Body> </soapenv:Envelope>
    在此测试中,输入参数是测试数字 (1) 和字符串 "Hello!"
  3. 双击 TestCase0 节点下的“输出”文件节点。
  4. 删除“输出”文件中的缺省文本。

创建 "TestCase1"

  1. 在“项目”窗口中,展开 "SynchronousSampleApplication" 项目节点,右键单击“测试”节点,然后从弹出式菜单中选择“新建测试用例”。
    将打开“新建测试用例”向导。
  2. 保留名称 "TestCase1",然后单击“下一步”。
  3. 展开“SynchronousSample - 流程文件”,选择 "SynchronousSample.wsdl",然后单击“下一步”。
  4. 选择 "operation1",然后单击“完成”。
  5. 在“测试”节点下,展开 "TestCase1" 节点,然后双击“输入”。
  6. 将缺省内容替换为以下内容:
    <soapenv:Envelope xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/
    http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:syn="http://xml.netbeans.org/schema/SynchronousSample">
       <soapenv:Body>
         <syn:typeA>
          <syn:paramA>1</syn:paramA>
          <syn:paramA>2</syn:paramA>
          <syn:paramA>3</syn:paramA>
          <syn:nTest>2</syn:nTest>
         </syn:typeA>
      </soapenv:Body> </soapenv:Envelope>
    在此测试中,输入参数是三个节点:1、2、3,测试数字为 2。
  7. 双击 "TestCase1" 节点下的“输出”文件节点,然后删除此文件中的缺省文本。
  8. 选择“文件”>“全部保存”来保存所做的更改。

返回页首


测试应用程序

执行测试用例:

  1. 在“项目”窗口中,右键单击 "SynchronousSampleApplication" 项目节点,然后从弹出式菜单中选择“测试项目”。
  2. 因为初次执行时“输出”文件为空,请单击两个对话框中的“是”,以同意覆盖空输出。
  3. 请注意测试失败的消息。这是一个特例,因为在初次运行过程中 "Output.xml" 为空,而输出会写入到输出文件中。
  4. 重复执行步骤 1。
  5. 查看测试已成功通过的消息。

您可以打开每个测试用例的 "Output.xml" 文件,检查测试结果。

对于 "TestCase0","Output.xml" 文件包含显示当前日期和时区的字符串,例如 "Hello!Today is 2006-11-17. Time zone is 03:00."

对于 "TestCase1","Output.xml" 文件包含以下字符串:"There are/is 3 element(s) in nodeset.Sum of element(s) is 6. Last element is 3."

返回页首


小结

在本教程中,您了解了 NetBeans Enterprise Pack 中 BPEL 设计器的 BPEL 映射器组件;并且修改了样例同步应用程序项目,同时使用 BPEL 映射器功能向业务流程添加了表达式和函数;此外,您还测试了应用程序,并验证了表达式是否返回有效值。



返回页首


Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by